1 /* readelf.c -- display contents of an ELF format file
2    Copyright (C) 1998-2016 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/mmix.h"
128 #include "elf/mn10200.h"
129 #include "elf/mn10300.h"
130 #include "elf/moxie.h"
131 #include "elf/mt.h"
132 #include "elf/msp430.h"
133 #include "elf/nds32.h"
134 #include "elf/nios2.h"
135 #include "elf/or1k.h"
136 #include "elf/pj.h"
137 #include "elf/ppc.h"
138 #include "elf/ppc64.h"
139 #include "elf/rl78.h"
140 #include "elf/rx.h"
141 #include "elf/s390.h"
142 #include "elf/score.h"
143 #include "elf/sh.h"
144 #include "elf/sparc.h"
145 #include "elf/spu.h"
146 #include "elf/tic6x.h"
147 #include "elf/tilegx.h"
148 #include "elf/tilepro.h"
149 #include "elf/v850.h"
150 #include "elf/vax.h"
151 #include "elf/visium.h"
152 #include "elf/x86-64.h"
153 #include "elf/xc16x.h"
154 #include "elf/xgate.h"
155 #include "elf/xstormy16.h"
156 #include "elf/xtensa.h"
157 
158 #include "getopt.h"
159 #include "libiberty.h"
160 #include "safe-ctype.h"
161 #include "filenames.h"
162 
163 #ifndef offsetof
164 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
165 #endif
166 
167 typedef struct elf_section_list
168 {
169   Elf_Internal_Shdr * hdr;
170   struct elf_section_list * next;
171 } elf_section_list;
172 
173 char * program_name = "readelf";
174 static unsigned long archive_file_offset;
175 static unsigned long archive_file_size;
176 static bfd_size_type current_file_size;
177 static unsigned long dynamic_addr;
178 static bfd_size_type dynamic_size;
179 static size_t dynamic_nent;
180 static char * dynamic_strings;
181 static unsigned long dynamic_strings_length;
182 static char * string_table;
183 static unsigned long string_table_length;
184 static unsigned long num_dynamic_syms;
185 static Elf_Internal_Sym * dynamic_symbols;
186 static Elf_Internal_Syminfo * dynamic_syminfo;
187 static unsigned long dynamic_syminfo_offset;
188 static unsigned int dynamic_syminfo_nent;
189 static char program_interpreter[PATH_MAX];
190 static bfd_vma dynamic_info[DT_ENCODING];
191 static bfd_vma dynamic_info_DT_GNU_HASH;
192 static bfd_vma version_info[16];
193 static Elf_Internal_Ehdr elf_header;
194 static Elf_Internal_Shdr * section_headers;
195 static Elf_Internal_Phdr * program_headers;
196 static Elf_Internal_Dyn *  dynamic_section;
197 static elf_section_list * symtab_shndx_list;
198 static int show_name;
199 static int do_dynamic;
200 static int do_syms;
201 static int do_dyn_syms;
202 static int do_reloc;
203 static int do_sections;
204 static int do_section_groups;
205 static int do_section_details;
206 static int do_segments;
207 static int do_unwind;
208 static int do_using_dynamic;
209 static int do_header;
210 static int do_dump;
211 static int do_version;
212 static int do_histogram;
213 static int do_debugging;
214 static int do_arch;
215 static int do_notes;
216 static int do_archive_index;
217 static int is_32bit_elf;
218 static int decompress_dumps;
219 
220 struct group_list
221 {
222   struct group_list * next;
223   unsigned int section_index;
224 };
225 
226 struct group
227 {
228   struct group_list * root;
229   unsigned int group_index;
230 };
231 
232 static size_t group_count;
233 static struct group * section_groups;
234 static struct group ** section_headers_groups;
235 
236 
237 /* Flag bits indicating particular types of dump.  */
238 #define HEX_DUMP	(1 << 0)	/* The -x command line switch.  */
239 #define DISASS_DUMP	(1 << 1)	/* The -i command line switch.  */
240 #define DEBUG_DUMP	(1 << 2)	/* The -w command line switch.  */
241 #define STRING_DUMP     (1 << 3)	/* The -p command line switch.  */
242 #define RELOC_DUMP      (1 << 4)	/* The -R command line switch.  */
243 
244 typedef unsigned char dump_type;
245 
246 /* A linked list of the section names for which dumps were requested.  */
247 struct dump_list_entry
248 {
249   char * name;
250   dump_type type;
251   struct dump_list_entry * next;
252 };
253 static struct dump_list_entry * dump_sects_byname;
254 
255 /* A dynamic array of flags indicating for which sections a dump
256    has been requested via command line switches.  */
257 static dump_type *   cmdline_dump_sects = NULL;
258 static unsigned int  num_cmdline_dump_sects = 0;
259 
260 /* A dynamic array of flags indicating for which sections a dump of
261    some kind has been requested.  It is reset on a per-object file
262    basis and then initialised from the cmdline_dump_sects array,
263    the results of interpreting the -w switch, and the
264    dump_sects_byname list.  */
265 static dump_type *   dump_sects = NULL;
266 static unsigned int  num_dump_sects = 0;
267 
268 
269 /* How to print a vma value.  */
270 typedef enum print_mode
271 {
272   HEX,
273   DEC,
274   DEC_5,
275   UNSIGNED,
276   PREFIX_HEX,
277   FULL_HEX,
278   LONG_HEX
279 }
280 print_mode;
281 
282 /* Versioned symbol info.  */
283 enum versioned_symbol_info
284 {
285   symbol_undefined,
286   symbol_hidden,
287   symbol_public
288 };
289 
290 static const char *get_symbol_version_string
291   (FILE *file, int is_dynsym, const char *strtab,
292    unsigned long int strtab_size, unsigned int si,
293    Elf_Internal_Sym *psym, enum versioned_symbol_info *sym_info,
294    unsigned short *vna_other);
295 
296 #define UNKNOWN -1
297 
298 #define SECTION_NAME(X)						\
299   ((X) == NULL ? _("<none>")					\
300    : string_table == NULL ? _("<no-name>")			\
301    : ((X)->sh_name >= string_table_length ? _("<corrupt>")	\
302   : string_table + (X)->sh_name))
303 
304 #define DT_VERSIONTAGIDX(tag)	(DT_VERNEEDNUM - (tag))	/* Reverse order!  */
305 
306 #define GET_ELF_SYMBOLS(file, section, sym_count)			\
307   (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count)	\
308    : get_64bit_elf_symbols (file, section, sym_count))
309 
310 #define VALID_DYNAMIC_NAME(offset)	((dynamic_strings != NULL) && (offset < dynamic_strings_length))
311 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
312    already been called and verified that the string exists.  */
313 #define GET_DYNAMIC_NAME(offset)	(dynamic_strings + offset)
314 
315 #define REMOVE_ARCH_BITS(ADDR)			\
316   do						\
317     {						\
318       if (elf_header.e_machine == EM_ARM)	\
319 	(ADDR) &= ~1;				\
320     }						\
321   while (0)
322 
323 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET +
324    the offset of the current archive member, if we are examining an archive.
325    Put the retrieved data into VAR, if it is not NULL.  Otherwise allocate a buffer
326    using malloc and fill that.  In either case return the pointer to the start of
327    the retrieved data or NULL if something went wrong.  If something does go wrong
328    and REASON is not NULL then emit an error message using REASON as part of the
329    context.  */
330 
331 static void *
332 get_data (void * var, FILE * file, unsigned long offset, bfd_size_type size,
333 	  bfd_size_type nmemb, const char * reason)
334 {
335   void * mvar;
336   bfd_size_type amt = size * nmemb;
337 
338   if (size == 0 || nmemb == 0)
339     return NULL;
340 
341   /* If the size_t type is smaller than the bfd_size_type, eg because
342      you are building a 32-bit tool on a 64-bit host, then make sure
343      that when the sizes are cast to (size_t) no information is lost.  */
344   if (sizeof (size_t) < sizeof (bfd_size_type)
345       && (   (bfd_size_type) ((size_t) size) != size
346 	  || (bfd_size_type) ((size_t) nmemb) != nmemb))
347     {
348       if (reason)
349 	error (_("Size truncation prevents reading 0x%" BFD_VMA_FMT "x"
350 		 " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
351 	       nmemb, size, reason);
352       return NULL;
353     }
354 
355   /* Check for size overflow.  */
356   if (amt < nmemb)
357     {
358       if (reason)
359 	error (_("Size overflow prevents reading 0x%" BFD_VMA_FMT "x"
360 		 " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
361 	       nmemb, size, reason);
362       return NULL;
363     }
364 
365   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
366      attempting to allocate memory when the read is bound to fail.  */
367   if (amt > current_file_size
368       || offset + archive_file_offset + amt > current_file_size)
369     {
370       if (reason)
371 	error (_("Reading 0x%" BFD_VMA_FMT "x"
372 		 " bytes extends past end of file for %s\n"),
373 	       amt, reason);
374       return NULL;
375     }
376 
377   if (fseek (file, archive_file_offset + offset, SEEK_SET))
378     {
379       if (reason)
380 	error (_("Unable to seek to 0x%lx for %s\n"),
381 	       archive_file_offset + offset, reason);
382       return NULL;
383     }
384 
385   mvar = var;
386   if (mvar == NULL)
387     {
388       /* Check for overflow.  */
389       if (nmemb < (~(bfd_size_type) 0 - 1) / size)
390 	/* + 1 so that we can '\0' terminate invalid string table sections.  */
391 	mvar = malloc ((size_t) amt + 1);
392 
393       if (mvar == NULL)
394 	{
395 	  if (reason)
396 	    error (_("Out of memory allocating 0x%" BFD_VMA_FMT "x"
397 		     " bytes for %s\n"),
398 		   amt, reason);
399 	  return NULL;
400 	}
401 
402       ((char *) mvar)[amt] = '\0';
403     }
404 
405   if (fread (mvar, (size_t) size, (size_t) nmemb, file) != nmemb)
406     {
407       if (reason)
408 	error (_("Unable to read in 0x%" BFD_VMA_FMT "x bytes of %s\n"),
409 	       amt, reason);
410       if (mvar != var)
411 	free (mvar);
412       return NULL;
413     }
414 
415   return mvar;
416 }
417 
418 /* Print a VMA value.  */
419 
420 static int
421 print_vma (bfd_vma vma, print_mode mode)
422 {
423   int nc = 0;
424 
425   switch (mode)
426     {
427     case FULL_HEX:
428       nc = printf ("0x");
429       /* Drop through.  */
430 
431     case LONG_HEX:
432 #ifdef BFD64
433       if (is_32bit_elf)
434 	return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
435 #endif
436       printf_vma (vma);
437       return nc + 16;
438 
439     case DEC_5:
440       if (vma <= 99999)
441 	return printf ("%5" BFD_VMA_FMT "d", vma);
442       /* Drop through.  */
443 
444     case PREFIX_HEX:
445       nc = printf ("0x");
446       /* Drop through.  */
447 
448     case HEX:
449       return nc + printf ("%" BFD_VMA_FMT "x", vma);
450 
451     case DEC:
452       return printf ("%" BFD_VMA_FMT "d", vma);
453 
454     case UNSIGNED:
455       return printf ("%" BFD_VMA_FMT "u", vma);
456     }
457   return 0;
458 }
459 
460 /* Display a symbol on stdout.  Handles the display of control characters and
461    multibye characters (assuming the host environment supports them).
462 
463    Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
464 
465    If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
466    padding as necessary.
467 
468    Returns the number of emitted characters.  */
469 
470 static unsigned int
471 print_symbol (int width, const char *symbol)
472 {
473   bfd_boolean extra_padding = FALSE;
474   int num_printed = 0;
475 #ifdef HAVE_MBSTATE_T
476   mbstate_t state;
477 #endif
478   int width_remaining;
479 
480   if (width < 0)
481     {
482       /* Keep the width positive.  This also helps.  */
483       width = - width;
484       extra_padding = TRUE;
485     }
486   assert (width != 0);
487 
488   if (do_wide)
489     /* Set the remaining width to a very large value.
490        This simplifies the code below.  */
491     width_remaining = INT_MAX;
492   else
493     width_remaining = width;
494 
495 #ifdef HAVE_MBSTATE_T
496   /* Initialise the multibyte conversion state.  */
497   memset (& state, 0, sizeof (state));
498 #endif
499 
500   while (width_remaining)
501     {
502       size_t  n;
503       const char c = *symbol++;
504 
505       if (c == 0)
506 	break;
507 
508       /* Do not print control characters directly as they can affect terminal
509 	 settings.  Such characters usually appear in the names generated
510 	 by the assembler for local labels.  */
511       if (ISCNTRL (c))
512 	{
513 	  if (width_remaining < 2)
514 	    break;
515 
516 	  printf ("^%c", c + 0x40);
517 	  width_remaining -= 2;
518 	  num_printed += 2;
519 	}
520       else if (ISPRINT (c))
521 	{
522 	  putchar (c);
523 	  width_remaining --;
524 	  num_printed ++;
525 	}
526       else
527 	{
528 #ifdef HAVE_MBSTATE_T
529 	  wchar_t w;
530 #endif
531 	  /* Let printf do the hard work of displaying multibyte characters.  */
532 	  printf ("%.1s", symbol - 1);
533 	  width_remaining --;
534 	  num_printed ++;
535 
536 #ifdef HAVE_MBSTATE_T
537 	  /* Try to find out how many bytes made up the character that was
538 	     just printed.  Advance the symbol pointer past the bytes that
539 	     were displayed.  */
540 	  n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
541 #else
542 	  n = 1;
543 #endif
544 	  if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
545 	    symbol += (n - 1);
546 	}
547     }
548 
549   if (extra_padding && num_printed < width)
550     {
551       /* Fill in the remaining spaces.  */
552       printf ("%-*s", width - num_printed, " ");
553       num_printed = width;
554     }
555 
556   return num_printed;
557 }
558 
559 /* Returns a pointer to a static buffer containing a  printable version of
560    the given section's name.  Like print_symbol, except that it does not try
561    to print multibyte characters, it just interprets them as hex values.  */
562 
563 static const char *
564 printable_section_name (const Elf_Internal_Shdr * sec)
565 {
566 #define MAX_PRINT_SEC_NAME_LEN 128
567   static char  sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
568   const char * name = SECTION_NAME (sec);
569   char *       buf = sec_name_buf;
570   char         c;
571   unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
572 
573   while ((c = * name ++) != 0)
574     {
575       if (ISCNTRL (c))
576 	{
577 	  if (remaining < 2)
578 	    break;
579 
580 	  * buf ++ = '^';
581 	  * buf ++ = c + 0x40;
582 	  remaining -= 2;
583 	}
584       else if (ISPRINT (c))
585 	{
586 	  * buf ++ = c;
587 	  remaining -= 1;
588 	}
589       else
590 	{
591 	  static char hex[17] = "0123456789ABCDEF";
592 
593 	  if (remaining < 4)
594 	    break;
595 	  * buf ++ = '<';
596 	  * buf ++ = hex[(c & 0xf0) >> 4];
597 	  * buf ++ = hex[c & 0x0f];
598 	  * buf ++ = '>';
599 	  remaining -= 4;
600 	}
601 
602       if (remaining == 0)
603 	break;
604     }
605 
606   * buf = 0;
607   return sec_name_buf;
608 }
609 
610 static const char *
611 printable_section_name_from_index (unsigned long ndx)
612 {
613   if (ndx >= elf_header.e_shnum)
614     return _("<corrupt>");
615 
616   return printable_section_name (section_headers + ndx);
617 }
618 
619 /* Return a pointer to section NAME, or NULL if no such section exists.  */
620 
621 static Elf_Internal_Shdr *
622 find_section (const char * name)
623 {
624   unsigned int i;
625 
626   for (i = 0; i < elf_header.e_shnum; i++)
627     if (streq (SECTION_NAME (section_headers + i), name))
628       return section_headers + i;
629 
630   return NULL;
631 }
632 
633 /* Return a pointer to a section containing ADDR, or NULL if no such
634    section exists.  */
635 
636 static Elf_Internal_Shdr *
637 find_section_by_address (bfd_vma addr)
638 {
639   unsigned int i;
640 
641   for (i = 0; i < elf_header.e_shnum; i++)
642     {
643       Elf_Internal_Shdr *sec = section_headers + i;
644       if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
645 	return sec;
646     }
647 
648   return NULL;
649 }
650 
651 static Elf_Internal_Shdr *
652 find_section_by_type (unsigned int type)
653 {
654   unsigned int i;
655 
656   for (i = 0; i < elf_header.e_shnum; i++)
657     {
658       Elf_Internal_Shdr *sec = section_headers + i;
659       if (sec->sh_type == type)
660 	return sec;
661     }
662 
663   return NULL;
664 }
665 
666 /* Return a pointer to section NAME, or NULL if no such section exists,
667    restricted to the list of sections given in SET.  */
668 
669 static Elf_Internal_Shdr *
670 find_section_in_set (const char * name, unsigned int * set)
671 {
672   unsigned int i;
673 
674   if (set != NULL)
675     {
676       while ((i = *set++) > 0)
677 	if (streq (SECTION_NAME (section_headers + i), name))
678 	  return section_headers + i;
679     }
680 
681   return find_section (name);
682 }
683 
684 /* Read an unsigned LEB128 encoded value from p.  Set *PLEN to the number of
685    bytes read.  */
686 
687 static inline unsigned long
688 read_uleb128 (unsigned char *data,
689 	      unsigned int *length_return,
690 	      const unsigned char * const end)
691 {
692   return read_leb128 (data, length_return, FALSE, end);
693 }
694 
695 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
696    This OS has so many departures from the ELF standard that we test it at
697    many places.  */
698 
699 static inline int
700 is_ia64_vms (void)
701 {
702   return elf_header.e_machine == EM_IA_64
703     && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
704 }
705 
706 /* Guess the relocation size commonly used by the specific machines.  */
707 
708 static int
709 guess_is_rela (unsigned int e_machine)
710 {
711   switch (e_machine)
712     {
713       /* Targets that use REL relocations.  */
714     case EM_386:
715     case EM_IAMCU:
716     case EM_960:
717     case EM_ARM:
718     case EM_D10V:
719     case EM_CYGNUS_D10V:
720     case EM_DLX:
721     case EM_MIPS:
722     case EM_MIPS_RS3_LE:
723     case EM_CYGNUS_M32R:
724     case EM_SCORE:
725     case EM_XGATE:
726       return FALSE;
727 
728       /* Targets that use RELA relocations.  */
729     case EM_68K:
730     case EM_860:
731     case EM_AARCH64:
732     case EM_ADAPTEVA_EPIPHANY:
733     case EM_ALPHA:
734     case EM_ALTERA_NIOS2:
735     case EM_ARC:
736     case EM_ARC_COMPACT:
737     case EM_ARC_COMPACT2:
738     case EM_AVR:
739     case EM_AVR_OLD:
740     case EM_BLACKFIN:
741     case EM_CR16:
742     case EM_CRIS:
743     case EM_CRX:
744     case EM_D30V:
745     case EM_CYGNUS_D30V:
746     case EM_FR30:
747     case EM_FT32:
748     case EM_CYGNUS_FR30:
749     case EM_CYGNUS_FRV:
750     case EM_H8S:
751     case EM_H8_300:
752     case EM_H8_300H:
753     case EM_IA_64:
754     case EM_IP2K:
755     case EM_IP2K_OLD:
756     case EM_IQ2000:
757     case EM_LATTICEMICO32:
758     case EM_M32C_OLD:
759     case EM_M32C:
760     case EM_M32R:
761     case EM_MCORE:
762     case EM_CYGNUS_MEP:
763     case EM_METAG:
764     case EM_MMIX:
765     case EM_MN10200:
766     case EM_CYGNUS_MN10200:
767     case EM_MN10300:
768     case EM_CYGNUS_MN10300:
769     case EM_MOXIE:
770     case EM_MSP430:
771     case EM_MSP430_OLD:
772     case EM_MT:
773     case EM_NDS32:
774     case EM_NIOS32:
775     case EM_OR1K:
776     case EM_PPC64:
777     case EM_PPC:
778     case EM_RL78:
779     case EM_RX:
780     case EM_S390:
781     case EM_S390_OLD:
782     case EM_SH:
783     case EM_SPARC:
784     case EM_SPARC32PLUS:
785     case EM_SPARCV9:
786     case EM_SPU:
787     case EM_TI_C6000:
788     case EM_TILEGX:
789     case EM_TILEPRO:
790     case EM_V800:
791     case EM_V850:
792     case EM_CYGNUS_V850:
793     case EM_VAX:
794     case EM_VISIUM:
795     case EM_X86_64:
796     case EM_L1OM:
797     case EM_K1OM:
798     case EM_XSTORMY16:
799     case EM_XTENSA:
800     case EM_XTENSA_OLD:
801     case EM_MICROBLAZE:
802     case EM_MICROBLAZE_OLD:
803       return TRUE;
804 
805     case EM_68HC05:
806     case EM_68HC08:
807     case EM_68HC11:
808     case EM_68HC16:
809     case EM_FX66:
810     case EM_ME16:
811     case EM_MMA:
812     case EM_NCPU:
813     case EM_NDR1:
814     case EM_PCP:
815     case EM_ST100:
816     case EM_ST19:
817     case EM_ST7:
818     case EM_ST9PLUS:
819     case EM_STARCORE:
820     case EM_SVX:
821     case EM_TINYJ:
822     default:
823       warn (_("Don't know about relocations on this machine architecture\n"));
824       return FALSE;
825     }
826 }
827 
828 static int
829 slurp_rela_relocs (FILE * file,
830 		   unsigned long rel_offset,
831 		   unsigned long rel_size,
832 		   Elf_Internal_Rela ** relasp,
833 		   unsigned long * nrelasp)
834 {
835   Elf_Internal_Rela * relas;
836   size_t nrelas;
837   unsigned int i;
838 
839   if (is_32bit_elf)
840     {
841       Elf32_External_Rela * erelas;
842 
843       erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
844                                                  rel_size, _("32-bit relocation data"));
845       if (!erelas)
846 	return 0;
847 
848       nrelas = rel_size / sizeof (Elf32_External_Rela);
849 
850       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
851                                              sizeof (Elf_Internal_Rela));
852 
853       if (relas == NULL)
854 	{
855 	  free (erelas);
856 	  error (_("out of memory parsing relocs\n"));
857 	  return 0;
858 	}
859 
860       for (i = 0; i < nrelas; i++)
861 	{
862 	  relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
863 	  relas[i].r_info   = BYTE_GET (erelas[i].r_info);
864 	  relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
865 	}
866 
867       free (erelas);
868     }
869   else
870     {
871       Elf64_External_Rela * erelas;
872 
873       erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
874                                                  rel_size, _("64-bit relocation data"));
875       if (!erelas)
876 	return 0;
877 
878       nrelas = rel_size / sizeof (Elf64_External_Rela);
879 
880       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
881                                              sizeof (Elf_Internal_Rela));
882 
883       if (relas == NULL)
884 	{
885 	  free (erelas);
886 	  error (_("out of memory parsing relocs\n"));
887 	  return 0;
888 	}
889 
890       for (i = 0; i < nrelas; i++)
891 	{
892 	  relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
893 	  relas[i].r_info   = BYTE_GET (erelas[i].r_info);
894 	  relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
895 
896 	  /* The #ifdef BFD64 below is to prevent a compile time
897 	     warning.  We know that if we do not have a 64 bit data
898 	     type that we will never execute this code anyway.  */
899 #ifdef BFD64
900 	  if (elf_header.e_machine == EM_MIPS
901 	      && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
902 	    {
903 	      /* In little-endian objects, r_info isn't really a
904 		 64-bit little-endian value: it has a 32-bit
905 		 little-endian symbol index followed by four
906 		 individual byte fields.  Reorder INFO
907 		 accordingly.  */
908 	      bfd_vma inf = relas[i].r_info;
909 	      inf = (((inf & 0xffffffff) << 32)
910 		      | ((inf >> 56) & 0xff)
911 		      | ((inf >> 40) & 0xff00)
912 		      | ((inf >> 24) & 0xff0000)
913 		      | ((inf >> 8) & 0xff000000));
914 	      relas[i].r_info = inf;
915 	    }
916 #endif /* BFD64 */
917 	}
918 
919       free (erelas);
920     }
921   *relasp = relas;
922   *nrelasp = nrelas;
923   return 1;
924 }
925 
926 static int
927 slurp_rel_relocs (FILE * file,
928 		  unsigned long rel_offset,
929 		  unsigned long rel_size,
930 		  Elf_Internal_Rela ** relsp,
931 		  unsigned long * nrelsp)
932 {
933   Elf_Internal_Rela * rels;
934   size_t nrels;
935   unsigned int i;
936 
937   if (is_32bit_elf)
938     {
939       Elf32_External_Rel * erels;
940 
941       erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
942                                                rel_size, _("32-bit relocation data"));
943       if (!erels)
944 	return 0;
945 
946       nrels = rel_size / sizeof (Elf32_External_Rel);
947 
948       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
949 
950       if (rels == NULL)
951 	{
952 	  free (erels);
953 	  error (_("out of memory parsing relocs\n"));
954 	  return 0;
955 	}
956 
957       for (i = 0; i < nrels; i++)
958 	{
959 	  rels[i].r_offset = BYTE_GET (erels[i].r_offset);
960 	  rels[i].r_info   = BYTE_GET (erels[i].r_info);
961 	  rels[i].r_addend = 0;
962 	}
963 
964       free (erels);
965     }
966   else
967     {
968       Elf64_External_Rel * erels;
969 
970       erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
971                                                rel_size, _("64-bit relocation data"));
972       if (!erels)
973 	return 0;
974 
975       nrels = rel_size / sizeof (Elf64_External_Rel);
976 
977       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
978 
979       if (rels == NULL)
980 	{
981 	  free (erels);
982 	  error (_("out of memory parsing relocs\n"));
983 	  return 0;
984 	}
985 
986       for (i = 0; i < nrels; i++)
987 	{
988 	  rels[i].r_offset = BYTE_GET (erels[i].r_offset);
989 	  rels[i].r_info   = BYTE_GET (erels[i].r_info);
990 	  rels[i].r_addend = 0;
991 
992 	  /* The #ifdef BFD64 below is to prevent a compile time
993 	     warning.  We know that if we do not have a 64 bit data
994 	     type that we will never execute this code anyway.  */
995 #ifdef BFD64
996 	  if (elf_header.e_machine == EM_MIPS
997 	      && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
998 	    {
999 	      /* In little-endian objects, r_info isn't really a
1000 		 64-bit little-endian value: it has a 32-bit
1001 		 little-endian symbol index followed by four
1002 		 individual byte fields.  Reorder INFO
1003 		 accordingly.  */
1004 	      bfd_vma inf = rels[i].r_info;
1005 	      inf = (((inf & 0xffffffff) << 32)
1006 		     | ((inf >> 56) & 0xff)
1007 		     | ((inf >> 40) & 0xff00)
1008 		     | ((inf >> 24) & 0xff0000)
1009 		     | ((inf >> 8) & 0xff000000));
1010 	      rels[i].r_info = inf;
1011 	    }
1012 #endif /* BFD64 */
1013 	}
1014 
1015       free (erels);
1016     }
1017   *relsp = rels;
1018   *nrelsp = nrels;
1019   return 1;
1020 }
1021 
1022 /* Returns the reloc type extracted from the reloc info field.  */
1023 
1024 static unsigned int
1025 get_reloc_type (bfd_vma reloc_info)
1026 {
1027   if (is_32bit_elf)
1028     return ELF32_R_TYPE (reloc_info);
1029 
1030   switch (elf_header.e_machine)
1031     {
1032     case EM_MIPS:
1033       /* Note: We assume that reloc_info has already been adjusted for us.  */
1034       return ELF64_MIPS_R_TYPE (reloc_info);
1035 
1036     case EM_SPARCV9:
1037       return ELF64_R_TYPE_ID (reloc_info);
1038 
1039     default:
1040       return ELF64_R_TYPE (reloc_info);
1041     }
1042 }
1043 
1044 /* Return the symbol index extracted from the reloc info field.  */
1045 
1046 static bfd_vma
1047 get_reloc_symindex (bfd_vma reloc_info)
1048 {
1049   return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1050 }
1051 
1052 static inline bfd_boolean
1053 uses_msp430x_relocs (void)
1054 {
1055   return
1056     elf_header.e_machine == EM_MSP430 /* Paranoia.  */
1057     /* GCC uses osabi == ELFOSBI_STANDALONE.  */
1058     && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1059 	/* TI compiler uses ELFOSABI_NONE.  */
1060 	|| (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1061 }
1062 
1063 /* Display the contents of the relocation data found at the specified
1064    offset.  */
1065 
1066 static void
1067 dump_relocations (FILE * file,
1068 		  unsigned long rel_offset,
1069 		  unsigned long rel_size,
1070 		  Elf_Internal_Sym * symtab,
1071 		  unsigned long nsyms,
1072 		  char * strtab,
1073 		  unsigned long strtablen,
1074 		  int is_rela,
1075 		  int is_dynsym)
1076 {
1077   unsigned int i;
1078   Elf_Internal_Rela * rels;
1079 
1080   if (is_rela == UNKNOWN)
1081     is_rela = guess_is_rela (elf_header.e_machine);
1082 
1083   if (is_rela)
1084     {
1085       if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1086 	return;
1087     }
1088   else
1089     {
1090       if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1091 	return;
1092     }
1093 
1094   if (is_32bit_elf)
1095     {
1096       if (is_rela)
1097 	{
1098 	  if (do_wide)
1099 	    printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name + Addend\n"));
1100 	  else
1101 	    printf (_(" Offset     Info    Type            Sym.Value  Sym. Name + Addend\n"));
1102 	}
1103       else
1104 	{
1105 	  if (do_wide)
1106 	    printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name\n"));
1107 	  else
1108 	    printf (_(" Offset     Info    Type            Sym.Value  Sym. Name\n"));
1109 	}
1110     }
1111   else
1112     {
1113       if (is_rela)
1114 	{
1115 	  if (do_wide)
1116 	    printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend\n"));
1117 	  else
1118 	    printf (_("  Offset          Info           Type           Sym. Value    Sym. Name + Addend\n"));
1119 	}
1120       else
1121 	{
1122 	  if (do_wide)
1123 	    printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name\n"));
1124 	  else
1125 	    printf (_("  Offset          Info           Type           Sym. Value    Sym. Name\n"));
1126 	}
1127     }
1128 
1129   for (i = 0; i < rel_size; i++)
1130     {
1131       const char * rtype;
1132       bfd_vma offset;
1133       bfd_vma inf;
1134       bfd_vma symtab_index;
1135       bfd_vma type;
1136 
1137       offset = rels[i].r_offset;
1138       inf    = rels[i].r_info;
1139 
1140       type = get_reloc_type (inf);
1141       symtab_index = get_reloc_symindex  (inf);
1142 
1143       if (is_32bit_elf)
1144 	{
1145 	  printf ("%8.8lx  %8.8lx ",
1146 		  (unsigned long) offset & 0xffffffff,
1147 		  (unsigned long) inf & 0xffffffff);
1148 	}
1149       else
1150 	{
1151 #if BFD_HOST_64BIT_LONG
1152 	  printf (do_wide
1153 		  ? "%16.16lx  %16.16lx "
1154 		  : "%12.12lx  %12.12lx ",
1155 		  offset, inf);
1156 #elif BFD_HOST_64BIT_LONG_LONG
1157 #ifndef __MSVCRT__
1158 	  printf (do_wide
1159 		  ? "%16.16llx  %16.16llx "
1160 		  : "%12.12llx  %12.12llx ",
1161 		  offset, inf);
1162 #else
1163 	  printf (do_wide
1164 		  ? "%16.16I64x  %16.16I64x "
1165 		  : "%12.12I64x  %12.12I64x ",
1166 		  offset, inf);
1167 #endif
1168 #else
1169 	  printf (do_wide
1170 		  ? "%8.8lx%8.8lx  %8.8lx%8.8lx "
1171 		  : "%4.4lx%8.8lx  %4.4lx%8.8lx ",
1172 		  _bfd_int64_high (offset),
1173 		  _bfd_int64_low (offset),
1174 		  _bfd_int64_high (inf),
1175 		  _bfd_int64_low (inf));
1176 #endif
1177 	}
1178 
1179       switch (elf_header.e_machine)
1180 	{
1181 	default:
1182 	  rtype = NULL;
1183 	  break;
1184 
1185 	case EM_AARCH64:
1186 	  rtype = elf_aarch64_reloc_type (type);
1187 	  break;
1188 
1189 	case EM_M32R:
1190 	case EM_CYGNUS_M32R:
1191 	  rtype = elf_m32r_reloc_type (type);
1192 	  break;
1193 
1194 	case EM_386:
1195 	case EM_IAMCU:
1196 	  rtype = elf_i386_reloc_type (type);
1197 	  break;
1198 
1199 	case EM_68HC11:
1200 	case EM_68HC12:
1201 	  rtype = elf_m68hc11_reloc_type (type);
1202 	  break;
1203 
1204 	case EM_68K:
1205 	  rtype = elf_m68k_reloc_type (type);
1206 	  break;
1207 
1208 	case EM_960:
1209 	  rtype = elf_i960_reloc_type (type);
1210 	  break;
1211 
1212 	case EM_AVR:
1213 	case EM_AVR_OLD:
1214 	  rtype = elf_avr_reloc_type (type);
1215 	  break;
1216 
1217 	case EM_OLD_SPARCV9:
1218 	case EM_SPARC32PLUS:
1219 	case EM_SPARCV9:
1220 	case EM_SPARC:
1221 	  rtype = elf_sparc_reloc_type (type);
1222 	  break;
1223 
1224 	case EM_SPU:
1225 	  rtype = elf_spu_reloc_type (type);
1226 	  break;
1227 
1228 	case EM_V800:
1229 	  rtype = v800_reloc_type (type);
1230 	  break;
1231 	case EM_V850:
1232 	case EM_CYGNUS_V850:
1233 	  rtype = v850_reloc_type (type);
1234 	  break;
1235 
1236 	case EM_D10V:
1237 	case EM_CYGNUS_D10V:
1238 	  rtype = elf_d10v_reloc_type (type);
1239 	  break;
1240 
1241 	case EM_D30V:
1242 	case EM_CYGNUS_D30V:
1243 	  rtype = elf_d30v_reloc_type (type);
1244 	  break;
1245 
1246 	case EM_DLX:
1247 	  rtype = elf_dlx_reloc_type (type);
1248 	  break;
1249 
1250 	case EM_SH:
1251 	  rtype = elf_sh_reloc_type (type);
1252 	  break;
1253 
1254 	case EM_MN10300:
1255 	case EM_CYGNUS_MN10300:
1256 	  rtype = elf_mn10300_reloc_type (type);
1257 	  break;
1258 
1259 	case EM_MN10200:
1260 	case EM_CYGNUS_MN10200:
1261 	  rtype = elf_mn10200_reloc_type (type);
1262 	  break;
1263 
1264 	case EM_FR30:
1265 	case EM_CYGNUS_FR30:
1266 	  rtype = elf_fr30_reloc_type (type);
1267 	  break;
1268 
1269 	case EM_CYGNUS_FRV:
1270 	  rtype = elf_frv_reloc_type (type);
1271 	  break;
1272 
1273 	case EM_FT32:
1274 	  rtype = elf_ft32_reloc_type (type);
1275 	  break;
1276 
1277 	case EM_MCORE:
1278 	  rtype = elf_mcore_reloc_type (type);
1279 	  break;
1280 
1281 	case EM_MMIX:
1282 	  rtype = elf_mmix_reloc_type (type);
1283 	  break;
1284 
1285 	case EM_MOXIE:
1286 	  rtype = elf_moxie_reloc_type (type);
1287 	  break;
1288 
1289 	case EM_MSP430:
1290 	  if (uses_msp430x_relocs ())
1291 	    {
1292 	      rtype = elf_msp430x_reloc_type (type);
1293 	      break;
1294 	    }
1295 	case EM_MSP430_OLD:
1296 	  rtype = elf_msp430_reloc_type (type);
1297 	  break;
1298 
1299 	case EM_NDS32:
1300 	  rtype = elf_nds32_reloc_type (type);
1301 	  break;
1302 
1303 	case EM_PPC:
1304 	  rtype = elf_ppc_reloc_type (type);
1305 	  break;
1306 
1307 	case EM_PPC64:
1308 	  rtype = elf_ppc64_reloc_type (type);
1309 	  break;
1310 
1311 	case EM_MIPS:
1312 	case EM_MIPS_RS3_LE:
1313 	  rtype = elf_mips_reloc_type (type);
1314 	  break;
1315 
1316 	case EM_ALPHA:
1317 	  rtype = elf_alpha_reloc_type (type);
1318 	  break;
1319 
1320 	case EM_ARM:
1321 	  rtype = elf_arm_reloc_type (type);
1322 	  break;
1323 
1324 	case EM_ARC:
1325 	case EM_ARC_COMPACT:
1326 	case EM_ARC_COMPACT2:
1327 	  rtype = elf_arc_reloc_type (type);
1328 	  break;
1329 
1330 	case EM_PARISC:
1331 	  rtype = elf_hppa_reloc_type (type);
1332 	  break;
1333 
1334 	case EM_H8_300:
1335 	case EM_H8_300H:
1336 	case EM_H8S:
1337 	  rtype = elf_h8_reloc_type (type);
1338 	  break;
1339 
1340 	case EM_OR1K:
1341 	  rtype = elf_or1k_reloc_type (type);
1342 	  break;
1343 
1344 	case EM_PJ:
1345 	case EM_PJ_OLD:
1346 	  rtype = elf_pj_reloc_type (type);
1347 	  break;
1348 	case EM_IA_64:
1349 	  rtype = elf_ia64_reloc_type (type);
1350 	  break;
1351 
1352 	case EM_CRIS:
1353 	  rtype = elf_cris_reloc_type (type);
1354 	  break;
1355 
1356 	case EM_860:
1357 	  rtype = elf_i860_reloc_type (type);
1358 	  break;
1359 
1360 	case EM_X86_64:
1361 	case EM_L1OM:
1362 	case EM_K1OM:
1363 	  rtype = elf_x86_64_reloc_type (type);
1364 	  break;
1365 
1366 	case EM_S370:
1367 	  rtype = i370_reloc_type (type);
1368 	  break;
1369 
1370 	case EM_S390_OLD:
1371 	case EM_S390:
1372 	  rtype = elf_s390_reloc_type (type);
1373 	  break;
1374 
1375 	case EM_SCORE:
1376 	  rtype = elf_score_reloc_type (type);
1377 	  break;
1378 
1379 	case EM_XSTORMY16:
1380 	  rtype = elf_xstormy16_reloc_type (type);
1381 	  break;
1382 
1383 	case EM_CRX:
1384 	  rtype = elf_crx_reloc_type (type);
1385 	  break;
1386 
1387 	case EM_VAX:
1388 	  rtype = elf_vax_reloc_type (type);
1389 	  break;
1390 
1391 	case EM_VISIUM:
1392 	  rtype = elf_visium_reloc_type (type);
1393 	  break;
1394 
1395 	case EM_ADAPTEVA_EPIPHANY:
1396 	  rtype = elf_epiphany_reloc_type (type);
1397 	  break;
1398 
1399 	case EM_IP2K:
1400 	case EM_IP2K_OLD:
1401 	  rtype = elf_ip2k_reloc_type (type);
1402 	  break;
1403 
1404 	case EM_IQ2000:
1405 	  rtype = elf_iq2000_reloc_type (type);
1406 	  break;
1407 
1408 	case EM_XTENSA_OLD:
1409 	case EM_XTENSA:
1410 	  rtype = elf_xtensa_reloc_type (type);
1411 	  break;
1412 
1413 	case EM_LATTICEMICO32:
1414 	  rtype = elf_lm32_reloc_type (type);
1415 	  break;
1416 
1417 	case EM_M32C_OLD:
1418 	case EM_M32C:
1419 	  rtype = elf_m32c_reloc_type (type);
1420 	  break;
1421 
1422 	case EM_MT:
1423 	  rtype = elf_mt_reloc_type (type);
1424 	  break;
1425 
1426 	case EM_BLACKFIN:
1427 	  rtype = elf_bfin_reloc_type (type);
1428 	  break;
1429 
1430 	case EM_CYGNUS_MEP:
1431 	  rtype = elf_mep_reloc_type (type);
1432 	  break;
1433 
1434 	case EM_CR16:
1435 	  rtype = elf_cr16_reloc_type (type);
1436 	  break;
1437 
1438 	case EM_MICROBLAZE:
1439 	case EM_MICROBLAZE_OLD:
1440 	  rtype = elf_microblaze_reloc_type (type);
1441 	  break;
1442 
1443 	case EM_RL78:
1444 	  rtype = elf_rl78_reloc_type (type);
1445 	  break;
1446 
1447 	case EM_RX:
1448 	  rtype = elf_rx_reloc_type (type);
1449 	  break;
1450 
1451 	case EM_METAG:
1452 	  rtype = elf_metag_reloc_type (type);
1453 	  break;
1454 
1455 	case EM_XC16X:
1456 	case EM_C166:
1457 	  rtype = elf_xc16x_reloc_type (type);
1458 	  break;
1459 
1460 	case EM_TI_C6000:
1461 	  rtype = elf_tic6x_reloc_type (type);
1462 	  break;
1463 
1464 	case EM_TILEGX:
1465 	  rtype = elf_tilegx_reloc_type (type);
1466 	  break;
1467 
1468 	case EM_TILEPRO:
1469 	  rtype = elf_tilepro_reloc_type (type);
1470 	  break;
1471 
1472 	case EM_XGATE:
1473 	  rtype = elf_xgate_reloc_type (type);
1474 	  break;
1475 
1476 	case EM_ALTERA_NIOS2:
1477 	  rtype = elf_nios2_reloc_type (type);
1478 	  break;
1479 	}
1480 
1481       if (rtype == NULL)
1482 	printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1483       else
1484 	printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1485 
1486       if (elf_header.e_machine == EM_ALPHA
1487 	  && rtype != NULL
1488 	  && streq (rtype, "R_ALPHA_LITUSE")
1489 	  && is_rela)
1490 	{
1491 	  switch (rels[i].r_addend)
1492 	    {
1493 	    case LITUSE_ALPHA_ADDR:   rtype = "ADDR";   break;
1494 	    case LITUSE_ALPHA_BASE:   rtype = "BASE";   break;
1495 	    case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1496 	    case LITUSE_ALPHA_JSR:    rtype = "JSR";    break;
1497 	    case LITUSE_ALPHA_TLSGD:  rtype = "TLSGD";  break;
1498 	    case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1499 	    case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1500 	    default: rtype = NULL;
1501 	    }
1502 	  if (rtype)
1503 	    printf (" (%s)", rtype);
1504 	  else
1505 	    {
1506 	      putchar (' ');
1507 	      printf (_("<unknown addend: %lx>"),
1508 		      (unsigned long) rels[i].r_addend);
1509 	    }
1510 	}
1511       else if (symtab_index)
1512 	{
1513 	  if (symtab == NULL || symtab_index >= nsyms)
1514 	    printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1515 	  else
1516 	    {
1517 	      Elf_Internal_Sym * psym;
1518 	      const char * version_string;
1519 	      enum versioned_symbol_info sym_info;
1520 	      unsigned short vna_other;
1521 
1522 	      psym = symtab + symtab_index;
1523 
1524 	      version_string
1525 		= get_symbol_version_string (file, is_dynsym,
1526 					     strtab, strtablen,
1527 					     symtab_index,
1528 					     psym,
1529 					     &sym_info,
1530 					     &vna_other);
1531 
1532 	      printf (" ");
1533 
1534 	      if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1535 		{
1536 		  const char * name;
1537 		  unsigned int len;
1538 		  unsigned int width = is_32bit_elf ? 8 : 14;
1539 
1540 		  /* Relocations against GNU_IFUNC symbols do not use the value
1541 		     of the symbol as the address to relocate against.  Instead
1542 		     they invoke the function named by the symbol and use its
1543 		     result as the address for relocation.
1544 
1545 		     To indicate this to the user, do not display the value of
1546 		     the symbol in the "Symbols's Value" field.  Instead show
1547 		     its name followed by () as a hint that the symbol is
1548 		     invoked.  */
1549 
1550 		  if (strtab == NULL
1551 		      || psym->st_name == 0
1552 		      || psym->st_name >= strtablen)
1553 		    name = "??";
1554 		  else
1555 		    name = strtab + psym->st_name;
1556 
1557 		  len = print_symbol (width, name);
1558 		  if (version_string)
1559 		    printf (sym_info == symbol_public ? "@@%s" : "@%s",
1560 			    version_string);
1561 		  printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1562 		}
1563 	      else
1564 		{
1565 		  print_vma (psym->st_value, LONG_HEX);
1566 
1567 		  printf (is_32bit_elf ? "   " : " ");
1568 		}
1569 
1570 	      if (psym->st_name == 0)
1571 		{
1572 		  const char * sec_name = "<null>";
1573 		  char name_buf[40];
1574 
1575 		  if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1576 		    {
1577 		      if (psym->st_shndx < elf_header.e_shnum)
1578 			sec_name = SECTION_NAME (section_headers + psym->st_shndx);
1579 		      else if (psym->st_shndx == SHN_ABS)
1580 			sec_name = "ABS";
1581 		      else if (psym->st_shndx == SHN_COMMON)
1582 			sec_name = "COMMON";
1583 		      else if ((elf_header.e_machine == EM_MIPS
1584 				&& psym->st_shndx == SHN_MIPS_SCOMMON)
1585 			       || (elf_header.e_machine == EM_TI_C6000
1586 				   && psym->st_shndx == SHN_TIC6X_SCOMMON))
1587 			sec_name = "SCOMMON";
1588 		      else if (elf_header.e_machine == EM_MIPS
1589 			       && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1590 			sec_name = "SUNDEF";
1591 		      else if ((elf_header.e_machine == EM_X86_64
1592 				|| elf_header.e_machine == EM_L1OM
1593 				|| elf_header.e_machine == EM_K1OM)
1594 			       && psym->st_shndx == SHN_X86_64_LCOMMON)
1595 			sec_name = "LARGE_COMMON";
1596 		      else if (elf_header.e_machine == EM_IA_64
1597 			       && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1598 			       && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1599 			sec_name = "ANSI_COM";
1600 		      else if (is_ia64_vms ()
1601 			       && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1602 			sec_name = "VMS_SYMVEC";
1603 		      else
1604 			{
1605 			  sprintf (name_buf, "<section 0x%x>",
1606 				   (unsigned int) psym->st_shndx);
1607 			  sec_name = name_buf;
1608 			}
1609 		    }
1610 		  print_symbol (22, sec_name);
1611 		}
1612 	      else if (strtab == NULL)
1613 		printf (_("<string table index: %3ld>"), psym->st_name);
1614 	      else if (psym->st_name >= strtablen)
1615 		printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1616 	      else
1617 		{
1618 		  print_symbol (22, strtab + psym->st_name);
1619 		  if (version_string)
1620 		    printf (sym_info == symbol_public ? "@@%s" : "@%s",
1621 			    version_string);
1622 		}
1623 
1624 	      if (is_rela)
1625 		{
1626 		  bfd_vma off = rels[i].r_addend;
1627 
1628 		  if ((bfd_signed_vma) off < 0)
1629 		    printf (" - %" BFD_VMA_FMT "x", - off);
1630 		  else
1631 		    printf (" + %" BFD_VMA_FMT "x", off);
1632 		}
1633 	    }
1634 	}
1635       else if (is_rela)
1636 	{
1637 	  bfd_vma off = rels[i].r_addend;
1638 
1639 	  printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1640 	  if ((bfd_signed_vma) off < 0)
1641 	    printf ("-%" BFD_VMA_FMT "x", - off);
1642 	  else
1643 	    printf ("%" BFD_VMA_FMT "x", off);
1644 	}
1645 
1646       if (elf_header.e_machine == EM_SPARCV9
1647 	  && rtype != NULL
1648 	  && streq (rtype, "R_SPARC_OLO10"))
1649 	printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1650 
1651       putchar ('\n');
1652 
1653 #ifdef BFD64
1654       if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1655 	{
1656 	  bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1657 	  bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1658 	  const char * rtype2 = elf_mips_reloc_type (type2);
1659 	  const char * rtype3 = elf_mips_reloc_type (type3);
1660 
1661 	  printf ("                    Type2: ");
1662 
1663 	  if (rtype2 == NULL)
1664 	    printf (_("unrecognized: %-7lx"),
1665 		    (unsigned long) type2 & 0xffffffff);
1666 	  else
1667 	    printf ("%-17.17s", rtype2);
1668 
1669 	  printf ("\n                    Type3: ");
1670 
1671 	  if (rtype3 == NULL)
1672 	    printf (_("unrecognized: %-7lx"),
1673 		    (unsigned long) type3 & 0xffffffff);
1674 	  else
1675 	    printf ("%-17.17s", rtype3);
1676 
1677 	  putchar ('\n');
1678 	}
1679 #endif /* BFD64 */
1680     }
1681 
1682   free (rels);
1683 }
1684 
1685 static const char *
1686 get_mips_dynamic_type (unsigned long type)
1687 {
1688   switch (type)
1689     {
1690     case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1691     case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1692     case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1693     case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1694     case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1695     case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1696     case DT_MIPS_MSYM: return "MIPS_MSYM";
1697     case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1698     case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1699     case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1700     case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1701     case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1702     case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1703     case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1704     case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1705     case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1706     case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1707     case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1708     case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1709     case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1710     case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1711     case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1712     case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1713     case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1714     case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1715     case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1716     case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1717     case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1718     case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1719     case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1720     case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1721     case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1722     case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1723     case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1724     case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1725     case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1726     case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1727     case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1728     case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1729     case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1730     case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1731     case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1732     case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1733     case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1734     case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1735     case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1736     default:
1737       return NULL;
1738     }
1739 }
1740 
1741 static const char *
1742 get_sparc64_dynamic_type (unsigned long type)
1743 {
1744   switch (type)
1745     {
1746     case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1747     default:
1748       return NULL;
1749     }
1750 }
1751 
1752 static const char *
1753 get_ppc_dynamic_type (unsigned long type)
1754 {
1755   switch (type)
1756     {
1757     case DT_PPC_GOT:    return "PPC_GOT";
1758     case DT_PPC_OPT:    return "PPC_OPT";
1759     default:
1760       return NULL;
1761     }
1762 }
1763 
1764 static const char *
1765 get_ppc64_dynamic_type (unsigned long type)
1766 {
1767   switch (type)
1768     {
1769     case DT_PPC64_GLINK:  return "PPC64_GLINK";
1770     case DT_PPC64_OPD:    return "PPC64_OPD";
1771     case DT_PPC64_OPDSZ:  return "PPC64_OPDSZ";
1772     case DT_PPC64_OPT:    return "PPC64_OPT";
1773     default:
1774       return NULL;
1775     }
1776 }
1777 
1778 static const char *
1779 get_parisc_dynamic_type (unsigned long type)
1780 {
1781   switch (type)
1782     {
1783     case DT_HP_LOAD_MAP:	return "HP_LOAD_MAP";
1784     case DT_HP_DLD_FLAGS:	return "HP_DLD_FLAGS";
1785     case DT_HP_DLD_HOOK:	return "HP_DLD_HOOK";
1786     case DT_HP_UX10_INIT:	return "HP_UX10_INIT";
1787     case DT_HP_UX10_INITSZ:	return "HP_UX10_INITSZ";
1788     case DT_HP_PREINIT:		return "HP_PREINIT";
1789     case DT_HP_PREINITSZ:	return "HP_PREINITSZ";
1790     case DT_HP_NEEDED:		return "HP_NEEDED";
1791     case DT_HP_TIME_STAMP:	return "HP_TIME_STAMP";
1792     case DT_HP_CHECKSUM:	return "HP_CHECKSUM";
1793     case DT_HP_GST_SIZE:	return "HP_GST_SIZE";
1794     case DT_HP_GST_VERSION:	return "HP_GST_VERSION";
1795     case DT_HP_GST_HASHVAL:	return "HP_GST_HASHVAL";
1796     case DT_HP_EPLTREL:		return "HP_GST_EPLTREL";
1797     case DT_HP_EPLTRELSZ:	return "HP_GST_EPLTRELSZ";
1798     case DT_HP_FILTERED:	return "HP_FILTERED";
1799     case DT_HP_FILTER_TLS:	return "HP_FILTER_TLS";
1800     case DT_HP_COMPAT_FILTERED:	return "HP_COMPAT_FILTERED";
1801     case DT_HP_LAZYLOAD:	return "HP_LAZYLOAD";
1802     case DT_HP_BIND_NOW_COUNT:	return "HP_BIND_NOW_COUNT";
1803     case DT_PLT:		return "PLT";
1804     case DT_PLT_SIZE:		return "PLT_SIZE";
1805     case DT_DLT:		return "DLT";
1806     case DT_DLT_SIZE:		return "DLT_SIZE";
1807     default:
1808       return NULL;
1809     }
1810 }
1811 
1812 static const char *
1813 get_ia64_dynamic_type (unsigned long type)
1814 {
1815   switch (type)
1816     {
1817     case DT_IA_64_PLT_RESERVE:         return "IA_64_PLT_RESERVE";
1818     case DT_IA_64_VMS_SUBTYPE:         return "VMS_SUBTYPE";
1819     case DT_IA_64_VMS_IMGIOCNT:        return "VMS_IMGIOCNT";
1820     case DT_IA_64_VMS_LNKFLAGS:        return "VMS_LNKFLAGS";
1821     case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1822     case DT_IA_64_VMS_IDENT:           return "VMS_IDENT";
1823     case DT_IA_64_VMS_NEEDED_IDENT:    return "VMS_NEEDED_IDENT";
1824     case DT_IA_64_VMS_IMG_RELA_CNT:    return "VMS_IMG_RELA_CNT";
1825     case DT_IA_64_VMS_SEG_RELA_CNT:    return "VMS_SEG_RELA_CNT";
1826     case DT_IA_64_VMS_FIXUP_RELA_CNT:  return "VMS_FIXUP_RELA_CNT";
1827     case DT_IA_64_VMS_FIXUP_NEEDED:    return "VMS_FIXUP_NEEDED";
1828     case DT_IA_64_VMS_SYMVEC_CNT:      return "VMS_SYMVEC_CNT";
1829     case DT_IA_64_VMS_XLATED:          return "VMS_XLATED";
1830     case DT_IA_64_VMS_STACKSIZE:       return "VMS_STACKSIZE";
1831     case DT_IA_64_VMS_UNWINDSZ:        return "VMS_UNWINDSZ";
1832     case DT_IA_64_VMS_UNWIND_CODSEG:   return "VMS_UNWIND_CODSEG";
1833     case DT_IA_64_VMS_UNWIND_INFOSEG:  return "VMS_UNWIND_INFOSEG";
1834     case DT_IA_64_VMS_LINKTIME:        return "VMS_LINKTIME";
1835     case DT_IA_64_VMS_SEG_NO:          return "VMS_SEG_NO";
1836     case DT_IA_64_VMS_SYMVEC_OFFSET:   return "VMS_SYMVEC_OFFSET";
1837     case DT_IA_64_VMS_SYMVEC_SEG:      return "VMS_SYMVEC_SEG";
1838     case DT_IA_64_VMS_UNWIND_OFFSET:   return "VMS_UNWIND_OFFSET";
1839     case DT_IA_64_VMS_UNWIND_SEG:      return "VMS_UNWIND_SEG";
1840     case DT_IA_64_VMS_STRTAB_OFFSET:   return "VMS_STRTAB_OFFSET";
1841     case DT_IA_64_VMS_SYSVER_OFFSET:   return "VMS_SYSVER_OFFSET";
1842     case DT_IA_64_VMS_IMG_RELA_OFF:    return "VMS_IMG_RELA_OFF";
1843     case DT_IA_64_VMS_SEG_RELA_OFF:    return "VMS_SEG_RELA_OFF";
1844     case DT_IA_64_VMS_FIXUP_RELA_OFF:  return "VMS_FIXUP_RELA_OFF";
1845     case DT_IA_64_VMS_PLTGOT_OFFSET:   return "VMS_PLTGOT_OFFSET";
1846     case DT_IA_64_VMS_PLTGOT_SEG:      return "VMS_PLTGOT_SEG";
1847     case DT_IA_64_VMS_FPMODE:          return "VMS_FPMODE";
1848     default:
1849       return NULL;
1850     }
1851 }
1852 
1853 static const char *
1854 get_solaris_section_type (unsigned long type)
1855 {
1856   switch (type)
1857     {
1858     case 0x6fffffee: return "SUNW_ancillary";
1859     case 0x6fffffef: return "SUNW_capchain";
1860     case 0x6ffffff0: return "SUNW_capinfo";
1861     case 0x6ffffff1: return "SUNW_symsort";
1862     case 0x6ffffff2: return "SUNW_tlssort";
1863     case 0x6ffffff3: return "SUNW_LDYNSYM";
1864     case 0x6ffffff4: return "SUNW_dof";
1865     case 0x6ffffff5: return "SUNW_cap";
1866     case 0x6ffffff6: return "SUNW_SIGNATURE";
1867     case 0x6ffffff7: return "SUNW_ANNOTATE";
1868     case 0x6ffffff8: return "SUNW_DEBUGSTR";
1869     case 0x6ffffff9: return "SUNW_DEBUG";
1870     case 0x6ffffffa: return "SUNW_move";
1871     case 0x6ffffffb: return "SUNW_COMDAT";
1872     case 0x6ffffffc: return "SUNW_syminfo";
1873     case 0x6ffffffd: return "SUNW_verdef";
1874     case 0x6ffffffe: return "SUNW_verneed";
1875     case 0x6fffffff: return "SUNW_versym";
1876     case 0x70000000: return "SPARC_GOTDATA";
1877     default: return NULL;
1878     }
1879 }
1880 
1881 static const char *
1882 get_alpha_dynamic_type (unsigned long type)
1883 {
1884   switch (type)
1885     {
1886     case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1887     default:
1888       return NULL;
1889     }
1890 }
1891 
1892 static const char *
1893 get_score_dynamic_type (unsigned long type)
1894 {
1895   switch (type)
1896     {
1897     case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1898     case DT_SCORE_LOCAL_GOTNO:  return "SCORE_LOCAL_GOTNO";
1899     case DT_SCORE_SYMTABNO:     return "SCORE_SYMTABNO";
1900     case DT_SCORE_GOTSYM:       return "SCORE_GOTSYM";
1901     case DT_SCORE_UNREFEXTNO:   return "SCORE_UNREFEXTNO";
1902     case DT_SCORE_HIPAGENO:     return "SCORE_HIPAGENO";
1903     default:
1904       return NULL;
1905     }
1906 }
1907 
1908 static const char *
1909 get_tic6x_dynamic_type (unsigned long type)
1910 {
1911   switch (type)
1912     {
1913     case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1914     case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1915     case DT_C6000_DSBT_BASE:   return "C6000_DSBT_BASE";
1916     case DT_C6000_DSBT_SIZE:   return "C6000_DSBT_SIZE";
1917     case DT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
1918     case DT_C6000_DSBT_INDEX:  return "C6000_DSBT_INDEX";
1919     default:
1920       return NULL;
1921     }
1922 }
1923 
1924 static const char *
1925 get_nios2_dynamic_type (unsigned long type)
1926 {
1927   switch (type)
1928     {
1929     case DT_NIOS2_GP: return "NIOS2_GP";
1930     default:
1931       return NULL;
1932     }
1933 }
1934 
1935 static const char *
1936 get_solaris_dynamic_type (unsigned long type)
1937 {
1938   switch (type)
1939     {
1940     case 0x6000000d: return "SUNW_AUXILIARY";
1941     case 0x6000000e: return "SUNW_RTLDINF";
1942     case 0x6000000f: return "SUNW_FILTER";
1943     case 0x60000010: return "SUNW_CAP";
1944     case 0x60000011: return "SUNW_SYMTAB";
1945     case 0x60000012: return "SUNW_SYMSZ";
1946     case 0x60000013: return "SUNW_SORTENT";
1947     case 0x60000014: return "SUNW_SYMSORT";
1948     case 0x60000015: return "SUNW_SYMSORTSZ";
1949     case 0x60000016: return "SUNW_TLSSORT";
1950     case 0x60000017: return "SUNW_TLSSORTSZ";
1951     case 0x60000018: return "SUNW_CAPINFO";
1952     case 0x60000019: return "SUNW_STRPAD";
1953     case 0x6000001a: return "SUNW_CAPCHAIN";
1954     case 0x6000001b: return "SUNW_LDMACH";
1955     case 0x6000001d: return "SUNW_CAPCHAINENT";
1956     case 0x6000001f: return "SUNW_CAPCHAINSZ";
1957     case 0x60000021: return "SUNW_PARENT";
1958     case 0x60000023: return "SUNW_ASLR";
1959     case 0x60000025: return "SUNW_RELAX";
1960     case 0x60000029: return "SUNW_NXHEAP";
1961     case 0x6000002b: return "SUNW_NXSTACK";
1962 
1963     case 0x70000001: return "SPARC_REGISTER";
1964     case 0x7ffffffd: return "AUXILIARY";
1965     case 0x7ffffffe: return "USED";
1966     case 0x7fffffff: return "FILTER";
1967 
1968     default: return NULL;
1969     }
1970 }
1971 
1972 static const char *
1973 get_dynamic_type (unsigned long type)
1974 {
1975   static char buff[64];
1976 
1977   switch (type)
1978     {
1979     case DT_NULL:	return "NULL";
1980     case DT_NEEDED:	return "NEEDED";
1981     case DT_PLTRELSZ:	return "PLTRELSZ";
1982     case DT_PLTGOT:	return "PLTGOT";
1983     case DT_HASH:	return "HASH";
1984     case DT_STRTAB:	return "STRTAB";
1985     case DT_SYMTAB:	return "SYMTAB";
1986     case DT_RELA:	return "RELA";
1987     case DT_RELASZ:	return "RELASZ";
1988     case DT_RELAENT:	return "RELAENT";
1989     case DT_STRSZ:	return "STRSZ";
1990     case DT_SYMENT:	return "SYMENT";
1991     case DT_INIT:	return "INIT";
1992     case DT_FINI:	return "FINI";
1993     case DT_SONAME:	return "SONAME";
1994     case DT_RPATH:	return "RPATH";
1995     case DT_SYMBOLIC:	return "SYMBOLIC";
1996     case DT_REL:	return "REL";
1997     case DT_RELSZ:	return "RELSZ";
1998     case DT_RELENT:	return "RELENT";
1999     case DT_PLTREL:	return "PLTREL";
2000     case DT_DEBUG:	return "DEBUG";
2001     case DT_TEXTREL:	return "TEXTREL";
2002     case DT_JMPREL:	return "JMPREL";
2003     case DT_BIND_NOW:   return "BIND_NOW";
2004     case DT_INIT_ARRAY: return "INIT_ARRAY";
2005     case DT_FINI_ARRAY: return "FINI_ARRAY";
2006     case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2007     case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
2008     case DT_RUNPATH:    return "RUNPATH";
2009     case DT_FLAGS:      return "FLAGS";
2010 
2011     case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2012     case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
2013 
2014     case DT_CHECKSUM:	return "CHECKSUM";
2015     case DT_PLTPADSZ:	return "PLTPADSZ";
2016     case DT_MOVEENT:	return "MOVEENT";
2017     case DT_MOVESZ:	return "MOVESZ";
2018     case DT_FEATURE:	return "FEATURE";
2019     case DT_POSFLAG_1:	return "POSFLAG_1";
2020     case DT_SYMINSZ:	return "SYMINSZ";
2021     case DT_SYMINENT:	return "SYMINENT"; /* aka VALRNGHI */
2022 
2023     case DT_ADDRRNGLO:  return "ADDRRNGLO";
2024     case DT_CONFIG:	return "CONFIG";
2025     case DT_DEPAUDIT:	return "DEPAUDIT";
2026     case DT_AUDIT:	return "AUDIT";
2027     case DT_PLTPAD:	return "PLTPAD";
2028     case DT_MOVETAB:	return "MOVETAB";
2029     case DT_SYMINFO:	return "SYMINFO"; /* aka ADDRRNGHI */
2030 
2031     case DT_VERSYM:	return "VERSYM";
2032 
2033     case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2034     case DT_TLSDESC_PLT: return "TLSDESC_PLT";
2035     case DT_RELACOUNT:	return "RELACOUNT";
2036     case DT_RELCOUNT:	return "RELCOUNT";
2037     case DT_FLAGS_1:	return "FLAGS_1";
2038     case DT_VERDEF:	return "VERDEF";
2039     case DT_VERDEFNUM:	return "VERDEFNUM";
2040     case DT_VERNEED:	return "VERNEED";
2041     case DT_VERNEEDNUM:	return "VERNEEDNUM";
2042 
2043     case DT_AUXILIARY:	return "AUXILIARY";
2044     case DT_USED:	return "USED";
2045     case DT_FILTER:	return "FILTER";
2046 
2047     case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2048     case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2049     case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2050     case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2051     case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
2052     case DT_GNU_HASH:	return "GNU_HASH";
2053 
2054     default:
2055       if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2056 	{
2057 	  const char * result;
2058 
2059 	  switch (elf_header.e_machine)
2060 	    {
2061 	    case EM_MIPS:
2062 	    case EM_MIPS_RS3_LE:
2063 	      result = get_mips_dynamic_type (type);
2064 	      break;
2065 	    case EM_SPARCV9:
2066 	      result = get_sparc64_dynamic_type (type);
2067 	      break;
2068 	    case EM_PPC:
2069 	      result = get_ppc_dynamic_type (type);
2070 	      break;
2071 	    case EM_PPC64:
2072 	      result = get_ppc64_dynamic_type (type);
2073 	      break;
2074 	    case EM_IA_64:
2075 	      result = get_ia64_dynamic_type (type);
2076 	      break;
2077 	    case EM_ALPHA:
2078 	      result = get_alpha_dynamic_type (type);
2079 	      break;
2080 	    case EM_SCORE:
2081 	      result = get_score_dynamic_type (type);
2082 	      break;
2083 	    case EM_TI_C6000:
2084 	      result = get_tic6x_dynamic_type (type);
2085 	      break;
2086 	    case EM_ALTERA_NIOS2:
2087 	      result = get_nios2_dynamic_type (type);
2088 	      break;
2089 	    default:
2090 	      if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2091 		result = get_solaris_dynamic_type (type);
2092 	      else
2093 		result = NULL;
2094 	      break;
2095 	    }
2096 
2097 	  if (result != NULL)
2098 	    return result;
2099 
2100 	  snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2101 	}
2102       else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2103 	       || (elf_header.e_machine == EM_PARISC
2104 		   && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2105 	{
2106 	  const char * result;
2107 
2108 	  switch (elf_header.e_machine)
2109 	    {
2110 	    case EM_PARISC:
2111 	      result = get_parisc_dynamic_type (type);
2112 	      break;
2113 	    case EM_IA_64:
2114 	      result = get_ia64_dynamic_type (type);
2115 	      break;
2116 	    default:
2117 	      if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2118 		result = get_solaris_dynamic_type (type);
2119 	      else
2120 		result = NULL;
2121 	      break;
2122 	    }
2123 
2124 	  if (result != NULL)
2125 	    return result;
2126 
2127 	  snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2128 		    type);
2129 	}
2130       else
2131 	snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2132 
2133       return buff;
2134     }
2135 }
2136 
2137 static char *
2138 get_file_type (unsigned e_type)
2139 {
2140   static char buff[32];
2141 
2142   switch (e_type)
2143     {
2144     case ET_NONE:	return _("NONE (None)");
2145     case ET_REL:	return _("REL (Relocatable file)");
2146     case ET_EXEC:	return _("EXEC (Executable file)");
2147     case ET_DYN:	return _("DYN (Shared object file)");
2148     case ET_CORE:	return _("CORE (Core file)");
2149 
2150     default:
2151       if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2152 	snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2153       else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2154 	snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2155       else
2156 	snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2157       return buff;
2158     }
2159 }
2160 
2161 static char *
2162 get_machine_name (unsigned e_machine)
2163 {
2164   static char buff[64]; /* XXX */
2165 
2166   switch (e_machine)
2167     {
2168     case EM_NONE:		return _("None");
2169     case EM_AARCH64:		return "AArch64";
2170     case EM_M32:		return "WE32100";
2171     case EM_SPARC:		return "Sparc";
2172     case EM_SPU:		return "SPU";
2173     case EM_386:		return "Intel 80386";
2174     case EM_68K:		return "MC68000";
2175     case EM_88K:		return "MC88000";
2176     case EM_IAMCU:		return "Intel MCU";
2177     case EM_860:		return "Intel 80860";
2178     case EM_MIPS:		return "MIPS R3000";
2179     case EM_S370:		return "IBM System/370";
2180     case EM_MIPS_RS3_LE:	return "MIPS R4000 big-endian";
2181     case EM_OLD_SPARCV9:	return "Sparc v9 (old)";
2182     case EM_PARISC:		return "HPPA";
2183     case EM_PPC_OLD:		return "Power PC (old)";
2184     case EM_SPARC32PLUS:	return "Sparc v8+" ;
2185     case EM_960:		return "Intel 90860";
2186     case EM_PPC:		return "PowerPC";
2187     case EM_PPC64:		return "PowerPC64";
2188     case EM_FR20:		return "Fujitsu FR20";
2189     case EM_FT32:		return "FTDI FT32";
2190     case EM_RH32:		return "TRW RH32";
2191     case EM_MCORE:		return "MCORE";
2192     case EM_ARM:		return "ARM";
2193     case EM_OLD_ALPHA:		return "Digital Alpha (old)";
2194     case EM_SH:			return "Renesas / SuperH SH";
2195     case EM_SPARCV9:		return "Sparc v9";
2196     case EM_TRICORE:		return "Siemens Tricore";
2197     case EM_ARC:		return "ARC";
2198     case EM_ARC_COMPACT:	return "ARCompact";
2199     case EM_ARC_COMPACT2:	return "ARCv2";
2200     case EM_H8_300:		return "Renesas H8/300";
2201     case EM_H8_300H:		return "Renesas H8/300H";
2202     case EM_H8S:		return "Renesas H8S";
2203     case EM_H8_500:		return "Renesas H8/500";
2204     case EM_IA_64:		return "Intel IA-64";
2205     case EM_MIPS_X:		return "Stanford MIPS-X";
2206     case EM_COLDFIRE:		return "Motorola Coldfire";
2207     case EM_ALPHA:		return "Alpha";
2208     case EM_CYGNUS_D10V:
2209     case EM_D10V:		return "d10v";
2210     case EM_CYGNUS_D30V:
2211     case EM_D30V:		return "d30v";
2212     case EM_CYGNUS_M32R:
2213     case EM_M32R:		return "Renesas M32R (formerly Mitsubishi M32r)";
2214     case EM_CYGNUS_V850:
2215     case EM_V800:		return "Renesas V850 (using RH850 ABI)";
2216     case EM_V850:		return "Renesas V850";
2217     case EM_CYGNUS_MN10300:
2218     case EM_MN10300:		return "mn10300";
2219     case EM_CYGNUS_MN10200:
2220     case EM_MN10200:		return "mn10200";
2221     case EM_MOXIE:		return "Moxie";
2222     case EM_CYGNUS_FR30:
2223     case EM_FR30:		return "Fujitsu FR30";
2224     case EM_CYGNUS_FRV:		return "Fujitsu FR-V";
2225     case EM_PJ_OLD:
2226     case EM_PJ:			return "picoJava";
2227     case EM_MMA:		return "Fujitsu Multimedia Accelerator";
2228     case EM_PCP:		return "Siemens PCP";
2229     case EM_NCPU:		return "Sony nCPU embedded RISC processor";
2230     case EM_NDR1:		return "Denso NDR1 microprocesspr";
2231     case EM_STARCORE:		return "Motorola Star*Core processor";
2232     case EM_ME16:		return "Toyota ME16 processor";
2233     case EM_ST100:		return "STMicroelectronics ST100 processor";
2234     case EM_TINYJ:		return "Advanced Logic Corp. TinyJ embedded processor";
2235     case EM_PDSP:		return "Sony DSP processor";
2236     case EM_PDP10:		return "Digital Equipment Corp. PDP-10";
2237     case EM_PDP11:		return "Digital Equipment Corp. PDP-11";
2238     case EM_FX66:		return "Siemens FX66 microcontroller";
2239     case EM_ST9PLUS:		return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2240     case EM_ST7:		return "STMicroelectronics ST7 8-bit microcontroller";
2241     case EM_68HC16:		return "Motorola MC68HC16 Microcontroller";
2242     case EM_68HC12:		return "Motorola MC68HC12 Microcontroller";
2243     case EM_68HC11:		return "Motorola MC68HC11 Microcontroller";
2244     case EM_68HC08:		return "Motorola MC68HC08 Microcontroller";
2245     case EM_68HC05:		return "Motorola MC68HC05 Microcontroller";
2246     case EM_SVX:		return "Silicon Graphics SVx";
2247     case EM_ST19:		return "STMicroelectronics ST19 8-bit microcontroller";
2248     case EM_VAX:		return "Digital VAX";
2249     case EM_VISIUM:		return "CDS VISIUMcore processor";
2250     case EM_AVR_OLD:
2251     case EM_AVR:		return "Atmel AVR 8-bit microcontroller";
2252     case EM_CRIS:		return "Axis Communications 32-bit embedded processor";
2253     case EM_JAVELIN:		return "Infineon Technologies 32-bit embedded cpu";
2254     case EM_FIREPATH:		return "Element 14 64-bit DSP processor";
2255     case EM_ZSP:		return "LSI Logic's 16-bit DSP processor";
2256     case EM_MMIX:		return "Donald Knuth's educational 64-bit processor";
2257     case EM_HUANY:		return "Harvard Universitys's machine-independent object format";
2258     case EM_PRISM:		return "Vitesse Prism";
2259     case EM_X86_64:		return "Advanced Micro Devices X86-64";
2260     case EM_L1OM:		return "Intel L1OM";
2261     case EM_K1OM:		return "Intel K1OM";
2262     case EM_S390_OLD:
2263     case EM_S390:		return "IBM S/390";
2264     case EM_SCORE:		return "SUNPLUS S+Core";
2265     case EM_XSTORMY16:		return "Sanyo XStormy16 CPU core";
2266     case EM_OR1K:		return "OpenRISC 1000";
2267     case EM_CRX:		return "National Semiconductor CRX microprocessor";
2268     case EM_ADAPTEVA_EPIPHANY:	return "Adapteva EPIPHANY";
2269     case EM_DLX:		return "OpenDLX";
2270     case EM_IP2K_OLD:
2271     case EM_IP2K:		return "Ubicom IP2xxx 8-bit microcontrollers";
2272     case EM_IQ2000:       	return "Vitesse IQ2000";
2273     case EM_XTENSA_OLD:
2274     case EM_XTENSA:		return "Tensilica Xtensa Processor";
2275     case EM_VIDEOCORE:		return "Alphamosaic VideoCore processor";
2276     case EM_TMM_GPP:		return "Thompson Multimedia General Purpose Processor";
2277     case EM_NS32K:		return "National Semiconductor 32000 series";
2278     case EM_TPC:		return "Tenor Network TPC processor";
2279     case EM_ST200:		return "STMicroelectronics ST200 microcontroller";
2280     case EM_MAX:		return "MAX Processor";
2281     case EM_CR:			return "National Semiconductor CompactRISC";
2282     case EM_F2MC16:		return "Fujitsu F2MC16";
2283     case EM_MSP430:		return "Texas Instruments msp430 microcontroller";
2284     case EM_LATTICEMICO32:	return "Lattice Mico32";
2285     case EM_M32C_OLD:
2286     case EM_M32C:	        return "Renesas M32c";
2287     case EM_MT:                 return "Morpho Techologies MT processor";
2288     case EM_BLACKFIN:		return "Analog Devices Blackfin";
2289     case EM_SE_C33:		return "S1C33 Family of Seiko Epson processors";
2290     case EM_SEP:		return "Sharp embedded microprocessor";
2291     case EM_ARCA:		return "Arca RISC microprocessor";
2292     case EM_UNICORE:		return "Unicore";
2293     case EM_EXCESS:		return "eXcess 16/32/64-bit configurable embedded CPU";
2294     case EM_DXP:		return "Icera Semiconductor Inc. Deep Execution Processor";
2295     case EM_NIOS32:		return "Altera Nios";
2296     case EM_ALTERA_NIOS2:	return "Altera Nios II";
2297     case EM_C166:
2298     case EM_XC16X:		return "Infineon Technologies xc16x";
2299     case EM_M16C:		return "Renesas M16C series microprocessors";
2300     case EM_DSPIC30F:		return "Microchip Technology dsPIC30F Digital Signal Controller";
2301     case EM_CE:			return "Freescale Communication Engine RISC core";
2302     case EM_TSK3000:		return "Altium TSK3000 core";
2303     case EM_RS08:		return "Freescale RS08 embedded processor";
2304     case EM_ECOG2:		return "Cyan Technology eCOG2 microprocessor";
2305     case EM_DSP24:		return "New Japan Radio (NJR) 24-bit DSP Processor";
2306     case EM_VIDEOCORE3:		return "Broadcom VideoCore III processor";
2307     case EM_SE_C17:		return "Seiko Epson C17 family";
2308     case EM_TI_C6000:		return "Texas Instruments TMS320C6000 DSP family";
2309     case EM_TI_C2000:		return "Texas Instruments TMS320C2000 DSP family";
2310     case EM_TI_C5500:		return "Texas Instruments TMS320C55x DSP family";
2311     case EM_MMDSP_PLUS:		return "STMicroelectronics 64bit VLIW Data Signal Processor";
2312     case EM_CYPRESS_M8C:	return "Cypress M8C microprocessor";
2313     case EM_R32C:		return "Renesas R32C series microprocessors";
2314     case EM_TRIMEDIA:		return "NXP Semiconductors TriMedia architecture family";
2315     case EM_QDSP6:		return "QUALCOMM DSP6 Processor";
2316     case EM_8051:		return "Intel 8051 and variants";
2317     case EM_STXP7X:		return "STMicroelectronics STxP7x family";
2318     case EM_NDS32:		return "Andes Technology compact code size embedded RISC processor family";
2319     case EM_ECOG1X:		return "Cyan Technology eCOG1X family";
2320     case EM_MAXQ30:		return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2321     case EM_XIMO16:		return "New Japan Radio (NJR) 16-bit DSP Processor";
2322     case EM_MANIK:		return "M2000 Reconfigurable RISC Microprocessor";
2323     case EM_CRAYNV2:		return "Cray Inc. NV2 vector architecture";
2324     case EM_CYGNUS_MEP:         return "Toshiba MeP Media Engine";
2325     case EM_CR16:
2326     case EM_MICROBLAZE:
2327     case EM_MICROBLAZE_OLD:	return "Xilinx MicroBlaze";
2328     case EM_RL78:		return "Renesas RL78";
2329     case EM_RX:			return "Renesas RX";
2330     case EM_METAG:		return "Imagination Technologies Meta processor architecture";
2331     case EM_MCST_ELBRUS:	return "MCST Elbrus general purpose hardware architecture";
2332     case EM_ECOG16:		return "Cyan Technology eCOG16 family";
2333     case EM_ETPU:		return "Freescale Extended Time Processing Unit";
2334     case EM_SLE9X:		return "Infineon Technologies SLE9X core";
2335     case EM_AVR32:		return "Atmel Corporation 32-bit microprocessor family";
2336     case EM_STM8:		return "STMicroeletronics STM8 8-bit microcontroller";
2337     case EM_TILE64:		return "Tilera TILE64 multicore architecture family";
2338     case EM_TILEPRO:		return "Tilera TILEPro multicore architecture family";
2339     case EM_TILEGX:		return "Tilera TILE-Gx multicore architecture family";
2340     case EM_CUDA:		return "NVIDIA CUDA architecture";
2341     case EM_XGATE:		return "Motorola XGATE embedded processor";
2342     default:
2343       snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2344       return buff;
2345     }
2346 }
2347 
2348 static void
2349 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2350 {
2351   /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2.  Some
2352      other compilers don't a specific architecture type in the e_flags, and
2353      instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2354      architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2355      architectures.
2356 
2357      Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2358      but also sets a specific architecture type in the e_flags field.
2359 
2360      However, when decoding the flags we don't worry if we see an
2361      unexpected pairing, for example EM_ARC_COMPACT machine type, with
2362      ARCEM architecture type.  */
2363 
2364   switch (e_flags & EF_ARC_MACH_MSK)
2365     {
2366       /* We only expect these to occur for EM_ARC_COMPACT2.  */
2367     case EF_ARC_CPU_ARCV2EM:
2368       strcat (buf, ", ARC EM");
2369       break;
2370     case EF_ARC_CPU_ARCV2HS:
2371       strcat (buf, ", ARC HS");
2372       break;
2373 
2374       /* We only expect these to occur for EM_ARC_COMPACT.  */
2375     case E_ARC_MACH_ARC600:
2376       strcat (buf, ", ARC600");
2377       break;
2378     case E_ARC_MACH_ARC601:
2379       strcat (buf, ", ARC601");
2380       break;
2381     case E_ARC_MACH_ARC700:
2382       strcat (buf, ", ARC700");
2383       break;
2384 
2385       /* The only times we should end up here are (a) A corrupt ELF, (b) A
2386          new ELF with new architecture being read by an old version of
2387          readelf, or (c) An ELF built with non-GNU compiler that does not
2388          set the architecture in the e_flags.  */
2389     default:
2390       if (e_machine == EM_ARC_COMPACT)
2391         strcat (buf, ", Unknown ARCompact");
2392       else
2393         strcat (buf, ", Unknown ARC");
2394       break;
2395     }
2396 
2397   switch (e_flags & EF_ARC_OSABI_MSK)
2398     {
2399     case E_ARC_OSABI_ORIG:
2400       strcat (buf, ", (ABI:legacy)");
2401       break;
2402     case E_ARC_OSABI_V2:
2403       strcat (buf, ", (ABI:v2)");
2404       break;
2405       /* Only upstream 3.9+ kernels will support ARCv2 ISA.  */
2406     case E_ARC_OSABI_V3:
2407       strcat (buf, ", v3 no-legacy-syscalls ABI");
2408       break;
2409     default:
2410       strcat (buf, ", unrecognised ARC OSABI flag");
2411       break;
2412     }
2413 }
2414 
2415 static void
2416 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2417 {
2418   unsigned eabi;
2419   int unknown = 0;
2420 
2421   eabi = EF_ARM_EABI_VERSION (e_flags);
2422   e_flags &= ~ EF_ARM_EABIMASK;
2423 
2424   /* Handle "generic" ARM flags.  */
2425   if (e_flags & EF_ARM_RELEXEC)
2426     {
2427       strcat (buf, ", relocatable executable");
2428       e_flags &= ~ EF_ARM_RELEXEC;
2429     }
2430 
2431   /* Now handle EABI specific flags.  */
2432   switch (eabi)
2433     {
2434     default:
2435       strcat (buf, ", <unrecognized EABI>");
2436       if (e_flags)
2437 	unknown = 1;
2438       break;
2439 
2440     case EF_ARM_EABI_VER1:
2441       strcat (buf, ", Version1 EABI");
2442       while (e_flags)
2443 	{
2444 	  unsigned flag;
2445 
2446 	  /* Process flags one bit at a time.  */
2447 	  flag = e_flags & - e_flags;
2448 	  e_flags &= ~ flag;
2449 
2450 	  switch (flag)
2451 	    {
2452 	    case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2453 	      strcat (buf, ", sorted symbol tables");
2454 	      break;
2455 
2456 	    default:
2457 	      unknown = 1;
2458 	      break;
2459 	    }
2460 	}
2461       break;
2462 
2463     case EF_ARM_EABI_VER2:
2464       strcat (buf, ", Version2 EABI");
2465       while (e_flags)
2466 	{
2467 	  unsigned flag;
2468 
2469 	  /* Process flags one bit at a time.  */
2470 	  flag = e_flags & - e_flags;
2471 	  e_flags &= ~ flag;
2472 
2473 	  switch (flag)
2474 	    {
2475 	    case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2476 	      strcat (buf, ", sorted symbol tables");
2477 	      break;
2478 
2479 	    case EF_ARM_DYNSYMSUSESEGIDX:
2480 	      strcat (buf, ", dynamic symbols use segment index");
2481 	      break;
2482 
2483 	    case EF_ARM_MAPSYMSFIRST:
2484 	      strcat (buf, ", mapping symbols precede others");
2485 	      break;
2486 
2487 	    default:
2488 	      unknown = 1;
2489 	      break;
2490 	    }
2491 	}
2492       break;
2493 
2494     case EF_ARM_EABI_VER3:
2495       strcat (buf, ", Version3 EABI");
2496       break;
2497 
2498     case EF_ARM_EABI_VER4:
2499       strcat (buf, ", Version4 EABI");
2500       while (e_flags)
2501 	{
2502 	  unsigned flag;
2503 
2504 	  /* Process flags one bit at a time.  */
2505 	  flag = e_flags & - e_flags;
2506 	  e_flags &= ~ flag;
2507 
2508 	  switch (flag)
2509 	    {
2510 	    case EF_ARM_BE8:
2511 	      strcat (buf, ", BE8");
2512 	      break;
2513 
2514 	    case EF_ARM_LE8:
2515 	      strcat (buf, ", LE8");
2516 	      break;
2517 
2518 	    default:
2519 	      unknown = 1;
2520 	      break;
2521 	    }
2522       break;
2523 	}
2524       break;
2525 
2526     case EF_ARM_EABI_VER5:
2527       strcat (buf, ", Version5 EABI");
2528       while (e_flags)
2529 	{
2530 	  unsigned flag;
2531 
2532 	  /* Process flags one bit at a time.  */
2533 	  flag = e_flags & - e_flags;
2534 	  e_flags &= ~ flag;
2535 
2536 	  switch (flag)
2537 	    {
2538 	    case EF_ARM_BE8:
2539 	      strcat (buf, ", BE8");
2540 	      break;
2541 
2542 	    case EF_ARM_LE8:
2543 	      strcat (buf, ", LE8");
2544 	      break;
2545 
2546 	    case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT.  */
2547 	      strcat (buf, ", soft-float ABI");
2548 	      break;
2549 
2550 	    case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT.  */
2551 	      strcat (buf, ", hard-float ABI");
2552 	      break;
2553 
2554 	    default:
2555 	      unknown = 1;
2556 	      break;
2557 	    }
2558 	}
2559       break;
2560 
2561     case EF_ARM_EABI_UNKNOWN:
2562       strcat (buf, ", GNU EABI");
2563       while (e_flags)
2564 	{
2565 	  unsigned flag;
2566 
2567 	  /* Process flags one bit at a time.  */
2568 	  flag = e_flags & - e_flags;
2569 	  e_flags &= ~ flag;
2570 
2571 	  switch (flag)
2572 	    {
2573 	    case EF_ARM_INTERWORK:
2574 	      strcat (buf, ", interworking enabled");
2575 	      break;
2576 
2577 	    case EF_ARM_APCS_26:
2578 	      strcat (buf, ", uses APCS/26");
2579 	      break;
2580 
2581 	    case EF_ARM_APCS_FLOAT:
2582 	      strcat (buf, ", uses APCS/float");
2583 	      break;
2584 
2585 	    case EF_ARM_PIC:
2586 	      strcat (buf, ", position independent");
2587 	      break;
2588 
2589 	    case EF_ARM_ALIGN8:
2590 	      strcat (buf, ", 8 bit structure alignment");
2591 	      break;
2592 
2593 	    case EF_ARM_NEW_ABI:
2594 	      strcat (buf, ", uses new ABI");
2595 	      break;
2596 
2597 	    case EF_ARM_OLD_ABI:
2598 	      strcat (buf, ", uses old ABI");
2599 	      break;
2600 
2601 	    case EF_ARM_SOFT_FLOAT:
2602 	      strcat (buf, ", software FP");
2603 	      break;
2604 
2605 	    case EF_ARM_VFP_FLOAT:
2606 	      strcat (buf, ", VFP");
2607 	      break;
2608 
2609 	    case EF_ARM_MAVERICK_FLOAT:
2610 	      strcat (buf, ", Maverick FP");
2611 	      break;
2612 
2613 	    default:
2614 	      unknown = 1;
2615 	      break;
2616 	    }
2617 	}
2618     }
2619 
2620   if (unknown)
2621     strcat (buf,_(", <unknown>"));
2622 }
2623 
2624 static void
2625 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2626 {
2627   --size; /* Leave space for null terminator.  */
2628 
2629   switch (e_flags & EF_AVR_MACH)
2630     {
2631     case E_AVR_MACH_AVR1:
2632       strncat (buf, ", avr:1", size);
2633       break;
2634     case E_AVR_MACH_AVR2:
2635       strncat (buf, ", avr:2", size);
2636       break;
2637     case E_AVR_MACH_AVR25:
2638       strncat (buf, ", avr:25", size);
2639       break;
2640     case E_AVR_MACH_AVR3:
2641       strncat (buf, ", avr:3", size);
2642       break;
2643     case E_AVR_MACH_AVR31:
2644       strncat (buf, ", avr:31", size);
2645       break;
2646     case E_AVR_MACH_AVR35:
2647       strncat (buf, ", avr:35", size);
2648       break;
2649     case E_AVR_MACH_AVR4:
2650       strncat (buf, ", avr:4", size);
2651       break;
2652     case E_AVR_MACH_AVR5:
2653       strncat (buf, ", avr:5", size);
2654       break;
2655     case E_AVR_MACH_AVR51:
2656       strncat (buf, ", avr:51", size);
2657       break;
2658     case E_AVR_MACH_AVR6:
2659       strncat (buf, ", avr:6", size);
2660       break;
2661     case E_AVR_MACH_AVRTINY:
2662       strncat (buf, ", avr:100", size);
2663       break;
2664     case E_AVR_MACH_XMEGA1:
2665       strncat (buf, ", avr:101", size);
2666       break;
2667     case E_AVR_MACH_XMEGA2:
2668       strncat (buf, ", avr:102", size);
2669       break;
2670     case E_AVR_MACH_XMEGA3:
2671       strncat (buf, ", avr:103", size);
2672       break;
2673     case E_AVR_MACH_XMEGA4:
2674       strncat (buf, ", avr:104", size);
2675       break;
2676     case E_AVR_MACH_XMEGA5:
2677       strncat (buf, ", avr:105", size);
2678       break;
2679     case E_AVR_MACH_XMEGA6:
2680       strncat (buf, ", avr:106", size);
2681       break;
2682     case E_AVR_MACH_XMEGA7:
2683       strncat (buf, ", avr:107", size);
2684       break;
2685     default:
2686       strncat (buf, ", avr:<unknown>", size);
2687       break;
2688     }
2689 
2690   size -= strlen (buf);
2691   if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2692     strncat (buf, ", link-relax", size);
2693 }
2694 
2695 static void
2696 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2697 {
2698   unsigned abi;
2699   unsigned arch;
2700   unsigned config;
2701   unsigned version;
2702   int has_fpu = 0;
2703   int r = 0;
2704 
2705   static const char *ABI_STRINGS[] =
2706   {
2707     "ABI v0", /* use r5 as return register; only used in N1213HC */
2708     "ABI v1", /* use r0 as return register */
2709     "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2710     "ABI v2fp", /* for FPU */
2711     "AABI",
2712     "ABI2 FP+"
2713   };
2714   static const char *VER_STRINGS[] =
2715   {
2716     "Andes ELF V1.3 or older",
2717     "Andes ELF V1.3.1",
2718     "Andes ELF V1.4"
2719   };
2720   static const char *ARCH_STRINGS[] =
2721   {
2722     "",
2723     "Andes Star v1.0",
2724     "Andes Star v2.0",
2725     "Andes Star v3.0",
2726     "Andes Star v3.0m"
2727   };
2728 
2729   abi = EF_NDS_ABI & e_flags;
2730   arch = EF_NDS_ARCH & e_flags;
2731   config = EF_NDS_INST & e_flags;
2732   version = EF_NDS32_ELF_VERSION & e_flags;
2733 
2734   memset (buf, 0, size);
2735 
2736   switch (abi)
2737     {
2738     case E_NDS_ABI_V0:
2739     case E_NDS_ABI_V1:
2740     case E_NDS_ABI_V2:
2741     case E_NDS_ABI_V2FP:
2742     case E_NDS_ABI_AABI:
2743     case E_NDS_ABI_V2FP_PLUS:
2744       /* In case there are holes in the array.  */
2745       r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2746       break;
2747 
2748     default:
2749       r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2750       break;
2751     }
2752 
2753   switch (version)
2754     {
2755     case E_NDS32_ELF_VER_1_2:
2756     case E_NDS32_ELF_VER_1_3:
2757     case E_NDS32_ELF_VER_1_4:
2758       r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2759       break;
2760 
2761     default:
2762       r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2763       break;
2764     }
2765 
2766   if (E_NDS_ABI_V0 == abi)
2767     {
2768       /* OLD ABI; only used in N1213HC, has performance extension 1.  */
2769       r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2770       if (arch == E_NDS_ARCH_STAR_V1_0)
2771 	r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2772       return;
2773     }
2774 
2775   switch (arch)
2776     {
2777     case E_NDS_ARCH_STAR_V1_0:
2778     case E_NDS_ARCH_STAR_V2_0:
2779     case E_NDS_ARCH_STAR_V3_0:
2780     case E_NDS_ARCH_STAR_V3_M:
2781       r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2782       break;
2783 
2784     default:
2785       r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2786       /* ARCH version determines how the e_flags are interpreted.
2787 	 If it is unknown, we cannot proceed.  */
2788       return;
2789     }
2790 
2791   /* Newer ABI; Now handle architecture specific flags.  */
2792   if (arch == E_NDS_ARCH_STAR_V1_0)
2793     {
2794       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2795 	r += snprintf (buf + r, size -r, ", MFUSR_PC");
2796 
2797       if (!(config & E_NDS32_HAS_NO_MAC_INST))
2798 	r += snprintf (buf + r, size -r, ", MAC");
2799 
2800       if (config & E_NDS32_HAS_DIV_INST)
2801 	r += snprintf (buf + r, size -r, ", DIV");
2802 
2803       if (config & E_NDS32_HAS_16BIT_INST)
2804 	r += snprintf (buf + r, size -r, ", 16b");
2805     }
2806   else
2807     {
2808       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2809 	{
2810 	  if (version <= E_NDS32_ELF_VER_1_3)
2811 	    r += snprintf (buf + r, size -r, ", [B8]");
2812 	  else
2813 	    r += snprintf (buf + r, size -r, ", EX9");
2814 	}
2815 
2816       if (config & E_NDS32_HAS_MAC_DX_INST)
2817 	r += snprintf (buf + r, size -r, ", MAC_DX");
2818 
2819       if (config & E_NDS32_HAS_DIV_DX_INST)
2820 	r += snprintf (buf + r, size -r, ", DIV_DX");
2821 
2822       if (config & E_NDS32_HAS_16BIT_INST)
2823 	{
2824 	  if (version <= E_NDS32_ELF_VER_1_3)
2825 	    r += snprintf (buf + r, size -r, ", 16b");
2826 	  else
2827 	    r += snprintf (buf + r, size -r, ", IFC");
2828 	}
2829     }
2830 
2831   if (config & E_NDS32_HAS_EXT_INST)
2832     r += snprintf (buf + r, size -r, ", PERF1");
2833 
2834   if (config & E_NDS32_HAS_EXT2_INST)
2835     r += snprintf (buf + r, size -r, ", PERF2");
2836 
2837   if (config & E_NDS32_HAS_FPU_INST)
2838     {
2839       has_fpu = 1;
2840       r += snprintf (buf + r, size -r, ", FPU_SP");
2841     }
2842 
2843   if (config & E_NDS32_HAS_FPU_DP_INST)
2844     {
2845       has_fpu = 1;
2846       r += snprintf (buf + r, size -r, ", FPU_DP");
2847     }
2848 
2849   if (config & E_NDS32_HAS_FPU_MAC_INST)
2850     {
2851       has_fpu = 1;
2852       r += snprintf (buf + r, size -r, ", FPU_MAC");
2853     }
2854 
2855   if (has_fpu)
2856     {
2857       switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2858 	{
2859 	case E_NDS32_FPU_REG_8SP_4DP:
2860 	  r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2861 	  break;
2862 	case E_NDS32_FPU_REG_16SP_8DP:
2863 	  r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2864 	  break;
2865 	case E_NDS32_FPU_REG_32SP_16DP:
2866 	  r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2867 	  break;
2868 	case E_NDS32_FPU_REG_32SP_32DP:
2869 	  r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2870 	  break;
2871 	}
2872     }
2873 
2874   if (config & E_NDS32_HAS_AUDIO_INST)
2875     r += snprintf (buf + r, size -r, ", AUDIO");
2876 
2877   if (config & E_NDS32_HAS_STRING_INST)
2878     r += snprintf (buf + r, size -r, ", STR");
2879 
2880   if (config & E_NDS32_HAS_REDUCED_REGS)
2881     r += snprintf (buf + r, size -r, ", 16REG");
2882 
2883   if (config & E_NDS32_HAS_VIDEO_INST)
2884     {
2885       if (version <= E_NDS32_ELF_VER_1_3)
2886 	r += snprintf (buf + r, size -r, ", VIDEO");
2887       else
2888 	r += snprintf (buf + r, size -r, ", SATURATION");
2889     }
2890 
2891   if (config & E_NDS32_HAS_ENCRIPT_INST)
2892     r += snprintf (buf + r, size -r, ", ENCRP");
2893 
2894   if (config & E_NDS32_HAS_L2C_INST)
2895     r += snprintf (buf + r, size -r, ", L2C");
2896 }
2897 
2898 static char *
2899 get_machine_flags (unsigned e_flags, unsigned e_machine)
2900 {
2901   static char buf[1024];
2902 
2903   buf[0] = '\0';
2904 
2905   if (e_flags)
2906     {
2907       switch (e_machine)
2908 	{
2909 	default:
2910 	  break;
2911 
2912 	case EM_ARC_COMPACT2:
2913 	case EM_ARC_COMPACT:
2914           decode_ARC_machine_flags (e_flags, e_machine, buf);
2915           break;
2916 
2917 	case EM_ARM:
2918 	  decode_ARM_machine_flags (e_flags, buf);
2919 	  break;
2920 
2921         case EM_AVR:
2922           decode_AVR_machine_flags (e_flags, buf, sizeof buf);
2923           break;
2924 
2925 	case EM_BLACKFIN:
2926 	  if (e_flags & EF_BFIN_PIC)
2927 	    strcat (buf, ", PIC");
2928 
2929 	  if (e_flags & EF_BFIN_FDPIC)
2930 	    strcat (buf, ", FDPIC");
2931 
2932 	  if (e_flags & EF_BFIN_CODE_IN_L1)
2933 	    strcat (buf, ", code in L1");
2934 
2935 	  if (e_flags & EF_BFIN_DATA_IN_L1)
2936 	    strcat (buf, ", data in L1");
2937 
2938 	  break;
2939 
2940 	case EM_CYGNUS_FRV:
2941 	  switch (e_flags & EF_FRV_CPU_MASK)
2942 	    {
2943 	    case EF_FRV_CPU_GENERIC:
2944 	      break;
2945 
2946 	    default:
2947 	      strcat (buf, ", fr???");
2948 	      break;
2949 
2950 	    case EF_FRV_CPU_FR300:
2951 	      strcat (buf, ", fr300");
2952 	      break;
2953 
2954 	    case EF_FRV_CPU_FR400:
2955 	      strcat (buf, ", fr400");
2956 	      break;
2957 	    case EF_FRV_CPU_FR405:
2958 	      strcat (buf, ", fr405");
2959 	      break;
2960 
2961 	    case EF_FRV_CPU_FR450:
2962 	      strcat (buf, ", fr450");
2963 	      break;
2964 
2965 	    case EF_FRV_CPU_FR500:
2966 	      strcat (buf, ", fr500");
2967 	      break;
2968 	    case EF_FRV_CPU_FR550:
2969 	      strcat (buf, ", fr550");
2970 	      break;
2971 
2972 	    case EF_FRV_CPU_SIMPLE:
2973 	      strcat (buf, ", simple");
2974 	      break;
2975 	    case EF_FRV_CPU_TOMCAT:
2976 	      strcat (buf, ", tomcat");
2977 	      break;
2978 	    }
2979 	  break;
2980 
2981 	case EM_68K:
2982 	  if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2983 	    strcat (buf, ", m68000");
2984 	  else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2985 	    strcat (buf, ", cpu32");
2986 	  else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2987 	    strcat (buf, ", fido_a");
2988 	  else
2989 	    {
2990 	      char const * isa = _("unknown");
2991 	      char const * mac = _("unknown mac");
2992 	      char const * additional = NULL;
2993 
2994 	      switch (e_flags & EF_M68K_CF_ISA_MASK)
2995 		{
2996 		case EF_M68K_CF_ISA_A_NODIV:
2997 		  isa = "A";
2998 		  additional = ", nodiv";
2999 		  break;
3000 		case EF_M68K_CF_ISA_A:
3001 		  isa = "A";
3002 		  break;
3003 		case EF_M68K_CF_ISA_A_PLUS:
3004 		  isa = "A+";
3005 		  break;
3006 		case EF_M68K_CF_ISA_B_NOUSP:
3007 		  isa = "B";
3008 		  additional = ", nousp";
3009 		  break;
3010 		case EF_M68K_CF_ISA_B:
3011 		  isa = "B";
3012 		  break;
3013 		case EF_M68K_CF_ISA_C:
3014 		  isa = "C";
3015 		  break;
3016 		case EF_M68K_CF_ISA_C_NODIV:
3017 		  isa = "C";
3018 		  additional = ", nodiv";
3019 		  break;
3020 		}
3021 	      strcat (buf, ", cf, isa ");
3022 	      strcat (buf, isa);
3023 	      if (additional)
3024 		strcat (buf, additional);
3025 	      if (e_flags & EF_M68K_CF_FLOAT)
3026 		strcat (buf, ", float");
3027 	      switch (e_flags & EF_M68K_CF_MAC_MASK)
3028 		{
3029 		case 0:
3030 		  mac = NULL;
3031 		  break;
3032 		case EF_M68K_CF_MAC:
3033 		  mac = "mac";
3034 		  break;
3035 		case EF_M68K_CF_EMAC:
3036 		  mac = "emac";
3037 		  break;
3038 		case EF_M68K_CF_EMAC_B:
3039 		  mac = "emac_b";
3040 		  break;
3041 		}
3042 	      if (mac)
3043 		{
3044 		  strcat (buf, ", ");
3045 		  strcat (buf, mac);
3046 		}
3047 	    }
3048 	  break;
3049 
3050 	case EM_CYGNUS_MEP:
3051 	  switch (e_flags & EF_MEP_CPU_MASK)
3052 	    {
3053 	    case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3054 	    case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3055 	    case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3056 	    case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3057 	    case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3058 	    case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3059 	    default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3060 	    }
3061 
3062 	  switch (e_flags & EF_MEP_COP_MASK)
3063 	    {
3064 	    case EF_MEP_COP_NONE: break;
3065 	    case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3066 	    case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3067 	    case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3068 	    case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3069 	    default: strcat (buf, _("<unknown MeP copro type>")); break;
3070 	    }
3071 
3072 	  if (e_flags & EF_MEP_LIBRARY)
3073 	    strcat (buf, ", Built for Library");
3074 
3075 	  if (e_flags & EF_MEP_INDEX_MASK)
3076 	    sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3077 		     e_flags & EF_MEP_INDEX_MASK);
3078 
3079 	  if (e_flags & ~ EF_MEP_ALL_FLAGS)
3080 	    sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3081 		     e_flags & ~ EF_MEP_ALL_FLAGS);
3082 	  break;
3083 
3084 	case EM_PPC:
3085 	  if (e_flags & EF_PPC_EMB)
3086 	    strcat (buf, ", emb");
3087 
3088 	  if (e_flags & EF_PPC_RELOCATABLE)
3089 	    strcat (buf, _(", relocatable"));
3090 
3091 	  if (e_flags & EF_PPC_RELOCATABLE_LIB)
3092 	    strcat (buf, _(", relocatable-lib"));
3093 	  break;
3094 
3095 	case EM_PPC64:
3096 	  if (e_flags & EF_PPC64_ABI)
3097 	    {
3098 	      char abi[] = ", abiv0";
3099 
3100 	      abi[6] += e_flags & EF_PPC64_ABI;
3101 	      strcat (buf, abi);
3102 	    }
3103 	  break;
3104 
3105 	case EM_V800:
3106 	  if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3107 	    strcat (buf, ", RH850 ABI");
3108 
3109 	  if (e_flags & EF_V800_850E3)
3110 	    strcat (buf, ", V3 architecture");
3111 
3112 	  if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3113 	    strcat (buf, ", FPU not used");
3114 
3115 	  if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3116 	    strcat (buf, ", regmode: COMMON");
3117 
3118 	  if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3119 	    strcat (buf, ", r4 not used");
3120 
3121 	  if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3122 	    strcat (buf, ", r30 not used");
3123 
3124 	  if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3125 	    strcat (buf, ", r5 not used");
3126 
3127 	  if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3128 	    strcat (buf, ", r2 not used");
3129 
3130 	  for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3131 	    {
3132 	      switch (e_flags & - e_flags)
3133 		{
3134 		case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3135 		case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3136 		case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3137 		case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3138 		case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3139 		case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3140 		case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3141 		case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3142 		case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3143 		case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3144 		case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3145 		case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3146 		default: break;
3147 		}
3148 	    }
3149 	  break;
3150 
3151 	case EM_V850:
3152 	case EM_CYGNUS_V850:
3153 	  switch (e_flags & EF_V850_ARCH)
3154 	    {
3155 	    case E_V850E3V5_ARCH:
3156 	      strcat (buf, ", v850e3v5");
3157 	      break;
3158 	    case E_V850E2V3_ARCH:
3159 	      strcat (buf, ", v850e2v3");
3160 	      break;
3161 	    case E_V850E2_ARCH:
3162 	      strcat (buf, ", v850e2");
3163 	      break;
3164             case E_V850E1_ARCH:
3165               strcat (buf, ", v850e1");
3166 	      break;
3167 	    case E_V850E_ARCH:
3168 	      strcat (buf, ", v850e");
3169 	      break;
3170 	    case E_V850_ARCH:
3171 	      strcat (buf, ", v850");
3172 	      break;
3173 	    default:
3174 	      strcat (buf, _(", unknown v850 architecture variant"));
3175 	      break;
3176 	    }
3177 	  break;
3178 
3179 	case EM_M32R:
3180 	case EM_CYGNUS_M32R:
3181 	  if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3182 	    strcat (buf, ", m32r");
3183 	  break;
3184 
3185 	case EM_MIPS:
3186 	case EM_MIPS_RS3_LE:
3187 	  if (e_flags & EF_MIPS_NOREORDER)
3188 	    strcat (buf, ", noreorder");
3189 
3190 	  if (e_flags & EF_MIPS_PIC)
3191 	    strcat (buf, ", pic");
3192 
3193 	  if (e_flags & EF_MIPS_CPIC)
3194 	    strcat (buf, ", cpic");
3195 
3196 	  if (e_flags & EF_MIPS_UCODE)
3197 	    strcat (buf, ", ugen_reserved");
3198 
3199 	  if (e_flags & EF_MIPS_ABI2)
3200 	    strcat (buf, ", abi2");
3201 
3202 	  if (e_flags & EF_MIPS_OPTIONS_FIRST)
3203 	    strcat (buf, ", odk first");
3204 
3205 	  if (e_flags & EF_MIPS_32BITMODE)
3206 	    strcat (buf, ", 32bitmode");
3207 
3208 	  if (e_flags & EF_MIPS_NAN2008)
3209 	    strcat (buf, ", nan2008");
3210 
3211 	  if (e_flags & EF_MIPS_FP64)
3212 	    strcat (buf, ", fp64");
3213 
3214 	  switch ((e_flags & EF_MIPS_MACH))
3215 	    {
3216 	    case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3217 	    case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3218 	    case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3219 	    case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3220 	    case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3221 	    case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3222 	    case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3223 	    case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3224 	    case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
3225 	    case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3226   	    case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3227   	    case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3228   	    case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
3229 	    case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3230 	    case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3231 	    case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3232 	    case E_MIPS_MACH_XLR:  strcat (buf, ", xlr"); break;
3233 	    case 0:
3234 	    /* We simply ignore the field in this case to avoid confusion:
3235 	       MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3236 	       extension.  */
3237 	      break;
3238 	    default: strcat (buf, _(", unknown CPU")); break;
3239 	    }
3240 
3241 	  switch ((e_flags & EF_MIPS_ABI))
3242 	    {
3243 	    case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3244 	    case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3245 	    case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3246 	    case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3247 	    case 0:
3248 	    /* We simply ignore the field in this case to avoid confusion:
3249 	       MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3250 	       This means it is likely to be an o32 file, but not for
3251 	       sure.  */
3252 	      break;
3253 	    default: strcat (buf, _(", unknown ABI")); break;
3254 	    }
3255 
3256 	  if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3257 	    strcat (buf, ", mdmx");
3258 
3259 	  if (e_flags & EF_MIPS_ARCH_ASE_M16)
3260 	    strcat (buf, ", mips16");
3261 
3262 	  if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3263 	    strcat (buf, ", micromips");
3264 
3265 	  switch ((e_flags & EF_MIPS_ARCH))
3266 	    {
3267 	    case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3268 	    case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3269 	    case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3270 	    case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3271 	    case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3272 	    case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3273 	    case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3274 	    case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3275 	    case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3276 	    case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3277 	    case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3278 	    default: strcat (buf, _(", unknown ISA")); break;
3279 	    }
3280 	  break;
3281 
3282 	case EM_NDS32:
3283 	  decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3284 	  break;
3285 
3286 	case EM_SH:
3287 	  switch ((e_flags & EF_SH_MACH_MASK))
3288 	    {
3289 	    case EF_SH1: strcat (buf, ", sh1"); break;
3290 	    case EF_SH2: strcat (buf, ", sh2"); break;
3291 	    case EF_SH3: strcat (buf, ", sh3"); break;
3292 	    case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3293 	    case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3294 	    case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3295 	    case EF_SH3E: strcat (buf, ", sh3e"); break;
3296 	    case EF_SH4: strcat (buf, ", sh4"); break;
3297 	    case EF_SH5: strcat (buf, ", sh5"); break;
3298 	    case EF_SH2E: strcat (buf, ", sh2e"); break;
3299 	    case EF_SH4A: strcat (buf, ", sh4a"); break;
3300 	    case EF_SH2A: strcat (buf, ", sh2a"); break;
3301 	    case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3302 	    case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3303 	    case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3304 	    case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3305 	    case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3306 	    case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3307 	    case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3308 	    case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3309 	    case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3310 	    default: strcat (buf, _(", unknown ISA")); break;
3311 	    }
3312 
3313 	  if (e_flags & EF_SH_PIC)
3314 	    strcat (buf, ", pic");
3315 
3316 	  if (e_flags & EF_SH_FDPIC)
3317 	    strcat (buf, ", fdpic");
3318 	  break;
3319 
3320         case EM_OR1K:
3321           if (e_flags & EF_OR1K_NODELAY)
3322             strcat (buf, ", no delay");
3323           break;
3324 
3325 	case EM_SPARCV9:
3326 	  if (e_flags & EF_SPARC_32PLUS)
3327 	    strcat (buf, ", v8+");
3328 
3329 	  if (e_flags & EF_SPARC_SUN_US1)
3330 	    strcat (buf, ", ultrasparcI");
3331 
3332 	  if (e_flags & EF_SPARC_SUN_US3)
3333 	    strcat (buf, ", ultrasparcIII");
3334 
3335 	  if (e_flags & EF_SPARC_HAL_R1)
3336 	    strcat (buf, ", halr1");
3337 
3338 	  if (e_flags & EF_SPARC_LEDATA)
3339 	    strcat (buf, ", ledata");
3340 
3341 	  if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3342 	    strcat (buf, ", tso");
3343 
3344 	  if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3345 	    strcat (buf, ", pso");
3346 
3347 	  if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3348 	    strcat (buf, ", rmo");
3349 	  break;
3350 
3351 	case EM_PARISC:
3352 	  switch (e_flags & EF_PARISC_ARCH)
3353 	    {
3354 	    case EFA_PARISC_1_0:
3355 	      strcpy (buf, ", PA-RISC 1.0");
3356 	      break;
3357 	    case EFA_PARISC_1_1:
3358 	      strcpy (buf, ", PA-RISC 1.1");
3359 	      break;
3360 	    case EFA_PARISC_2_0:
3361 	      strcpy (buf, ", PA-RISC 2.0");
3362 	      break;
3363 	    default:
3364 	      break;
3365 	    }
3366 	  if (e_flags & EF_PARISC_TRAPNIL)
3367 	    strcat (buf, ", trapnil");
3368 	  if (e_flags & EF_PARISC_EXT)
3369 	    strcat (buf, ", ext");
3370 	  if (e_flags & EF_PARISC_LSB)
3371 	    strcat (buf, ", lsb");
3372 	  if (e_flags & EF_PARISC_WIDE)
3373 	    strcat (buf, ", wide");
3374 	  if (e_flags & EF_PARISC_NO_KABP)
3375 	    strcat (buf, ", no kabp");
3376 	  if (e_flags & EF_PARISC_LAZYSWAP)
3377 	    strcat (buf, ", lazyswap");
3378 	  break;
3379 
3380 	case EM_PJ:
3381 	case EM_PJ_OLD:
3382 	  if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3383 	    strcat (buf, ", new calling convention");
3384 
3385 	  if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3386 	    strcat (buf, ", gnu calling convention");
3387 	  break;
3388 
3389 	case EM_IA_64:
3390 	  if ((e_flags & EF_IA_64_ABI64))
3391 	    strcat (buf, ", 64-bit");
3392 	  else
3393 	    strcat (buf, ", 32-bit");
3394 	  if ((e_flags & EF_IA_64_REDUCEDFP))
3395 	    strcat (buf, ", reduced fp model");
3396 	  if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3397 	    strcat (buf, ", no function descriptors, constant gp");
3398 	  else if ((e_flags & EF_IA_64_CONS_GP))
3399 	    strcat (buf, ", constant gp");
3400 	  if ((e_flags & EF_IA_64_ABSOLUTE))
3401 	    strcat (buf, ", absolute");
3402           if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3403             {
3404               if ((e_flags & EF_IA_64_VMS_LINKAGES))
3405                 strcat (buf, ", vms_linkages");
3406               switch ((e_flags & EF_IA_64_VMS_COMCOD))
3407                 {
3408                 case EF_IA_64_VMS_COMCOD_SUCCESS:
3409                   break;
3410                 case EF_IA_64_VMS_COMCOD_WARNING:
3411                   strcat (buf, ", warning");
3412                   break;
3413                 case EF_IA_64_VMS_COMCOD_ERROR:
3414                   strcat (buf, ", error");
3415                   break;
3416                 case EF_IA_64_VMS_COMCOD_ABORT:
3417                   strcat (buf, ", abort");
3418                   break;
3419                 default:
3420 		  warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3421 			e_flags & EF_IA_64_VMS_COMCOD);
3422 		  strcat (buf, ", <unknown>");
3423                 }
3424             }
3425 	  break;
3426 
3427 	case EM_VAX:
3428 	  if ((e_flags & EF_VAX_NONPIC))
3429 	    strcat (buf, ", non-PIC");
3430 	  if ((e_flags & EF_VAX_DFLOAT))
3431 	    strcat (buf, ", D-Float");
3432 	  if ((e_flags & EF_VAX_GFLOAT))
3433 	    strcat (buf, ", G-Float");
3434 	  break;
3435 
3436         case EM_VISIUM:
3437 	  if (e_flags & EF_VISIUM_ARCH_MCM)
3438 	    strcat (buf, ", mcm");
3439 	  else if (e_flags & EF_VISIUM_ARCH_MCM24)
3440 	    strcat (buf, ", mcm24");
3441 	  if (e_flags & EF_VISIUM_ARCH_GR6)
3442 	    strcat (buf, ", gr6");
3443 	  break;
3444 
3445 	case EM_RL78:
3446 	  switch (e_flags & E_FLAG_RL78_CPU_MASK)
3447 	    {
3448 	    case E_FLAG_RL78_ANY_CPU: break;
3449 	    case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3450 	    case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3451 	    case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3452 	    }
3453 	  if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3454 	    strcat (buf, ", 64-bit doubles");
3455 	  break;
3456 
3457 	case EM_RX:
3458 	  if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3459 	    strcat (buf, ", 64-bit doubles");
3460 	  if (e_flags & E_FLAG_RX_DSP)
3461 	    strcat (buf, ", dsp");
3462 	  if (e_flags & E_FLAG_RX_PID)
3463 	    strcat (buf, ", pid");
3464 	  if (e_flags & E_FLAG_RX_ABI)
3465 	    strcat (buf, ", RX ABI");
3466 	  if (e_flags & E_FLAG_RX_SINSNS_SET)
3467 	    strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3468 		    ? ", uses String instructions" : ", bans String instructions");
3469 	  if (e_flags & E_FLAG_RX_V2)
3470 	    strcat (buf, ", V2");
3471 	  break;
3472 
3473 	case EM_S390:
3474 	  if (e_flags & EF_S390_HIGH_GPRS)
3475 	    strcat (buf, ", highgprs");
3476 	  break;
3477 
3478 	case EM_TI_C6000:
3479 	  if ((e_flags & EF_C6000_REL))
3480 	    strcat (buf, ", relocatable module");
3481 	  break;
3482 
3483 	case EM_MSP430:
3484 	  strcat (buf, _(": architecture variant: "));
3485 	  switch (e_flags & EF_MSP430_MACH)
3486 	    {
3487 	    case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3488 	    case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3489 	    case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3490 	    case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3491 	    case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3492 	    case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3493 	    case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3494 	    case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3495 	    case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3496 	    case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3497 	    case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3498 	    case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3499 	    case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3500 	    case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3501 	    case E_MSP430_MACH_MSP430X  : strcat (buf, "MSP430X"); break;
3502 	    default:
3503 	      strcat (buf, _(": unknown")); break;
3504 	    }
3505 
3506 	  if (e_flags & ~ EF_MSP430_MACH)
3507 	    strcat (buf, _(": unknown extra flag bits also present"));
3508 	}
3509     }
3510 
3511   return buf;
3512 }
3513 
3514 static const char *
3515 get_osabi_name (unsigned int osabi)
3516 {
3517   static char buff[32];
3518 
3519   switch (osabi)
3520     {
3521     case ELFOSABI_NONE:		return "UNIX - System V";
3522     case ELFOSABI_HPUX:		return "UNIX - HP-UX";
3523     case ELFOSABI_NETBSD:	return "UNIX - NetBSD";
3524     case ELFOSABI_GNU:		return "UNIX - GNU";
3525     case ELFOSABI_SOLARIS:	return "UNIX - Solaris";
3526     case ELFOSABI_AIX:		return "UNIX - AIX";
3527     case ELFOSABI_IRIX:		return "UNIX - IRIX";
3528     case ELFOSABI_FREEBSD:	return "UNIX - FreeBSD";
3529     case ELFOSABI_TRU64:	return "UNIX - TRU64";
3530     case ELFOSABI_MODESTO:	return "Novell - Modesto";
3531     case ELFOSABI_OPENBSD:	return "UNIX - OpenBSD";
3532     case ELFOSABI_OPENVMS:	return "VMS - OpenVMS";
3533     case ELFOSABI_NSK:		return "HP - Non-Stop Kernel";
3534     case ELFOSABI_AROS:		return "AROS";
3535     case ELFOSABI_FENIXOS:	return "FenixOS";
3536     default:
3537       if (osabi >= 64)
3538 	switch (elf_header.e_machine)
3539 	  {
3540 	  case EM_ARM:
3541 	    switch (osabi)
3542 	      {
3543 	      case ELFOSABI_ARM:	return "ARM";
3544 	      default:
3545 		break;
3546 	      }
3547 	    break;
3548 
3549 	  case EM_MSP430:
3550 	  case EM_MSP430_OLD:
3551 	  case EM_VISIUM:
3552 	    switch (osabi)
3553 	      {
3554 	      case ELFOSABI_STANDALONE:	return _("Standalone App");
3555 	      default:
3556 		break;
3557 	      }
3558 	    break;
3559 
3560 	  case EM_TI_C6000:
3561 	    switch (osabi)
3562 	      {
3563 	      case ELFOSABI_C6000_ELFABI:	return _("Bare-metal C6000");
3564 	      case ELFOSABI_C6000_LINUX:	return "Linux C6000";
3565 	      default:
3566 		break;
3567 	      }
3568 	    break;
3569 
3570 	  default:
3571 	    break;
3572 	  }
3573       snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3574       return buff;
3575     }
3576 }
3577 
3578 static const char *
3579 get_aarch64_segment_type (unsigned long type)
3580 {
3581   switch (type)
3582     {
3583     case PT_AARCH64_ARCHEXT:
3584       return "AARCH64_ARCHEXT";
3585     default:
3586       break;
3587     }
3588 
3589   return NULL;
3590 }
3591 
3592 static const char *
3593 get_arm_segment_type (unsigned long type)
3594 {
3595   switch (type)
3596     {
3597     case PT_ARM_EXIDX:
3598       return "EXIDX";
3599     default:
3600       break;
3601     }
3602 
3603   return NULL;
3604 }
3605 
3606 static const char *
3607 get_mips_segment_type (unsigned long type)
3608 {
3609   switch (type)
3610     {
3611     case PT_MIPS_REGINFO:
3612       return "REGINFO";
3613     case PT_MIPS_RTPROC:
3614       return "RTPROC";
3615     case PT_MIPS_OPTIONS:
3616       return "OPTIONS";
3617     case PT_MIPS_ABIFLAGS:
3618       return "ABIFLAGS";
3619     default:
3620       break;
3621     }
3622 
3623   return NULL;
3624 }
3625 
3626 static const char *
3627 get_parisc_segment_type (unsigned long type)
3628 {
3629   switch (type)
3630     {
3631     case PT_HP_TLS:		return "HP_TLS";
3632     case PT_HP_CORE_NONE:	return "HP_CORE_NONE";
3633     case PT_HP_CORE_VERSION:	return "HP_CORE_VERSION";
3634     case PT_HP_CORE_KERNEL:	return "HP_CORE_KERNEL";
3635     case PT_HP_CORE_COMM:	return "HP_CORE_COMM";
3636     case PT_HP_CORE_PROC:	return "HP_CORE_PROC";
3637     case PT_HP_CORE_LOADABLE:	return "HP_CORE_LOADABLE";
3638     case PT_HP_CORE_STACK:	return "HP_CORE_STACK";
3639     case PT_HP_CORE_SHM:	return "HP_CORE_SHM";
3640     case PT_HP_CORE_MMF:	return "HP_CORE_MMF";
3641     case PT_HP_PARALLEL:	return "HP_PARALLEL";
3642     case PT_HP_FASTBIND:	return "HP_FASTBIND";
3643     case PT_HP_OPT_ANNOT:	return "HP_OPT_ANNOT";
3644     case PT_HP_HSL_ANNOT:	return "HP_HSL_ANNOT";
3645     case PT_HP_STACK:		return "HP_STACK";
3646     case PT_HP_CORE_UTSNAME:	return "HP_CORE_UTSNAME";
3647     case PT_PARISC_ARCHEXT:	return "PARISC_ARCHEXT";
3648     case PT_PARISC_UNWIND:	return "PARISC_UNWIND";
3649     case PT_PARISC_WEAKORDER:	return "PARISC_WEAKORDER";
3650     default:
3651       break;
3652     }
3653 
3654   return NULL;
3655 }
3656 
3657 static const char *
3658 get_ia64_segment_type (unsigned long type)
3659 {
3660   switch (type)
3661     {
3662     case PT_IA_64_ARCHEXT:	return "IA_64_ARCHEXT";
3663     case PT_IA_64_UNWIND:	return "IA_64_UNWIND";
3664     case PT_HP_TLS:		return "HP_TLS";
3665     case PT_IA_64_HP_OPT_ANOT:	return "HP_OPT_ANNOT";
3666     case PT_IA_64_HP_HSL_ANOT:	return "HP_HSL_ANNOT";
3667     case PT_IA_64_HP_STACK:	return "HP_STACK";
3668     default:
3669       break;
3670     }
3671 
3672   return NULL;
3673 }
3674 
3675 static const char *
3676 get_tic6x_segment_type (unsigned long type)
3677 {
3678   switch (type)
3679     {
3680     case PT_C6000_PHATTR:	return "C6000_PHATTR";
3681     default:
3682       break;
3683     }
3684 
3685   return NULL;
3686 }
3687 
3688 static const char *
3689 get_solaris_segment_type (unsigned long type)
3690 {
3691   switch (type)
3692     {
3693     case 0x6464e550: return "PT_SUNW_UNWIND";
3694     case 0x6474e550: return "PT_SUNW_EH_FRAME";
3695     case 0x6ffffff7: return "PT_LOSUNW";
3696     case 0x6ffffffa: return "PT_SUNWBSS";
3697     case 0x6ffffffb: return "PT_SUNWSTACK";
3698     case 0x6ffffffc: return "PT_SUNWDTRACE";
3699     case 0x6ffffffd: return "PT_SUNWCAP";
3700     case 0x6fffffff: return "PT_HISUNW";
3701     default: return NULL;
3702     }
3703 }
3704 
3705 static const char *
3706 get_segment_type (unsigned long p_type)
3707 {
3708   static char buff[32];
3709 
3710   switch (p_type)
3711     {
3712     case PT_NULL:	return "NULL";
3713     case PT_LOAD:	return "LOAD";
3714     case PT_DYNAMIC:	return "DYNAMIC";
3715     case PT_INTERP:	return "INTERP";
3716     case PT_NOTE:	return "NOTE";
3717     case PT_SHLIB:	return "SHLIB";
3718     case PT_PHDR:	return "PHDR";
3719     case PT_TLS:	return "TLS";
3720 
3721     case PT_GNU_EH_FRAME:
3722 			return "GNU_EH_FRAME";
3723     case PT_GNU_STACK:	return "GNU_STACK";
3724     case PT_GNU_RELRO:  return "GNU_RELRO";
3725 
3726     default:
3727       if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3728 	{
3729 	  const char * result;
3730 
3731 	  switch (elf_header.e_machine)
3732 	    {
3733 	    case EM_AARCH64:
3734 	      result = get_aarch64_segment_type (p_type);
3735 	      break;
3736 	    case EM_ARM:
3737 	      result = get_arm_segment_type (p_type);
3738 	      break;
3739 	    case EM_MIPS:
3740 	    case EM_MIPS_RS3_LE:
3741 	      result = get_mips_segment_type (p_type);
3742 	      break;
3743 	    case EM_PARISC:
3744 	      result = get_parisc_segment_type (p_type);
3745 	      break;
3746 	    case EM_IA_64:
3747 	      result = get_ia64_segment_type (p_type);
3748 	      break;
3749 	    case EM_TI_C6000:
3750 	      result = get_tic6x_segment_type (p_type);
3751 	      break;
3752 	    default:
3753 	      result = NULL;
3754 	      break;
3755 	    }
3756 
3757 	  if (result != NULL)
3758 	    return result;
3759 
3760 	  sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3761 	}
3762       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3763 	{
3764 	  const char * result;
3765 
3766 	  switch (elf_header.e_machine)
3767 	    {
3768 	    case EM_PARISC:
3769 	      result = get_parisc_segment_type (p_type);
3770 	      break;
3771 	    case EM_IA_64:
3772 	      result = get_ia64_segment_type (p_type);
3773 	      break;
3774 	    default:
3775 	      if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
3776 		result = get_solaris_segment_type (p_type);
3777 	      else
3778 		result = NULL;
3779 	      break;
3780 	    }
3781 
3782 	  if (result != NULL)
3783 	    return result;
3784 
3785 	  sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3786 	}
3787       else
3788 	snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3789 
3790       return buff;
3791     }
3792 }
3793 
3794 static const char *
3795 get_mips_section_type_name (unsigned int sh_type)
3796 {
3797   switch (sh_type)
3798     {
3799     case SHT_MIPS_LIBLIST:	 return "MIPS_LIBLIST";
3800     case SHT_MIPS_MSYM:		 return "MIPS_MSYM";
3801     case SHT_MIPS_CONFLICT:	 return "MIPS_CONFLICT";
3802     case SHT_MIPS_GPTAB:	 return "MIPS_GPTAB";
3803     case SHT_MIPS_UCODE:	 return "MIPS_UCODE";
3804     case SHT_MIPS_DEBUG:	 return "MIPS_DEBUG";
3805     case SHT_MIPS_REGINFO:	 return "MIPS_REGINFO";
3806     case SHT_MIPS_PACKAGE:	 return "MIPS_PACKAGE";
3807     case SHT_MIPS_PACKSYM:	 return "MIPS_PACKSYM";
3808     case SHT_MIPS_RELD:		 return "MIPS_RELD";
3809     case SHT_MIPS_IFACE:	 return "MIPS_IFACE";
3810     case SHT_MIPS_CONTENT:	 return "MIPS_CONTENT";
3811     case SHT_MIPS_OPTIONS:	 return "MIPS_OPTIONS";
3812     case SHT_MIPS_SHDR:		 return "MIPS_SHDR";
3813     case SHT_MIPS_FDESC:	 return "MIPS_FDESC";
3814     case SHT_MIPS_EXTSYM:	 return "MIPS_EXTSYM";
3815     case SHT_MIPS_DENSE:	 return "MIPS_DENSE";
3816     case SHT_MIPS_PDESC:	 return "MIPS_PDESC";
3817     case SHT_MIPS_LOCSYM:	 return "MIPS_LOCSYM";
3818     case SHT_MIPS_AUXSYM:	 return "MIPS_AUXSYM";
3819     case SHT_MIPS_OPTSYM:	 return "MIPS_OPTSYM";
3820     case SHT_MIPS_LOCSTR:	 return "MIPS_LOCSTR";
3821     case SHT_MIPS_LINE:		 return "MIPS_LINE";
3822     case SHT_MIPS_RFDESC:	 return "MIPS_RFDESC";
3823     case SHT_MIPS_DELTASYM:	 return "MIPS_DELTASYM";
3824     case SHT_MIPS_DELTAINST:	 return "MIPS_DELTAINST";
3825     case SHT_MIPS_DELTACLASS:	 return "MIPS_DELTACLASS";
3826     case SHT_MIPS_DWARF:	 return "MIPS_DWARF";
3827     case SHT_MIPS_DELTADECL:	 return "MIPS_DELTADECL";
3828     case SHT_MIPS_SYMBOL_LIB:	 return "MIPS_SYMBOL_LIB";
3829     case SHT_MIPS_EVENTS:	 return "MIPS_EVENTS";
3830     case SHT_MIPS_TRANSLATE:	 return "MIPS_TRANSLATE";
3831     case SHT_MIPS_PIXIE:	 return "MIPS_PIXIE";
3832     case SHT_MIPS_XLATE:	 return "MIPS_XLATE";
3833     case SHT_MIPS_XLATE_DEBUG:	 return "MIPS_XLATE_DEBUG";
3834     case SHT_MIPS_WHIRL:	 return "MIPS_WHIRL";
3835     case SHT_MIPS_EH_REGION:	 return "MIPS_EH_REGION";
3836     case SHT_MIPS_XLATE_OLD:	 return "MIPS_XLATE_OLD";
3837     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3838     case SHT_MIPS_ABIFLAGS:	 return "MIPS_ABIFLAGS";
3839     default:
3840       break;
3841     }
3842   return NULL;
3843 }
3844 
3845 static const char *
3846 get_parisc_section_type_name (unsigned int sh_type)
3847 {
3848   switch (sh_type)
3849     {
3850     case SHT_PARISC_EXT:	return "PARISC_EXT";
3851     case SHT_PARISC_UNWIND:	return "PARISC_UNWIND";
3852     case SHT_PARISC_DOC:	return "PARISC_DOC";
3853     case SHT_PARISC_ANNOT:	return "PARISC_ANNOT";
3854     case SHT_PARISC_SYMEXTN:	return "PARISC_SYMEXTN";
3855     case SHT_PARISC_STUBS:	return "PARISC_STUBS";
3856     case SHT_PARISC_DLKM:	return "PARISC_DLKM";
3857     default:
3858       break;
3859     }
3860   return NULL;
3861 }
3862 
3863 static const char *
3864 get_ia64_section_type_name (unsigned int sh_type)
3865 {
3866   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
3867   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3868     return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3869 
3870   switch (sh_type)
3871     {
3872     case SHT_IA_64_EXT:		       return "IA_64_EXT";
3873     case SHT_IA_64_UNWIND:	       return "IA_64_UNWIND";
3874     case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
3875     case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
3876     case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3877     case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
3878     case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
3879     case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
3880     case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
3881     case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
3882     default:
3883       break;
3884     }
3885   return NULL;
3886 }
3887 
3888 static const char *
3889 get_x86_64_section_type_name (unsigned int sh_type)
3890 {
3891   switch (sh_type)
3892     {
3893     case SHT_X86_64_UNWIND:	return "X86_64_UNWIND";
3894     default:
3895       break;
3896     }
3897   return NULL;
3898 }
3899 
3900 static const char *
3901 get_aarch64_section_type_name (unsigned int sh_type)
3902 {
3903   switch (sh_type)
3904     {
3905     case SHT_AARCH64_ATTRIBUTES:
3906       return "AARCH64_ATTRIBUTES";
3907     default:
3908       break;
3909     }
3910   return NULL;
3911 }
3912 
3913 static const char *
3914 get_arm_section_type_name (unsigned int sh_type)
3915 {
3916   switch (sh_type)
3917     {
3918     case SHT_ARM_EXIDX:           return "ARM_EXIDX";
3919     case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
3920     case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
3921     case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
3922     case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
3923     default:
3924       break;
3925     }
3926   return NULL;
3927 }
3928 
3929 static const char *
3930 get_tic6x_section_type_name (unsigned int sh_type)
3931 {
3932   switch (sh_type)
3933     {
3934     case SHT_C6000_UNWIND:
3935       return "C6000_UNWIND";
3936     case SHT_C6000_PREEMPTMAP:
3937       return "C6000_PREEMPTMAP";
3938     case SHT_C6000_ATTRIBUTES:
3939       return "C6000_ATTRIBUTES";
3940     case SHT_TI_ICODE:
3941       return "TI_ICODE";
3942     case SHT_TI_XREF:
3943       return "TI_XREF";
3944     case SHT_TI_HANDLER:
3945       return "TI_HANDLER";
3946     case SHT_TI_INITINFO:
3947       return "TI_INITINFO";
3948     case SHT_TI_PHATTRS:
3949       return "TI_PHATTRS";
3950     default:
3951       break;
3952     }
3953   return NULL;
3954 }
3955 
3956 static const char *
3957 get_msp430x_section_type_name (unsigned int sh_type)
3958 {
3959   switch (sh_type)
3960     {
3961     case SHT_MSP430_SEC_FLAGS:   return "MSP430_SEC_FLAGS";
3962     case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3963     case SHT_MSP430_ATTRIBUTES:  return "MSP430_ATTRIBUTES";
3964     default: return NULL;
3965     }
3966 }
3967 
3968 static const char *
3969 get_v850_section_type_name (unsigned int sh_type)
3970 {
3971   switch (sh_type)
3972     {
3973     case SHT_V850_SCOMMON: return "V850 Small Common";
3974     case SHT_V850_TCOMMON: return "V850 Tiny Common";
3975     case SHT_V850_ZCOMMON: return "V850 Zero Common";
3976     case SHT_RENESAS_IOP:  return "RENESAS IOP";
3977     case SHT_RENESAS_INFO: return "RENESAS INFO";
3978     default: return NULL;
3979     }
3980 }
3981 
3982 static const char *
3983 get_section_type_name (unsigned int sh_type)
3984 {
3985   static char buff[32];
3986   const char * result;
3987 
3988   switch (sh_type)
3989     {
3990     case SHT_NULL:		return "NULL";
3991     case SHT_PROGBITS:		return "PROGBITS";
3992     case SHT_SYMTAB:		return "SYMTAB";
3993     case SHT_STRTAB:		return "STRTAB";
3994     case SHT_RELA:		return "RELA";
3995     case SHT_HASH:		return "HASH";
3996     case SHT_DYNAMIC:		return "DYNAMIC";
3997     case SHT_NOTE:		return "NOTE";
3998     case SHT_NOBITS:		return "NOBITS";
3999     case SHT_REL:		return "REL";
4000     case SHT_SHLIB:		return "SHLIB";
4001     case SHT_DYNSYM:		return "DYNSYM";
4002     case SHT_INIT_ARRAY:	return "INIT_ARRAY";
4003     case SHT_FINI_ARRAY:	return "FINI_ARRAY";
4004     case SHT_PREINIT_ARRAY:	return "PREINIT_ARRAY";
4005     case SHT_GNU_HASH:		return "GNU_HASH";
4006     case SHT_GROUP:		return "GROUP";
4007     case SHT_SYMTAB_SHNDX:	return "SYMTAB SECTION INDICIES";
4008     case SHT_GNU_verdef:	return "VERDEF";
4009     case SHT_GNU_verneed:	return "VERNEED";
4010     case SHT_GNU_versym:	return "VERSYM";
4011     case 0x6ffffff0:		return "VERSYM";
4012     case 0x6ffffffc:		return "VERDEF";
4013     case 0x7ffffffd:		return "AUXILIARY";
4014     case 0x7fffffff:		return "FILTER";
4015     case SHT_GNU_LIBLIST:	return "GNU_LIBLIST";
4016 
4017     default:
4018       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4019 	{
4020 	  switch (elf_header.e_machine)
4021 	    {
4022 	    case EM_MIPS:
4023 	    case EM_MIPS_RS3_LE:
4024 	      result = get_mips_section_type_name (sh_type);
4025 	      break;
4026 	    case EM_PARISC:
4027 	      result = get_parisc_section_type_name (sh_type);
4028 	      break;
4029 	    case EM_IA_64:
4030 	      result = get_ia64_section_type_name (sh_type);
4031 	      break;
4032 	    case EM_X86_64:
4033 	    case EM_L1OM:
4034 	    case EM_K1OM:
4035 	      result = get_x86_64_section_type_name (sh_type);
4036 	      break;
4037 	    case EM_AARCH64:
4038 	      result = get_aarch64_section_type_name (sh_type);
4039 	      break;
4040 	    case EM_ARM:
4041 	      result = get_arm_section_type_name (sh_type);
4042 	      break;
4043 	    case EM_TI_C6000:
4044 	      result = get_tic6x_section_type_name (sh_type);
4045 	      break;
4046 	    case EM_MSP430:
4047 	      result = get_msp430x_section_type_name (sh_type);
4048 	      break;
4049 	    case EM_V800:
4050 	    case EM_V850:
4051 	    case EM_CYGNUS_V850:
4052 	      result = get_v850_section_type_name (sh_type);
4053 	      break;
4054 	    default:
4055 	      result = NULL;
4056 	      break;
4057 	    }
4058 
4059 	  if (result != NULL)
4060 	    return result;
4061 
4062 	  sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4063 	}
4064       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4065 	{
4066 	  switch (elf_header.e_machine)
4067 	    {
4068 	    case EM_IA_64:
4069 	      result = get_ia64_section_type_name (sh_type);
4070 	      break;
4071 	    default:
4072 	      if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4073 		result = get_solaris_section_type (sh_type);
4074 	      else
4075 		result = NULL;
4076 	      break;
4077 	    }
4078 
4079 	  if (result != NULL)
4080 	    return result;
4081 
4082 	  sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4083 	}
4084       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4085 	{
4086 	  switch (elf_header.e_machine)
4087 	    {
4088 	    case EM_V800:
4089 	    case EM_V850:
4090 	    case EM_CYGNUS_V850:
4091 	      result = get_v850_section_type_name (sh_type);
4092 	      break;
4093 	    default:
4094 	      result = NULL;
4095 	      break;
4096 	    }
4097 
4098 	  if (result != NULL)
4099 	    return result;
4100 
4101 	  sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4102 	}
4103       else
4104 	/* This message is probably going to be displayed in a 15
4105 	   character wide field, so put the hex value first.  */
4106 	snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4107 
4108       return buff;
4109     }
4110 }
4111 
4112 #define OPTION_DEBUG_DUMP	512
4113 #define OPTION_DYN_SYMS		513
4114 #define OPTION_DWARF_DEPTH	514
4115 #define OPTION_DWARF_START	515
4116 #define OPTION_DWARF_CHECK	516
4117 
4118 static struct option options[] =
4119 {
4120   {"all",	       no_argument, 0, 'a'},
4121   {"file-header",      no_argument, 0, 'h'},
4122   {"program-headers",  no_argument, 0, 'l'},
4123   {"headers",	       no_argument, 0, 'e'},
4124   {"histogram",	       no_argument, 0, 'I'},
4125   {"segments",	       no_argument, 0, 'l'},
4126   {"sections",	       no_argument, 0, 'S'},
4127   {"section-headers",  no_argument, 0, 'S'},
4128   {"section-groups",   no_argument, 0, 'g'},
4129   {"section-details",  no_argument, 0, 't'},
4130   {"full-section-name",no_argument, 0, 'N'},
4131   {"symbols",	       no_argument, 0, 's'},
4132   {"syms",	       no_argument, 0, 's'},
4133   {"dyn-syms",	       no_argument, 0, OPTION_DYN_SYMS},
4134   {"relocs",	       no_argument, 0, 'r'},
4135   {"notes",	       no_argument, 0, 'n'},
4136   {"dynamic",	       no_argument, 0, 'd'},
4137   {"arch-specific",    no_argument, 0, 'A'},
4138   {"version-info",     no_argument, 0, 'V'},
4139   {"use-dynamic",      no_argument, 0, 'D'},
4140   {"unwind",	       no_argument, 0, 'u'},
4141   {"archive-index",    no_argument, 0, 'c'},
4142   {"hex-dump",	       required_argument, 0, 'x'},
4143   {"relocated-dump",   required_argument, 0, 'R'},
4144   {"string-dump",      required_argument, 0, 'p'},
4145   {"decompress",       no_argument, 0, 'z'},
4146 #ifdef SUPPORT_DISASSEMBLY
4147   {"instruction-dump", required_argument, 0, 'i'},
4148 #endif
4149   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
4150 
4151   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
4152   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
4153   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
4154 
4155   {"version",	       no_argument, 0, 'v'},
4156   {"wide",	       no_argument, 0, 'W'},
4157   {"help",	       no_argument, 0, 'H'},
4158   {0,		       no_argument, 0, 0}
4159 };
4160 
4161 static void
4162 usage (FILE * stream)
4163 {
4164   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4165   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4166   fprintf (stream, _(" Options are:\n\
4167   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4168   -h --file-header       Display the ELF file header\n\
4169   -l --program-headers   Display the program headers\n\
4170      --segments          An alias for --program-headers\n\
4171   -S --section-headers   Display the sections' header\n\
4172      --sections          An alias for --section-headers\n\
4173   -g --section-groups    Display the section groups\n\
4174   -t --section-details   Display the section details\n\
4175   -e --headers           Equivalent to: -h -l -S\n\
4176   -s --syms              Display the symbol table\n\
4177      --symbols           An alias for --syms\n\
4178   --dyn-syms             Display the dynamic symbol table\n\
4179   -n --notes             Display the core notes (if present)\n\
4180   -r --relocs            Display the relocations (if present)\n\
4181   -u --unwind            Display the unwind info (if present)\n\
4182   -d --dynamic           Display the dynamic section (if present)\n\
4183   -V --version-info      Display the version sections (if present)\n\
4184   -A --arch-specific     Display architecture specific information (if any)\n\
4185   -c --archive-index     Display the symbol/file index in an archive\n\
4186   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
4187   -x --hex-dump=<number|name>\n\
4188                          Dump the contents of section <number|name> as bytes\n\
4189   -p --string-dump=<number|name>\n\
4190                          Dump the contents of section <number|name> as strings\n\
4191   -R --relocated-dump=<number|name>\n\
4192                          Dump the contents of section <number|name> as relocated bytes\n\
4193   -z --decompress        Decompress section before dumping it\n\
4194   -w[lLiaprmfFsoRt] or\n\
4195   --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4196                =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4197                =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4198                =addr,=cu_index]\n\
4199                          Display the contents of DWARF2 debug sections\n"));
4200   fprintf (stream, _("\
4201   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
4202   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
4203                          or deeper\n"));
4204 #ifdef SUPPORT_DISASSEMBLY
4205   fprintf (stream, _("\
4206   -i --instruction-dump=<number|name>\n\
4207                          Disassemble the contents of section <number|name>\n"));
4208 #endif
4209   fprintf (stream, _("\
4210   -I --histogram         Display histogram of bucket list lengths\n\
4211   -W --wide              Allow output width to exceed 80 characters\n\
4212   @<file>                Read options from <file>\n\
4213   -H --help              Display this information\n\
4214   -v --version           Display the version number of readelf\n"));
4215 
4216   if (REPORT_BUGS_TO[0] && stream == stdout)
4217     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4218 
4219   exit (stream == stdout ? 0 : 1);
4220 }
4221 
4222 /* Record the fact that the user wants the contents of section number
4223    SECTION to be displayed using the method(s) encoded as flags bits
4224    in TYPE.  Note, TYPE can be zero if we are creating the array for
4225    the first time.  */
4226 
4227 static void
4228 request_dump_bynumber (unsigned int section, dump_type type)
4229 {
4230   if (section >= num_dump_sects)
4231     {
4232       dump_type * new_dump_sects;
4233 
4234       new_dump_sects = (dump_type *) calloc (section + 1,
4235                                              sizeof (* dump_sects));
4236 
4237       if (new_dump_sects == NULL)
4238 	error (_("Out of memory allocating dump request table.\n"));
4239       else
4240 	{
4241 	  /* Copy current flag settings.  */
4242 	  memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
4243 
4244 	  free (dump_sects);
4245 
4246 	  dump_sects = new_dump_sects;
4247 	  num_dump_sects = section + 1;
4248 	}
4249     }
4250 
4251   if (dump_sects)
4252     dump_sects[section] |= type;
4253 
4254   return;
4255 }
4256 
4257 /* Request a dump by section name.  */
4258 
4259 static void
4260 request_dump_byname (const char * section, dump_type type)
4261 {
4262   struct dump_list_entry * new_request;
4263 
4264   new_request = (struct dump_list_entry *)
4265       malloc (sizeof (struct dump_list_entry));
4266   if (!new_request)
4267     error (_("Out of memory allocating dump request table.\n"));
4268 
4269   new_request->name = strdup (section);
4270   if (!new_request->name)
4271     error (_("Out of memory allocating dump request table.\n"));
4272 
4273   new_request->type = type;
4274 
4275   new_request->next = dump_sects_byname;
4276   dump_sects_byname = new_request;
4277 }
4278 
4279 static inline void
4280 request_dump (dump_type type)
4281 {
4282   int section;
4283   char * cp;
4284 
4285   do_dump++;
4286   section = strtoul (optarg, & cp, 0);
4287 
4288   if (! *cp && section >= 0)
4289     request_dump_bynumber (section, type);
4290   else
4291     request_dump_byname (optarg, type);
4292 }
4293 
4294 
4295 static void
4296 parse_args (int argc, char ** argv)
4297 {
4298   int c;
4299 
4300   if (argc < 2)
4301     usage (stderr);
4302 
4303   while ((c = getopt_long
4304 	  (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4305     {
4306       switch (c)
4307 	{
4308 	case 0:
4309 	  /* Long options.  */
4310 	  break;
4311 	case 'H':
4312 	  usage (stdout);
4313 	  break;
4314 
4315 	case 'a':
4316 	  do_syms++;
4317 	  do_reloc++;
4318 	  do_unwind++;
4319 	  do_dynamic++;
4320 	  do_header++;
4321 	  do_sections++;
4322 	  do_section_groups++;
4323 	  do_segments++;
4324 	  do_version++;
4325 	  do_histogram++;
4326 	  do_arch++;
4327 	  do_notes++;
4328 	  break;
4329 	case 'g':
4330 	  do_section_groups++;
4331 	  break;
4332 	case 't':
4333 	case 'N':
4334 	  do_sections++;
4335 	  do_section_details++;
4336 	  break;
4337 	case 'e':
4338 	  do_header++;
4339 	  do_sections++;
4340 	  do_segments++;
4341 	  break;
4342 	case 'A':
4343 	  do_arch++;
4344 	  break;
4345 	case 'D':
4346 	  do_using_dynamic++;
4347 	  break;
4348 	case 'r':
4349 	  do_reloc++;
4350 	  break;
4351 	case 'u':
4352 	  do_unwind++;
4353 	  break;
4354 	case 'h':
4355 	  do_header++;
4356 	  break;
4357 	case 'l':
4358 	  do_segments++;
4359 	  break;
4360 	case 's':
4361 	  do_syms++;
4362 	  break;
4363 	case 'S':
4364 	  do_sections++;
4365 	  break;
4366 	case 'd':
4367 	  do_dynamic++;
4368 	  break;
4369 	case 'I':
4370 	  do_histogram++;
4371 	  break;
4372 	case 'n':
4373 	  do_notes++;
4374 	  break;
4375 	case 'c':
4376 	  do_archive_index++;
4377 	  break;
4378 	case 'x':
4379 	  request_dump (HEX_DUMP);
4380 	  break;
4381 	case 'p':
4382 	  request_dump (STRING_DUMP);
4383 	  break;
4384 	case 'R':
4385 	  request_dump (RELOC_DUMP);
4386 	  break;
4387 	case 'z':
4388 	  decompress_dumps++;
4389 	  break;
4390 	case 'w':
4391 	  do_dump++;
4392 	  if (optarg == 0)
4393 	    {
4394 	      do_debugging = 1;
4395 	      dwarf_select_sections_all ();
4396 	    }
4397 	  else
4398 	    {
4399 	      do_debugging = 0;
4400 	      dwarf_select_sections_by_letters (optarg);
4401 	    }
4402 	  break;
4403 	case OPTION_DEBUG_DUMP:
4404 	  do_dump++;
4405 	  if (optarg == 0)
4406 	    do_debugging = 1;
4407 	  else
4408 	    {
4409 	      do_debugging = 0;
4410 	      dwarf_select_sections_by_names (optarg);
4411 	    }
4412 	  break;
4413 	case OPTION_DWARF_DEPTH:
4414 	  {
4415 	    char *cp;
4416 
4417 	    dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4418 	  }
4419 	  break;
4420 	case OPTION_DWARF_START:
4421 	  {
4422 	    char *cp;
4423 
4424 	    dwarf_start_die = strtoul (optarg, & cp, 0);
4425 	  }
4426 	  break;
4427 	case OPTION_DWARF_CHECK:
4428 	  dwarf_check = 1;
4429 	  break;
4430 	case OPTION_DYN_SYMS:
4431 	  do_dyn_syms++;
4432 	  break;
4433 #ifdef SUPPORT_DISASSEMBLY
4434 	case 'i':
4435 	  request_dump (DISASS_DUMP);
4436 	  break;
4437 #endif
4438 	case 'v':
4439 	  print_version (program_name);
4440 	  break;
4441 	case 'V':
4442 	  do_version++;
4443 	  break;
4444 	case 'W':
4445 	  do_wide++;
4446 	  break;
4447 	default:
4448 	  /* xgettext:c-format */
4449 	  error (_("Invalid option '-%c'\n"), c);
4450 	  /* Drop through.  */
4451 	case '?':
4452 	  usage (stderr);
4453 	}
4454     }
4455 
4456   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4457       && !do_segments && !do_header && !do_dump && !do_version
4458       && !do_histogram && !do_debugging && !do_arch && !do_notes
4459       && !do_section_groups && !do_archive_index
4460       && !do_dyn_syms)
4461     usage (stderr);
4462 }
4463 
4464 static const char *
4465 get_elf_class (unsigned int elf_class)
4466 {
4467   static char buff[32];
4468 
4469   switch (elf_class)
4470     {
4471     case ELFCLASSNONE: return _("none");
4472     case ELFCLASS32:   return "ELF32";
4473     case ELFCLASS64:   return "ELF64";
4474     default:
4475       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4476       return buff;
4477     }
4478 }
4479 
4480 static const char *
4481 get_data_encoding (unsigned int encoding)
4482 {
4483   static char buff[32];
4484 
4485   switch (encoding)
4486     {
4487     case ELFDATANONE: return _("none");
4488     case ELFDATA2LSB: return _("2's complement, little endian");
4489     case ELFDATA2MSB: return _("2's complement, big endian");
4490     default:
4491       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4492       return buff;
4493     }
4494 }
4495 
4496 /* Decode the data held in 'elf_header'.  */
4497 
4498 static int
4499 process_file_header (void)
4500 {
4501   if (   elf_header.e_ident[EI_MAG0] != ELFMAG0
4502       || elf_header.e_ident[EI_MAG1] != ELFMAG1
4503       || elf_header.e_ident[EI_MAG2] != ELFMAG2
4504       || elf_header.e_ident[EI_MAG3] != ELFMAG3)
4505     {
4506       error
4507 	(_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4508       return 0;
4509     }
4510 
4511   init_dwarf_regnames (elf_header.e_machine);
4512 
4513   if (do_header)
4514     {
4515       int i;
4516 
4517       printf (_("ELF Header:\n"));
4518       printf (_("  Magic:   "));
4519       for (i = 0; i < EI_NIDENT; i++)
4520 	printf ("%2.2x ", elf_header.e_ident[i]);
4521       printf ("\n");
4522       printf (_("  Class:                             %s\n"),
4523 	      get_elf_class (elf_header.e_ident[EI_CLASS]));
4524       printf (_("  Data:                              %s\n"),
4525 	      get_data_encoding (elf_header.e_ident[EI_DATA]));
4526       printf (_("  Version:                           %d %s\n"),
4527 	      elf_header.e_ident[EI_VERSION],
4528 	      (elf_header.e_ident[EI_VERSION] == EV_CURRENT
4529 	       ? "(current)"
4530 	       : (elf_header.e_ident[EI_VERSION] != EV_NONE
4531 		  ? _("<unknown: %lx>")
4532 		  : "")));
4533       printf (_("  OS/ABI:                            %s\n"),
4534 	      get_osabi_name (elf_header.e_ident[EI_OSABI]));
4535       printf (_("  ABI Version:                       %d\n"),
4536 	      elf_header.e_ident[EI_ABIVERSION]);
4537       printf (_("  Type:                              %s\n"),
4538 	      get_file_type (elf_header.e_type));
4539       printf (_("  Machine:                           %s\n"),
4540 	      get_machine_name (elf_header.e_machine));
4541       printf (_("  Version:                           0x%lx\n"),
4542 	      (unsigned long) elf_header.e_version);
4543 
4544       printf (_("  Entry point address:               "));
4545       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4546       printf (_("\n  Start of program headers:          "));
4547       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4548       printf (_(" (bytes into file)\n  Start of section headers:          "));
4549       print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4550       printf (_(" (bytes into file)\n"));
4551 
4552       printf (_("  Flags:                             0x%lx%s\n"),
4553 	      (unsigned long) elf_header.e_flags,
4554 	      get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4555       printf (_("  Size of this header:               %ld (bytes)\n"),
4556 	      (long) elf_header.e_ehsize);
4557       printf (_("  Size of program headers:           %ld (bytes)\n"),
4558 	      (long) elf_header.e_phentsize);
4559       printf (_("  Number of program headers:         %ld"),
4560 	      (long) elf_header.e_phnum);
4561       if (section_headers != NULL
4562 	  && elf_header.e_phnum == PN_XNUM
4563 	  && section_headers[0].sh_info != 0)
4564 	printf (" (%ld)", (long) section_headers[0].sh_info);
4565       putc ('\n', stdout);
4566       printf (_("  Size of section headers:           %ld (bytes)\n"),
4567 	      (long) elf_header.e_shentsize);
4568       printf (_("  Number of section headers:         %ld"),
4569 	      (long) elf_header.e_shnum);
4570       if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
4571 	printf (" (%ld)", (long) section_headers[0].sh_size);
4572       putc ('\n', stdout);
4573       printf (_("  Section header string table index: %ld"),
4574 	      (long) elf_header.e_shstrndx);
4575       if (section_headers != NULL
4576 	  && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4577 	printf (" (%u)", section_headers[0].sh_link);
4578       else if (elf_header.e_shstrndx != SHN_UNDEF
4579 	       && elf_header.e_shstrndx >= elf_header.e_shnum)
4580 	printf (_(" <corrupt: out of range>"));
4581       putc ('\n', stdout);
4582     }
4583 
4584   if (section_headers != NULL)
4585     {
4586       if (elf_header.e_phnum == PN_XNUM
4587 	  && section_headers[0].sh_info != 0)
4588 	elf_header.e_phnum = section_headers[0].sh_info;
4589       if (elf_header.e_shnum == SHN_UNDEF)
4590 	elf_header.e_shnum = section_headers[0].sh_size;
4591       if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4592 	elf_header.e_shstrndx = section_headers[0].sh_link;
4593       else if (elf_header.e_shstrndx >= elf_header.e_shnum)
4594 	elf_header.e_shstrndx = SHN_UNDEF;
4595       free (section_headers);
4596       section_headers = NULL;
4597     }
4598 
4599   return 1;
4600 }
4601 
4602 static bfd_boolean
4603 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4604 {
4605   Elf32_External_Phdr * phdrs;
4606   Elf32_External_Phdr * external;
4607   Elf_Internal_Phdr *   internal;
4608   unsigned int i;
4609   unsigned int size = elf_header.e_phentsize;
4610   unsigned int num  = elf_header.e_phnum;
4611 
4612   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4613   if (size == 0 || num == 0)
4614     return FALSE;
4615   if (size < sizeof * phdrs)
4616     {
4617       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4618       return FALSE;
4619     }
4620   if (size > sizeof * phdrs)
4621     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4622 
4623   phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4624                                             size, num, _("program headers"));
4625   if (phdrs == NULL)
4626     return FALSE;
4627 
4628   for (i = 0, internal = pheaders, external = phdrs;
4629        i < elf_header.e_phnum;
4630        i++, internal++, external++)
4631     {
4632       internal->p_type   = BYTE_GET (external->p_type);
4633       internal->p_offset = BYTE_GET (external->p_offset);
4634       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4635       internal->p_paddr  = BYTE_GET (external->p_paddr);
4636       internal->p_filesz = BYTE_GET (external->p_filesz);
4637       internal->p_memsz  = BYTE_GET (external->p_memsz);
4638       internal->p_flags  = BYTE_GET (external->p_flags);
4639       internal->p_align  = BYTE_GET (external->p_align);
4640     }
4641 
4642   free (phdrs);
4643   return TRUE;
4644 }
4645 
4646 static bfd_boolean
4647 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4648 {
4649   Elf64_External_Phdr * phdrs;
4650   Elf64_External_Phdr * external;
4651   Elf_Internal_Phdr *   internal;
4652   unsigned int i;
4653   unsigned int size = elf_header.e_phentsize;
4654   unsigned int num  = elf_header.e_phnum;
4655 
4656   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4657   if (size == 0 || num == 0)
4658     return FALSE;
4659   if (size < sizeof * phdrs)
4660     {
4661       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4662       return FALSE;
4663     }
4664   if (size > sizeof * phdrs)
4665     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4666 
4667   phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4668                                             size, num, _("program headers"));
4669   if (!phdrs)
4670     return FALSE;
4671 
4672   for (i = 0, internal = pheaders, external = phdrs;
4673        i < elf_header.e_phnum;
4674        i++, internal++, external++)
4675     {
4676       internal->p_type   = BYTE_GET (external->p_type);
4677       internal->p_flags  = BYTE_GET (external->p_flags);
4678       internal->p_offset = BYTE_GET (external->p_offset);
4679       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4680       internal->p_paddr  = BYTE_GET (external->p_paddr);
4681       internal->p_filesz = BYTE_GET (external->p_filesz);
4682       internal->p_memsz  = BYTE_GET (external->p_memsz);
4683       internal->p_align  = BYTE_GET (external->p_align);
4684     }
4685 
4686   free (phdrs);
4687   return TRUE;
4688 }
4689 
4690 /* Returns 1 if the program headers were read into `program_headers'.  */
4691 
4692 static int
4693 get_program_headers (FILE * file)
4694 {
4695   Elf_Internal_Phdr * phdrs;
4696 
4697   /* Check cache of prior read.  */
4698   if (program_headers != NULL)
4699     return 1;
4700 
4701   phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4702                                          sizeof (Elf_Internal_Phdr));
4703 
4704   if (phdrs == NULL)
4705     {
4706       error (_("Out of memory reading %u program headers\n"),
4707 	     elf_header.e_phnum);
4708       return 0;
4709     }
4710 
4711   if (is_32bit_elf
4712       ? get_32bit_program_headers (file, phdrs)
4713       : get_64bit_program_headers (file, phdrs))
4714     {
4715       program_headers = phdrs;
4716       return 1;
4717     }
4718 
4719   free (phdrs);
4720   return 0;
4721 }
4722 
4723 /* Returns 1 if the program headers were loaded.  */
4724 
4725 static int
4726 process_program_headers (FILE * file)
4727 {
4728   Elf_Internal_Phdr * segment;
4729   unsigned int i;
4730 
4731   if (elf_header.e_phnum == 0)
4732     {
4733       /* PR binutils/12467.  */
4734       if (elf_header.e_phoff != 0)
4735 	warn (_("possibly corrupt ELF header - it has a non-zero program"
4736 		" header offset, but no program headers\n"));
4737       else if (do_segments)
4738 	printf (_("\nThere are no program headers in this file.\n"));
4739       return 0;
4740     }
4741 
4742   if (do_segments && !do_header)
4743     {
4744       printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4745       printf (_("Entry point "));
4746       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4747       printf (_("\nThere are %d program headers, starting at offset "),
4748 	      elf_header.e_phnum);
4749       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4750       printf ("\n");
4751     }
4752 
4753   if (! get_program_headers (file))
4754       return 0;
4755 
4756   if (do_segments)
4757     {
4758       if (elf_header.e_phnum > 1)
4759 	printf (_("\nProgram Headers:\n"));
4760       else
4761 	printf (_("\nProgram Headers:\n"));
4762 
4763       if (is_32bit_elf)
4764 	printf
4765 	  (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
4766       else if (do_wide)
4767 	printf
4768 	  (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
4769       else
4770 	{
4771 	  printf
4772 	    (_("  Type           Offset             VirtAddr           PhysAddr\n"));
4773 	  printf
4774 	    (_("                 FileSiz            MemSiz              Flags  Align\n"));
4775 	}
4776     }
4777 
4778   dynamic_addr = 0;
4779   dynamic_size = 0;
4780 
4781   for (i = 0, segment = program_headers;
4782        i < elf_header.e_phnum;
4783        i++, segment++)
4784     {
4785       if (do_segments)
4786 	{
4787 	  printf ("  %-14.14s ", get_segment_type (segment->p_type));
4788 
4789 	  if (is_32bit_elf)
4790 	    {
4791 	      printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4792 	      printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4793 	      printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4794 	      printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4795 	      printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4796 	      printf ("%c%c%c ",
4797 		      (segment->p_flags & PF_R ? 'R' : ' '),
4798 		      (segment->p_flags & PF_W ? 'W' : ' '),
4799 		      (segment->p_flags & PF_X ? 'E' : ' '));
4800 	      printf ("%#lx", (unsigned long) segment->p_align);
4801 	    }
4802 	  else if (do_wide)
4803 	    {
4804 	      if ((unsigned long) segment->p_offset == segment->p_offset)
4805 		printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4806 	      else
4807 		{
4808 		  print_vma (segment->p_offset, FULL_HEX);
4809 		  putchar (' ');
4810 		}
4811 
4812 	      print_vma (segment->p_vaddr, FULL_HEX);
4813 	      putchar (' ');
4814 	      print_vma (segment->p_paddr, FULL_HEX);
4815 	      putchar (' ');
4816 
4817 	      if ((unsigned long) segment->p_filesz == segment->p_filesz)
4818 		printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4819 	      else
4820 		{
4821 		  print_vma (segment->p_filesz, FULL_HEX);
4822 		  putchar (' ');
4823 		}
4824 
4825 	      if ((unsigned long) segment->p_memsz == segment->p_memsz)
4826 		printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4827 	      else
4828 		{
4829 		  print_vma (segment->p_memsz, FULL_HEX);
4830 		}
4831 
4832 	      printf (" %c%c%c ",
4833 		      (segment->p_flags & PF_R ? 'R' : ' '),
4834 		      (segment->p_flags & PF_W ? 'W' : ' '),
4835 		      (segment->p_flags & PF_X ? 'E' : ' '));
4836 
4837 	      if ((unsigned long) segment->p_align == segment->p_align)
4838 		printf ("%#lx", (unsigned long) segment->p_align);
4839 	      else
4840 		{
4841 		  print_vma (segment->p_align, PREFIX_HEX);
4842 		}
4843 	    }
4844 	  else
4845 	    {
4846 	      print_vma (segment->p_offset, FULL_HEX);
4847 	      putchar (' ');
4848 	      print_vma (segment->p_vaddr, FULL_HEX);
4849 	      putchar (' ');
4850 	      print_vma (segment->p_paddr, FULL_HEX);
4851 	      printf ("\n                 ");
4852 	      print_vma (segment->p_filesz, FULL_HEX);
4853 	      putchar (' ');
4854 	      print_vma (segment->p_memsz, FULL_HEX);
4855 	      printf ("  %c%c%c    ",
4856 		      (segment->p_flags & PF_R ? 'R' : ' '),
4857 		      (segment->p_flags & PF_W ? 'W' : ' '),
4858 		      (segment->p_flags & PF_X ? 'E' : ' '));
4859 	      print_vma (segment->p_align, HEX);
4860 	    }
4861 	}
4862 
4863       if (do_segments)
4864 	putc ('\n', stdout);
4865 
4866       switch (segment->p_type)
4867 	{
4868 	case PT_DYNAMIC:
4869 	  if (dynamic_addr)
4870 	    error (_("more than one dynamic segment\n"));
4871 
4872 	  /* By default, assume that the .dynamic section is the first
4873 	     section in the DYNAMIC segment.  */
4874 	  dynamic_addr = segment->p_offset;
4875 	  dynamic_size = segment->p_filesz;
4876 	  /* PR binutils/17512: Avoid corrupt dynamic section info in the segment.  */
4877 	  if (dynamic_addr + dynamic_size >= current_file_size)
4878 	    {
4879 	      error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4880 	      dynamic_addr = dynamic_size = 0;
4881 	    }
4882 
4883 	  /* Try to locate the .dynamic section. If there is
4884 	     a section header table, we can easily locate it.  */
4885 	  if (section_headers != NULL)
4886 	    {
4887 	      Elf_Internal_Shdr * sec;
4888 
4889 	      sec = find_section (".dynamic");
4890 	      if (sec == NULL || sec->sh_size == 0)
4891 		{
4892                   /* A corresponding .dynamic section is expected, but on
4893                      IA-64/OpenVMS it is OK for it to be missing.  */
4894                   if (!is_ia64_vms ())
4895                     error (_("no .dynamic section in the dynamic segment\n"));
4896 		  break;
4897 		}
4898 
4899 	      if (sec->sh_type == SHT_NOBITS)
4900 		{
4901 		  dynamic_size = 0;
4902 		  break;
4903 		}
4904 
4905 	      dynamic_addr = sec->sh_offset;
4906 	      dynamic_size = sec->sh_size;
4907 
4908 	      if (dynamic_addr < segment->p_offset
4909 		  || dynamic_addr > segment->p_offset + segment->p_filesz)
4910 		warn (_("the .dynamic section is not contained"
4911 			" within the dynamic segment\n"));
4912 	      else if (dynamic_addr > segment->p_offset)
4913 		warn (_("the .dynamic section is not the first section"
4914 			" in the dynamic segment.\n"));
4915 	    }
4916 	  break;
4917 
4918 	case PT_INTERP:
4919 	  if (fseek (file, archive_file_offset + (long) segment->p_offset,
4920 		     SEEK_SET))
4921 	    error (_("Unable to find program interpreter name\n"));
4922 	  else
4923 	    {
4924 	      char fmt [32];
4925 	      int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
4926 
4927 	      if (ret >= (int) sizeof (fmt) || ret < 0)
4928 		error (_("Internal error: failed to create format string to display program interpreter\n"));
4929 
4930 	      program_interpreter[0] = 0;
4931 	      if (fscanf (file, fmt, program_interpreter) <= 0)
4932 		error (_("Unable to read program interpreter name\n"));
4933 
4934 	      if (do_segments)
4935 		printf (_("      [Requesting program interpreter: %s]\n"),
4936 		    program_interpreter);
4937 	    }
4938 	  break;
4939 	}
4940     }
4941 
4942   if (do_segments && section_headers != NULL && string_table != NULL)
4943     {
4944       printf (_("\n Section to Segment mapping:\n"));
4945       printf (_("  Segment Sections...\n"));
4946 
4947       for (i = 0; i < elf_header.e_phnum; i++)
4948 	{
4949 	  unsigned int j;
4950 	  Elf_Internal_Shdr * section;
4951 
4952 	  segment = program_headers + i;
4953 	  section = section_headers + 1;
4954 
4955 	  printf ("   %2.2d     ", i);
4956 
4957 	  for (j = 1; j < elf_header.e_shnum; j++, section++)
4958 	    {
4959 	      if (!ELF_TBSS_SPECIAL (section, segment)
4960 		  && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
4961 		printf ("%s ", printable_section_name (section));
4962 	    }
4963 
4964 	  putc ('\n',stdout);
4965 	}
4966     }
4967 
4968   return 1;
4969 }
4970 
4971 
4972 /* Find the file offset corresponding to VMA by using the program headers.  */
4973 
4974 static long
4975 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
4976 {
4977   Elf_Internal_Phdr * seg;
4978 
4979   if (! get_program_headers (file))
4980     {
4981       warn (_("Cannot interpret virtual addresses without program headers.\n"));
4982       return (long) vma;
4983     }
4984 
4985   for (seg = program_headers;
4986        seg < program_headers + elf_header.e_phnum;
4987        ++seg)
4988     {
4989       if (seg->p_type != PT_LOAD)
4990 	continue;
4991 
4992       if (vma >= (seg->p_vaddr & -seg->p_align)
4993 	  && vma + size <= seg->p_vaddr + seg->p_filesz)
4994 	return vma - seg->p_vaddr + seg->p_offset;
4995     }
4996 
4997   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
4998 	(unsigned long) vma);
4999   return (long) vma;
5000 }
5001 
5002 
5003 /* Allocate memory and load the sections headers into the global pointer
5004    SECTION_HEADERS.  If PROBE is true, this is just a probe and we do not
5005    generate any error messages if the load fails.  */
5006 
5007 static bfd_boolean
5008 get_32bit_section_headers (FILE * file, bfd_boolean probe)
5009 {
5010   Elf32_External_Shdr * shdrs;
5011   Elf_Internal_Shdr *   internal;
5012   unsigned int i;
5013   unsigned int size = elf_header.e_shentsize;
5014   unsigned int num = probe ? 1 : elf_header.e_shnum;
5015 
5016   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5017   if (size == 0 || num == 0)
5018     return FALSE;
5019   if (size < sizeof * shdrs)
5020     {
5021       if (! probe)
5022 	error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5023       return FALSE;
5024     }
5025   if (!probe && size > sizeof * shdrs)
5026     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5027 
5028   shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
5029                                             size, num,
5030 					    probe ? NULL : _("section headers"));
5031   if (shdrs == NULL)
5032     return FALSE;
5033 
5034   if (section_headers != NULL)
5035     free (section_headers);
5036   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5037                                                    sizeof (Elf_Internal_Shdr));
5038   if (section_headers == NULL)
5039     {
5040       if (!probe)
5041 	error (_("Out of memory reading %u section headers\n"), num);
5042       return FALSE;
5043     }
5044 
5045   for (i = 0, internal = section_headers;
5046        i < num;
5047        i++, internal++)
5048     {
5049       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5050       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5051       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5052       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5053       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5054       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5055       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5056       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5057       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5058       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5059       if (!probe && internal->sh_link > num)
5060 	warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5061       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5062 	warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5063     }
5064 
5065   free (shdrs);
5066   return TRUE;
5067 }
5068 
5069 static bfd_boolean
5070 get_64bit_section_headers (FILE * file, bfd_boolean probe)
5071 {
5072   Elf64_External_Shdr * shdrs;
5073   Elf_Internal_Shdr *   internal;
5074   unsigned int i;
5075   unsigned int size = elf_header.e_shentsize;
5076   unsigned int num = probe ? 1 : elf_header.e_shnum;
5077 
5078   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5079   if (size == 0 || num == 0)
5080     return FALSE;
5081   if (size < sizeof * shdrs)
5082     {
5083       if (! probe)
5084 	error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5085       return FALSE;
5086     }
5087   if (! probe && size > sizeof * shdrs)
5088     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5089 
5090   shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
5091                                             size, num,
5092 					    probe ? NULL : _("section headers"));
5093   if (shdrs == NULL)
5094     return FALSE;
5095 
5096   if (section_headers != NULL)
5097     free (section_headers);
5098   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5099                                                    sizeof (Elf_Internal_Shdr));
5100   if (section_headers == NULL)
5101     {
5102       if (! probe)
5103 	error (_("Out of memory reading %u section headers\n"), num);
5104       return FALSE;
5105     }
5106 
5107   for (i = 0, internal = section_headers;
5108        i < num;
5109        i++, internal++)
5110     {
5111       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5112       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5113       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5114       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5115       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5116       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5117       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5118       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5119       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5120       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5121       if (!probe && internal->sh_link > num)
5122 	warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5123       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5124 	warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5125     }
5126 
5127   free (shdrs);
5128   return TRUE;
5129 }
5130 
5131 static Elf_Internal_Sym *
5132 get_32bit_elf_symbols (FILE * file,
5133 		       Elf_Internal_Shdr * section,
5134 		       unsigned long * num_syms_return)
5135 {
5136   unsigned long number = 0;
5137   Elf32_External_Sym * esyms = NULL;
5138   Elf_External_Sym_Shndx * shndx = NULL;
5139   Elf_Internal_Sym * isyms = NULL;
5140   Elf_Internal_Sym * psym;
5141   unsigned int j;
5142 
5143   if (section->sh_size == 0)
5144     {
5145       if (num_syms_return != NULL)
5146 	* num_syms_return = 0;
5147       return NULL;
5148     }
5149 
5150   /* Run some sanity checks first.  */
5151   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5152     {
5153       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5154 	     printable_section_name (section), (unsigned long) section->sh_entsize);
5155       goto exit_point;
5156     }
5157 
5158   if (section->sh_size > current_file_size)
5159     {
5160       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5161 	     printable_section_name (section), (unsigned long) section->sh_size);
5162       goto exit_point;
5163     }
5164 
5165   number = section->sh_size / section->sh_entsize;
5166 
5167   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5168     {
5169       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5170 	     (unsigned long) section->sh_size,
5171 	     printable_section_name (section),
5172 	     (unsigned long) section->sh_entsize);
5173       goto exit_point;
5174     }
5175 
5176   esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5177                                            section->sh_size, _("symbols"));
5178   if (esyms == NULL)
5179     goto exit_point;
5180 
5181   {
5182     elf_section_list * entry;
5183 
5184     shndx = NULL;
5185     for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5186       if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5187 	{
5188 	  shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5189 						       entry->hdr->sh_offset,
5190 						       1, entry->hdr->sh_size,
5191 						       _("symbol table section indicies"));
5192 	  if (shndx == NULL)
5193 	    goto exit_point;
5194 	  /* PR17531: file: heap-buffer-overflow */
5195 	  else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5196 	    {
5197 	      error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5198 		     printable_section_name (entry->hdr),
5199 		     (unsigned long) entry->hdr->sh_size,
5200 		     (unsigned long) section->sh_size);
5201 	      goto exit_point;
5202 	    }
5203 	}
5204   }
5205 
5206   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5207 
5208   if (isyms == NULL)
5209     {
5210       error (_("Out of memory reading %lu symbols\n"),
5211 	     (unsigned long) number);
5212       goto exit_point;
5213     }
5214 
5215   for (j = 0, psym = isyms; j < number; j++, psym++)
5216     {
5217       psym->st_name  = BYTE_GET (esyms[j].st_name);
5218       psym->st_value = BYTE_GET (esyms[j].st_value);
5219       psym->st_size  = BYTE_GET (esyms[j].st_size);
5220       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5221       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5222 	psym->st_shndx
5223 	  = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5224       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5225 	psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5226       psym->st_info  = BYTE_GET (esyms[j].st_info);
5227       psym->st_other = BYTE_GET (esyms[j].st_other);
5228     }
5229 
5230  exit_point:
5231   if (shndx != NULL)
5232     free (shndx);
5233   if (esyms != NULL)
5234     free (esyms);
5235 
5236   if (num_syms_return != NULL)
5237     * num_syms_return = isyms == NULL ? 0 : number;
5238 
5239   return isyms;
5240 }
5241 
5242 static Elf_Internal_Sym *
5243 get_64bit_elf_symbols (FILE * file,
5244 		       Elf_Internal_Shdr * section,
5245 		       unsigned long * num_syms_return)
5246 {
5247   unsigned long number = 0;
5248   Elf64_External_Sym * esyms = NULL;
5249   Elf_External_Sym_Shndx * shndx = NULL;
5250   Elf_Internal_Sym * isyms = NULL;
5251   Elf_Internal_Sym * psym;
5252   unsigned int j;
5253 
5254   if (section->sh_size == 0)
5255     {
5256       if (num_syms_return != NULL)
5257 	* num_syms_return = 0;
5258       return NULL;
5259     }
5260 
5261   /* Run some sanity checks first.  */
5262   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5263     {
5264       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5265 	     printable_section_name (section),
5266 	     (unsigned long) section->sh_entsize);
5267       goto exit_point;
5268     }
5269 
5270   if (section->sh_size > current_file_size)
5271     {
5272       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5273 	     printable_section_name (section),
5274 	     (unsigned long) section->sh_size);
5275       goto exit_point;
5276     }
5277 
5278   number = section->sh_size / section->sh_entsize;
5279 
5280   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5281     {
5282       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5283 	     (unsigned long) section->sh_size,
5284 	     printable_section_name (section),
5285 	     (unsigned long) section->sh_entsize);
5286       goto exit_point;
5287     }
5288 
5289   esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5290                                            section->sh_size, _("symbols"));
5291   if (!esyms)
5292     goto exit_point;
5293 
5294   {
5295     elf_section_list * entry;
5296 
5297     shndx = NULL;
5298     for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5299       if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5300 	{
5301 	  shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5302 						       entry->hdr->sh_offset,
5303 						       1, entry->hdr->sh_size,
5304 						       _("symbol table section indicies"));
5305 	  if (shndx == NULL)
5306 	    goto exit_point;
5307 	  /* PR17531: file: heap-buffer-overflow */
5308 	  else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5309 	    {
5310 	      error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5311 		     printable_section_name (entry->hdr),
5312 		     (unsigned long) entry->hdr->sh_size,
5313 		     (unsigned long) section->sh_size);
5314 	      goto exit_point;
5315 	    }
5316 	}
5317   }
5318 
5319   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5320 
5321   if (isyms == NULL)
5322     {
5323       error (_("Out of memory reading %lu symbols\n"),
5324 	     (unsigned long) number);
5325       goto exit_point;
5326     }
5327 
5328   for (j = 0, psym = isyms; j < number; j++, psym++)
5329     {
5330       psym->st_name  = BYTE_GET (esyms[j].st_name);
5331       psym->st_info  = BYTE_GET (esyms[j].st_info);
5332       psym->st_other = BYTE_GET (esyms[j].st_other);
5333       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5334 
5335       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5336 	psym->st_shndx
5337 	  = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5338       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5339 	psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5340 
5341       psym->st_value = BYTE_GET (esyms[j].st_value);
5342       psym->st_size  = BYTE_GET (esyms[j].st_size);
5343     }
5344 
5345  exit_point:
5346   if (shndx != NULL)
5347     free (shndx);
5348   if (esyms != NULL)
5349     free (esyms);
5350 
5351   if (num_syms_return != NULL)
5352     * num_syms_return = isyms == NULL ? 0 : number;
5353 
5354   return isyms;
5355 }
5356 
5357 static const char *
5358 get_elf_section_flags (bfd_vma sh_flags)
5359 {
5360   static char buff[1024];
5361   char * p = buff;
5362   int field_size = is_32bit_elf ? 8 : 16;
5363   int sindex;
5364   int size = sizeof (buff) - (field_size + 4 + 1);
5365   bfd_vma os_flags = 0;
5366   bfd_vma proc_flags = 0;
5367   bfd_vma unknown_flags = 0;
5368   static const struct
5369     {
5370       const char * str;
5371       int len;
5372     }
5373   flags [] =
5374     {
5375       /*  0 */ { STRING_COMMA_LEN ("WRITE") },
5376       /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
5377       /*  2 */ { STRING_COMMA_LEN ("EXEC") },
5378       /*  3 */ { STRING_COMMA_LEN ("MERGE") },
5379       /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
5380       /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
5381       /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5382       /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5383       /*  8 */ { STRING_COMMA_LEN ("GROUP") },
5384       /*  9 */ { STRING_COMMA_LEN ("TLS") },
5385       /* IA-64 specific.  */
5386       /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5387       /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5388       /* IA-64 OpenVMS specific.  */
5389       /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5390       /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5391       /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5392       /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5393       /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5394       /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5395       /* Generic.  */
5396       /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5397       /* SPARC specific.  */
5398       /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5399       /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5400       /* ARM specific.  */
5401       /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5402       /* 22 */ { STRING_COMMA_LEN ("ARM_NOREAD") },
5403       /* 23 */ { STRING_COMMA_LEN ("COMDEF") }
5404     };
5405 
5406   if (do_section_details)
5407     {
5408       sprintf (buff, "[%*.*lx]: ",
5409 	       field_size, field_size, (unsigned long) sh_flags);
5410       p += field_size + 4;
5411     }
5412 
5413   while (sh_flags)
5414     {
5415       bfd_vma flag;
5416 
5417       flag = sh_flags & - sh_flags;
5418       sh_flags &= ~ flag;
5419 
5420       if (do_section_details)
5421 	{
5422 	  switch (flag)
5423 	    {
5424 	    case SHF_WRITE:		sindex = 0; break;
5425 	    case SHF_ALLOC:		sindex = 1; break;
5426 	    case SHF_EXECINSTR:		sindex = 2; break;
5427 	    case SHF_MERGE:		sindex = 3; break;
5428 	    case SHF_STRINGS:		sindex = 4; break;
5429 	    case SHF_INFO_LINK:		sindex = 5; break;
5430 	    case SHF_LINK_ORDER:	sindex = 6; break;
5431 	    case SHF_OS_NONCONFORMING:	sindex = 7; break;
5432 	    case SHF_GROUP:		sindex = 8; break;
5433 	    case SHF_TLS:		sindex = 9; break;
5434 	    case SHF_EXCLUDE:		sindex = 18; break;
5435 	    case SHF_COMPRESSED:	sindex = 20; break;
5436 
5437 	    default:
5438 	      sindex = -1;
5439 	      switch (elf_header.e_machine)
5440 		{
5441 		case EM_IA_64:
5442 		  if (flag == SHF_IA_64_SHORT)
5443 		    sindex = 10;
5444 		  else if (flag == SHF_IA_64_NORECOV)
5445 		    sindex = 11;
5446 #ifdef BFD64
5447 		  else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5448 		    switch (flag)
5449 		      {
5450 		      case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
5451 		      case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
5452 		      case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
5453 		      case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
5454 		      case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5455 		      case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
5456 		      default:                        break;
5457 		      }
5458 #endif
5459 		  break;
5460 
5461 		case EM_386:
5462 		case EM_IAMCU:
5463 		case EM_X86_64:
5464 		case EM_L1OM:
5465 		case EM_K1OM:
5466 		case EM_OLD_SPARCV9:
5467 		case EM_SPARC32PLUS:
5468 		case EM_SPARCV9:
5469 		case EM_SPARC:
5470 		  if (flag == SHF_ORDERED)
5471 		    sindex = 19;
5472 		  break;
5473 
5474 		case EM_ARM:
5475 		  switch (flag)
5476 		    {
5477 		    case SHF_ENTRYSECT: sindex = 21; break;
5478 		    case SHF_ARM_NOREAD: sindex = 22; break;
5479 		    case SHF_COMDEF: sindex = 23; break;
5480 		    default: break;
5481 		    }
5482 		  break;
5483 
5484 		default:
5485 		  break;
5486 		}
5487 	    }
5488 
5489 	  if (sindex != -1)
5490 	    {
5491 	      if (p != buff + field_size + 4)
5492 		{
5493 		  if (size < (10 + 2))
5494 		    {
5495 		      warn (_("Internal error: not enough buffer room for section flag info"));
5496 		      return _("<unknown>");
5497 		    }
5498 		  size -= 2;
5499 		  *p++ = ',';
5500 		  *p++ = ' ';
5501 		}
5502 
5503 	      size -= flags [sindex].len;
5504 	      p = stpcpy (p, flags [sindex].str);
5505 	    }
5506 	  else if (flag & SHF_MASKOS)
5507 	    os_flags |= flag;
5508 	  else if (flag & SHF_MASKPROC)
5509 	    proc_flags |= flag;
5510 	  else
5511 	    unknown_flags |= flag;
5512 	}
5513       else
5514 	{
5515 	  switch (flag)
5516 	    {
5517 	    case SHF_WRITE:		*p = 'W'; break;
5518 	    case SHF_ALLOC:		*p = 'A'; break;
5519 	    case SHF_EXECINSTR:		*p = 'X'; break;
5520 	    case SHF_MERGE:		*p = 'M'; break;
5521 	    case SHF_STRINGS:		*p = 'S'; break;
5522 	    case SHF_INFO_LINK:		*p = 'I'; break;
5523 	    case SHF_LINK_ORDER:	*p = 'L'; break;
5524 	    case SHF_OS_NONCONFORMING:	*p = 'O'; break;
5525 	    case SHF_GROUP:		*p = 'G'; break;
5526 	    case SHF_TLS:		*p = 'T'; break;
5527 	    case SHF_EXCLUDE:		*p = 'E'; break;
5528 	    case SHF_COMPRESSED:	*p = 'C'; break;
5529 
5530 	    default:
5531 	      if ((elf_header.e_machine == EM_X86_64
5532 		   || elf_header.e_machine == EM_L1OM
5533 		   || elf_header.e_machine == EM_K1OM)
5534 		  && flag == SHF_X86_64_LARGE)
5535 		*p = 'l';
5536 	      else if (elf_header.e_machine == EM_ARM
5537 		       && flag == SHF_ARM_NOREAD)
5538 		  *p = 'y';
5539 	      else if (flag & SHF_MASKOS)
5540 		{
5541 		  *p = 'o';
5542 		  sh_flags &= ~ SHF_MASKOS;
5543 		}
5544 	      else if (flag & SHF_MASKPROC)
5545 		{
5546 		  *p = 'p';
5547 		  sh_flags &= ~ SHF_MASKPROC;
5548 		}
5549 	      else
5550 		*p = 'x';
5551 	      break;
5552 	    }
5553 	  p++;
5554 	}
5555     }
5556 
5557   if (do_section_details)
5558     {
5559       if (os_flags)
5560 	{
5561 	  size -= 5 + field_size;
5562 	  if (p != buff + field_size + 4)
5563 	    {
5564 	      if (size < (2 + 1))
5565 		{
5566 		  warn (_("Internal error: not enough buffer room for section flag info"));
5567 		  return _("<unknown>");
5568 		}
5569 	      size -= 2;
5570 	      *p++ = ',';
5571 	      *p++ = ' ';
5572 	    }
5573 	  sprintf (p, "OS (%*.*lx)", field_size, field_size,
5574 		   (unsigned long) os_flags);
5575 	  p += 5 + field_size;
5576 	}
5577       if (proc_flags)
5578 	{
5579 	  size -= 7 + field_size;
5580 	  if (p != buff + field_size + 4)
5581 	    {
5582 	      if (size < (2 + 1))
5583 		{
5584 		  warn (_("Internal error: not enough buffer room for section flag info"));
5585 		  return _("<unknown>");
5586 		}
5587 	      size -= 2;
5588 	      *p++ = ',';
5589 	      *p++ = ' ';
5590 	    }
5591 	  sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5592 		   (unsigned long) proc_flags);
5593 	  p += 7 + field_size;
5594 	}
5595       if (unknown_flags)
5596 	{
5597 	  size -= 10 + field_size;
5598 	  if (p != buff + field_size + 4)
5599 	    {
5600 	      if (size < (2 + 1))
5601 		{
5602 		  warn (_("Internal error: not enough buffer room for section flag info"));
5603 		  return _("<unknown>");
5604 		}
5605 	      size -= 2;
5606 	      *p++ = ',';
5607 	      *p++ = ' ';
5608 	    }
5609 	  sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5610 		   (unsigned long) unknown_flags);
5611 	  p += 10 + field_size;
5612 	}
5613     }
5614 
5615   *p = '\0';
5616   return buff;
5617 }
5618 
5619 static unsigned int
5620 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf)
5621 {
5622   if (is_32bit_elf)
5623     {
5624       Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5625       chdr->ch_type = BYTE_GET (echdr->ch_type);
5626       chdr->ch_size = BYTE_GET (echdr->ch_size);
5627       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5628       return sizeof (*echdr);
5629     }
5630   else
5631     {
5632       Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
5633       chdr->ch_type = BYTE_GET (echdr->ch_type);
5634       chdr->ch_size = BYTE_GET (echdr->ch_size);
5635       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5636       return sizeof (*echdr);
5637     }
5638 }
5639 
5640 static int
5641 process_section_headers (FILE * file)
5642 {
5643   Elf_Internal_Shdr * section;
5644   unsigned int i;
5645 
5646   section_headers = NULL;
5647 
5648   if (elf_header.e_shnum == 0)
5649     {
5650       /* PR binutils/12467.  */
5651       if (elf_header.e_shoff != 0)
5652 	warn (_("possibly corrupt ELF file header - it has a non-zero"
5653 		" section header offset, but no section headers\n"));
5654       else if (do_sections)
5655 	printf (_("\nThere are no sections in this file.\n"));
5656 
5657       return 1;
5658     }
5659 
5660   if (do_sections && !do_header)
5661     printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5662 	    elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5663 
5664   if (is_32bit_elf)
5665     {
5666       if (! get_32bit_section_headers (file, FALSE))
5667 	return 0;
5668     }
5669   else if (! get_64bit_section_headers (file, FALSE))
5670     return 0;
5671 
5672   /* Read in the string table, so that we have names to display.  */
5673   if (elf_header.e_shstrndx != SHN_UNDEF
5674        && elf_header.e_shstrndx < elf_header.e_shnum)
5675     {
5676       section = section_headers + elf_header.e_shstrndx;
5677 
5678       if (section->sh_size != 0)
5679 	{
5680 	  string_table = (char *) get_data (NULL, file, section->sh_offset,
5681                                             1, section->sh_size,
5682                                             _("string table"));
5683 
5684 	  string_table_length = string_table != NULL ? section->sh_size : 0;
5685 	}
5686     }
5687 
5688   /* Scan the sections for the dynamic symbol table
5689      and dynamic string table and debug sections.  */
5690   dynamic_symbols = NULL;
5691   dynamic_strings = NULL;
5692   dynamic_syminfo = NULL;
5693   symtab_shndx_list = NULL;
5694 
5695   eh_addr_size = is_32bit_elf ? 4 : 8;
5696   switch (elf_header.e_machine)
5697     {
5698     case EM_MIPS:
5699     case EM_MIPS_RS3_LE:
5700       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5701 	 FDE addresses.  However, the ABI also has a semi-official ILP32
5702 	 variant for which the normal FDE address size rules apply.
5703 
5704 	 GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5705 	 section, where XX is the size of longs in bits.  Unfortunately,
5706 	 earlier compilers provided no way of distinguishing ILP32 objects
5707 	 from LP64 objects, so if there's any doubt, we should assume that
5708 	 the official LP64 form is being used.  */
5709       if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5710 	  && find_section (".gcc_compiled_long32") == NULL)
5711 	eh_addr_size = 8;
5712       break;
5713 
5714     case EM_H8_300:
5715     case EM_H8_300H:
5716       switch (elf_header.e_flags & EF_H8_MACH)
5717 	{
5718 	case E_H8_MACH_H8300:
5719 	case E_H8_MACH_H8300HN:
5720 	case E_H8_MACH_H8300SN:
5721 	case E_H8_MACH_H8300SXN:
5722 	  eh_addr_size = 2;
5723 	  break;
5724 	case E_H8_MACH_H8300H:
5725 	case E_H8_MACH_H8300S:
5726 	case E_H8_MACH_H8300SX:
5727 	  eh_addr_size = 4;
5728 	  break;
5729 	}
5730       break;
5731 
5732     case EM_M32C_OLD:
5733     case EM_M32C:
5734       switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5735 	{
5736 	case EF_M32C_CPU_M16C:
5737 	  eh_addr_size = 2;
5738 	  break;
5739 	}
5740       break;
5741     }
5742 
5743 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64)		\
5744   do									\
5745     {									\
5746       bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64;	\
5747       if (section->sh_entsize != expected_entsize)			\
5748 	{								\
5749 	  char buf[40];							\
5750 	  sprintf_vma (buf, section->sh_entsize);			\
5751 	  /* Note: coded this way so that there is a single string for  \
5752 	     translation.  */ \
5753 	  error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5754 	  error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5755 		   (unsigned) expected_entsize);			\
5756 	  section->sh_entsize = expected_entsize;			\
5757 	}								\
5758     }									\
5759   while (0)
5760 
5761 #define CHECK_ENTSIZE(section, i, type)					\
5762   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),	    \
5763 			sizeof (Elf64_External_##type))
5764 
5765   for (i = 0, section = section_headers;
5766        i < elf_header.e_shnum;
5767        i++, section++)
5768     {
5769       char * name = SECTION_NAME (section);
5770 
5771       if (section->sh_type == SHT_DYNSYM)
5772 	{
5773 	  if (dynamic_symbols != NULL)
5774 	    {
5775 	      error (_("File contains multiple dynamic symbol tables\n"));
5776 	      continue;
5777 	    }
5778 
5779 	  CHECK_ENTSIZE (section, i, Sym);
5780 	  dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
5781 	}
5782       else if (section->sh_type == SHT_STRTAB
5783 	       && streq (name, ".dynstr"))
5784 	{
5785 	  if (dynamic_strings != NULL)
5786 	    {
5787 	      error (_("File contains multiple dynamic string tables\n"));
5788 	      continue;
5789 	    }
5790 
5791 	  dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5792                                                1, section->sh_size,
5793                                                _("dynamic strings"));
5794 	  dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
5795 	}
5796       else if (section->sh_type == SHT_SYMTAB_SHNDX)
5797 	{
5798 	  elf_section_list * entry = xmalloc (sizeof * entry);
5799 	  entry->hdr = section;
5800 	  entry->next = symtab_shndx_list;
5801 	  symtab_shndx_list = entry;
5802 	}
5803       else if (section->sh_type == SHT_SYMTAB)
5804 	CHECK_ENTSIZE (section, i, Sym);
5805       else if (section->sh_type == SHT_GROUP)
5806 	CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5807       else if (section->sh_type == SHT_REL)
5808 	CHECK_ENTSIZE (section, i, Rel);
5809       else if (section->sh_type == SHT_RELA)
5810 	CHECK_ENTSIZE (section, i, Rela);
5811       else if ((do_debugging || do_debug_info || do_debug_abbrevs
5812 		|| do_debug_lines || do_debug_pubnames || do_debug_pubtypes
5813 		|| do_debug_aranges || do_debug_frames || do_debug_macinfo
5814 		|| do_debug_str || do_debug_loc || do_debug_ranges
5815 		|| do_debug_addr || do_debug_cu_index)
5816 	       && (const_strneq (name, ".debug_")
5817                    || const_strneq (name, ".zdebug_")))
5818 	{
5819           if (name[1] == 'z')
5820             name += sizeof (".zdebug_") - 1;
5821           else
5822             name += sizeof (".debug_") - 1;
5823 
5824 	  if (do_debugging
5825 	      || (do_debug_info     && const_strneq (name, "info"))
5826 	      || (do_debug_info     && const_strneq (name, "types"))
5827 	      || (do_debug_abbrevs  && const_strneq (name, "abbrev"))
5828 	      || (do_debug_lines    && strcmp (name, "line") == 0)
5829 	      || (do_debug_lines    && const_strneq (name, "line."))
5830 	      || (do_debug_pubnames && const_strneq (name, "pubnames"))
5831 	      || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
5832 	      || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5833 	      || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
5834 	      || (do_debug_aranges  && const_strneq (name, "aranges"))
5835 	      || (do_debug_ranges   && const_strneq (name, "ranges"))
5836 	      || (do_debug_frames   && const_strneq (name, "frame"))
5837 	      || (do_debug_macinfo  && const_strneq (name, "macinfo"))
5838 	      || (do_debug_macinfo  && const_strneq (name, "macro"))
5839 	      || (do_debug_str      && const_strneq (name, "str"))
5840 	      || (do_debug_loc      && const_strneq (name, "loc"))
5841 	      || (do_debug_addr     && const_strneq (name, "addr"))
5842 	      || (do_debug_cu_index && const_strneq (name, "cu_index"))
5843 	      || (do_debug_cu_index && const_strneq (name, "tu_index"))
5844 	      )
5845 	    request_dump_bynumber (i, DEBUG_DUMP);
5846 	}
5847       /* Linkonce section to be combined with .debug_info at link time.  */
5848       else if ((do_debugging || do_debug_info)
5849 	       && const_strneq (name, ".gnu.linkonce.wi."))
5850 	request_dump_bynumber (i, DEBUG_DUMP);
5851       else if (do_debug_frames && streq (name, ".eh_frame"))
5852 	request_dump_bynumber (i, DEBUG_DUMP);
5853       else if (do_gdb_index && streq (name, ".gdb_index"))
5854 	request_dump_bynumber (i, DEBUG_DUMP);
5855       /* Trace sections for Itanium VMS.  */
5856       else if ((do_debugging || do_trace_info || do_trace_abbrevs
5857                 || do_trace_aranges)
5858 	       && const_strneq (name, ".trace_"))
5859 	{
5860           name += sizeof (".trace_") - 1;
5861 
5862 	  if (do_debugging
5863 	      || (do_trace_info     && streq (name, "info"))
5864 	      || (do_trace_abbrevs  && streq (name, "abbrev"))
5865 	      || (do_trace_aranges  && streq (name, "aranges"))
5866 	      )
5867 	    request_dump_bynumber (i, DEBUG_DUMP);
5868 	}
5869     }
5870 
5871   if (! do_sections)
5872     return 1;
5873 
5874   if (elf_header.e_shnum > 1)
5875     printf (_("\nSection Headers:\n"));
5876   else
5877     printf (_("\nSection Header:\n"));
5878 
5879   if (is_32bit_elf)
5880     {
5881       if (do_section_details)
5882 	{
5883 	  printf (_("  [Nr] Name\n"));
5884 	  printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
5885 	}
5886       else
5887 	printf
5888 	  (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
5889     }
5890   else if (do_wide)
5891     {
5892       if (do_section_details)
5893 	{
5894 	  printf (_("  [Nr] Name\n"));
5895 	  printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
5896 	}
5897       else
5898 	printf
5899 	  (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
5900     }
5901   else
5902     {
5903       if (do_section_details)
5904 	{
5905 	  printf (_("  [Nr] Name\n"));
5906 	  printf (_("       Type              Address          Offset            Link\n"));
5907 	  printf (_("       Size              EntSize          Info              Align\n"));
5908 	}
5909       else
5910 	{
5911 	  printf (_("  [Nr] Name              Type             Address           Offset\n"));
5912 	  printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
5913 	}
5914     }
5915 
5916   if (do_section_details)
5917     printf (_("       Flags\n"));
5918 
5919   for (i = 0, section = section_headers;
5920        i < elf_header.e_shnum;
5921        i++, section++)
5922     {
5923       printf ("  [%2u] ", i);
5924       if (do_section_details)
5925 	printf ("%s\n      ", printable_section_name (section));
5926       else
5927 	print_symbol (-17, SECTION_NAME (section));
5928 
5929       printf (do_wide ? " %-15s " : " %-15.15s ",
5930 	      get_section_type_name (section->sh_type));
5931 
5932       if (is_32bit_elf)
5933 	{
5934 	  const char * link_too_big = NULL;
5935 
5936 	  print_vma (section->sh_addr, LONG_HEX);
5937 
5938 	  printf ( " %6.6lx %6.6lx %2.2lx",
5939 		   (unsigned long) section->sh_offset,
5940 		   (unsigned long) section->sh_size,
5941 		   (unsigned long) section->sh_entsize);
5942 
5943 	  if (do_section_details)
5944 	    fputs ("  ", stdout);
5945 	  else
5946 	    printf (" %3s ", get_elf_section_flags (section->sh_flags));
5947 
5948 	  if (section->sh_link >= elf_header.e_shnum)
5949 	    {
5950 	      link_too_big = "";
5951 	      /* The sh_link value is out of range.  Normally this indicates
5952 		 an error but it can have special values in Solaris binaries.  */
5953 	      switch (elf_header.e_machine)
5954 		{
5955 		case EM_386:
5956 		case EM_IAMCU:
5957 		case EM_X86_64:
5958 		case EM_L1OM:
5959 		case EM_K1OM:
5960 		case EM_OLD_SPARCV9:
5961 		case EM_SPARC32PLUS:
5962 		case EM_SPARCV9:
5963 		case EM_SPARC:
5964 		  if (section->sh_link == (SHN_BEFORE & 0xffff))
5965 		    link_too_big = "BEFORE";
5966 		  else if (section->sh_link == (SHN_AFTER & 0xffff))
5967 		    link_too_big = "AFTER";
5968 		  break;
5969 		default:
5970 		  break;
5971 		}
5972 	    }
5973 
5974 	  if (do_section_details)
5975 	    {
5976 	      if (link_too_big != NULL && * link_too_big)
5977 		printf ("<%s> ", link_too_big);
5978 	      else
5979 		printf ("%2u ", section->sh_link);
5980 	      printf ("%3u %2lu\n", section->sh_info,
5981 		      (unsigned long) section->sh_addralign);
5982 	    }
5983 	  else
5984 	    printf ("%2u %3u %2lu\n",
5985 		    section->sh_link,
5986 		    section->sh_info,
5987 		    (unsigned long) section->sh_addralign);
5988 
5989 	  if (link_too_big && ! * link_too_big)
5990 	    warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
5991 		  i, section->sh_link);
5992 	}
5993       else if (do_wide)
5994 	{
5995 	  print_vma (section->sh_addr, LONG_HEX);
5996 
5997 	  if ((long) section->sh_offset == section->sh_offset)
5998 	    printf (" %6.6lx", (unsigned long) section->sh_offset);
5999 	  else
6000 	    {
6001 	      putchar (' ');
6002 	      print_vma (section->sh_offset, LONG_HEX);
6003 	    }
6004 
6005 	  if ((unsigned long) section->sh_size == section->sh_size)
6006 	    printf (" %6.6lx", (unsigned long) section->sh_size);
6007 	  else
6008 	    {
6009 	      putchar (' ');
6010 	      print_vma (section->sh_size, LONG_HEX);
6011 	    }
6012 
6013 	  if ((unsigned long) section->sh_entsize == section->sh_entsize)
6014 	    printf (" %2.2lx", (unsigned long) section->sh_entsize);
6015 	  else
6016 	    {
6017 	      putchar (' ');
6018 	      print_vma (section->sh_entsize, LONG_HEX);
6019 	    }
6020 
6021 	  if (do_section_details)
6022 	    fputs ("  ", stdout);
6023 	  else
6024 	    printf (" %3s ", get_elf_section_flags (section->sh_flags));
6025 
6026 	  printf ("%2u %3u ", section->sh_link, section->sh_info);
6027 
6028 	  if ((unsigned long) section->sh_addralign == section->sh_addralign)
6029 	    printf ("%2lu\n", (unsigned long) section->sh_addralign);
6030 	  else
6031 	    {
6032 	      print_vma (section->sh_addralign, DEC);
6033 	      putchar ('\n');
6034 	    }
6035 	}
6036       else if (do_section_details)
6037 	{
6038 	  printf ("       %-15.15s  ",
6039 		  get_section_type_name (section->sh_type));
6040 	  print_vma (section->sh_addr, LONG_HEX);
6041 	  if ((long) section->sh_offset == section->sh_offset)
6042 	    printf ("  %16.16lx", (unsigned long) section->sh_offset);
6043 	  else
6044 	    {
6045 	      printf ("  ");
6046 	      print_vma (section->sh_offset, LONG_HEX);
6047 	    }
6048 	  printf ("  %u\n       ", section->sh_link);
6049 	  print_vma (section->sh_size, LONG_HEX);
6050 	  putchar (' ');
6051 	  print_vma (section->sh_entsize, LONG_HEX);
6052 
6053 	  printf ("  %-16u  %lu\n",
6054 		  section->sh_info,
6055 		  (unsigned long) section->sh_addralign);
6056 	}
6057       else
6058 	{
6059 	  putchar (' ');
6060 	  print_vma (section->sh_addr, LONG_HEX);
6061 	  if ((long) section->sh_offset == section->sh_offset)
6062 	    printf ("  %8.8lx", (unsigned long) section->sh_offset);
6063 	  else
6064 	    {
6065 	      printf ("  ");
6066 	      print_vma (section->sh_offset, LONG_HEX);
6067 	    }
6068 	  printf ("\n       ");
6069 	  print_vma (section->sh_size, LONG_HEX);
6070 	  printf ("  ");
6071 	  print_vma (section->sh_entsize, LONG_HEX);
6072 
6073 	  printf (" %3s ", get_elf_section_flags (section->sh_flags));
6074 
6075 	  printf ("     %2u   %3u     %lu\n",
6076 		  section->sh_link,
6077 		  section->sh_info,
6078 		  (unsigned long) section->sh_addralign);
6079 	}
6080 
6081       if (do_section_details)
6082 	{
6083 	  printf ("       %s\n", get_elf_section_flags (section->sh_flags));
6084 	  if ((section->sh_flags & SHF_COMPRESSED) != 0)
6085 	    {
6086 	      /* Minimum section size is 12 bytes for 32-bit compression
6087 		 header + 12 bytes for compressed data header.  */
6088 	      unsigned char buf[24];
6089 	      assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6090 	      if (get_data (&buf, (FILE *) file, section->sh_offset, 1,
6091 			    sizeof (buf), _("compression header")))
6092 		{
6093 		  Elf_Internal_Chdr chdr;
6094 		  get_compression_header (&chdr, buf);
6095 		  if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6096 		    printf ("       ZLIB, ");
6097 		  else
6098 		    printf (_("       [<unknown>: 0x%x], "),
6099 			    chdr.ch_type);
6100 		  print_vma (chdr.ch_size, LONG_HEX);
6101 		  printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6102 		}
6103 	    }
6104 	}
6105     }
6106 
6107   if (!do_section_details)
6108     {
6109       /* The ordering of the letters shown here matches the ordering of the
6110 	 corresponding SHF_xxx values, and hence the order in which these
6111 	 letters will be displayed to the user.  */
6112       printf (_("Key to Flags:\n\
6113   W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6114   L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6115   C (compressed), x (unknown), o (OS specific), E (exclude),\n  "));
6116       if (elf_header.e_machine == EM_X86_64
6117 	  || elf_header.e_machine == EM_L1OM
6118 	  || elf_header.e_machine == EM_K1OM)
6119 	printf (_("l (large), "));
6120       else if (elf_header.e_machine == EM_ARM)
6121 	printf (_("y (noread), "));
6122       printf ("p (processor specific)\n");
6123     }
6124 
6125   return 1;
6126 }
6127 
6128 static const char *
6129 get_group_flags (unsigned int flags)
6130 {
6131   static char buff[32];
6132   switch (flags)
6133     {
6134     case 0:
6135       return "";
6136 
6137     case GRP_COMDAT:
6138       return "COMDAT ";
6139 
6140    default:
6141       snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
6142       break;
6143     }
6144   return buff;
6145 }
6146 
6147 static int
6148 process_section_groups (FILE * file)
6149 {
6150   Elf_Internal_Shdr * section;
6151   unsigned int i;
6152   struct group * group;
6153   Elf_Internal_Shdr * symtab_sec;
6154   Elf_Internal_Shdr * strtab_sec;
6155   Elf_Internal_Sym * symtab;
6156   unsigned long num_syms;
6157   char * strtab;
6158   size_t strtab_size;
6159 
6160   /* Don't process section groups unless needed.  */
6161   if (!do_unwind && !do_section_groups)
6162     return 1;
6163 
6164   if (elf_header.e_shnum == 0)
6165     {
6166       if (do_section_groups)
6167 	printf (_("\nThere are no sections to group in this file.\n"));
6168 
6169       return 1;
6170     }
6171 
6172   if (section_headers == NULL)
6173     {
6174       error (_("Section headers are not available!\n"));
6175       /* PR 13622: This can happen with a corrupt ELF header.  */
6176       return 0;
6177     }
6178 
6179   section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
6180                                                      sizeof (struct group *));
6181 
6182   if (section_headers_groups == NULL)
6183     {
6184       error (_("Out of memory reading %u section group headers\n"),
6185 	     elf_header.e_shnum);
6186       return 0;
6187     }
6188 
6189   /* Scan the sections for the group section.  */
6190   group_count = 0;
6191   for (i = 0, section = section_headers;
6192        i < elf_header.e_shnum;
6193        i++, section++)
6194     if (section->sh_type == SHT_GROUP)
6195       group_count++;
6196 
6197   if (group_count == 0)
6198     {
6199       if (do_section_groups)
6200 	printf (_("\nThere are no section groups in this file.\n"));
6201 
6202       return 1;
6203     }
6204 
6205   section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6206 
6207   if (section_groups == NULL)
6208     {
6209       error (_("Out of memory reading %lu groups\n"),
6210 	     (unsigned long) group_count);
6211       return 0;
6212     }
6213 
6214   symtab_sec = NULL;
6215   strtab_sec = NULL;
6216   symtab = NULL;
6217   num_syms = 0;
6218   strtab = NULL;
6219   strtab_size = 0;
6220   for (i = 0, section = section_headers, group = section_groups;
6221        i < elf_header.e_shnum;
6222        i++, section++)
6223     {
6224       if (section->sh_type == SHT_GROUP)
6225 	{
6226 	  const char * name = printable_section_name (section);
6227 	  const char * group_name;
6228 	  unsigned char * start;
6229 	  unsigned char * indices;
6230 	  unsigned int entry, j, size;
6231 	  Elf_Internal_Shdr * sec;
6232 	  Elf_Internal_Sym * sym;
6233 
6234 	  /* Get the symbol table.  */
6235 	  if (section->sh_link >= elf_header.e_shnum
6236 	      || ((sec = section_headers + section->sh_link)->sh_type
6237 		  != SHT_SYMTAB))
6238 	    {
6239 	      error (_("Bad sh_link in group section `%s'\n"), name);
6240 	      continue;
6241 	    }
6242 
6243 	  if (symtab_sec != sec)
6244 	    {
6245 	      symtab_sec = sec;
6246 	      if (symtab)
6247 		free (symtab);
6248 	      symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
6249 	    }
6250 
6251 	  if (symtab == NULL)
6252 	    {
6253 	      error (_("Corrupt header in group section `%s'\n"), name);
6254 	      continue;
6255 	    }
6256 
6257 	  if (section->sh_info >= num_syms)
6258 	    {
6259 	      error (_("Bad sh_info in group section `%s'\n"), name);
6260 	      continue;
6261 	    }
6262 
6263 	  sym = symtab + section->sh_info;
6264 
6265 	  if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6266 	    {
6267 	      if (sym->st_shndx == 0
6268 		  || sym->st_shndx >= elf_header.e_shnum)
6269 		{
6270 		  error (_("Bad sh_info in group section `%s'\n"), name);
6271 		  continue;
6272 		}
6273 
6274 	      group_name = SECTION_NAME (section_headers + sym->st_shndx);
6275 	      strtab_sec = NULL;
6276 	      if (strtab)
6277 		free (strtab);
6278 	      strtab = NULL;
6279 	      strtab_size = 0;
6280 	    }
6281 	  else
6282 	    {
6283 	      /* Get the string table.  */
6284 	      if (symtab_sec->sh_link >= elf_header.e_shnum)
6285 		{
6286 		  strtab_sec = NULL;
6287 		  if (strtab)
6288 		    free (strtab);
6289 		  strtab = NULL;
6290 		  strtab_size = 0;
6291 		}
6292 	      else if (strtab_sec
6293 		       != (sec = section_headers + symtab_sec->sh_link))
6294 		{
6295 		  strtab_sec = sec;
6296 		  if (strtab)
6297 		    free (strtab);
6298 
6299 		  strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
6300 					      1, strtab_sec->sh_size,
6301 					      _("string table"));
6302 		  strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6303 		}
6304 	      group_name = sym->st_name < strtab_size
6305 		? strtab + sym->st_name : _("<corrupt>");
6306 	    }
6307 
6308 	  /* PR 17531: file: loop.  */
6309 	  if (section->sh_entsize > section->sh_size)
6310 	    {
6311 	      error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6312 		     printable_section_name (section),
6313 		     (unsigned long) section->sh_entsize,
6314 		     (unsigned long) section->sh_size);
6315 	      break;
6316 	    }
6317 
6318 	  start = (unsigned char *) get_data (NULL, file, section->sh_offset,
6319                                               1, section->sh_size,
6320                                               _("section data"));
6321 	  if (start == NULL)
6322 	    continue;
6323 
6324 	  indices = start;
6325 	  size = (section->sh_size / section->sh_entsize) - 1;
6326 	  entry = byte_get (indices, 4);
6327 	  indices += 4;
6328 
6329 	  if (do_section_groups)
6330 	    {
6331 	      printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6332 		      get_group_flags (entry), i, name, group_name, size);
6333 
6334 	      printf (_("   [Index]    Name\n"));
6335 	    }
6336 
6337 	  group->group_index = i;
6338 
6339 	  for (j = 0; j < size; j++)
6340 	    {
6341 	      struct group_list * g;
6342 
6343 	      entry = byte_get (indices, 4);
6344 	      indices += 4;
6345 
6346 	      if (entry >= elf_header.e_shnum)
6347 		{
6348 		  static unsigned num_group_errors = 0;
6349 
6350 		  if (num_group_errors ++ < 10)
6351 		    {
6352 		      error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6353 			     entry, i, elf_header.e_shnum - 1);
6354 		      if (num_group_errors == 10)
6355 			warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6356 		    }
6357 		  continue;
6358 		}
6359 
6360 	      if (section_headers_groups [entry] != NULL)
6361 		{
6362 		  if (entry)
6363 		    {
6364 		      static unsigned num_errs = 0;
6365 
6366 		      if (num_errs ++ < 10)
6367 			{
6368 			  error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6369 				 entry, i,
6370 				 section_headers_groups [entry]->group_index);
6371 			  if (num_errs == 10)
6372 			    warn (_("Further error messages about already contained group sections suppressed\n"));
6373 			}
6374 		      continue;
6375 		    }
6376 		  else
6377 		    {
6378 		      /* Intel C/C++ compiler may put section 0 in a
6379 			 section group. We just warn it the first time
6380 			 and ignore it afterwards.  */
6381 		      static int warned = 0;
6382 		      if (!warned)
6383 			{
6384 			  error (_("section 0 in group section [%5u]\n"),
6385 				 section_headers_groups [entry]->group_index);
6386 			  warned++;
6387 			}
6388 		    }
6389 		}
6390 
6391 	      section_headers_groups [entry] = group;
6392 
6393 	      if (do_section_groups)
6394 		{
6395 		  sec = section_headers + entry;
6396 		  printf ("   [%5u]   %s\n", entry, printable_section_name (sec));
6397 		}
6398 
6399 	      g = (struct group_list *) xmalloc (sizeof (struct group_list));
6400 	      g->section_index = entry;
6401 	      g->next = group->root;
6402 	      group->root = g;
6403 	    }
6404 
6405 	  if (start)
6406 	    free (start);
6407 
6408 	  group++;
6409 	}
6410     }
6411 
6412   if (symtab)
6413     free (symtab);
6414   if (strtab)
6415     free (strtab);
6416   return 1;
6417 }
6418 
6419 /* Data used to display dynamic fixups.  */
6420 
6421 struct ia64_vms_dynfixup
6422 {
6423   bfd_vma needed_ident;		/* Library ident number.  */
6424   bfd_vma needed;		/* Index in the dstrtab of the library name.  */
6425   bfd_vma fixup_needed;		/* Index of the library.  */
6426   bfd_vma fixup_rela_cnt;	/* Number of fixups.  */
6427   bfd_vma fixup_rela_off;	/* Fixups offset in the dynamic segment.  */
6428 };
6429 
6430 /* Data used to display dynamic relocations.  */
6431 
6432 struct ia64_vms_dynimgrela
6433 {
6434   bfd_vma img_rela_cnt;		/* Number of relocations.  */
6435   bfd_vma img_rela_off;		/* Reloc offset in the dynamic segment.  */
6436 };
6437 
6438 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6439    library).  */
6440 
6441 static void
6442 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
6443                               const char *strtab, unsigned int strtab_sz)
6444 {
6445   Elf64_External_VMS_IMAGE_FIXUP *imfs;
6446   long i;
6447   const char *lib_name;
6448 
6449   imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
6450 		   1, fixup->fixup_rela_cnt * sizeof (*imfs),
6451 		   _("dynamic section image fixups"));
6452   if (!imfs)
6453     return;
6454 
6455   if (fixup->needed < strtab_sz)
6456     lib_name = strtab + fixup->needed;
6457   else
6458     {
6459       warn ("corrupt library name index of 0x%lx found in dynamic entry",
6460             (unsigned long) fixup->needed);
6461       lib_name = "???";
6462     }
6463   printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6464 	  (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6465   printf
6466     (_("Seg Offset           Type                             SymVec DataType\n"));
6467 
6468   for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6469     {
6470       unsigned int type;
6471       const char *rtype;
6472 
6473       printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6474       printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6475       type = BYTE_GET (imfs [i].type);
6476       rtype = elf_ia64_reloc_type (type);
6477       if (rtype == NULL)
6478         printf (" 0x%08x                       ", type);
6479       else
6480         printf (" %-32s ", rtype);
6481       printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6482       printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6483     }
6484 
6485   free (imfs);
6486 }
6487 
6488 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
6489 
6490 static void
6491 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6492 {
6493   Elf64_External_VMS_IMAGE_RELA *imrs;
6494   long i;
6495 
6496   imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6497 		   1, imgrela->img_rela_cnt * sizeof (*imrs),
6498 		   _("dynamic section image relocations"));
6499   if (!imrs)
6500     return;
6501 
6502   printf (_("\nImage relocs\n"));
6503   printf
6504     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
6505 
6506   for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6507     {
6508       unsigned int type;
6509       const char *rtype;
6510 
6511       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6512       printf ("%08" BFD_VMA_FMT "x ",
6513               (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6514       type = BYTE_GET (imrs [i].type);
6515       rtype = elf_ia64_reloc_type (type);
6516       if (rtype == NULL)
6517         printf ("0x%08x                      ", type);
6518       else
6519         printf ("%-31s ", rtype);
6520       print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6521       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6522       printf ("%08" BFD_VMA_FMT "x\n",
6523               (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6524     }
6525 
6526   free (imrs);
6527 }
6528 
6529 /* Display IA-64 OpenVMS dynamic relocations and fixups.  */
6530 
6531 static int
6532 process_ia64_vms_dynamic_relocs (FILE *file)
6533 {
6534   struct ia64_vms_dynfixup fixup;
6535   struct ia64_vms_dynimgrela imgrela;
6536   Elf_Internal_Dyn *entry;
6537   int res = 0;
6538   bfd_vma strtab_off = 0;
6539   bfd_vma strtab_sz = 0;
6540   char *strtab = NULL;
6541 
6542   memset (&fixup, 0, sizeof (fixup));
6543   memset (&imgrela, 0, sizeof (imgrela));
6544 
6545   /* Note: the order of the entries is specified by the OpenVMS specs.  */
6546   for (entry = dynamic_section;
6547        entry < dynamic_section + dynamic_nent;
6548        entry++)
6549     {
6550       switch (entry->d_tag)
6551         {
6552         case DT_IA_64_VMS_STRTAB_OFFSET:
6553           strtab_off = entry->d_un.d_val;
6554           break;
6555         case DT_STRSZ:
6556           strtab_sz = entry->d_un.d_val;
6557           if (strtab == NULL)
6558             strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6559                                1, strtab_sz, _("dynamic string section"));
6560           break;
6561 
6562         case DT_IA_64_VMS_NEEDED_IDENT:
6563           fixup.needed_ident = entry->d_un.d_val;
6564           break;
6565         case DT_NEEDED:
6566           fixup.needed = entry->d_un.d_val;
6567           break;
6568         case DT_IA_64_VMS_FIXUP_NEEDED:
6569           fixup.fixup_needed = entry->d_un.d_val;
6570           break;
6571         case DT_IA_64_VMS_FIXUP_RELA_CNT:
6572           fixup.fixup_rela_cnt = entry->d_un.d_val;
6573           break;
6574         case DT_IA_64_VMS_FIXUP_RELA_OFF:
6575           fixup.fixup_rela_off = entry->d_un.d_val;
6576           res++;
6577           dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6578           break;
6579 
6580         case DT_IA_64_VMS_IMG_RELA_CNT:
6581 	  imgrela.img_rela_cnt = entry->d_un.d_val;
6582           break;
6583         case DT_IA_64_VMS_IMG_RELA_OFF:
6584 	  imgrela.img_rela_off = entry->d_un.d_val;
6585           res++;
6586           dump_ia64_vms_dynamic_relocs (file, &imgrela);
6587           break;
6588 
6589         default:
6590           break;
6591 	}
6592     }
6593 
6594   if (strtab != NULL)
6595     free (strtab);
6596 
6597   return res;
6598 }
6599 
6600 static struct
6601 {
6602   const char * name;
6603   int reloc;
6604   int size;
6605   int rela;
6606 } dynamic_relocations [] =
6607 {
6608     { "REL", DT_REL, DT_RELSZ, FALSE },
6609     { "RELA", DT_RELA, DT_RELASZ, TRUE },
6610     { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6611 };
6612 
6613 /* Process the reloc section.  */
6614 
6615 static int
6616 process_relocs (FILE * file)
6617 {
6618   unsigned long rel_size;
6619   unsigned long rel_offset;
6620 
6621 
6622   if (!do_reloc)
6623     return 1;
6624 
6625   if (do_using_dynamic)
6626     {
6627       int is_rela;
6628       const char * name;
6629       int has_dynamic_reloc;
6630       unsigned int i;
6631 
6632       has_dynamic_reloc = 0;
6633 
6634       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
6635 	{
6636 	  is_rela = dynamic_relocations [i].rela;
6637 	  name = dynamic_relocations [i].name;
6638 	  rel_size = dynamic_info [dynamic_relocations [i].size];
6639 	  rel_offset = dynamic_info [dynamic_relocations [i].reloc];
6640 
6641 	  has_dynamic_reloc |= rel_size;
6642 
6643 	  if (is_rela == UNKNOWN)
6644 	    {
6645 	      if (dynamic_relocations [i].reloc == DT_JMPREL)
6646 		switch (dynamic_info[DT_PLTREL])
6647 		  {
6648 		  case DT_REL:
6649 		    is_rela = FALSE;
6650 		    break;
6651 		  case DT_RELA:
6652 		    is_rela = TRUE;
6653 		    break;
6654 		  }
6655 	    }
6656 
6657 	  if (rel_size)
6658 	    {
6659 	      printf
6660 		(_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6661 		 name, rel_offset, rel_size);
6662 
6663 	      dump_relocations (file,
6664 				offset_from_vma (file, rel_offset, rel_size),
6665 				rel_size,
6666 				dynamic_symbols, num_dynamic_syms,
6667 				dynamic_strings, dynamic_strings_length,
6668 				is_rela, 1);
6669 	    }
6670 	}
6671 
6672       if (is_ia64_vms ())
6673         has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6674 
6675       if (! has_dynamic_reloc)
6676 	printf (_("\nThere are no dynamic relocations in this file.\n"));
6677     }
6678   else
6679     {
6680       Elf_Internal_Shdr * section;
6681       unsigned long i;
6682       int found = 0;
6683 
6684       for (i = 0, section = section_headers;
6685 	   i < elf_header.e_shnum;
6686 	   i++, section++)
6687 	{
6688 	  if (   section->sh_type != SHT_RELA
6689 	      && section->sh_type != SHT_REL)
6690 	    continue;
6691 
6692 	  rel_offset = section->sh_offset;
6693 	  rel_size   = section->sh_size;
6694 
6695 	  if (rel_size)
6696 	    {
6697 	      Elf_Internal_Shdr * strsec;
6698 	      int is_rela;
6699 
6700 	      printf (_("\nRelocation section "));
6701 
6702 	      if (string_table == NULL)
6703 		printf ("%d", section->sh_name);
6704 	      else
6705 		printf ("'%s'", printable_section_name (section));
6706 
6707 	      printf (_(" at offset 0x%lx contains %lu entries:\n"),
6708 		 rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6709 
6710 	      is_rela = section->sh_type == SHT_RELA;
6711 
6712 	      if (section->sh_link != 0
6713 		  && section->sh_link < elf_header.e_shnum)
6714 		{
6715 		  Elf_Internal_Shdr * symsec;
6716 		  Elf_Internal_Sym *  symtab;
6717 		  unsigned long nsyms;
6718 		  unsigned long strtablen = 0;
6719 		  char * strtab = NULL;
6720 
6721 		  symsec = section_headers + section->sh_link;
6722 		  if (symsec->sh_type != SHT_SYMTAB
6723 		      && symsec->sh_type != SHT_DYNSYM)
6724                     continue;
6725 
6726 		  symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
6727 
6728 		  if (symtab == NULL)
6729 		    continue;
6730 
6731 		  if (symsec->sh_link != 0
6732 		      && symsec->sh_link < elf_header.e_shnum)
6733 		    {
6734 		      strsec = section_headers + symsec->sh_link;
6735 
6736 		      strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6737 						  1, strsec->sh_size,
6738 						  _("string table"));
6739 		      strtablen = strtab == NULL ? 0 : strsec->sh_size;
6740 		    }
6741 
6742 		  dump_relocations (file, rel_offset, rel_size,
6743 				    symtab, nsyms, strtab, strtablen,
6744 				    is_rela,
6745 				    symsec->sh_type == SHT_DYNSYM);
6746 		  if (strtab)
6747 		    free (strtab);
6748 		  free (symtab);
6749 		}
6750 	      else
6751 		dump_relocations (file, rel_offset, rel_size,
6752 				  NULL, 0, NULL, 0, is_rela, 0);
6753 
6754 	      found = 1;
6755 	    }
6756 	}
6757 
6758       if (! found)
6759 	printf (_("\nThere are no relocations in this file.\n"));
6760     }
6761 
6762   return 1;
6763 }
6764 
6765 /* An absolute address consists of a section and an offset.  If the
6766    section is NULL, the offset itself is the address, otherwise, the
6767    address equals to LOAD_ADDRESS(section) + offset.  */
6768 
6769 struct absaddr
6770 {
6771   unsigned short section;
6772   bfd_vma offset;
6773 };
6774 
6775 #define ABSADDR(a) \
6776   ((a).section \
6777    ? section_headers [(a).section].sh_addr + (a).offset \
6778    : (a).offset)
6779 
6780 /* Find the nearest symbol at or below ADDR.  Returns the symbol
6781    name, if found, and the offset from the symbol to ADDR.  */
6782 
6783 static void
6784 find_symbol_for_address (Elf_Internal_Sym * symtab,
6785 			 unsigned long      nsyms,
6786 			 const char *       strtab,
6787 			 unsigned long      strtab_size,
6788 			 struct absaddr     addr,
6789 			 const char **      symname,
6790 			 bfd_vma *          offset)
6791 {
6792   bfd_vma dist = 0x100000;
6793   Elf_Internal_Sym * sym;
6794   Elf_Internal_Sym * beg;
6795   Elf_Internal_Sym * end;
6796   Elf_Internal_Sym * best = NULL;
6797 
6798   REMOVE_ARCH_BITS (addr.offset);
6799   beg = symtab;
6800   end = symtab + nsyms;
6801 
6802   while (beg < end)
6803     {
6804       bfd_vma value;
6805 
6806       sym = beg + (end - beg) / 2;
6807 
6808       value = sym->st_value;
6809       REMOVE_ARCH_BITS (value);
6810 
6811       if (sym->st_name != 0
6812 	  && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
6813 	  && addr.offset >= value
6814 	  && addr.offset - value < dist)
6815 	{
6816 	  best = sym;
6817 	  dist = addr.offset - value;
6818 	  if (!dist)
6819 	    break;
6820 	}
6821 
6822       if (addr.offset < value)
6823 	end = sym;
6824       else
6825 	beg = sym + 1;
6826     }
6827 
6828   if (best)
6829     {
6830       *symname = (best->st_name >= strtab_size
6831 		  ? _("<corrupt>") : strtab + best->st_name);
6832       *offset = dist;
6833       return;
6834     }
6835 
6836   *symname = NULL;
6837   *offset = addr.offset;
6838 }
6839 
6840 static int
6841 symcmp (const void *p, const void *q)
6842 {
6843   Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
6844   Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
6845 
6846   return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
6847 }
6848 
6849 /* Process the unwind section.  */
6850 
6851 #include "unwind-ia64.h"
6852 
6853 struct ia64_unw_table_entry
6854 {
6855   struct absaddr start;
6856   struct absaddr end;
6857   struct absaddr info;
6858 };
6859 
6860 struct ia64_unw_aux_info
6861 {
6862   struct ia64_unw_table_entry *table;	/* Unwind table.  */
6863   unsigned long table_len;		/* Length of unwind table.  */
6864   unsigned char * info;			/* Unwind info.  */
6865   unsigned long info_size;		/* Size of unwind info.  */
6866   bfd_vma info_addr;			/* Starting address of unwind info.  */
6867   bfd_vma seg_base;			/* Starting address of segment.  */
6868   Elf_Internal_Sym * symtab;		/* The symbol table.  */
6869   unsigned long nsyms;			/* Number of symbols.  */
6870   Elf_Internal_Sym * funtab;		/* Sorted table of STT_FUNC symbols.  */
6871   unsigned long nfuns;			/* Number of entries in funtab.  */
6872   char * strtab;			/* The string table.  */
6873   unsigned long strtab_size;		/* Size of string table.  */
6874 };
6875 
6876 static void
6877 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
6878 {
6879   struct ia64_unw_table_entry * tp;
6880   unsigned long j, nfuns;
6881   int in_body;
6882 
6883   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
6884   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
6885     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
6886       aux->funtab[nfuns++] = aux->symtab[j];
6887   aux->nfuns = nfuns;
6888   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
6889 
6890   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
6891     {
6892       bfd_vma stamp;
6893       bfd_vma offset;
6894       const unsigned char * dp;
6895       const unsigned char * head;
6896       const unsigned char * end;
6897       const char * procname;
6898 
6899       find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
6900 			       aux->strtab_size, tp->start, &procname, &offset);
6901 
6902       fputs ("\n<", stdout);
6903 
6904       if (procname)
6905 	{
6906 	  fputs (procname, stdout);
6907 
6908 	  if (offset)
6909 	    printf ("+%lx", (unsigned long) offset);
6910 	}
6911 
6912       fputs (">: [", stdout);
6913       print_vma (tp->start.offset, PREFIX_HEX);
6914       fputc ('-', stdout);
6915       print_vma (tp->end.offset, PREFIX_HEX);
6916       printf ("], info at +0x%lx\n",
6917 	      (unsigned long) (tp->info.offset - aux->seg_base));
6918 
6919       /* PR 17531: file: 86232b32.  */
6920       if (aux->info == NULL)
6921 	continue;
6922 
6923       /* PR 17531: file: 0997b4d1.  */
6924       if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
6925 	{
6926 	  warn (_("Invalid offset %lx in table entry %ld\n"),
6927 		(long) tp->info.offset, (long) (tp - aux->table));
6928 	  continue;
6929 	}
6930 
6931       head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
6932       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
6933 
6934       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
6935 	      (unsigned) UNW_VER (stamp),
6936 	      (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
6937 	      UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
6938 	      UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
6939 	      (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
6940 
6941       if (UNW_VER (stamp) != 1)
6942 	{
6943 	  printf (_("\tUnknown version.\n"));
6944 	  continue;
6945 	}
6946 
6947       in_body = 0;
6948       end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
6949       /* PR 17531: file: 16ceda89.  */
6950       if (end > aux->info + aux->info_size)
6951 	end = aux->info + aux->info_size;
6952       for (dp = head + 8; dp < end;)
6953 	dp = unw_decode (dp, in_body, & in_body, end);
6954     }
6955 
6956   free (aux->funtab);
6957 }
6958 
6959 static bfd_boolean
6960 slurp_ia64_unwind_table (FILE * file,
6961 			 struct ia64_unw_aux_info * aux,
6962 			 Elf_Internal_Shdr * sec)
6963 {
6964   unsigned long size, nrelas, i;
6965   Elf_Internal_Phdr * seg;
6966   struct ia64_unw_table_entry * tep;
6967   Elf_Internal_Shdr * relsec;
6968   Elf_Internal_Rela * rela;
6969   Elf_Internal_Rela * rp;
6970   unsigned char * table;
6971   unsigned char * tp;
6972   Elf_Internal_Sym * sym;
6973   const char * relname;
6974 
6975   aux->table_len = 0;
6976 
6977   /* First, find the starting address of the segment that includes
6978      this section: */
6979 
6980   if (elf_header.e_phnum)
6981     {
6982       if (! get_program_headers (file))
6983 	  return FALSE;
6984 
6985       for (seg = program_headers;
6986 	   seg < program_headers + elf_header.e_phnum;
6987 	   ++seg)
6988 	{
6989 	  if (seg->p_type != PT_LOAD)
6990 	    continue;
6991 
6992 	  if (sec->sh_addr >= seg->p_vaddr
6993 	      && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
6994 	    {
6995 	      aux->seg_base = seg->p_vaddr;
6996 	      break;
6997 	    }
6998 	}
6999     }
7000 
7001   /* Second, build the unwind table from the contents of the unwind section:  */
7002   size = sec->sh_size;
7003   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7004                                       _("unwind table"));
7005   if (!table)
7006     return FALSE;
7007 
7008   aux->table_len = size / (3 * eh_addr_size);
7009   aux->table = (struct ia64_unw_table_entry *)
7010     xcmalloc (aux->table_len, sizeof (aux->table[0]));
7011   tep = aux->table;
7012 
7013   for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7014     {
7015       tep->start.section = SHN_UNDEF;
7016       tep->end.section   = SHN_UNDEF;
7017       tep->info.section  = SHN_UNDEF;
7018       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7019       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7020       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7021       tep->start.offset += aux->seg_base;
7022       tep->end.offset   += aux->seg_base;
7023       tep->info.offset  += aux->seg_base;
7024     }
7025   free (table);
7026 
7027   /* Third, apply any relocations to the unwind table:  */
7028   for (relsec = section_headers;
7029        relsec < section_headers + elf_header.e_shnum;
7030        ++relsec)
7031     {
7032       if (relsec->sh_type != SHT_RELA
7033 	  || relsec->sh_info >= elf_header.e_shnum
7034 	  || section_headers + relsec->sh_info != sec)
7035 	continue;
7036 
7037       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7038 			      & rela, & nrelas))
7039 	{
7040 	  free (aux->table);
7041 	  aux->table = NULL;
7042 	  aux->table_len = 0;
7043 	  return FALSE;
7044 	}
7045 
7046       for (rp = rela; rp < rela + nrelas; ++rp)
7047 	{
7048 	  relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
7049 	  sym = aux->symtab + get_reloc_symindex (rp->r_info);
7050 
7051 	  /* PR 17531: file: 9fa67536.  */
7052 	  if (relname == NULL)
7053 	    {
7054 	      warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp->r_info));
7055 	      continue;
7056 	    }
7057 
7058 	  if (! const_strneq (relname, "R_IA64_SEGREL"))
7059 	    {
7060 	      warn (_("Skipping unexpected relocation type: %s\n"), relname);
7061 	      continue;
7062 	    }
7063 
7064 	  i = rp->r_offset / (3 * eh_addr_size);
7065 
7066 	  /* PR 17531: file: 5bc8d9bf.  */
7067 	  if (i >= aux->table_len)
7068 	    {
7069 	      warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7070 	      continue;
7071 	    }
7072 
7073 	  switch (rp->r_offset / eh_addr_size % 3)
7074 	    {
7075 	    case 0:
7076 	      aux->table[i].start.section = sym->st_shndx;
7077 	      aux->table[i].start.offset  = rp->r_addend + sym->st_value;
7078 	      break;
7079 	    case 1:
7080 	      aux->table[i].end.section   = sym->st_shndx;
7081 	      aux->table[i].end.offset    = rp->r_addend + sym->st_value;
7082 	      break;
7083 	    case 2:
7084 	      aux->table[i].info.section  = sym->st_shndx;
7085 	      aux->table[i].info.offset   = rp->r_addend + sym->st_value;
7086 	      break;
7087 	    default:
7088 	      break;
7089 	    }
7090 	}
7091 
7092       free (rela);
7093     }
7094 
7095   return TRUE;
7096 }
7097 
7098 static void
7099 ia64_process_unwind (FILE * file)
7100 {
7101   Elf_Internal_Shdr * sec;
7102   Elf_Internal_Shdr * unwsec = NULL;
7103   Elf_Internal_Shdr * strsec;
7104   unsigned long i, unwcount = 0, unwstart = 0;
7105   struct ia64_unw_aux_info aux;
7106 
7107   memset (& aux, 0, sizeof (aux));
7108 
7109   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7110     {
7111       if (sec->sh_type == SHT_SYMTAB
7112 	  && sec->sh_link < elf_header.e_shnum)
7113 	{
7114 	  aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7115 
7116 	  strsec = section_headers + sec->sh_link;
7117 	  if (aux.strtab != NULL)
7118 	    {
7119 	      error (_("Multiple auxillary string tables encountered\n"));
7120 	      free (aux.strtab);
7121 	    }
7122 	  aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7123                                           1, strsec->sh_size,
7124                                           _("string table"));
7125 	  aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7126 	}
7127       else if (sec->sh_type == SHT_IA_64_UNWIND)
7128 	unwcount++;
7129     }
7130 
7131   if (!unwcount)
7132     printf (_("\nThere are no unwind sections in this file.\n"));
7133 
7134   while (unwcount-- > 0)
7135     {
7136       char * suffix;
7137       size_t len, len2;
7138 
7139       for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
7140 	   i < elf_header.e_shnum; ++i, ++sec)
7141 	if (sec->sh_type == SHT_IA_64_UNWIND)
7142 	  {
7143 	    unwsec = sec;
7144 	    break;
7145 	  }
7146       /* We have already counted the number of SHT_IA64_UNWIND
7147 	 sections so the loop above should never fail.  */
7148       assert (unwsec != NULL);
7149 
7150       unwstart = i + 1;
7151       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7152 
7153       if ((unwsec->sh_flags & SHF_GROUP) != 0)
7154 	{
7155 	  /* We need to find which section group it is in.  */
7156 	  struct group_list * g;
7157 
7158 	  if (section_headers_groups == NULL
7159 	      || section_headers_groups [i] == NULL)
7160 	    i = elf_header.e_shnum;
7161 	  else
7162 	    {
7163 	      g = section_headers_groups [i]->root;
7164 
7165 	      for (; g != NULL; g = g->next)
7166 		{
7167 		  sec = section_headers + g->section_index;
7168 
7169 		  if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7170 		    break;
7171 		}
7172 
7173 	      if (g == NULL)
7174 		i = elf_header.e_shnum;
7175 	    }
7176 	}
7177       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7178 	{
7179 	  /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
7180 	  len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7181 	  suffix = SECTION_NAME (unwsec) + len;
7182 	  for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7183 	       ++i, ++sec)
7184 	    if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7185 		&& streq (SECTION_NAME (sec) + len2, suffix))
7186 	      break;
7187 	}
7188       else
7189 	{
7190 	  /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7191 	     .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
7192 	  len = sizeof (ELF_STRING_ia64_unwind) - 1;
7193 	  len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7194 	  suffix = "";
7195 	  if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7196 	    suffix = SECTION_NAME (unwsec) + len;
7197 	  for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7198 	       ++i, ++sec)
7199 	    if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7200 		&& streq (SECTION_NAME (sec) + len2, suffix))
7201 	      break;
7202 	}
7203 
7204       if (i == elf_header.e_shnum)
7205 	{
7206 	  printf (_("\nCould not find unwind info section for "));
7207 
7208 	  if (string_table == NULL)
7209 	    printf ("%d", unwsec->sh_name);
7210 	  else
7211 	    printf ("'%s'", printable_section_name (unwsec));
7212 	}
7213       else
7214 	{
7215 	  aux.info_addr = sec->sh_addr;
7216 	  aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
7217 						 sec->sh_size,
7218 						 _("unwind info"));
7219 	  aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7220 
7221 	  printf (_("\nUnwind section "));
7222 
7223 	  if (string_table == NULL)
7224 	    printf ("%d", unwsec->sh_name);
7225 	  else
7226 	    printf ("'%s'", printable_section_name (unwsec));
7227 
7228 	  printf (_(" at offset 0x%lx contains %lu entries:\n"),
7229 		  (unsigned long) unwsec->sh_offset,
7230 		  (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7231 
7232 	  if (slurp_ia64_unwind_table (file, & aux, unwsec)
7233 	      && aux.table_len > 0)
7234 	    dump_ia64_unwind (& aux);
7235 
7236 	  if (aux.table)
7237 	    free ((char *) aux.table);
7238 	  if (aux.info)
7239 	    free ((char *) aux.info);
7240 	  aux.table = NULL;
7241 	  aux.info = NULL;
7242 	}
7243     }
7244 
7245   if (aux.symtab)
7246     free (aux.symtab);
7247   if (aux.strtab)
7248     free ((char *) aux.strtab);
7249 }
7250 
7251 struct hppa_unw_table_entry
7252   {
7253     struct absaddr start;
7254     struct absaddr end;
7255     unsigned int Cannot_unwind:1;		/* 0 */
7256     unsigned int Millicode:1;			/* 1 */
7257     unsigned int Millicode_save_sr0:1;		/* 2 */
7258     unsigned int Region_description:2;		/* 3..4 */
7259     unsigned int reserved1:1;			/* 5 */
7260     unsigned int Entry_SR:1;			/* 6 */
7261     unsigned int Entry_FR:4;     /* number saved */	/* 7..10 */
7262     unsigned int Entry_GR:5;     /* number saved */	/* 11..15 */
7263     unsigned int Args_stored:1;			/* 16 */
7264     unsigned int Variable_Frame:1;		/* 17 */
7265     unsigned int Separate_Package_Body:1;	/* 18 */
7266     unsigned int Frame_Extension_Millicode:1;	/* 19 */
7267     unsigned int Stack_Overflow_Check:1;	/* 20 */
7268     unsigned int Two_Instruction_SP_Increment:1;/* 21 */
7269     unsigned int Ada_Region:1;			/* 22 */
7270     unsigned int cxx_info:1;			/* 23 */
7271     unsigned int cxx_try_catch:1;		/* 24 */
7272     unsigned int sched_entry_seq:1;		/* 25 */
7273     unsigned int reserved2:1;			/* 26 */
7274     unsigned int Save_SP:1;			/* 27 */
7275     unsigned int Save_RP:1;			/* 28 */
7276     unsigned int Save_MRP_in_frame:1;		/* 29 */
7277     unsigned int extn_ptr_defined:1;		/* 30 */
7278     unsigned int Cleanup_defined:1;		/* 31 */
7279 
7280     unsigned int MPE_XL_interrupt_marker:1;	/* 0 */
7281     unsigned int HP_UX_interrupt_marker:1;	/* 1 */
7282     unsigned int Large_frame:1;			/* 2 */
7283     unsigned int Pseudo_SP_Set:1;		/* 3 */
7284     unsigned int reserved4:1;			/* 4 */
7285     unsigned int Total_frame_size:27;		/* 5..31 */
7286   };
7287 
7288 struct hppa_unw_aux_info
7289 {
7290   struct hppa_unw_table_entry * table;	/* Unwind table.  */
7291   unsigned long table_len;		/* Length of unwind table.  */
7292   bfd_vma seg_base;			/* Starting address of segment.  */
7293   Elf_Internal_Sym * symtab;		/* The symbol table.  */
7294   unsigned long nsyms;			/* Number of symbols.  */
7295   Elf_Internal_Sym * funtab;		/* Sorted table of STT_FUNC symbols.  */
7296   unsigned long nfuns;			/* Number of entries in funtab.  */
7297   char * strtab;			/* The string table.  */
7298   unsigned long strtab_size;		/* Size of string table.  */
7299 };
7300 
7301 static void
7302 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
7303 {
7304   struct hppa_unw_table_entry * tp;
7305   unsigned long j, nfuns;
7306 
7307   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7308   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7309     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7310       aux->funtab[nfuns++] = aux->symtab[j];
7311   aux->nfuns = nfuns;
7312   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7313 
7314   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7315     {
7316       bfd_vma offset;
7317       const char * procname;
7318 
7319       find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7320 			       aux->strtab_size, tp->start, &procname,
7321 			       &offset);
7322 
7323       fputs ("\n<", stdout);
7324 
7325       if (procname)
7326 	{
7327 	  fputs (procname, stdout);
7328 
7329 	  if (offset)
7330 	    printf ("+%lx", (unsigned long) offset);
7331 	}
7332 
7333       fputs (">: [", stdout);
7334       print_vma (tp->start.offset, PREFIX_HEX);
7335       fputc ('-', stdout);
7336       print_vma (tp->end.offset, PREFIX_HEX);
7337       printf ("]\n\t");
7338 
7339 #define PF(_m) if (tp->_m) printf (#_m " ");
7340 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7341       PF(Cannot_unwind);
7342       PF(Millicode);
7343       PF(Millicode_save_sr0);
7344       /* PV(Region_description);  */
7345       PF(Entry_SR);
7346       PV(Entry_FR);
7347       PV(Entry_GR);
7348       PF(Args_stored);
7349       PF(Variable_Frame);
7350       PF(Separate_Package_Body);
7351       PF(Frame_Extension_Millicode);
7352       PF(Stack_Overflow_Check);
7353       PF(Two_Instruction_SP_Increment);
7354       PF(Ada_Region);
7355       PF(cxx_info);
7356       PF(cxx_try_catch);
7357       PF(sched_entry_seq);
7358       PF(Save_SP);
7359       PF(Save_RP);
7360       PF(Save_MRP_in_frame);
7361       PF(extn_ptr_defined);
7362       PF(Cleanup_defined);
7363       PF(MPE_XL_interrupt_marker);
7364       PF(HP_UX_interrupt_marker);
7365       PF(Large_frame);
7366       PF(Pseudo_SP_Set);
7367       PV(Total_frame_size);
7368 #undef PF
7369 #undef PV
7370     }
7371 
7372   printf ("\n");
7373 
7374   free (aux->funtab);
7375 }
7376 
7377 static int
7378 slurp_hppa_unwind_table (FILE * file,
7379 			 struct hppa_unw_aux_info * aux,
7380 			 Elf_Internal_Shdr * sec)
7381 {
7382   unsigned long size, unw_ent_size, nentries, nrelas, i;
7383   Elf_Internal_Phdr * seg;
7384   struct hppa_unw_table_entry * tep;
7385   Elf_Internal_Shdr * relsec;
7386   Elf_Internal_Rela * rela;
7387   Elf_Internal_Rela * rp;
7388   unsigned char * table;
7389   unsigned char * tp;
7390   Elf_Internal_Sym * sym;
7391   const char * relname;
7392 
7393   /* First, find the starting address of the segment that includes
7394      this section.  */
7395 
7396   if (elf_header.e_phnum)
7397     {
7398       if (! get_program_headers (file))
7399 	return 0;
7400 
7401       for (seg = program_headers;
7402 	   seg < program_headers + elf_header.e_phnum;
7403 	   ++seg)
7404 	{
7405 	  if (seg->p_type != PT_LOAD)
7406 	    continue;
7407 
7408 	  if (sec->sh_addr >= seg->p_vaddr
7409 	      && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7410 	    {
7411 	      aux->seg_base = seg->p_vaddr;
7412 	      break;
7413 	    }
7414 	}
7415     }
7416 
7417   /* Second, build the unwind table from the contents of the unwind
7418      section.  */
7419   size = sec->sh_size;
7420   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7421                                       _("unwind table"));
7422   if (!table)
7423     return 0;
7424 
7425   unw_ent_size = 16;
7426   nentries = size / unw_ent_size;
7427   size = unw_ent_size * nentries;
7428 
7429   tep = aux->table = (struct hppa_unw_table_entry *)
7430       xcmalloc (nentries, sizeof (aux->table[0]));
7431 
7432   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7433     {
7434       unsigned int tmp1, tmp2;
7435 
7436       tep->start.section = SHN_UNDEF;
7437       tep->end.section   = SHN_UNDEF;
7438 
7439       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7440       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7441       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7442       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7443 
7444       tep->start.offset += aux->seg_base;
7445       tep->end.offset   += aux->seg_base;
7446 
7447       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7448       tep->Millicode = (tmp1 >> 30) & 0x1;
7449       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7450       tep->Region_description = (tmp1 >> 27) & 0x3;
7451       tep->reserved1 = (tmp1 >> 26) & 0x1;
7452       tep->Entry_SR = (tmp1 >> 25) & 0x1;
7453       tep->Entry_FR = (tmp1 >> 21) & 0xf;
7454       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7455       tep->Args_stored = (tmp1 >> 15) & 0x1;
7456       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7457       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7458       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7459       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7460       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7461       tep->Ada_Region = (tmp1 >> 9) & 0x1;
7462       tep->cxx_info = (tmp1 >> 8) & 0x1;
7463       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7464       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7465       tep->reserved2 = (tmp1 >> 5) & 0x1;
7466       tep->Save_SP = (tmp1 >> 4) & 0x1;
7467       tep->Save_RP = (tmp1 >> 3) & 0x1;
7468       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7469       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7470       tep->Cleanup_defined = tmp1 & 0x1;
7471 
7472       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7473       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7474       tep->Large_frame = (tmp2 >> 29) & 0x1;
7475       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7476       tep->reserved4 = (tmp2 >> 27) & 0x1;
7477       tep->Total_frame_size = tmp2 & 0x7ffffff;
7478     }
7479   free (table);
7480 
7481   /* Third, apply any relocations to the unwind table.  */
7482   for (relsec = section_headers;
7483        relsec < section_headers + elf_header.e_shnum;
7484        ++relsec)
7485     {
7486       if (relsec->sh_type != SHT_RELA
7487 	  || relsec->sh_info >= elf_header.e_shnum
7488 	  || section_headers + relsec->sh_info != sec)
7489 	continue;
7490 
7491       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7492 			      & rela, & nrelas))
7493 	return 0;
7494 
7495       for (rp = rela; rp < rela + nrelas; ++rp)
7496 	{
7497 	  relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7498 	  sym = aux->symtab + get_reloc_symindex (rp->r_info);
7499 
7500 	  /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
7501 	  if (! const_strneq (relname, "R_PARISC_SEGREL"))
7502 	    {
7503 	      warn (_("Skipping unexpected relocation type %s\n"), relname);
7504 	      continue;
7505 	    }
7506 
7507 	  i = rp->r_offset / unw_ent_size;
7508 
7509 	  switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
7510 	    {
7511 	    case 0:
7512 	      aux->table[i].start.section = sym->st_shndx;
7513 	      aux->table[i].start.offset  = sym->st_value + rp->r_addend;
7514 	      break;
7515 	    case 1:
7516 	      aux->table[i].end.section   = sym->st_shndx;
7517 	      aux->table[i].end.offset    = sym->st_value + rp->r_addend;
7518 	      break;
7519 	    default:
7520 	      break;
7521 	    }
7522 	}
7523 
7524       free (rela);
7525     }
7526 
7527   aux->table_len = nentries;
7528 
7529   return 1;
7530 }
7531 
7532 static void
7533 hppa_process_unwind (FILE * file)
7534 {
7535   struct hppa_unw_aux_info aux;
7536   Elf_Internal_Shdr * unwsec = NULL;
7537   Elf_Internal_Shdr * strsec;
7538   Elf_Internal_Shdr * sec;
7539   unsigned long i;
7540 
7541   if (string_table == NULL)
7542     return;
7543 
7544   memset (& aux, 0, sizeof (aux));
7545 
7546   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7547     {
7548       if (sec->sh_type == SHT_SYMTAB
7549 	  && sec->sh_link < elf_header.e_shnum)
7550 	{
7551 	  aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7552 
7553 	  strsec = section_headers + sec->sh_link;
7554 	  if (aux.strtab != NULL)
7555 	    {
7556 	      error (_("Multiple auxillary string tables encountered\n"));
7557 	      free (aux.strtab);
7558 	    }
7559 	  aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7560                                           1, strsec->sh_size,
7561                                           _("string table"));
7562 	  aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7563 	}
7564       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7565 	unwsec = sec;
7566     }
7567 
7568   if (!unwsec)
7569     printf (_("\nThere are no unwind sections in this file.\n"));
7570 
7571   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7572     {
7573       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7574 	{
7575 	  printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7576 		  printable_section_name (sec),
7577 		  (unsigned long) sec->sh_offset,
7578 		  (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
7579 
7580           slurp_hppa_unwind_table (file, &aux, sec);
7581 	  if (aux.table_len > 0)
7582 	    dump_hppa_unwind (&aux);
7583 
7584 	  if (aux.table)
7585 	    free ((char *) aux.table);
7586 	  aux.table = NULL;
7587 	}
7588     }
7589 
7590   if (aux.symtab)
7591     free (aux.symtab);
7592   if (aux.strtab)
7593     free ((char *) aux.strtab);
7594 }
7595 
7596 struct arm_section
7597 {
7598   unsigned char *      data;		/* The unwind data.  */
7599   Elf_Internal_Shdr *  sec;		/* The cached unwind section header.  */
7600   Elf_Internal_Rela *  rela;		/* The cached relocations for this section.  */
7601   unsigned long        nrelas;		/* The number of relocations.  */
7602   unsigned int         rel_type;	/* REL or RELA ?  */
7603   Elf_Internal_Rela *  next_rela;	/* Cyclic pointer to the next reloc to process.  */
7604 };
7605 
7606 struct arm_unw_aux_info
7607 {
7608   FILE *              file;		/* The file containing the unwind sections.  */
7609   Elf_Internal_Sym *  symtab;		/* The file's symbol table.  */
7610   unsigned long       nsyms;		/* Number of symbols.  */
7611   Elf_Internal_Sym *  funtab;		/* Sorted table of STT_FUNC symbols.  */
7612   unsigned long       nfuns;		/* Number of these symbols.  */
7613   char *              strtab;		/* The file's string table.  */
7614   unsigned long       strtab_size;	/* Size of string table.  */
7615 };
7616 
7617 static const char *
7618 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7619 			bfd_vma fn, struct absaddr addr)
7620 {
7621   const char *procname;
7622   bfd_vma sym_offset;
7623 
7624   if (addr.section == SHN_UNDEF)
7625     addr.offset = fn;
7626 
7627   find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7628 			   aux->strtab_size, addr, &procname,
7629 			   &sym_offset);
7630 
7631   print_vma (fn, PREFIX_HEX);
7632 
7633   if (procname)
7634     {
7635       fputs (" <", stdout);
7636       fputs (procname, stdout);
7637 
7638       if (sym_offset)
7639 	printf ("+0x%lx", (unsigned long) sym_offset);
7640       fputc ('>', stdout);
7641     }
7642 
7643   return procname;
7644 }
7645 
7646 static void
7647 arm_free_section (struct arm_section *arm_sec)
7648 {
7649   if (arm_sec->data != NULL)
7650     free (arm_sec->data);
7651 
7652   if (arm_sec->rela != NULL)
7653     free (arm_sec->rela);
7654 }
7655 
7656 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7657       cached section and install SEC instead.
7658    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7659       and return its valued in * WORDP, relocating if necessary.
7660    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
7661       relocation's offset in ADDR.
7662    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7663       into the string table of the symbol associated with the reloc.  If no
7664       reloc was applied store -1 there.
7665    5) Return TRUE upon success, FALSE otherwise.  */
7666 
7667 static bfd_boolean
7668 get_unwind_section_word (struct arm_unw_aux_info *  aux,
7669 			 struct arm_section *       arm_sec,
7670 			 Elf_Internal_Shdr *        sec,
7671 			 bfd_vma 		    word_offset,
7672 			 unsigned int *             wordp,
7673 			 struct absaddr *           addr,
7674 			 bfd_vma *		    sym_name)
7675 {
7676   Elf_Internal_Rela *rp;
7677   Elf_Internal_Sym *sym;
7678   const char * relname;
7679   unsigned int word;
7680   bfd_boolean wrapped;
7681 
7682   if (sec == NULL || arm_sec == NULL)
7683     return FALSE;
7684 
7685   addr->section = SHN_UNDEF;
7686   addr->offset = 0;
7687 
7688   if (sym_name != NULL)
7689     *sym_name = (bfd_vma) -1;
7690 
7691   /* If necessary, update the section cache.  */
7692   if (sec != arm_sec->sec)
7693     {
7694       Elf_Internal_Shdr *relsec;
7695 
7696       arm_free_section (arm_sec);
7697 
7698       arm_sec->sec = sec;
7699       arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7700 				sec->sh_size, _("unwind data"));
7701       arm_sec->rela = NULL;
7702       arm_sec->nrelas = 0;
7703 
7704       for (relsec = section_headers;
7705 	   relsec < section_headers + elf_header.e_shnum;
7706 	   ++relsec)
7707 	{
7708 	  if (relsec->sh_info >= elf_header.e_shnum
7709 	      || section_headers + relsec->sh_info != sec
7710 	      /* PR 15745: Check the section type as well.  */
7711 	      || (relsec->sh_type != SHT_REL
7712 		  && relsec->sh_type != SHT_RELA))
7713 	    continue;
7714 
7715 	  arm_sec->rel_type = relsec->sh_type;
7716 	  if (relsec->sh_type == SHT_REL)
7717 	    {
7718 	      if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7719 				     relsec->sh_size,
7720 				     & arm_sec->rela, & arm_sec->nrelas))
7721 		return FALSE;
7722 	    }
7723 	  else /* relsec->sh_type == SHT_RELA */
7724 	    {
7725 	      if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7726 				      relsec->sh_size,
7727 				      & arm_sec->rela, & arm_sec->nrelas))
7728 		return FALSE;
7729 	    }
7730 	  break;
7731 	}
7732 
7733       arm_sec->next_rela = arm_sec->rela;
7734     }
7735 
7736   /* If there is no unwind data we can do nothing.  */
7737   if (arm_sec->data == NULL)
7738     return FALSE;
7739 
7740   /* If the offset is invalid then fail.  */
7741   if (word_offset > (sec->sh_size - 4)
7742       /* PR 18879 */
7743       || (sec->sh_size < 5 && word_offset >= sec->sh_size)
7744       || ((bfd_signed_vma) word_offset) < 0)
7745     return FALSE;
7746 
7747   /* Get the word at the required offset.  */
7748   word = byte_get (arm_sec->data + word_offset, 4);
7749 
7750   /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128.  */
7751   if (arm_sec->rela == NULL)
7752     {
7753       * wordp = word;
7754       return TRUE;
7755     }
7756 
7757   /* Look through the relocs to find the one that applies to the provided offset.  */
7758   wrapped = FALSE;
7759   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7760     {
7761       bfd_vma prelval, offset;
7762 
7763       if (rp->r_offset > word_offset && !wrapped)
7764 	{
7765 	  rp = arm_sec->rela;
7766 	  wrapped = TRUE;
7767 	}
7768       if (rp->r_offset > word_offset)
7769 	break;
7770 
7771       if (rp->r_offset & 3)
7772 	{
7773 	  warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7774 		(unsigned long) rp->r_offset);
7775 	  continue;
7776 	}
7777 
7778       if (rp->r_offset < word_offset)
7779 	continue;
7780 
7781       /* PR 17531: file: 027-161405-0.004  */
7782       if (aux->symtab == NULL)
7783 	continue;
7784 
7785       if (arm_sec->rel_type == SHT_REL)
7786 	{
7787 	  offset = word & 0x7fffffff;
7788 	  if (offset & 0x40000000)
7789 	    offset |= ~ (bfd_vma) 0x7fffffff;
7790 	}
7791       else if (arm_sec->rel_type == SHT_RELA)
7792 	offset = rp->r_addend;
7793       else
7794 	{
7795 	  error (_("Unknown section relocation type %d encountered\n"),
7796 		 arm_sec->rel_type);
7797 	  break;
7798 	}
7799 
7800       /* PR 17531 file: 027-1241568-0.004.  */
7801       if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
7802 	{
7803 	  error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
7804 		 (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
7805 	  break;
7806 	}
7807 
7808       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
7809       offset += sym->st_value;
7810       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
7811 
7812       /* Check that we are processing the expected reloc type.  */
7813       if (elf_header.e_machine == EM_ARM)
7814 	{
7815 	  relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
7816 	  if (relname == NULL)
7817 	    {
7818 	      warn (_("Skipping unknown ARM relocation type: %d\n"),
7819 		    (int) ELF32_R_TYPE (rp->r_info));
7820 	      continue;
7821 	    }
7822 
7823 	  if (streq (relname, "R_ARM_NONE"))
7824 	      continue;
7825 
7826 	  if (! streq (relname, "R_ARM_PREL31"))
7827 	    {
7828 	      warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
7829 	      continue;
7830 	    }
7831 	}
7832       else if (elf_header.e_machine == EM_TI_C6000)
7833 	{
7834 	  relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
7835 	  if (relname == NULL)
7836 	    {
7837 	      warn (_("Skipping unknown C6000 relocation type: %d\n"),
7838 		    (int) ELF32_R_TYPE (rp->r_info));
7839 	      continue;
7840 	    }
7841 
7842 	  if (streq (relname, "R_C6000_NONE"))
7843 	    continue;
7844 
7845 	  if (! streq (relname, "R_C6000_PREL31"))
7846 	    {
7847 	      warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
7848 	      continue;
7849 	    }
7850 
7851 	  prelval >>= 1;
7852 	}
7853       else
7854 	{
7855 	  /* This function currently only supports ARM and TI unwinders.  */
7856 	  warn (_("Only TI and ARM unwinders are currently supported\n"));
7857 	  break;
7858 	}
7859 
7860       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
7861       addr->section = sym->st_shndx;
7862       addr->offset = offset;
7863 
7864       if (sym_name)
7865 	* sym_name = sym->st_name;
7866       break;
7867     }
7868 
7869   *wordp = word;
7870   arm_sec->next_rela = rp;
7871 
7872   return TRUE;
7873 }
7874 
7875 static const char *tic6x_unwind_regnames[16] =
7876 {
7877   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
7878   "A14", "A13", "A12", "A11", "A10",
7879   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
7880 };
7881 
7882 static void
7883 decode_tic6x_unwind_regmask (unsigned int mask)
7884 {
7885   int i;
7886 
7887   for (i = 12; mask; mask >>= 1, i--)
7888     {
7889       if (mask & 1)
7890 	{
7891 	  fputs (tic6x_unwind_regnames[i], stdout);
7892 	  if (mask > 1)
7893 	    fputs (", ", stdout);
7894 	}
7895     }
7896 }
7897 
7898 #define ADVANCE							\
7899   if (remaining == 0 && more_words)				\
7900     {								\
7901       data_offset += 4;						\
7902       if (! get_unwind_section_word (aux, data_arm_sec, data_sec,	\
7903 				     data_offset, & word, & addr, NULL))	\
7904 	return;							\
7905       remaining = 4;						\
7906       more_words--;						\
7907     }								\
7908 
7909 #define GET_OP(OP)			\
7910   ADVANCE;				\
7911   if (remaining)			\
7912     {					\
7913       remaining--;			\
7914       (OP) = word >> 24;		\
7915       word <<= 8;			\
7916     }					\
7917   else					\
7918     {					\
7919       printf (_("[Truncated opcode]\n"));	\
7920       return;				\
7921     }					\
7922   printf ("0x%02x ", OP)
7923 
7924 static void
7925 decode_arm_unwind_bytecode (struct arm_unw_aux_info *  aux,
7926 			    unsigned int               word,
7927 			    unsigned int               remaining,
7928 			    unsigned int               more_words,
7929 			    bfd_vma                    data_offset,
7930 			    Elf_Internal_Shdr *        data_sec,
7931 			    struct arm_section *       data_arm_sec)
7932 {
7933   struct absaddr addr;
7934 
7935   /* Decode the unwinding instructions.  */
7936   while (1)
7937     {
7938       unsigned int op, op2;
7939 
7940       ADVANCE;
7941       if (remaining == 0)
7942 	break;
7943       remaining--;
7944       op = word >> 24;
7945       word <<= 8;
7946 
7947       printf ("  0x%02x ", op);
7948 
7949       if ((op & 0xc0) == 0x00)
7950 	{
7951 	  int offset = ((op & 0x3f) << 2) + 4;
7952 
7953 	  printf ("     vsp = vsp + %d", offset);
7954 	}
7955       else if ((op & 0xc0) == 0x40)
7956 	{
7957 	  int offset = ((op & 0x3f) << 2) + 4;
7958 
7959 	  printf ("     vsp = vsp - %d", offset);
7960 	}
7961       else if ((op & 0xf0) == 0x80)
7962 	{
7963 	  GET_OP (op2);
7964 	  if (op == 0x80 && op2 == 0)
7965 	    printf (_("Refuse to unwind"));
7966 	  else
7967 	    {
7968 	      unsigned int mask = ((op & 0x0f) << 8) | op2;
7969 	      int first = 1;
7970 	      int i;
7971 
7972 	      printf ("pop {");
7973 	      for (i = 0; i < 12; i++)
7974 		if (mask & (1 << i))
7975 		  {
7976 		    if (first)
7977 		      first = 0;
7978 		    else
7979 		      printf (", ");
7980 		    printf ("r%d", 4 + i);
7981 		  }
7982 	      printf ("}");
7983 	    }
7984 	}
7985       else if ((op & 0xf0) == 0x90)
7986 	{
7987 	  if (op == 0x9d || op == 0x9f)
7988 	    printf (_("     [Reserved]"));
7989 	  else
7990 	    printf ("     vsp = r%d", op & 0x0f);
7991 	}
7992       else if ((op & 0xf0) == 0xa0)
7993 	{
7994 	  int end = 4 + (op & 0x07);
7995 	  int first = 1;
7996 	  int i;
7997 
7998 	  printf ("     pop {");
7999 	  for (i = 4; i <= end; i++)
8000 	    {
8001 	      if (first)
8002 		first = 0;
8003 	      else
8004 		printf (", ");
8005 	      printf ("r%d", i);
8006 	    }
8007 	  if (op & 0x08)
8008 	    {
8009 	      if (!first)
8010 		printf (", ");
8011 	      printf ("r14");
8012 	    }
8013 	  printf ("}");
8014 	}
8015       else if (op == 0xb0)
8016 	printf (_("     finish"));
8017       else if (op == 0xb1)
8018 	{
8019 	  GET_OP (op2);
8020 	  if (op2 == 0 || (op2 & 0xf0) != 0)
8021 	    printf (_("[Spare]"));
8022 	  else
8023 	    {
8024 	      unsigned int mask = op2 & 0x0f;
8025 	      int first = 1;
8026 	      int i;
8027 
8028 	      printf ("pop {");
8029 	      for (i = 0; i < 12; i++)
8030 		if (mask & (1 << i))
8031 		  {
8032 		    if (first)
8033 		      first = 0;
8034 		    else
8035 		      printf (", ");
8036 		    printf ("r%d", i);
8037 		  }
8038 	      printf ("}");
8039 	    }
8040 	}
8041       else if (op == 0xb2)
8042 	{
8043 	  unsigned char buf[9];
8044 	  unsigned int i, len;
8045 	  unsigned long offset;
8046 
8047 	  for (i = 0; i < sizeof (buf); i++)
8048 	    {
8049 	      GET_OP (buf[i]);
8050 	      if ((buf[i] & 0x80) == 0)
8051 		break;
8052 	    }
8053 	  if (i == sizeof (buf))
8054 	    printf (_("corrupt change to vsp"));
8055 	  else
8056 	    {
8057 	      offset = read_uleb128 (buf, &len, buf + i + 1);
8058 	      assert (len == i + 1);
8059 	      offset = offset * 4 + 0x204;
8060 	      printf ("vsp = vsp + %ld", offset);
8061 	    }
8062 	}
8063       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8064 	{
8065 	  unsigned int first, last;
8066 
8067 	  GET_OP (op2);
8068 	  first = op2 >> 4;
8069 	  last = op2 & 0x0f;
8070 	  if (op == 0xc8)
8071 	    first = first + 16;
8072 	  printf ("pop {D%d", first);
8073 	  if (last)
8074 	    printf ("-D%d", first + last);
8075 	  printf ("}");
8076 	}
8077       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8078 	{
8079 	  unsigned int count = op & 0x07;
8080 
8081 	  printf ("pop {D8");
8082 	  if (count)
8083 	    printf ("-D%d", 8 + count);
8084 	  printf ("}");
8085 	}
8086       else if (op >= 0xc0 && op <= 0xc5)
8087 	{
8088 	  unsigned int count = op & 0x07;
8089 
8090 	  printf ("     pop {wR10");
8091 	  if (count)
8092 	    printf ("-wR%d", 10 + count);
8093 	  printf ("}");
8094 	}
8095       else if (op == 0xc6)
8096 	{
8097 	  unsigned int first, last;
8098 
8099 	  GET_OP (op2);
8100 	  first = op2 >> 4;
8101 	  last = op2 & 0x0f;
8102 	  printf ("pop {wR%d", first);
8103 	  if (last)
8104 	    printf ("-wR%d", first + last);
8105 	  printf ("}");
8106 	}
8107       else if (op == 0xc7)
8108 	{
8109 	  GET_OP (op2);
8110 	  if (op2 == 0 || (op2 & 0xf0) != 0)
8111 	    printf (_("[Spare]"));
8112 	  else
8113 	    {
8114 	      unsigned int mask = op2 & 0x0f;
8115 	      int first = 1;
8116 	      int i;
8117 
8118 	      printf ("pop {");
8119 	      for (i = 0; i < 4; i++)
8120 		if (mask & (1 << i))
8121 		  {
8122 		    if (first)
8123 		      first = 0;
8124 		    else
8125 		      printf (", ");
8126 		    printf ("wCGR%d", i);
8127 		  }
8128 	      printf ("}");
8129 	    }
8130 	}
8131       else
8132 	printf (_("     [unsupported opcode]"));
8133       printf ("\n");
8134     }
8135 }
8136 
8137 static void
8138 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info *  aux,
8139 			      unsigned int               word,
8140 			      unsigned int               remaining,
8141 			      unsigned int               more_words,
8142 			      bfd_vma                    data_offset,
8143 			      Elf_Internal_Shdr *        data_sec,
8144 			      struct arm_section *       data_arm_sec)
8145 {
8146   struct absaddr addr;
8147 
8148   /* Decode the unwinding instructions.  */
8149   while (1)
8150     {
8151       unsigned int op, op2;
8152 
8153       ADVANCE;
8154       if (remaining == 0)
8155 	break;
8156       remaining--;
8157       op = word >> 24;
8158       word <<= 8;
8159 
8160       printf ("  0x%02x ", op);
8161 
8162       if ((op & 0xc0) == 0x00)
8163 	{
8164 	  int offset = ((op & 0x3f) << 3) + 8;
8165 	  printf ("     sp = sp + %d", offset);
8166 	}
8167       else if ((op & 0xc0) == 0x80)
8168 	{
8169 	  GET_OP (op2);
8170 	  if (op == 0x80 && op2 == 0)
8171 	    printf (_("Refuse to unwind"));
8172 	  else
8173 	    {
8174 	      unsigned int mask = ((op & 0x1f) << 8) | op2;
8175 	      if (op & 0x20)
8176 		printf ("pop compact {");
8177 	      else
8178 		printf ("pop {");
8179 
8180 	      decode_tic6x_unwind_regmask (mask);
8181 	      printf("}");
8182 	    }
8183 	}
8184       else if ((op & 0xf0) == 0xc0)
8185 	{
8186 	  unsigned int reg;
8187 	  unsigned int nregs;
8188 	  unsigned int i;
8189 	  const char *name;
8190 	  struct
8191 	  {
8192 	      unsigned int offset;
8193 	      unsigned int reg;
8194 	  } regpos[16];
8195 
8196 	  /* Scan entire instruction first so that GET_OP output is not
8197 	     interleaved with disassembly.  */
8198 	  nregs = 0;
8199 	  for (i = 0; nregs < (op & 0xf); i++)
8200 	    {
8201 	      GET_OP (op2);
8202 	      reg = op2 >> 4;
8203 	      if (reg != 0xf)
8204 		{
8205 		  regpos[nregs].offset = i * 2;
8206 		  regpos[nregs].reg = reg;
8207 		  nregs++;
8208 		}
8209 
8210 	      reg = op2 & 0xf;
8211 	      if (reg != 0xf)
8212 		{
8213 		  regpos[nregs].offset = i * 2 + 1;
8214 		  regpos[nregs].reg = reg;
8215 		  nregs++;
8216 		}
8217 	    }
8218 
8219 	  printf (_("pop frame {"));
8220 	  reg = nregs - 1;
8221 	  for (i = i * 2; i > 0; i--)
8222 	    {
8223 	      if (regpos[reg].offset == i - 1)
8224 		{
8225 		  name = tic6x_unwind_regnames[regpos[reg].reg];
8226 		  if (reg > 0)
8227 		    reg--;
8228 		}
8229 	      else
8230 		name = _("[pad]");
8231 
8232 	      fputs (name, stdout);
8233 	      if (i > 1)
8234 		printf (", ");
8235 	    }
8236 
8237 	  printf ("}");
8238 	}
8239       else if (op == 0xd0)
8240 	printf ("     MOV FP, SP");
8241       else if (op == 0xd1)
8242 	printf ("     __c6xabi_pop_rts");
8243       else if (op == 0xd2)
8244 	{
8245 	  unsigned char buf[9];
8246 	  unsigned int i, len;
8247 	  unsigned long offset;
8248 
8249 	  for (i = 0; i < sizeof (buf); i++)
8250 	    {
8251 	      GET_OP (buf[i]);
8252 	      if ((buf[i] & 0x80) == 0)
8253 		break;
8254 	    }
8255 	  /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2.  */
8256 	  if (i == sizeof (buf))
8257 	    {
8258 	      printf ("<corrupt sp adjust>\n");
8259 	      warn (_("Corrupt stack pointer adjustment detected\n"));
8260 	      return;
8261 	    }
8262 
8263 	  offset = read_uleb128 (buf, &len, buf + i + 1);
8264 	  assert (len == i + 1);
8265 	  offset = offset * 8 + 0x408;
8266 	  printf (_("sp = sp + %ld"), offset);
8267 	}
8268       else if ((op & 0xf0) == 0xe0)
8269 	{
8270 	  if ((op & 0x0f) == 7)
8271 	    printf ("     RETURN");
8272 	  else
8273 	    printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8274 	}
8275       else
8276 	{
8277 	  printf (_("     [unsupported opcode]"));
8278 	}
8279       putchar ('\n');
8280     }
8281 }
8282 
8283 static bfd_vma
8284 arm_expand_prel31 (bfd_vma word, bfd_vma where)
8285 {
8286   bfd_vma offset;
8287 
8288   offset = word & 0x7fffffff;
8289   if (offset & 0x40000000)
8290     offset |= ~ (bfd_vma) 0x7fffffff;
8291 
8292   if (elf_header.e_machine == EM_TI_C6000)
8293     offset <<= 1;
8294 
8295   return offset + where;
8296 }
8297 
8298 static void
8299 decode_arm_unwind (struct arm_unw_aux_info *  aux,
8300 		   unsigned int               word,
8301 		   unsigned int               remaining,
8302 		   bfd_vma                    data_offset,
8303 		   Elf_Internal_Shdr *        data_sec,
8304 		   struct arm_section *       data_arm_sec)
8305 {
8306   int per_index;
8307   unsigned int more_words = 0;
8308   struct absaddr addr;
8309   bfd_vma sym_name = (bfd_vma) -1;
8310 
8311   if (remaining == 0)
8312     {
8313       /* Fetch the first word.
8314 	 Note - when decoding an object file the address extracted
8315 	 here will always be 0.  So we also pass in the sym_name
8316 	 parameter so that we can find the symbol associated with
8317 	 the personality routine.  */
8318       if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
8319 				     & word, & addr, & sym_name))
8320 	return;
8321 
8322       remaining = 4;
8323     }
8324 
8325   if ((word & 0x80000000) == 0)
8326     {
8327       /* Expand prel31 for personality routine.  */
8328       bfd_vma fn;
8329       const char *procname;
8330 
8331       fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
8332       printf (_("  Personality routine: "));
8333       if (fn == 0
8334 	  && addr.section == SHN_UNDEF && addr.offset == 0
8335 	  && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8336 	{
8337 	  procname = aux->strtab + sym_name;
8338 	  print_vma (fn, PREFIX_HEX);
8339 	  if (procname)
8340 	    {
8341 	      fputs (" <", stdout);
8342 	      fputs (procname, stdout);
8343 	      fputc ('>', stdout);
8344 	    }
8345 	}
8346       else
8347 	procname = arm_print_vma_and_name (aux, fn, addr);
8348       fputc ('\n', stdout);
8349 
8350       /* The GCC personality routines use the standard compact
8351 	 encoding, starting with one byte giving the number of
8352 	 words.  */
8353       if (procname != NULL
8354 	  && (const_strneq (procname, "__gcc_personality_v0")
8355 	      || const_strneq (procname, "__gxx_personality_v0")
8356 	      || const_strneq (procname, "__gcj_personality_v0")
8357 	      || const_strneq (procname, "__gnu_objc_personality_v0")))
8358 	{
8359 	  remaining = 0;
8360 	  more_words = 1;
8361 	  ADVANCE;
8362 	  if (!remaining)
8363 	    {
8364 	      printf (_("  [Truncated data]\n"));
8365 	      return;
8366 	    }
8367 	  more_words = word >> 24;
8368 	  word <<= 8;
8369 	  remaining--;
8370 	  per_index = -1;
8371 	}
8372       else
8373 	return;
8374     }
8375   else
8376     {
8377       /* ARM EHABI Section 6.3:
8378 
8379 	 An exception-handling table entry for the compact model looks like:
8380 
8381            31 30-28 27-24 23-0
8382 	   -- ----- ----- ----
8383             1   0   index Data for personalityRoutine[index]    */
8384 
8385       if (elf_header.e_machine == EM_ARM
8386 	  && (word & 0x70000000))
8387 	warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8388 
8389       per_index = (word >> 24) & 0x7f;
8390       printf (_("  Compact model index: %d\n"), per_index);
8391       if (per_index == 0)
8392 	{
8393 	  more_words = 0;
8394 	  word <<= 8;
8395 	  remaining--;
8396 	}
8397       else if (per_index < 3)
8398 	{
8399 	  more_words = (word >> 16) & 0xff;
8400 	  word <<= 16;
8401 	  remaining -= 2;
8402 	}
8403     }
8404 
8405   switch (elf_header.e_machine)
8406     {
8407     case EM_ARM:
8408       if (per_index < 3)
8409 	{
8410 	  decode_arm_unwind_bytecode (aux, word, remaining, more_words,
8411 				      data_offset, data_sec, data_arm_sec);
8412 	}
8413       else
8414 	{
8415 	  warn (_("Unknown ARM compact model index encountered\n"));
8416 	  printf (_("  [reserved]\n"));
8417 	}
8418       break;
8419 
8420     case EM_TI_C6000:
8421       if (per_index < 3)
8422 	{
8423 	  decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
8424 					data_offset, data_sec, data_arm_sec);
8425 	}
8426       else if (per_index < 5)
8427 	{
8428 	  if (((word >> 17) & 0x7f) == 0x7f)
8429 	    printf (_("  Restore stack from frame pointer\n"));
8430 	  else
8431 	    printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
8432 	  printf (_("  Registers restored: "));
8433 	  if (per_index == 4)
8434 	    printf (" (compact) ");
8435 	  decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8436 	  putchar ('\n');
8437 	  printf (_("  Return register: %s\n"),
8438 		  tic6x_unwind_regnames[word & 0xf]);
8439 	}
8440       else
8441 	printf (_("  [reserved (%d)]\n"), per_index);
8442       break;
8443 
8444     default:
8445       error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8446 	     elf_header.e_machine);
8447     }
8448 
8449   /* Decode the descriptors.  Not implemented.  */
8450 }
8451 
8452 static void
8453 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8454 {
8455   struct arm_section exidx_arm_sec, extab_arm_sec;
8456   unsigned int i, exidx_len;
8457   unsigned long j, nfuns;
8458 
8459   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8460   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8461   exidx_len = exidx_sec->sh_size / 8;
8462 
8463   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8464   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8465     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8466       aux->funtab[nfuns++] = aux->symtab[j];
8467   aux->nfuns = nfuns;
8468   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8469 
8470   for (i = 0; i < exidx_len; i++)
8471     {
8472       unsigned int exidx_fn, exidx_entry;
8473       struct absaddr fn_addr, entry_addr;
8474       bfd_vma fn;
8475 
8476       fputc ('\n', stdout);
8477 
8478       if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8479 				     8 * i, & exidx_fn, & fn_addr, NULL)
8480 	  || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8481 					8 * i + 4, & exidx_entry, & entry_addr, NULL))
8482 	{
8483 	  free (aux->funtab);
8484 	  arm_free_section (& exidx_arm_sec);
8485 	  arm_free_section (& extab_arm_sec);
8486 	  return;
8487 	}
8488 
8489       /* ARM EHABI, Section 5:
8490 	 An index table entry consists of 2 words.
8491          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
8492       if (exidx_fn & 0x80000000)
8493 	warn (_("corrupt index table entry: %x\n"), exidx_fn);
8494 
8495       fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
8496 
8497       arm_print_vma_and_name (aux, fn, fn_addr);
8498       fputs (": ", stdout);
8499 
8500       if (exidx_entry == 1)
8501 	{
8502 	  print_vma (exidx_entry, PREFIX_HEX);
8503 	  fputs (" [cantunwind]\n", stdout);
8504 	}
8505       else if (exidx_entry & 0x80000000)
8506 	{
8507 	  print_vma (exidx_entry, PREFIX_HEX);
8508 	  fputc ('\n', stdout);
8509 	  decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8510 	}
8511       else
8512 	{
8513 	  bfd_vma table, table_offset = 0;
8514 	  Elf_Internal_Shdr *table_sec;
8515 
8516 	  fputs ("@", stdout);
8517 	  table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
8518 	  print_vma (table, PREFIX_HEX);
8519 	  printf ("\n");
8520 
8521 	  /* Locate the matching .ARM.extab.  */
8522 	  if (entry_addr.section != SHN_UNDEF
8523 	      && entry_addr.section < elf_header.e_shnum)
8524 	    {
8525 	      table_sec = section_headers + entry_addr.section;
8526 	      table_offset = entry_addr.offset;
8527 	      /* PR 18879 */
8528 	      if (table_offset > table_sec->sh_size
8529 		  || ((bfd_signed_vma) table_offset) < 0)
8530 		{
8531 		  warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
8532 			(unsigned long) table_offset,
8533 			printable_section_name (table_sec));
8534 		  continue;
8535 		}
8536 	    }
8537 	  else
8538 	    {
8539 	      table_sec = find_section_by_address (table);
8540 	      if (table_sec != NULL)
8541 		table_offset = table - table_sec->sh_addr;
8542 	    }
8543 	  if (table_sec == NULL)
8544 	    {
8545 	      warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8546 		    (unsigned long) table);
8547 	      continue;
8548 	    }
8549 	  decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8550 			     &extab_arm_sec);
8551 	}
8552     }
8553 
8554   printf ("\n");
8555 
8556   free (aux->funtab);
8557   arm_free_section (&exidx_arm_sec);
8558   arm_free_section (&extab_arm_sec);
8559 }
8560 
8561 /* Used for both ARM and C6X unwinding tables.  */
8562 
8563 static void
8564 arm_process_unwind (FILE *file)
8565 {
8566   struct arm_unw_aux_info aux;
8567   Elf_Internal_Shdr *unwsec = NULL;
8568   Elf_Internal_Shdr *strsec;
8569   Elf_Internal_Shdr *sec;
8570   unsigned long i;
8571   unsigned int sec_type;
8572 
8573   switch (elf_header.e_machine)
8574     {
8575     case EM_ARM:
8576       sec_type = SHT_ARM_EXIDX;
8577       break;
8578 
8579     case EM_TI_C6000:
8580       sec_type = SHT_C6000_UNWIND;
8581       break;
8582 
8583     default:
8584       error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
8585 	     elf_header.e_machine);
8586       return;
8587     }
8588 
8589   if (string_table == NULL)
8590     return;
8591 
8592   memset (& aux, 0, sizeof (aux));
8593   aux.file = file;
8594 
8595   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8596     {
8597       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8598 	{
8599 	  aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
8600 
8601 	  strsec = section_headers + sec->sh_link;
8602 
8603 	  /* PR binutils/17531 file: 011-12666-0.004.  */
8604 	  if (aux.strtab != NULL)
8605 	    {
8606 	      error (_("Multiple string tables found in file.\n"));
8607 	      free (aux.strtab);
8608 	    }
8609 	  aux.strtab = get_data (NULL, file, strsec->sh_offset,
8610 				 1, strsec->sh_size, _("string table"));
8611 	  aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8612 	}
8613       else if (sec->sh_type == sec_type)
8614 	unwsec = sec;
8615     }
8616 
8617   if (unwsec == NULL)
8618     printf (_("\nThere are no unwind sections in this file.\n"));
8619   else
8620     for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8621       {
8622 	if (sec->sh_type == sec_type)
8623 	  {
8624 	    printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
8625 		    printable_section_name (sec),
8626 		    (unsigned long) sec->sh_offset,
8627 		    (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
8628 
8629 	    dump_arm_unwind (&aux, sec);
8630 	  }
8631       }
8632 
8633   if (aux.symtab)
8634     free (aux.symtab);
8635   if (aux.strtab)
8636     free ((char *) aux.strtab);
8637 }
8638 
8639 static void
8640 process_unwind (FILE * file)
8641 {
8642   struct unwind_handler
8643   {
8644     int machtype;
8645     void (* handler)(FILE *);
8646   } handlers[] =
8647   {
8648     { EM_ARM, arm_process_unwind },
8649     { EM_IA_64, ia64_process_unwind },
8650     { EM_PARISC, hppa_process_unwind },
8651     { EM_TI_C6000, arm_process_unwind },
8652     { 0, 0 }
8653   };
8654   int i;
8655 
8656   if (!do_unwind)
8657     return;
8658 
8659   for (i = 0; handlers[i].handler != NULL; i++)
8660     if (elf_header.e_machine == handlers[i].machtype)
8661       {
8662 	handlers[i].handler (file);
8663 	return;
8664       }
8665 
8666   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8667 	  get_machine_name (elf_header.e_machine));
8668 }
8669 
8670 static void
8671 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
8672 {
8673   switch (entry->d_tag)
8674     {
8675     case DT_MIPS_FLAGS:
8676       if (entry->d_un.d_val == 0)
8677 	printf (_("NONE"));
8678       else
8679 	{
8680 	  static const char * opts[] =
8681 	  {
8682 	    "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8683 	    "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8684 	    "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8685 	    "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8686 	    "RLD_ORDER_SAFE"
8687 	  };
8688 	  unsigned int cnt;
8689 	  int first = 1;
8690 
8691 	  for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
8692 	    if (entry->d_un.d_val & (1 << cnt))
8693 	      {
8694 		printf ("%s%s", first ? "" : " ", opts[cnt]);
8695 		first = 0;
8696 	      }
8697 	}
8698       break;
8699 
8700     case DT_MIPS_IVERSION:
8701       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8702 	printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
8703       else
8704 	{
8705 	  char buf[40];
8706 	  sprintf_vma (buf, entry->d_un.d_ptr);
8707 	  /* Note: coded this way so that there is a single string for translation.  */
8708 	  printf (_("<corrupt: %s>"), buf);
8709 	}
8710       break;
8711 
8712     case DT_MIPS_TIME_STAMP:
8713       {
8714 	char timebuf[128];
8715 	struct tm * tmp;
8716 	time_t atime = entry->d_un.d_val;
8717 
8718 	tmp = gmtime (&atime);
8719 	/* PR 17531: file: 6accc532.  */
8720 	if (tmp == NULL)
8721 	  snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
8722 	else
8723 	  snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8724 		    tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8725 		    tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8726 	printf (_("Time Stamp: %s"), timebuf);
8727       }
8728       break;
8729 
8730     case DT_MIPS_RLD_VERSION:
8731     case DT_MIPS_LOCAL_GOTNO:
8732     case DT_MIPS_CONFLICTNO:
8733     case DT_MIPS_LIBLISTNO:
8734     case DT_MIPS_SYMTABNO:
8735     case DT_MIPS_UNREFEXTNO:
8736     case DT_MIPS_HIPAGENO:
8737     case DT_MIPS_DELTA_CLASS_NO:
8738     case DT_MIPS_DELTA_INSTANCE_NO:
8739     case DT_MIPS_DELTA_RELOC_NO:
8740     case DT_MIPS_DELTA_SYM_NO:
8741     case DT_MIPS_DELTA_CLASSSYM_NO:
8742     case DT_MIPS_COMPACT_SIZE:
8743       print_vma (entry->d_un.d_val, DEC);
8744       break;
8745 
8746     default:
8747       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8748     }
8749     putchar ('\n');
8750 }
8751 
8752 static void
8753 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
8754 {
8755   switch (entry->d_tag)
8756     {
8757     case DT_HP_DLD_FLAGS:
8758       {
8759 	static struct
8760 	{
8761 	  long int bit;
8762 	  const char * str;
8763 	}
8764 	flags[] =
8765 	{
8766 	  { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8767 	  { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8768 	  { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8769 	  { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8770 	  { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8771 	  { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8772 	  { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
8773 	  { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
8774 	  { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
8775 	  { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
8776 	  { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
8777 	  { DT_HP_GST, "HP_GST" },
8778 	  { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
8779 	  { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
8780 	  { DT_HP_NODELETE, "HP_NODELETE" },
8781 	  { DT_HP_GROUP, "HP_GROUP" },
8782 	  { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
8783 	};
8784 	int first = 1;
8785 	size_t cnt;
8786 	bfd_vma val = entry->d_un.d_val;
8787 
8788 	for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
8789 	  if (val & flags[cnt].bit)
8790 	    {
8791 	      if (! first)
8792 		putchar (' ');
8793 	      fputs (flags[cnt].str, stdout);
8794 	      first = 0;
8795 	      val ^= flags[cnt].bit;
8796 	    }
8797 
8798 	if (val != 0 || first)
8799 	  {
8800 	    if (! first)
8801 	      putchar (' ');
8802 	    print_vma (val, HEX);
8803 	  }
8804       }
8805       break;
8806 
8807     default:
8808       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8809       break;
8810     }
8811   putchar ('\n');
8812 }
8813 
8814 #ifdef BFD64
8815 
8816 /* VMS vs Unix time offset and factor.  */
8817 
8818 #define VMS_EPOCH_OFFSET 35067168000000000LL
8819 #define VMS_GRANULARITY_FACTOR 10000000
8820 
8821 /* Display a VMS time in a human readable format.  */
8822 
8823 static void
8824 print_vms_time (bfd_int64_t vmstime)
8825 {
8826   struct tm *tm;
8827   time_t unxtime;
8828 
8829   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
8830   tm = gmtime (&unxtime);
8831   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
8832           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
8833           tm->tm_hour, tm->tm_min, tm->tm_sec);
8834 }
8835 #endif /* BFD64 */
8836 
8837 static void
8838 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
8839 {
8840   switch (entry->d_tag)
8841     {
8842     case DT_IA_64_PLT_RESERVE:
8843       /* First 3 slots reserved.  */
8844       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8845       printf (" -- ");
8846       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
8847       break;
8848 
8849     case DT_IA_64_VMS_LINKTIME:
8850 #ifdef BFD64
8851       print_vms_time (entry->d_un.d_val);
8852 #endif
8853       break;
8854 
8855     case DT_IA_64_VMS_LNKFLAGS:
8856       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8857       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
8858         printf (" CALL_DEBUG");
8859       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
8860         printf (" NOP0BUFS");
8861       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
8862         printf (" P0IMAGE");
8863       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
8864         printf (" MKTHREADS");
8865       if (entry->d_un.d_val & VMS_LF_UPCALLS)
8866         printf (" UPCALLS");
8867       if (entry->d_un.d_val & VMS_LF_IMGSTA)
8868         printf (" IMGSTA");
8869       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
8870         printf (" INITIALIZE");
8871       if (entry->d_un.d_val & VMS_LF_MAIN)
8872         printf (" MAIN");
8873       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
8874         printf (" EXE_INIT");
8875       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
8876         printf (" TBK_IN_IMG");
8877       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
8878         printf (" DBG_IN_IMG");
8879       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
8880         printf (" TBK_IN_DSF");
8881       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
8882         printf (" DBG_IN_DSF");
8883       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
8884         printf (" SIGNATURES");
8885       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
8886         printf (" REL_SEG_OFF");
8887       break;
8888 
8889     default:
8890       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8891       break;
8892     }
8893   putchar ('\n');
8894 }
8895 
8896 static int
8897 get_32bit_dynamic_section (FILE * file)
8898 {
8899   Elf32_External_Dyn * edyn;
8900   Elf32_External_Dyn * ext;
8901   Elf_Internal_Dyn * entry;
8902 
8903   edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8904                                           dynamic_size, _("dynamic section"));
8905   if (!edyn)
8906     return 0;
8907 
8908   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8909      might not have the luxury of section headers.  Look for the DT_NULL
8910      terminator to determine the number of entries.  */
8911   for (ext = edyn, dynamic_nent = 0;
8912        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
8913        ext++)
8914     {
8915       dynamic_nent++;
8916       if (BYTE_GET (ext->d_tag) == DT_NULL)
8917 	break;
8918     }
8919 
8920   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8921                                                   sizeof (* entry));
8922   if (dynamic_section == NULL)
8923     {
8924       error (_("Out of memory allocating space for %lu dynamic entries\n"),
8925 	     (unsigned long) dynamic_nent);
8926       free (edyn);
8927       return 0;
8928     }
8929 
8930   for (ext = edyn, entry = dynamic_section;
8931        entry < dynamic_section + dynamic_nent;
8932        ext++, entry++)
8933     {
8934       entry->d_tag      = BYTE_GET (ext->d_tag);
8935       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8936     }
8937 
8938   free (edyn);
8939 
8940   return 1;
8941 }
8942 
8943 static int
8944 get_64bit_dynamic_section (FILE * file)
8945 {
8946   Elf64_External_Dyn * edyn;
8947   Elf64_External_Dyn * ext;
8948   Elf_Internal_Dyn * entry;
8949 
8950   /* Read in the data.  */
8951   edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
8952                                           dynamic_size, _("dynamic section"));
8953   if (!edyn)
8954     return 0;
8955 
8956   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
8957      might not have the luxury of section headers.  Look for the DT_NULL
8958      terminator to determine the number of entries.  */
8959   for (ext = edyn, dynamic_nent = 0;
8960        /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer.  */
8961        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
8962        ext++)
8963     {
8964       dynamic_nent++;
8965       if (BYTE_GET (ext->d_tag) == DT_NULL)
8966 	break;
8967     }
8968 
8969   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
8970                                                   sizeof (* entry));
8971   if (dynamic_section == NULL)
8972     {
8973       error (_("Out of memory allocating space for %lu dynamic entries\n"),
8974 	     (unsigned long) dynamic_nent);
8975       free (edyn);
8976       return 0;
8977     }
8978 
8979   /* Convert from external to internal formats.  */
8980   for (ext = edyn, entry = dynamic_section;
8981        entry < dynamic_section + dynamic_nent;
8982        ext++, entry++)
8983     {
8984       entry->d_tag      = BYTE_GET (ext->d_tag);
8985       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
8986     }
8987 
8988   free (edyn);
8989 
8990   return 1;
8991 }
8992 
8993 static void
8994 print_dynamic_flags (bfd_vma flags)
8995 {
8996   int first = 1;
8997 
8998   while (flags)
8999     {
9000       bfd_vma flag;
9001 
9002       flag = flags & - flags;
9003       flags &= ~ flag;
9004 
9005       if (first)
9006 	first = 0;
9007       else
9008 	putc (' ', stdout);
9009 
9010       switch (flag)
9011 	{
9012 	case DF_ORIGIN:		fputs ("ORIGIN", stdout); break;
9013 	case DF_SYMBOLIC:	fputs ("SYMBOLIC", stdout); break;
9014 	case DF_TEXTREL:	fputs ("TEXTREL", stdout); break;
9015 	case DF_BIND_NOW:	fputs ("BIND_NOW", stdout); break;
9016 	case DF_STATIC_TLS:	fputs ("STATIC_TLS", stdout); break;
9017 	default:		fputs (_("unknown"), stdout); break;
9018 	}
9019     }
9020   puts ("");
9021 }
9022 
9023 /* Parse and display the contents of the dynamic section.  */
9024 
9025 static int
9026 process_dynamic_section (FILE * file)
9027 {
9028   Elf_Internal_Dyn * entry;
9029 
9030   if (dynamic_size == 0)
9031     {
9032       if (do_dynamic)
9033 	printf (_("\nThere is no dynamic section in this file.\n"));
9034 
9035       return 1;
9036     }
9037 
9038   if (is_32bit_elf)
9039     {
9040       if (! get_32bit_dynamic_section (file))
9041 	return 0;
9042     }
9043   else if (! get_64bit_dynamic_section (file))
9044     return 0;
9045 
9046   /* Find the appropriate symbol table.  */
9047   if (dynamic_symbols == NULL)
9048     {
9049       for (entry = dynamic_section;
9050 	   entry < dynamic_section + dynamic_nent;
9051 	   ++entry)
9052 	{
9053 	  Elf_Internal_Shdr section;
9054 
9055 	  if (entry->d_tag != DT_SYMTAB)
9056 	    continue;
9057 
9058 	  dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9059 
9060 	  /* Since we do not know how big the symbol table is,
9061 	     we default to reading in the entire file (!) and
9062 	     processing that.  This is overkill, I know, but it
9063 	     should work.  */
9064 	  section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
9065 
9066 	  if (archive_file_offset != 0)
9067 	    section.sh_size = archive_file_size - section.sh_offset;
9068 	  else
9069 	    {
9070 	      if (fseek (file, 0, SEEK_END))
9071 		error (_("Unable to seek to end of file!\n"));
9072 
9073 	      section.sh_size = ftell (file) - section.sh_offset;
9074 	    }
9075 
9076 	  if (is_32bit_elf)
9077 	    section.sh_entsize = sizeof (Elf32_External_Sym);
9078 	  else
9079 	    section.sh_entsize = sizeof (Elf64_External_Sym);
9080 	  section.sh_name = string_table_length;
9081 
9082 	  dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
9083 	  if (num_dynamic_syms < 1)
9084 	    {
9085 	      error (_("Unable to determine the number of symbols to load\n"));
9086 	      continue;
9087 	    }
9088 	}
9089     }
9090 
9091   /* Similarly find a string table.  */
9092   if (dynamic_strings == NULL)
9093     {
9094       for (entry = dynamic_section;
9095 	   entry < dynamic_section + dynamic_nent;
9096 	   ++entry)
9097 	{
9098 	  unsigned long offset;
9099 	  long str_tab_len;
9100 
9101 	  if (entry->d_tag != DT_STRTAB)
9102 	    continue;
9103 
9104 	  dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9105 
9106 	  /* Since we do not know how big the string table is,
9107 	     we default to reading in the entire file (!) and
9108 	     processing that.  This is overkill, I know, but it
9109 	     should work.  */
9110 
9111 	  offset = offset_from_vma (file, entry->d_un.d_val, 0);
9112 
9113 	  if (archive_file_offset != 0)
9114 	    str_tab_len = archive_file_size - offset;
9115 	  else
9116 	    {
9117 	      if (fseek (file, 0, SEEK_END))
9118 		error (_("Unable to seek to end of file\n"));
9119 	      str_tab_len = ftell (file) - offset;
9120 	    }
9121 
9122 	  if (str_tab_len < 1)
9123 	    {
9124 	      error
9125 		(_("Unable to determine the length of the dynamic string table\n"));
9126 	      continue;
9127 	    }
9128 
9129 	  dynamic_strings = (char *) get_data (NULL, file, offset, 1,
9130                                                str_tab_len,
9131                                                _("dynamic string table"));
9132 	  dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9133 	  break;
9134 	}
9135     }
9136 
9137   /* And find the syminfo section if available.  */
9138   if (dynamic_syminfo == NULL)
9139     {
9140       unsigned long syminsz = 0;
9141 
9142       for (entry = dynamic_section;
9143 	   entry < dynamic_section + dynamic_nent;
9144 	   ++entry)
9145 	{
9146 	  if (entry->d_tag == DT_SYMINENT)
9147 	    {
9148 	      /* Note: these braces are necessary to avoid a syntax
9149 		 error from the SunOS4 C compiler.  */
9150 	      /* PR binutils/17531: A corrupt file can trigger this test.
9151 		 So do not use an assert, instead generate an error message.  */
9152 	      if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9153 		error (_("Bad value (%d) for SYMINENT entry\n"),
9154 		       (int) entry->d_un.d_val);
9155 	    }
9156 	  else if (entry->d_tag == DT_SYMINSZ)
9157 	    syminsz = entry->d_un.d_val;
9158 	  else if (entry->d_tag == DT_SYMINFO)
9159 	    dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
9160 						      syminsz);
9161 	}
9162 
9163       if (dynamic_syminfo_offset != 0 && syminsz != 0)
9164 	{
9165 	  Elf_External_Syminfo * extsyminfo;
9166 	  Elf_External_Syminfo * extsym;
9167 	  Elf_Internal_Syminfo * syminfo;
9168 
9169 	  /* There is a syminfo section.  Read the data.  */
9170 	  extsyminfo = (Elf_External_Syminfo *)
9171               get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
9172                         _("symbol information"));
9173 	  if (!extsyminfo)
9174 	    return 0;
9175 
9176 	  dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9177 	  if (dynamic_syminfo == NULL)
9178 	    {
9179 	      error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9180 		     (unsigned long) syminsz);
9181 	      return 0;
9182 	    }
9183 
9184 	  dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9185 	  for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9186 	       syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9187 	       ++syminfo, ++extsym)
9188 	    {
9189 	      syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9190 	      syminfo->si_flags = BYTE_GET (extsym->si_flags);
9191 	    }
9192 
9193 	  free (extsyminfo);
9194 	}
9195     }
9196 
9197   if (do_dynamic && dynamic_addr)
9198     printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
9199 	    dynamic_addr, (unsigned long) dynamic_nent);
9200   if (do_dynamic)
9201     printf (_("  Tag        Type                         Name/Value\n"));
9202 
9203   for (entry = dynamic_section;
9204        entry < dynamic_section + dynamic_nent;
9205        entry++)
9206     {
9207       if (do_dynamic)
9208 	{
9209 	  const char * dtype;
9210 
9211 	  putchar (' ');
9212 	  print_vma (entry->d_tag, FULL_HEX);
9213 	  dtype = get_dynamic_type (entry->d_tag);
9214 	  printf (" (%s)%*s", dtype,
9215 		  ((is_32bit_elf ? 27 : 19)
9216 		   - (int) strlen (dtype)),
9217 		  " ");
9218 	}
9219 
9220       switch (entry->d_tag)
9221 	{
9222 	case DT_FLAGS:
9223 	  if (do_dynamic)
9224 	    print_dynamic_flags (entry->d_un.d_val);
9225 	  break;
9226 
9227 	case DT_AUXILIARY:
9228 	case DT_FILTER:
9229 	case DT_CONFIG:
9230 	case DT_DEPAUDIT:
9231 	case DT_AUDIT:
9232 	  if (do_dynamic)
9233 	    {
9234 	      switch (entry->d_tag)
9235 		{
9236 		case DT_AUXILIARY:
9237 		  printf (_("Auxiliary library"));
9238 		  break;
9239 
9240 		case DT_FILTER:
9241 		  printf (_("Filter library"));
9242 		  break;
9243 
9244 		case DT_CONFIG:
9245 		  printf (_("Configuration file"));
9246 		  break;
9247 
9248 		case DT_DEPAUDIT:
9249 		  printf (_("Dependency audit library"));
9250 		  break;
9251 
9252 		case DT_AUDIT:
9253 		  printf (_("Audit library"));
9254 		  break;
9255 		}
9256 
9257 	      if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9258 		printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9259 	      else
9260 		{
9261 		  printf (": ");
9262 		  print_vma (entry->d_un.d_val, PREFIX_HEX);
9263 		  putchar ('\n');
9264 		}
9265 	    }
9266 	  break;
9267 
9268 	case DT_FEATURE:
9269 	  if (do_dynamic)
9270 	    {
9271 	      printf (_("Flags:"));
9272 
9273 	      if (entry->d_un.d_val == 0)
9274 		printf (_(" None\n"));
9275 	      else
9276 		{
9277 		  unsigned long int val = entry->d_un.d_val;
9278 
9279 		  if (val & DTF_1_PARINIT)
9280 		    {
9281 		      printf (" PARINIT");
9282 		      val ^= DTF_1_PARINIT;
9283 		    }
9284 		  if (val & DTF_1_CONFEXP)
9285 		    {
9286 		      printf (" CONFEXP");
9287 		      val ^= DTF_1_CONFEXP;
9288 		    }
9289 		  if (val != 0)
9290 		    printf (" %lx", val);
9291 		  puts ("");
9292 		}
9293 	    }
9294 	  break;
9295 
9296 	case DT_POSFLAG_1:
9297 	  if (do_dynamic)
9298 	    {
9299 	      printf (_("Flags:"));
9300 
9301 	      if (entry->d_un.d_val == 0)
9302 		printf (_(" None\n"));
9303 	      else
9304 		{
9305 		  unsigned long int val = entry->d_un.d_val;
9306 
9307 		  if (val & DF_P1_LAZYLOAD)
9308 		    {
9309 		      printf (" LAZYLOAD");
9310 		      val ^= DF_P1_LAZYLOAD;
9311 		    }
9312 		  if (val & DF_P1_GROUPPERM)
9313 		    {
9314 		      printf (" GROUPPERM");
9315 		      val ^= DF_P1_GROUPPERM;
9316 		    }
9317 		  if (val != 0)
9318 		    printf (" %lx", val);
9319 		  puts ("");
9320 		}
9321 	    }
9322 	  break;
9323 
9324 	case DT_FLAGS_1:
9325 	  if (do_dynamic)
9326 	    {
9327 	      printf (_("Flags:"));
9328 	      if (entry->d_un.d_val == 0)
9329 		printf (_(" None\n"));
9330 	      else
9331 		{
9332 		  unsigned long int val = entry->d_un.d_val;
9333 
9334 		  if (val & DF_1_NOW)
9335 		    {
9336 		      printf (" NOW");
9337 		      val ^= DF_1_NOW;
9338 		    }
9339 		  if (val & DF_1_GLOBAL)
9340 		    {
9341 		      printf (" GLOBAL");
9342 		      val ^= DF_1_GLOBAL;
9343 		    }
9344 		  if (val & DF_1_GROUP)
9345 		    {
9346 		      printf (" GROUP");
9347 		      val ^= DF_1_GROUP;
9348 		    }
9349 		  if (val & DF_1_NODELETE)
9350 		    {
9351 		      printf (" NODELETE");
9352 		      val ^= DF_1_NODELETE;
9353 		    }
9354 		  if (val & DF_1_LOADFLTR)
9355 		    {
9356 		      printf (" LOADFLTR");
9357 		      val ^= DF_1_LOADFLTR;
9358 		    }
9359 		  if (val & DF_1_INITFIRST)
9360 		    {
9361 		      printf (" INITFIRST");
9362 		      val ^= DF_1_INITFIRST;
9363 		    }
9364 		  if (val & DF_1_NOOPEN)
9365 		    {
9366 		      printf (" NOOPEN");
9367 		      val ^= DF_1_NOOPEN;
9368 		    }
9369 		  if (val & DF_1_ORIGIN)
9370 		    {
9371 		      printf (" ORIGIN");
9372 		      val ^= DF_1_ORIGIN;
9373 		    }
9374 		  if (val & DF_1_DIRECT)
9375 		    {
9376 		      printf (" DIRECT");
9377 		      val ^= DF_1_DIRECT;
9378 		    }
9379 		  if (val & DF_1_TRANS)
9380 		    {
9381 		      printf (" TRANS");
9382 		      val ^= DF_1_TRANS;
9383 		    }
9384 		  if (val & DF_1_INTERPOSE)
9385 		    {
9386 		      printf (" INTERPOSE");
9387 		      val ^= DF_1_INTERPOSE;
9388 		    }
9389 		  if (val & DF_1_NODEFLIB)
9390 		    {
9391 		      printf (" NODEFLIB");
9392 		      val ^= DF_1_NODEFLIB;
9393 		    }
9394 		  if (val & DF_1_NODUMP)
9395 		    {
9396 		      printf (" NODUMP");
9397 		      val ^= DF_1_NODUMP;
9398 		    }
9399 		  if (val & DF_1_CONFALT)
9400 		    {
9401 		      printf (" CONFALT");
9402 		      val ^= DF_1_CONFALT;
9403 		    }
9404 		  if (val & DF_1_ENDFILTEE)
9405 		    {
9406 		      printf (" ENDFILTEE");
9407 		      val ^= DF_1_ENDFILTEE;
9408 		    }
9409 		  if (val & DF_1_DISPRELDNE)
9410 		    {
9411 		      printf (" DISPRELDNE");
9412 		      val ^= DF_1_DISPRELDNE;
9413 		    }
9414 		  if (val & DF_1_DISPRELPND)
9415 		    {
9416 		      printf (" DISPRELPND");
9417 		      val ^= DF_1_DISPRELPND;
9418 		    }
9419 		  if (val & DF_1_NODIRECT)
9420 		    {
9421 		      printf (" NODIRECT");
9422 		      val ^= DF_1_NODIRECT;
9423 		    }
9424 		  if (val & DF_1_IGNMULDEF)
9425 		    {
9426 		      printf (" IGNMULDEF");
9427 		      val ^= DF_1_IGNMULDEF;
9428 		    }
9429 		  if (val & DF_1_NOKSYMS)
9430 		    {
9431 		      printf (" NOKSYMS");
9432 		      val ^= DF_1_NOKSYMS;
9433 		    }
9434 		  if (val & DF_1_NOHDR)
9435 		    {
9436 		      printf (" NOHDR");
9437 		      val ^= DF_1_NOHDR;
9438 		    }
9439 		  if (val & DF_1_EDITED)
9440 		    {
9441 		      printf (" EDITED");
9442 		      val ^= DF_1_EDITED;
9443 		    }
9444 		  if (val & DF_1_NORELOC)
9445 		    {
9446 		      printf (" NORELOC");
9447 		      val ^= DF_1_NORELOC;
9448 		    }
9449 		  if (val & DF_1_SYMINTPOSE)
9450 		    {
9451 		      printf (" SYMINTPOSE");
9452 		      val ^= DF_1_SYMINTPOSE;
9453 		    }
9454 		  if (val & DF_1_GLOBAUDIT)
9455 		    {
9456 		      printf (" GLOBAUDIT");
9457 		      val ^= DF_1_GLOBAUDIT;
9458 		    }
9459 		  if (val & DF_1_SINGLETON)
9460 		    {
9461 		      printf (" SINGLETON");
9462 		      val ^= DF_1_SINGLETON;
9463 		    }
9464 		  if (val & DF_1_STUB)
9465 		    {
9466 		      printf (" STUB");
9467 		      val ^= DF_1_STUB;
9468 		    }
9469 		  if (val & DF_1_PIE)
9470 		    {
9471 		      printf (" PIE");
9472 		      val ^= DF_1_PIE;
9473 		    }
9474 		  if (val != 0)
9475 		    printf (" %lx", val);
9476 		  puts ("");
9477 		}
9478 	    }
9479 	  break;
9480 
9481 	case DT_PLTREL:
9482 	  dynamic_info[entry->d_tag] = entry->d_un.d_val;
9483 	  if (do_dynamic)
9484 	    puts (get_dynamic_type (entry->d_un.d_val));
9485 	  break;
9486 
9487 	case DT_NULL	:
9488 	case DT_NEEDED	:
9489 	case DT_PLTGOT	:
9490 	case DT_HASH	:
9491 	case DT_STRTAB	:
9492 	case DT_SYMTAB	:
9493 	case DT_RELA	:
9494 	case DT_INIT	:
9495 	case DT_FINI	:
9496 	case DT_SONAME	:
9497 	case DT_RPATH	:
9498 	case DT_SYMBOLIC:
9499 	case DT_REL	:
9500 	case DT_DEBUG	:
9501 	case DT_TEXTREL	:
9502 	case DT_JMPREL	:
9503 	case DT_RUNPATH	:
9504 	  dynamic_info[entry->d_tag] = entry->d_un.d_val;
9505 
9506 	  if (do_dynamic)
9507 	    {
9508 	      char * name;
9509 
9510 	      if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9511 		name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9512 	      else
9513 		name = NULL;
9514 
9515 	      if (name)
9516 		{
9517 		  switch (entry->d_tag)
9518 		    {
9519 		    case DT_NEEDED:
9520 		      printf (_("Shared library: [%s]"), name);
9521 
9522 		      if (streq (name, program_interpreter))
9523 			printf (_(" program interpreter"));
9524 		      break;
9525 
9526 		    case DT_SONAME:
9527 		      printf (_("Library soname: [%s]"), name);
9528 		      break;
9529 
9530 		    case DT_RPATH:
9531 		      printf (_("Library rpath: [%s]"), name);
9532 		      break;
9533 
9534 		    case DT_RUNPATH:
9535 		      printf (_("Library runpath: [%s]"), name);
9536 		      break;
9537 
9538 		    default:
9539 		      print_vma (entry->d_un.d_val, PREFIX_HEX);
9540 		      break;
9541 		    }
9542 		}
9543 	      else
9544 		print_vma (entry->d_un.d_val, PREFIX_HEX);
9545 
9546 	      putchar ('\n');
9547 	    }
9548 	  break;
9549 
9550 	case DT_PLTRELSZ:
9551 	case DT_RELASZ	:
9552 	case DT_STRSZ	:
9553 	case DT_RELSZ	:
9554 	case DT_RELAENT	:
9555 	case DT_SYMENT	:
9556 	case DT_RELENT	:
9557 	  dynamic_info[entry->d_tag] = entry->d_un.d_val;
9558 	case DT_PLTPADSZ:
9559 	case DT_MOVEENT	:
9560 	case DT_MOVESZ	:
9561 	case DT_INIT_ARRAYSZ:
9562 	case DT_FINI_ARRAYSZ:
9563 	case DT_GNU_CONFLICTSZ:
9564 	case DT_GNU_LIBLISTSZ:
9565 	  if (do_dynamic)
9566 	    {
9567 	      print_vma (entry->d_un.d_val, UNSIGNED);
9568 	      printf (_(" (bytes)\n"));
9569 	    }
9570 	  break;
9571 
9572 	case DT_VERDEFNUM:
9573 	case DT_VERNEEDNUM:
9574 	case DT_RELACOUNT:
9575 	case DT_RELCOUNT:
9576 	  if (do_dynamic)
9577 	    {
9578 	      print_vma (entry->d_un.d_val, UNSIGNED);
9579 	      putchar ('\n');
9580 	    }
9581 	  break;
9582 
9583 	case DT_SYMINSZ:
9584 	case DT_SYMINENT:
9585 	case DT_SYMINFO:
9586 	case DT_USED:
9587 	case DT_INIT_ARRAY:
9588 	case DT_FINI_ARRAY:
9589 	  if (do_dynamic)
9590 	    {
9591 	      if (entry->d_tag == DT_USED
9592 		  && VALID_DYNAMIC_NAME (entry->d_un.d_val))
9593 		{
9594 		  char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9595 
9596 		  if (*name)
9597 		    {
9598 		      printf (_("Not needed object: [%s]\n"), name);
9599 		      break;
9600 		    }
9601 		}
9602 
9603 	      print_vma (entry->d_un.d_val, PREFIX_HEX);
9604 	      putchar ('\n');
9605 	    }
9606 	  break;
9607 
9608 	case DT_BIND_NOW:
9609 	  /* The value of this entry is ignored.  */
9610 	  if (do_dynamic)
9611 	    putchar ('\n');
9612 	  break;
9613 
9614 	case DT_GNU_PRELINKED:
9615 	  if (do_dynamic)
9616 	    {
9617 	      struct tm * tmp;
9618 	      time_t atime = entry->d_un.d_val;
9619 
9620 	      tmp = gmtime (&atime);
9621 	      /* PR 17533 file: 041-1244816-0.004.  */
9622 	      if (tmp == NULL)
9623 		printf (_("<corrupt time val: %lx"),
9624 			(unsigned long) atime);
9625 	      else
9626 		printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9627 			tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9628 			tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9629 
9630 	    }
9631 	  break;
9632 
9633 	case DT_GNU_HASH:
9634 	  dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9635 	  if (do_dynamic)
9636 	    {
9637 	      print_vma (entry->d_un.d_val, PREFIX_HEX);
9638 	      putchar ('\n');
9639 	    }
9640 	  break;
9641 
9642 	default:
9643 	  if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
9644 	    version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
9645 	      entry->d_un.d_val;
9646 
9647 	  if (do_dynamic)
9648 	    {
9649 	      switch (elf_header.e_machine)
9650 		{
9651 		case EM_MIPS:
9652 		case EM_MIPS_RS3_LE:
9653 		  dynamic_section_mips_val (entry);
9654 		  break;
9655 		case EM_PARISC:
9656 		  dynamic_section_parisc_val (entry);
9657 		  break;
9658 		case EM_IA_64:
9659 		  dynamic_section_ia64_val (entry);
9660 		  break;
9661 		default:
9662 		  print_vma (entry->d_un.d_val, PREFIX_HEX);
9663 		  putchar ('\n');
9664 		}
9665 	    }
9666 	  break;
9667 	}
9668     }
9669 
9670   return 1;
9671 }
9672 
9673 static char *
9674 get_ver_flags (unsigned int flags)
9675 {
9676   static char buff[32];
9677 
9678   buff[0] = 0;
9679 
9680   if (flags == 0)
9681     return _("none");
9682 
9683   if (flags & VER_FLG_BASE)
9684     strcat (buff, "BASE ");
9685 
9686   if (flags & VER_FLG_WEAK)
9687     {
9688       if (flags & VER_FLG_BASE)
9689 	strcat (buff, "| ");
9690 
9691       strcat (buff, "WEAK ");
9692     }
9693 
9694   if (flags & VER_FLG_INFO)
9695     {
9696       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9697 	strcat (buff, "| ");
9698 
9699       strcat (buff, "INFO ");
9700     }
9701 
9702   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
9703     strcat (buff, _("| <unknown>"));
9704 
9705   return buff;
9706 }
9707 
9708 /* Display the contents of the version sections.  */
9709 
9710 static int
9711 process_version_sections (FILE * file)
9712 {
9713   Elf_Internal_Shdr * section;
9714   unsigned i;
9715   int found = 0;
9716 
9717   if (! do_version)
9718     return 1;
9719 
9720   for (i = 0, section = section_headers;
9721        i < elf_header.e_shnum;
9722        i++, section++)
9723     {
9724       switch (section->sh_type)
9725 	{
9726 	case SHT_GNU_verdef:
9727 	  {
9728 	    Elf_External_Verdef * edefs;
9729 	    unsigned int idx;
9730 	    unsigned int cnt;
9731 	    char * endbuf;
9732 
9733 	    found = 1;
9734 
9735 	    printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9736 		    printable_section_name (section),
9737 		    section->sh_info);
9738 
9739 	    printf (_("  Addr: 0x"));
9740 	    printf_vma (section->sh_addr);
9741 	    printf (_("  Offset: %#08lx  Link: %u (%s)"),
9742 		    (unsigned long) section->sh_offset, section->sh_link,
9743 		    printable_section_name_from_index (section->sh_link));
9744 
9745 	    edefs = (Elf_External_Verdef *)
9746                 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9747                           _("version definition section"));
9748 	    if (!edefs)
9749 	      break;
9750 	    endbuf = (char *) edefs + section->sh_size;
9751 
9752 	    for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9753 	      {
9754 		char * vstart;
9755 		Elf_External_Verdef * edef;
9756 		Elf_Internal_Verdef ent;
9757 		Elf_External_Verdaux * eaux;
9758 		Elf_Internal_Verdaux aux;
9759 		int j;
9760 		int isum;
9761 
9762 		/* Check for very large indicies.  */
9763 		if (idx > (size_t) (endbuf - (char *) edefs))
9764 		  break;
9765 
9766 		vstart = ((char *) edefs) + idx;
9767 		if (vstart + sizeof (*edef) > endbuf)
9768 		  break;
9769 
9770 		edef = (Elf_External_Verdef *) vstart;
9771 
9772 		ent.vd_version = BYTE_GET (edef->vd_version);
9773 		ent.vd_flags   = BYTE_GET (edef->vd_flags);
9774 		ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
9775 		ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
9776 		ent.vd_hash    = BYTE_GET (edef->vd_hash);
9777 		ent.vd_aux     = BYTE_GET (edef->vd_aux);
9778 		ent.vd_next    = BYTE_GET (edef->vd_next);
9779 
9780 		printf (_("  %#06x: Rev: %d  Flags: %s"),
9781 			idx, ent.vd_version, get_ver_flags (ent.vd_flags));
9782 
9783 		printf (_("  Index: %d  Cnt: %d  "),
9784 			ent.vd_ndx, ent.vd_cnt);
9785 
9786 		/* Check for overflow.  */
9787 		if (ent.vd_aux > (size_t) (endbuf - vstart))
9788 		  break;
9789 
9790 		vstart += ent.vd_aux;
9791 
9792 		eaux = (Elf_External_Verdaux *) vstart;
9793 
9794 		aux.vda_name = BYTE_GET (eaux->vda_name);
9795 		aux.vda_next = BYTE_GET (eaux->vda_next);
9796 
9797 		if (VALID_DYNAMIC_NAME (aux.vda_name))
9798 		  printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
9799 		else
9800 		  printf (_("Name index: %ld\n"), aux.vda_name);
9801 
9802 		isum = idx + ent.vd_aux;
9803 
9804 		for (j = 1; j < ent.vd_cnt; j++)
9805 		  {
9806 		    /* Check for overflow.  */
9807 		    if (aux.vda_next > (size_t) (endbuf - vstart))
9808 		      break;
9809 
9810 		    isum   += aux.vda_next;
9811 		    vstart += aux.vda_next;
9812 
9813 		    eaux = (Elf_External_Verdaux *) vstart;
9814 		    if (vstart + sizeof (*eaux) > endbuf)
9815 		      break;
9816 
9817 		    aux.vda_name = BYTE_GET (eaux->vda_name);
9818 		    aux.vda_next = BYTE_GET (eaux->vda_next);
9819 
9820 		    if (VALID_DYNAMIC_NAME (aux.vda_name))
9821 		      printf (_("  %#06x: Parent %d: %s\n"),
9822 			      isum, j, GET_DYNAMIC_NAME (aux.vda_name));
9823 		    else
9824 		      printf (_("  %#06x: Parent %d, name index: %ld\n"),
9825 			      isum, j, aux.vda_name);
9826 		  }
9827 
9828 		if (j < ent.vd_cnt)
9829 		  printf (_("  Version def aux past end of section\n"));
9830 
9831 		/* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2.  */
9832 		if (idx + ent.vd_next <= idx)
9833 		  break;
9834 
9835 		idx += ent.vd_next;
9836 	      }
9837 
9838 	    if (cnt < section->sh_info)
9839 	      printf (_("  Version definition past end of section\n"));
9840 
9841 	    free (edefs);
9842 	  }
9843 	  break;
9844 
9845 	case SHT_GNU_verneed:
9846 	  {
9847 	    Elf_External_Verneed * eneed;
9848 	    unsigned int idx;
9849 	    unsigned int cnt;
9850 	    char * endbuf;
9851 
9852 	    found = 1;
9853 
9854 	    printf (_("\nVersion needs section '%s' contains %u entries:\n"),
9855 		    printable_section_name (section), section->sh_info);
9856 
9857 	    printf (_(" Addr: 0x"));
9858 	    printf_vma (section->sh_addr);
9859 	    printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
9860 		    (unsigned long) section->sh_offset, section->sh_link,
9861 		    printable_section_name_from_index (section->sh_link));
9862 
9863 	    eneed = (Elf_External_Verneed *) get_data (NULL, file,
9864                                                        section->sh_offset, 1,
9865                                                        section->sh_size,
9866                                                        _("Version Needs section"));
9867 	    if (!eneed)
9868 	      break;
9869 	    endbuf = (char *) eneed + section->sh_size;
9870 
9871 	    for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9872 	      {
9873 		Elf_External_Verneed * entry;
9874 		Elf_Internal_Verneed ent;
9875 		int j;
9876 		int isum;
9877 		char * vstart;
9878 
9879 		if (idx > (size_t) (endbuf - (char *) eneed))
9880 		  break;
9881 
9882 		vstart = ((char *) eneed) + idx;
9883 		if (vstart + sizeof (*entry) > endbuf)
9884 		  break;
9885 
9886 		entry = (Elf_External_Verneed *) vstart;
9887 
9888 		ent.vn_version = BYTE_GET (entry->vn_version);
9889 		ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
9890 		ent.vn_file    = BYTE_GET (entry->vn_file);
9891 		ent.vn_aux     = BYTE_GET (entry->vn_aux);
9892 		ent.vn_next    = BYTE_GET (entry->vn_next);
9893 
9894 		printf (_("  %#06x: Version: %d"), idx, ent.vn_version);
9895 
9896 		if (VALID_DYNAMIC_NAME (ent.vn_file))
9897 		  printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
9898 		else
9899 		  printf (_("  File: %lx"), ent.vn_file);
9900 
9901 		printf (_("  Cnt: %d\n"), ent.vn_cnt);
9902 
9903 		/* Check for overflow.  */
9904 		if (ent.vn_aux > (size_t) (endbuf - vstart))
9905 		  break;
9906 		vstart += ent.vn_aux;
9907 
9908 		for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
9909 		  {
9910 		    Elf_External_Vernaux * eaux;
9911 		    Elf_Internal_Vernaux aux;
9912 
9913 		    if (vstart + sizeof (*eaux) > endbuf)
9914 		      break;
9915 		    eaux = (Elf_External_Vernaux *) vstart;
9916 
9917 		    aux.vna_hash  = BYTE_GET (eaux->vna_hash);
9918 		    aux.vna_flags = BYTE_GET (eaux->vna_flags);
9919 		    aux.vna_other = BYTE_GET (eaux->vna_other);
9920 		    aux.vna_name  = BYTE_GET (eaux->vna_name);
9921 		    aux.vna_next  = BYTE_GET (eaux->vna_next);
9922 
9923 		    if (VALID_DYNAMIC_NAME (aux.vna_name))
9924 		      printf (_("  %#06x:   Name: %s"),
9925 			      isum, GET_DYNAMIC_NAME (aux.vna_name));
9926 		    else
9927 		      printf (_("  %#06x:   Name index: %lx"),
9928 			      isum, aux.vna_name);
9929 
9930 		    printf (_("  Flags: %s  Version: %d\n"),
9931 			    get_ver_flags (aux.vna_flags), aux.vna_other);
9932 
9933 		    /* Check for overflow.  */
9934 		    if (aux.vna_next > (size_t) (endbuf - vstart)
9935 			|| (aux.vna_next == 0 && j < ent.vn_cnt - 1))
9936 		      {
9937 			warn (_("Invalid vna_next field of %lx\n"),
9938 			      aux.vna_next);
9939 			j = ent.vn_cnt;
9940 			break;
9941 		      }
9942 		    isum   += aux.vna_next;
9943 		    vstart += aux.vna_next;
9944 		  }
9945 
9946 		if (j < ent.vn_cnt)
9947 		  warn (_("Missing Version Needs auxillary information\n"));
9948 
9949 		if (ent.vn_next == 0 && cnt < section->sh_info - 1)
9950 		  {
9951 		    warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
9952 		    cnt = section->sh_info;
9953 		    break;
9954 		  }
9955 		idx += ent.vn_next;
9956 	      }
9957 
9958 	    if (cnt < section->sh_info)
9959 	      warn (_("Missing Version Needs information\n"));
9960 
9961 	    free (eneed);
9962 	  }
9963 	  break;
9964 
9965 	case SHT_GNU_versym:
9966 	  {
9967 	    Elf_Internal_Shdr * link_section;
9968 	    size_t total;
9969 	    unsigned int cnt;
9970 	    unsigned char * edata;
9971 	    unsigned short * data;
9972 	    char * strtab;
9973 	    Elf_Internal_Sym * symbols;
9974 	    Elf_Internal_Shdr * string_sec;
9975 	    unsigned long num_syms;
9976 	    long off;
9977 
9978 	    if (section->sh_link >= elf_header.e_shnum)
9979 	      break;
9980 
9981 	    link_section = section_headers + section->sh_link;
9982 	    total = section->sh_size / sizeof (Elf_External_Versym);
9983 
9984 	    if (link_section->sh_link >= elf_header.e_shnum)
9985 	      break;
9986 
9987 	    found = 1;
9988 
9989 	    symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
9990 	    if (symbols == NULL)
9991 	      break;
9992 
9993 	    string_sec = section_headers + link_section->sh_link;
9994 
9995 	    strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
9996                                         string_sec->sh_size,
9997                                         _("version string table"));
9998 	    if (!strtab)
9999 	      {
10000 		free (symbols);
10001 		break;
10002 	      }
10003 
10004 	    printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
10005 		    printable_section_name (section), (unsigned long) total);
10006 
10007 	    printf (_(" Addr: "));
10008 	    printf_vma (section->sh_addr);
10009 	    printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10010 		    (unsigned long) section->sh_offset, section->sh_link,
10011 		    printable_section_name (link_section));
10012 
10013 	    off = offset_from_vma (file,
10014 				   version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10015 				   total * sizeof (short));
10016 	    edata = (unsigned char *) get_data (NULL, file, off, total,
10017                                                 sizeof (short),
10018                                                 _("version symbol data"));
10019 	    if (!edata)
10020 	      {
10021 		free (strtab);
10022 		free (symbols);
10023 		break;
10024 	      }
10025 
10026 	    data = (short unsigned int *) cmalloc (total, sizeof (short));
10027 
10028 	    for (cnt = total; cnt --;)
10029 	      data[cnt] = byte_get (edata + cnt * sizeof (short),
10030 				    sizeof (short));
10031 
10032 	    free (edata);
10033 
10034 	    for (cnt = 0; cnt < total; cnt += 4)
10035 	      {
10036 		int j, nn;
10037 		char *name;
10038 		char *invalid = _("*invalid*");
10039 
10040 		printf ("  %03x:", cnt);
10041 
10042 		for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10043 		  switch (data[cnt + j])
10044 		    {
10045 		    case 0:
10046 		      fputs (_("   0 (*local*)    "), stdout);
10047 		      break;
10048 
10049 		    case 1:
10050 		      fputs (_("   1 (*global*)   "), stdout);
10051 		      break;
10052 
10053 		    default:
10054 		      nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10055 				   data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10056 
10057 		      /* If this index value is greater than the size of the symbols
10058 		         array, break to avoid an out-of-bounds read.  */
10059 		      if ((unsigned long)(cnt + j) >= num_syms)
10060 		        {
10061 		          warn (_("invalid index into symbol array\n"));
10062 		          break;
10063 			}
10064 
10065 		      name = NULL;
10066 		      if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10067 			{
10068 			  Elf_Internal_Verneed ivn;
10069 			  unsigned long offset;
10070 
10071 			  offset = offset_from_vma
10072 			    (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10073 			     sizeof (Elf_External_Verneed));
10074 
10075 			  do
10076 			    {
10077 			      Elf_Internal_Vernaux ivna;
10078 			      Elf_External_Verneed evn;
10079 			      Elf_External_Vernaux evna;
10080 			      unsigned long a_off;
10081 
10082 			      if (get_data (&evn, file, offset, sizeof (evn), 1,
10083 					    _("version need")) == NULL)
10084 				break;
10085 
10086 			      ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10087 			      ivn.vn_next = BYTE_GET (evn.vn_next);
10088 
10089 			      a_off = offset + ivn.vn_aux;
10090 
10091 			      do
10092 				{
10093 				  if (get_data (&evna, file, a_off, sizeof (evna),
10094 						1, _("version need aux (2)")) == NULL)
10095 				    {
10096 				      ivna.vna_next  = 0;
10097 				      ivna.vna_other = 0;
10098 				    }
10099 				  else
10100 				    {
10101 				      ivna.vna_next  = BYTE_GET (evna.vna_next);
10102 				      ivna.vna_other = BYTE_GET (evna.vna_other);
10103 				    }
10104 
10105 				  a_off += ivna.vna_next;
10106 				}
10107 			      while (ivna.vna_other != data[cnt + j]
10108 				     && ivna.vna_next != 0);
10109 
10110 			      if (ivna.vna_other == data[cnt + j])
10111 				{
10112 				  ivna.vna_name = BYTE_GET (evna.vna_name);
10113 
10114 				  if (ivna.vna_name >= string_sec->sh_size)
10115 				    name = invalid;
10116 				  else
10117 				    name = strtab + ivna.vna_name;
10118 				  break;
10119 				}
10120 
10121 			      offset += ivn.vn_next;
10122 			    }
10123 			  while (ivn.vn_next);
10124 			}
10125 
10126 		      if (data[cnt + j] != 0x8001
10127 			  && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10128 			{
10129 			  Elf_Internal_Verdef ivd;
10130 			  Elf_External_Verdef evd;
10131 			  unsigned long offset;
10132 
10133 			  offset = offset_from_vma
10134 			    (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10135 			     sizeof evd);
10136 
10137 			  do
10138 			    {
10139 			      if (get_data (&evd, file, offset, sizeof (evd), 1,
10140 					    _("version def")) == NULL)
10141 				{
10142 				  ivd.vd_next = 0;
10143 				  /* PR 17531: file: 046-1082287-0.004.  */
10144 				  ivd.vd_ndx  = (data[cnt + j] & VERSYM_VERSION) + 1;
10145 				  break;
10146 				}
10147 			      else
10148 				{
10149 				  ivd.vd_next = BYTE_GET (evd.vd_next);
10150 				  ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
10151 				}
10152 
10153 			      offset += ivd.vd_next;
10154 			    }
10155 			  while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10156 				 && ivd.vd_next != 0);
10157 
10158 			  if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10159 			    {
10160 			      Elf_External_Verdaux evda;
10161 			      Elf_Internal_Verdaux ivda;
10162 
10163 			      ivd.vd_aux = BYTE_GET (evd.vd_aux);
10164 
10165 			      if (get_data (&evda, file,
10166 					    offset - ivd.vd_next + ivd.vd_aux,
10167 					    sizeof (evda), 1,
10168 					    _("version def aux")) == NULL)
10169 				break;
10170 
10171 			      ivda.vda_name = BYTE_GET (evda.vda_name);
10172 
10173 			      if (ivda.vda_name >= string_sec->sh_size)
10174 				name = invalid;
10175 			      else if (name != NULL && name != invalid)
10176 				name = _("*both*");
10177 			      else
10178 				name = strtab + ivda.vda_name;
10179 			    }
10180 			}
10181 		      if (name != NULL)
10182 			nn += printf ("(%s%-*s",
10183 				      name,
10184 				      12 - (int) strlen (name),
10185 				      ")");
10186 
10187 		      if (nn < 18)
10188 			printf ("%*c", 18 - nn, ' ');
10189 		    }
10190 
10191 		putchar ('\n');
10192 	      }
10193 
10194 	    free (data);
10195 	    free (strtab);
10196 	    free (symbols);
10197 	  }
10198 	  break;
10199 
10200 	default:
10201 	  break;
10202 	}
10203     }
10204 
10205   if (! found)
10206     printf (_("\nNo version information found in this file.\n"));
10207 
10208   return 1;
10209 }
10210 
10211 static const char *
10212 get_symbol_binding (unsigned int binding)
10213 {
10214   static char buff[32];
10215 
10216   switch (binding)
10217     {
10218     case STB_LOCAL:	return "LOCAL";
10219     case STB_GLOBAL:	return "GLOBAL";
10220     case STB_WEAK:	return "WEAK";
10221     default:
10222       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10223 	snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10224 		  binding);
10225       else if (binding >= STB_LOOS && binding <= STB_HIOS)
10226 	{
10227 	  if (binding == STB_GNU_UNIQUE
10228 	      && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10229 		  /* GNU is still using the default value 0.  */
10230 		  || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10231 	    return "UNIQUE";
10232 	  snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10233 	}
10234       else
10235 	snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
10236       return buff;
10237     }
10238 }
10239 
10240 static const char *
10241 get_symbol_type (unsigned int type)
10242 {
10243   static char buff[32];
10244 
10245   switch (type)
10246     {
10247     case STT_NOTYPE:	return "NOTYPE";
10248     case STT_OBJECT:	return "OBJECT";
10249     case STT_FUNC:	return "FUNC";
10250     case STT_SECTION:	return "SECTION";
10251     case STT_FILE:	return "FILE";
10252     case STT_COMMON:	return "COMMON";
10253     case STT_TLS:	return "TLS";
10254     case STT_RELC:      return "RELC";
10255     case STT_SRELC:     return "SRELC";
10256     default:
10257       if (type >= STT_LOPROC && type <= STT_HIPROC)
10258 	{
10259 	  if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10260 	    return "THUMB_FUNC";
10261 
10262 	  if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
10263 	    return "REGISTER";
10264 
10265 	  if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10266 	    return "PARISC_MILLI";
10267 
10268 	  snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
10269 	}
10270       else if (type >= STT_LOOS && type <= STT_HIOS)
10271 	{
10272 	  if (elf_header.e_machine == EM_PARISC)
10273 	    {
10274 	      if (type == STT_HP_OPAQUE)
10275 		return "HP_OPAQUE";
10276 	      if (type == STT_HP_STUB)
10277 		return "HP_STUB";
10278 	    }
10279 
10280 	  if (type == STT_GNU_IFUNC
10281 	      && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10282 		  || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
10283 		  /* GNU is still using the default value 0.  */
10284 		  || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10285 	    return "IFUNC";
10286 
10287 	  snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
10288 	}
10289       else
10290 	snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
10291       return buff;
10292     }
10293 }
10294 
10295 static const char *
10296 get_symbol_visibility (unsigned int visibility)
10297 {
10298   switch (visibility)
10299     {
10300     case STV_DEFAULT:	return "DEFAULT";
10301     case STV_INTERNAL:	return "INTERNAL";
10302     case STV_HIDDEN:	return "HIDDEN";
10303     case STV_PROTECTED: return "PROTECTED";
10304     default:
10305       error (_("Unrecognized visibility value: %u"), visibility);
10306       return _("<unknown>");
10307     }
10308 }
10309 
10310 static const char *
10311 get_solaris_symbol_visibility (unsigned int visibility)
10312 {
10313   switch (visibility)
10314     {
10315     case 4: return "EXPORTED";
10316     case 5: return "SINGLETON";
10317     case 6: return "ELIMINATE";
10318     default: return get_symbol_visibility (visibility);
10319     }
10320 }
10321 
10322 static const char *
10323 get_mips_symbol_other (unsigned int other)
10324 {
10325   switch (other)
10326     {
10327     case STO_OPTIONAL:
10328       return "OPTIONAL";
10329     case STO_MIPS_PLT:
10330       return "MIPS PLT";
10331     case STO_MIPS_PIC:
10332       return "MIPS PIC";
10333     case STO_MICROMIPS:
10334       return "MICROMIPS";
10335     case STO_MICROMIPS | STO_MIPS_PIC:
10336       return "MICROMIPS, MIPS PIC";
10337     case STO_MIPS16:
10338       return "MIPS16";
10339     default:
10340       return NULL;
10341     }
10342 }
10343 
10344 static const char *
10345 get_ia64_symbol_other (unsigned int other)
10346 {
10347   if (is_ia64_vms ())
10348     {
10349       static char res[32];
10350 
10351       res[0] = 0;
10352 
10353       /* Function types is for images and .STB files only.  */
10354       switch (elf_header.e_type)
10355         {
10356         case ET_DYN:
10357         case ET_EXEC:
10358           switch (VMS_ST_FUNC_TYPE (other))
10359             {
10360             case VMS_SFT_CODE_ADDR:
10361               strcat (res, " CA");
10362               break;
10363             case VMS_SFT_SYMV_IDX:
10364               strcat (res, " VEC");
10365               break;
10366             case VMS_SFT_FD:
10367               strcat (res, " FD");
10368               break;
10369             case VMS_SFT_RESERVE:
10370               strcat (res, " RSV");
10371               break;
10372             default:
10373 	      warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10374 		    VMS_ST_FUNC_TYPE (other));
10375 	      strcat (res, " <unknown>");
10376 	      break;
10377             }
10378           break;
10379         default:
10380           break;
10381         }
10382       switch (VMS_ST_LINKAGE (other))
10383         {
10384         case VMS_STL_IGNORE:
10385           strcat (res, " IGN");
10386           break;
10387         case VMS_STL_RESERVE:
10388           strcat (res, " RSV");
10389           break;
10390         case VMS_STL_STD:
10391           strcat (res, " STD");
10392           break;
10393         case VMS_STL_LNK:
10394           strcat (res, " LNK");
10395           break;
10396         default:
10397 	  warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10398 		VMS_ST_LINKAGE (other));
10399 	  strcat (res, " <unknown>");
10400 	  break;
10401         }
10402 
10403       if (res[0] != 0)
10404         return res + 1;
10405       else
10406         return res;
10407     }
10408   return NULL;
10409 }
10410 
10411 static const char *
10412 get_ppc64_symbol_other (unsigned int other)
10413 {
10414   if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10415     {
10416       static char buf[32];
10417       snprintf (buf, sizeof buf, _("<localentry>: %d"),
10418 		PPC64_LOCAL_ENTRY_OFFSET (other));
10419       return buf;
10420     }
10421   return NULL;
10422 }
10423 
10424 static const char *
10425 get_symbol_other (unsigned int other)
10426 {
10427   const char * result = NULL;
10428   static char buff [32];
10429 
10430   if (other == 0)
10431     return "";
10432 
10433   switch (elf_header.e_machine)
10434     {
10435     case EM_MIPS:
10436       result = get_mips_symbol_other (other);
10437       break;
10438     case EM_IA_64:
10439       result = get_ia64_symbol_other (other);
10440       break;
10441     case EM_PPC64:
10442       result = get_ppc64_symbol_other (other);
10443       break;
10444     default:
10445       result = NULL;
10446       break;
10447     }
10448 
10449   if (result)
10450     return result;
10451 
10452   snprintf (buff, sizeof buff, _("<other>: %x"), other);
10453   return buff;
10454 }
10455 
10456 static const char *
10457 get_symbol_index_type (unsigned int type)
10458 {
10459   static char buff[32];
10460 
10461   switch (type)
10462     {
10463     case SHN_UNDEF:	return "UND";
10464     case SHN_ABS:	return "ABS";
10465     case SHN_COMMON:	return "COM";
10466     default:
10467       if (type == SHN_IA_64_ANSI_COMMON
10468 	  && elf_header.e_machine == EM_IA_64
10469 	  && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10470 	return "ANSI_COM";
10471       else if ((elf_header.e_machine == EM_X86_64
10472 		|| elf_header.e_machine == EM_L1OM
10473 		|| elf_header.e_machine == EM_K1OM)
10474 	       && type == SHN_X86_64_LCOMMON)
10475 	return "LARGE_COM";
10476       else if ((type == SHN_MIPS_SCOMMON
10477 		&& elf_header.e_machine == EM_MIPS)
10478 	       || (type == SHN_TIC6X_SCOMMON
10479 		   && elf_header.e_machine == EM_TI_C6000))
10480 	return "SCOM";
10481       else if (type == SHN_MIPS_SUNDEFINED
10482 	       && elf_header.e_machine == EM_MIPS)
10483 	return "SUND";
10484       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
10485 	sprintf (buff, "PRC[0x%04x]", type & 0xffff);
10486       else if (type >= SHN_LOOS && type <= SHN_HIOS)
10487 	sprintf (buff, "OS [0x%04x]", type & 0xffff);
10488       else if (type >= SHN_LORESERVE)
10489 	sprintf (buff, "RSV[0x%04x]", type & 0xffff);
10490       else if (type >= elf_header.e_shnum)
10491 	sprintf (buff, _("bad section index[%3d]"), type);
10492       else
10493 	sprintf (buff, "%3d", type);
10494       break;
10495     }
10496 
10497   return buff;
10498 }
10499 
10500 static bfd_vma *
10501 get_dynamic_data (FILE * file, bfd_size_type number, unsigned int ent_size)
10502 {
10503   unsigned char * e_data;
10504   bfd_vma * i_data;
10505 
10506   /* If the size_t type is smaller than the bfd_size_type, eg because
10507      you are building a 32-bit tool on a 64-bit host, then make sure
10508      that when (number) is cast to (size_t) no information is lost.  */
10509   if (sizeof (size_t) < sizeof (bfd_size_type)
10510       && (bfd_size_type) ((size_t) number) != number)
10511     {
10512       error (_("Size truncation prevents reading %" BFD_VMA_FMT "u"
10513 	       " elements of size %u\n"),
10514 	     number, ent_size);
10515       return NULL;
10516     }
10517 
10518   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10519      attempting to allocate memory when the read is bound to fail.  */
10520   if (ent_size * number > current_file_size)
10521     {
10522       error (_("Invalid number of dynamic entries: %" BFD_VMA_FMT "u\n"),
10523 	     number);
10524       return NULL;
10525     }
10526 
10527   e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
10528   if (e_data == NULL)
10529     {
10530       error (_("Out of memory reading %" BFD_VMA_FMT "u dynamic entries\n"),
10531 	     number);
10532       return NULL;
10533     }
10534 
10535   if (fread (e_data, ent_size, (size_t) number, file) != number)
10536     {
10537       error (_("Unable to read in %" BFD_VMA_FMT "u bytes of dynamic data\n"),
10538 	     number * ent_size);
10539       free (e_data);
10540       return NULL;
10541     }
10542 
10543   i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
10544   if (i_data == NULL)
10545     {
10546       error (_("Out of memory allocating space for %" BFD_VMA_FMT "u"
10547 	       " dynamic entries\n"),
10548 	     number);
10549       free (e_data);
10550       return NULL;
10551     }
10552 
10553   while (number--)
10554     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
10555 
10556   free (e_data);
10557 
10558   return i_data;
10559 }
10560 
10561 static void
10562 print_dynamic_symbol (bfd_vma si, unsigned long hn)
10563 {
10564   Elf_Internal_Sym * psym;
10565   int n;
10566 
10567   n = print_vma (si, DEC_5);
10568   if (n < 5)
10569     fputs (&"     "[n], stdout);
10570   printf (" %3lu: ", hn);
10571 
10572   if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10573     {
10574       printf (_("<No info available for dynamic symbol number %lu>\n"),
10575 	      (unsigned long) si);
10576       return;
10577     }
10578 
10579   psym = dynamic_symbols + si;
10580   print_vma (psym->st_value, LONG_HEX);
10581   putchar (' ');
10582   print_vma (psym->st_size, DEC_5);
10583 
10584   printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10585   printf (" %-6s",  get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10586 
10587   if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
10588     printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
10589   else
10590     {
10591       unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
10592 
10593       printf (" %-7s",  get_symbol_visibility (vis));
10594       /* Check to see if any other bits in the st_other field are set.
10595 	 Note - displaying this information disrupts the layout of the
10596 	 table being generated, but for the moment this case is very
10597 	 rare.  */
10598       if (psym->st_other ^ vis)
10599 	printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
10600     }
10601 
10602   printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10603   if (VALID_DYNAMIC_NAME (psym->st_name))
10604     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10605   else
10606     printf (_(" <corrupt: %14ld>"), psym->st_name);
10607   putchar ('\n');
10608 }
10609 
10610 static const char *
10611 get_symbol_version_string (FILE *file, int is_dynsym,
10612 			   const char *strtab,
10613 			   unsigned long int strtab_size,
10614 			   unsigned int si, Elf_Internal_Sym *psym,
10615 			   enum versioned_symbol_info *sym_info,
10616 			   unsigned short *vna_other)
10617 {
10618   unsigned char data[2];
10619   unsigned short vers_data;
10620   unsigned long offset;
10621 
10622   if (!is_dynsym
10623       || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
10624     return NULL;
10625 
10626   offset = offset_from_vma (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10627 			    sizeof data + si * sizeof (vers_data));
10628 
10629   if (get_data (&data, file, offset + si * sizeof (vers_data),
10630 		sizeof (data), 1, _("version data")) == NULL)
10631     return NULL;
10632 
10633   vers_data = byte_get (data, 2);
10634 
10635   if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
10636     return NULL;
10637 
10638   /* Usually we'd only see verdef for defined symbols, and verneed for
10639      undefined symbols.  However, symbols defined by the linker in
10640      .dynbss for variables copied from a shared library in order to
10641      avoid text relocations are defined yet have verneed.  We could
10642      use a heuristic to detect the special case, for example, check
10643      for verneed first on symbols defined in SHT_NOBITS sections, but
10644      it is simpler and more reliable to just look for both verdef and
10645      verneed.  .dynbss might not be mapped to a SHT_NOBITS section.  */
10646 
10647   if (psym->st_shndx != SHN_UNDEF
10648       && vers_data != 0x8001
10649       && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10650     {
10651       Elf_Internal_Verdef ivd;
10652       Elf_Internal_Verdaux ivda;
10653       Elf_External_Verdaux evda;
10654       unsigned long off;
10655 
10656       off = offset_from_vma (file,
10657 			     version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10658 			     sizeof (Elf_External_Verdef));
10659 
10660       do
10661 	{
10662 	  Elf_External_Verdef evd;
10663 
10664 	  if (get_data (&evd, file, off, sizeof (evd), 1,
10665 			_("version def")) == NULL)
10666 	    {
10667 	      ivd.vd_ndx = 0;
10668 	      ivd.vd_aux = 0;
10669 	      ivd.vd_next = 0;
10670 	    }
10671 	  else
10672 	    {
10673 	      ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10674 	      ivd.vd_aux = BYTE_GET (evd.vd_aux);
10675 	      ivd.vd_next = BYTE_GET (evd.vd_next);
10676 	    }
10677 
10678 	  off += ivd.vd_next;
10679 	}
10680       while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
10681 
10682       if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
10683 	{
10684 	  off -= ivd.vd_next;
10685 	  off += ivd.vd_aux;
10686 
10687 	  if (get_data (&evda, file, off, sizeof (evda), 1,
10688 			_("version def aux")) != NULL)
10689 	    {
10690 	      ivda.vda_name = BYTE_GET (evda.vda_name);
10691 
10692 	      if (psym->st_name != ivda.vda_name)
10693 		{
10694 		  *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10695 			       ? symbol_hidden : symbol_public);
10696 		  return (ivda.vda_name < strtab_size
10697 			  ? strtab + ivda.vda_name : _("<corrupt>"));
10698 		}
10699 	    }
10700 	}
10701     }
10702 
10703   if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10704     {
10705       Elf_External_Verneed evn;
10706       Elf_Internal_Verneed ivn;
10707       Elf_Internal_Vernaux ivna;
10708 
10709       offset = offset_from_vma (file,
10710 				version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10711 				sizeof evn);
10712       do
10713 	{
10714 	  unsigned long vna_off;
10715 
10716 	  if (get_data (&evn, file, offset, sizeof (evn), 1,
10717 			_("version need")) == NULL)
10718 	    {
10719 	      ivna.vna_next = 0;
10720 	      ivna.vna_other = 0;
10721 	      ivna.vna_name = 0;
10722 	      break;
10723 	    }
10724 
10725 	  ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10726 	  ivn.vn_next = BYTE_GET (evn.vn_next);
10727 
10728 	  vna_off = offset + ivn.vn_aux;
10729 
10730 	  do
10731 	    {
10732 	      Elf_External_Vernaux evna;
10733 
10734 	      if (get_data (&evna, file, vna_off, sizeof (evna), 1,
10735 			    _("version need aux (3)")) == NULL)
10736 		{
10737 		  ivna.vna_next = 0;
10738 		  ivna.vna_other = 0;
10739 		  ivna.vna_name = 0;
10740 		}
10741 	      else
10742 		{
10743 		  ivna.vna_other = BYTE_GET (evna.vna_other);
10744 		  ivna.vna_next  = BYTE_GET (evna.vna_next);
10745 		  ivna.vna_name  = BYTE_GET (evna.vna_name);
10746 		}
10747 
10748 	      vna_off += ivna.vna_next;
10749 	    }
10750 	  while (ivna.vna_other != vers_data && ivna.vna_next != 0);
10751 
10752 	  if (ivna.vna_other == vers_data)
10753 	    break;
10754 
10755 	  offset += ivn.vn_next;
10756 	}
10757       while (ivn.vn_next != 0);
10758 
10759       if (ivna.vna_other == vers_data)
10760 	{
10761 	  *sym_info = symbol_undefined;
10762 	  *vna_other = ivna.vna_other;
10763 	  return (ivna.vna_name < strtab_size
10764 		  ? strtab + ivna.vna_name : _("<corrupt>"));
10765 	}
10766     }
10767   return NULL;
10768 }
10769 
10770 /* Dump the symbol table.  */
10771 static int
10772 process_symbol_table (FILE * file)
10773 {
10774   Elf_Internal_Shdr * section;
10775   bfd_size_type nbuckets = 0;
10776   bfd_size_type nchains = 0;
10777   bfd_vma * buckets = NULL;
10778   bfd_vma * chains = NULL;
10779   bfd_vma ngnubuckets = 0;
10780   bfd_vma * gnubuckets = NULL;
10781   bfd_vma * gnuchains = NULL;
10782   bfd_vma gnusymidx = 0;
10783   bfd_size_type ngnuchains = 0;
10784 
10785   if (!do_syms && !do_dyn_syms && !do_histogram)
10786     return 1;
10787 
10788   if (dynamic_info[DT_HASH]
10789       && (do_histogram
10790 	  || (do_using_dynamic
10791 	      && !do_dyn_syms
10792 	      && dynamic_strings != NULL)))
10793     {
10794       unsigned char nb[8];
10795       unsigned char nc[8];
10796       unsigned int hash_ent_size = 4;
10797 
10798       if ((elf_header.e_machine == EM_ALPHA
10799 	   || elf_header.e_machine == EM_S390
10800 	   || elf_header.e_machine == EM_S390_OLD)
10801 	  && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
10802 	hash_ent_size = 8;
10803 
10804       if (fseek (file,
10805 		 (archive_file_offset
10806 		  + offset_from_vma (file, dynamic_info[DT_HASH],
10807 				     sizeof nb + sizeof nc)),
10808 		 SEEK_SET))
10809 	{
10810 	  error (_("Unable to seek to start of dynamic information\n"));
10811 	  goto no_hash;
10812 	}
10813 
10814       if (fread (nb, hash_ent_size, 1, file) != 1)
10815 	{
10816 	  error (_("Failed to read in number of buckets\n"));
10817 	  goto no_hash;
10818 	}
10819 
10820       if (fread (nc, hash_ent_size, 1, file) != 1)
10821 	{
10822 	  error (_("Failed to read in number of chains\n"));
10823 	  goto no_hash;
10824 	}
10825 
10826       nbuckets = byte_get (nb, hash_ent_size);
10827       nchains  = byte_get (nc, hash_ent_size);
10828 
10829       buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
10830       chains  = get_dynamic_data (file, nchains, hash_ent_size);
10831 
10832     no_hash:
10833       if (buckets == NULL || chains == NULL)
10834 	{
10835 	  if (do_using_dynamic)
10836 	    return 0;
10837 	  free (buckets);
10838 	  free (chains);
10839 	  buckets = NULL;
10840 	  chains = NULL;
10841 	  nbuckets = 0;
10842 	  nchains = 0;
10843 	}
10844     }
10845 
10846   if (dynamic_info_DT_GNU_HASH
10847       && (do_histogram
10848 	  || (do_using_dynamic
10849 	      && !do_dyn_syms
10850 	      && dynamic_strings != NULL)))
10851     {
10852       unsigned char nb[16];
10853       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
10854       bfd_vma buckets_vma;
10855 
10856       if (fseek (file,
10857 		 (archive_file_offset
10858 		  + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
10859 				     sizeof nb)),
10860 		 SEEK_SET))
10861 	{
10862 	  error (_("Unable to seek to start of dynamic information\n"));
10863 	  goto no_gnu_hash;
10864 	}
10865 
10866       if (fread (nb, 16, 1, file) != 1)
10867 	{
10868 	  error (_("Failed to read in number of buckets\n"));
10869 	  goto no_gnu_hash;
10870 	}
10871 
10872       ngnubuckets = byte_get (nb, 4);
10873       gnusymidx = byte_get (nb + 4, 4);
10874       bitmaskwords = byte_get (nb + 8, 4);
10875       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
10876       if (is_32bit_elf)
10877 	buckets_vma += bitmaskwords * 4;
10878       else
10879 	buckets_vma += bitmaskwords * 8;
10880 
10881       if (fseek (file,
10882 		 (archive_file_offset
10883 		  + offset_from_vma (file, buckets_vma, 4)),
10884 		 SEEK_SET))
10885 	{
10886 	  error (_("Unable to seek to start of dynamic information\n"));
10887 	  goto no_gnu_hash;
10888 	}
10889 
10890       gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
10891 
10892       if (gnubuckets == NULL)
10893 	goto no_gnu_hash;
10894 
10895       for (i = 0; i < ngnubuckets; i++)
10896 	if (gnubuckets[i] != 0)
10897 	  {
10898 	    if (gnubuckets[i] < gnusymidx)
10899 	      return 0;
10900 
10901 	    if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
10902 	      maxchain = gnubuckets[i];
10903 	  }
10904 
10905       if (maxchain == 0xffffffff)
10906 	goto no_gnu_hash;
10907 
10908       maxchain -= gnusymidx;
10909 
10910       if (fseek (file,
10911 		 (archive_file_offset
10912 		  + offset_from_vma (file, buckets_vma
10913 					   + 4 * (ngnubuckets + maxchain), 4)),
10914 		 SEEK_SET))
10915 	{
10916 	  error (_("Unable to seek to start of dynamic information\n"));
10917 	  goto no_gnu_hash;
10918 	}
10919 
10920       do
10921 	{
10922 	  if (fread (nb, 4, 1, file) != 1)
10923 	    {
10924 	      error (_("Failed to determine last chain length\n"));
10925 	      goto no_gnu_hash;
10926 	    }
10927 
10928 	  if (maxchain + 1 == 0)
10929 	    goto no_gnu_hash;
10930 
10931 	  ++maxchain;
10932 	}
10933       while ((byte_get (nb, 4) & 1) == 0);
10934 
10935       if (fseek (file,
10936 		 (archive_file_offset
10937 		  + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
10938 		 SEEK_SET))
10939 	{
10940 	  error (_("Unable to seek to start of dynamic information\n"));
10941 	  goto no_gnu_hash;
10942 	}
10943 
10944       gnuchains = get_dynamic_data (file, maxchain, 4);
10945       ngnuchains = maxchain;
10946 
10947     no_gnu_hash:
10948       if (gnuchains == NULL)
10949 	{
10950 	  free (gnubuckets);
10951 	  gnubuckets = NULL;
10952 	  ngnubuckets = 0;
10953 	  if (do_using_dynamic)
10954 	    return 0;
10955 	}
10956     }
10957 
10958   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
10959       && do_syms
10960       && do_using_dynamic
10961       && dynamic_strings != NULL
10962       && dynamic_symbols != NULL)
10963     {
10964       unsigned long hn;
10965 
10966       if (dynamic_info[DT_HASH])
10967 	{
10968 	  bfd_vma si;
10969 
10970 	  printf (_("\nSymbol table for image:\n"));
10971 	  if (is_32bit_elf)
10972 	    printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
10973 	  else
10974 	    printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
10975 
10976 	  for (hn = 0; hn < nbuckets; hn++)
10977 	    {
10978 	      if (! buckets[hn])
10979 		continue;
10980 
10981 	      for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
10982 		print_dynamic_symbol (si, hn);
10983 	    }
10984 	}
10985 
10986       if (dynamic_info_DT_GNU_HASH)
10987 	{
10988 	  printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
10989 	  if (is_32bit_elf)
10990 	    printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
10991 	  else
10992 	    printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
10993 
10994 	  for (hn = 0; hn < ngnubuckets; ++hn)
10995 	    if (gnubuckets[hn] != 0)
10996 	      {
10997 		bfd_vma si = gnubuckets[hn];
10998 		bfd_vma off = si - gnusymidx;
10999 
11000 		do
11001 		  {
11002 		    print_dynamic_symbol (si, hn);
11003 		    si++;
11004 		  }
11005 		while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11006 	      }
11007 	}
11008     }
11009   else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11010 	   && section_headers != NULL)
11011     {
11012       unsigned int i;
11013 
11014       for (i = 0, section = section_headers;
11015 	   i < elf_header.e_shnum;
11016 	   i++, section++)
11017 	{
11018 	  unsigned int si;
11019 	  char * strtab = NULL;
11020 	  unsigned long int strtab_size = 0;
11021 	  Elf_Internal_Sym * symtab;
11022 	  Elf_Internal_Sym * psym;
11023 	  unsigned long num_syms;
11024 
11025 	  if ((section->sh_type != SHT_SYMTAB
11026 	       && section->sh_type != SHT_DYNSYM)
11027 	      || (!do_syms
11028 		  && section->sh_type == SHT_SYMTAB))
11029 	    continue;
11030 
11031 	  if (section->sh_entsize == 0)
11032 	    {
11033 	      printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11034 		      printable_section_name (section));
11035 	      continue;
11036 	    }
11037 
11038 	  printf (_("\nSymbol table '%s' contains %lu entries:\n"),
11039 		  printable_section_name (section),
11040 		  (unsigned long) (section->sh_size / section->sh_entsize));
11041 
11042 	  if (is_32bit_elf)
11043 	    printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
11044 	  else
11045 	    printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
11046 
11047 	  symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
11048 	  if (symtab == NULL)
11049 	    continue;
11050 
11051 	  if (section->sh_link == elf_header.e_shstrndx)
11052 	    {
11053 	      strtab = string_table;
11054 	      strtab_size = string_table_length;
11055 	    }
11056 	  else if (section->sh_link < elf_header.e_shnum)
11057 	    {
11058 	      Elf_Internal_Shdr * string_sec;
11059 
11060 	      string_sec = section_headers + section->sh_link;
11061 
11062 	      strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
11063                                           1, string_sec->sh_size,
11064                                           _("string table"));
11065 	      strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11066 	    }
11067 
11068 	  for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11069 	    {
11070 	      const char *version_string;
11071 	      enum versioned_symbol_info sym_info;
11072 	      unsigned short vna_other;
11073 
11074 	      printf ("%6d: ", si);
11075 	      print_vma (psym->st_value, LONG_HEX);
11076 	      putchar (' ');
11077 	      print_vma (psym->st_size, DEC_5);
11078 	      printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
11079 	      printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
11080 	      if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11081 		printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11082 	      else
11083 		{
11084 		  unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11085 
11086 		  printf (" %-7s", get_symbol_visibility (vis));
11087 		  /* Check to see if any other bits in the st_other field are set.
11088 		     Note - displaying this information disrupts the layout of the
11089 		     table being generated, but for the moment this case is very rare.  */
11090 		  if (psym->st_other ^ vis)
11091 		    printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
11092 		}
11093 	      printf (" %4s ", get_symbol_index_type (psym->st_shndx));
11094 	      print_symbol (25, psym->st_name < strtab_size
11095 			    ? strtab + psym->st_name : _("<corrupt>"));
11096 
11097 	      version_string
11098 		= get_symbol_version_string (file,
11099 					     section->sh_type == SHT_DYNSYM,
11100 					     strtab, strtab_size, si,
11101 					     psym, &sym_info, &vna_other);
11102 	      if (version_string)
11103 		{
11104 		  if (sym_info == symbol_undefined)
11105 		    printf ("@%s (%d)", version_string, vna_other);
11106 		  else
11107 		    printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11108 			    version_string);
11109 		}
11110 
11111 	      putchar ('\n');
11112 	    }
11113 
11114 	  free (symtab);
11115 	  if (strtab != string_table)
11116 	    free (strtab);
11117 	}
11118     }
11119   else if (do_syms)
11120     printf
11121       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11122 
11123   if (do_histogram && buckets != NULL)
11124     {
11125       unsigned long * lengths;
11126       unsigned long * counts;
11127       unsigned long hn;
11128       bfd_vma si;
11129       unsigned long maxlength = 0;
11130       unsigned long nzero_counts = 0;
11131       unsigned long nsyms = 0;
11132       unsigned long chained;
11133 
11134       printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
11135 	      (unsigned long) nbuckets);
11136 
11137       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11138       if (lengths == NULL)
11139 	{
11140 	  error (_("Out of memory allocating space for histogram buckets\n"));
11141 	  return 0;
11142 	}
11143 
11144       printf (_(" Length  Number     %% of total  Coverage\n"));
11145       for (hn = 0; hn < nbuckets; ++hn)
11146 	{
11147 	  for (si = buckets[hn], chained = 0;
11148 	       si > 0 && si < nchains && si < nbuckets && chained <= nchains;
11149 	       si = chains[si], ++chained)
11150 	    {
11151 	      ++nsyms;
11152 	      if (maxlength < ++lengths[hn])
11153 		++maxlength;
11154 	    }
11155 
11156 	    /* PR binutils/17531: A corrupt binary could contain broken
11157 	       histogram data.  Do not go into an infinite loop trying
11158 	       to process it.  */
11159 	    if (chained > nchains)
11160 	      {
11161 		error (_("histogram chain is corrupt\n"));
11162 		break;
11163 	      }
11164 	}
11165 
11166       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11167       if (counts == NULL)
11168 	{
11169 	  free (lengths);
11170 	  error (_("Out of memory allocating space for histogram counts\n"));
11171 	  return 0;
11172 	}
11173 
11174       for (hn = 0; hn < nbuckets; ++hn)
11175 	++counts[lengths[hn]];
11176 
11177       if (nbuckets > 0)
11178 	{
11179 	  unsigned long i;
11180 	  printf ("      0  %-10lu (%5.1f%%)\n",
11181 		  counts[0], (counts[0] * 100.0) / nbuckets);
11182 	  for (i = 1; i <= maxlength; ++i)
11183 	    {
11184 	      nzero_counts += counts[i] * i;
11185 	      printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
11186 		      i, counts[i], (counts[i] * 100.0) / nbuckets,
11187 		      (nzero_counts * 100.0) / nsyms);
11188 	    }
11189 	}
11190 
11191       free (counts);
11192       free (lengths);
11193     }
11194 
11195   if (buckets != NULL)
11196     {
11197       free (buckets);
11198       free (chains);
11199     }
11200 
11201   if (do_histogram && gnubuckets != NULL)
11202     {
11203       unsigned long * lengths;
11204       unsigned long * counts;
11205       unsigned long hn;
11206       unsigned long maxlength = 0;
11207       unsigned long nzero_counts = 0;
11208       unsigned long nsyms = 0;
11209 
11210       printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
11211 	      (unsigned long) ngnubuckets);
11212 
11213       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
11214       if (lengths == NULL)
11215 	{
11216 	  error (_("Out of memory allocating space for gnu histogram buckets\n"));
11217 	  return 0;
11218 	}
11219 
11220       printf (_(" Length  Number     %% of total  Coverage\n"));
11221 
11222       for (hn = 0; hn < ngnubuckets; ++hn)
11223 	if (gnubuckets[hn] != 0)
11224 	  {
11225 	    bfd_vma off, length = 1;
11226 
11227 	    for (off = gnubuckets[hn] - gnusymidx;
11228 		 /* PR 17531 file: 010-77222-0.004.  */
11229 		 off < ngnuchains && (gnuchains[off] & 1) == 0;
11230 		 ++off)
11231 	      ++length;
11232 	    lengths[hn] = length;
11233 	    if (length > maxlength)
11234 	      maxlength = length;
11235 	    nsyms += length;
11236 	  }
11237 
11238       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11239       if (counts == NULL)
11240 	{
11241 	  free (lengths);
11242 	  error (_("Out of memory allocating space for gnu histogram counts\n"));
11243 	  return 0;
11244 	}
11245 
11246       for (hn = 0; hn < ngnubuckets; ++hn)
11247 	++counts[lengths[hn]];
11248 
11249       if (ngnubuckets > 0)
11250 	{
11251 	  unsigned long j;
11252 	  printf ("      0  %-10lu (%5.1f%%)\n",
11253 		  counts[0], (counts[0] * 100.0) / ngnubuckets);
11254 	  for (j = 1; j <= maxlength; ++j)
11255 	    {
11256 	      nzero_counts += counts[j] * j;
11257 	      printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
11258 		      j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11259 		      (nzero_counts * 100.0) / nsyms);
11260 	    }
11261 	}
11262 
11263       free (counts);
11264       free (lengths);
11265       free (gnubuckets);
11266       free (gnuchains);
11267     }
11268 
11269   return 1;
11270 }
11271 
11272 static int
11273 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
11274 {
11275   unsigned int i;
11276 
11277   if (dynamic_syminfo == NULL
11278       || !do_dynamic)
11279     /* No syminfo, this is ok.  */
11280     return 1;
11281 
11282   /* There better should be a dynamic symbol section.  */
11283   if (dynamic_symbols == NULL || dynamic_strings == NULL)
11284     return 0;
11285 
11286   if (dynamic_addr)
11287     printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
11288 	    dynamic_syminfo_offset, dynamic_syminfo_nent);
11289 
11290   printf (_(" Num: Name                           BoundTo     Flags\n"));
11291   for (i = 0; i < dynamic_syminfo_nent; ++i)
11292     {
11293       unsigned short int flags = dynamic_syminfo[i].si_flags;
11294 
11295       printf ("%4d: ", i);
11296       if (i >= num_dynamic_syms)
11297 	printf (_("<corrupt index>"));
11298       else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
11299 	print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11300       else
11301 	printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
11302       putchar (' ');
11303 
11304       switch (dynamic_syminfo[i].si_boundto)
11305 	{
11306 	case SYMINFO_BT_SELF:
11307 	  fputs ("SELF       ", stdout);
11308 	  break;
11309 	case SYMINFO_BT_PARENT:
11310 	  fputs ("PARENT     ", stdout);
11311 	  break;
11312 	default:
11313 	  if (dynamic_syminfo[i].si_boundto > 0
11314 	      && dynamic_syminfo[i].si_boundto < dynamic_nent
11315 	      && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
11316 	    {
11317 	      print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
11318 	      putchar (' ' );
11319 	    }
11320 	  else
11321 	    printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11322 	  break;
11323 	}
11324 
11325       if (flags & SYMINFO_FLG_DIRECT)
11326 	printf (" DIRECT");
11327       if (flags & SYMINFO_FLG_PASSTHRU)
11328 	printf (" PASSTHRU");
11329       if (flags & SYMINFO_FLG_COPY)
11330 	printf (" COPY");
11331       if (flags & SYMINFO_FLG_LAZYLOAD)
11332 	printf (" LAZYLOAD");
11333 
11334       puts ("");
11335     }
11336 
11337   return 1;
11338 }
11339 
11340 /* Check to see if the given reloc needs to be handled in a target specific
11341    manner.  If so then process the reloc and return TRUE otherwise return
11342    FALSE.  */
11343 
11344 static bfd_boolean
11345 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
11346 				unsigned char *     start,
11347 				Elf_Internal_Sym *  symtab)
11348 {
11349   unsigned int reloc_type = get_reloc_type (reloc->r_info);
11350 
11351   switch (elf_header.e_machine)
11352     {
11353     case EM_MSP430:
11354     case EM_MSP430_OLD:
11355       {
11356 	static Elf_Internal_Sym * saved_sym = NULL;
11357 
11358 	switch (reloc_type)
11359 	  {
11360 	  case 10: /* R_MSP430_SYM_DIFF */
11361 	    if (uses_msp430x_relocs ())
11362 	      break;
11363 	  case 21: /* R_MSP430X_SYM_DIFF */
11364 	    saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11365 	    return TRUE;
11366 
11367 	  case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11368 	  case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11369 	    goto handle_sym_diff;
11370 
11371 	  case 5: /* R_MSP430_16_BYTE */
11372 	  case 9: /* R_MSP430_8 */
11373 	    if (uses_msp430x_relocs ())
11374 	      break;
11375 	    goto handle_sym_diff;
11376 
11377 	  case 2: /* R_MSP430_ABS16 */
11378 	  case 15: /* R_MSP430X_ABS16 */
11379 	    if (! uses_msp430x_relocs ())
11380 	      break;
11381 	    goto handle_sym_diff;
11382 
11383 	  handle_sym_diff:
11384 	    if (saved_sym != NULL)
11385 	      {
11386 		bfd_vma value;
11387 
11388 		value = reloc->r_addend
11389 		  + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11390 		     - saved_sym->st_value);
11391 
11392 		byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11393 
11394 		saved_sym = NULL;
11395 		return TRUE;
11396 	      }
11397 	    break;
11398 
11399 	  default:
11400 	    if (saved_sym != NULL)
11401 	      error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
11402 	    break;
11403 	  }
11404 	break;
11405       }
11406 
11407     case EM_MN10300:
11408     case EM_CYGNUS_MN10300:
11409       {
11410 	static Elf_Internal_Sym * saved_sym = NULL;
11411 
11412 	switch (reloc_type)
11413 	  {
11414 	  case 34: /* R_MN10300_ALIGN */
11415 	    return TRUE;
11416 	  case 33: /* R_MN10300_SYM_DIFF */
11417 	    saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11418 	    return TRUE;
11419 	  case 1: /* R_MN10300_32 */
11420 	  case 2: /* R_MN10300_16 */
11421 	    if (saved_sym != NULL)
11422 	      {
11423 		bfd_vma value;
11424 
11425 		value = reloc->r_addend
11426 		  + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11427 		     - saved_sym->st_value);
11428 
11429 		byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11430 
11431 		saved_sym = NULL;
11432 		return TRUE;
11433 	      }
11434 	    break;
11435 	  default:
11436 	    if (saved_sym != NULL)
11437 	      error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
11438 	    break;
11439 	  }
11440 	break;
11441       }
11442 
11443     case EM_RL78:
11444       {
11445 	static bfd_vma saved_sym1 = 0;
11446 	static bfd_vma saved_sym2 = 0;
11447 	static bfd_vma value;
11448 
11449 	switch (reloc_type)
11450 	  {
11451 	  case 0x80: /* R_RL78_SYM.  */
11452 	    saved_sym1 = saved_sym2;
11453 	    saved_sym2 = symtab[get_reloc_symindex (reloc->r_info)].st_value;
11454 	    saved_sym2 += reloc->r_addend;
11455 	    return TRUE;
11456 
11457 	  case 0x83: /* R_RL78_OPsub.  */
11458 	    value = saved_sym1 - saved_sym2;
11459 	    saved_sym2 = saved_sym1 = 0;
11460 	    return TRUE;
11461 	    break;
11462 
11463 	  case 0x41: /* R_RL78_ABS32.  */
11464 	    byte_put (start + reloc->r_offset, value, 4);
11465 	    value = 0;
11466 	    return TRUE;
11467 
11468 	  case 0x43: /* R_RL78_ABS16.  */
11469 	    byte_put (start + reloc->r_offset, value, 2);
11470 	    value = 0;
11471 	    return TRUE;
11472 
11473 	  default:
11474 	    break;
11475 	  }
11476 	break;
11477       }
11478     }
11479 
11480   return FALSE;
11481 }
11482 
11483 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11484    DWARF debug sections.  This is a target specific test.  Note - we do not
11485    go through the whole including-target-headers-multiple-times route, (as
11486    we have already done with <elf/h8.h>) because this would become very
11487    messy and even then this function would have to contain target specific
11488    information (the names of the relocs instead of their numeric values).
11489    FIXME: This is not the correct way to solve this problem.  The proper way
11490    is to have target specific reloc sizing and typing functions created by
11491    the reloc-macros.h header, in the same way that it already creates the
11492    reloc naming functions.  */
11493 
11494 static bfd_boolean
11495 is_32bit_abs_reloc (unsigned int reloc_type)
11496 {
11497   /* Please keep this table alpha-sorted for ease of visual lookup.  */
11498   switch (elf_header.e_machine)
11499     {
11500     case EM_386:
11501     case EM_IAMCU:
11502       return reloc_type == 1; /* R_386_32.  */
11503     case EM_68K:
11504       return reloc_type == 1; /* R_68K_32.  */
11505     case EM_860:
11506       return reloc_type == 1; /* R_860_32.  */
11507     case EM_960:
11508       return reloc_type == 2; /* R_960_32.  */
11509     case EM_AARCH64:
11510       return reloc_type == 258; /* R_AARCH64_ABS32 */
11511     case EM_ADAPTEVA_EPIPHANY:
11512       return reloc_type == 3;
11513     case EM_ALPHA:
11514       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
11515     case EM_ARC:
11516       return reloc_type == 1; /* R_ARC_32.  */
11517     case EM_ARC_COMPACT:
11518     case EM_ARC_COMPACT2:
11519       return reloc_type == 4; /* R_ARC_32.  */
11520     case EM_ARM:
11521       return reloc_type == 2; /* R_ARM_ABS32 */
11522     case EM_AVR_OLD:
11523     case EM_AVR:
11524       return reloc_type == 1;
11525     case EM_BLACKFIN:
11526       return reloc_type == 0x12; /* R_byte4_data.  */
11527     case EM_CRIS:
11528       return reloc_type == 3; /* R_CRIS_32.  */
11529     case EM_CR16:
11530       return reloc_type == 3; /* R_CR16_NUM32.  */
11531     case EM_CRX:
11532       return reloc_type == 15; /* R_CRX_NUM32.  */
11533     case EM_CYGNUS_FRV:
11534       return reloc_type == 1;
11535     case EM_CYGNUS_D10V:
11536     case EM_D10V:
11537       return reloc_type == 6; /* R_D10V_32.  */
11538     case EM_CYGNUS_D30V:
11539     case EM_D30V:
11540       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
11541     case EM_DLX:
11542       return reloc_type == 3; /* R_DLX_RELOC_32.  */
11543     case EM_CYGNUS_FR30:
11544     case EM_FR30:
11545       return reloc_type == 3; /* R_FR30_32.  */
11546     case EM_FT32:
11547       return reloc_type == 1; /* R_FT32_32.  */
11548     case EM_H8S:
11549     case EM_H8_300:
11550     case EM_H8_300H:
11551       return reloc_type == 1; /* R_H8_DIR32.  */
11552     case EM_IA_64:
11553       return reloc_type == 0x65 /* R_IA64_SECREL32LSB.  */
11554 	|| reloc_type == 0x25;  /* R_IA64_DIR32LSB.  */
11555     case EM_IP2K_OLD:
11556     case EM_IP2K:
11557       return reloc_type == 2; /* R_IP2K_32.  */
11558     case EM_IQ2000:
11559       return reloc_type == 2; /* R_IQ2000_32.  */
11560     case EM_LATTICEMICO32:
11561       return reloc_type == 3; /* R_LM32_32.  */
11562     case EM_M32C_OLD:
11563     case EM_M32C:
11564       return reloc_type == 3; /* R_M32C_32.  */
11565     case EM_M32R:
11566       return reloc_type == 34; /* R_M32R_32_RELA.  */
11567     case EM_68HC11:
11568     case EM_68HC12:
11569       return reloc_type == 6; /* R_M68HC11_32.  */
11570     case EM_MCORE:
11571       return reloc_type == 1; /* R_MCORE_ADDR32.  */
11572     case EM_CYGNUS_MEP:
11573       return reloc_type == 4; /* R_MEP_32.  */
11574     case EM_METAG:
11575       return reloc_type == 2; /* R_METAG_ADDR32.  */
11576     case EM_MICROBLAZE:
11577       return reloc_type == 1; /* R_MICROBLAZE_32.  */
11578     case EM_MIPS:
11579       return reloc_type == 2; /* R_MIPS_32.  */
11580     case EM_MMIX:
11581       return reloc_type == 4; /* R_MMIX_32.  */
11582     case EM_CYGNUS_MN10200:
11583     case EM_MN10200:
11584       return reloc_type == 1; /* R_MN10200_32.  */
11585     case EM_CYGNUS_MN10300:
11586     case EM_MN10300:
11587       return reloc_type == 1; /* R_MN10300_32.  */
11588     case EM_MOXIE:
11589       return reloc_type == 1; /* R_MOXIE_32.  */
11590     case EM_MSP430_OLD:
11591     case EM_MSP430:
11592       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
11593     case EM_MT:
11594       return reloc_type == 2; /* R_MT_32.  */
11595     case EM_NDS32:
11596       return reloc_type == 20; /* R_NDS32_RELA.  */
11597     case EM_ALTERA_NIOS2:
11598       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
11599     case EM_NIOS32:
11600       return reloc_type == 1; /* R_NIOS_32.  */
11601     case EM_OR1K:
11602       return reloc_type == 1; /* R_OR1K_32.  */
11603     case EM_PARISC:
11604       return (reloc_type == 1 /* R_PARISC_DIR32.  */
11605 	      || reloc_type == 41); /* R_PARISC_SECREL32.  */
11606     case EM_PJ:
11607     case EM_PJ_OLD:
11608       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
11609     case EM_PPC64:
11610       return reloc_type == 1; /* R_PPC64_ADDR32.  */
11611     case EM_PPC:
11612       return reloc_type == 1; /* R_PPC_ADDR32.  */
11613     case EM_RL78:
11614       return reloc_type == 1; /* R_RL78_DIR32.  */
11615     case EM_RX:
11616       return reloc_type == 1; /* R_RX_DIR32.  */
11617     case EM_S370:
11618       return reloc_type == 1; /* R_I370_ADDR31.  */
11619     case EM_S390_OLD:
11620     case EM_S390:
11621       return reloc_type == 4; /* R_S390_32.  */
11622     case EM_SCORE:
11623       return reloc_type == 8; /* R_SCORE_ABS32.  */
11624     case EM_SH:
11625       return reloc_type == 1; /* R_SH_DIR32.  */
11626     case EM_SPARC32PLUS:
11627     case EM_SPARCV9:
11628     case EM_SPARC:
11629       return reloc_type == 3 /* R_SPARC_32.  */
11630 	|| reloc_type == 23; /* R_SPARC_UA32.  */
11631     case EM_SPU:
11632       return reloc_type == 6; /* R_SPU_ADDR32 */
11633     case EM_TI_C6000:
11634       return reloc_type == 1; /* R_C6000_ABS32.  */
11635     case EM_TILEGX:
11636       return reloc_type == 2; /* R_TILEGX_32.  */
11637     case EM_TILEPRO:
11638       return reloc_type == 1; /* R_TILEPRO_32.  */
11639     case EM_CYGNUS_V850:
11640     case EM_V850:
11641       return reloc_type == 6; /* R_V850_ABS32.  */
11642     case EM_V800:
11643       return reloc_type == 0x33; /* R_V810_WORD.  */
11644     case EM_VAX:
11645       return reloc_type == 1; /* R_VAX_32.  */
11646     case EM_VISIUM:
11647       return reloc_type == 3;  /* R_VISIUM_32. */
11648     case EM_X86_64:
11649     case EM_L1OM:
11650     case EM_K1OM:
11651       return reloc_type == 10; /* R_X86_64_32.  */
11652     case EM_XC16X:
11653     case EM_C166:
11654       return reloc_type == 3; /* R_XC16C_ABS_32.  */
11655     case EM_XGATE:
11656       return reloc_type == 4; /* R_XGATE_32.  */
11657     case EM_XSTORMY16:
11658       return reloc_type == 1; /* R_XSTROMY16_32.  */
11659     case EM_XTENSA_OLD:
11660     case EM_XTENSA:
11661       return reloc_type == 1; /* R_XTENSA_32.  */
11662     default:
11663       {
11664 	static unsigned int prev_warn = 0;
11665 
11666 	/* Avoid repeating the same warning multiple times.  */
11667 	if (prev_warn != elf_header.e_machine)
11668 	  error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
11669 		 elf_header.e_machine);
11670 	prev_warn = elf_header.e_machine;
11671 	return FALSE;
11672       }
11673     }
11674 }
11675 
11676 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11677    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
11678 
11679 static bfd_boolean
11680 is_32bit_pcrel_reloc (unsigned int reloc_type)
11681 {
11682   switch (elf_header.e_machine)
11683   /* Please keep this table alpha-sorted for ease of visual lookup.  */
11684     {
11685     case EM_386:
11686     case EM_IAMCU:
11687       return reloc_type == 2;  /* R_386_PC32.  */
11688     case EM_68K:
11689       return reloc_type == 4;  /* R_68K_PC32.  */
11690     case EM_AARCH64:
11691       return reloc_type == 261; /* R_AARCH64_PREL32 */
11692     case EM_ADAPTEVA_EPIPHANY:
11693       return reloc_type == 6;
11694     case EM_ALPHA:
11695       return reloc_type == 10; /* R_ALPHA_SREL32.  */
11696     case EM_ARC_COMPACT:
11697     case EM_ARC_COMPACT2:
11698       return reloc_type == 49; /* R_ARC_32_PCREL.  */
11699     case EM_ARM:
11700       return reloc_type == 3;  /* R_ARM_REL32 */
11701     case EM_AVR_OLD:
11702     case EM_AVR:
11703       return reloc_type == 36; /* R_AVR_32_PCREL.  */
11704     case EM_MICROBLAZE:
11705       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
11706     case EM_OR1K:
11707       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
11708     case EM_PARISC:
11709       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
11710     case EM_PPC:
11711       return reloc_type == 26; /* R_PPC_REL32.  */
11712     case EM_PPC64:
11713       return reloc_type == 26; /* R_PPC64_REL32.  */
11714     case EM_S390_OLD:
11715     case EM_S390:
11716       return reloc_type == 5;  /* R_390_PC32.  */
11717     case EM_SH:
11718       return reloc_type == 2;  /* R_SH_REL32.  */
11719     case EM_SPARC32PLUS:
11720     case EM_SPARCV9:
11721     case EM_SPARC:
11722       return reloc_type == 6;  /* R_SPARC_DISP32.  */
11723     case EM_SPU:
11724       return reloc_type == 13; /* R_SPU_REL32.  */
11725     case EM_TILEGX:
11726       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
11727     case EM_TILEPRO:
11728       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
11729     case EM_VISIUM:
11730       return reloc_type == 6;  /* R_VISIUM_32_PCREL */
11731     case EM_X86_64:
11732     case EM_L1OM:
11733     case EM_K1OM:
11734       return reloc_type == 2;  /* R_X86_64_PC32.  */
11735     case EM_XTENSA_OLD:
11736     case EM_XTENSA:
11737       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
11738     default:
11739       /* Do not abort or issue an error message here.  Not all targets use
11740 	 pc-relative 32-bit relocs in their DWARF debug information and we
11741 	 have already tested for target coverage in is_32bit_abs_reloc.  A
11742 	 more helpful warning message will be generated by apply_relocations
11743 	 anyway, so just return.  */
11744       return FALSE;
11745     }
11746 }
11747 
11748 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11749    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
11750 
11751 static bfd_boolean
11752 is_64bit_abs_reloc (unsigned int reloc_type)
11753 {
11754   switch (elf_header.e_machine)
11755     {
11756     case EM_AARCH64:
11757       return reloc_type == 257;	/* R_AARCH64_ABS64.  */
11758     case EM_ALPHA:
11759       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
11760     case EM_IA_64:
11761       return reloc_type == 0x27; /* R_IA64_DIR64LSB.  */
11762     case EM_PARISC:
11763       return reloc_type == 80; /* R_PARISC_DIR64.  */
11764     case EM_PPC64:
11765       return reloc_type == 38; /* R_PPC64_ADDR64.  */
11766     case EM_SPARC32PLUS:
11767     case EM_SPARCV9:
11768     case EM_SPARC:
11769       return reloc_type == 54; /* R_SPARC_UA64.  */
11770     case EM_X86_64:
11771     case EM_L1OM:
11772     case EM_K1OM:
11773       return reloc_type == 1; /* R_X86_64_64.  */
11774     case EM_S390_OLD:
11775     case EM_S390:
11776       return reloc_type == 22;	/* R_S390_64.  */
11777     case EM_TILEGX:
11778       return reloc_type == 1; /* R_TILEGX_64.  */
11779     case EM_MIPS:
11780       return reloc_type == 18;	/* R_MIPS_64.  */
11781     default:
11782       return FALSE;
11783     }
11784 }
11785 
11786 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
11787    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
11788 
11789 static bfd_boolean
11790 is_64bit_pcrel_reloc (unsigned int reloc_type)
11791 {
11792   switch (elf_header.e_machine)
11793     {
11794     case EM_AARCH64:
11795       return reloc_type == 260;	/* R_AARCH64_PREL64.  */
11796     case EM_ALPHA:
11797       return reloc_type == 11; /* R_ALPHA_SREL64.  */
11798     case EM_IA_64:
11799       return reloc_type == 0x4f; /* R_IA64_PCREL64LSB.  */
11800     case EM_PARISC:
11801       return reloc_type == 72; /* R_PARISC_PCREL64.  */
11802     case EM_PPC64:
11803       return reloc_type == 44; /* R_PPC64_REL64.  */
11804     case EM_SPARC32PLUS:
11805     case EM_SPARCV9:
11806     case EM_SPARC:
11807       return reloc_type == 46; /* R_SPARC_DISP64.  */
11808     case EM_X86_64:
11809     case EM_L1OM:
11810     case EM_K1OM:
11811       return reloc_type == 24; /* R_X86_64_PC64.  */
11812     case EM_S390_OLD:
11813     case EM_S390:
11814       return reloc_type == 23;	/* R_S390_PC64.  */
11815     case EM_TILEGX:
11816       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
11817     default:
11818       return FALSE;
11819     }
11820 }
11821 
11822 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11823    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
11824 
11825 static bfd_boolean
11826 is_24bit_abs_reloc (unsigned int reloc_type)
11827 {
11828   switch (elf_header.e_machine)
11829     {
11830     case EM_CYGNUS_MN10200:
11831     case EM_MN10200:
11832       return reloc_type == 4; /* R_MN10200_24.  */
11833     case EM_FT32:
11834       return reloc_type == 5; /* R_FT32_20.  */
11835     default:
11836       return FALSE;
11837     }
11838 }
11839 
11840 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11841    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
11842 
11843 static bfd_boolean
11844 is_16bit_abs_reloc (unsigned int reloc_type)
11845 {
11846   /* Please keep this table alpha-sorted for ease of visual lookup.  */
11847   switch (elf_header.e_machine)
11848     {
11849     case EM_ARC:
11850     case EM_ARC_COMPACT:
11851     case EM_ARC_COMPACT2:
11852       return reloc_type == 2; /* R_ARC_16.  */
11853     case EM_ADAPTEVA_EPIPHANY:
11854       return reloc_type == 5;
11855     case EM_AVR_OLD:
11856     case EM_AVR:
11857       return reloc_type == 4; /* R_AVR_16.  */
11858     case EM_CYGNUS_D10V:
11859     case EM_D10V:
11860       return reloc_type == 3; /* R_D10V_16.  */
11861     case EM_H8S:
11862     case EM_H8_300:
11863     case EM_H8_300H:
11864       return reloc_type == R_H8_DIR16;
11865     case EM_IP2K_OLD:
11866     case EM_IP2K:
11867       return reloc_type == 1; /* R_IP2K_16.  */
11868     case EM_M32C_OLD:
11869     case EM_M32C:
11870       return reloc_type == 1; /* R_M32C_16 */
11871     case EM_CYGNUS_MN10200:
11872     case EM_MN10200:
11873       return reloc_type == 2; /* R_MN10200_16.  */
11874     case EM_CYGNUS_MN10300:
11875     case EM_MN10300:
11876       return reloc_type == 2; /* R_MN10300_16.  */
11877     case EM_MSP430:
11878       if (uses_msp430x_relocs ())
11879 	return reloc_type == 2; /* R_MSP430_ABS16.  */
11880     case EM_MSP430_OLD:
11881       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
11882     case EM_NDS32:
11883       return reloc_type == 19; /* R_NDS32_RELA.  */
11884     case EM_ALTERA_NIOS2:
11885       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
11886     case EM_NIOS32:
11887       return reloc_type == 9; /* R_NIOS_16.  */
11888     case EM_OR1K:
11889       return reloc_type == 2; /* R_OR1K_16.  */
11890     case EM_TI_C6000:
11891       return reloc_type == 2; /* R_C6000_ABS16.  */
11892     case EM_VISIUM:
11893       return reloc_type == 2; /* R_VISIUM_16. */
11894     case EM_XC16X:
11895     case EM_C166:
11896       return reloc_type == 2; /* R_XC16C_ABS_16.  */
11897     case EM_XGATE:
11898       return reloc_type == 3; /* R_XGATE_16.  */
11899     default:
11900       return FALSE;
11901     }
11902 }
11903 
11904 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
11905    relocation entries (possibly formerly used for SHT_GROUP sections).  */
11906 
11907 static bfd_boolean
11908 is_none_reloc (unsigned int reloc_type)
11909 {
11910   switch (elf_header.e_machine)
11911     {
11912     case EM_386:     /* R_386_NONE.  */
11913     case EM_68K:     /* R_68K_NONE.  */
11914     case EM_ADAPTEVA_EPIPHANY:
11915     case EM_ALPHA:   /* R_ALPHA_NONE.  */
11916     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
11917     case EM_ARC:     /* R_ARC_NONE.  */
11918     case EM_ARC_COMPACT2: /* R_ARC_NONE.  */
11919     case EM_ARC_COMPACT: /* R_ARC_NONE.  */
11920     case EM_ARM:     /* R_ARM_NONE.  */
11921     case EM_C166:    /* R_XC16X_NONE.  */
11922     case EM_CRIS:    /* R_CRIS_NONE.  */
11923     case EM_FT32:    /* R_FT32_NONE.  */
11924     case EM_IA_64:   /* R_IA64_NONE.  */
11925     case EM_K1OM:    /* R_X86_64_NONE.  */
11926     case EM_L1OM:    /* R_X86_64_NONE.  */
11927     case EM_M32R:    /* R_M32R_NONE.  */
11928     case EM_MIPS:    /* R_MIPS_NONE.  */
11929     case EM_MN10300: /* R_MN10300_NONE.  */
11930     case EM_MOXIE:   /* R_MOXIE_NONE.  */
11931     case EM_NIOS32:  /* R_NIOS_NONE.  */
11932     case EM_OR1K:    /* R_OR1K_NONE. */
11933     case EM_PARISC:  /* R_PARISC_NONE.  */
11934     case EM_PPC64:   /* R_PPC64_NONE.  */
11935     case EM_PPC:     /* R_PPC_NONE.  */
11936     case EM_S390:    /* R_390_NONE.  */
11937     case EM_S390_OLD:
11938     case EM_SH:      /* R_SH_NONE.  */
11939     case EM_SPARC32PLUS:
11940     case EM_SPARC:   /* R_SPARC_NONE.  */
11941     case EM_SPARCV9:
11942     case EM_TILEGX:  /* R_TILEGX_NONE.  */
11943     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
11944     case EM_TI_C6000:/* R_C6000_NONE.  */
11945     case EM_X86_64:  /* R_X86_64_NONE.  */
11946     case EM_XC16X:
11947       return reloc_type == 0;
11948 
11949     case EM_AARCH64:
11950       return reloc_type == 0 || reloc_type == 256;
11951     case EM_AVR_OLD:
11952     case EM_AVR:
11953       return (reloc_type == 0 /* R_AVR_NONE.  */
11954 	      || reloc_type == 30 /* R_AVR_DIFF8.  */
11955 	      || reloc_type == 31 /* R_AVR_DIFF16.  */
11956 	      || reloc_type == 32 /* R_AVR_DIFF32.  */);
11957     case EM_METAG:
11958       return reloc_type == 3; /* R_METAG_NONE.  */
11959     case EM_NDS32:
11960       return (reloc_type == 0       /* R_XTENSA_NONE.  */
11961 	      || reloc_type == 204  /* R_NDS32_DIFF8.  */
11962 	      || reloc_type == 205  /* R_NDS32_DIFF16.  */
11963 	      || reloc_type == 206  /* R_NDS32_DIFF32.  */
11964 	      || reloc_type == 207  /* R_NDS32_ULEB128.  */);
11965     case EM_XTENSA_OLD:
11966     case EM_XTENSA:
11967       return (reloc_type == 0      /* R_XTENSA_NONE.  */
11968 	      || reloc_type == 17  /* R_XTENSA_DIFF8.  */
11969 	      || reloc_type == 18  /* R_XTENSA_DIFF16.  */
11970 	      || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
11971     }
11972   return FALSE;
11973 }
11974 
11975 /* Returns TRUE if there is a relocation against
11976    section NAME at OFFSET bytes.  */
11977 
11978 bfd_boolean
11979 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
11980 {
11981   Elf_Internal_Rela * relocs;
11982   Elf_Internal_Rela * rp;
11983 
11984   if (dsec == NULL || dsec->reloc_info == NULL)
11985     return FALSE;
11986 
11987   relocs = (Elf_Internal_Rela *) dsec->reloc_info;
11988 
11989   for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
11990     if (rp->r_offset == offset)
11991       return TRUE;
11992 
11993    return FALSE;
11994 }
11995 
11996 /* Apply relocations to a section.
11997    Note: So far support has been added only for those relocations
11998    which can be found in debug sections.
11999    If RELOCS_RETURN is non-NULL then returns in it a pointer to the
12000    loaded relocs.  It is then the caller's responsibility to free them.
12001    FIXME: Add support for more relocations ?  */
12002 
12003 static void
12004 apply_relocations (void *                     file,
12005 		   const Elf_Internal_Shdr *  section,
12006 		   unsigned char *            start,
12007 		   bfd_size_type              size,
12008 		   void **                     relocs_return,
12009 		   unsigned long *            num_relocs_return)
12010 {
12011   Elf_Internal_Shdr * relsec;
12012   unsigned char * end = start + size;
12013 
12014   if (relocs_return != NULL)
12015     {
12016       * (Elf_Internal_Rela **) relocs_return = NULL;
12017       * num_relocs_return = 0;
12018     }
12019 
12020   if (elf_header.e_type != ET_REL)
12021     return;
12022 
12023   /* Find the reloc section associated with the section.  */
12024   for (relsec = section_headers;
12025        relsec < section_headers + elf_header.e_shnum;
12026        ++relsec)
12027     {
12028       bfd_boolean is_rela;
12029       unsigned long num_relocs;
12030       Elf_Internal_Rela * relocs;
12031       Elf_Internal_Rela * rp;
12032       Elf_Internal_Shdr * symsec;
12033       Elf_Internal_Sym * symtab;
12034       unsigned long num_syms;
12035       Elf_Internal_Sym * sym;
12036 
12037       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12038 	  || relsec->sh_info >= elf_header.e_shnum
12039 	  || section_headers + relsec->sh_info != section
12040 	  || relsec->sh_size == 0
12041 	  || relsec->sh_link >= elf_header.e_shnum)
12042 	continue;
12043 
12044       is_rela = relsec->sh_type == SHT_RELA;
12045 
12046       if (is_rela)
12047 	{
12048 	  if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
12049                                   relsec->sh_size, & relocs, & num_relocs))
12050 	    return;
12051 	}
12052       else
12053 	{
12054 	  if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
12055                                  relsec->sh_size, & relocs, & num_relocs))
12056 	    return;
12057 	}
12058 
12059       /* SH uses RELA but uses in place value instead of the addend field.  */
12060       if (elf_header.e_machine == EM_SH)
12061 	is_rela = FALSE;
12062 
12063       symsec = section_headers + relsec->sh_link;
12064       symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
12065 
12066       for (rp = relocs; rp < relocs + num_relocs; ++rp)
12067 	{
12068 	  bfd_vma         addend;
12069 	  unsigned int    reloc_type;
12070 	  unsigned int    reloc_size;
12071 	  unsigned char * rloc;
12072 	  unsigned long   sym_index;
12073 
12074 	  reloc_type = get_reloc_type (rp->r_info);
12075 
12076 	  if (target_specific_reloc_handling (rp, start, symtab))
12077 	    continue;
12078 	  else if (is_none_reloc (reloc_type))
12079 	    continue;
12080 	  else if (is_32bit_abs_reloc (reloc_type)
12081 		   || is_32bit_pcrel_reloc (reloc_type))
12082 	    reloc_size = 4;
12083 	  else if (is_64bit_abs_reloc (reloc_type)
12084 		   || is_64bit_pcrel_reloc (reloc_type))
12085 	    reloc_size = 8;
12086 	  else if (is_24bit_abs_reloc (reloc_type))
12087 	    reloc_size = 3;
12088 	  else if (is_16bit_abs_reloc (reloc_type))
12089 	    reloc_size = 2;
12090 	  else
12091 	    {
12092 	      static unsigned int prev_reloc = 0;
12093 	      if (reloc_type != prev_reloc)
12094 		warn (_("unable to apply unsupported reloc type %d to section %s\n"),
12095 		      reloc_type, printable_section_name (section));
12096 	      prev_reloc = reloc_type;
12097 	      continue;
12098 	    }
12099 
12100 	  rloc = start + rp->r_offset;
12101 	  if ((rloc + reloc_size) > end || (rloc < start))
12102 	    {
12103 	      warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
12104 		    (unsigned long) rp->r_offset,
12105 		    printable_section_name (section));
12106 	      continue;
12107 	    }
12108 
12109 	  sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
12110 	  if (sym_index >= num_syms)
12111 	    {
12112 	      warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
12113 		    sym_index, printable_section_name (section));
12114 	      continue;
12115 	    }
12116 	  sym = symtab + sym_index;
12117 
12118 	  /* If the reloc has a symbol associated with it,
12119 	     make sure that it is of an appropriate type.
12120 
12121 	     Relocations against symbols without type can happen.
12122 	     Gcc -feliminate-dwarf2-dups may generate symbols
12123 	     without type for debug info.
12124 
12125 	     Icc generates relocations against function symbols
12126 	     instead of local labels.
12127 
12128 	     Relocations against object symbols can happen, eg when
12129 	     referencing a global array.  For an example of this see
12130 	     the _clz.o binary in libgcc.a.  */
12131 	  if (sym != symtab
12132 	      && ELF_ST_TYPE (sym->st_info) != STT_COMMON
12133 	      && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
12134 	    {
12135 	      warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
12136 		    get_symbol_type (ELF_ST_TYPE (sym->st_info)),
12137 		    (long int)(rp - relocs),
12138 		    printable_section_name (relsec));
12139 	      continue;
12140 	    }
12141 
12142 	  addend = 0;
12143 	  if (is_rela)
12144 	    addend += rp->r_addend;
12145 	  /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
12146 	     partial_inplace.  */
12147 	  if (!is_rela
12148 	      || (elf_header.e_machine == EM_XTENSA
12149 		  && reloc_type == 1)
12150 	      || ((elf_header.e_machine == EM_PJ
12151 		   || elf_header.e_machine == EM_PJ_OLD)
12152 		  && reloc_type == 1)
12153 	      || ((elf_header.e_machine == EM_D30V
12154 		   || elf_header.e_machine == EM_CYGNUS_D30V)
12155 		  && reloc_type == 12))
12156 	    addend += byte_get (rloc, reloc_size);
12157 
12158 	  if (is_32bit_pcrel_reloc (reloc_type)
12159 	      || is_64bit_pcrel_reloc (reloc_type))
12160 	    {
12161 	      /* On HPPA, all pc-relative relocations are biased by 8.  */
12162 	      if (elf_header.e_machine == EM_PARISC)
12163 		addend -= 8;
12164 	      byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
12165 		        reloc_size);
12166 	    }
12167 	  else
12168 	    byte_put (rloc, addend + sym->st_value, reloc_size);
12169 	}
12170 
12171       free (symtab);
12172 
12173       if (relocs_return)
12174 	{
12175 	  * (Elf_Internal_Rela **) relocs_return = relocs;
12176 	  * num_relocs_return = num_relocs;
12177 	}
12178       else
12179 	free (relocs);
12180 
12181       break;
12182     }
12183 }
12184 
12185 #ifdef SUPPORT_DISASSEMBLY
12186 static int
12187 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
12188 {
12189   printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
12190 
12191   /* FIXME: XXX -- to be done --- XXX */
12192 
12193   return 1;
12194 }
12195 #endif
12196 
12197 /* Reads in the contents of SECTION from FILE, returning a pointer
12198    to a malloc'ed buffer or NULL if something went wrong.  */
12199 
12200 static char *
12201 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
12202 {
12203   bfd_size_type num_bytes;
12204 
12205   num_bytes = section->sh_size;
12206 
12207   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
12208     {
12209       printf (_("\nSection '%s' has no data to dump.\n"),
12210 	      printable_section_name (section));
12211       return NULL;
12212     }
12213 
12214   return  (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
12215                              _("section contents"));
12216 }
12217 
12218 /* Uncompresses a section that was compressed using zlib, in place.  */
12219 
12220 static bfd_boolean
12221 uncompress_section_contents (unsigned char **buffer,
12222 			     dwarf_size_type uncompressed_size,
12223 			     dwarf_size_type *size)
12224 {
12225   dwarf_size_type compressed_size = *size;
12226   unsigned char * compressed_buffer = *buffer;
12227   unsigned char * uncompressed_buffer;
12228   z_stream strm;
12229   int rc;
12230 
12231   /* It is possible the section consists of several compressed
12232      buffers concatenated together, so we uncompress in a loop.  */
12233   /* PR 18313: The state field in the z_stream structure is supposed
12234      to be invisible to the user (ie us), but some compilers will
12235      still complain about it being used without initialisation.  So
12236      we first zero the entire z_stream structure and then set the fields
12237      that we need.  */
12238   memset (& strm, 0, sizeof strm);
12239   strm.avail_in = compressed_size;
12240   strm.next_in = (Bytef *) compressed_buffer;
12241   strm.avail_out = uncompressed_size;
12242   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
12243 
12244   rc = inflateInit (& strm);
12245   while (strm.avail_in > 0)
12246     {
12247       if (rc != Z_OK)
12248         goto fail;
12249       strm.next_out = ((Bytef *) uncompressed_buffer
12250                        + (uncompressed_size - strm.avail_out));
12251       rc = inflate (&strm, Z_FINISH);
12252       if (rc != Z_STREAM_END)
12253         goto fail;
12254       rc = inflateReset (& strm);
12255     }
12256   rc = inflateEnd (& strm);
12257   if (rc != Z_OK
12258       || strm.avail_out != 0)
12259     goto fail;
12260 
12261   *buffer = uncompressed_buffer;
12262   *size = uncompressed_size;
12263   return TRUE;
12264 
12265  fail:
12266   free (uncompressed_buffer);
12267   /* Indicate decompression failure.  */
12268   *buffer = NULL;
12269   return FALSE;
12270 }
12271 
12272 static void
12273 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
12274 {
12275   Elf_Internal_Shdr *  relsec;
12276   bfd_size_type        num_bytes;
12277   unsigned char *      data;
12278   unsigned char *      end;
12279   unsigned char *      real_start;
12280   unsigned char *      start;
12281   bfd_boolean          some_strings_shown;
12282 
12283   real_start = start = (unsigned char *) get_section_contents (section,
12284 							       file);
12285   if (start == NULL)
12286     return;
12287   num_bytes = section->sh_size;
12288 
12289   printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
12290 
12291   if (decompress_dumps)
12292     {
12293       dwarf_size_type new_size = num_bytes;
12294       dwarf_size_type uncompressed_size = 0;
12295 
12296       if ((section->sh_flags & SHF_COMPRESSED) != 0)
12297 	{
12298 	  Elf_Internal_Chdr chdr;
12299 	  unsigned int compression_header_size
12300 	    = get_compression_header (& chdr, (unsigned char *) start);
12301 
12302 	  if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12303 	    {
12304 	      warn (_("section '%s' has unsupported compress type: %d\n"),
12305 		    printable_section_name (section), chdr.ch_type);
12306 	      return;
12307 	    }
12308 	  else if (chdr.ch_addralign != section->sh_addralign)
12309 	    {
12310 	      warn (_("compressed section '%s' is corrupted\n"),
12311 		    printable_section_name (section));
12312 	      return;
12313 	    }
12314 	  uncompressed_size = chdr.ch_size;
12315 	  start += compression_header_size;
12316 	  new_size -= compression_header_size;
12317 	}
12318       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12319 	{
12320 	  /* Read the zlib header.  In this case, it should be "ZLIB"
12321 	     followed by the uncompressed section size, 8 bytes in
12322 	     big-endian order.  */
12323 	  uncompressed_size = start[4]; uncompressed_size <<= 8;
12324 	  uncompressed_size += start[5]; uncompressed_size <<= 8;
12325 	  uncompressed_size += start[6]; uncompressed_size <<= 8;
12326 	  uncompressed_size += start[7]; uncompressed_size <<= 8;
12327 	  uncompressed_size += start[8]; uncompressed_size <<= 8;
12328 	  uncompressed_size += start[9]; uncompressed_size <<= 8;
12329 	  uncompressed_size += start[10]; uncompressed_size <<= 8;
12330 	  uncompressed_size += start[11];
12331 	  start += 12;
12332 	  new_size -= 12;
12333 	}
12334 
12335       if (uncompressed_size
12336 	  && uncompress_section_contents (& start,
12337 					  uncompressed_size, & new_size))
12338 	num_bytes = new_size;
12339     }
12340 
12341   /* If the section being dumped has relocations against it the user might
12342      be expecting these relocations to have been applied.  Check for this
12343      case and issue a warning message in order to avoid confusion.
12344      FIXME: Maybe we ought to have an option that dumps a section with
12345      relocs applied ?  */
12346   for (relsec = section_headers;
12347        relsec < section_headers + elf_header.e_shnum;
12348        ++relsec)
12349     {
12350       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12351 	  || relsec->sh_info >= elf_header.e_shnum
12352 	  || section_headers + relsec->sh_info != section
12353 	  || relsec->sh_size == 0
12354 	  || relsec->sh_link >= elf_header.e_shnum)
12355 	continue;
12356 
12357       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12358       break;
12359     }
12360 
12361   data = start;
12362   end  = start + num_bytes;
12363   some_strings_shown = FALSE;
12364 
12365   while (data < end)
12366     {
12367       while (!ISPRINT (* data))
12368 	if (++ data >= end)
12369 	  break;
12370 
12371       if (data < end)
12372 	{
12373 	  size_t maxlen = end - data;
12374 
12375 #ifndef __MSVCRT__
12376 	  /* PR 11128: Use two separate invocations in order to work
12377              around bugs in the Solaris 8 implementation of printf.  */
12378 	  printf ("  [%6tx]  ", data - start);
12379 #else
12380 	  printf ("  [%6Ix]  ", (size_t) (data - start));
12381 #endif
12382 	  if (maxlen > 0)
12383 	    {
12384 	      print_symbol ((int) maxlen, (const char *) data);
12385 	      putchar ('\n');
12386 	      data += strnlen ((const char *) data, maxlen);
12387 	    }
12388 	  else
12389 	    {
12390 	      printf (_("<corrupt>\n"));
12391 	      data = end;
12392 	    }
12393 	  some_strings_shown = TRUE;
12394 	}
12395     }
12396 
12397   if (! some_strings_shown)
12398     printf (_("  No strings found in this section."));
12399 
12400   free (real_start);
12401 
12402   putchar ('\n');
12403 }
12404 
12405 static void
12406 dump_section_as_bytes (Elf_Internal_Shdr * section,
12407 		       FILE * file,
12408 		       bfd_boolean relocate)
12409 {
12410   Elf_Internal_Shdr * relsec;
12411   bfd_size_type       bytes;
12412   bfd_size_type       section_size;
12413   bfd_vma             addr;
12414   unsigned char *     data;
12415   unsigned char *     real_start;
12416   unsigned char *     start;
12417 
12418   real_start = start = (unsigned char *) get_section_contents (section, file);
12419   if (start == NULL)
12420     return;
12421   section_size = section->sh_size;
12422 
12423   printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
12424 
12425   if (decompress_dumps)
12426     {
12427       dwarf_size_type new_size = section_size;
12428       dwarf_size_type uncompressed_size = 0;
12429 
12430       if ((section->sh_flags & SHF_COMPRESSED) != 0)
12431 	{
12432 	  Elf_Internal_Chdr chdr;
12433 	  unsigned int compression_header_size
12434 	    = get_compression_header (& chdr, start);
12435 
12436 	  if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12437 	    {
12438 	      warn (_("section '%s' has unsupported compress type: %d\n"),
12439 		    printable_section_name (section), chdr.ch_type);
12440 	      return;
12441 	    }
12442 	  else if (chdr.ch_addralign != section->sh_addralign)
12443 	    {
12444 	      warn (_("compressed section '%s' is corrupted\n"),
12445 		    printable_section_name (section));
12446 	      return;
12447 	    }
12448 	  uncompressed_size = chdr.ch_size;
12449 	  start += compression_header_size;
12450 	  new_size -= compression_header_size;
12451 	}
12452       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12453 	{
12454 	  /* Read the zlib header.  In this case, it should be "ZLIB"
12455 	     followed by the uncompressed section size, 8 bytes in
12456 	     big-endian order.  */
12457 	  uncompressed_size = start[4]; uncompressed_size <<= 8;
12458 	  uncompressed_size += start[5]; uncompressed_size <<= 8;
12459 	  uncompressed_size += start[6]; uncompressed_size <<= 8;
12460 	  uncompressed_size += start[7]; uncompressed_size <<= 8;
12461 	  uncompressed_size += start[8]; uncompressed_size <<= 8;
12462 	  uncompressed_size += start[9]; uncompressed_size <<= 8;
12463 	  uncompressed_size += start[10]; uncompressed_size <<= 8;
12464 	  uncompressed_size += start[11];
12465 	  start += 12;
12466 	  new_size -= 12;
12467 	}
12468 
12469       if (uncompressed_size
12470 	  && uncompress_section_contents (& start, uncompressed_size,
12471 					  & new_size))
12472 	section_size = new_size;
12473     }
12474 
12475   if (relocate)
12476     {
12477       apply_relocations (file, section, start, section_size, NULL, NULL);
12478     }
12479   else
12480     {
12481       /* If the section being dumped has relocations against it the user might
12482 	 be expecting these relocations to have been applied.  Check for this
12483 	 case and issue a warning message in order to avoid confusion.
12484 	 FIXME: Maybe we ought to have an option that dumps a section with
12485 	 relocs applied ?  */
12486       for (relsec = section_headers;
12487 	   relsec < section_headers + elf_header.e_shnum;
12488 	   ++relsec)
12489 	{
12490 	  if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12491 	      || relsec->sh_info >= elf_header.e_shnum
12492 	      || section_headers + relsec->sh_info != section
12493 	      || relsec->sh_size == 0
12494 	      || relsec->sh_link >= elf_header.e_shnum)
12495 	    continue;
12496 
12497 	  printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12498 	  break;
12499 	}
12500     }
12501 
12502   addr = section->sh_addr;
12503   bytes = section_size;
12504   data = start;
12505 
12506   while (bytes)
12507     {
12508       int j;
12509       int k;
12510       int lbytes;
12511 
12512       lbytes = (bytes > 16 ? 16 : bytes);
12513 
12514       printf ("  0x%8.8lx ", (unsigned long) addr);
12515 
12516       for (j = 0; j < 16; j++)
12517 	{
12518 	  if (j < lbytes)
12519 	    printf ("%2.2x", data[j]);
12520 	  else
12521 	    printf ("  ");
12522 
12523 	  if ((j & 3) == 3)
12524 	    printf (" ");
12525 	}
12526 
12527       for (j = 0; j < lbytes; j++)
12528 	{
12529 	  k = data[j];
12530 	  if (k >= ' ' && k < 0x7f)
12531 	    printf ("%c", k);
12532 	  else
12533 	    printf (".");
12534 	}
12535 
12536       putchar ('\n');
12537 
12538       data  += lbytes;
12539       addr  += lbytes;
12540       bytes -= lbytes;
12541     }
12542 
12543   free (real_start);
12544 
12545   putchar ('\n');
12546 }
12547 
12548 static int
12549 load_specific_debug_section (enum dwarf_section_display_enum debug,
12550 			     const Elf_Internal_Shdr * sec, void * file)
12551 {
12552   struct dwarf_section * section = &debug_displays [debug].section;
12553   char buf [64];
12554 
12555   /* If it is already loaded, do nothing.  */
12556   if (section->start != NULL)
12557     return 1;
12558 
12559   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
12560   section->address = sec->sh_addr;
12561   section->user_data = NULL;
12562   section->start = (unsigned char *) get_data (NULL, (FILE *) file,
12563                                                sec->sh_offset, 1,
12564                                                sec->sh_size, buf);
12565   if (section->start == NULL)
12566     section->size = 0;
12567   else
12568     {
12569       unsigned char *start = section->start;
12570       dwarf_size_type size = sec->sh_size;
12571       dwarf_size_type uncompressed_size = 0;
12572 
12573       if ((sec->sh_flags & SHF_COMPRESSED) != 0)
12574 	{
12575 	  Elf_Internal_Chdr chdr;
12576 	  unsigned int compression_header_size
12577 	    = get_compression_header (&chdr, start);
12578 	  if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12579 	    {
12580 	      warn (_("section '%s' has unsupported compress type: %d\n"),
12581 		    section->name, chdr.ch_type);
12582 	      return 0;
12583 	    }
12584 	  else if (chdr.ch_addralign != sec->sh_addralign)
12585 	    {
12586 	      warn (_("compressed section '%s' is corrupted\n"),
12587 		    section->name);
12588 	      return 0;
12589 	    }
12590 	  uncompressed_size = chdr.ch_size;
12591 	  start += compression_header_size;
12592 	  size -= compression_header_size;
12593 	}
12594       else if (size > 12 && streq ((char *) start, "ZLIB"))
12595 	{
12596 	  /* Read the zlib header.  In this case, it should be "ZLIB"
12597 	     followed by the uncompressed section size, 8 bytes in
12598 	     big-endian order.  */
12599 	  uncompressed_size = start[4]; uncompressed_size <<= 8;
12600 	  uncompressed_size += start[5]; uncompressed_size <<= 8;
12601 	  uncompressed_size += start[6]; uncompressed_size <<= 8;
12602 	  uncompressed_size += start[7]; uncompressed_size <<= 8;
12603 	  uncompressed_size += start[8]; uncompressed_size <<= 8;
12604 	  uncompressed_size += start[9]; uncompressed_size <<= 8;
12605 	  uncompressed_size += start[10]; uncompressed_size <<= 8;
12606 	  uncompressed_size += start[11];
12607 	  start += 12;
12608 	  size -= 12;
12609 	}
12610 
12611       if (uncompressed_size
12612 	  && uncompress_section_contents (&start, uncompressed_size,
12613 					  &size))
12614 	{
12615 	  /* Free the compressed buffer, update the section buffer
12616 	     and the section size if uncompress is successful.  */
12617 	  free (section->start);
12618 	  section->start = start;
12619 	}
12620       section->size = size;
12621     }
12622 
12623   if (section->start == NULL)
12624     return 0;
12625 
12626   if (debug_displays [debug].relocate)
12627     apply_relocations ((FILE *) file, sec, section->start, section->size,
12628 		       & section->reloc_info, & section->num_relocs);
12629   else
12630     {
12631       section->reloc_info = NULL;
12632       section->num_relocs = 0;
12633     }
12634 
12635   return 1;
12636 }
12637 
12638 /* If this is not NULL, load_debug_section will only look for sections
12639    within the list of sections given here.  */
12640 unsigned int *section_subset = NULL;
12641 
12642 int
12643 load_debug_section (enum dwarf_section_display_enum debug, void * file)
12644 {
12645   struct dwarf_section * section = &debug_displays [debug].section;
12646   Elf_Internal_Shdr * sec;
12647 
12648   /* Locate the debug section.  */
12649   sec = find_section_in_set (section->uncompressed_name, section_subset);
12650   if (sec != NULL)
12651     section->name = section->uncompressed_name;
12652   else
12653     {
12654       sec = find_section_in_set (section->compressed_name, section_subset);
12655       if (sec != NULL)
12656 	section->name = section->compressed_name;
12657     }
12658   if (sec == NULL)
12659     return 0;
12660 
12661   /* If we're loading from a subset of sections, and we've loaded
12662      a section matching this name before, it's likely that it's a
12663      different one.  */
12664   if (section_subset != NULL)
12665     free_debug_section (debug);
12666 
12667   return load_specific_debug_section (debug, sec, (FILE *) file);
12668 }
12669 
12670 void
12671 free_debug_section (enum dwarf_section_display_enum debug)
12672 {
12673   struct dwarf_section * section = &debug_displays [debug].section;
12674 
12675   if (section->start == NULL)
12676     return;
12677 
12678   free ((char *) section->start);
12679   section->start = NULL;
12680   section->address = 0;
12681   section->size = 0;
12682 }
12683 
12684 static int
12685 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
12686 {
12687   char * name = SECTION_NAME (section);
12688   const char * print_name = printable_section_name (section);
12689   bfd_size_type length;
12690   int result = 1;
12691   int i;
12692 
12693   length = section->sh_size;
12694   if (length == 0)
12695     {
12696       printf (_("\nSection '%s' has no debugging data.\n"), print_name);
12697       return 0;
12698     }
12699   if (section->sh_type == SHT_NOBITS)
12700     {
12701       /* There is no point in dumping the contents of a debugging section
12702 	 which has the NOBITS type - the bits in the file will be random.
12703 	 This can happen when a file containing a .eh_frame section is
12704 	 stripped with the --only-keep-debug command line option.  */
12705       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
12706 	      print_name);
12707       return 0;
12708     }
12709 
12710   if (const_strneq (name, ".gnu.linkonce.wi."))
12711     name = ".debug_info";
12712 
12713   /* See if we know how to display the contents of this section.  */
12714   for (i = 0; i < max; i++)
12715     if (streq (debug_displays[i].section.uncompressed_name, name)
12716 	|| (i == line && const_strneq (name, ".debug_line."))
12717         || streq (debug_displays[i].section.compressed_name, name))
12718       {
12719 	struct dwarf_section * sec = &debug_displays [i].section;
12720 	int secondary = (section != find_section (name));
12721 
12722 	if (secondary)
12723 	  free_debug_section ((enum dwarf_section_display_enum) i);
12724 
12725 	if (i == line && const_strneq (name, ".debug_line."))
12726 	  sec->name = name;
12727 	else if (streq (sec->uncompressed_name, name))
12728 	  sec->name = sec->uncompressed_name;
12729 	else
12730 	  sec->name = sec->compressed_name;
12731 	if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
12732                                          section, file))
12733 	  {
12734 	    /* If this debug section is part of a CU/TU set in a .dwp file,
12735 	       restrict load_debug_section to the sections in that set.  */
12736 	    section_subset = find_cu_tu_set (file, shndx);
12737 
12738 	    result &= debug_displays[i].display (sec, file);
12739 
12740 	    section_subset = NULL;
12741 
12742 	    if (secondary || (i != info && i != abbrev))
12743 	      free_debug_section ((enum dwarf_section_display_enum) i);
12744 	  }
12745 
12746 	break;
12747       }
12748 
12749   if (i == max)
12750     {
12751       printf (_("Unrecognized debug section: %s\n"), print_name);
12752       result = 0;
12753     }
12754 
12755   return result;
12756 }
12757 
12758 /* Set DUMP_SECTS for all sections where dumps were requested
12759    based on section name.  */
12760 
12761 static void
12762 initialise_dumps_byname (void)
12763 {
12764   struct dump_list_entry * cur;
12765 
12766   for (cur = dump_sects_byname; cur; cur = cur->next)
12767     {
12768       unsigned int i;
12769       int any;
12770 
12771       for (i = 0, any = 0; i < elf_header.e_shnum; i++)
12772 	if (streq (SECTION_NAME (section_headers + i), cur->name))
12773 	  {
12774 	    request_dump_bynumber (i, cur->type);
12775 	    any = 1;
12776 	  }
12777 
12778       if (!any)
12779 	warn (_("Section '%s' was not dumped because it does not exist!\n"),
12780 	      cur->name);
12781     }
12782 }
12783 
12784 static void
12785 process_section_contents (FILE * file)
12786 {
12787   Elf_Internal_Shdr * section;
12788   unsigned int i;
12789 
12790   if (! do_dump)
12791     return;
12792 
12793   initialise_dumps_byname ();
12794 
12795   for (i = 0, section = section_headers;
12796        i < elf_header.e_shnum && i < num_dump_sects;
12797        i++, section++)
12798     {
12799 #ifdef SUPPORT_DISASSEMBLY
12800       if (dump_sects[i] & DISASS_DUMP)
12801 	disassemble_section (section, file);
12802 #endif
12803       if (dump_sects[i] & HEX_DUMP)
12804 	dump_section_as_bytes (section, file, FALSE);
12805 
12806       if (dump_sects[i] & RELOC_DUMP)
12807 	dump_section_as_bytes (section, file, TRUE);
12808 
12809       if (dump_sects[i] & STRING_DUMP)
12810 	dump_section_as_strings (section, file);
12811 
12812       if (dump_sects[i] & DEBUG_DUMP)
12813 	display_debug_section (i, section, file);
12814     }
12815 
12816   /* Check to see if the user requested a
12817      dump of a section that does not exist.  */
12818   while (i++ < num_dump_sects)
12819     if (dump_sects[i])
12820       warn (_("Section %d was not dumped because it does not exist!\n"), i);
12821 }
12822 
12823 static void
12824 process_mips_fpe_exception (int mask)
12825 {
12826   if (mask)
12827     {
12828       int first = 1;
12829       if (mask & OEX_FPU_INEX)
12830 	fputs ("INEX", stdout), first = 0;
12831       if (mask & OEX_FPU_UFLO)
12832 	printf ("%sUFLO", first ? "" : "|"), first = 0;
12833       if (mask & OEX_FPU_OFLO)
12834 	printf ("%sOFLO", first ? "" : "|"), first = 0;
12835       if (mask & OEX_FPU_DIV0)
12836 	printf ("%sDIV0", first ? "" : "|"), first = 0;
12837       if (mask & OEX_FPU_INVAL)
12838 	printf ("%sINVAL", first ? "" : "|");
12839     }
12840   else
12841     fputs ("0", stdout);
12842 }
12843 
12844 /* Display's the value of TAG at location P.  If TAG is
12845    greater than 0 it is assumed to be an unknown tag, and
12846    a message is printed to this effect.  Otherwise it is
12847    assumed that a message has already been printed.
12848 
12849    If the bottom bit of TAG is set it assumed to have a
12850    string value, otherwise it is assumed to have an integer
12851    value.
12852 
12853    Returns an updated P pointing to the first unread byte
12854    beyond the end of TAG's value.
12855 
12856    Reads at or beyond END will not be made.  */
12857 
12858 static unsigned char *
12859 display_tag_value (int tag,
12860 		   unsigned char * p,
12861 		   const unsigned char * const end)
12862 {
12863   unsigned long val;
12864 
12865   if (tag > 0)
12866     printf ("  Tag_unknown_%d: ", tag);
12867 
12868   if (p >= end)
12869     {
12870       warn (_("<corrupt tag>\n"));
12871     }
12872   else if (tag & 1)
12873     {
12874       /* PR 17531 file: 027-19978-0.004.  */
12875       size_t maxlen = (end - p) - 1;
12876 
12877       putchar ('"');
12878       if (maxlen > 0)
12879 	{
12880 	  print_symbol ((int) maxlen, (const char *) p);
12881 	  p += strnlen ((char *) p, maxlen) + 1;
12882 	}
12883       else
12884 	{
12885 	  printf (_("<corrupt string tag>"));
12886 	  p = (unsigned char *) end;
12887 	}
12888       printf ("\"\n");
12889     }
12890   else
12891     {
12892       unsigned int len;
12893 
12894       val = read_uleb128 (p, &len, end);
12895       p += len;
12896       printf ("%ld (0x%lx)\n", val, val);
12897     }
12898 
12899   assert (p <= end);
12900   return p;
12901 }
12902 
12903 /* ARM EABI attributes section.  */
12904 typedef struct
12905 {
12906   unsigned int tag;
12907   const char * name;
12908   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
12909   unsigned int type;
12910   const char ** table;
12911 } arm_attr_public_tag;
12912 
12913 static const char * arm_attr_tag_CPU_arch[] =
12914   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
12915    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "", "v8-M.baseline",
12916    "v8-M.mainline"};
12917 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
12918 static const char * arm_attr_tag_THUMB_ISA_use[] =
12919   {"No", "Thumb-1", "Thumb-2", "Yes"};
12920 static const char * arm_attr_tag_FP_arch[] =
12921   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
12922    "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
12923 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
12924 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
12925   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
12926    "NEON for ARMv8.1"};
12927 static const char * arm_attr_tag_PCS_config[] =
12928   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
12929    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
12930 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
12931   {"V6", "SB", "TLS", "Unused"};
12932 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
12933   {"Absolute", "PC-relative", "SB-relative", "None"};
12934 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
12935   {"Absolute", "PC-relative", "None"};
12936 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
12937   {"None", "direct", "GOT-indirect"};
12938 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
12939   {"None", "??? 1", "2", "??? 3", "4"};
12940 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
12941 static const char * arm_attr_tag_ABI_FP_denormal[] =
12942   {"Unused", "Needed", "Sign only"};
12943 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
12944 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
12945 static const char * arm_attr_tag_ABI_FP_number_model[] =
12946   {"Unused", "Finite", "RTABI", "IEEE 754"};
12947 static const char * arm_attr_tag_ABI_enum_size[] =
12948   {"Unused", "small", "int", "forced to int"};
12949 static const char * arm_attr_tag_ABI_HardFP_use[] =
12950   {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
12951 static const char * arm_attr_tag_ABI_VFP_args[] =
12952   {"AAPCS", "VFP registers", "custom", "compatible"};
12953 static const char * arm_attr_tag_ABI_WMMX_args[] =
12954   {"AAPCS", "WMMX registers", "custom"};
12955 static const char * arm_attr_tag_ABI_optimization_goals[] =
12956   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12957     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
12958 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
12959   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
12960     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
12961 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
12962 static const char * arm_attr_tag_FP_HP_extension[] =
12963   {"Not Allowed", "Allowed"};
12964 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
12965   {"None", "IEEE 754", "Alternative Format"};
12966 static const char * arm_attr_tag_DSP_extension[] =
12967   {"Follow architecture", "Allowed"};
12968 static const char * arm_attr_tag_MPextension_use[] =
12969   {"Not Allowed", "Allowed"};
12970 static const char * arm_attr_tag_DIV_use[] =
12971   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
12972     "Allowed in v7-A with integer division extension"};
12973 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
12974 static const char * arm_attr_tag_Virtualization_use[] =
12975   {"Not Allowed", "TrustZone", "Virtualization Extensions",
12976     "TrustZone and Virtualization Extensions"};
12977 static const char * arm_attr_tag_MPextension_use_legacy[] =
12978   {"Not Allowed", "Allowed"};
12979 
12980 #define LOOKUP(id, name) \
12981   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
12982 static arm_attr_public_tag arm_attr_public_tags[] =
12983 {
12984   {4, "CPU_raw_name", 1, NULL},
12985   {5, "CPU_name", 1, NULL},
12986   LOOKUP(6, CPU_arch),
12987   {7, "CPU_arch_profile", 0, NULL},
12988   LOOKUP(8, ARM_ISA_use),
12989   LOOKUP(9, THUMB_ISA_use),
12990   LOOKUP(10, FP_arch),
12991   LOOKUP(11, WMMX_arch),
12992   LOOKUP(12, Advanced_SIMD_arch),
12993   LOOKUP(13, PCS_config),
12994   LOOKUP(14, ABI_PCS_R9_use),
12995   LOOKUP(15, ABI_PCS_RW_data),
12996   LOOKUP(16, ABI_PCS_RO_data),
12997   LOOKUP(17, ABI_PCS_GOT_use),
12998   LOOKUP(18, ABI_PCS_wchar_t),
12999   LOOKUP(19, ABI_FP_rounding),
13000   LOOKUP(20, ABI_FP_denormal),
13001   LOOKUP(21, ABI_FP_exceptions),
13002   LOOKUP(22, ABI_FP_user_exceptions),
13003   LOOKUP(23, ABI_FP_number_model),
13004   {24, "ABI_align_needed", 0, NULL},
13005   {25, "ABI_align_preserved", 0, NULL},
13006   LOOKUP(26, ABI_enum_size),
13007   LOOKUP(27, ABI_HardFP_use),
13008   LOOKUP(28, ABI_VFP_args),
13009   LOOKUP(29, ABI_WMMX_args),
13010   LOOKUP(30, ABI_optimization_goals),
13011   LOOKUP(31, ABI_FP_optimization_goals),
13012   {32, "compatibility", 0, NULL},
13013   LOOKUP(34, CPU_unaligned_access),
13014   LOOKUP(36, FP_HP_extension),
13015   LOOKUP(38, ABI_FP_16bit_format),
13016   LOOKUP(42, MPextension_use),
13017   LOOKUP(44, DIV_use),
13018   LOOKUP(46, DSP_extension),
13019   {64, "nodefaults", 0, NULL},
13020   {65, "also_compatible_with", 0, NULL},
13021   LOOKUP(66, T2EE_use),
13022   {67, "conformance", 1, NULL},
13023   LOOKUP(68, Virtualization_use),
13024   LOOKUP(70, MPextension_use_legacy)
13025 };
13026 #undef LOOKUP
13027 
13028 static unsigned char *
13029 display_arm_attribute (unsigned char * p,
13030 		       const unsigned char * const end)
13031 {
13032   unsigned int tag;
13033   unsigned int len;
13034   unsigned int val;
13035   arm_attr_public_tag * attr;
13036   unsigned i;
13037   unsigned int type;
13038 
13039   tag = read_uleb128 (p, &len, end);
13040   p += len;
13041   attr = NULL;
13042   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
13043     {
13044       if (arm_attr_public_tags[i].tag == tag)
13045 	{
13046 	  attr = &arm_attr_public_tags[i];
13047 	  break;
13048 	}
13049     }
13050 
13051   if (attr)
13052     {
13053       printf ("  Tag_%s: ", attr->name);
13054       switch (attr->type)
13055 	{
13056 	case 0:
13057 	  switch (tag)
13058 	    {
13059 	    case 7: /* Tag_CPU_arch_profile.  */
13060 	      val = read_uleb128 (p, &len, end);
13061 	      p += len;
13062 	      switch (val)
13063 		{
13064 		case 0: printf (_("None\n")); break;
13065 		case 'A': printf (_("Application\n")); break;
13066 		case 'R': printf (_("Realtime\n")); break;
13067 		case 'M': printf (_("Microcontroller\n")); break;
13068 		case 'S': printf (_("Application or Realtime\n")); break;
13069 		default: printf ("??? (%d)\n", val); break;
13070 		}
13071 	      break;
13072 
13073 	    case 24: /* Tag_align_needed.  */
13074 	      val = read_uleb128 (p, &len, end);
13075 	      p += len;
13076 	      switch (val)
13077 		{
13078 		case 0: printf (_("None\n")); break;
13079 		case 1: printf (_("8-byte\n")); break;
13080 		case 2: printf (_("4-byte\n")); break;
13081 		case 3: printf ("??? 3\n"); break;
13082 		default:
13083 		  if (val <= 12)
13084 		    printf (_("8-byte and up to %d-byte extended\n"),
13085 			    1 << val);
13086 		  else
13087 		    printf ("??? (%d)\n", val);
13088 		  break;
13089 		}
13090 	      break;
13091 
13092 	    case 25: /* Tag_align_preserved.  */
13093 	      val = read_uleb128 (p, &len, end);
13094 	      p += len;
13095 	      switch (val)
13096 		{
13097 		case 0: printf (_("None\n")); break;
13098 		case 1: printf (_("8-byte, except leaf SP\n")); break;
13099 		case 2: printf (_("8-byte\n")); break;
13100 		case 3: printf ("??? 3\n"); break;
13101 		default:
13102 		  if (val <= 12)
13103 		    printf (_("8-byte and up to %d-byte extended\n"),
13104 			    1 << val);
13105 		  else
13106 		    printf ("??? (%d)\n", val);
13107 		  break;
13108 		}
13109 	      break;
13110 
13111 	    case 32: /* Tag_compatibility.  */
13112 	      {
13113 		val = read_uleb128 (p, &len, end);
13114 		p += len;
13115 		printf (_("flag = %d, vendor = "), val);
13116 		if (p < end - 1)
13117 		  {
13118 		    size_t maxlen = (end - p) - 1;
13119 
13120 		    print_symbol ((int) maxlen, (const char *) p);
13121 		    p += strnlen ((char *) p, maxlen) + 1;
13122 		  }
13123 		else
13124 		  {
13125 		    printf (_("<corrupt>"));
13126 		    p = (unsigned char *) end;
13127 		  }
13128 		putchar ('\n');
13129 	      }
13130 	      break;
13131 
13132 	    case 64: /* Tag_nodefaults.  */
13133 	      /* PR 17531: file: 001-505008-0.01.  */
13134 	      if (p < end)
13135 		p++;
13136 	      printf (_("True\n"));
13137 	      break;
13138 
13139 	    case 65: /* Tag_also_compatible_with.  */
13140 	      val = read_uleb128 (p, &len, end);
13141 	      p += len;
13142 	      if (val == 6 /* Tag_CPU_arch.  */)
13143 		{
13144 		  val = read_uleb128 (p, &len, end);
13145 		  p += len;
13146 		  if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
13147 		    printf ("??? (%d)\n", val);
13148 		  else
13149 		    printf ("%s\n", arm_attr_tag_CPU_arch[val]);
13150 		}
13151 	      else
13152 		printf ("???\n");
13153 	      while (p < end && *(p++) != '\0' /* NUL terminator.  */)
13154 		;
13155 	      break;
13156 
13157 	    default:
13158 	      printf (_("<unknown: %d>\n"), tag);
13159 	      break;
13160 	    }
13161 	  return p;
13162 
13163 	case 1:
13164 	  return display_tag_value (-1, p, end);
13165 	case 2:
13166 	  return display_tag_value (0, p, end);
13167 
13168 	default:
13169 	  assert (attr->type & 0x80);
13170 	  val = read_uleb128 (p, &len, end);
13171 	  p += len;
13172 	  type = attr->type & 0x7f;
13173 	  if (val >= type)
13174 	    printf ("??? (%d)\n", val);
13175 	  else
13176 	    printf ("%s\n", attr->table[val]);
13177 	  return p;
13178 	}
13179     }
13180 
13181   return display_tag_value (tag, p, end);
13182 }
13183 
13184 static unsigned char *
13185 display_gnu_attribute (unsigned char * p,
13186 		       unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
13187 		       const unsigned char * const end)
13188 {
13189   int tag;
13190   unsigned int len;
13191   int val;
13192 
13193   tag = read_uleb128 (p, &len, end);
13194   p += len;
13195 
13196   /* Tag_compatibility is the only generic GNU attribute defined at
13197      present.  */
13198   if (tag == 32)
13199     {
13200       val = read_uleb128 (p, &len, end);
13201       p += len;
13202 
13203       printf (_("flag = %d, vendor = "), val);
13204       if (p == end)
13205 	{
13206 	  printf (_("<corrupt>\n"));
13207 	  warn (_("corrupt vendor attribute\n"));
13208 	}
13209       else
13210 	{
13211 	  if (p < end - 1)
13212 	    {
13213 	      size_t maxlen = (end - p) - 1;
13214 
13215 	      print_symbol ((int) maxlen, (const char *) p);
13216 	      p += strnlen ((char *) p, maxlen) + 1;
13217 	    }
13218 	  else
13219 	    {
13220 	      printf (_("<corrupt>"));
13221 	      p = (unsigned char *) end;
13222 	    }
13223 	  putchar ('\n');
13224 	}
13225       return p;
13226     }
13227 
13228   if ((tag & 2) == 0 && display_proc_gnu_attribute)
13229     return display_proc_gnu_attribute (p, tag, end);
13230 
13231   return display_tag_value (tag, p, end);
13232 }
13233 
13234 static unsigned char *
13235 display_power_gnu_attribute (unsigned char * p,
13236 			     int tag,
13237 			     const unsigned char * const end)
13238 {
13239   unsigned int len;
13240   int val;
13241 
13242   if (tag == Tag_GNU_Power_ABI_FP)
13243     {
13244       val = read_uleb128 (p, &len, end);
13245       p += len;
13246       printf ("  Tag_GNU_Power_ABI_FP: ");
13247 
13248       switch (val)
13249 	{
13250 	case 0:
13251 	  printf (_("Hard or soft float\n"));
13252 	  break;
13253 	case 1:
13254 	  printf (_("Hard float\n"));
13255 	  break;
13256 	case 2:
13257 	  printf (_("Soft float\n"));
13258 	  break;
13259 	case 3:
13260 	  printf (_("Single-precision hard float\n"));
13261 	  break;
13262 	default:
13263 	  printf ("??? (%d)\n", val);
13264 	  break;
13265 	}
13266       return p;
13267    }
13268 
13269   if (tag == Tag_GNU_Power_ABI_Vector)
13270     {
13271       val = read_uleb128 (p, &len, end);
13272       p += len;
13273       printf ("  Tag_GNU_Power_ABI_Vector: ");
13274       switch (val)
13275 	{
13276 	case 0:
13277 	  printf (_("Any\n"));
13278 	  break;
13279 	case 1:
13280 	  printf (_("Generic\n"));
13281 	  break;
13282 	case 2:
13283 	  printf ("AltiVec\n");
13284 	  break;
13285 	case 3:
13286 	  printf ("SPE\n");
13287 	  break;
13288 	default:
13289 	  printf ("??? (%d)\n", val);
13290 	  break;
13291 	}
13292       return p;
13293    }
13294 
13295   if (tag == Tag_GNU_Power_ABI_Struct_Return)
13296     {
13297       if (p == end)
13298 	{
13299 	  warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return\n"));
13300 	  return p;
13301 	}
13302 
13303       val = read_uleb128 (p, &len, end);
13304       p += len;
13305       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
13306       switch (val)
13307        {
13308        case 0:
13309          printf (_("Any\n"));
13310          break;
13311        case 1:
13312          printf ("r3/r4\n");
13313          break;
13314        case 2:
13315          printf (_("Memory\n"));
13316          break;
13317        default:
13318          printf ("??? (%d)\n", val);
13319          break;
13320        }
13321       return p;
13322     }
13323 
13324   return display_tag_value (tag & 1, p, end);
13325 }
13326 
13327 static unsigned char *
13328 display_s390_gnu_attribute (unsigned char * p,
13329 			    int tag,
13330 			    const unsigned char * const end)
13331 {
13332   unsigned int len;
13333   int val;
13334 
13335   if (tag == Tag_GNU_S390_ABI_Vector)
13336     {
13337       val = read_uleb128 (p, &len, end);
13338       p += len;
13339       printf ("  Tag_GNU_S390_ABI_Vector: ");
13340 
13341       switch (val)
13342 	{
13343 	case 0:
13344 	  printf (_("any\n"));
13345 	  break;
13346 	case 1:
13347 	  printf (_("software\n"));
13348 	  break;
13349 	case 2:
13350 	  printf (_("hardware\n"));
13351 	  break;
13352 	default:
13353 	  printf ("??? (%d)\n", val);
13354 	  break;
13355 	}
13356       return p;
13357    }
13358 
13359   return display_tag_value (tag & 1, p, end);
13360 }
13361 
13362 static void
13363 display_sparc_hwcaps (int mask)
13364 {
13365   if (mask)
13366     {
13367       int first = 1;
13368 
13369       if (mask & ELF_SPARC_HWCAP_MUL32)
13370 	fputs ("mul32", stdout), first = 0;
13371       if (mask & ELF_SPARC_HWCAP_DIV32)
13372 	printf ("%sdiv32", first ? "" : "|"), first = 0;
13373       if (mask & ELF_SPARC_HWCAP_FSMULD)
13374 	printf ("%sfsmuld", first ? "" : "|"), first = 0;
13375       if (mask & ELF_SPARC_HWCAP_V8PLUS)
13376 	printf ("%sv8plus", first ? "" : "|"), first = 0;
13377       if (mask & ELF_SPARC_HWCAP_POPC)
13378 	printf ("%spopc", first ? "" : "|"), first = 0;
13379       if (mask & ELF_SPARC_HWCAP_VIS)
13380 	printf ("%svis", first ? "" : "|"), first = 0;
13381       if (mask & ELF_SPARC_HWCAP_VIS2)
13382 	printf ("%svis2", first ? "" : "|"), first = 0;
13383       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
13384 	printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
13385       if (mask & ELF_SPARC_HWCAP_FMAF)
13386 	printf ("%sfmaf", first ? "" : "|"), first = 0;
13387       if (mask & ELF_SPARC_HWCAP_VIS3)
13388 	printf ("%svis3", first ? "" : "|"), first = 0;
13389       if (mask & ELF_SPARC_HWCAP_HPC)
13390 	printf ("%shpc", first ? "" : "|"), first = 0;
13391       if (mask & ELF_SPARC_HWCAP_RANDOM)
13392 	printf ("%srandom", first ? "" : "|"), first = 0;
13393       if (mask & ELF_SPARC_HWCAP_TRANS)
13394 	printf ("%strans", first ? "" : "|"), first = 0;
13395       if (mask & ELF_SPARC_HWCAP_FJFMAU)
13396 	printf ("%sfjfmau", first ? "" : "|"), first = 0;
13397       if (mask & ELF_SPARC_HWCAP_IMA)
13398 	printf ("%sima", first ? "" : "|"), first = 0;
13399       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
13400 	printf ("%scspare", first ? "" : "|"), first = 0;
13401     }
13402   else
13403     fputc ('0', stdout);
13404   fputc ('\n', stdout);
13405 }
13406 
13407 static void
13408 display_sparc_hwcaps2 (int mask)
13409 {
13410   if (mask)
13411     {
13412       int first = 1;
13413 
13414       if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
13415 	fputs ("fjathplus", stdout), first = 0;
13416       if (mask & ELF_SPARC_HWCAP2_VIS3B)
13417 	printf ("%svis3b", first ? "" : "|"), first = 0;
13418       if (mask & ELF_SPARC_HWCAP2_ADP)
13419 	printf ("%sadp", first ? "" : "|"), first = 0;
13420       if (mask & ELF_SPARC_HWCAP2_SPARC5)
13421 	printf ("%ssparc5", first ? "" : "|"), first = 0;
13422       if (mask & ELF_SPARC_HWCAP2_MWAIT)
13423 	printf ("%smwait", first ? "" : "|"), first = 0;
13424       if (mask & ELF_SPARC_HWCAP2_XMPMUL)
13425 	printf ("%sxmpmul", first ? "" : "|"), first = 0;
13426       if (mask & ELF_SPARC_HWCAP2_XMONT)
13427 	printf ("%sxmont2", first ? "" : "|"), first = 0;
13428       if (mask & ELF_SPARC_HWCAP2_NSEC)
13429 	printf ("%snsec", first ? "" : "|"), first = 0;
13430       if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
13431 	printf ("%sfjathhpc", first ? "" : "|"), first = 0;
13432       if (mask & ELF_SPARC_HWCAP2_FJDES)
13433 	printf ("%sfjdes", first ? "" : "|"), first = 0;
13434       if (mask & ELF_SPARC_HWCAP2_FJAES)
13435 	printf ("%sfjaes", first ? "" : "|"), first = 0;
13436     }
13437   else
13438     fputc ('0', stdout);
13439   fputc ('\n', stdout);
13440 }
13441 
13442 static unsigned char *
13443 display_sparc_gnu_attribute (unsigned char * p,
13444 			     int tag,
13445 			     const unsigned char * const end)
13446 {
13447   unsigned int len;
13448   int val;
13449 
13450   if (tag == Tag_GNU_Sparc_HWCAPS)
13451     {
13452       val = read_uleb128 (p, &len, end);
13453       p += len;
13454       printf ("  Tag_GNU_Sparc_HWCAPS: ");
13455       display_sparc_hwcaps (val);
13456       return p;
13457     }
13458   if (tag == Tag_GNU_Sparc_HWCAPS2)
13459     {
13460       val = read_uleb128 (p, &len, end);
13461       p += len;
13462       printf ("  Tag_GNU_Sparc_HWCAPS2: ");
13463       display_sparc_hwcaps2 (val);
13464       return p;
13465     }
13466 
13467   return display_tag_value (tag, p, end);
13468 }
13469 
13470 static void
13471 print_mips_fp_abi_value (int val)
13472 {
13473   switch (val)
13474     {
13475     case Val_GNU_MIPS_ABI_FP_ANY:
13476       printf (_("Hard or soft float\n"));
13477       break;
13478     case Val_GNU_MIPS_ABI_FP_DOUBLE:
13479       printf (_("Hard float (double precision)\n"));
13480       break;
13481     case Val_GNU_MIPS_ABI_FP_SINGLE:
13482       printf (_("Hard float (single precision)\n"));
13483       break;
13484     case Val_GNU_MIPS_ABI_FP_SOFT:
13485       printf (_("Soft float\n"));
13486       break;
13487     case Val_GNU_MIPS_ABI_FP_OLD_64:
13488       printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
13489       break;
13490     case Val_GNU_MIPS_ABI_FP_XX:
13491       printf (_("Hard float (32-bit CPU, Any FPU)\n"));
13492       break;
13493     case Val_GNU_MIPS_ABI_FP_64:
13494       printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
13495       break;
13496     case Val_GNU_MIPS_ABI_FP_64A:
13497       printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
13498       break;
13499     case Val_GNU_MIPS_ABI_FP_NAN2008:
13500       printf (_("NaN 2008 compatibility\n"));
13501       break;
13502     default:
13503       printf ("??? (%d)\n", val);
13504       break;
13505     }
13506 }
13507 
13508 static unsigned char *
13509 display_mips_gnu_attribute (unsigned char * p,
13510 			    int tag,
13511 			    const unsigned char * const end)
13512 {
13513   if (tag == Tag_GNU_MIPS_ABI_FP)
13514     {
13515       unsigned int len;
13516       int val;
13517 
13518       val = read_uleb128 (p, &len, end);
13519       p += len;
13520       printf ("  Tag_GNU_MIPS_ABI_FP: ");
13521 
13522       print_mips_fp_abi_value (val);
13523 
13524       return p;
13525    }
13526 
13527   if (tag == Tag_GNU_MIPS_ABI_MSA)
13528     {
13529       unsigned int len;
13530       int val;
13531 
13532       val = read_uleb128 (p, &len, end);
13533       p += len;
13534       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
13535 
13536       switch (val)
13537 	{
13538 	case Val_GNU_MIPS_ABI_MSA_ANY:
13539 	  printf (_("Any MSA or not\n"));
13540 	  break;
13541 	case Val_GNU_MIPS_ABI_MSA_128:
13542 	  printf (_("128-bit MSA\n"));
13543 	  break;
13544 	default:
13545 	  printf ("??? (%d)\n", val);
13546 	  break;
13547 	}
13548       return p;
13549     }
13550 
13551   return display_tag_value (tag & 1, p, end);
13552 }
13553 
13554 static unsigned char *
13555 display_tic6x_attribute (unsigned char * p,
13556 			 const unsigned char * const end)
13557 {
13558   int tag;
13559   unsigned int len;
13560   int val;
13561 
13562   tag = read_uleb128 (p, &len, end);
13563   p += len;
13564 
13565   switch (tag)
13566     {
13567     case Tag_ISA:
13568       val = read_uleb128 (p, &len, end);
13569       p += len;
13570       printf ("  Tag_ISA: ");
13571 
13572       switch (val)
13573 	{
13574 	case C6XABI_Tag_ISA_none:
13575 	  printf (_("None\n"));
13576 	  break;
13577 	case C6XABI_Tag_ISA_C62X:
13578 	  printf ("C62x\n");
13579 	  break;
13580 	case C6XABI_Tag_ISA_C67X:
13581 	  printf ("C67x\n");
13582 	  break;
13583 	case C6XABI_Tag_ISA_C67XP:
13584 	  printf ("C67x+\n");
13585 	  break;
13586 	case C6XABI_Tag_ISA_C64X:
13587 	  printf ("C64x\n");
13588 	  break;
13589 	case C6XABI_Tag_ISA_C64XP:
13590 	  printf ("C64x+\n");
13591 	  break;
13592 	case C6XABI_Tag_ISA_C674X:
13593 	  printf ("C674x\n");
13594 	  break;
13595 	default:
13596 	  printf ("??? (%d)\n", val);
13597 	  break;
13598 	}
13599       return p;
13600 
13601     case Tag_ABI_wchar_t:
13602       val = read_uleb128 (p, &len, end);
13603       p += len;
13604       printf ("  Tag_ABI_wchar_t: ");
13605       switch (val)
13606 	{
13607 	case 0:
13608 	  printf (_("Not used\n"));
13609 	  break;
13610 	case 1:
13611 	  printf (_("2 bytes\n"));
13612 	  break;
13613 	case 2:
13614 	  printf (_("4 bytes\n"));
13615 	  break;
13616 	default:
13617 	  printf ("??? (%d)\n", val);
13618 	  break;
13619 	}
13620       return p;
13621 
13622     case Tag_ABI_stack_align_needed:
13623       val = read_uleb128 (p, &len, end);
13624       p += len;
13625       printf ("  Tag_ABI_stack_align_needed: ");
13626       switch (val)
13627 	{
13628 	case 0:
13629 	  printf (_("8-byte\n"));
13630 	  break;
13631 	case 1:
13632 	  printf (_("16-byte\n"));
13633 	  break;
13634 	default:
13635 	  printf ("??? (%d)\n", val);
13636 	  break;
13637 	}
13638       return p;
13639 
13640     case Tag_ABI_stack_align_preserved:
13641       val = read_uleb128 (p, &len, end);
13642       p += len;
13643       printf ("  Tag_ABI_stack_align_preserved: ");
13644       switch (val)
13645 	{
13646 	case 0:
13647 	  printf (_("8-byte\n"));
13648 	  break;
13649 	case 1:
13650 	  printf (_("16-byte\n"));
13651 	  break;
13652 	default:
13653 	  printf ("??? (%d)\n", val);
13654 	  break;
13655 	}
13656       return p;
13657 
13658     case Tag_ABI_DSBT:
13659       val = read_uleb128 (p, &len, end);
13660       p += len;
13661       printf ("  Tag_ABI_DSBT: ");
13662       switch (val)
13663 	{
13664 	case 0:
13665 	  printf (_("DSBT addressing not used\n"));
13666 	  break;
13667 	case 1:
13668 	  printf (_("DSBT addressing used\n"));
13669 	  break;
13670 	default:
13671 	  printf ("??? (%d)\n", val);
13672 	  break;
13673 	}
13674       return p;
13675 
13676     case Tag_ABI_PID:
13677       val = read_uleb128 (p, &len, end);
13678       p += len;
13679       printf ("  Tag_ABI_PID: ");
13680       switch (val)
13681 	{
13682 	case 0:
13683 	  printf (_("Data addressing position-dependent\n"));
13684 	  break;
13685 	case 1:
13686 	  printf (_("Data addressing position-independent, GOT near DP\n"));
13687 	  break;
13688 	case 2:
13689 	  printf (_("Data addressing position-independent, GOT far from DP\n"));
13690 	  break;
13691 	default:
13692 	  printf ("??? (%d)\n", val);
13693 	  break;
13694 	}
13695       return p;
13696 
13697     case Tag_ABI_PIC:
13698       val = read_uleb128 (p, &len, end);
13699       p += len;
13700       printf ("  Tag_ABI_PIC: ");
13701       switch (val)
13702 	{
13703 	case 0:
13704 	  printf (_("Code addressing position-dependent\n"));
13705 	  break;
13706 	case 1:
13707 	  printf (_("Code addressing position-independent\n"));
13708 	  break;
13709 	default:
13710 	  printf ("??? (%d)\n", val);
13711 	  break;
13712 	}
13713       return p;
13714 
13715     case Tag_ABI_array_object_alignment:
13716       val = read_uleb128 (p, &len, end);
13717       p += len;
13718       printf ("  Tag_ABI_array_object_alignment: ");
13719       switch (val)
13720 	{
13721 	case 0:
13722 	  printf (_("8-byte\n"));
13723 	  break;
13724 	case 1:
13725 	  printf (_("4-byte\n"));
13726 	  break;
13727 	case 2:
13728 	  printf (_("16-byte\n"));
13729 	  break;
13730 	default:
13731 	  printf ("??? (%d)\n", val);
13732 	  break;
13733 	}
13734       return p;
13735 
13736     case Tag_ABI_array_object_align_expected:
13737       val = read_uleb128 (p, &len, end);
13738       p += len;
13739       printf ("  Tag_ABI_array_object_align_expected: ");
13740       switch (val)
13741 	{
13742 	case 0:
13743 	  printf (_("8-byte\n"));
13744 	  break;
13745 	case 1:
13746 	  printf (_("4-byte\n"));
13747 	  break;
13748 	case 2:
13749 	  printf (_("16-byte\n"));
13750 	  break;
13751 	default:
13752 	  printf ("??? (%d)\n", val);
13753 	  break;
13754 	}
13755       return p;
13756 
13757     case Tag_ABI_compatibility:
13758       {
13759 	val = read_uleb128 (p, &len, end);
13760 	p += len;
13761 	printf ("  Tag_ABI_compatibility: ");
13762 	printf (_("flag = %d, vendor = "), val);
13763 	if (p < end - 1)
13764 	  {
13765 	    size_t maxlen = (end - p) - 1;
13766 
13767 	    print_symbol ((int) maxlen, (const char *) p);
13768 	    p += strnlen ((char *) p, maxlen) + 1;
13769 	  }
13770 	else
13771 	  {
13772 	    printf (_("<corrupt>"));
13773 	    p = (unsigned char *) end;
13774 	  }
13775 	putchar ('\n');
13776 	return p;
13777       }
13778 
13779     case Tag_ABI_conformance:
13780       {
13781 	printf ("  Tag_ABI_conformance: \"");
13782 	if (p < end - 1)
13783 	  {
13784 	    size_t maxlen = (end - p) - 1;
13785 
13786 	    print_symbol ((int) maxlen, (const char *) p);
13787 	    p += strnlen ((char *) p, maxlen) + 1;
13788 	  }
13789 	else
13790 	  {
13791 	    printf (_("<corrupt>"));
13792 	    p = (unsigned char *) end;
13793 	  }
13794 	printf ("\"\n");
13795 	return p;
13796       }
13797     }
13798 
13799   return display_tag_value (tag, p, end);
13800 }
13801 
13802 static void
13803 display_raw_attribute (unsigned char * p, unsigned char * end)
13804 {
13805   unsigned long addr = 0;
13806   size_t bytes = end - p;
13807 
13808   assert (end > p);
13809   while (bytes)
13810     {
13811       int j;
13812       int k;
13813       int lbytes = (bytes > 16 ? 16 : bytes);
13814 
13815       printf ("  0x%8.8lx ", addr);
13816 
13817       for (j = 0; j < 16; j++)
13818 	{
13819 	  if (j < lbytes)
13820 	    printf ("%2.2x", p[j]);
13821 	  else
13822 	    printf ("  ");
13823 
13824 	  if ((j & 3) == 3)
13825 	    printf (" ");
13826 	}
13827 
13828       for (j = 0; j < lbytes; j++)
13829 	{
13830 	  k = p[j];
13831 	  if (k >= ' ' && k < 0x7f)
13832 	    printf ("%c", k);
13833 	  else
13834 	    printf (".");
13835 	}
13836 
13837       putchar ('\n');
13838 
13839       p  += lbytes;
13840       bytes -= lbytes;
13841       addr += lbytes;
13842     }
13843 
13844   putchar ('\n');
13845 }
13846 
13847 static unsigned char *
13848 display_msp430x_attribute (unsigned char * p,
13849 			   const unsigned char * const end)
13850 {
13851   unsigned int len;
13852   int val;
13853   int tag;
13854 
13855   tag = read_uleb128 (p, & len, end);
13856   p += len;
13857 
13858   switch (tag)
13859     {
13860     case OFBA_MSPABI_Tag_ISA:
13861       val = read_uleb128 (p, &len, end);
13862       p += len;
13863       printf ("  Tag_ISA: ");
13864       switch (val)
13865 	{
13866 	case 0: printf (_("None\n")); break;
13867 	case 1: printf (_("MSP430\n")); break;
13868 	case 2: printf (_("MSP430X\n")); break;
13869 	default: printf ("??? (%d)\n", val); break;
13870 	}
13871       break;
13872 
13873     case OFBA_MSPABI_Tag_Code_Model:
13874       val = read_uleb128 (p, &len, end);
13875       p += len;
13876       printf ("  Tag_Code_Model: ");
13877       switch (val)
13878 	{
13879 	case 0: printf (_("None\n")); break;
13880 	case 1: printf (_("Small\n")); break;
13881 	case 2: printf (_("Large\n")); break;
13882 	default: printf ("??? (%d)\n", val); break;
13883 	}
13884       break;
13885 
13886     case OFBA_MSPABI_Tag_Data_Model:
13887       val = read_uleb128 (p, &len, end);
13888       p += len;
13889       printf ("  Tag_Data_Model: ");
13890       switch (val)
13891 	{
13892 	case 0: printf (_("None\n")); break;
13893 	case 1: printf (_("Small\n")); break;
13894 	case 2: printf (_("Large\n")); break;
13895 	case 3: printf (_("Restricted Large\n")); break;
13896 	default: printf ("??? (%d)\n", val); break;
13897 	}
13898       break;
13899 
13900     default:
13901       printf (_("  <unknown tag %d>: "), tag);
13902 
13903       if (tag & 1)
13904 	{
13905 	  putchar ('"');
13906 	  if (p < end - 1)
13907 	    {
13908 	      size_t maxlen = (end - p) - 1;
13909 
13910 	      print_symbol ((int) maxlen, (const char *) p);
13911 	      p += strnlen ((char *) p, maxlen) + 1;
13912 	    }
13913 	  else
13914 	    {
13915 	      printf (_("<corrupt>"));
13916 	      p = (unsigned char *) end;
13917 	    }
13918 	  printf ("\"\n");
13919 	}
13920       else
13921 	{
13922 	  val = read_uleb128 (p, &len, end);
13923 	  p += len;
13924 	  printf ("%d (0x%x)\n", val, val);
13925 	}
13926       break;
13927    }
13928 
13929   assert (p <= end);
13930   return p;
13931 }
13932 
13933 static int
13934 process_attributes (FILE * file,
13935 		    const char * public_name,
13936 		    unsigned int proc_type,
13937 		    unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
13938 		    unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
13939 {
13940   Elf_Internal_Shdr * sect;
13941   unsigned i;
13942 
13943   /* Find the section header so that we get the size.  */
13944   for (i = 0, sect = section_headers;
13945        i < elf_header.e_shnum;
13946        i++, sect++)
13947     {
13948       unsigned char * contents;
13949       unsigned char * p;
13950 
13951       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
13952 	continue;
13953 
13954       contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
13955                                              sect->sh_size, _("attributes"));
13956       if (contents == NULL)
13957 	continue;
13958 
13959       p = contents;
13960       if (*p == 'A')
13961 	{
13962 	  bfd_vma section_len;
13963 
13964 	  section_len = sect->sh_size - 1;
13965 	  p++;
13966 
13967 	  while (section_len > 0)
13968 	    {
13969 	      bfd_vma attr_len;
13970 	      unsigned int namelen;
13971 	      bfd_boolean public_section;
13972 	      bfd_boolean gnu_section;
13973 
13974 	      if (section_len <= 4)
13975 		{
13976 		  error (_("Tag section ends prematurely\n"));
13977 		  break;
13978 		}
13979 	      attr_len = byte_get (p, 4);
13980 	      p += 4;
13981 
13982 	      if (attr_len > section_len)
13983 		{
13984 		  error (_("Bad attribute length (%u > %u)\n"),
13985 			  (unsigned) attr_len, (unsigned) section_len);
13986 		  attr_len = section_len;
13987 		}
13988 	      /* PR 17531: file: 001-101425-0.004  */
13989 	      else if (attr_len < 5)
13990 		{
13991 		  error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
13992 		  break;
13993 		}
13994 
13995 	      section_len -= attr_len;
13996 	      attr_len -= 4;
13997 
13998 	      namelen = strnlen ((char *) p, attr_len) + 1;
13999 	      if (namelen == 0 || namelen >= attr_len)
14000 		{
14001 		  error (_("Corrupt attribute section name\n"));
14002 		  break;
14003 		}
14004 
14005 	      printf (_("Attribute Section: "));
14006 	      print_symbol (INT_MAX, (const char *) p);
14007 	      putchar ('\n');
14008 
14009 	      if (public_name && streq ((char *) p, public_name))
14010 		public_section = TRUE;
14011 	      else
14012 		public_section = FALSE;
14013 
14014 	      if (streq ((char *) p, "gnu"))
14015 		gnu_section = TRUE;
14016 	      else
14017 		gnu_section = FALSE;
14018 
14019 	      p += namelen;
14020 	      attr_len -= namelen;
14021 
14022 	      while (attr_len > 0 && p < contents + sect->sh_size)
14023 		{
14024 		  int tag;
14025 		  int val;
14026 		  bfd_vma size;
14027 		  unsigned char * end;
14028 
14029 		  /* PR binutils/17531: Safe handling of corrupt files.  */
14030 		  if (attr_len < 6)
14031 		    {
14032 		      error (_("Unused bytes at end of section\n"));
14033 		      section_len = 0;
14034 		      break;
14035 		    }
14036 
14037 		  tag = *(p++);
14038 		  size = byte_get (p, 4);
14039 		  if (size > attr_len)
14040 		    {
14041 		      error (_("Bad subsection length (%u > %u)\n"),
14042 			      (unsigned) size, (unsigned) attr_len);
14043 		      size = attr_len;
14044 		    }
14045 		  /* PR binutils/17531: Safe handling of corrupt files.  */
14046 		  if (size < 6)
14047 		    {
14048 		      error (_("Bad subsection length (%u < 6)\n"),
14049 			      (unsigned) size);
14050 		      section_len = 0;
14051 		      break;
14052 		    }
14053 
14054 		  attr_len -= size;
14055 		  end = p + size - 1;
14056 		  assert (end <= contents + sect->sh_size);
14057 		  p += 4;
14058 
14059 		  switch (tag)
14060 		    {
14061 		    case 1:
14062 		      printf (_("File Attributes\n"));
14063 		      break;
14064 		    case 2:
14065 		      printf (_("Section Attributes:"));
14066 		      goto do_numlist;
14067 		    case 3:
14068 		      printf (_("Symbol Attributes:"));
14069 		    do_numlist:
14070 		      for (;;)
14071 			{
14072 			  unsigned int j;
14073 
14074 			  val = read_uleb128 (p, &j, end);
14075 			  p += j;
14076 			  if (val == 0)
14077 			    break;
14078 			  printf (" %d", val);
14079 			}
14080 		      printf ("\n");
14081 		      break;
14082 		    default:
14083 		      printf (_("Unknown tag: %d\n"), tag);
14084 		      public_section = FALSE;
14085 		      break;
14086 		    }
14087 
14088 		  if (public_section && display_pub_attribute != NULL)
14089 		    {
14090 		      while (p < end)
14091 			p = display_pub_attribute (p, end);
14092 		      assert (p <= end);
14093 		    }
14094 		  else if (gnu_section && display_proc_gnu_attribute != NULL)
14095 		    {
14096 		      while (p < end)
14097 			p = display_gnu_attribute (p,
14098 						   display_proc_gnu_attribute,
14099 						   end);
14100 		      assert (p <= end);
14101 		    }
14102 		  else if (p < end)
14103 		    {
14104 		      printf (_("  Unknown attribute:\n"));
14105 		      display_raw_attribute (p, end);
14106 		      p = end;
14107 		    }
14108 		  else
14109 		    attr_len = 0;
14110 		}
14111 	    }
14112 	}
14113       else
14114 	printf (_("Unknown format '%c' (%d)\n"), *p, *p);
14115 
14116       free (contents);
14117     }
14118   return 1;
14119 }
14120 
14121 static int
14122 process_arm_specific (FILE * file)
14123 {
14124   return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
14125 			     display_arm_attribute, NULL);
14126 }
14127 
14128 static int
14129 process_power_specific (FILE * file)
14130 {
14131   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14132 			     display_power_gnu_attribute);
14133 }
14134 
14135 static int
14136 process_s390_specific (FILE * file)
14137 {
14138   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14139 			     display_s390_gnu_attribute);
14140 }
14141 
14142 static int
14143 process_sparc_specific (FILE * file)
14144 {
14145   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14146 			     display_sparc_gnu_attribute);
14147 }
14148 
14149 static int
14150 process_tic6x_specific (FILE * file)
14151 {
14152   return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
14153 			     display_tic6x_attribute, NULL);
14154 }
14155 
14156 static int
14157 process_msp430x_specific (FILE * file)
14158 {
14159   return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
14160 			     display_msp430x_attribute, NULL);
14161 }
14162 
14163 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
14164    Print the Address, Access and Initial fields of an entry at VMA ADDR
14165    and return the VMA of the next entry, or -1 if there was a problem.
14166    Does not read from DATA_END or beyond.  */
14167 
14168 static bfd_vma
14169 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
14170 		      unsigned char * data_end)
14171 {
14172   printf ("  ");
14173   print_vma (addr, LONG_HEX);
14174   printf (" ");
14175   if (addr < pltgot + 0xfff0)
14176     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
14177   else
14178     printf ("%10s", "");
14179   printf (" ");
14180   if (data == NULL)
14181     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14182   else
14183     {
14184       bfd_vma entry;
14185       unsigned char * from = data + addr - pltgot;
14186 
14187       if (from + (is_32bit_elf ? 4 : 8) > data_end)
14188 	{
14189 	  warn (_("MIPS GOT entry extends beyond the end of available data\n"));
14190 	  printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
14191 	  return (bfd_vma) -1;
14192 	}
14193       else
14194 	{
14195 	  entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14196 	  print_vma (entry, LONG_HEX);
14197 	}
14198     }
14199   return addr + (is_32bit_elf ? 4 : 8);
14200 }
14201 
14202 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
14203    PLTGOT.  Print the Address and Initial fields of an entry at VMA
14204    ADDR and return the VMA of the next entry.  */
14205 
14206 static bfd_vma
14207 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
14208 {
14209   printf ("  ");
14210   print_vma (addr, LONG_HEX);
14211   printf (" ");
14212   if (data == NULL)
14213     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14214   else
14215     {
14216       bfd_vma entry;
14217 
14218       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14219       print_vma (entry, LONG_HEX);
14220     }
14221   return addr + (is_32bit_elf ? 4 : 8);
14222 }
14223 
14224 static void
14225 print_mips_ases (unsigned int mask)
14226 {
14227   if (mask & AFL_ASE_DSP)
14228     fputs ("\n\tDSP ASE", stdout);
14229   if (mask & AFL_ASE_DSPR2)
14230     fputs ("\n\tDSP R2 ASE", stdout);
14231   if (mask & AFL_ASE_DSPR3)
14232     fputs ("\n\tDSP R3 ASE", stdout);
14233   if (mask & AFL_ASE_EVA)
14234     fputs ("\n\tEnhanced VA Scheme", stdout);
14235   if (mask & AFL_ASE_MCU)
14236     fputs ("\n\tMCU (MicroController) ASE", stdout);
14237   if (mask & AFL_ASE_MDMX)
14238     fputs ("\n\tMDMX ASE", stdout);
14239   if (mask & AFL_ASE_MIPS3D)
14240     fputs ("\n\tMIPS-3D ASE", stdout);
14241   if (mask & AFL_ASE_MT)
14242     fputs ("\n\tMT ASE", stdout);
14243   if (mask & AFL_ASE_SMARTMIPS)
14244     fputs ("\n\tSmartMIPS ASE", stdout);
14245   if (mask & AFL_ASE_VIRT)
14246     fputs ("\n\tVZ ASE", stdout);
14247   if (mask & AFL_ASE_MSA)
14248     fputs ("\n\tMSA ASE", stdout);
14249   if (mask & AFL_ASE_MIPS16)
14250     fputs ("\n\tMIPS16 ASE", stdout);
14251   if (mask & AFL_ASE_MICROMIPS)
14252     fputs ("\n\tMICROMIPS ASE", stdout);
14253   if (mask & AFL_ASE_XPA)
14254     fputs ("\n\tXPA ASE", stdout);
14255   if (mask == 0)
14256     fprintf (stdout, "\n\t%s", _("None"));
14257   else if ((mask & ~AFL_ASE_MASK) != 0)
14258     fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
14259 }
14260 
14261 static void
14262 print_mips_isa_ext (unsigned int isa_ext)
14263 {
14264   switch (isa_ext)
14265     {
14266     case 0:
14267       fputs (_("None"), stdout);
14268       break;
14269     case AFL_EXT_XLR:
14270       fputs ("RMI XLR", stdout);
14271       break;
14272     case AFL_EXT_OCTEON3:
14273       fputs ("Cavium Networks Octeon3", stdout);
14274       break;
14275     case AFL_EXT_OCTEON2:
14276       fputs ("Cavium Networks Octeon2", stdout);
14277       break;
14278     case AFL_EXT_OCTEONP:
14279       fputs ("Cavium Networks OcteonP", stdout);
14280       break;
14281     case AFL_EXT_LOONGSON_3A:
14282       fputs ("Loongson 3A", stdout);
14283       break;
14284     case AFL_EXT_OCTEON:
14285       fputs ("Cavium Networks Octeon", stdout);
14286       break;
14287     case AFL_EXT_5900:
14288       fputs ("Toshiba R5900", stdout);
14289       break;
14290     case AFL_EXT_4650:
14291       fputs ("MIPS R4650", stdout);
14292       break;
14293     case AFL_EXT_4010:
14294       fputs ("LSI R4010", stdout);
14295       break;
14296     case AFL_EXT_4100:
14297       fputs ("NEC VR4100", stdout);
14298       break;
14299     case AFL_EXT_3900:
14300       fputs ("Toshiba R3900", stdout);
14301       break;
14302     case AFL_EXT_10000:
14303       fputs ("MIPS R10000", stdout);
14304       break;
14305     case AFL_EXT_SB1:
14306       fputs ("Broadcom SB-1", stdout);
14307       break;
14308     case AFL_EXT_4111:
14309       fputs ("NEC VR4111/VR4181", stdout);
14310       break;
14311     case AFL_EXT_4120:
14312       fputs ("NEC VR4120", stdout);
14313       break;
14314     case AFL_EXT_5400:
14315       fputs ("NEC VR5400", stdout);
14316       break;
14317     case AFL_EXT_5500:
14318       fputs ("NEC VR5500", stdout);
14319       break;
14320     case AFL_EXT_LOONGSON_2E:
14321       fputs ("ST Microelectronics Loongson 2E", stdout);
14322       break;
14323     case AFL_EXT_LOONGSON_2F:
14324       fputs ("ST Microelectronics Loongson 2F", stdout);
14325       break;
14326     default:
14327       fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
14328     }
14329 }
14330 
14331 static int
14332 get_mips_reg_size (int reg_size)
14333 {
14334   return (reg_size == AFL_REG_NONE) ? 0
14335 	 : (reg_size == AFL_REG_32) ? 32
14336 	 : (reg_size == AFL_REG_64) ? 64
14337 	 : (reg_size == AFL_REG_128) ? 128
14338 	 : -1;
14339 }
14340 
14341 static int
14342 process_mips_specific (FILE * file)
14343 {
14344   Elf_Internal_Dyn * entry;
14345   Elf_Internal_Shdr *sect = NULL;
14346   size_t liblist_offset = 0;
14347   size_t liblistno = 0;
14348   size_t conflictsno = 0;
14349   size_t options_offset = 0;
14350   size_t conflicts_offset = 0;
14351   size_t pltrelsz = 0;
14352   size_t pltrel = 0;
14353   bfd_vma pltgot = 0;
14354   bfd_vma mips_pltgot = 0;
14355   bfd_vma jmprel = 0;
14356   bfd_vma local_gotno = 0;
14357   bfd_vma gotsym = 0;
14358   bfd_vma symtabno = 0;
14359 
14360   process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14361 		      display_mips_gnu_attribute);
14362 
14363   sect = find_section (".MIPS.abiflags");
14364 
14365   if (sect != NULL)
14366     {
14367       Elf_External_ABIFlags_v0 *abiflags_ext;
14368       Elf_Internal_ABIFlags_v0 abiflags_in;
14369 
14370       if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
14371 	fputs ("\nCorrupt ABI Flags section.\n", stdout);
14372       else
14373 	{
14374 	  abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
14375 				   sect->sh_size, _("MIPS ABI Flags section"));
14376 	  if (abiflags_ext)
14377 	    {
14378 	      abiflags_in.version = BYTE_GET (abiflags_ext->version);
14379 	      abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
14380 	      abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
14381 	      abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
14382 	      abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
14383 	      abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
14384 	      abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
14385 	      abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
14386 	      abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
14387 	      abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
14388 	      abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
14389 
14390 	      printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
14391 	      printf ("\nISA: MIPS%d", abiflags_in.isa_level);
14392 	      if (abiflags_in.isa_rev > 1)
14393 		printf ("r%d", abiflags_in.isa_rev);
14394 	      printf ("\nGPR size: %d",
14395 		      get_mips_reg_size (abiflags_in.gpr_size));
14396 	      printf ("\nCPR1 size: %d",
14397 		      get_mips_reg_size (abiflags_in.cpr1_size));
14398 	      printf ("\nCPR2 size: %d",
14399 		      get_mips_reg_size (abiflags_in.cpr2_size));
14400 	      fputs ("\nFP ABI: ", stdout);
14401 	      print_mips_fp_abi_value (abiflags_in.fp_abi);
14402 	      fputs ("ISA Extension: ", stdout);
14403 	      print_mips_isa_ext (abiflags_in.isa_ext);
14404 	      fputs ("\nASEs:", stdout);
14405 	      print_mips_ases (abiflags_in.ases);
14406 	      printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
14407 	      printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
14408 	      fputc ('\n', stdout);
14409 	      free (abiflags_ext);
14410 	    }
14411 	}
14412     }
14413 
14414   /* We have a lot of special sections.  Thanks SGI!  */
14415   if (dynamic_section == NULL)
14416     /* No information available.  */
14417     return 0;
14418 
14419   for (entry = dynamic_section;
14420        /* PR 17531 file: 012-50589-0.004.  */
14421        entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
14422        ++entry)
14423     switch (entry->d_tag)
14424       {
14425       case DT_MIPS_LIBLIST:
14426 	liblist_offset
14427 	  = offset_from_vma (file, entry->d_un.d_val,
14428 			     liblistno * sizeof (Elf32_External_Lib));
14429 	break;
14430       case DT_MIPS_LIBLISTNO:
14431 	liblistno = entry->d_un.d_val;
14432 	break;
14433       case DT_MIPS_OPTIONS:
14434 	options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
14435 	break;
14436       case DT_MIPS_CONFLICT:
14437 	conflicts_offset
14438 	  = offset_from_vma (file, entry->d_un.d_val,
14439 			     conflictsno * sizeof (Elf32_External_Conflict));
14440 	break;
14441       case DT_MIPS_CONFLICTNO:
14442 	conflictsno = entry->d_un.d_val;
14443 	break;
14444       case DT_PLTGOT:
14445 	pltgot = entry->d_un.d_ptr;
14446 	break;
14447       case DT_MIPS_LOCAL_GOTNO:
14448 	local_gotno = entry->d_un.d_val;
14449 	break;
14450       case DT_MIPS_GOTSYM:
14451 	gotsym = entry->d_un.d_val;
14452 	break;
14453       case DT_MIPS_SYMTABNO:
14454 	symtabno = entry->d_un.d_val;
14455 	break;
14456       case DT_MIPS_PLTGOT:
14457 	mips_pltgot = entry->d_un.d_ptr;
14458 	break;
14459       case DT_PLTREL:
14460 	pltrel = entry->d_un.d_val;
14461 	break;
14462       case DT_PLTRELSZ:
14463 	pltrelsz = entry->d_un.d_val;
14464 	break;
14465       case DT_JMPREL:
14466 	jmprel = entry->d_un.d_ptr;
14467 	break;
14468       default:
14469 	break;
14470       }
14471 
14472   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
14473     {
14474       Elf32_External_Lib * elib;
14475       size_t cnt;
14476 
14477       elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
14478                                               liblistno,
14479                                               sizeof (Elf32_External_Lib),
14480                                               _("liblist section data"));
14481       if (elib)
14482 	{
14483 	  printf (_("\nSection '.liblist' contains %lu entries:\n"),
14484 		  (unsigned long) liblistno);
14485 	  fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
14486 		 stdout);
14487 
14488 	  for (cnt = 0; cnt < liblistno; ++cnt)
14489 	    {
14490 	      Elf32_Lib liblist;
14491 	      time_t atime;
14492 	      char timebuf[128];
14493 	      struct tm * tmp;
14494 
14495 	      liblist.l_name = BYTE_GET (elib[cnt].l_name);
14496 	      atime = BYTE_GET (elib[cnt].l_time_stamp);
14497 	      liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14498 	      liblist.l_version = BYTE_GET (elib[cnt].l_version);
14499 	      liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14500 
14501 	      tmp = gmtime (&atime);
14502 	      snprintf (timebuf, sizeof (timebuf),
14503 			"%04u-%02u-%02uT%02u:%02u:%02u",
14504 			tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14505 			tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
14506 
14507 	      printf ("%3lu: ", (unsigned long) cnt);
14508 	      if (VALID_DYNAMIC_NAME (liblist.l_name))
14509 		print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
14510 	      else
14511 		printf (_("<corrupt: %9ld>"), liblist.l_name);
14512 	      printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
14513 		      liblist.l_version);
14514 
14515 	      if (liblist.l_flags == 0)
14516 		puts (_(" NONE"));
14517 	      else
14518 		{
14519 		  static const struct
14520 		  {
14521 		    const char * name;
14522 		    int bit;
14523 		  }
14524 		  l_flags_vals[] =
14525 		  {
14526 		    { " EXACT_MATCH", LL_EXACT_MATCH },
14527 		    { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
14528 		    { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
14529 		    { " EXPORTS", LL_EXPORTS },
14530 		    { " DELAY_LOAD", LL_DELAY_LOAD },
14531 		    { " DELTA", LL_DELTA }
14532 		  };
14533 		  int flags = liblist.l_flags;
14534 		  size_t fcnt;
14535 
14536 		  for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
14537 		    if ((flags & l_flags_vals[fcnt].bit) != 0)
14538 		      {
14539 			fputs (l_flags_vals[fcnt].name, stdout);
14540 			flags ^= l_flags_vals[fcnt].bit;
14541 		      }
14542 		  if (flags != 0)
14543 		    printf (" %#x", (unsigned int) flags);
14544 
14545 		  puts ("");
14546 		}
14547 	    }
14548 
14549 	  free (elib);
14550 	}
14551     }
14552 
14553   if (options_offset != 0)
14554     {
14555       Elf_External_Options * eopt;
14556       Elf_Internal_Options * iopt;
14557       Elf_Internal_Options * option;
14558       size_t offset;
14559       int cnt;
14560       sect = section_headers;
14561 
14562       /* Find the section header so that we get the size.  */
14563       sect = find_section_by_type (SHT_MIPS_OPTIONS);
14564       /* PR 17533 file: 012-277276-0.004.  */
14565       if (sect == NULL)
14566 	{
14567 	  error (_("No MIPS_OPTIONS header found\n"));
14568 	  return 0;
14569 	}
14570 
14571       eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
14572                                                 sect->sh_size, _("options"));
14573       if (eopt)
14574 	{
14575 	  iopt = (Elf_Internal_Options *)
14576               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
14577 	  if (iopt == NULL)
14578 	    {
14579 	      error (_("Out of memory allocatinf space for MIPS options\n"));
14580 	      return 0;
14581 	    }
14582 
14583 	  offset = cnt = 0;
14584 	  option = iopt;
14585 
14586 	  while (offset <= sect->sh_size - sizeof (* eopt))
14587 	    {
14588 	      Elf_External_Options * eoption;
14589 
14590 	      eoption = (Elf_External_Options *) ((char *) eopt + offset);
14591 
14592 	      option->kind = BYTE_GET (eoption->kind);
14593 	      option->size = BYTE_GET (eoption->size);
14594 	      option->section = BYTE_GET (eoption->section);
14595 	      option->info = BYTE_GET (eoption->info);
14596 
14597 	      /* PR 17531: file: ffa0fa3b.  */
14598 	      if (option->size < sizeof (* eopt)
14599 		  || offset + option->size > sect->sh_size)
14600 		{
14601 		  error (_("Invalid size (%u) for MIPS option\n"), option->size);
14602 		  return 0;
14603 		}
14604 	      offset += option->size;
14605 
14606 	      ++option;
14607 	      ++cnt;
14608 	    }
14609 
14610 	  printf (_("\nSection '%s' contains %d entries:\n"),
14611 		  printable_section_name (sect), cnt);
14612 
14613 	  option = iopt;
14614 	  offset = 0;
14615 
14616 	  while (cnt-- > 0)
14617 	    {
14618 	      size_t len;
14619 
14620 	      switch (option->kind)
14621 		{
14622 		case ODK_NULL:
14623 		  /* This shouldn't happen.  */
14624 		  printf (" NULL       %d %lx", option->section, option->info);
14625 		  break;
14626 		case ODK_REGINFO:
14627 		  printf (" REGINFO    ");
14628 		  if (elf_header.e_machine == EM_MIPS)
14629 		    {
14630 		      /* 32bit form.  */
14631 		      Elf32_External_RegInfo * ereg;
14632 		      Elf32_RegInfo reginfo;
14633 
14634 		      ereg = (Elf32_External_RegInfo *) (option + 1);
14635 		      reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14636 		      reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14637 		      reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14638 		      reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14639 		      reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14640 		      reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14641 
14642 		      printf ("GPR %08lx  GP 0x%lx\n",
14643 			      reginfo.ri_gprmask,
14644 			      (unsigned long) reginfo.ri_gp_value);
14645 		      printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
14646 			      reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14647 			      reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14648 		    }
14649 		  else
14650 		    {
14651 		      /* 64 bit form.  */
14652 		      Elf64_External_RegInfo * ereg;
14653 		      Elf64_Internal_RegInfo reginfo;
14654 
14655 		      ereg = (Elf64_External_RegInfo *) (option + 1);
14656 		      reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
14657 		      reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14658 		      reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14659 		      reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14660 		      reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14661 		      reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
14662 
14663 		      printf ("GPR %08lx  GP 0x",
14664 			      reginfo.ri_gprmask);
14665 		      printf_vma (reginfo.ri_gp_value);
14666 		      printf ("\n");
14667 
14668 		      printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
14669 			      reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14670 			      reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14671 		    }
14672 		  ++option;
14673 		  continue;
14674 		case ODK_EXCEPTIONS:
14675 		  fputs (" EXCEPTIONS fpe_min(", stdout);
14676 		  process_mips_fpe_exception (option->info & OEX_FPU_MIN);
14677 		  fputs (") fpe_max(", stdout);
14678 		  process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
14679 		  fputs (")", stdout);
14680 
14681 		  if (option->info & OEX_PAGE0)
14682 		    fputs (" PAGE0", stdout);
14683 		  if (option->info & OEX_SMM)
14684 		    fputs (" SMM", stdout);
14685 		  if (option->info & OEX_FPDBUG)
14686 		    fputs (" FPDBUG", stdout);
14687 		  if (option->info & OEX_DISMISS)
14688 		    fputs (" DISMISS", stdout);
14689 		  break;
14690 		case ODK_PAD:
14691 		  fputs (" PAD       ", stdout);
14692 		  if (option->info & OPAD_PREFIX)
14693 		    fputs (" PREFIX", stdout);
14694 		  if (option->info & OPAD_POSTFIX)
14695 		    fputs (" POSTFIX", stdout);
14696 		  if (option->info & OPAD_SYMBOL)
14697 		    fputs (" SYMBOL", stdout);
14698 		  break;
14699 		case ODK_HWPATCH:
14700 		  fputs (" HWPATCH   ", stdout);
14701 		  if (option->info & OHW_R4KEOP)
14702 		    fputs (" R4KEOP", stdout);
14703 		  if (option->info & OHW_R8KPFETCH)
14704 		    fputs (" R8KPFETCH", stdout);
14705 		  if (option->info & OHW_R5KEOP)
14706 		    fputs (" R5KEOP", stdout);
14707 		  if (option->info & OHW_R5KCVTL)
14708 		    fputs (" R5KCVTL", stdout);
14709 		  break;
14710 		case ODK_FILL:
14711 		  fputs (" FILL       ", stdout);
14712 		  /* XXX Print content of info word?  */
14713 		  break;
14714 		case ODK_TAGS:
14715 		  fputs (" TAGS       ", stdout);
14716 		  /* XXX Print content of info word?  */
14717 		  break;
14718 		case ODK_HWAND:
14719 		  fputs (" HWAND     ", stdout);
14720 		  if (option->info & OHWA0_R4KEOP_CHECKED)
14721 		    fputs (" R4KEOP_CHECKED", stdout);
14722 		  if (option->info & OHWA0_R4KEOP_CLEAN)
14723 		    fputs (" R4KEOP_CLEAN", stdout);
14724 		  break;
14725 		case ODK_HWOR:
14726 		  fputs (" HWOR      ", stdout);
14727 		  if (option->info & OHWA0_R4KEOP_CHECKED)
14728 		    fputs (" R4KEOP_CHECKED", stdout);
14729 		  if (option->info & OHWA0_R4KEOP_CLEAN)
14730 		    fputs (" R4KEOP_CLEAN", stdout);
14731 		  break;
14732 		case ODK_GP_GROUP:
14733 		  printf (" GP_GROUP  %#06lx  self-contained %#06lx",
14734 			  option->info & OGP_GROUP,
14735 			  (option->info & OGP_SELF) >> 16);
14736 		  break;
14737 		case ODK_IDENT:
14738 		  printf (" IDENT     %#06lx  self-contained %#06lx",
14739 			  option->info & OGP_GROUP,
14740 			  (option->info & OGP_SELF) >> 16);
14741 		  break;
14742 		default:
14743 		  /* This shouldn't happen.  */
14744 		  printf (" %3d ???     %d %lx",
14745 			  option->kind, option->section, option->info);
14746 		  break;
14747 		}
14748 
14749 	      len = sizeof (* eopt);
14750 	      while (len < option->size)
14751 		{
14752 		  unsigned char datum = * ((unsigned char *) eopt + offset + len);
14753 
14754 		  if (ISPRINT (datum))
14755 		    printf ("%c", datum);
14756 		  else
14757 		    printf ("\\%03o", datum);
14758 		  len ++;
14759 		}
14760 	      fputs ("\n", stdout);
14761 
14762 	      offset += option->size;
14763 	      ++option;
14764 	    }
14765 
14766 	  free (eopt);
14767 	}
14768     }
14769 
14770   if (conflicts_offset != 0 && conflictsno != 0)
14771     {
14772       Elf32_Conflict * iconf;
14773       size_t cnt;
14774 
14775       if (dynamic_symbols == NULL)
14776 	{
14777 	  error (_("conflict list found without a dynamic symbol table\n"));
14778 	  return 0;
14779 	}
14780 
14781       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
14782       if (iconf == NULL)
14783 	{
14784 	  error (_("Out of memory allocating space for dynamic conflicts\n"));
14785 	  return 0;
14786 	}
14787 
14788       if (is_32bit_elf)
14789 	{
14790 	  Elf32_External_Conflict * econf32;
14791 
14792 	  econf32 = (Elf32_External_Conflict *)
14793               get_data (NULL, file, conflicts_offset, conflictsno,
14794                         sizeof (* econf32), _("conflict"));
14795 	  if (!econf32)
14796 	    return 0;
14797 
14798 	  for (cnt = 0; cnt < conflictsno; ++cnt)
14799 	    iconf[cnt] = BYTE_GET (econf32[cnt]);
14800 
14801 	  free (econf32);
14802 	}
14803       else
14804 	{
14805 	  Elf64_External_Conflict * econf64;
14806 
14807 	  econf64 = (Elf64_External_Conflict *)
14808               get_data (NULL, file, conflicts_offset, conflictsno,
14809                         sizeof (* econf64), _("conflict"));
14810 	  if (!econf64)
14811 	    return 0;
14812 
14813 	  for (cnt = 0; cnt < conflictsno; ++cnt)
14814 	    iconf[cnt] = BYTE_GET (econf64[cnt]);
14815 
14816 	  free (econf64);
14817 	}
14818 
14819       printf (_("\nSection '.conflict' contains %lu entries:\n"),
14820 	      (unsigned long) conflictsno);
14821       puts (_("  Num:    Index       Value  Name"));
14822 
14823       for (cnt = 0; cnt < conflictsno; ++cnt)
14824 	{
14825 	  printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
14826 
14827 	  if (iconf[cnt] >= num_dynamic_syms)
14828 	    printf (_("<corrupt symbol index>"));
14829 	  else
14830 	    {
14831 	      Elf_Internal_Sym * psym;
14832 
14833 	      psym = & dynamic_symbols[iconf[cnt]];
14834 	      print_vma (psym->st_value, FULL_HEX);
14835 	      putchar (' ');
14836 	      if (VALID_DYNAMIC_NAME (psym->st_name))
14837 		print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
14838 	      else
14839 		printf (_("<corrupt: %14ld>"), psym->st_name);
14840 	    }
14841 	  putchar ('\n');
14842 	}
14843 
14844       free (iconf);
14845     }
14846 
14847   if (pltgot != 0 && local_gotno != 0)
14848     {
14849       bfd_vma ent, local_end, global_end;
14850       size_t i, offset;
14851       unsigned char * data;
14852       unsigned char * data_end;
14853       int addr_size;
14854 
14855       ent = pltgot;
14856       addr_size = (is_32bit_elf ? 4 : 8);
14857       local_end = pltgot + local_gotno * addr_size;
14858 
14859       /* PR binutils/17533 file: 012-111227-0.004  */
14860       if (symtabno < gotsym)
14861 	{
14862 	  error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
14863 		 (unsigned long) gotsym, (unsigned long) symtabno);
14864 	  return 0;
14865 	}
14866 
14867       global_end = local_end + (symtabno - gotsym) * addr_size;
14868       /* PR 17531: file: 54c91a34.  */
14869       if (global_end < local_end)
14870 	{
14871 	  error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
14872 	  return 0;
14873 	}
14874 
14875       offset = offset_from_vma (file, pltgot, global_end - pltgot);
14876       data = (unsigned char *) get_data (NULL, file, offset,
14877                                          global_end - pltgot, 1,
14878 					 _("Global Offset Table data"));
14879       if (data == NULL)
14880 	return 0;
14881       data_end = data + (global_end - pltgot);
14882 
14883       printf (_("\nPrimary GOT:\n"));
14884       printf (_(" Canonical gp value: "));
14885       print_vma (pltgot + 0x7ff0, LONG_HEX);
14886       printf ("\n\n");
14887 
14888       printf (_(" Reserved entries:\n"));
14889       printf (_("  %*s %10s %*s Purpose\n"),
14890 	      addr_size * 2, _("Address"), _("Access"),
14891 	      addr_size * 2, _("Initial"));
14892       ent = print_mips_got_entry (data, pltgot, ent, data_end);
14893       printf (_(" Lazy resolver\n"));
14894       if (ent == (bfd_vma) -1)
14895 	goto got_print_fail;
14896       if (data
14897 	  && (byte_get (data + ent - pltgot, addr_size)
14898 	      >> (addr_size * 8 - 1)) != 0)
14899 	{
14900 	  ent = print_mips_got_entry (data, pltgot, ent, data_end);
14901 	  printf (_(" Module pointer (GNU extension)\n"));
14902 	  if (ent == (bfd_vma) -1)
14903 	    goto got_print_fail;
14904 	}
14905       printf ("\n");
14906 
14907       if (ent < local_end)
14908 	{
14909 	  printf (_(" Local entries:\n"));
14910 	  printf ("  %*s %10s %*s\n",
14911 		  addr_size * 2, _("Address"), _("Access"),
14912 		  addr_size * 2, _("Initial"));
14913 	  while (ent < local_end)
14914 	    {
14915 	      ent = print_mips_got_entry (data, pltgot, ent, data_end);
14916 	      printf ("\n");
14917 	      if (ent == (bfd_vma) -1)
14918 		goto got_print_fail;
14919 	    }
14920 	  printf ("\n");
14921 	}
14922 
14923       if (gotsym < symtabno)
14924 	{
14925 	  int sym_width;
14926 
14927 	  printf (_(" Global entries:\n"));
14928 	  printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
14929 		  addr_size * 2, _("Address"),
14930 		  _("Access"),
14931 		  addr_size * 2, _("Initial"),
14932 		  addr_size * 2, _("Sym.Val."),
14933 		  _("Type"),
14934 		  /* Note for translators: "Ndx" = abbreviated form of "Index".  */
14935 		  _("Ndx"), _("Name"));
14936 
14937 	  sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
14938 
14939 	  for (i = gotsym; i < symtabno; i++)
14940 	    {
14941 	      ent = print_mips_got_entry (data, pltgot, ent, data_end);
14942 	      printf (" ");
14943 
14944 	      if (dynamic_symbols == NULL)
14945 		printf (_("<no dynamic symbols>"));
14946 	      else if (i < num_dynamic_syms)
14947 		{
14948 		  Elf_Internal_Sym * psym = dynamic_symbols + i;
14949 
14950 		  print_vma (psym->st_value, LONG_HEX);
14951 		  printf (" %-7s %3s ",
14952 			  get_symbol_type (ELF_ST_TYPE (psym->st_info)),
14953 			  get_symbol_index_type (psym->st_shndx));
14954 
14955 		  if (VALID_DYNAMIC_NAME (psym->st_name))
14956 		    print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
14957 		  else
14958 		    printf (_("<corrupt: %14ld>"), psym->st_name);
14959 		}
14960 	      else
14961 		printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
14962 			(unsigned long) i);
14963 
14964 	      printf ("\n");
14965 	      if (ent == (bfd_vma) -1)
14966 		break;
14967 	    }
14968 	  printf ("\n");
14969 	}
14970 
14971     got_print_fail:
14972       if (data)
14973 	free (data);
14974     }
14975 
14976   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
14977     {
14978       bfd_vma ent, end;
14979       size_t offset, rel_offset;
14980       unsigned long count, i;
14981       unsigned char * data;
14982       int addr_size, sym_width;
14983       Elf_Internal_Rela * rels;
14984 
14985       rel_offset = offset_from_vma (file, jmprel, pltrelsz);
14986       if (pltrel == DT_RELA)
14987 	{
14988 	  if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
14989 	    return 0;
14990 	}
14991       else
14992 	{
14993 	  if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
14994 	    return 0;
14995 	}
14996 
14997       ent = mips_pltgot;
14998       addr_size = (is_32bit_elf ? 4 : 8);
14999       end = mips_pltgot + (2 + count) * addr_size;
15000 
15001       offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
15002       data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
15003                                          1, _("Procedure Linkage Table data"));
15004       if (data == NULL)
15005 	return 0;
15006 
15007       printf ("\nPLT GOT:\n\n");
15008       printf (_(" Reserved entries:\n"));
15009       printf (_("  %*s %*s Purpose\n"),
15010 	      addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
15011       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15012       printf (_(" PLT lazy resolver\n"));
15013       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15014       printf (_(" Module pointer\n"));
15015       printf ("\n");
15016 
15017       printf (_(" Entries:\n"));
15018       printf ("  %*s %*s %*s %-7s %3s %s\n",
15019 	      addr_size * 2, _("Address"),
15020 	      addr_size * 2, _("Initial"),
15021 	      addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
15022       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
15023       for (i = 0; i < count; i++)
15024 	{
15025 	  unsigned long idx = get_reloc_symindex (rels[i].r_info);
15026 
15027 	  ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15028 	  printf (" ");
15029 
15030 	  if (idx >= num_dynamic_syms)
15031 	    printf (_("<corrupt symbol index: %lu>"), idx);
15032 	  else
15033 	    {
15034 	      Elf_Internal_Sym * psym = dynamic_symbols + idx;
15035 
15036 	      print_vma (psym->st_value, LONG_HEX);
15037 	      printf (" %-7s %3s ",
15038 		      get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15039 		      get_symbol_index_type (psym->st_shndx));
15040 	      if (VALID_DYNAMIC_NAME (psym->st_name))
15041 		print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15042 	      else
15043 		printf (_("<corrupt: %14ld>"), psym->st_name);
15044 	    }
15045 	  printf ("\n");
15046 	}
15047       printf ("\n");
15048 
15049       if (data)
15050 	free (data);
15051       free (rels);
15052     }
15053 
15054   return 1;
15055 }
15056 
15057 static int
15058 process_nds32_specific (FILE * file)
15059 {
15060   Elf_Internal_Shdr *sect = NULL;
15061 
15062   sect = find_section (".nds32_e_flags");
15063   if (sect != NULL)
15064     {
15065       unsigned int *flag;
15066 
15067       printf ("\nNDS32 elf flags section:\n");
15068       flag = get_data (NULL, file, sect->sh_offset, 1,
15069 		       sect->sh_size, _("NDS32 elf flags section"));
15070 
15071       switch ((*flag) & 0x3)
15072 	{
15073 	case 0:
15074 	  printf ("(VEC_SIZE):\tNo entry.\n");
15075 	  break;
15076 	case 1:
15077 	  printf ("(VEC_SIZE):\t4 bytes\n");
15078 	  break;
15079 	case 2:
15080 	  printf ("(VEC_SIZE):\t16 bytes\n");
15081 	  break;
15082 	case 3:
15083 	  printf ("(VEC_SIZE):\treserved\n");
15084 	  break;
15085 	}
15086     }
15087 
15088   return TRUE;
15089 }
15090 
15091 static int
15092 process_gnu_liblist (FILE * file)
15093 {
15094   Elf_Internal_Shdr * section;
15095   Elf_Internal_Shdr * string_sec;
15096   Elf32_External_Lib * elib;
15097   char * strtab;
15098   size_t strtab_size;
15099   size_t cnt;
15100   unsigned i;
15101 
15102   if (! do_arch)
15103     return 0;
15104 
15105   for (i = 0, section = section_headers;
15106        i < elf_header.e_shnum;
15107        i++, section++)
15108     {
15109       switch (section->sh_type)
15110 	{
15111 	case SHT_GNU_LIBLIST:
15112 	  if (section->sh_link >= elf_header.e_shnum)
15113 	    break;
15114 
15115 	  elib = (Elf32_External_Lib *)
15116               get_data (NULL, file, section->sh_offset, 1, section->sh_size,
15117                         _("liblist section data"));
15118 
15119 	  if (elib == NULL)
15120 	    break;
15121 	  string_sec = section_headers + section->sh_link;
15122 
15123 	  strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
15124                                       string_sec->sh_size,
15125                                       _("liblist string table"));
15126 	  if (strtab == NULL
15127 	      || section->sh_entsize != sizeof (Elf32_External_Lib))
15128 	    {
15129 	      free (elib);
15130 	      free (strtab);
15131 	      break;
15132 	    }
15133 	  strtab_size = string_sec->sh_size;
15134 
15135 	  printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
15136 		  printable_section_name (section),
15137 		  (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
15138 
15139 	  puts (_("     Library              Time Stamp          Checksum   Version Flags"));
15140 
15141 	  for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
15142 	       ++cnt)
15143 	    {
15144 	      Elf32_Lib liblist;
15145 	      time_t atime;
15146 	      char timebuf[128];
15147 	      struct tm * tmp;
15148 
15149 	      liblist.l_name = BYTE_GET (elib[cnt].l_name);
15150 	      atime = BYTE_GET (elib[cnt].l_time_stamp);
15151 	      liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15152 	      liblist.l_version = BYTE_GET (elib[cnt].l_version);
15153 	      liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15154 
15155 	      tmp = gmtime (&atime);
15156 	      snprintf (timebuf, sizeof (timebuf),
15157 			"%04u-%02u-%02uT%02u:%02u:%02u",
15158 			tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15159 			tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
15160 
15161 	      printf ("%3lu: ", (unsigned long) cnt);
15162 	      if (do_wide)
15163 		printf ("%-20s", liblist.l_name < strtab_size
15164 			? strtab + liblist.l_name : _("<corrupt>"));
15165 	      else
15166 		printf ("%-20.20s", liblist.l_name < strtab_size
15167 			? strtab + liblist.l_name : _("<corrupt>"));
15168 	      printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
15169 		      liblist.l_version, liblist.l_flags);
15170 	    }
15171 
15172 	  free (elib);
15173 	  free (strtab);
15174 	}
15175     }
15176 
15177   return 1;
15178 }
15179 
15180 static const char *
15181 get_note_type (unsigned e_type)
15182 {
15183   static char buff[64];
15184 
15185   if (elf_header.e_type == ET_CORE)
15186     switch (e_type)
15187       {
15188       case NT_AUXV:
15189 	return _("NT_AUXV (auxiliary vector)");
15190       case NT_PRSTATUS:
15191 	return _("NT_PRSTATUS (prstatus structure)");
15192       case NT_FPREGSET:
15193 	return _("NT_FPREGSET (floating point registers)");
15194       case NT_PRPSINFO:
15195 	return _("NT_PRPSINFO (prpsinfo structure)");
15196       case NT_TASKSTRUCT:
15197 	return _("NT_TASKSTRUCT (task structure)");
15198       case NT_PRXFPREG:
15199 	return _("NT_PRXFPREG (user_xfpregs structure)");
15200       case NT_PPC_VMX:
15201 	return _("NT_PPC_VMX (ppc Altivec registers)");
15202       case NT_PPC_VSX:
15203 	return _("NT_PPC_VSX (ppc VSX registers)");
15204       case NT_386_TLS:
15205 	return _("NT_386_TLS (x86 TLS information)");
15206       case NT_386_IOPERM:
15207 	return _("NT_386_IOPERM (x86 I/O permissions)");
15208       case NT_X86_XSTATE:
15209 	return _("NT_X86_XSTATE (x86 XSAVE extended state)");
15210       case NT_S390_HIGH_GPRS:
15211 	return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
15212       case NT_S390_TIMER:
15213 	return _("NT_S390_TIMER (s390 timer register)");
15214       case NT_S390_TODCMP:
15215 	return _("NT_S390_TODCMP (s390 TOD comparator register)");
15216       case NT_S390_TODPREG:
15217 	return _("NT_S390_TODPREG (s390 TOD programmable register)");
15218       case NT_S390_CTRS:
15219 	return _("NT_S390_CTRS (s390 control registers)");
15220       case NT_S390_PREFIX:
15221 	return _("NT_S390_PREFIX (s390 prefix register)");
15222       case NT_S390_LAST_BREAK:
15223 	return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
15224       case NT_S390_SYSTEM_CALL:
15225 	return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
15226       case NT_S390_TDB:
15227 	return _("NT_S390_TDB (s390 transaction diagnostic block)");
15228       case NT_S390_VXRS_LOW:
15229 	return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
15230       case NT_S390_VXRS_HIGH:
15231 	return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
15232       case NT_ARM_VFP:
15233 	return _("NT_ARM_VFP (arm VFP registers)");
15234       case NT_ARM_TLS:
15235 	return _("NT_ARM_TLS (AArch TLS registers)");
15236       case NT_ARM_HW_BREAK:
15237 	return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
15238       case NT_ARM_HW_WATCH:
15239 	return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
15240       case NT_PSTATUS:
15241 	return _("NT_PSTATUS (pstatus structure)");
15242       case NT_FPREGS:
15243 	return _("NT_FPREGS (floating point registers)");
15244       case NT_PSINFO:
15245 	return _("NT_PSINFO (psinfo structure)");
15246       case NT_LWPSTATUS:
15247 	return _("NT_LWPSTATUS (lwpstatus_t structure)");
15248       case NT_LWPSINFO:
15249 	return _("NT_LWPSINFO (lwpsinfo_t structure)");
15250       case NT_WIN32PSTATUS:
15251 	return _("NT_WIN32PSTATUS (win32_pstatus structure)");
15252       case NT_SIGINFO:
15253 	return _("NT_SIGINFO (siginfo_t data)");
15254       case NT_FILE:
15255 	return _("NT_FILE (mapped files)");
15256       default:
15257 	break;
15258       }
15259   else
15260     switch (e_type)
15261       {
15262       case NT_VERSION:
15263 	return _("NT_VERSION (version)");
15264       case NT_ARCH:
15265 	return _("NT_ARCH (architecture)");
15266       default:
15267 	break;
15268       }
15269 
15270   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15271   return buff;
15272 }
15273 
15274 static int
15275 print_core_note (Elf_Internal_Note *pnote)
15276 {
15277   unsigned int addr_size = is_32bit_elf ? 4 : 8;
15278   bfd_vma count, page_size;
15279   unsigned char *descdata, *filenames, *descend;
15280 
15281   if (pnote->type != NT_FILE)
15282     return 1;
15283 
15284 #ifndef BFD64
15285   if (!is_32bit_elf)
15286     {
15287       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
15288       /* Still "successful".  */
15289       return 1;
15290     }
15291 #endif
15292 
15293   if (pnote->descsz < 2 * addr_size)
15294     {
15295       printf (_("    Malformed note - too short for header\n"));
15296       return 0;
15297     }
15298 
15299   descdata = (unsigned char *) pnote->descdata;
15300   descend = descdata + pnote->descsz;
15301 
15302   if (descdata[pnote->descsz - 1] != '\0')
15303     {
15304       printf (_("    Malformed note - does not end with \\0\n"));
15305       return 0;
15306     }
15307 
15308   count = byte_get (descdata, addr_size);
15309   descdata += addr_size;
15310 
15311   page_size = byte_get (descdata, addr_size);
15312   descdata += addr_size;
15313 
15314   if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
15315     {
15316       printf (_("    Malformed note - too short for supplied file count\n"));
15317       return 0;
15318     }
15319 
15320   printf (_("    Page size: "));
15321   print_vma (page_size, DEC);
15322   printf ("\n");
15323 
15324   printf (_("    %*s%*s%*s\n"),
15325 	  (int) (2 + 2 * addr_size), _("Start"),
15326 	  (int) (4 + 2 * addr_size), _("End"),
15327 	  (int) (4 + 2 * addr_size), _("Page Offset"));
15328   filenames = descdata + count * 3 * addr_size;
15329   while (count-- > 0)
15330     {
15331       bfd_vma start, end, file_ofs;
15332 
15333       if (filenames == descend)
15334 	{
15335 	  printf (_("    Malformed note - filenames end too early\n"));
15336 	  return 0;
15337 	}
15338 
15339       start = byte_get (descdata, addr_size);
15340       descdata += addr_size;
15341       end = byte_get (descdata, addr_size);
15342       descdata += addr_size;
15343       file_ofs = byte_get (descdata, addr_size);
15344       descdata += addr_size;
15345 
15346       printf ("    ");
15347       print_vma (start, FULL_HEX);
15348       printf ("  ");
15349       print_vma (end, FULL_HEX);
15350       printf ("  ");
15351       print_vma (file_ofs, FULL_HEX);
15352       printf ("\n        %s\n", filenames);
15353 
15354       filenames += 1 + strlen ((char *) filenames);
15355     }
15356 
15357   return 1;
15358 }
15359 
15360 static const char *
15361 get_gnu_elf_note_type (unsigned e_type)
15362 {
15363   static char buff[64];
15364 
15365   switch (e_type)
15366     {
15367     case NT_GNU_ABI_TAG:
15368       return _("NT_GNU_ABI_TAG (ABI version tag)");
15369     case NT_GNU_HWCAP:
15370       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
15371     case NT_GNU_BUILD_ID:
15372       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
15373     case NT_GNU_GOLD_VERSION:
15374       return _("NT_GNU_GOLD_VERSION (gold version)");
15375     default:
15376       break;
15377     }
15378 
15379   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15380   return buff;
15381 }
15382 
15383 static int
15384 print_gnu_note (Elf_Internal_Note *pnote)
15385 {
15386   switch (pnote->type)
15387     {
15388     case NT_GNU_BUILD_ID:
15389       {
15390 	unsigned long i;
15391 
15392 	printf (_("    Build ID: "));
15393 	for (i = 0; i < pnote->descsz; ++i)
15394 	  printf ("%02x", pnote->descdata[i] & 0xff);
15395 	printf ("\n");
15396       }
15397       break;
15398 
15399     case NT_GNU_ABI_TAG:
15400       {
15401 	unsigned long os, major, minor, subminor;
15402 	const char *osname;
15403 
15404 	/* PR 17531: file: 030-599401-0.004.  */
15405 	if (pnote->descsz < 16)
15406 	  {
15407 	    printf (_("    <corrupt GNU_ABI_TAG>\n"));
15408 	    break;
15409 	  }
15410 
15411 	os = byte_get ((unsigned char *) pnote->descdata, 4);
15412 	major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15413 	minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
15414 	subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
15415 
15416 	switch (os)
15417 	  {
15418 	  case GNU_ABI_TAG_LINUX:
15419 	    osname = "Linux";
15420 	    break;
15421 	  case GNU_ABI_TAG_HURD:
15422 	    osname = "Hurd";
15423 	    break;
15424 	  case GNU_ABI_TAG_SOLARIS:
15425 	    osname = "Solaris";
15426 	    break;
15427 	  case GNU_ABI_TAG_FREEBSD:
15428 	    osname = "FreeBSD";
15429 	    break;
15430 	  case GNU_ABI_TAG_NETBSD:
15431 	    osname = "NetBSD";
15432 	    break;
15433 	  case GNU_ABI_TAG_SYLLABLE:
15434 	    osname = "Syllable";
15435 	    break;
15436 	  case GNU_ABI_TAG_NACL:
15437 	    osname = "NaCl";
15438 	    break;
15439 	  default:
15440 	    osname = "Unknown";
15441 	    break;
15442 	  }
15443 
15444 	printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
15445 		major, minor, subminor);
15446       }
15447       break;
15448 
15449     case NT_GNU_GOLD_VERSION:
15450       {
15451 	unsigned long i;
15452 
15453 	printf (_("    Version: "));
15454 	for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
15455 	  printf ("%c", pnote->descdata[i]);
15456 	printf ("\n");
15457       }
15458       break;
15459     }
15460 
15461   return 1;
15462 }
15463 
15464 static const char *
15465 get_v850_elf_note_type (enum v850_notes n_type)
15466 {
15467   static char buff[64];
15468 
15469   switch (n_type)
15470     {
15471     case V850_NOTE_ALIGNMENT:  return _("Alignment of 8-byte objects");
15472     case V850_NOTE_DATA_SIZE:  return _("Sizeof double and long double");
15473     case V850_NOTE_FPU_INFO:   return _("Type of FPU support needed");
15474     case V850_NOTE_SIMD_INFO:  return _("Use of SIMD instructions");
15475     case V850_NOTE_CACHE_INFO: return _("Use of cache");
15476     case V850_NOTE_MMU_INFO:   return _("Use of MMU");
15477     default:
15478       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
15479       return buff;
15480     }
15481 }
15482 
15483 static int
15484 print_v850_note (Elf_Internal_Note * pnote)
15485 {
15486   unsigned int val;
15487 
15488   if (pnote->descsz != 4)
15489     return 0;
15490   val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
15491 
15492   if (val == 0)
15493     {
15494       printf (_("not set\n"));
15495       return 1;
15496     }
15497 
15498   switch (pnote->type)
15499     {
15500     case V850_NOTE_ALIGNMENT:
15501       switch (val)
15502 	{
15503 	case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return 1;
15504 	case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return 1;
15505 	}
15506       break;
15507 
15508     case V850_NOTE_DATA_SIZE:
15509       switch (val)
15510 	{
15511 	case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return 1;
15512 	case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return 1;
15513 	}
15514       break;
15515 
15516     case V850_NOTE_FPU_INFO:
15517       switch (val)
15518 	{
15519 	case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return 1;
15520 	case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return 1;
15521 	}
15522       break;
15523 
15524     case V850_NOTE_MMU_INFO:
15525     case V850_NOTE_CACHE_INFO:
15526     case V850_NOTE_SIMD_INFO:
15527       if (val == EF_RH850_SIMD)
15528 	{
15529 	  printf (_("yes\n"));
15530 	  return 1;
15531 	}
15532       break;
15533 
15534     default:
15535       /* An 'unknown note type' message will already have been displayed.  */
15536       break;
15537     }
15538 
15539   printf (_("unknown value: %x\n"), val);
15540   return 0;
15541 }
15542 
15543 static int
15544 process_netbsd_elf_note (Elf_Internal_Note * pnote)
15545 {
15546   unsigned int version;
15547 
15548   switch (pnote->type)
15549     {
15550     case NT_NETBSD_IDENT:
15551       version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
15552       if ((version / 10000) % 100)
15553         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
15554 		version, version / 100000000, (version / 1000000) % 100,
15555 		(version / 10000) % 100 > 26 ? "Z" : "",
15556 		'A' + (version / 10000) % 26);
15557       else
15558 	printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
15559 	        version, version / 100000000, (version / 1000000) % 100,
15560 		(version / 100) % 100);
15561       return 1;
15562 
15563     case NT_NETBSD_MARCH:
15564       printf ("  NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
15565 	      pnote->descdata);
15566       return 1;
15567 
15568     default:
15569       break;
15570     }
15571 
15572   printf ("  NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
15573 	  pnote->type);
15574   return 1;
15575 }
15576 
15577 static const char *
15578 get_freebsd_elfcore_note_type (unsigned e_type)
15579 {
15580   switch (e_type)
15581     {
15582     case NT_FREEBSD_THRMISC:
15583       return _("NT_THRMISC (thrmisc structure)");
15584     case NT_FREEBSD_PROCSTAT_PROC:
15585       return _("NT_PROCSTAT_PROC (proc data)");
15586     case NT_FREEBSD_PROCSTAT_FILES:
15587       return _("NT_PROCSTAT_FILES (files data)");
15588     case NT_FREEBSD_PROCSTAT_VMMAP:
15589       return _("NT_PROCSTAT_VMMAP (vmmap data)");
15590     case NT_FREEBSD_PROCSTAT_GROUPS:
15591       return _("NT_PROCSTAT_GROUPS (groups data)");
15592     case NT_FREEBSD_PROCSTAT_UMASK:
15593       return _("NT_PROCSTAT_UMASK (umask data)");
15594     case NT_FREEBSD_PROCSTAT_RLIMIT:
15595       return _("NT_PROCSTAT_RLIMIT (rlimit data)");
15596     case NT_FREEBSD_PROCSTAT_OSREL:
15597       return _("NT_PROCSTAT_OSREL (osreldate data)");
15598     case NT_FREEBSD_PROCSTAT_PSSTRINGS:
15599       return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
15600     case NT_FREEBSD_PROCSTAT_AUXV:
15601       return _("NT_PROCSTAT_AUXV (auxv data)");
15602     }
15603   return get_note_type (e_type);
15604 }
15605 
15606 static const char *
15607 get_netbsd_elfcore_note_type (unsigned e_type)
15608 {
15609   static char buff[64];
15610 
15611   if (e_type == NT_NETBSDCORE_PROCINFO)
15612     {
15613       /* NetBSD core "procinfo" structure.  */
15614       return _("NetBSD procinfo structure");
15615     }
15616 
15617   /* As of Jan 2002 there are no other machine-independent notes
15618      defined for NetBSD core files.  If the note type is less
15619      than the start of the machine-dependent note types, we don't
15620      understand it.  */
15621 
15622   if (e_type < NT_NETBSDCORE_FIRSTMACH)
15623     {
15624       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15625       return buff;
15626     }
15627 
15628   switch (elf_header.e_machine)
15629     {
15630     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
15631        and PT_GETFPREGS == mach+2.  */
15632 
15633     case EM_OLD_ALPHA:
15634     case EM_ALPHA:
15635     case EM_SPARC:
15636     case EM_SPARC32PLUS:
15637     case EM_SPARCV9:
15638       switch (e_type)
15639 	{
15640 	case NT_NETBSDCORE_FIRSTMACH + 0:
15641 	  return _("PT_GETREGS (reg structure)");
15642 	case NT_NETBSDCORE_FIRSTMACH + 2:
15643 	  return _("PT_GETFPREGS (fpreg structure)");
15644 	default:
15645 	  break;
15646 	}
15647       break;
15648 
15649     /* On all other arch's, PT_GETREGS == mach+1 and
15650        PT_GETFPREGS == mach+3.  */
15651     default:
15652       switch (e_type)
15653 	{
15654 	case NT_NETBSDCORE_FIRSTMACH + 1:
15655 	  return _("PT_GETREGS (reg structure)");
15656 	case NT_NETBSDCORE_FIRSTMACH + 3:
15657 	  return _("PT_GETFPREGS (fpreg structure)");
15658 	default:
15659 	  break;
15660 	}
15661     }
15662 
15663   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
15664 	    e_type - NT_NETBSDCORE_FIRSTMACH);
15665   return buff;
15666 }
15667 
15668 static const char *
15669 get_stapsdt_note_type (unsigned e_type)
15670 {
15671   static char buff[64];
15672 
15673   switch (e_type)
15674     {
15675     case NT_STAPSDT:
15676       return _("NT_STAPSDT (SystemTap probe descriptors)");
15677 
15678     default:
15679       break;
15680     }
15681 
15682   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15683   return buff;
15684 }
15685 
15686 static int
15687 print_stapsdt_note (Elf_Internal_Note *pnote)
15688 {
15689   int addr_size = is_32bit_elf ? 4 : 8;
15690   char *data = pnote->descdata;
15691   char *data_end = pnote->descdata + pnote->descsz;
15692   bfd_vma pc, base_addr, semaphore;
15693   char *provider, *probe, *arg_fmt;
15694 
15695   pc = byte_get ((unsigned char *) data, addr_size);
15696   data += addr_size;
15697   base_addr = byte_get ((unsigned char *) data, addr_size);
15698   data += addr_size;
15699   semaphore = byte_get ((unsigned char *) data, addr_size);
15700   data += addr_size;
15701 
15702   provider = data;
15703   data += strlen (data) + 1;
15704   probe = data;
15705   data += strlen (data) + 1;
15706   arg_fmt = data;
15707   data += strlen (data) + 1;
15708 
15709   printf (_("    Provider: %s\n"), provider);
15710   printf (_("    Name: %s\n"), probe);
15711   printf (_("    Location: "));
15712   print_vma (pc, FULL_HEX);
15713   printf (_(", Base: "));
15714   print_vma (base_addr, FULL_HEX);
15715   printf (_(", Semaphore: "));
15716   print_vma (semaphore, FULL_HEX);
15717   printf ("\n");
15718   printf (_("    Arguments: %s\n"), arg_fmt);
15719 
15720   return data == data_end;
15721 }
15722 
15723 static const char *
15724 get_ia64_vms_note_type (unsigned e_type)
15725 {
15726   static char buff[64];
15727 
15728   switch (e_type)
15729     {
15730     case NT_VMS_MHD:
15731       return _("NT_VMS_MHD (module header)");
15732     case NT_VMS_LNM:
15733       return _("NT_VMS_LNM (language name)");
15734     case NT_VMS_SRC:
15735       return _("NT_VMS_SRC (source files)");
15736     case NT_VMS_TITLE:
15737       return "NT_VMS_TITLE";
15738     case NT_VMS_EIDC:
15739       return _("NT_VMS_EIDC (consistency check)");
15740     case NT_VMS_FPMODE:
15741       return _("NT_VMS_FPMODE (FP mode)");
15742     case NT_VMS_LINKTIME:
15743       return "NT_VMS_LINKTIME";
15744     case NT_VMS_IMGNAM:
15745       return _("NT_VMS_IMGNAM (image name)");
15746     case NT_VMS_IMGID:
15747       return _("NT_VMS_IMGID (image id)");
15748     case NT_VMS_LINKID:
15749       return _("NT_VMS_LINKID (link id)");
15750     case NT_VMS_IMGBID:
15751       return _("NT_VMS_IMGBID (build id)");
15752     case NT_VMS_GSTNAM:
15753       return _("NT_VMS_GSTNAM (sym table name)");
15754     case NT_VMS_ORIG_DYN:
15755       return "NT_VMS_ORIG_DYN";
15756     case NT_VMS_PATCHTIME:
15757       return "NT_VMS_PATCHTIME";
15758     default:
15759       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15760       return buff;
15761     }
15762 }
15763 
15764 static int
15765 print_ia64_vms_note (Elf_Internal_Note * pnote)
15766 {
15767   switch (pnote->type)
15768     {
15769     case NT_VMS_MHD:
15770       if (pnote->descsz > 36)
15771         {
15772           size_t l = strlen (pnote->descdata + 34);
15773           printf (_("    Creation date  : %.17s\n"), pnote->descdata);
15774           printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
15775           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
15776           printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
15777         }
15778       else
15779         printf (_("    Invalid size\n"));
15780       break;
15781     case NT_VMS_LNM:
15782       printf (_("   Language: %s\n"), pnote->descdata);
15783       break;
15784 #ifdef BFD64
15785     case NT_VMS_FPMODE:
15786       printf (_("   Floating Point mode: "));
15787       printf ("0x%016" BFD_VMA_FMT "x\n",
15788               (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
15789       break;
15790     case NT_VMS_LINKTIME:
15791       printf (_("   Link time: "));
15792       print_vms_time
15793         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15794       printf ("\n");
15795       break;
15796     case NT_VMS_PATCHTIME:
15797       printf (_("   Patch time: "));
15798       print_vms_time
15799         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15800       printf ("\n");
15801       break;
15802     case NT_VMS_ORIG_DYN:
15803       printf (_("   Major id: %u,  minor id: %u\n"),
15804               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
15805               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
15806       printf (_("   Last modified  : "));
15807       print_vms_time
15808         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
15809       printf (_("\n   Link flags  : "));
15810       printf ("0x%016" BFD_VMA_FMT "x\n",
15811               (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
15812       printf (_("   Header flags: 0x%08x\n"),
15813               (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
15814       printf (_("   Image id    : %s\n"), pnote->descdata + 32);
15815       break;
15816 #endif
15817     case NT_VMS_IMGNAM:
15818       printf (_("    Image name: %s\n"), pnote->descdata);
15819       break;
15820     case NT_VMS_GSTNAM:
15821       printf (_("    Global symbol table name: %s\n"), pnote->descdata);
15822       break;
15823     case NT_VMS_IMGID:
15824       printf (_("    Image id: %s\n"), pnote->descdata);
15825       break;
15826     case NT_VMS_LINKID:
15827       printf (_("    Linker id: %s\n"), pnote->descdata);
15828       break;
15829     default:
15830       break;
15831     }
15832   return 1;
15833 }
15834 
15835 /* Note that by the ELF standard, the name field is already null byte
15836    terminated, and namesz includes the terminating null byte.
15837    I.E. the value of namesz for the name "FSF" is 4.
15838 
15839    If the value of namesz is zero, there is no name present.  */
15840 static int
15841 process_note (Elf_Internal_Note * pnote)
15842 {
15843   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
15844   const char * nt;
15845 
15846   if (pnote->namesz == 0)
15847     /* If there is no note name, then use the default set of
15848        note type strings.  */
15849     nt = get_note_type (pnote->type);
15850 
15851   else if (const_strneq (pnote->namedata, "GNU"))
15852     /* GNU-specific object file notes.  */
15853     nt = get_gnu_elf_note_type (pnote->type);
15854 
15855   else if (const_strneq (pnote->namedata, "FreeBSD"))
15856     /* FreeBSD-specific core file notes.  */
15857     nt = get_freebsd_elfcore_note_type (pnote->type);
15858 
15859   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
15860     /* NetBSD-specific core file notes.  */
15861     nt = get_netbsd_elfcore_note_type (pnote->type);
15862 
15863   else if (const_strneq (pnote->namedata, "NetBSD"))
15864     /* NetBSD-specific core file notes.  */
15865     return process_netbsd_elf_note (pnote);
15866 
15867   else if (strneq (pnote->namedata, "SPU/", 4))
15868     {
15869       /* SPU-specific core file notes.  */
15870       nt = pnote->namedata + 4;
15871       name = "SPU";
15872     }
15873 
15874   else if (const_strneq (pnote->namedata, "IPF/VMS"))
15875     /* VMS/ia64-specific file notes.  */
15876     nt = get_ia64_vms_note_type (pnote->type);
15877 
15878   else if (const_strneq (pnote->namedata, "stapsdt"))
15879     nt = get_stapsdt_note_type (pnote->type);
15880 
15881   else
15882     /* Don't recognize this note name; just use the default set of
15883        note type strings.  */
15884     nt = get_note_type (pnote->type);
15885 
15886   printf ("  %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
15887 
15888   if (const_strneq (pnote->namedata, "IPF/VMS"))
15889     return print_ia64_vms_note (pnote);
15890   else if (const_strneq (pnote->namedata, "GNU"))
15891     return print_gnu_note (pnote);
15892   else if (const_strneq (pnote->namedata, "stapsdt"))
15893     return print_stapsdt_note (pnote);
15894   else if (const_strneq (pnote->namedata, "CORE"))
15895     return print_core_note (pnote);
15896   else
15897     return 1;
15898 }
15899 
15900 
15901 static int
15902 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
15903 {
15904   Elf_External_Note * pnotes;
15905   Elf_External_Note * external;
15906   char * end;
15907   int res = 1;
15908 
15909   if (length <= 0)
15910     return 0;
15911 
15912   pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
15913 					   _("notes"));
15914   if (pnotes == NULL)
15915     return 0;
15916 
15917   external = pnotes;
15918 
15919   printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
15920 	  (unsigned long) offset, (unsigned long) length);
15921   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
15922 
15923   end = (char *) pnotes + length;
15924   while ((char *) external < end)
15925     {
15926       Elf_Internal_Note inote;
15927       size_t min_notesz;
15928       char *next;
15929       char * temp = NULL;
15930       size_t data_remaining = end - (char *) external;
15931 
15932       if (!is_ia64_vms ())
15933 	{
15934 	  /* PR binutils/15191
15935 	     Make sure that there is enough data to read.  */
15936 	  min_notesz = offsetof (Elf_External_Note, name);
15937 	  if (data_remaining < min_notesz)
15938 	    {
15939 	      warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15940 		    (int) data_remaining);
15941 	      break;
15942 	    }
15943 	  inote.type     = BYTE_GET (external->type);
15944 	  inote.namesz   = BYTE_GET (external->namesz);
15945 	  inote.namedata = external->name;
15946 	  inote.descsz   = BYTE_GET (external->descsz);
15947 	  inote.descdata = inote.namedata + align_power (inote.namesz, 2);
15948 	  /* PR 17531: file: 3443835e.  */
15949 	  if (inote.descdata < (char *) pnotes || inote.descdata > end)
15950 	    {
15951 	      warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
15952 	      inote.descdata = inote.namedata;
15953 	      inote.namesz   = 0;
15954 	    }
15955 
15956 	  inote.descpos  = offset + (inote.descdata - (char *) pnotes);
15957 	  next = inote.descdata + align_power (inote.descsz, 2);
15958 	}
15959       else
15960 	{
15961 	  Elf64_External_VMS_Note *vms_external;
15962 
15963 	  /* PR binutils/15191
15964 	     Make sure that there is enough data to read.  */
15965 	  min_notesz = offsetof (Elf64_External_VMS_Note, name);
15966 	  if (data_remaining < min_notesz)
15967 	    {
15968 	      warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
15969 		    (int) data_remaining);
15970 	      break;
15971 	    }
15972 
15973 	  vms_external = (Elf64_External_VMS_Note *) external;
15974 	  inote.type     = BYTE_GET (vms_external->type);
15975 	  inote.namesz   = BYTE_GET (vms_external->namesz);
15976 	  inote.namedata = vms_external->name;
15977 	  inote.descsz   = BYTE_GET (vms_external->descsz);
15978 	  inote.descdata = inote.namedata + align_power (inote.namesz, 3);
15979 	  inote.descpos  = offset + (inote.descdata - (char *) pnotes);
15980 	  next = inote.descdata + align_power (inote.descsz, 3);
15981 	}
15982 
15983       if (inote.descdata < (char *) external + min_notesz
15984 	  || next < (char *) external + min_notesz
15985 	  /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4.  */
15986 	  || inote.namedata + inote.namesz < inote.namedata
15987 	  || inote.descdata + inote.descsz < inote.descdata
15988 	  || data_remaining < (size_t)(next - (char *) external))
15989 	{
15990 	  warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
15991 		(unsigned long) ((char *) external - (char *) pnotes));
15992 	  warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
15993 		inote.type, inote.namesz, inote.descsz);
15994 	  break;
15995 	}
15996 
15997       external = (Elf_External_Note *) next;
15998 
15999       /* Verify that name is null terminated.  It appears that at least
16000 	 one version of Linux (RedHat 6.0) generates corefiles that don't
16001 	 comply with the ELF spec by failing to include the null byte in
16002 	 namesz.  */
16003       if (inote.namedata[inote.namesz - 1] != '\0')
16004 	{
16005 	  temp = (char *) malloc (inote.namesz + 1);
16006 	  if (temp == NULL)
16007 	    {
16008 	      error (_("Out of memory allocating space for inote name\n"));
16009 	      res = 0;
16010 	      break;
16011 	    }
16012 
16013 	  strncpy (temp, inote.namedata, inote.namesz);
16014 	  temp[inote.namesz] = 0;
16015 
16016 	  /* warn (_("'%s' NOTE name not properly null terminated\n"), temp);  */
16017 	  inote.namedata = temp;
16018 	}
16019 
16020       res &= process_note (& inote);
16021 
16022       if (temp != NULL)
16023 	{
16024 	  free (temp);
16025 	  temp = NULL;
16026 	}
16027     }
16028 
16029   free (pnotes);
16030 
16031   return res;
16032 }
16033 
16034 static int
16035 process_corefile_note_segments (FILE * file)
16036 {
16037   Elf_Internal_Phdr * segment;
16038   unsigned int i;
16039   int res = 1;
16040 
16041   if (! get_program_headers (file))
16042       return 0;
16043 
16044   for (i = 0, segment = program_headers;
16045        i < elf_header.e_phnum;
16046        i++, segment++)
16047     {
16048       if (segment->p_type == PT_NOTE)
16049 	res &= process_corefile_note_segment (file,
16050 					      (bfd_vma) segment->p_offset,
16051 					      (bfd_vma) segment->p_filesz);
16052     }
16053 
16054   return res;
16055 }
16056 
16057 static int
16058 process_v850_notes (FILE * file, bfd_vma offset, bfd_vma length)
16059 {
16060   Elf_External_Note * pnotes;
16061   Elf_External_Note * external;
16062   char * end;
16063   int res = 1;
16064 
16065   if (length <= 0)
16066     return 0;
16067 
16068   pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
16069                                            _("v850 notes"));
16070   if (pnotes == NULL)
16071     return 0;
16072 
16073   external = pnotes;
16074   end = (char*) pnotes + length;
16075 
16076   printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
16077 	  (unsigned long) offset, (unsigned long) length);
16078 
16079   while ((char *) external + sizeof (Elf_External_Note) < end)
16080     {
16081       Elf_External_Note * next;
16082       Elf_Internal_Note inote;
16083 
16084       inote.type     = BYTE_GET (external->type);
16085       inote.namesz   = BYTE_GET (external->namesz);
16086       inote.namedata = external->name;
16087       inote.descsz   = BYTE_GET (external->descsz);
16088       inote.descdata = inote.namedata + align_power (inote.namesz, 2);
16089       inote.descpos  = offset + (inote.descdata - (char *) pnotes);
16090 
16091       if (inote.descdata < (char *) pnotes || inote.descdata >= end)
16092 	{
16093 	  warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
16094 	  inote.descdata = inote.namedata;
16095 	  inote.namesz   = 0;
16096 	}
16097 
16098       next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
16099 
16100       if (   ((char *) next > end)
16101 	  || ((char *) next <  (char *) pnotes))
16102 	{
16103 	  warn (_("corrupt descsz found in note at offset 0x%lx\n"),
16104 		(unsigned long) ((char *) external - (char *) pnotes));
16105 	  warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16106 		inote.type, inote.namesz, inote.descsz);
16107 	  break;
16108 	}
16109 
16110       external = next;
16111 
16112       /* Prevent out-of-bounds indexing.  */
16113       if (   inote.namedata + inote.namesz > end
16114 	  || inote.namedata + inote.namesz < inote.namedata)
16115         {
16116           warn (_("corrupt namesz found in note at offset 0x%lx\n"),
16117                 (unsigned long) ((char *) external - (char *) pnotes));
16118           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16119                 inote.type, inote.namesz, inote.descsz);
16120           break;
16121         }
16122 
16123       printf ("  %s: ", get_v850_elf_note_type (inote.type));
16124 
16125       if (! print_v850_note (& inote))
16126 	{
16127 	  res = 0;
16128 	  printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
16129 		  inote.namesz, inote.descsz);
16130 	}
16131     }
16132 
16133   free (pnotes);
16134 
16135   return res;
16136 }
16137 
16138 static int
16139 process_note_sections (FILE * file)
16140 {
16141   Elf_Internal_Shdr * section;
16142   unsigned long i;
16143   int n = 0;
16144   int res = 1;
16145 
16146   for (i = 0, section = section_headers;
16147        i < elf_header.e_shnum && section != NULL;
16148        i++, section++)
16149     {
16150       if (section->sh_type == SHT_NOTE)
16151 	{
16152 	  res &= process_corefile_note_segment (file,
16153 						(bfd_vma) section->sh_offset,
16154 						(bfd_vma) section->sh_size);
16155 	  n++;
16156 	}
16157 
16158       if ((   elf_header.e_machine == EM_V800
16159 	   || elf_header.e_machine == EM_V850
16160 	   || elf_header.e_machine == EM_CYGNUS_V850)
16161 	  && section->sh_type == SHT_RENESAS_INFO)
16162 	{
16163 	  res &= process_v850_notes (file,
16164 				     (bfd_vma) section->sh_offset,
16165 				     (bfd_vma) section->sh_size);
16166 	  n++;
16167 	}
16168     }
16169 
16170   if (n == 0)
16171     /* Try processing NOTE segments instead.  */
16172     return process_corefile_note_segments (file);
16173 
16174   return res;
16175 }
16176 
16177 static int
16178 process_notes (FILE * file)
16179 {
16180   /* If we have not been asked to display the notes then do nothing.  */
16181   if (! do_notes)
16182     return 1;
16183 
16184   if (elf_header.e_type != ET_CORE)
16185     return process_note_sections (file);
16186 
16187   /* No program headers means no NOTE segment.  */
16188   if (elf_header.e_phnum > 0)
16189     return process_corefile_note_segments (file);
16190 
16191   printf (_("No note segments present in the core file.\n"));
16192   return 1;
16193 }
16194 
16195 static int
16196 process_arch_specific (FILE * file)
16197 {
16198   if (! do_arch)
16199     return 1;
16200 
16201   switch (elf_header.e_machine)
16202     {
16203     case EM_ARM:
16204       return process_arm_specific (file);
16205     case EM_MIPS:
16206     case EM_MIPS_RS3_LE:
16207       return process_mips_specific (file);
16208       break;
16209     case EM_NDS32:
16210       return process_nds32_specific (file);
16211       break;
16212     case EM_PPC:
16213       return process_power_specific (file);
16214       break;
16215     case EM_S390:
16216     case EM_S390_OLD:
16217       return process_s390_specific (file);
16218       break;
16219     case EM_SPARC:
16220     case EM_SPARC32PLUS:
16221     case EM_SPARCV9:
16222       return process_sparc_specific (file);
16223       break;
16224     case EM_TI_C6000:
16225       return process_tic6x_specific (file);
16226       break;
16227     case EM_MSP430:
16228       return process_msp430x_specific (file);
16229     default:
16230       break;
16231     }
16232   return 1;
16233 }
16234 
16235 static int
16236 get_file_header (FILE * file)
16237 {
16238   /* Read in the identity array.  */
16239   if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
16240     return 0;
16241 
16242   /* Determine how to read the rest of the header.  */
16243   switch (elf_header.e_ident[EI_DATA])
16244     {
16245     default: /* fall through */
16246     case ELFDATANONE: /* fall through */
16247     case ELFDATA2LSB:
16248       byte_get = byte_get_little_endian;
16249       byte_put = byte_put_little_endian;
16250       break;
16251     case ELFDATA2MSB:
16252       byte_get = byte_get_big_endian;
16253       byte_put = byte_put_big_endian;
16254       break;
16255     }
16256 
16257   /* For now we only support 32 bit and 64 bit ELF files.  */
16258   is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
16259 
16260   /* Read in the rest of the header.  */
16261   if (is_32bit_elf)
16262     {
16263       Elf32_External_Ehdr ehdr32;
16264 
16265       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
16266 	return 0;
16267 
16268       elf_header.e_type      = BYTE_GET (ehdr32.e_type);
16269       elf_header.e_machine   = BYTE_GET (ehdr32.e_machine);
16270       elf_header.e_version   = BYTE_GET (ehdr32.e_version);
16271       elf_header.e_entry     = BYTE_GET (ehdr32.e_entry);
16272       elf_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
16273       elf_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
16274       elf_header.e_flags     = BYTE_GET (ehdr32.e_flags);
16275       elf_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
16276       elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
16277       elf_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
16278       elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
16279       elf_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
16280       elf_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
16281     }
16282   else
16283     {
16284       Elf64_External_Ehdr ehdr64;
16285 
16286       /* If we have been compiled with sizeof (bfd_vma) == 4, then
16287 	 we will not be able to cope with the 64bit data found in
16288 	 64 ELF files.  Detect this now and abort before we start
16289 	 overwriting things.  */
16290       if (sizeof (bfd_vma) < 8)
16291 	{
16292 	  error (_("This instance of readelf has been built without support for a\n\
16293 64 bit data type and so it cannot read 64 bit ELF files.\n"));
16294 	  return 0;
16295 	}
16296 
16297       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
16298 	return 0;
16299 
16300       elf_header.e_type      = BYTE_GET (ehdr64.e_type);
16301       elf_header.e_machine   = BYTE_GET (ehdr64.e_machine);
16302       elf_header.e_version   = BYTE_GET (ehdr64.e_version);
16303       elf_header.e_entry     = BYTE_GET (ehdr64.e_entry);
16304       elf_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
16305       elf_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
16306       elf_header.e_flags     = BYTE_GET (ehdr64.e_flags);
16307       elf_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
16308       elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
16309       elf_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
16310       elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
16311       elf_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
16312       elf_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
16313     }
16314 
16315   if (elf_header.e_shoff)
16316     {
16317       /* There may be some extensions in the first section header.  Don't
16318 	 bomb if we can't read it.  */
16319       if (is_32bit_elf)
16320 	get_32bit_section_headers (file, TRUE);
16321       else
16322 	get_64bit_section_headers (file, TRUE);
16323     }
16324 
16325   return 1;
16326 }
16327 
16328 /* Process one ELF object file according to the command line options.
16329    This file may actually be stored in an archive.  The file is
16330    positioned at the start of the ELF object.  */
16331 
16332 static int
16333 process_object (char * file_name, FILE * file)
16334 {
16335   unsigned int i;
16336 
16337   if (! get_file_header (file))
16338     {
16339       error (_("%s: Failed to read file header\n"), file_name);
16340       return 1;
16341     }
16342 
16343   /* Initialise per file variables.  */
16344   for (i = ARRAY_SIZE (version_info); i--;)
16345     version_info[i] = 0;
16346 
16347   for (i = ARRAY_SIZE (dynamic_info); i--;)
16348     dynamic_info[i] = 0;
16349   dynamic_info_DT_GNU_HASH = 0;
16350 
16351   /* Process the file.  */
16352   if (show_name)
16353     printf (_("\nFile: %s\n"), file_name);
16354 
16355   /* Initialise the dump_sects array from the cmdline_dump_sects array.
16356      Note we do this even if cmdline_dump_sects is empty because we
16357      must make sure that the dump_sets array is zeroed out before each
16358      object file is processed.  */
16359   if (num_dump_sects > num_cmdline_dump_sects)
16360     memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
16361 
16362   if (num_cmdline_dump_sects > 0)
16363     {
16364       if (num_dump_sects == 0)
16365 	/* A sneaky way of allocating the dump_sects array.  */
16366 	request_dump_bynumber (num_cmdline_dump_sects, 0);
16367 
16368       assert (num_dump_sects >= num_cmdline_dump_sects);
16369       memcpy (dump_sects, cmdline_dump_sects,
16370 	      num_cmdline_dump_sects * sizeof (* dump_sects));
16371     }
16372 
16373   if (! process_file_header ())
16374     return 1;
16375 
16376   if (! process_section_headers (file))
16377     {
16378       /* Without loaded section headers we cannot process lots of
16379 	 things.  */
16380       do_unwind = do_version = do_dump = do_arch = 0;
16381 
16382       if (! do_using_dynamic)
16383 	do_syms = do_dyn_syms = do_reloc = 0;
16384     }
16385 
16386   if (! process_section_groups (file))
16387     {
16388       /* Without loaded section groups we cannot process unwind.  */
16389       do_unwind = 0;
16390     }
16391 
16392   if (process_program_headers (file))
16393     process_dynamic_section (file);
16394 
16395   process_relocs (file);
16396 
16397   process_unwind (file);
16398 
16399   process_symbol_table (file);
16400 
16401   process_syminfo (file);
16402 
16403   process_version_sections (file);
16404 
16405   process_section_contents (file);
16406 
16407   process_notes (file);
16408 
16409   process_gnu_liblist (file);
16410 
16411   process_arch_specific (file);
16412 
16413   if (program_headers)
16414     {
16415       free (program_headers);
16416       program_headers = NULL;
16417     }
16418 
16419   if (section_headers)
16420     {
16421       free (section_headers);
16422       section_headers = NULL;
16423     }
16424 
16425   if (string_table)
16426     {
16427       free (string_table);
16428       string_table = NULL;
16429       string_table_length = 0;
16430     }
16431 
16432   if (dynamic_strings)
16433     {
16434       free (dynamic_strings);
16435       dynamic_strings = NULL;
16436       dynamic_strings_length = 0;
16437     }
16438 
16439   if (dynamic_symbols)
16440     {
16441       free (dynamic_symbols);
16442       dynamic_symbols = NULL;
16443       num_dynamic_syms = 0;
16444     }
16445 
16446   if (dynamic_syminfo)
16447     {
16448       free (dynamic_syminfo);
16449       dynamic_syminfo = NULL;
16450     }
16451 
16452   if (dynamic_section)
16453     {
16454       free (dynamic_section);
16455       dynamic_section = NULL;
16456     }
16457 
16458   if (section_headers_groups)
16459     {
16460       free (section_headers_groups);
16461       section_headers_groups = NULL;
16462     }
16463 
16464   if (section_groups)
16465     {
16466       struct group_list * g;
16467       struct group_list * next;
16468 
16469       for (i = 0; i < group_count; i++)
16470 	{
16471 	  for (g = section_groups [i].root; g != NULL; g = next)
16472 	    {
16473 	      next = g->next;
16474 	      free (g);
16475 	    }
16476 	}
16477 
16478       free (section_groups);
16479       section_groups = NULL;
16480     }
16481 
16482   free_debug_memory ();
16483 
16484   return 0;
16485 }
16486 
16487 /* Process an ELF archive.
16488    On entry the file is positioned just after the ARMAG string.  */
16489 
16490 static int
16491 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
16492 {
16493   struct archive_info arch;
16494   struct archive_info nested_arch;
16495   size_t got;
16496   int ret;
16497 
16498   show_name = 1;
16499 
16500   /* The ARCH structure is used to hold information about this archive.  */
16501   arch.file_name = NULL;
16502   arch.file = NULL;
16503   arch.index_array = NULL;
16504   arch.sym_table = NULL;
16505   arch.longnames = NULL;
16506 
16507   /* The NESTED_ARCH structure is used as a single-item cache of information
16508      about a nested archive (when members of a thin archive reside within
16509      another regular archive file).  */
16510   nested_arch.file_name = NULL;
16511   nested_arch.file = NULL;
16512   nested_arch.index_array = NULL;
16513   nested_arch.sym_table = NULL;
16514   nested_arch.longnames = NULL;
16515 
16516   if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
16517     {
16518       ret = 1;
16519       goto out;
16520     }
16521 
16522   if (do_archive_index)
16523     {
16524       if (arch.sym_table == NULL)
16525 	error (_("%s: unable to dump the index as none was found\n"), file_name);
16526       else
16527 	{
16528 	  unsigned long i, l;
16529 	  unsigned long current_pos;
16530 
16531 	  printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
16532 		  file_name, (unsigned long) arch.index_num, arch.sym_size);
16533 	  current_pos = ftell (file);
16534 
16535 	  for (i = l = 0; i < arch.index_num; i++)
16536 	    {
16537 	      if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
16538 	        {
16539 	          char * member_name;
16540 
16541 		  member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
16542 
16543                   if (member_name != NULL)
16544                     {
16545 	              char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
16546 
16547                       if (qualified_name != NULL)
16548                         {
16549 		          printf (_("Contents of binary %s at offset "), qualified_name);
16550 			  (void) print_vma (arch.index_array[i], PREFIX_HEX);
16551 			  putchar ('\n');
16552 		          free (qualified_name);
16553 		        }
16554 		    }
16555 		}
16556 
16557 	      if (l >= arch.sym_size)
16558 		{
16559 		  error (_("%s: end of the symbol table reached before the end of the index\n"),
16560 			 file_name);
16561 		  break;
16562 		}
16563 	      /* PR 17531: file: 0b6630b2.  */
16564 	      printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
16565 	      l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
16566 	    }
16567 
16568 	  if (arch.uses_64bit_indicies)
16569 	    l = (l + 7) & ~ 7;
16570 	  else
16571 	    l += l & 1;
16572 
16573 	  if (l < arch.sym_size)
16574 	    error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
16575 		   file_name, arch.sym_size - l);
16576 
16577 	  if (fseek (file, current_pos, SEEK_SET) != 0)
16578 	    {
16579 	      error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
16580 	      ret = 1;
16581 	      goto out;
16582 	    }
16583 	}
16584 
16585       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
16586 	  && !do_segments && !do_header && !do_dump && !do_version
16587 	  && !do_histogram && !do_debugging && !do_arch && !do_notes
16588 	  && !do_section_groups && !do_dyn_syms)
16589 	{
16590 	  ret = 0; /* Archive index only.  */
16591 	  goto out;
16592 	}
16593     }
16594 
16595   ret = 0;
16596 
16597   while (1)
16598     {
16599       char * name;
16600       size_t namelen;
16601       char * qualified_name;
16602 
16603       /* Read the next archive header.  */
16604       if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
16605         {
16606           error (_("%s: failed to seek to next archive header\n"), file_name);
16607           return 1;
16608         }
16609       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
16610       if (got != sizeof arch.arhdr)
16611         {
16612           if (got == 0)
16613 	    break;
16614           error (_("%s: failed to read archive header\n"), file_name);
16615           ret = 1;
16616           break;
16617         }
16618       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
16619         {
16620           error (_("%s: did not find a valid archive header\n"), arch.file_name);
16621           ret = 1;
16622           break;
16623         }
16624 
16625       arch.next_arhdr_offset += sizeof arch.arhdr;
16626 
16627       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
16628       if (archive_file_size & 01)
16629         ++archive_file_size;
16630 
16631       name = get_archive_member_name (&arch, &nested_arch);
16632       if (name == NULL)
16633 	{
16634 	  error (_("%s: bad archive file name\n"), file_name);
16635 	  ret = 1;
16636 	  break;
16637 	}
16638       namelen = strlen (name);
16639 
16640       qualified_name = make_qualified_name (&arch, &nested_arch, name);
16641       if (qualified_name == NULL)
16642 	{
16643 	  error (_("%s: bad archive file name\n"), file_name);
16644 	  ret = 1;
16645 	  break;
16646 	}
16647 
16648       if (is_thin_archive && arch.nested_member_origin == 0)
16649         {
16650           /* This is a proxy for an external member of a thin archive.  */
16651           FILE * member_file;
16652           char * member_file_name = adjust_relative_path (file_name, name, namelen);
16653           if (member_file_name == NULL)
16654             {
16655               ret = 1;
16656               break;
16657             }
16658 
16659           member_file = fopen (member_file_name, "rb");
16660           if (member_file == NULL)
16661             {
16662               error (_("Input file '%s' is not readable.\n"), member_file_name);
16663               free (member_file_name);
16664               ret = 1;
16665               break;
16666             }
16667 
16668           archive_file_offset = arch.nested_member_origin;
16669 
16670           ret |= process_object (qualified_name, member_file);
16671 
16672           fclose (member_file);
16673           free (member_file_name);
16674         }
16675       else if (is_thin_archive)
16676         {
16677 	  /* PR 15140: Allow for corrupt thin archives.  */
16678 	  if (nested_arch.file == NULL)
16679 	    {
16680 	      error (_("%s: contains corrupt thin archive: %s\n"),
16681 		     file_name, name);
16682 	      ret = 1;
16683 	      break;
16684 	    }
16685 
16686           /* This is a proxy for a member of a nested archive.  */
16687           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
16688 
16689           /* The nested archive file will have been opened and setup by
16690              get_archive_member_name.  */
16691           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
16692             {
16693               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
16694               ret = 1;
16695               break;
16696             }
16697 
16698           ret |= process_object (qualified_name, nested_arch.file);
16699         }
16700       else
16701         {
16702           archive_file_offset = arch.next_arhdr_offset;
16703           arch.next_arhdr_offset += archive_file_size;
16704 
16705           ret |= process_object (qualified_name, file);
16706         }
16707 
16708       if (dump_sects != NULL)
16709 	{
16710 	  free (dump_sects);
16711 	  dump_sects = NULL;
16712 	  num_dump_sects = 0;
16713 	}
16714 
16715       free (qualified_name);
16716     }
16717 
16718  out:
16719   if (nested_arch.file != NULL)
16720     fclose (nested_arch.file);
16721   release_archive (&nested_arch);
16722   release_archive (&arch);
16723 
16724   return ret;
16725 }
16726 
16727 static int
16728 process_file (char * file_name)
16729 {
16730   FILE * file;
16731   struct stat statbuf;
16732   char armag[SARMAG];
16733   int ret;
16734 
16735   if (stat (file_name, &statbuf) < 0)
16736     {
16737       if (errno == ENOENT)
16738 	error (_("'%s': No such file\n"), file_name);
16739       else
16740 	error (_("Could not locate '%s'.  System error message: %s\n"),
16741 	       file_name, strerror (errno));
16742       return 1;
16743     }
16744 
16745   if (! S_ISREG (statbuf.st_mode))
16746     {
16747       error (_("'%s' is not an ordinary file\n"), file_name);
16748       return 1;
16749     }
16750 
16751   file = fopen (file_name, "rb");
16752   if (file == NULL)
16753     {
16754       error (_("Input file '%s' is not readable.\n"), file_name);
16755       return 1;
16756     }
16757 
16758   if (fread (armag, SARMAG, 1, file) != 1)
16759     {
16760       error (_("%s: Failed to read file's magic number\n"), file_name);
16761       fclose (file);
16762       return 1;
16763     }
16764 
16765   current_file_size = (bfd_size_type) statbuf.st_size;
16766 
16767   if (memcmp (armag, ARMAG, SARMAG) == 0)
16768     ret = process_archive (file_name, file, FALSE);
16769   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
16770     ret = process_archive (file_name, file, TRUE);
16771   else
16772     {
16773       if (do_archive_index)
16774 	error (_("File %s is not an archive so its index cannot be displayed.\n"),
16775 	       file_name);
16776 
16777       rewind (file);
16778       archive_file_size = archive_file_offset = 0;
16779       ret = process_object (file_name, file);
16780     }
16781 
16782   fclose (file);
16783 
16784   current_file_size = 0;
16785   return ret;
16786 }
16787 
16788 #ifdef SUPPORT_DISASSEMBLY
16789 /* Needed by the i386 disassembler.  For extra credit, someone could
16790    fix this so that we insert symbolic addresses here, esp for GOT/PLT
16791    symbols.  */
16792 
16793 void
16794 print_address (unsigned int addr, FILE * outfile)
16795 {
16796   fprintf (outfile,"0x%8.8x", addr);
16797 }
16798 
16799 /* Needed by the i386 disassembler.  */
16800 void
16801 db_task_printsym (unsigned int addr)
16802 {
16803   print_address (addr, stderr);
16804 }
16805 #endif
16806 
16807 int
16808 main (int argc, char ** argv)
16809 {
16810   int err;
16811 
16812 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
16813   setlocale (LC_MESSAGES, "");
16814 #endif
16815 #if defined (HAVE_SETLOCALE)
16816   setlocale (LC_CTYPE, "");
16817 #endif
16818   bindtextdomain (PACKAGE, LOCALEDIR);
16819   textdomain (PACKAGE);
16820 
16821   expandargv (&argc, &argv);
16822 
16823   parse_args (argc, argv);
16824 
16825   if (num_dump_sects > 0)
16826     {
16827       /* Make a copy of the dump_sects array.  */
16828       cmdline_dump_sects = (dump_type *)
16829           malloc (num_dump_sects * sizeof (* dump_sects));
16830       if (cmdline_dump_sects == NULL)
16831 	error (_("Out of memory allocating dump request table.\n"));
16832       else
16833 	{
16834 	  memcpy (cmdline_dump_sects, dump_sects,
16835 		  num_dump_sects * sizeof (* dump_sects));
16836 	  num_cmdline_dump_sects = num_dump_sects;
16837 	}
16838     }
16839 
16840   if (optind < (argc - 1))
16841     show_name = 1;
16842   else if (optind >= argc)
16843     {
16844       warn (_("Nothing to do.\n"));
16845       usage (stderr);
16846     }
16847 
16848   err = 0;
16849   while (optind < argc)
16850     err |= process_file (argv[optind++]);
16851 
16852   if (dump_sects != NULL)
16853     free (dump_sects);
16854   if (cmdline_dump_sects != NULL)
16855     free (cmdline_dump_sects);
16856 
16857   return err;
16858 }
16859