Revert patch that disables building libctf for non-ELF based targets.
[external/binutils.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2    Copyright (C) 1998-2019 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 \f
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 \f
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 #include "ctf-api.h"
64
65 #include "elf/common.h"
66 #include "elf/external.h"
67 #include "elf/internal.h"
68
69
70 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
71    we can obtain the H8 reloc numbers.  We need these for the
72    get_reloc_size() function.  We include h8.h again after defining
73    RELOC_MACROS_GEN_FUNC so that we get the naming function as well.  */
74
75 #include "elf/h8.h"
76 #undef _ELF_H8_H
77
78 /* Undo the effects of #including reloc-macros.h.  */
79
80 #undef START_RELOC_NUMBERS
81 #undef RELOC_NUMBER
82 #undef FAKE_RELOC
83 #undef EMPTY_RELOC
84 #undef END_RELOC_NUMBERS
85 #undef _RELOC_MACROS_H
86
87 /* The following headers use the elf/reloc-macros.h file to
88    automatically generate relocation recognition functions
89    such as elf_mips_reloc_type()  */
90
91 #define RELOC_MACROS_GEN_FUNC
92
93 #include "elf/aarch64.h"
94 #include "elf/alpha.h"
95 #include "elf/arc.h"
96 #include "elf/arm.h"
97 #include "elf/avr.h"
98 #include "elf/bfin.h"
99 #include "elf/cr16.h"
100 #include "elf/cris.h"
101 #include "elf/crx.h"
102 #include "elf/csky.h"
103 #include "elf/d10v.h"
104 #include "elf/d30v.h"
105 #include "elf/dlx.h"
106 #include "elf/bpf.h"
107 #include "elf/epiphany.h"
108 #include "elf/fr30.h"
109 #include "elf/frv.h"
110 #include "elf/ft32.h"
111 #include "elf/h8.h"
112 #include "elf/hppa.h"
113 #include "elf/i386.h"
114 #include "elf/i370.h"
115 #include "elf/i860.h"
116 #include "elf/i960.h"
117 #include "elf/ia64.h"
118 #include "elf/ip2k.h"
119 #include "elf/lm32.h"
120 #include "elf/iq2000.h"
121 #include "elf/m32c.h"
122 #include "elf/m32r.h"
123 #include "elf/m68k.h"
124 #include "elf/m68hc11.h"
125 #include "elf/s12z.h"
126 #include "elf/mcore.h"
127 #include "elf/mep.h"
128 #include "elf/metag.h"
129 #include "elf/microblaze.h"
130 #include "elf/mips.h"
131 #include "elf/mmix.h"
132 #include "elf/mn10200.h"
133 #include "elf/mn10300.h"
134 #include "elf/moxie.h"
135 #include "elf/mt.h"
136 #include "elf/msp430.h"
137 #include "elf/nds32.h"
138 #include "elf/nfp.h"
139 #include "elf/nios2.h"
140 #include "elf/or1k.h"
141 #include "elf/pj.h"
142 #include "elf/ppc.h"
143 #include "elf/ppc64.h"
144 #include "elf/pru.h"
145 #include "elf/riscv.h"
146 #include "elf/rl78.h"
147 #include "elf/rx.h"
148 #include "elf/s390.h"
149 #include "elf/score.h"
150 #include "elf/sh.h"
151 #include "elf/sparc.h"
152 #include "elf/spu.h"
153 #include "elf/tic6x.h"
154 #include "elf/tilegx.h"
155 #include "elf/tilepro.h"
156 #include "elf/v850.h"
157 #include "elf/vax.h"
158 #include "elf/visium.h"
159 #include "elf/wasm32.h"
160 #include "elf/x86-64.h"
161 #include "elf/xc16x.h"
162 #include "elf/xgate.h"
163 #include "elf/xstormy16.h"
164 #include "elf/xtensa.h"
165
166 #include "getopt.h"
167 #include "libiberty.h"
168 #include "safe-ctype.h"
169 #include "filenames.h"
170
171 #ifndef offsetof
172 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
173 #endif
174
175 typedef struct elf_section_list
176 {
177   Elf_Internal_Shdr *        hdr;
178   struct elf_section_list *  next;
179 } elf_section_list;
180
181 /* Flag bits indicating particular types of dump.  */
182 #define HEX_DUMP        (1 << 0)        /* The -x command line switch.  */
183 #define DISASS_DUMP     (1 << 1)        /* The -i command line switch.  */
184 #define DEBUG_DUMP      (1 << 2)        /* The -w command line switch.  */
185 #define STRING_DUMP     (1 << 3)        /* The -p command line switch.  */
186 #define RELOC_DUMP      (1 << 4)        /* The -R command line switch.  */
187 #define CTF_DUMP        (1 << 5)        /* The --ctf command line switch.  */
188
189 typedef unsigned char dump_type;
190
191 /* A linked list of the section names for which dumps were requested.  */
192 struct dump_list_entry
193 {
194   char *                    name;
195   dump_type                 type;
196   struct dump_list_entry *  next;
197 };
198
199 typedef struct filedata
200 {
201   const char *         file_name;
202   FILE *               handle;
203   bfd_size_type        file_size;
204   Elf_Internal_Ehdr    file_header;
205   Elf_Internal_Shdr *  section_headers;
206   Elf_Internal_Phdr *  program_headers;
207   char *               string_table;
208   unsigned long        string_table_length;
209   /* A dynamic array of flags indicating for which sections a dump of
210      some kind has been requested.  It is reset on a per-object file
211      basis and then initialised from the cmdline_dump_sects array,
212      the results of interpreting the -w switch, and the
213      dump_sects_byname list.  */
214   dump_type *          dump_sects;
215   unsigned int         num_dump_sects;
216 } Filedata;
217
218 char * program_name = "readelf";
219
220 static unsigned long archive_file_offset;
221 static unsigned long archive_file_size;
222 static unsigned long dynamic_addr;
223 static bfd_size_type dynamic_size;
224 static size_t dynamic_nent;
225 static char * dynamic_strings;
226 static unsigned long dynamic_strings_length;
227 static unsigned long num_dynamic_syms;
228 static Elf_Internal_Sym * dynamic_symbols;
229 static Elf_Internal_Syminfo * dynamic_syminfo;
230 static unsigned long dynamic_syminfo_offset;
231 static unsigned int dynamic_syminfo_nent;
232 static char program_interpreter[PATH_MAX];
233 static bfd_vma dynamic_info[DT_ENCODING];
234 static bfd_vma dynamic_info_DT_GNU_HASH;
235 static bfd_vma version_info[16];
236 static Elf_Internal_Dyn *  dynamic_section;
237 static elf_section_list * symtab_shndx_list;
238 static bfd_boolean show_name = FALSE;
239 static bfd_boolean do_dynamic = FALSE;
240 static bfd_boolean do_syms = FALSE;
241 static bfd_boolean do_dyn_syms = FALSE;
242 static bfd_boolean do_reloc = FALSE;
243 static bfd_boolean do_sections = FALSE;
244 static bfd_boolean do_section_groups = FALSE;
245 static bfd_boolean do_section_details = FALSE;
246 static bfd_boolean do_segments = FALSE;
247 static bfd_boolean do_unwind = FALSE;
248 static bfd_boolean do_using_dynamic = FALSE;
249 static bfd_boolean do_header = FALSE;
250 static bfd_boolean do_dump = FALSE;
251 static bfd_boolean do_version = FALSE;
252 static bfd_boolean do_histogram = FALSE;
253 static bfd_boolean do_debugging = FALSE;
254 static bfd_boolean do_ctf = FALSE;
255 static bfd_boolean do_arch = FALSE;
256 static bfd_boolean do_notes = FALSE;
257 static bfd_boolean do_archive_index = FALSE;
258 static bfd_boolean is_32bit_elf = FALSE;
259 static bfd_boolean decompress_dumps = FALSE;
260
261 static char *dump_ctf_parent_name;
262 static char *dump_ctf_symtab_name;
263 static char *dump_ctf_strtab_name;
264
265 struct group_list
266 {
267   struct group_list *  next;
268   unsigned int         section_index;
269 };
270
271 struct group
272 {
273   struct group_list *  root;
274   unsigned int         group_index;
275 };
276
277 static size_t           group_count;
278 static struct group *   section_groups;
279 static struct group **  section_headers_groups;
280
281 /* A dynamic array of flags indicating for which sections a dump
282    has been requested via command line switches.  */
283 static Filedata         cmdline;
284
285 static struct dump_list_entry * dump_sects_byname;
286
287 /* How to print a vma value.  */
288 typedef enum print_mode
289 {
290   HEX,
291   DEC,
292   DEC_5,
293   UNSIGNED,
294   PREFIX_HEX,
295   FULL_HEX,
296   LONG_HEX
297 }
298 print_mode;
299
300 /* Versioned symbol info.  */
301 enum versioned_symbol_info
302 {
303   symbol_undefined,
304   symbol_hidden,
305   symbol_public
306 };
307
308 static const char * get_symbol_version_string
309   (Filedata *, bfd_boolean, const char *, unsigned long, unsigned,
310    Elf_Internal_Sym *, enum versioned_symbol_info *, unsigned short *);
311
312 #define UNKNOWN -1
313
314 #define SECTION_NAME(X)                                         \
315   ((X) == NULL ? _("<none>")                                    \
316    : filedata->string_table == NULL ? _("<no-strings>")         \
317    : ((X)->sh_name >= filedata->string_table_length ? _("<corrupt>")    \
318   : filedata->string_table + (X)->sh_name))
319
320 #define DT_VERSIONTAGIDX(tag)   (DT_VERNEEDNUM - (tag)) /* Reverse order!  */
321
322 #define GET_ELF_SYMBOLS(file, section, sym_count)                       \
323   (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count)      \
324    : get_64bit_elf_symbols (file, section, sym_count))
325
326 #define VALID_DYNAMIC_NAME(offset)      ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
327 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
328    already been called and verified that the string exists.  */
329 #define GET_DYNAMIC_NAME(offset)        (dynamic_strings + offset)
330
331 #define REMOVE_ARCH_BITS(ADDR)                  \
332   do                                            \
333     {                                           \
334       if (filedata->file_header.e_machine == EM_ARM)    \
335         (ADDR) &= ~1;                           \
336     }                                           \
337   while (0)
338 \f
339 /* Print a BFD_VMA to an internal buffer, for use in error messages.
340    BFD_FMA_FMT can't be used in translated strings.  */
341
342 static const char *
343 bfd_vmatoa (char *fmtch, bfd_vma value)
344 {
345   /* bfd_vmatoa is used more then once in a printf call for output.
346      Cycle through an array of buffers.  */
347   static int buf_pos = 0;
348   static struct bfd_vmatoa_buf
349   {
350     char place[64];
351   } buf[4];
352   char *ret;
353   char fmt[32];
354
355   ret = buf[buf_pos++].place;
356   buf_pos %= ARRAY_SIZE (buf);
357
358   sprintf (fmt, "%%%s%s", BFD_VMA_FMT, fmtch);
359   snprintf (ret, sizeof (buf[0].place), fmt, value);
360   return ret;
361 }
362
363 /* Retrieve NMEMB structures, each SIZE bytes long from FILEDATA starting at
364    OFFSET + the offset of the current archive member, if we are examining an
365    archive.  Put the retrieved data into VAR, if it is not NULL.  Otherwise
366    allocate a buffer using malloc and fill that.  In either case return the
367    pointer to the start of the retrieved data or NULL if something went wrong.
368    If something does go wrong and REASON is not NULL then emit an error
369    message using REASON as part of the context.  */
370
371 static void *
372 get_data (void *         var,
373           Filedata *     filedata,
374           unsigned long  offset,
375           bfd_size_type  size,
376           bfd_size_type  nmemb,
377           const char *   reason)
378 {
379   void * mvar;
380   bfd_size_type amt = size * nmemb;
381
382   if (size == 0 || nmemb == 0)
383     return NULL;
384
385   /* If the size_t type is smaller than the bfd_size_type, eg because
386      you are building a 32-bit tool on a 64-bit host, then make sure
387      that when the sizes are cast to (size_t) no information is lost.  */
388   if (sizeof (size_t) < sizeof (bfd_size_type)
389       && (   (bfd_size_type) ((size_t) size) != size
390           || (bfd_size_type) ((size_t) nmemb) != nmemb))
391     {
392       if (reason)
393         error (_("Size truncation prevents reading %s"
394                  " elements of size %s for %s\n"),
395                bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
396       return NULL;
397     }
398
399   /* Check for size overflow.  */
400   if (amt < nmemb)
401     {
402       if (reason)
403         error (_("Size overflow prevents reading %s"
404                  " elements of size %s for %s\n"),
405                bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
406       return NULL;
407     }
408
409   /* Be kind to memory checkers (eg valgrind, address sanitizer) by not
410      attempting to allocate memory when the read is bound to fail.  */
411   if (archive_file_offset > filedata->file_size
412       || offset > filedata->file_size - archive_file_offset
413       || amt > filedata->file_size - archive_file_offset - offset)
414     {
415       if (reason)
416         error (_("Reading %s bytes extends past end of file for %s\n"),
417                bfd_vmatoa ("u", amt), reason);
418       return NULL;
419     }
420
421   if (fseek (filedata->handle, archive_file_offset + offset, SEEK_SET))
422     {
423       if (reason)
424         error (_("Unable to seek to 0x%lx for %s\n"),
425                archive_file_offset + offset, reason);
426       return NULL;
427     }
428
429   mvar = var;
430   if (mvar == NULL)
431     {
432       /* Check for overflow.  */
433       if (nmemb < (~(bfd_size_type) 0 - 1) / size)
434         /* + 1 so that we can '\0' terminate invalid string table sections.  */
435         mvar = malloc ((size_t) amt + 1);
436
437       if (mvar == NULL)
438         {
439           if (reason)
440             error (_("Out of memory allocating %s bytes for %s\n"),
441                    bfd_vmatoa ("u", amt), reason);
442           return NULL;
443         }
444
445       ((char *) mvar)[amt] = '\0';
446     }
447
448   if (fread (mvar, (size_t) size, (size_t) nmemb, filedata->handle) != nmemb)
449     {
450       if (reason)
451         error (_("Unable to read in %s bytes of %s\n"),
452                bfd_vmatoa ("u", amt), reason);
453       if (mvar != var)
454         free (mvar);
455       return NULL;
456     }
457
458   return mvar;
459 }
460
461 /* Print a VMA value in the MODE specified.
462    Returns the number of characters displayed.  */
463
464 static unsigned int
465 print_vma (bfd_vma vma, print_mode mode)
466 {
467   unsigned int nc = 0;
468
469   switch (mode)
470     {
471     case FULL_HEX:
472       nc = printf ("0x");
473       /* Fall through.  */
474     case LONG_HEX:
475 #ifdef BFD64
476       if (is_32bit_elf)
477         return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
478 #endif
479       printf_vma (vma);
480       return nc + 16;
481
482     case DEC_5:
483       if (vma <= 99999)
484         return printf ("%5" BFD_VMA_FMT "d", vma);
485       /* Fall through.  */
486     case PREFIX_HEX:
487       nc = printf ("0x");
488       /* Fall through.  */
489     case HEX:
490       return nc + printf ("%" BFD_VMA_FMT "x", vma);
491
492     case DEC:
493       return printf ("%" BFD_VMA_FMT "d", vma);
494
495     case UNSIGNED:
496       return printf ("%" BFD_VMA_FMT "u", vma);
497
498     default:
499       /* FIXME: Report unrecognised mode ?  */
500       return 0;
501     }
502 }
503
504 /* Display a symbol on stdout.  Handles the display of control characters and
505    multibye characters (assuming the host environment supports them).
506
507    Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
508
509    If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
510    padding as necessary.
511
512    Returns the number of emitted characters.  */
513
514 static unsigned int
515 print_symbol (signed int width, const char *symbol)
516 {
517   bfd_boolean extra_padding = FALSE;
518   signed int num_printed = 0;
519 #ifdef HAVE_MBSTATE_T
520   mbstate_t state;
521 #endif
522   unsigned int width_remaining;
523
524   if (width < 0)
525     {
526       /* Keep the width positive.  This helps the code below.  */
527       width = - width;
528       extra_padding = TRUE;
529     }
530   else if (width == 0)
531     return 0;
532
533   if (do_wide)
534     /* Set the remaining width to a very large value.
535        This simplifies the code below.  */
536     width_remaining = INT_MAX;
537   else
538     width_remaining = width;
539
540 #ifdef HAVE_MBSTATE_T
541   /* Initialise the multibyte conversion state.  */
542   memset (& state, 0, sizeof (state));
543 #endif
544
545   while (width_remaining)
546     {
547       size_t  n;
548       const char c = *symbol++;
549
550       if (c == 0)
551         break;
552
553       /* Do not print control characters directly as they can affect terminal
554          settings.  Such characters usually appear in the names generated
555          by the assembler for local labels.  */
556       if (ISCNTRL (c))
557         {
558           if (width_remaining < 2)
559             break;
560
561           printf ("^%c", c + 0x40);
562           width_remaining -= 2;
563           num_printed += 2;
564         }
565       else if (ISPRINT (c))
566         {
567           putchar (c);
568           width_remaining --;
569           num_printed ++;
570         }
571       else
572         {
573 #ifdef HAVE_MBSTATE_T
574           wchar_t w;
575 #endif
576           /* Let printf do the hard work of displaying multibyte characters.  */
577           printf ("%.1s", symbol - 1);
578           width_remaining --;
579           num_printed ++;
580
581 #ifdef HAVE_MBSTATE_T
582           /* Try to find out how many bytes made up the character that was
583              just printed.  Advance the symbol pointer past the bytes that
584              were displayed.  */
585           n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
586 #else
587           n = 1;
588 #endif
589           if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
590             symbol += (n - 1);
591         }
592     }
593
594   if (extra_padding && num_printed < width)
595     {
596       /* Fill in the remaining spaces.  */
597       printf ("%-*s", width - num_printed, " ");
598       num_printed = width;
599     }
600
601   return num_printed;
602 }
603
604 /* Returns a pointer to a static buffer containing a printable version of
605    the given section's name.  Like print_symbol, except that it does not try
606    to print multibyte characters, it just interprets them as hex values.  */
607
608 static const char *
609 printable_section_name (Filedata * filedata, const Elf_Internal_Shdr * sec)
610 {
611 #define MAX_PRINT_SEC_NAME_LEN 128
612   static char  sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
613   const char * name = SECTION_NAME (sec);
614   char *       buf = sec_name_buf;
615   char         c;
616   unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
617
618   while ((c = * name ++) != 0)
619     {
620       if (ISCNTRL (c))
621         {
622           if (remaining < 2)
623             break;
624
625           * buf ++ = '^';
626           * buf ++ = c + 0x40;
627           remaining -= 2;
628         }
629       else if (ISPRINT (c))
630         {
631           * buf ++ = c;
632           remaining -= 1;
633         }
634       else
635         {
636           static char hex[17] = "0123456789ABCDEF";
637
638           if (remaining < 4)
639             break;
640           * buf ++ = '<';
641           * buf ++ = hex[(c & 0xf0) >> 4];
642           * buf ++ = hex[c & 0x0f];
643           * buf ++ = '>';
644           remaining -= 4;
645         }
646
647       if (remaining == 0)
648         break;
649     }
650
651   * buf = 0;
652   return sec_name_buf;
653 }
654
655 static const char *
656 printable_section_name_from_index (Filedata * filedata, unsigned long ndx)
657 {
658   if (ndx >= filedata->file_header.e_shnum)
659     return _("<corrupt>");
660
661   return printable_section_name (filedata, filedata->section_headers + ndx);
662 }
663
664 /* Return a pointer to section NAME, or NULL if no such section exists.  */
665
666 static Elf_Internal_Shdr *
667 find_section (Filedata * filedata, const char * name)
668 {
669   unsigned int i;
670
671   if (filedata->section_headers == NULL)
672     return NULL;
673
674   for (i = 0; i < filedata->file_header.e_shnum; i++)
675     if (streq (SECTION_NAME (filedata->section_headers + i), name))
676       return filedata->section_headers + i;
677
678   return NULL;
679 }
680
681 /* Return a pointer to a section containing ADDR, or NULL if no such
682    section exists.  */
683
684 static Elf_Internal_Shdr *
685 find_section_by_address (Filedata * filedata, bfd_vma addr)
686 {
687   unsigned int i;
688
689   if (filedata->section_headers == NULL)
690     return NULL;
691
692   for (i = 0; i < filedata->file_header.e_shnum; i++)
693     {
694       Elf_Internal_Shdr *sec = filedata->section_headers + i;
695
696       if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
697         return sec;
698     }
699
700   return NULL;
701 }
702
703 static Elf_Internal_Shdr *
704 find_section_by_type (Filedata * filedata, unsigned int type)
705 {
706   unsigned int i;
707
708   if (filedata->section_headers == NULL)
709     return NULL;
710
711   for (i = 0; i < filedata->file_header.e_shnum; i++)
712     {
713       Elf_Internal_Shdr *sec = filedata->section_headers + i;
714
715       if (sec->sh_type == type)
716         return sec;
717     }
718
719   return NULL;
720 }
721
722 /* Return a pointer to section NAME, or NULL if no such section exists,
723    restricted to the list of sections given in SET.  */
724
725 static Elf_Internal_Shdr *
726 find_section_in_set (Filedata * filedata, const char * name, unsigned int * set)
727 {
728   unsigned int i;
729
730   if (filedata->section_headers == NULL)
731     return NULL;
732
733   if (set != NULL)
734     {
735       while ((i = *set++) > 0)
736         {
737           /* See PR 21156 for a reproducer.  */
738           if (i >= filedata->file_header.e_shnum)
739             continue; /* FIXME: Should we issue an error message ?  */
740
741           if (streq (SECTION_NAME (filedata->section_headers + i), name))
742             return filedata->section_headers + i;
743         }
744     }
745
746   return find_section (filedata, name);
747 }
748
749 /* Read an unsigned LEB128 encoded value from DATA.
750    Set *LENGTH_RETURN to the number of bytes read.  */
751
752 static inline unsigned long
753 read_uleb128 (unsigned char * data,
754               unsigned int * length_return,
755               const unsigned char * const end)
756 {
757   return read_leb128 (data, length_return, FALSE, end);
758 }
759
760 /* Return TRUE if the current file is for IA-64 machine and OpenVMS ABI.
761    This OS has so many departures from the ELF standard that we test it at
762    many places.  */
763
764 static inline bfd_boolean
765 is_ia64_vms (Filedata * filedata)
766 {
767   return filedata->file_header.e_machine == EM_IA_64
768     && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
769 }
770
771 /* Guess the relocation size commonly used by the specific machines.  */
772
773 static bfd_boolean
774 guess_is_rela (unsigned int e_machine)
775 {
776   switch (e_machine)
777     {
778       /* Targets that use REL relocations.  */
779     case EM_386:
780     case EM_IAMCU:
781     case EM_960:
782     case EM_ARM:
783     case EM_D10V:
784     case EM_CYGNUS_D10V:
785     case EM_DLX:
786     case EM_MIPS:
787     case EM_MIPS_RS3_LE:
788     case EM_CYGNUS_M32R:
789     case EM_SCORE:
790     case EM_XGATE:
791     case EM_NFP:
792     case EM_BPF:
793       return FALSE;
794
795       /* Targets that use RELA relocations.  */
796     case EM_68K:
797     case EM_860:
798     case EM_AARCH64:
799     case EM_ADAPTEVA_EPIPHANY:
800     case EM_ALPHA:
801     case EM_ALTERA_NIOS2:
802     case EM_ARC:
803     case EM_ARC_COMPACT:
804     case EM_ARC_COMPACT2:
805     case EM_AVR:
806     case EM_AVR_OLD:
807     case EM_BLACKFIN:
808     case EM_CR16:
809     case EM_CRIS:
810     case EM_CRX:
811     case EM_CSKY:
812     case EM_D30V:
813     case EM_CYGNUS_D30V:
814     case EM_FR30:
815     case EM_FT32:
816     case EM_CYGNUS_FR30:
817     case EM_CYGNUS_FRV:
818     case EM_H8S:
819     case EM_H8_300:
820     case EM_H8_300H:
821     case EM_IA_64:
822     case EM_IP2K:
823     case EM_IP2K_OLD:
824     case EM_IQ2000:
825     case EM_LATTICEMICO32:
826     case EM_M32C_OLD:
827     case EM_M32C:
828     case EM_M32R:
829     case EM_MCORE:
830     case EM_CYGNUS_MEP:
831     case EM_METAG:
832     case EM_MMIX:
833     case EM_MN10200:
834     case EM_CYGNUS_MN10200:
835     case EM_MN10300:
836     case EM_CYGNUS_MN10300:
837     case EM_MOXIE:
838     case EM_MSP430:
839     case EM_MSP430_OLD:
840     case EM_MT:
841     case EM_NDS32:
842     case EM_NIOS32:
843     case EM_OR1K:
844     case EM_PPC64:
845     case EM_PPC:
846     case EM_TI_PRU:
847     case EM_RISCV:
848     case EM_RL78:
849     case EM_RX:
850     case EM_S390:
851     case EM_S390_OLD:
852     case EM_SH:
853     case EM_SPARC:
854     case EM_SPARC32PLUS:
855     case EM_SPARCV9:
856     case EM_SPU:
857     case EM_TI_C6000:
858     case EM_TILEGX:
859     case EM_TILEPRO:
860     case EM_V800:
861     case EM_V850:
862     case EM_CYGNUS_V850:
863     case EM_VAX:
864     case EM_VISIUM:
865     case EM_X86_64:
866     case EM_L1OM:
867     case EM_K1OM:
868     case EM_XSTORMY16:
869     case EM_XTENSA:
870     case EM_XTENSA_OLD:
871     case EM_MICROBLAZE:
872     case EM_MICROBLAZE_OLD:
873     case EM_WEBASSEMBLY:
874       return TRUE;
875
876     case EM_68HC05:
877     case EM_68HC08:
878     case EM_68HC11:
879     case EM_68HC16:
880     case EM_FX66:
881     case EM_ME16:
882     case EM_MMA:
883     case EM_NCPU:
884     case EM_NDR1:
885     case EM_PCP:
886     case EM_ST100:
887     case EM_ST19:
888     case EM_ST7:
889     case EM_ST9PLUS:
890     case EM_STARCORE:
891     case EM_SVX:
892     case EM_TINYJ:
893     default:
894       warn (_("Don't know about relocations on this machine architecture\n"));
895       return FALSE;
896     }
897 }
898
899 /* Load RELA type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
900    Returns TRUE upon success, FALSE otherwise.  If successful then a
901    pointer to a malloc'ed buffer containing the relocs is placed in *RELASP,
902    and the number of relocs loaded is placed in *NRELASP.  It is the caller's
903    responsibility to free the allocated buffer.  */
904
905 static bfd_boolean
906 slurp_rela_relocs (Filedata *            filedata,
907                    unsigned long         rel_offset,
908                    unsigned long         rel_size,
909                    Elf_Internal_Rela **  relasp,
910                    unsigned long *       nrelasp)
911 {
912   Elf_Internal_Rela * relas;
913   size_t nrelas;
914   unsigned int i;
915
916   if (is_32bit_elf)
917     {
918       Elf32_External_Rela * erelas;
919
920       erelas = (Elf32_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
921                                                  rel_size, _("32-bit relocation data"));
922       if (!erelas)
923         return FALSE;
924
925       nrelas = rel_size / sizeof (Elf32_External_Rela);
926
927       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
928                                              sizeof (Elf_Internal_Rela));
929
930       if (relas == NULL)
931         {
932           free (erelas);
933           error (_("out of memory parsing relocs\n"));
934           return FALSE;
935         }
936
937       for (i = 0; i < nrelas; i++)
938         {
939           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
940           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
941           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
942         }
943
944       free (erelas);
945     }
946   else
947     {
948       Elf64_External_Rela * erelas;
949
950       erelas = (Elf64_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
951                                                  rel_size, _("64-bit relocation data"));
952       if (!erelas)
953         return FALSE;
954
955       nrelas = rel_size / sizeof (Elf64_External_Rela);
956
957       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
958                                              sizeof (Elf_Internal_Rela));
959
960       if (relas == NULL)
961         {
962           free (erelas);
963           error (_("out of memory parsing relocs\n"));
964           return FALSE;
965         }
966
967       for (i = 0; i < nrelas; i++)
968         {
969           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
970           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
971           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
972
973           /* The #ifdef BFD64 below is to prevent a compile time
974              warning.  We know that if we do not have a 64 bit data
975              type that we will never execute this code anyway.  */
976 #ifdef BFD64
977           if (filedata->file_header.e_machine == EM_MIPS
978               && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
979             {
980               /* In little-endian objects, r_info isn't really a
981                  64-bit little-endian value: it has a 32-bit
982                  little-endian symbol index followed by four
983                  individual byte fields.  Reorder INFO
984                  accordingly.  */
985               bfd_vma inf = relas[i].r_info;
986               inf = (((inf & 0xffffffff) << 32)
987                       | ((inf >> 56) & 0xff)
988                       | ((inf >> 40) & 0xff00)
989                       | ((inf >> 24) & 0xff0000)
990                       | ((inf >> 8) & 0xff000000));
991               relas[i].r_info = inf;
992             }
993 #endif /* BFD64 */
994         }
995
996       free (erelas);
997     }
998
999   *relasp = relas;
1000   *nrelasp = nrelas;
1001   return TRUE;
1002 }
1003
1004 /* Load REL type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
1005    Returns TRUE upon success, FALSE otherwise.  If successful then a
1006    pointer to a malloc'ed buffer containing the relocs is placed in *RELSP,
1007    and the number of relocs loaded is placed in *NRELSP.  It is the caller's
1008    responsibility to free the allocated buffer.  */
1009
1010 static bfd_boolean
1011 slurp_rel_relocs (Filedata *            filedata,
1012                   unsigned long         rel_offset,
1013                   unsigned long         rel_size,
1014                   Elf_Internal_Rela **  relsp,
1015                   unsigned long *       nrelsp)
1016 {
1017   Elf_Internal_Rela * rels;
1018   size_t nrels;
1019   unsigned int i;
1020
1021   if (is_32bit_elf)
1022     {
1023       Elf32_External_Rel * erels;
1024
1025       erels = (Elf32_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1026                                                rel_size, _("32-bit relocation data"));
1027       if (!erels)
1028         return FALSE;
1029
1030       nrels = rel_size / sizeof (Elf32_External_Rel);
1031
1032       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1033
1034       if (rels == NULL)
1035         {
1036           free (erels);
1037           error (_("out of memory parsing relocs\n"));
1038           return FALSE;
1039         }
1040
1041       for (i = 0; i < nrels; i++)
1042         {
1043           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1044           rels[i].r_info   = BYTE_GET (erels[i].r_info);
1045           rels[i].r_addend = 0;
1046         }
1047
1048       free (erels);
1049     }
1050   else
1051     {
1052       Elf64_External_Rel * erels;
1053
1054       erels = (Elf64_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1055                                                rel_size, _("64-bit relocation data"));
1056       if (!erels)
1057         return FALSE;
1058
1059       nrels = rel_size / sizeof (Elf64_External_Rel);
1060
1061       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1062
1063       if (rels == NULL)
1064         {
1065           free (erels);
1066           error (_("out of memory parsing relocs\n"));
1067           return FALSE;
1068         }
1069
1070       for (i = 0; i < nrels; i++)
1071         {
1072           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1073           rels[i].r_info   = BYTE_GET (erels[i].r_info);
1074           rels[i].r_addend = 0;
1075
1076           /* The #ifdef BFD64 below is to prevent a compile time
1077              warning.  We know that if we do not have a 64 bit data
1078              type that we will never execute this code anyway.  */
1079 #ifdef BFD64
1080           if (filedata->file_header.e_machine == EM_MIPS
1081               && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
1082             {
1083               /* In little-endian objects, r_info isn't really a
1084                  64-bit little-endian value: it has a 32-bit
1085                  little-endian symbol index followed by four
1086                  individual byte fields.  Reorder INFO
1087                  accordingly.  */
1088               bfd_vma inf = rels[i].r_info;
1089               inf = (((inf & 0xffffffff) << 32)
1090                      | ((inf >> 56) & 0xff)
1091                      | ((inf >> 40) & 0xff00)
1092                      | ((inf >> 24) & 0xff0000)
1093                      | ((inf >> 8) & 0xff000000));
1094               rels[i].r_info = inf;
1095             }
1096 #endif /* BFD64 */
1097         }
1098
1099       free (erels);
1100     }
1101
1102   *relsp = rels;
1103   *nrelsp = nrels;
1104   return TRUE;
1105 }
1106
1107 /* Returns the reloc type extracted from the reloc info field.  */
1108
1109 static unsigned int
1110 get_reloc_type (Filedata * filedata, bfd_vma reloc_info)
1111 {
1112   if (is_32bit_elf)
1113     return ELF32_R_TYPE (reloc_info);
1114
1115   switch (filedata->file_header.e_machine)
1116     {
1117     case EM_MIPS:
1118       /* Note: We assume that reloc_info has already been adjusted for us.  */
1119       return ELF64_MIPS_R_TYPE (reloc_info);
1120
1121     case EM_SPARCV9:
1122       return ELF64_R_TYPE_ID (reloc_info);
1123
1124     default:
1125       return ELF64_R_TYPE (reloc_info);
1126     }
1127 }
1128
1129 /* Return the symbol index extracted from the reloc info field.  */
1130
1131 static bfd_vma
1132 get_reloc_symindex (bfd_vma reloc_info)
1133 {
1134   return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1135 }
1136
1137 static inline bfd_boolean
1138 uses_msp430x_relocs (Filedata * filedata)
1139 {
1140   return
1141     filedata->file_header.e_machine == EM_MSP430 /* Paranoia.  */
1142     /* GCC uses osabi == ELFOSBI_STANDALONE.  */
1143     && (((filedata->file_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1144         /* TI compiler uses ELFOSABI_NONE.  */
1145         || (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1146 }
1147
1148 /* Display the contents of the relocation data found at the specified
1149    offset.  */
1150
1151 static bfd_boolean
1152 dump_relocations (Filedata *          filedata,
1153                   unsigned long       rel_offset,
1154                   unsigned long       rel_size,
1155                   Elf_Internal_Sym *  symtab,
1156                   unsigned long       nsyms,
1157                   char *              strtab,
1158                   unsigned long       strtablen,
1159                   int                 is_rela,
1160                   bfd_boolean         is_dynsym)
1161 {
1162   unsigned long i;
1163   Elf_Internal_Rela * rels;
1164   bfd_boolean res = TRUE;
1165
1166   if (is_rela == UNKNOWN)
1167     is_rela = guess_is_rela (filedata->file_header.e_machine);
1168
1169   if (is_rela)
1170     {
1171       if (!slurp_rela_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1172         return FALSE;
1173     }
1174   else
1175     {
1176       if (!slurp_rel_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1177         return FALSE;
1178     }
1179
1180   if (is_32bit_elf)
1181     {
1182       if (is_rela)
1183         {
1184           if (do_wide)
1185             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name + Addend\n"));
1186           else
1187             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name + Addend\n"));
1188         }
1189       else
1190         {
1191           if (do_wide)
1192             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name\n"));
1193           else
1194             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name\n"));
1195         }
1196     }
1197   else
1198     {
1199       if (is_rela)
1200         {
1201           if (do_wide)
1202             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend\n"));
1203           else
1204             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name + Addend\n"));
1205         }
1206       else
1207         {
1208           if (do_wide)
1209             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name\n"));
1210           else
1211             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name\n"));
1212         }
1213     }
1214
1215   for (i = 0; i < rel_size; i++)
1216     {
1217       const char * rtype;
1218       bfd_vma offset;
1219       bfd_vma inf;
1220       bfd_vma symtab_index;
1221       bfd_vma type;
1222
1223       offset = rels[i].r_offset;
1224       inf    = rels[i].r_info;
1225
1226       type = get_reloc_type (filedata, inf);
1227       symtab_index = get_reloc_symindex  (inf);
1228
1229       if (is_32bit_elf)
1230         {
1231           printf ("%8.8lx  %8.8lx ",
1232                   (unsigned long) offset & 0xffffffff,
1233                   (unsigned long) inf & 0xffffffff);
1234         }
1235       else
1236         {
1237 #if BFD_HOST_64BIT_LONG
1238           printf (do_wide
1239                   ? "%16.16lx  %16.16lx "
1240                   : "%12.12lx  %12.12lx ",
1241                   offset, inf);
1242 #elif BFD_HOST_64BIT_LONG_LONG
1243 #ifndef __MSVCRT__
1244           printf (do_wide
1245                   ? "%16.16llx  %16.16llx "
1246                   : "%12.12llx  %12.12llx ",
1247                   offset, inf);
1248 #else
1249           printf (do_wide
1250                   ? "%16.16I64x  %16.16I64x "
1251                   : "%12.12I64x  %12.12I64x ",
1252                   offset, inf);
1253 #endif
1254 #else
1255           printf (do_wide
1256                   ? "%8.8lx%8.8lx  %8.8lx%8.8lx "
1257                   : "%4.4lx%8.8lx  %4.4lx%8.8lx ",
1258                   _bfd_int64_high (offset),
1259                   _bfd_int64_low (offset),
1260                   _bfd_int64_high (inf),
1261                   _bfd_int64_low (inf));
1262 #endif
1263         }
1264
1265       switch (filedata->file_header.e_machine)
1266         {
1267         default:
1268           rtype = NULL;
1269           break;
1270
1271         case EM_AARCH64:
1272           rtype = elf_aarch64_reloc_type (type);
1273           break;
1274
1275         case EM_M32R:
1276         case EM_CYGNUS_M32R:
1277           rtype = elf_m32r_reloc_type (type);
1278           break;
1279
1280         case EM_386:
1281         case EM_IAMCU:
1282           rtype = elf_i386_reloc_type (type);
1283           break;
1284
1285         case EM_68HC11:
1286         case EM_68HC12:
1287           rtype = elf_m68hc11_reloc_type (type);
1288           break;
1289
1290         case EM_S12Z:
1291           rtype = elf_s12z_reloc_type (type);
1292           break;
1293
1294         case EM_68K:
1295           rtype = elf_m68k_reloc_type (type);
1296           break;
1297
1298         case EM_960:
1299           rtype = elf_i960_reloc_type (type);
1300           break;
1301
1302         case EM_AVR:
1303         case EM_AVR_OLD:
1304           rtype = elf_avr_reloc_type (type);
1305           break;
1306
1307         case EM_OLD_SPARCV9:
1308         case EM_SPARC32PLUS:
1309         case EM_SPARCV9:
1310         case EM_SPARC:
1311           rtype = elf_sparc_reloc_type (type);
1312           break;
1313
1314         case EM_SPU:
1315           rtype = elf_spu_reloc_type (type);
1316           break;
1317
1318         case EM_V800:
1319           rtype = v800_reloc_type (type);
1320           break;
1321         case EM_V850:
1322         case EM_CYGNUS_V850:
1323           rtype = v850_reloc_type (type);
1324           break;
1325
1326         case EM_D10V:
1327         case EM_CYGNUS_D10V:
1328           rtype = elf_d10v_reloc_type (type);
1329           break;
1330
1331         case EM_D30V:
1332         case EM_CYGNUS_D30V:
1333           rtype = elf_d30v_reloc_type (type);
1334           break;
1335
1336         case EM_DLX:
1337           rtype = elf_dlx_reloc_type (type);
1338           break;
1339
1340         case EM_SH:
1341           rtype = elf_sh_reloc_type (type);
1342           break;
1343
1344         case EM_MN10300:
1345         case EM_CYGNUS_MN10300:
1346           rtype = elf_mn10300_reloc_type (type);
1347           break;
1348
1349         case EM_MN10200:
1350         case EM_CYGNUS_MN10200:
1351           rtype = elf_mn10200_reloc_type (type);
1352           break;
1353
1354         case EM_FR30:
1355         case EM_CYGNUS_FR30:
1356           rtype = elf_fr30_reloc_type (type);
1357           break;
1358
1359         case EM_CYGNUS_FRV:
1360           rtype = elf_frv_reloc_type (type);
1361           break;
1362
1363         case EM_CSKY:
1364           rtype = elf_csky_reloc_type (type);
1365           break;
1366
1367         case EM_FT32:
1368           rtype = elf_ft32_reloc_type (type);
1369           break;
1370
1371         case EM_MCORE:
1372           rtype = elf_mcore_reloc_type (type);
1373           break;
1374
1375         case EM_MMIX:
1376           rtype = elf_mmix_reloc_type (type);
1377           break;
1378
1379         case EM_MOXIE:
1380           rtype = elf_moxie_reloc_type (type);
1381           break;
1382
1383         case EM_MSP430:
1384           if (uses_msp430x_relocs (filedata))
1385             {
1386               rtype = elf_msp430x_reloc_type (type);
1387               break;
1388             }
1389           /* Fall through.  */
1390         case EM_MSP430_OLD:
1391           rtype = elf_msp430_reloc_type (type);
1392           break;
1393
1394         case EM_NDS32:
1395           rtype = elf_nds32_reloc_type (type);
1396           break;
1397
1398         case EM_PPC:
1399           rtype = elf_ppc_reloc_type (type);
1400           break;
1401
1402         case EM_PPC64:
1403           rtype = elf_ppc64_reloc_type (type);
1404           break;
1405
1406         case EM_MIPS:
1407         case EM_MIPS_RS3_LE:
1408           rtype = elf_mips_reloc_type (type);
1409           break;
1410
1411         case EM_RISCV:
1412           rtype = elf_riscv_reloc_type (type);
1413           break;
1414
1415         case EM_ALPHA:
1416           rtype = elf_alpha_reloc_type (type);
1417           break;
1418
1419         case EM_ARM:
1420           rtype = elf_arm_reloc_type (type);
1421           break;
1422
1423         case EM_ARC:
1424         case EM_ARC_COMPACT:
1425         case EM_ARC_COMPACT2:
1426           rtype = elf_arc_reloc_type (type);
1427           break;
1428
1429         case EM_PARISC:
1430           rtype = elf_hppa_reloc_type (type);
1431           break;
1432
1433         case EM_H8_300:
1434         case EM_H8_300H:
1435         case EM_H8S:
1436           rtype = elf_h8_reloc_type (type);
1437           break;
1438
1439         case EM_OR1K:
1440           rtype = elf_or1k_reloc_type (type);
1441           break;
1442
1443         case EM_PJ:
1444         case EM_PJ_OLD:
1445           rtype = elf_pj_reloc_type (type);
1446           break;
1447         case EM_IA_64:
1448           rtype = elf_ia64_reloc_type (type);
1449           break;
1450
1451         case EM_CRIS:
1452           rtype = elf_cris_reloc_type (type);
1453           break;
1454
1455         case EM_860:
1456           rtype = elf_i860_reloc_type (type);
1457           break;
1458
1459         case EM_X86_64:
1460         case EM_L1OM:
1461         case EM_K1OM:
1462           rtype = elf_x86_64_reloc_type (type);
1463           break;
1464
1465         case EM_S370:
1466           rtype = i370_reloc_type (type);
1467           break;
1468
1469         case EM_S390_OLD:
1470         case EM_S390:
1471           rtype = elf_s390_reloc_type (type);
1472           break;
1473
1474         case EM_SCORE:
1475           rtype = elf_score_reloc_type (type);
1476           break;
1477
1478         case EM_XSTORMY16:
1479           rtype = elf_xstormy16_reloc_type (type);
1480           break;
1481
1482         case EM_CRX:
1483           rtype = elf_crx_reloc_type (type);
1484           break;
1485
1486         case EM_VAX:
1487           rtype = elf_vax_reloc_type (type);
1488           break;
1489
1490         case EM_VISIUM:
1491           rtype = elf_visium_reloc_type (type);
1492           break;
1493
1494         case EM_BPF:
1495           rtype = elf_bpf_reloc_type (type);
1496           break;
1497
1498         case EM_ADAPTEVA_EPIPHANY:
1499           rtype = elf_epiphany_reloc_type (type);
1500           break;
1501
1502         case EM_IP2K:
1503         case EM_IP2K_OLD:
1504           rtype = elf_ip2k_reloc_type (type);
1505           break;
1506
1507         case EM_IQ2000:
1508           rtype = elf_iq2000_reloc_type (type);
1509           break;
1510
1511         case EM_XTENSA_OLD:
1512         case EM_XTENSA:
1513           rtype = elf_xtensa_reloc_type (type);
1514           break;
1515
1516         case EM_LATTICEMICO32:
1517           rtype = elf_lm32_reloc_type (type);
1518           break;
1519
1520         case EM_M32C_OLD:
1521         case EM_M32C:
1522           rtype = elf_m32c_reloc_type (type);
1523           break;
1524
1525         case EM_MT:
1526           rtype = elf_mt_reloc_type (type);
1527           break;
1528
1529         case EM_BLACKFIN:
1530           rtype = elf_bfin_reloc_type (type);
1531           break;
1532
1533         case EM_CYGNUS_MEP:
1534           rtype = elf_mep_reloc_type (type);
1535           break;
1536
1537         case EM_CR16:
1538           rtype = elf_cr16_reloc_type (type);
1539           break;
1540
1541         case EM_MICROBLAZE:
1542         case EM_MICROBLAZE_OLD:
1543           rtype = elf_microblaze_reloc_type (type);
1544           break;
1545
1546         case EM_RL78:
1547           rtype = elf_rl78_reloc_type (type);
1548           break;
1549
1550         case EM_RX:
1551           rtype = elf_rx_reloc_type (type);
1552           break;
1553
1554         case EM_METAG:
1555           rtype = elf_metag_reloc_type (type);
1556           break;
1557
1558         case EM_XC16X:
1559         case EM_C166:
1560           rtype = elf_xc16x_reloc_type (type);
1561           break;
1562
1563         case EM_TI_C6000:
1564           rtype = elf_tic6x_reloc_type (type);
1565           break;
1566
1567         case EM_TILEGX:
1568           rtype = elf_tilegx_reloc_type (type);
1569           break;
1570
1571         case EM_TILEPRO:
1572           rtype = elf_tilepro_reloc_type (type);
1573           break;
1574
1575         case EM_WEBASSEMBLY:
1576           rtype = elf_wasm32_reloc_type (type);
1577           break;
1578
1579         case EM_XGATE:
1580           rtype = elf_xgate_reloc_type (type);
1581           break;
1582
1583         case EM_ALTERA_NIOS2:
1584           rtype = elf_nios2_reloc_type (type);
1585           break;
1586
1587         case EM_TI_PRU:
1588           rtype = elf_pru_reloc_type (type);
1589           break;
1590
1591         case EM_NFP:
1592           if (EF_NFP_MACH (filedata->file_header.e_flags) == E_NFP_MACH_3200)
1593             rtype = elf_nfp3200_reloc_type (type);
1594           else
1595             rtype = elf_nfp_reloc_type (type);
1596           break;
1597         }
1598
1599       if (rtype == NULL)
1600         printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1601       else
1602         printf (do_wide ? "%-22s" : "%-17.17s", rtype);
1603
1604       if (filedata->file_header.e_machine == EM_ALPHA
1605           && rtype != NULL
1606           && streq (rtype, "R_ALPHA_LITUSE")
1607           && is_rela)
1608         {
1609           switch (rels[i].r_addend)
1610             {
1611             case LITUSE_ALPHA_ADDR:   rtype = "ADDR";   break;
1612             case LITUSE_ALPHA_BASE:   rtype = "BASE";   break;
1613             case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1614             case LITUSE_ALPHA_JSR:    rtype = "JSR";    break;
1615             case LITUSE_ALPHA_TLSGD:  rtype = "TLSGD";  break;
1616             case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1617             case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1618             default: rtype = NULL;
1619             }
1620
1621           if (rtype)
1622             printf (" (%s)", rtype);
1623           else
1624             {
1625               putchar (' ');
1626               printf (_("<unknown addend: %lx>"),
1627                       (unsigned long) rels[i].r_addend);
1628               res = FALSE;
1629             }
1630         }
1631       else if (symtab_index)
1632         {
1633           if (symtab == NULL || symtab_index >= nsyms)
1634             {
1635               error (_(" bad symbol index: %08lx in reloc"), (unsigned long) symtab_index);
1636               res = FALSE;
1637             }
1638           else
1639             {
1640               Elf_Internal_Sym * psym;
1641               const char * version_string;
1642               enum versioned_symbol_info sym_info;
1643               unsigned short vna_other;
1644
1645               psym = symtab + symtab_index;
1646
1647               version_string
1648                 = get_symbol_version_string (filedata, is_dynsym,
1649                                              strtab, strtablen,
1650                                              symtab_index,
1651                                              psym,
1652                                              &sym_info,
1653                                              &vna_other);
1654
1655               printf (" ");
1656
1657               if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1658                 {
1659                   const char * name;
1660                   unsigned int len;
1661                   unsigned int width = is_32bit_elf ? 8 : 14;
1662
1663                   /* Relocations against GNU_IFUNC symbols do not use the value
1664                      of the symbol as the address to relocate against.  Instead
1665                      they invoke the function named by the symbol and use its
1666                      result as the address for relocation.
1667
1668                      To indicate this to the user, do not display the value of
1669                      the symbol in the "Symbols's Value" field.  Instead show
1670                      its name followed by () as a hint that the symbol is
1671                      invoked.  */
1672
1673                   if (strtab == NULL
1674                       || psym->st_name == 0
1675                       || psym->st_name >= strtablen)
1676                     name = "??";
1677                   else
1678                     name = strtab + psym->st_name;
1679
1680                   len = print_symbol (width, name);
1681                   if (version_string)
1682                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1683                             version_string);
1684                   printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1685                 }
1686               else
1687                 {
1688                   print_vma (psym->st_value, LONG_HEX);
1689
1690                   printf (is_32bit_elf ? "   " : " ");
1691                 }
1692
1693               if (psym->st_name == 0)
1694                 {
1695                   const char * sec_name = "<null>";
1696                   char name_buf[40];
1697
1698                   if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1699                     {
1700                       if (psym->st_shndx < filedata->file_header.e_shnum)
1701                         sec_name = SECTION_NAME (filedata->section_headers + psym->st_shndx);
1702                       else if (psym->st_shndx == SHN_ABS)
1703                         sec_name = "ABS";
1704                       else if (psym->st_shndx == SHN_COMMON)
1705                         sec_name = "COMMON";
1706                       else if ((filedata->file_header.e_machine == EM_MIPS
1707                                 && psym->st_shndx == SHN_MIPS_SCOMMON)
1708                                || (filedata->file_header.e_machine == EM_TI_C6000
1709                                    && psym->st_shndx == SHN_TIC6X_SCOMMON))
1710                         sec_name = "SCOMMON";
1711                       else if (filedata->file_header.e_machine == EM_MIPS
1712                                && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1713                         sec_name = "SUNDEF";
1714                       else if ((filedata->file_header.e_machine == EM_X86_64
1715                                 || filedata->file_header.e_machine == EM_L1OM
1716                                 || filedata->file_header.e_machine == EM_K1OM)
1717                                && psym->st_shndx == SHN_X86_64_LCOMMON)
1718                         sec_name = "LARGE_COMMON";
1719                       else if (filedata->file_header.e_machine == EM_IA_64
1720                                && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1721                                && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1722                         sec_name = "ANSI_COM";
1723                       else if (is_ia64_vms (filedata)
1724                                && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1725                         sec_name = "VMS_SYMVEC";
1726                       else
1727                         {
1728                           sprintf (name_buf, "<section 0x%x>",
1729                                    (unsigned int) psym->st_shndx);
1730                           sec_name = name_buf;
1731                         }
1732                     }
1733                   print_symbol (22, sec_name);
1734                 }
1735               else if (strtab == NULL)
1736                 printf (_("<string table index: %3ld>"), psym->st_name);
1737               else if (psym->st_name >= strtablen)
1738                 {
1739                   error (_("<corrupt string table index: %3ld>"), psym->st_name);
1740                   res = FALSE;
1741                 }
1742               else
1743                 {
1744                   print_symbol (22, strtab + psym->st_name);
1745                   if (version_string)
1746                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1747                             version_string);
1748                 }
1749
1750               if (is_rela)
1751                 {
1752                   bfd_vma off = rels[i].r_addend;
1753
1754                   if ((bfd_signed_vma) off < 0)
1755                     printf (" - %" BFD_VMA_FMT "x", - off);
1756                   else
1757                     printf (" + %" BFD_VMA_FMT "x", off);
1758                 }
1759             }
1760         }
1761       else if (is_rela)
1762         {
1763           bfd_vma off = rels[i].r_addend;
1764
1765           printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1766           if ((bfd_signed_vma) off < 0)
1767             printf ("-%" BFD_VMA_FMT "x", - off);
1768           else
1769             printf ("%" BFD_VMA_FMT "x", off);
1770         }
1771
1772       if (filedata->file_header.e_machine == EM_SPARCV9
1773           && rtype != NULL
1774           && streq (rtype, "R_SPARC_OLO10"))
1775         printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1776
1777       putchar ('\n');
1778
1779 #ifdef BFD64
1780       if (! is_32bit_elf && filedata->file_header.e_machine == EM_MIPS)
1781         {
1782           bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1783           bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1784           const char * rtype2 = elf_mips_reloc_type (type2);
1785           const char * rtype3 = elf_mips_reloc_type (type3);
1786
1787           printf ("                    Type2: ");
1788
1789           if (rtype2 == NULL)
1790             printf (_("unrecognized: %-7lx"),
1791                     (unsigned long) type2 & 0xffffffff);
1792           else
1793             printf ("%-17.17s", rtype2);
1794
1795           printf ("\n                    Type3: ");
1796
1797           if (rtype3 == NULL)
1798             printf (_("unrecognized: %-7lx"),
1799                     (unsigned long) type3 & 0xffffffff);
1800           else
1801             printf ("%-17.17s", rtype3);
1802
1803           putchar ('\n');
1804         }
1805 #endif /* BFD64 */
1806     }
1807
1808   free (rels);
1809
1810   return res;
1811 }
1812
1813 static const char *
1814 get_aarch64_dynamic_type (unsigned long type)
1815 {
1816   switch (type)
1817     {
1818     case DT_AARCH64_BTI_PLT:  return "AARCH64_BTI_PLT";
1819     case DT_AARCH64_PAC_PLT:  return "AARCH64_PAC_PLT";
1820     case DT_AARCH64_VARIANT_PCS:  return "AARCH64_VARIANT_PCS";
1821     default:
1822       return NULL;
1823     }
1824 }
1825
1826 static const char *
1827 get_mips_dynamic_type (unsigned long type)
1828 {
1829   switch (type)
1830     {
1831     case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1832     case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1833     case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1834     case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1835     case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1836     case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1837     case DT_MIPS_MSYM: return "MIPS_MSYM";
1838     case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1839     case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1840     case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1841     case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1842     case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1843     case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1844     case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1845     case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1846     case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1847     case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1848     case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1849     case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1850     case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1851     case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1852     case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1853     case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1854     case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1855     case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1856     case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1857     case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1858     case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1859     case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1860     case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1861     case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1862     case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1863     case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1864     case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1865     case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1866     case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1867     case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1868     case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1869     case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1870     case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1871     case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1872     case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1873     case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1874     case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1875     case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1876     case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1877     default:
1878       return NULL;
1879     }
1880 }
1881
1882 static const char *
1883 get_sparc64_dynamic_type (unsigned long type)
1884 {
1885   switch (type)
1886     {
1887     case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1888     default:
1889       return NULL;
1890     }
1891 }
1892
1893 static const char *
1894 get_ppc_dynamic_type (unsigned long type)
1895 {
1896   switch (type)
1897     {
1898     case DT_PPC_GOT:    return "PPC_GOT";
1899     case DT_PPC_OPT:    return "PPC_OPT";
1900     default:
1901       return NULL;
1902     }
1903 }
1904
1905 static const char *
1906 get_ppc64_dynamic_type (unsigned long type)
1907 {
1908   switch (type)
1909     {
1910     case DT_PPC64_GLINK:  return "PPC64_GLINK";
1911     case DT_PPC64_OPD:    return "PPC64_OPD";
1912     case DT_PPC64_OPDSZ:  return "PPC64_OPDSZ";
1913     case DT_PPC64_OPT:    return "PPC64_OPT";
1914     default:
1915       return NULL;
1916     }
1917 }
1918
1919 static const char *
1920 get_parisc_dynamic_type (unsigned long type)
1921 {
1922   switch (type)
1923     {
1924     case DT_HP_LOAD_MAP:        return "HP_LOAD_MAP";
1925     case DT_HP_DLD_FLAGS:       return "HP_DLD_FLAGS";
1926     case DT_HP_DLD_HOOK:        return "HP_DLD_HOOK";
1927     case DT_HP_UX10_INIT:       return "HP_UX10_INIT";
1928     case DT_HP_UX10_INITSZ:     return "HP_UX10_INITSZ";
1929     case DT_HP_PREINIT:         return "HP_PREINIT";
1930     case DT_HP_PREINITSZ:       return "HP_PREINITSZ";
1931     case DT_HP_NEEDED:          return "HP_NEEDED";
1932     case DT_HP_TIME_STAMP:      return "HP_TIME_STAMP";
1933     case DT_HP_CHECKSUM:        return "HP_CHECKSUM";
1934     case DT_HP_GST_SIZE:        return "HP_GST_SIZE";
1935     case DT_HP_GST_VERSION:     return "HP_GST_VERSION";
1936     case DT_HP_GST_HASHVAL:     return "HP_GST_HASHVAL";
1937     case DT_HP_EPLTREL:         return "HP_GST_EPLTREL";
1938     case DT_HP_EPLTRELSZ:       return "HP_GST_EPLTRELSZ";
1939     case DT_HP_FILTERED:        return "HP_FILTERED";
1940     case DT_HP_FILTER_TLS:      return "HP_FILTER_TLS";
1941     case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1942     case DT_HP_LAZYLOAD:        return "HP_LAZYLOAD";
1943     case DT_HP_BIND_NOW_COUNT:  return "HP_BIND_NOW_COUNT";
1944     case DT_PLT:                return "PLT";
1945     case DT_PLT_SIZE:           return "PLT_SIZE";
1946     case DT_DLT:                return "DLT";
1947     case DT_DLT_SIZE:           return "DLT_SIZE";
1948     default:
1949       return NULL;
1950     }
1951 }
1952
1953 static const char *
1954 get_ia64_dynamic_type (unsigned long type)
1955 {
1956   switch (type)
1957     {
1958     case DT_IA_64_PLT_RESERVE:         return "IA_64_PLT_RESERVE";
1959     case DT_IA_64_VMS_SUBTYPE:         return "VMS_SUBTYPE";
1960     case DT_IA_64_VMS_IMGIOCNT:        return "VMS_IMGIOCNT";
1961     case DT_IA_64_VMS_LNKFLAGS:        return "VMS_LNKFLAGS";
1962     case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1963     case DT_IA_64_VMS_IDENT:           return "VMS_IDENT";
1964     case DT_IA_64_VMS_NEEDED_IDENT:    return "VMS_NEEDED_IDENT";
1965     case DT_IA_64_VMS_IMG_RELA_CNT:    return "VMS_IMG_RELA_CNT";
1966     case DT_IA_64_VMS_SEG_RELA_CNT:    return "VMS_SEG_RELA_CNT";
1967     case DT_IA_64_VMS_FIXUP_RELA_CNT:  return "VMS_FIXUP_RELA_CNT";
1968     case DT_IA_64_VMS_FIXUP_NEEDED:    return "VMS_FIXUP_NEEDED";
1969     case DT_IA_64_VMS_SYMVEC_CNT:      return "VMS_SYMVEC_CNT";
1970     case DT_IA_64_VMS_XLATED:          return "VMS_XLATED";
1971     case DT_IA_64_VMS_STACKSIZE:       return "VMS_STACKSIZE";
1972     case DT_IA_64_VMS_UNWINDSZ:        return "VMS_UNWINDSZ";
1973     case DT_IA_64_VMS_UNWIND_CODSEG:   return "VMS_UNWIND_CODSEG";
1974     case DT_IA_64_VMS_UNWIND_INFOSEG:  return "VMS_UNWIND_INFOSEG";
1975     case DT_IA_64_VMS_LINKTIME:        return "VMS_LINKTIME";
1976     case DT_IA_64_VMS_SEG_NO:          return "VMS_SEG_NO";
1977     case DT_IA_64_VMS_SYMVEC_OFFSET:   return "VMS_SYMVEC_OFFSET";
1978     case DT_IA_64_VMS_SYMVEC_SEG:      return "VMS_SYMVEC_SEG";
1979     case DT_IA_64_VMS_UNWIND_OFFSET:   return "VMS_UNWIND_OFFSET";
1980     case DT_IA_64_VMS_UNWIND_SEG:      return "VMS_UNWIND_SEG";
1981     case DT_IA_64_VMS_STRTAB_OFFSET:   return "VMS_STRTAB_OFFSET";
1982     case DT_IA_64_VMS_SYSVER_OFFSET:   return "VMS_SYSVER_OFFSET";
1983     case DT_IA_64_VMS_IMG_RELA_OFF:    return "VMS_IMG_RELA_OFF";
1984     case DT_IA_64_VMS_SEG_RELA_OFF:    return "VMS_SEG_RELA_OFF";
1985     case DT_IA_64_VMS_FIXUP_RELA_OFF:  return "VMS_FIXUP_RELA_OFF";
1986     case DT_IA_64_VMS_PLTGOT_OFFSET:   return "VMS_PLTGOT_OFFSET";
1987     case DT_IA_64_VMS_PLTGOT_SEG:      return "VMS_PLTGOT_SEG";
1988     case DT_IA_64_VMS_FPMODE:          return "VMS_FPMODE";
1989     default:
1990       return NULL;
1991     }
1992 }
1993
1994 static const char *
1995 get_solaris_section_type (unsigned long type)
1996 {
1997   switch (type)
1998     {
1999     case 0x6fffffee: return "SUNW_ancillary";
2000     case 0x6fffffef: return "SUNW_capchain";
2001     case 0x6ffffff0: return "SUNW_capinfo";
2002     case 0x6ffffff1: return "SUNW_symsort";
2003     case 0x6ffffff2: return "SUNW_tlssort";
2004     case 0x6ffffff3: return "SUNW_LDYNSYM";
2005     case 0x6ffffff4: return "SUNW_dof";
2006     case 0x6ffffff5: return "SUNW_cap";
2007     case 0x6ffffff6: return "SUNW_SIGNATURE";
2008     case 0x6ffffff7: return "SUNW_ANNOTATE";
2009     case 0x6ffffff8: return "SUNW_DEBUGSTR";
2010     case 0x6ffffff9: return "SUNW_DEBUG";
2011     case 0x6ffffffa: return "SUNW_move";
2012     case 0x6ffffffb: return "SUNW_COMDAT";
2013     case 0x6ffffffc: return "SUNW_syminfo";
2014     case 0x6ffffffd: return "SUNW_verdef";
2015     case 0x6ffffffe: return "SUNW_verneed";
2016     case 0x6fffffff: return "SUNW_versym";
2017     case 0x70000000: return "SPARC_GOTDATA";
2018     default: return NULL;
2019     }
2020 }
2021
2022 static const char *
2023 get_alpha_dynamic_type (unsigned long type)
2024 {
2025   switch (type)
2026     {
2027     case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
2028     default: return NULL;
2029     }
2030 }
2031
2032 static const char *
2033 get_score_dynamic_type (unsigned long type)
2034 {
2035   switch (type)
2036     {
2037     case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
2038     case DT_SCORE_LOCAL_GOTNO:  return "SCORE_LOCAL_GOTNO";
2039     case DT_SCORE_SYMTABNO:     return "SCORE_SYMTABNO";
2040     case DT_SCORE_GOTSYM:       return "SCORE_GOTSYM";
2041     case DT_SCORE_UNREFEXTNO:   return "SCORE_UNREFEXTNO";
2042     case DT_SCORE_HIPAGENO:     return "SCORE_HIPAGENO";
2043     default:                    return NULL;
2044     }
2045 }
2046
2047 static const char *
2048 get_tic6x_dynamic_type (unsigned long type)
2049 {
2050   switch (type)
2051     {
2052     case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
2053     case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
2054     case DT_C6000_DSBT_BASE:   return "C6000_DSBT_BASE";
2055     case DT_C6000_DSBT_SIZE:   return "C6000_DSBT_SIZE";
2056     case DT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
2057     case DT_C6000_DSBT_INDEX:  return "C6000_DSBT_INDEX";
2058     default:                   return NULL;
2059     }
2060 }
2061
2062 static const char *
2063 get_nios2_dynamic_type (unsigned long type)
2064 {
2065   switch (type)
2066     {
2067     case DT_NIOS2_GP: return "NIOS2_GP";
2068     default:          return NULL;
2069     }
2070 }
2071
2072 static const char *
2073 get_solaris_dynamic_type (unsigned long type)
2074 {
2075   switch (type)
2076     {
2077     case 0x6000000d: return "SUNW_AUXILIARY";
2078     case 0x6000000e: return "SUNW_RTLDINF";
2079     case 0x6000000f: return "SUNW_FILTER";
2080     case 0x60000010: return "SUNW_CAP";
2081     case 0x60000011: return "SUNW_SYMTAB";
2082     case 0x60000012: return "SUNW_SYMSZ";
2083     case 0x60000013: return "SUNW_SORTENT";
2084     case 0x60000014: return "SUNW_SYMSORT";
2085     case 0x60000015: return "SUNW_SYMSORTSZ";
2086     case 0x60000016: return "SUNW_TLSSORT";
2087     case 0x60000017: return "SUNW_TLSSORTSZ";
2088     case 0x60000018: return "SUNW_CAPINFO";
2089     case 0x60000019: return "SUNW_STRPAD";
2090     case 0x6000001a: return "SUNW_CAPCHAIN";
2091     case 0x6000001b: return "SUNW_LDMACH";
2092     case 0x6000001d: return "SUNW_CAPCHAINENT";
2093     case 0x6000001f: return "SUNW_CAPCHAINSZ";
2094     case 0x60000021: return "SUNW_PARENT";
2095     case 0x60000023: return "SUNW_ASLR";
2096     case 0x60000025: return "SUNW_RELAX";
2097     case 0x60000029: return "SUNW_NXHEAP";
2098     case 0x6000002b: return "SUNW_NXSTACK";
2099
2100     case 0x70000001: return "SPARC_REGISTER";
2101     case 0x7ffffffd: return "AUXILIARY";
2102     case 0x7ffffffe: return "USED";
2103     case 0x7fffffff: return "FILTER";
2104
2105     default: return NULL;
2106     }
2107 }
2108
2109 static const char *
2110 get_dynamic_type (Filedata * filedata, unsigned long type)
2111 {
2112   static char buff[64];
2113
2114   switch (type)
2115     {
2116     case DT_NULL:       return "NULL";
2117     case DT_NEEDED:     return "NEEDED";
2118     case DT_PLTRELSZ:   return "PLTRELSZ";
2119     case DT_PLTGOT:     return "PLTGOT";
2120     case DT_HASH:       return "HASH";
2121     case DT_STRTAB:     return "STRTAB";
2122     case DT_SYMTAB:     return "SYMTAB";
2123     case DT_RELA:       return "RELA";
2124     case DT_RELASZ:     return "RELASZ";
2125     case DT_RELAENT:    return "RELAENT";
2126     case DT_STRSZ:      return "STRSZ";
2127     case DT_SYMENT:     return "SYMENT";
2128     case DT_INIT:       return "INIT";
2129     case DT_FINI:       return "FINI";
2130     case DT_SONAME:     return "SONAME";
2131     case DT_RPATH:      return "RPATH";
2132     case DT_SYMBOLIC:   return "SYMBOLIC";
2133     case DT_REL:        return "REL";
2134     case DT_RELSZ:      return "RELSZ";
2135     case DT_RELENT:     return "RELENT";
2136     case DT_PLTREL:     return "PLTREL";
2137     case DT_DEBUG:      return "DEBUG";
2138     case DT_TEXTREL:    return "TEXTREL";
2139     case DT_JMPREL:     return "JMPREL";
2140     case DT_BIND_NOW:   return "BIND_NOW";
2141     case DT_INIT_ARRAY: return "INIT_ARRAY";
2142     case DT_FINI_ARRAY: return "FINI_ARRAY";
2143     case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2144     case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
2145     case DT_RUNPATH:    return "RUNPATH";
2146     case DT_FLAGS:      return "FLAGS";
2147
2148     case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2149     case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
2150     case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX";
2151
2152     case DT_CHECKSUM:   return "CHECKSUM";
2153     case DT_PLTPADSZ:   return "PLTPADSZ";
2154     case DT_MOVEENT:    return "MOVEENT";
2155     case DT_MOVESZ:     return "MOVESZ";
2156     case DT_FEATURE:    return "FEATURE";
2157     case DT_POSFLAG_1:  return "POSFLAG_1";
2158     case DT_SYMINSZ:    return "SYMINSZ";
2159     case DT_SYMINENT:   return "SYMINENT"; /* aka VALRNGHI */
2160
2161     case DT_ADDRRNGLO:  return "ADDRRNGLO";
2162     case DT_CONFIG:     return "CONFIG";
2163     case DT_DEPAUDIT:   return "DEPAUDIT";
2164     case DT_AUDIT:      return "AUDIT";
2165     case DT_PLTPAD:     return "PLTPAD";
2166     case DT_MOVETAB:    return "MOVETAB";
2167     case DT_SYMINFO:    return "SYMINFO"; /* aka ADDRRNGHI */
2168
2169     case DT_VERSYM:     return "VERSYM";
2170
2171     case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2172     case DT_TLSDESC_PLT: return "TLSDESC_PLT";
2173     case DT_RELACOUNT:  return "RELACOUNT";
2174     case DT_RELCOUNT:   return "RELCOUNT";
2175     case DT_FLAGS_1:    return "FLAGS_1";
2176     case DT_VERDEF:     return "VERDEF";
2177     case DT_VERDEFNUM:  return "VERDEFNUM";
2178     case DT_VERNEED:    return "VERNEED";
2179     case DT_VERNEEDNUM: return "VERNEEDNUM";
2180
2181     case DT_AUXILIARY:  return "AUXILIARY";
2182     case DT_USED:       return "USED";
2183     case DT_FILTER:     return "FILTER";
2184
2185     case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2186     case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2187     case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2188     case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2189     case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
2190     case DT_GNU_HASH:   return "GNU_HASH";
2191
2192     default:
2193       if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2194         {
2195           const char * result;
2196
2197           switch (filedata->file_header.e_machine)
2198             {
2199             case EM_AARCH64:
2200               result = get_aarch64_dynamic_type (type);
2201               break;
2202             case EM_MIPS:
2203             case EM_MIPS_RS3_LE:
2204               result = get_mips_dynamic_type (type);
2205               break;
2206             case EM_SPARCV9:
2207               result = get_sparc64_dynamic_type (type);
2208               break;
2209             case EM_PPC:
2210               result = get_ppc_dynamic_type (type);
2211               break;
2212             case EM_PPC64:
2213               result = get_ppc64_dynamic_type (type);
2214               break;
2215             case EM_IA_64:
2216               result = get_ia64_dynamic_type (type);
2217               break;
2218             case EM_ALPHA:
2219               result = get_alpha_dynamic_type (type);
2220               break;
2221             case EM_SCORE:
2222               result = get_score_dynamic_type (type);
2223               break;
2224             case EM_TI_C6000:
2225               result = get_tic6x_dynamic_type (type);
2226               break;
2227             case EM_ALTERA_NIOS2:
2228               result = get_nios2_dynamic_type (type);
2229               break;
2230             default:
2231               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2232                 result = get_solaris_dynamic_type (type);
2233               else
2234                 result = NULL;
2235               break;
2236             }
2237
2238           if (result != NULL)
2239             return result;
2240
2241           snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2242         }
2243       else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2244                || (filedata->file_header.e_machine == EM_PARISC
2245                    && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2246         {
2247           const char * result;
2248
2249           switch (filedata->file_header.e_machine)
2250             {
2251             case EM_PARISC:
2252               result = get_parisc_dynamic_type (type);
2253               break;
2254             case EM_IA_64:
2255               result = get_ia64_dynamic_type (type);
2256               break;
2257             default:
2258               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2259                 result = get_solaris_dynamic_type (type);
2260               else
2261                 result = NULL;
2262               break;
2263             }
2264
2265           if (result != NULL)
2266             return result;
2267
2268           snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2269                     type);
2270         }
2271       else
2272         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2273
2274       return buff;
2275     }
2276 }
2277
2278 static char *
2279 get_file_type (unsigned e_type)
2280 {
2281   static char buff[32];
2282
2283   switch (e_type)
2284     {
2285     case ET_NONE: return _("NONE (None)");
2286     case ET_REL:  return _("REL (Relocatable file)");
2287     case ET_EXEC: return _("EXEC (Executable file)");
2288     case ET_DYN:  return _("DYN (Shared object file)");
2289     case ET_CORE: return _("CORE (Core file)");
2290
2291     default:
2292       if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2293         snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2294       else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2295         snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2296       else
2297         snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2298       return buff;
2299     }
2300 }
2301
2302 static char *
2303 get_machine_name (unsigned e_machine)
2304 {
2305   static char buff[64]; /* XXX */
2306
2307   switch (e_machine)
2308     {
2309       /* Please keep this switch table sorted by increasing EM_ value.  */
2310       /* 0 */
2311     case EM_NONE:               return _("None");
2312     case EM_M32:                return "WE32100";
2313     case EM_SPARC:              return "Sparc";
2314     case EM_386:                return "Intel 80386";
2315     case EM_68K:                return "MC68000";
2316     case EM_88K:                return "MC88000";
2317     case EM_IAMCU:              return "Intel MCU";
2318     case EM_860:                return "Intel 80860";
2319     case EM_MIPS:               return "MIPS R3000";
2320     case EM_S370:               return "IBM System/370";
2321       /* 10 */
2322     case EM_MIPS_RS3_LE:        return "MIPS R4000 big-endian";
2323     case EM_OLD_SPARCV9:        return "Sparc v9 (old)";
2324     case EM_PARISC:             return "HPPA";
2325     case EM_VPP550:             return "Fujitsu VPP500";
2326     case EM_SPARC32PLUS:        return "Sparc v8+" ;
2327     case EM_960:                return "Intel 80960";
2328     case EM_PPC:                return "PowerPC";
2329       /* 20 */
2330     case EM_PPC64:              return "PowerPC64";
2331     case EM_S390_OLD:
2332     case EM_S390:               return "IBM S/390";
2333     case EM_SPU:                return "SPU";
2334       /* 30 */
2335     case EM_V800:               return "Renesas V850 (using RH850 ABI)";
2336     case EM_FR20:               return "Fujitsu FR20";
2337     case EM_RH32:               return "TRW RH32";
2338     case EM_MCORE:              return "MCORE";
2339       /* 40 */
2340     case EM_ARM:                return "ARM";
2341     case EM_OLD_ALPHA:          return "Digital Alpha (old)";
2342     case EM_SH:                 return "Renesas / SuperH SH";
2343     case EM_SPARCV9:            return "Sparc v9";
2344     case EM_TRICORE:            return "Siemens Tricore";
2345     case EM_ARC:                return "ARC";
2346     case EM_H8_300:             return "Renesas H8/300";
2347     case EM_H8_300H:            return "Renesas H8/300H";
2348     case EM_H8S:                return "Renesas H8S";
2349     case EM_H8_500:             return "Renesas H8/500";
2350       /* 50 */
2351     case EM_IA_64:              return "Intel IA-64";
2352     case EM_MIPS_X:             return "Stanford MIPS-X";
2353     case EM_COLDFIRE:           return "Motorola Coldfire";
2354     case EM_68HC12:             return "Motorola MC68HC12 Microcontroller";
2355     case EM_MMA:                return "Fujitsu Multimedia Accelerator";
2356     case EM_PCP:                return "Siemens PCP";
2357     case EM_NCPU:               return "Sony nCPU embedded RISC processor";
2358     case EM_NDR1:               return "Denso NDR1 microprocesspr";
2359     case EM_STARCORE:           return "Motorola Star*Core processor";
2360     case EM_ME16:               return "Toyota ME16 processor";
2361       /* 60 */
2362     case EM_ST100:              return "STMicroelectronics ST100 processor";
2363     case EM_TINYJ:              return "Advanced Logic Corp. TinyJ embedded processor";
2364     case EM_X86_64:             return "Advanced Micro Devices X86-64";
2365     case EM_PDSP:               return "Sony DSP processor";
2366     case EM_PDP10:              return "Digital Equipment Corp. PDP-10";
2367     case EM_PDP11:              return "Digital Equipment Corp. PDP-11";
2368     case EM_FX66:               return "Siemens FX66 microcontroller";
2369     case EM_ST9PLUS:            return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2370     case EM_ST7:                return "STMicroelectronics ST7 8-bit microcontroller";
2371     case EM_68HC16:             return "Motorola MC68HC16 Microcontroller";
2372       /* 70 */
2373     case EM_68HC11:             return "Motorola MC68HC11 Microcontroller";
2374     case EM_68HC08:             return "Motorola MC68HC08 Microcontroller";
2375     case EM_68HC05:             return "Motorola MC68HC05 Microcontroller";
2376     case EM_SVX:                return "Silicon Graphics SVx";
2377     case EM_ST19:               return "STMicroelectronics ST19 8-bit microcontroller";
2378     case EM_VAX:                return "Digital VAX";
2379     case EM_CRIS:               return "Axis Communications 32-bit embedded processor";
2380     case EM_JAVELIN:            return "Infineon Technologies 32-bit embedded cpu";
2381     case EM_FIREPATH:           return "Element 14 64-bit DSP processor";
2382     case EM_ZSP:                return "LSI Logic's 16-bit DSP processor";
2383       /* 80 */
2384     case EM_MMIX:               return "Donald Knuth's educational 64-bit processor";
2385     case EM_HUANY:              return "Harvard Universitys's machine-independent object format";
2386     case EM_PRISM:              return "Vitesse Prism";
2387     case EM_AVR_OLD:
2388     case EM_AVR:                return "Atmel AVR 8-bit microcontroller";
2389     case EM_CYGNUS_FR30:
2390     case EM_FR30:               return "Fujitsu FR30";
2391     case EM_CYGNUS_D10V:
2392     case EM_D10V:               return "d10v";
2393     case EM_CYGNUS_D30V:
2394     case EM_D30V:               return "d30v";
2395     case EM_CYGNUS_V850:
2396     case EM_V850:               return "Renesas V850";
2397     case EM_CYGNUS_M32R:
2398     case EM_M32R:               return "Renesas M32R (formerly Mitsubishi M32r)";
2399     case EM_CYGNUS_MN10300:
2400     case EM_MN10300:            return "mn10300";
2401       /* 90 */
2402     case EM_CYGNUS_MN10200:
2403     case EM_MN10200:            return "mn10200";
2404     case EM_PJ:                 return "picoJava";
2405     case EM_OR1K:               return "OpenRISC 1000";
2406     case EM_ARC_COMPACT:        return "ARCompact";
2407     case EM_XTENSA_OLD:
2408     case EM_XTENSA:             return "Tensilica Xtensa Processor";
2409     case EM_VIDEOCORE:          return "Alphamosaic VideoCore processor";
2410     case EM_TMM_GPP:            return "Thompson Multimedia General Purpose Processor";
2411     case EM_NS32K:              return "National Semiconductor 32000 series";
2412     case EM_TPC:                return "Tenor Network TPC processor";
2413     case EM_SNP1K:              return "Trebia SNP 1000 processor";
2414       /* 100 */
2415     case EM_ST200:              return "STMicroelectronics ST200 microcontroller";  
2416     case EM_IP2K_OLD:
2417     case EM_IP2K:               return "Ubicom IP2xxx 8-bit microcontrollers";
2418     case EM_MAX:                return "MAX Processor";
2419     case EM_CR:                 return "National Semiconductor CompactRISC";
2420     case EM_F2MC16:             return "Fujitsu F2MC16";
2421     case EM_MSP430:             return "Texas Instruments msp430 microcontroller";
2422     case EM_BLACKFIN:           return "Analog Devices Blackfin";
2423     case EM_SE_C33:             return "S1C33 Family of Seiko Epson processors";
2424     case EM_SEP:                return "Sharp embedded microprocessor";
2425     case EM_ARCA:               return "Arca RISC microprocessor";
2426       /* 110 */
2427     case EM_UNICORE:            return "Unicore";
2428     case EM_EXCESS:             return "eXcess 16/32/64-bit configurable embedded CPU";
2429     case EM_DXP:                return "Icera Semiconductor Inc. Deep Execution Processor";
2430     case EM_ALTERA_NIOS2:       return "Altera Nios II";
2431     case EM_CRX:                return "National Semiconductor CRX microprocessor";
2432     case EM_XGATE:              return "Motorola XGATE embedded processor";
2433     case EM_C166:
2434     case EM_XC16X:              return "Infineon Technologies xc16x";
2435     case EM_M16C:               return "Renesas M16C series microprocessors";
2436     case EM_DSPIC30F:           return "Microchip Technology dsPIC30F Digital Signal Controller";
2437     case EM_CE:                 return "Freescale Communication Engine RISC core";
2438       /* 120 */
2439     case EM_M32C:               return "Renesas M32c";
2440       /* 130 */
2441     case EM_TSK3000:            return "Altium TSK3000 core";
2442     case EM_RS08:               return "Freescale RS08 embedded processor";
2443     case EM_ECOG2:              return "Cyan Technology eCOG2 microprocessor";
2444     case EM_SCORE:              return "SUNPLUS S+Core";
2445     case EM_DSP24:              return "New Japan Radio (NJR) 24-bit DSP Processor";
2446     case EM_VIDEOCORE3:         return "Broadcom VideoCore III processor";
2447     case EM_LATTICEMICO32:      return "Lattice Mico32";
2448     case EM_SE_C17:             return "Seiko Epson C17 family";
2449       /* 140 */
2450     case EM_TI_C6000:           return "Texas Instruments TMS320C6000 DSP family";
2451     case EM_TI_C2000:           return "Texas Instruments TMS320C2000 DSP family";
2452     case EM_TI_C5500:           return "Texas Instruments TMS320C55x DSP family";
2453     case EM_TI_PRU:             return "TI PRU I/O processor";
2454       /* 160 */
2455     case EM_MMDSP_PLUS:         return "STMicroelectronics 64bit VLIW Data Signal Processor";
2456     case EM_CYPRESS_M8C:        return "Cypress M8C microprocessor";
2457     case EM_R32C:               return "Renesas R32C series microprocessors";
2458     case EM_TRIMEDIA:           return "NXP Semiconductors TriMedia architecture family";
2459     case EM_QDSP6:              return "QUALCOMM DSP6 Processor";
2460     case EM_8051:               return "Intel 8051 and variants";
2461     case EM_STXP7X:             return "STMicroelectronics STxP7x family";
2462     case EM_NDS32:              return "Andes Technology compact code size embedded RISC processor family";
2463     case EM_ECOG1X:             return "Cyan Technology eCOG1X family";
2464     case EM_MAXQ30:             return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2465       /* 170 */
2466     case EM_XIMO16:             return "New Japan Radio (NJR) 16-bit DSP Processor";
2467     case EM_MANIK:              return "M2000 Reconfigurable RISC Microprocessor";
2468     case EM_CRAYNV2:            return "Cray Inc. NV2 vector architecture";
2469     case EM_RX:                 return "Renesas RX";
2470     case EM_METAG:              return "Imagination Technologies Meta processor architecture";
2471     case EM_MCST_ELBRUS:        return "MCST Elbrus general purpose hardware architecture";
2472     case EM_ECOG16:             return "Cyan Technology eCOG16 family";
2473     case EM_CR16:
2474     case EM_MICROBLAZE:
2475     case EM_MICROBLAZE_OLD:     return "Xilinx MicroBlaze";
2476     case EM_ETPU:               return "Freescale Extended Time Processing Unit";
2477     case EM_SLE9X:              return "Infineon Technologies SLE9X core";
2478       /* 180 */
2479     case EM_L1OM:               return "Intel L1OM";
2480     case EM_K1OM:               return "Intel K1OM";
2481     case EM_INTEL182:           return "Intel (reserved)";
2482     case EM_AARCH64:            return "AArch64";
2483     case EM_ARM184:             return "ARM (reserved)";
2484     case EM_AVR32:              return "Atmel Corporation 32-bit microprocessor";
2485     case EM_STM8:               return "STMicroeletronics STM8 8-bit microcontroller";
2486     case EM_TILE64:             return "Tilera TILE64 multicore architecture family";
2487     case EM_TILEPRO:            return "Tilera TILEPro multicore architecture family";
2488       /* 190 */
2489     case EM_CUDA:               return "NVIDIA CUDA architecture";
2490     case EM_TILEGX:             return "Tilera TILE-Gx multicore architecture family";
2491     case EM_CLOUDSHIELD:        return "CloudShield architecture family";
2492     case EM_COREA_1ST:          return "KIPO-KAIST Core-A 1st generation processor family";
2493     case EM_COREA_2ND:          return "KIPO-KAIST Core-A 2nd generation processor family";
2494     case EM_ARC_COMPACT2:       return "ARCv2";
2495     case EM_OPEN8:              return "Open8 8-bit RISC soft processor core";
2496     case EM_RL78:               return "Renesas RL78";
2497     case EM_VIDEOCORE5:         return "Broadcom VideoCore V processor";
2498     case EM_78K0R:              return "Renesas 78K0R";
2499       /* 200 */
2500     case EM_56800EX:            return "Freescale 56800EX Digital Signal Controller (DSC)";
2501     case EM_BA1:                return "Beyond BA1 CPU architecture";
2502     case EM_BA2:                return "Beyond BA2 CPU architecture";
2503     case EM_XCORE:              return "XMOS xCORE processor family";
2504     case EM_MCHP_PIC:           return "Microchip 8-bit PIC(r) family";
2505       /* 210 */
2506     case EM_KM32:               return "KM211 KM32 32-bit processor";
2507     case EM_KMX32:              return "KM211 KMX32 32-bit processor";
2508     case EM_KMX16:              return "KM211 KMX16 16-bit processor";
2509     case EM_KMX8:               return "KM211 KMX8 8-bit processor";
2510     case EM_KVARC:              return "KM211 KVARC processor";
2511     case EM_CDP:                return "Paneve CDP architecture family";
2512     case EM_COGE:               return "Cognitive Smart Memory Processor";
2513     case EM_COOL:               return "Bluechip Systems CoolEngine";
2514     case EM_NORC:               return "Nanoradio Optimized RISC";
2515     case EM_CSR_KALIMBA:        return "CSR Kalimba architecture family";
2516       /* 220 */
2517     case EM_Z80:                return "Zilog Z80";
2518     case EM_VISIUM:             return "CDS VISIUMcore processor";
2519     case EM_FT32:               return "FTDI Chip FT32";
2520     case EM_MOXIE:              return "Moxie";
2521     case EM_AMDGPU:             return "AMD GPU";
2522     case EM_RISCV:              return "RISC-V";
2523     case EM_LANAI:              return "Lanai 32-bit processor";
2524     case EM_BPF:                return "Linux BPF";
2525     case EM_NFP:                return "Netronome Flow Processor";
2526
2527       /* Large numbers...  */
2528     case EM_MT:                 return "Morpho Techologies MT processor";
2529     case EM_ALPHA:              return "Alpha";
2530     case EM_WEBASSEMBLY:        return "Web Assembly";
2531     case EM_DLX:                return "OpenDLX";  
2532     case EM_XSTORMY16:          return "Sanyo XStormy16 CPU core";
2533     case EM_IQ2000:             return "Vitesse IQ2000";
2534     case EM_M32C_OLD:
2535     case EM_NIOS32:             return "Altera Nios";
2536     case EM_CYGNUS_MEP:         return "Toshiba MeP Media Engine";
2537     case EM_ADAPTEVA_EPIPHANY:  return "Adapteva EPIPHANY";
2538     case EM_CYGNUS_FRV:         return "Fujitsu FR-V";
2539     case EM_S12Z:               return "Freescale S12Z";
2540     case EM_CSKY:               return "C-SKY";
2541
2542     default:
2543       snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2544       return buff;
2545     }
2546 }
2547
2548 static void
2549 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2550 {
2551   /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2.  Some
2552      other compilers don't a specific architecture type in the e_flags, and
2553      instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2554      architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2555      architectures.
2556
2557      Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2558      but also sets a specific architecture type in the e_flags field.
2559
2560      However, when decoding the flags we don't worry if we see an
2561      unexpected pairing, for example EM_ARC_COMPACT machine type, with
2562      ARCEM architecture type.  */
2563
2564   switch (e_flags & EF_ARC_MACH_MSK)
2565     {
2566       /* We only expect these to occur for EM_ARC_COMPACT2.  */
2567     case EF_ARC_CPU_ARCV2EM:
2568       strcat (buf, ", ARC EM");
2569       break;
2570     case EF_ARC_CPU_ARCV2HS:
2571       strcat (buf, ", ARC HS");
2572       break;
2573
2574       /* We only expect these to occur for EM_ARC_COMPACT.  */
2575     case E_ARC_MACH_ARC600:
2576       strcat (buf, ", ARC600");
2577       break;
2578     case E_ARC_MACH_ARC601:
2579       strcat (buf, ", ARC601");
2580       break;
2581     case E_ARC_MACH_ARC700:
2582       strcat (buf, ", ARC700");
2583       break;
2584
2585       /* The only times we should end up here are (a) A corrupt ELF, (b) A
2586          new ELF with new architecture being read by an old version of
2587          readelf, or (c) An ELF built with non-GNU compiler that does not
2588          set the architecture in the e_flags.  */
2589     default:
2590       if (e_machine == EM_ARC_COMPACT)
2591         strcat (buf, ", Unknown ARCompact");
2592       else
2593         strcat (buf, ", Unknown ARC");
2594       break;
2595     }
2596
2597   switch (e_flags & EF_ARC_OSABI_MSK)
2598     {
2599     case E_ARC_OSABI_ORIG:
2600       strcat (buf, ", (ABI:legacy)");
2601       break;
2602     case E_ARC_OSABI_V2:
2603       strcat (buf, ", (ABI:v2)");
2604       break;
2605       /* Only upstream 3.9+ kernels will support ARCv2 ISA.  */
2606     case E_ARC_OSABI_V3:
2607       strcat (buf, ", v3 no-legacy-syscalls ABI");
2608       break;
2609     case E_ARC_OSABI_V4:
2610       strcat (buf, ", v4 ABI");
2611       break;
2612     default:
2613       strcat (buf, ", unrecognised ARC OSABI flag");
2614       break;
2615     }
2616 }
2617
2618 static void
2619 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2620 {
2621   unsigned eabi;
2622   bfd_boolean unknown = FALSE;
2623
2624   eabi = EF_ARM_EABI_VERSION (e_flags);
2625   e_flags &= ~ EF_ARM_EABIMASK;
2626
2627   /* Handle "generic" ARM flags.  */
2628   if (e_flags & EF_ARM_RELEXEC)
2629     {
2630       strcat (buf, ", relocatable executable");
2631       e_flags &= ~ EF_ARM_RELEXEC;
2632     }
2633
2634   if (e_flags & EF_ARM_PIC)
2635     {
2636       strcat (buf, ", position independent");
2637       e_flags &= ~ EF_ARM_PIC;
2638     }
2639
2640   /* Now handle EABI specific flags.  */
2641   switch (eabi)
2642     {
2643     default:
2644       strcat (buf, ", <unrecognized EABI>");
2645       if (e_flags)
2646         unknown = TRUE;
2647       break;
2648
2649     case EF_ARM_EABI_VER1:
2650       strcat (buf, ", Version1 EABI");
2651       while (e_flags)
2652         {
2653           unsigned flag;
2654
2655           /* Process flags one bit at a time.  */
2656           flag = e_flags & - e_flags;
2657           e_flags &= ~ flag;
2658
2659           switch (flag)
2660             {
2661             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2662               strcat (buf, ", sorted symbol tables");
2663               break;
2664
2665             default:
2666               unknown = TRUE;
2667               break;
2668             }
2669         }
2670       break;
2671
2672     case EF_ARM_EABI_VER2:
2673       strcat (buf, ", Version2 EABI");
2674       while (e_flags)
2675         {
2676           unsigned flag;
2677
2678           /* Process flags one bit at a time.  */
2679           flag = e_flags & - e_flags;
2680           e_flags &= ~ flag;
2681
2682           switch (flag)
2683             {
2684             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2685               strcat (buf, ", sorted symbol tables");
2686               break;
2687
2688             case EF_ARM_DYNSYMSUSESEGIDX:
2689               strcat (buf, ", dynamic symbols use segment index");
2690               break;
2691
2692             case EF_ARM_MAPSYMSFIRST:
2693               strcat (buf, ", mapping symbols precede others");
2694               break;
2695
2696             default:
2697               unknown = TRUE;
2698               break;
2699             }
2700         }
2701       break;
2702
2703     case EF_ARM_EABI_VER3:
2704       strcat (buf, ", Version3 EABI");
2705       break;
2706
2707     case EF_ARM_EABI_VER4:
2708       strcat (buf, ", Version4 EABI");
2709       while (e_flags)
2710         {
2711           unsigned flag;
2712
2713           /* Process flags one bit at a time.  */
2714           flag = e_flags & - e_flags;
2715           e_flags &= ~ flag;
2716
2717           switch (flag)
2718             {
2719             case EF_ARM_BE8:
2720               strcat (buf, ", BE8");
2721               break;
2722
2723             case EF_ARM_LE8:
2724               strcat (buf, ", LE8");
2725               break;
2726
2727             default:
2728               unknown = TRUE;
2729               break;
2730             }
2731         }
2732       break;
2733
2734     case EF_ARM_EABI_VER5:
2735       strcat (buf, ", Version5 EABI");
2736       while (e_flags)
2737         {
2738           unsigned flag;
2739
2740           /* Process flags one bit at a time.  */
2741           flag = e_flags & - e_flags;
2742           e_flags &= ~ flag;
2743
2744           switch (flag)
2745             {
2746             case EF_ARM_BE8:
2747               strcat (buf, ", BE8");
2748               break;
2749
2750             case EF_ARM_LE8:
2751               strcat (buf, ", LE8");
2752               break;
2753
2754             case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT.  */
2755               strcat (buf, ", soft-float ABI");
2756               break;
2757
2758             case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT.  */
2759               strcat (buf, ", hard-float ABI");
2760               break;
2761
2762             default:
2763               unknown = TRUE;
2764               break;
2765             }
2766         }
2767       break;
2768
2769     case EF_ARM_EABI_UNKNOWN:
2770       strcat (buf, ", GNU EABI");
2771       while (e_flags)
2772         {
2773           unsigned flag;
2774
2775           /* Process flags one bit at a time.  */
2776           flag = e_flags & - e_flags;
2777           e_flags &= ~ flag;
2778
2779           switch (flag)
2780             {
2781             case EF_ARM_INTERWORK:
2782               strcat (buf, ", interworking enabled");
2783               break;
2784
2785             case EF_ARM_APCS_26:
2786               strcat (buf, ", uses APCS/26");
2787               break;
2788
2789             case EF_ARM_APCS_FLOAT:
2790               strcat (buf, ", uses APCS/float");
2791               break;
2792
2793             case EF_ARM_PIC:
2794               strcat (buf, ", position independent");
2795               break;
2796
2797             case EF_ARM_ALIGN8:
2798               strcat (buf, ", 8 bit structure alignment");
2799               break;
2800
2801             case EF_ARM_NEW_ABI:
2802               strcat (buf, ", uses new ABI");
2803               break;
2804
2805             case EF_ARM_OLD_ABI:
2806               strcat (buf, ", uses old ABI");
2807               break;
2808
2809             case EF_ARM_SOFT_FLOAT:
2810               strcat (buf, ", software FP");
2811               break;
2812
2813             case EF_ARM_VFP_FLOAT:
2814               strcat (buf, ", VFP");
2815               break;
2816
2817             case EF_ARM_MAVERICK_FLOAT:
2818               strcat (buf, ", Maverick FP");
2819               break;
2820
2821             default:
2822               unknown = TRUE;
2823               break;
2824             }
2825         }
2826     }
2827
2828   if (unknown)
2829     strcat (buf,_(", <unknown>"));
2830 }
2831
2832 static void
2833 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2834 {
2835   --size; /* Leave space for null terminator.  */
2836
2837   switch (e_flags & EF_AVR_MACH)
2838     {
2839     case E_AVR_MACH_AVR1:
2840       strncat (buf, ", avr:1", size);
2841       break;
2842     case E_AVR_MACH_AVR2:
2843       strncat (buf, ", avr:2", size);
2844       break;
2845     case E_AVR_MACH_AVR25:
2846       strncat (buf, ", avr:25", size);
2847       break;
2848     case E_AVR_MACH_AVR3:
2849       strncat (buf, ", avr:3", size);
2850       break;
2851     case E_AVR_MACH_AVR31:
2852       strncat (buf, ", avr:31", size);
2853       break;
2854     case E_AVR_MACH_AVR35:
2855       strncat (buf, ", avr:35", size);
2856       break;
2857     case E_AVR_MACH_AVR4:
2858       strncat (buf, ", avr:4", size);
2859       break;
2860     case E_AVR_MACH_AVR5:
2861       strncat (buf, ", avr:5", size);
2862       break;
2863     case E_AVR_MACH_AVR51:
2864       strncat (buf, ", avr:51", size);
2865       break;
2866     case E_AVR_MACH_AVR6:
2867       strncat (buf, ", avr:6", size);
2868       break;
2869     case E_AVR_MACH_AVRTINY:
2870       strncat (buf, ", avr:100", size);
2871       break;
2872     case E_AVR_MACH_XMEGA1:
2873       strncat (buf, ", avr:101", size);
2874       break;
2875     case E_AVR_MACH_XMEGA2:
2876       strncat (buf, ", avr:102", size);
2877       break;
2878     case E_AVR_MACH_XMEGA3:
2879       strncat (buf, ", avr:103", size);
2880       break;
2881     case E_AVR_MACH_XMEGA4:
2882       strncat (buf, ", avr:104", size);
2883       break;
2884     case E_AVR_MACH_XMEGA5:
2885       strncat (buf, ", avr:105", size);
2886       break;
2887     case E_AVR_MACH_XMEGA6:
2888       strncat (buf, ", avr:106", size);
2889       break;
2890     case E_AVR_MACH_XMEGA7:
2891       strncat (buf, ", avr:107", size);
2892       break;
2893     default:
2894       strncat (buf, ", avr:<unknown>", size);
2895       break;
2896     }
2897
2898   size -= strlen (buf);
2899   if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2900     strncat (buf, ", link-relax", size);
2901 }
2902
2903 static void
2904 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2905 {
2906   unsigned abi;
2907   unsigned arch;
2908   unsigned config;
2909   unsigned version;
2910   bfd_boolean has_fpu = FALSE;
2911   unsigned int r = 0;
2912
2913   static const char *ABI_STRINGS[] =
2914   {
2915     "ABI v0", /* use r5 as return register; only used in N1213HC */
2916     "ABI v1", /* use r0 as return register */
2917     "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2918     "ABI v2fp", /* for FPU */
2919     "AABI",
2920     "ABI2 FP+"
2921   };
2922   static const char *VER_STRINGS[] =
2923   {
2924     "Andes ELF V1.3 or older",
2925     "Andes ELF V1.3.1",
2926     "Andes ELF V1.4"
2927   };
2928   static const char *ARCH_STRINGS[] =
2929   {
2930     "",
2931     "Andes Star v1.0",
2932     "Andes Star v2.0",
2933     "Andes Star v3.0",
2934     "Andes Star v3.0m"
2935   };
2936
2937   abi = EF_NDS_ABI & e_flags;
2938   arch = EF_NDS_ARCH & e_flags;
2939   config = EF_NDS_INST & e_flags;
2940   version = EF_NDS32_ELF_VERSION & e_flags;
2941
2942   memset (buf, 0, size);
2943
2944   switch (abi)
2945     {
2946     case E_NDS_ABI_V0:
2947     case E_NDS_ABI_V1:
2948     case E_NDS_ABI_V2:
2949     case E_NDS_ABI_V2FP:
2950     case E_NDS_ABI_AABI:
2951     case E_NDS_ABI_V2FP_PLUS:
2952       /* In case there are holes in the array.  */
2953       r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2954       break;
2955
2956     default:
2957       r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2958       break;
2959     }
2960
2961   switch (version)
2962     {
2963     case E_NDS32_ELF_VER_1_2:
2964     case E_NDS32_ELF_VER_1_3:
2965     case E_NDS32_ELF_VER_1_4:
2966       r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2967       break;
2968
2969     default:
2970       r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2971       break;
2972     }
2973
2974   if (E_NDS_ABI_V0 == abi)
2975     {
2976       /* OLD ABI; only used in N1213HC, has performance extension 1.  */
2977       r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2978       if (arch == E_NDS_ARCH_STAR_V1_0)
2979         r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2980       return;
2981     }
2982
2983   switch (arch)
2984     {
2985     case E_NDS_ARCH_STAR_V1_0:
2986     case E_NDS_ARCH_STAR_V2_0:
2987     case E_NDS_ARCH_STAR_V3_0:
2988     case E_NDS_ARCH_STAR_V3_M:
2989       r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2990       break;
2991
2992     default:
2993       r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2994       /* ARCH version determines how the e_flags are interpreted.
2995          If it is unknown, we cannot proceed.  */
2996       return;
2997     }
2998
2999   /* Newer ABI; Now handle architecture specific flags.  */
3000   if (arch == E_NDS_ARCH_STAR_V1_0)
3001     {
3002       if (config & E_NDS32_HAS_MFUSR_PC_INST)
3003         r += snprintf (buf + r, size -r, ", MFUSR_PC");
3004
3005       if (!(config & E_NDS32_HAS_NO_MAC_INST))
3006         r += snprintf (buf + r, size -r, ", MAC");
3007
3008       if (config & E_NDS32_HAS_DIV_INST)
3009         r += snprintf (buf + r, size -r, ", DIV");
3010
3011       if (config & E_NDS32_HAS_16BIT_INST)
3012         r += snprintf (buf + r, size -r, ", 16b");
3013     }
3014   else
3015     {
3016       if (config & E_NDS32_HAS_MFUSR_PC_INST)
3017         {
3018           if (version <= E_NDS32_ELF_VER_1_3)
3019             r += snprintf (buf + r, size -r, ", [B8]");
3020           else
3021             r += snprintf (buf + r, size -r, ", EX9");
3022         }
3023
3024       if (config & E_NDS32_HAS_MAC_DX_INST)
3025         r += snprintf (buf + r, size -r, ", MAC_DX");
3026
3027       if (config & E_NDS32_HAS_DIV_DX_INST)
3028         r += snprintf (buf + r, size -r, ", DIV_DX");
3029
3030       if (config & E_NDS32_HAS_16BIT_INST)
3031         {
3032           if (version <= E_NDS32_ELF_VER_1_3)
3033             r += snprintf (buf + r, size -r, ", 16b");
3034           else
3035             r += snprintf (buf + r, size -r, ", IFC");
3036         }
3037     }
3038
3039   if (config & E_NDS32_HAS_EXT_INST)
3040     r += snprintf (buf + r, size -r, ", PERF1");
3041
3042   if (config & E_NDS32_HAS_EXT2_INST)
3043     r += snprintf (buf + r, size -r, ", PERF2");
3044
3045   if (config & E_NDS32_HAS_FPU_INST)
3046     {
3047       has_fpu = TRUE;
3048       r += snprintf (buf + r, size -r, ", FPU_SP");
3049     }
3050
3051   if (config & E_NDS32_HAS_FPU_DP_INST)
3052     {
3053       has_fpu = TRUE;
3054       r += snprintf (buf + r, size -r, ", FPU_DP");
3055     }
3056
3057   if (config & E_NDS32_HAS_FPU_MAC_INST)
3058     {
3059       has_fpu = TRUE;
3060       r += snprintf (buf + r, size -r, ", FPU_MAC");
3061     }
3062
3063   if (has_fpu)
3064     {
3065       switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
3066         {
3067         case E_NDS32_FPU_REG_8SP_4DP:
3068           r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
3069           break;
3070         case E_NDS32_FPU_REG_16SP_8DP:
3071           r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
3072           break;
3073         case E_NDS32_FPU_REG_32SP_16DP:
3074           r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
3075           break;
3076         case E_NDS32_FPU_REG_32SP_32DP:
3077           r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
3078           break;
3079         }
3080     }
3081
3082   if (config & E_NDS32_HAS_AUDIO_INST)
3083     r += snprintf (buf + r, size -r, ", AUDIO");
3084
3085   if (config & E_NDS32_HAS_STRING_INST)
3086     r += snprintf (buf + r, size -r, ", STR");
3087
3088   if (config & E_NDS32_HAS_REDUCED_REGS)
3089     r += snprintf (buf + r, size -r, ", 16REG");
3090
3091   if (config & E_NDS32_HAS_VIDEO_INST)
3092     {
3093       if (version <= E_NDS32_ELF_VER_1_3)
3094         r += snprintf (buf + r, size -r, ", VIDEO");
3095       else
3096         r += snprintf (buf + r, size -r, ", SATURATION");
3097     }
3098
3099   if (config & E_NDS32_HAS_ENCRIPT_INST)
3100     r += snprintf (buf + r, size -r, ", ENCRP");
3101
3102   if (config & E_NDS32_HAS_L2C_INST)
3103     r += snprintf (buf + r, size -r, ", L2C");
3104 }
3105
3106 static char *
3107 get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine)
3108 {
3109   static char buf[1024];
3110
3111   buf[0] = '\0';
3112
3113   if (e_flags)
3114     {
3115       switch (e_machine)
3116         {
3117         default:
3118           break;
3119
3120         case EM_ARC_COMPACT2:
3121         case EM_ARC_COMPACT:
3122           decode_ARC_machine_flags (e_flags, e_machine, buf);
3123           break;
3124
3125         case EM_ARM:
3126           decode_ARM_machine_flags (e_flags, buf);
3127           break;
3128
3129         case EM_AVR:
3130           decode_AVR_machine_flags (e_flags, buf, sizeof buf);
3131           break;
3132
3133         case EM_BLACKFIN:
3134           if (e_flags & EF_BFIN_PIC)
3135             strcat (buf, ", PIC");
3136
3137           if (e_flags & EF_BFIN_FDPIC)
3138             strcat (buf, ", FDPIC");
3139
3140           if (e_flags & EF_BFIN_CODE_IN_L1)
3141             strcat (buf, ", code in L1");
3142
3143           if (e_flags & EF_BFIN_DATA_IN_L1)
3144             strcat (buf, ", data in L1");
3145
3146           break;
3147
3148         case EM_CYGNUS_FRV:
3149           switch (e_flags & EF_FRV_CPU_MASK)
3150             {
3151             case EF_FRV_CPU_GENERIC:
3152               break;
3153
3154             default:
3155               strcat (buf, ", fr???");
3156               break;
3157
3158             case EF_FRV_CPU_FR300:
3159               strcat (buf, ", fr300");
3160               break;
3161
3162             case EF_FRV_CPU_FR400:
3163               strcat (buf, ", fr400");
3164               break;
3165             case EF_FRV_CPU_FR405:
3166               strcat (buf, ", fr405");
3167               break;
3168
3169             case EF_FRV_CPU_FR450:
3170               strcat (buf, ", fr450");
3171               break;
3172
3173             case EF_FRV_CPU_FR500:
3174               strcat (buf, ", fr500");
3175               break;
3176             case EF_FRV_CPU_FR550:
3177               strcat (buf, ", fr550");
3178               break;
3179
3180             case EF_FRV_CPU_SIMPLE:
3181               strcat (buf, ", simple");
3182               break;
3183             case EF_FRV_CPU_TOMCAT:
3184               strcat (buf, ", tomcat");
3185               break;
3186             }
3187           break;
3188
3189         case EM_68K:
3190           if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
3191             strcat (buf, ", m68000");
3192           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3193             strcat (buf, ", cpu32");
3194           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
3195             strcat (buf, ", fido_a");
3196           else
3197             {
3198               char const * isa = _("unknown");
3199               char const * mac = _("unknown mac");
3200               char const * additional = NULL;
3201
3202               switch (e_flags & EF_M68K_CF_ISA_MASK)
3203                 {
3204                 case EF_M68K_CF_ISA_A_NODIV:
3205                   isa = "A";
3206                   additional = ", nodiv";
3207                   break;
3208                 case EF_M68K_CF_ISA_A:
3209                   isa = "A";
3210                   break;
3211                 case EF_M68K_CF_ISA_A_PLUS:
3212                   isa = "A+";
3213                   break;
3214                 case EF_M68K_CF_ISA_B_NOUSP:
3215                   isa = "B";
3216                   additional = ", nousp";
3217                   break;
3218                 case EF_M68K_CF_ISA_B:
3219                   isa = "B";
3220                   break;
3221                 case EF_M68K_CF_ISA_C:
3222                   isa = "C";
3223                   break;
3224                 case EF_M68K_CF_ISA_C_NODIV:
3225                   isa = "C";
3226                   additional = ", nodiv";
3227                   break;
3228                 }
3229               strcat (buf, ", cf, isa ");
3230               strcat (buf, isa);
3231               if (additional)
3232                 strcat (buf, additional);
3233               if (e_flags & EF_M68K_CF_FLOAT)
3234                 strcat (buf, ", float");
3235               switch (e_flags & EF_M68K_CF_MAC_MASK)
3236                 {
3237                 case 0:
3238                   mac = NULL;
3239                   break;
3240                 case EF_M68K_CF_MAC:
3241                   mac = "mac";
3242                   break;
3243                 case EF_M68K_CF_EMAC:
3244                   mac = "emac";
3245                   break;
3246                 case EF_M68K_CF_EMAC_B:
3247                   mac = "emac_b";
3248                   break;
3249                 }
3250               if (mac)
3251                 {
3252                   strcat (buf, ", ");
3253                   strcat (buf, mac);
3254                 }
3255             }
3256           break;
3257
3258         case EM_CYGNUS_MEP:
3259           switch (e_flags & EF_MEP_CPU_MASK)
3260             {
3261             case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3262             case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3263             case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3264             case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3265             case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3266             case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3267             default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3268             }
3269
3270           switch (e_flags & EF_MEP_COP_MASK)
3271             {
3272             case EF_MEP_COP_NONE: break;
3273             case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3274             case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3275             case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3276             case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3277             default: strcat (buf, _("<unknown MeP copro type>")); break;
3278             }
3279
3280           if (e_flags & EF_MEP_LIBRARY)
3281             strcat (buf, ", Built for Library");
3282
3283           if (e_flags & EF_MEP_INDEX_MASK)
3284             sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3285                      e_flags & EF_MEP_INDEX_MASK);
3286
3287           if (e_flags & ~ EF_MEP_ALL_FLAGS)
3288             sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3289                      e_flags & ~ EF_MEP_ALL_FLAGS);
3290           break;
3291
3292         case EM_PPC:
3293           if (e_flags & EF_PPC_EMB)
3294             strcat (buf, ", emb");
3295
3296           if (e_flags & EF_PPC_RELOCATABLE)
3297             strcat (buf, _(", relocatable"));
3298
3299           if (e_flags & EF_PPC_RELOCATABLE_LIB)
3300             strcat (buf, _(", relocatable-lib"));
3301           break;
3302
3303         case EM_PPC64:
3304           if (e_flags & EF_PPC64_ABI)
3305             {
3306               char abi[] = ", abiv0";
3307
3308               abi[6] += e_flags & EF_PPC64_ABI;
3309               strcat (buf, abi);
3310             }
3311           break;
3312
3313         case EM_V800:
3314           if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3315             strcat (buf, ", RH850 ABI");
3316
3317           if (e_flags & EF_V800_850E3)
3318             strcat (buf, ", V3 architecture");
3319
3320           if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3321             strcat (buf, ", FPU not used");
3322
3323           if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3324             strcat (buf, ", regmode: COMMON");
3325
3326           if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3327             strcat (buf, ", r4 not used");
3328
3329           if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3330             strcat (buf, ", r30 not used");
3331
3332           if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3333             strcat (buf, ", r5 not used");
3334
3335           if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3336             strcat (buf, ", r2 not used");
3337
3338           for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3339             {
3340               switch (e_flags & - e_flags)
3341                 {
3342                 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3343                 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3344                 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3345                 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3346                 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3347                 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3348                 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3349                 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3350                 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3351                 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3352                 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3353                 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3354                 default: break;
3355                 }
3356             }
3357           break;
3358
3359         case EM_V850:
3360         case EM_CYGNUS_V850:
3361           switch (e_flags & EF_V850_ARCH)
3362             {
3363             case E_V850E3V5_ARCH:
3364               strcat (buf, ", v850e3v5");
3365               break;
3366             case E_V850E2V3_ARCH:
3367               strcat (buf, ", v850e2v3");
3368               break;
3369             case E_V850E2_ARCH:
3370               strcat (buf, ", v850e2");
3371               break;
3372             case E_V850E1_ARCH:
3373               strcat (buf, ", v850e1");
3374               break;
3375             case E_V850E_ARCH:
3376               strcat (buf, ", v850e");
3377               break;
3378             case E_V850_ARCH:
3379               strcat (buf, ", v850");
3380               break;
3381             default:
3382               strcat (buf, _(", unknown v850 architecture variant"));
3383               break;
3384             }
3385           break;
3386
3387         case EM_M32R:
3388         case EM_CYGNUS_M32R:
3389           if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3390             strcat (buf, ", m32r");
3391           break;
3392
3393         case EM_MIPS:
3394         case EM_MIPS_RS3_LE:
3395           if (e_flags & EF_MIPS_NOREORDER)
3396             strcat (buf, ", noreorder");
3397
3398           if (e_flags & EF_MIPS_PIC)
3399             strcat (buf, ", pic");
3400
3401           if (e_flags & EF_MIPS_CPIC)
3402             strcat (buf, ", cpic");
3403
3404           if (e_flags & EF_MIPS_UCODE)
3405             strcat (buf, ", ugen_reserved");
3406
3407           if (e_flags & EF_MIPS_ABI2)
3408             strcat (buf, ", abi2");
3409
3410           if (e_flags & EF_MIPS_OPTIONS_FIRST)
3411             strcat (buf, ", odk first");
3412
3413           if (e_flags & EF_MIPS_32BITMODE)
3414             strcat (buf, ", 32bitmode");
3415
3416           if (e_flags & EF_MIPS_NAN2008)
3417             strcat (buf, ", nan2008");
3418
3419           if (e_flags & EF_MIPS_FP64)
3420             strcat (buf, ", fp64");
3421
3422           switch ((e_flags & EF_MIPS_MACH))
3423             {
3424             case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3425             case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3426             case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3427             case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3428             case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3429             case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3430             case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3431             case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3432             case E_MIPS_MACH_5900: strcat (buf, ", 5900"); break;
3433             case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
3434             case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3435             case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3436             case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3437             case E_MIPS_MACH_GS464: strcat (buf, ", gs464"); break;
3438             case E_MIPS_MACH_GS464E: strcat (buf, ", gs464e"); break;
3439             case E_MIPS_MACH_GS264E: strcat (buf, ", gs264e"); break;
3440             case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3441             case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3442             case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3443             case E_MIPS_MACH_XLR:  strcat (buf, ", xlr"); break;
3444             case E_MIPS_MACH_IAMR2:  strcat (buf, ", interaptiv-mr2"); break;
3445             case 0:
3446             /* We simply ignore the field in this case to avoid confusion:
3447                MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3448                extension.  */
3449               break;
3450             default: strcat (buf, _(", unknown CPU")); break;
3451             }
3452
3453           switch ((e_flags & EF_MIPS_ABI))
3454             {
3455             case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3456             case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3457             case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3458             case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3459             case 0:
3460             /* We simply ignore the field in this case to avoid confusion:
3461                MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3462                This means it is likely to be an o32 file, but not for
3463                sure.  */
3464               break;
3465             default: strcat (buf, _(", unknown ABI")); break;
3466             }
3467
3468           if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3469             strcat (buf, ", mdmx");
3470
3471           if (e_flags & EF_MIPS_ARCH_ASE_M16)
3472             strcat (buf, ", mips16");
3473
3474           if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3475             strcat (buf, ", micromips");
3476
3477           switch ((e_flags & EF_MIPS_ARCH))
3478             {
3479             case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3480             case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3481             case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3482             case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3483             case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3484             case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3485             case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3486             case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3487             case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3488             case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3489             case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3490             default: strcat (buf, _(", unknown ISA")); break;
3491             }
3492           break;
3493
3494         case EM_NDS32:
3495           decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3496           break;
3497
3498         case EM_NFP:
3499           switch (EF_NFP_MACH (e_flags))
3500             {
3501             case E_NFP_MACH_3200:
3502               strcat (buf, ", NFP-32xx");
3503               break;
3504             case E_NFP_MACH_6000:
3505               strcat (buf, ", NFP-6xxx");
3506               break;
3507             }
3508           break;
3509
3510         case EM_RISCV:
3511           if (e_flags & EF_RISCV_RVC)
3512             strcat (buf, ", RVC");
3513
3514           if (e_flags & EF_RISCV_RVE)
3515             strcat (buf, ", RVE");
3516
3517           switch (e_flags & EF_RISCV_FLOAT_ABI)
3518             {
3519             case EF_RISCV_FLOAT_ABI_SOFT:
3520               strcat (buf, ", soft-float ABI");
3521               break;
3522
3523             case EF_RISCV_FLOAT_ABI_SINGLE:
3524               strcat (buf, ", single-float ABI");
3525               break;
3526
3527             case EF_RISCV_FLOAT_ABI_DOUBLE:
3528               strcat (buf, ", double-float ABI");
3529               break;
3530
3531             case EF_RISCV_FLOAT_ABI_QUAD:
3532               strcat (buf, ", quad-float ABI");
3533               break;
3534             }
3535           break;
3536
3537         case EM_SH:
3538           switch ((e_flags & EF_SH_MACH_MASK))
3539             {
3540             case EF_SH1: strcat (buf, ", sh1"); break;
3541             case EF_SH2: strcat (buf, ", sh2"); break;
3542             case EF_SH3: strcat (buf, ", sh3"); break;
3543             case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3544             case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3545             case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3546             case EF_SH3E: strcat (buf, ", sh3e"); break;
3547             case EF_SH4: strcat (buf, ", sh4"); break;
3548             case EF_SH5: strcat (buf, ", sh5"); break;
3549             case EF_SH2E: strcat (buf, ", sh2e"); break;
3550             case EF_SH4A: strcat (buf, ", sh4a"); break;
3551             case EF_SH2A: strcat (buf, ", sh2a"); break;
3552             case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3553             case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3554             case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3555             case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3556             case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3557             case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3558             case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3559             case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3560             case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3561             default: strcat (buf, _(", unknown ISA")); break;
3562             }
3563
3564           if (e_flags & EF_SH_PIC)
3565             strcat (buf, ", pic");
3566
3567           if (e_flags & EF_SH_FDPIC)
3568             strcat (buf, ", fdpic");
3569           break;
3570
3571         case EM_OR1K:
3572           if (e_flags & EF_OR1K_NODELAY)
3573             strcat (buf, ", no delay");
3574           break;
3575
3576         case EM_SPARCV9:
3577           if (e_flags & EF_SPARC_32PLUS)
3578             strcat (buf, ", v8+");
3579
3580           if (e_flags & EF_SPARC_SUN_US1)
3581             strcat (buf, ", ultrasparcI");
3582
3583           if (e_flags & EF_SPARC_SUN_US3)
3584             strcat (buf, ", ultrasparcIII");
3585
3586           if (e_flags & EF_SPARC_HAL_R1)
3587             strcat (buf, ", halr1");
3588
3589           if (e_flags & EF_SPARC_LEDATA)
3590             strcat (buf, ", ledata");
3591
3592           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3593             strcat (buf, ", tso");
3594
3595           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3596             strcat (buf, ", pso");
3597
3598           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3599             strcat (buf, ", rmo");
3600           break;
3601
3602         case EM_PARISC:
3603           switch (e_flags & EF_PARISC_ARCH)
3604             {
3605             case EFA_PARISC_1_0:
3606               strcpy (buf, ", PA-RISC 1.0");
3607               break;
3608             case EFA_PARISC_1_1:
3609               strcpy (buf, ", PA-RISC 1.1");
3610               break;
3611             case EFA_PARISC_2_0:
3612               strcpy (buf, ", PA-RISC 2.0");
3613               break;
3614             default:
3615               break;
3616             }
3617           if (e_flags & EF_PARISC_TRAPNIL)
3618             strcat (buf, ", trapnil");
3619           if (e_flags & EF_PARISC_EXT)
3620             strcat (buf, ", ext");
3621           if (e_flags & EF_PARISC_LSB)
3622             strcat (buf, ", lsb");
3623           if (e_flags & EF_PARISC_WIDE)
3624             strcat (buf, ", wide");
3625           if (e_flags & EF_PARISC_NO_KABP)
3626             strcat (buf, ", no kabp");
3627           if (e_flags & EF_PARISC_LAZYSWAP)
3628             strcat (buf, ", lazyswap");
3629           break;
3630
3631         case EM_PJ:
3632         case EM_PJ_OLD:
3633           if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3634             strcat (buf, ", new calling convention");
3635
3636           if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3637             strcat (buf, ", gnu calling convention");
3638           break;
3639
3640         case EM_IA_64:
3641           if ((e_flags & EF_IA_64_ABI64))
3642             strcat (buf, ", 64-bit");
3643           else
3644             strcat (buf, ", 32-bit");
3645           if ((e_flags & EF_IA_64_REDUCEDFP))
3646             strcat (buf, ", reduced fp model");
3647           if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3648             strcat (buf, ", no function descriptors, constant gp");
3649           else if ((e_flags & EF_IA_64_CONS_GP))
3650             strcat (buf, ", constant gp");
3651           if ((e_flags & EF_IA_64_ABSOLUTE))
3652             strcat (buf, ", absolute");
3653           if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3654             {
3655               if ((e_flags & EF_IA_64_VMS_LINKAGES))
3656                 strcat (buf, ", vms_linkages");
3657               switch ((e_flags & EF_IA_64_VMS_COMCOD))
3658                 {
3659                 case EF_IA_64_VMS_COMCOD_SUCCESS:
3660                   break;
3661                 case EF_IA_64_VMS_COMCOD_WARNING:
3662                   strcat (buf, ", warning");
3663                   break;
3664                 case EF_IA_64_VMS_COMCOD_ERROR:
3665                   strcat (buf, ", error");
3666                   break;
3667                 case EF_IA_64_VMS_COMCOD_ABORT:
3668                   strcat (buf, ", abort");
3669                   break;
3670                 default:
3671                   warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3672                         e_flags & EF_IA_64_VMS_COMCOD);
3673                   strcat (buf, ", <unknown>");
3674                 }
3675             }
3676           break;
3677
3678         case EM_VAX:
3679           if ((e_flags & EF_VAX_NONPIC))
3680             strcat (buf, ", non-PIC");
3681           if ((e_flags & EF_VAX_DFLOAT))
3682             strcat (buf, ", D-Float");
3683           if ((e_flags & EF_VAX_GFLOAT))
3684             strcat (buf, ", G-Float");
3685           break;
3686
3687         case EM_VISIUM:
3688           if (e_flags & EF_VISIUM_ARCH_MCM)
3689             strcat (buf, ", mcm");
3690           else if (e_flags & EF_VISIUM_ARCH_MCM24)
3691             strcat (buf, ", mcm24");
3692           if (e_flags & EF_VISIUM_ARCH_GR6)
3693             strcat (buf, ", gr6");
3694           break;
3695
3696         case EM_RL78:
3697           switch (e_flags & E_FLAG_RL78_CPU_MASK)
3698             {
3699             case E_FLAG_RL78_ANY_CPU: break;
3700             case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3701             case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3702             case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3703             }
3704           if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3705             strcat (buf, ", 64-bit doubles");
3706           break;
3707
3708         case EM_RX:
3709           if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3710             strcat (buf, ", 64-bit doubles");
3711           if (e_flags & E_FLAG_RX_DSP)
3712             strcat (buf, ", dsp");
3713           if (e_flags & E_FLAG_RX_PID)
3714             strcat (buf, ", pid");
3715           if (e_flags & E_FLAG_RX_ABI)
3716             strcat (buf, ", RX ABI");
3717           if (e_flags & E_FLAG_RX_SINSNS_SET)
3718             strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3719                     ? ", uses String instructions" : ", bans String instructions");
3720           if (e_flags & E_FLAG_RX_V2)
3721             strcat (buf, ", V2");
3722           if (e_flags & E_FLAG_RX_V3)
3723             strcat (buf, ", V3");
3724           break;
3725
3726         case EM_S390:
3727           if (e_flags & EF_S390_HIGH_GPRS)
3728             strcat (buf, ", highgprs");
3729           break;
3730
3731         case EM_TI_C6000:
3732           if ((e_flags & EF_C6000_REL))
3733             strcat (buf, ", relocatable module");
3734           break;
3735
3736         case EM_MSP430:
3737           strcat (buf, _(": architecture variant: "));
3738           switch (e_flags & EF_MSP430_MACH)
3739             {
3740             case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3741             case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3742             case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3743             case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3744             case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3745             case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3746             case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3747             case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3748             case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3749             case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3750             case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3751             case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3752             case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3753             case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3754             case E_MSP430_MACH_MSP430X  : strcat (buf, "MSP430X"); break;
3755             default:
3756               strcat (buf, _(": unknown")); break;
3757             }
3758
3759           if (e_flags & ~ EF_MSP430_MACH)
3760             strcat (buf, _(": unknown extra flag bits also present"));
3761         }
3762     }
3763
3764   return buf;
3765 }
3766
3767 static const char *
3768 get_osabi_name (Filedata * filedata, unsigned int osabi)
3769 {
3770   static char buff[32];
3771
3772   switch (osabi)
3773     {
3774     case ELFOSABI_NONE:         return "UNIX - System V";
3775     case ELFOSABI_HPUX:         return "UNIX - HP-UX";
3776     case ELFOSABI_NETBSD:       return "UNIX - NetBSD";
3777     case ELFOSABI_GNU:          return "UNIX - GNU";
3778     case ELFOSABI_SOLARIS:      return "UNIX - Solaris";
3779     case ELFOSABI_AIX:          return "UNIX - AIX";
3780     case ELFOSABI_IRIX:         return "UNIX - IRIX";
3781     case ELFOSABI_FREEBSD:      return "UNIX - FreeBSD";
3782     case ELFOSABI_TRU64:        return "UNIX - TRU64";
3783     case ELFOSABI_MODESTO:      return "Novell - Modesto";
3784     case ELFOSABI_OPENBSD:      return "UNIX - OpenBSD";
3785     case ELFOSABI_OPENVMS:      return "VMS - OpenVMS";
3786     case ELFOSABI_NSK:          return "HP - Non-Stop Kernel";
3787     case ELFOSABI_AROS:         return "AROS";
3788     case ELFOSABI_FENIXOS:      return "FenixOS";
3789     case ELFOSABI_CLOUDABI:     return "Nuxi CloudABI";
3790     case ELFOSABI_OPENVOS:      return "Stratus Technologies OpenVOS";
3791     default:
3792       if (osabi >= 64)
3793         switch (filedata->file_header.e_machine)
3794           {
3795           case EM_ARM:
3796             switch (osabi)
3797               {
3798               case ELFOSABI_ARM:        return "ARM";
3799               case ELFOSABI_ARM_FDPIC:  return "ARM FDPIC";
3800               default:
3801                 break;
3802               }
3803             break;
3804
3805           case EM_MSP430:
3806           case EM_MSP430_OLD:
3807           case EM_VISIUM:
3808             switch (osabi)
3809               {
3810               case ELFOSABI_STANDALONE: return _("Standalone App");
3811               default:
3812                 break;
3813               }
3814             break;
3815
3816           case EM_TI_C6000:
3817             switch (osabi)
3818               {
3819               case ELFOSABI_C6000_ELFABI:       return _("Bare-metal C6000");
3820               case ELFOSABI_C6000_LINUX:        return "Linux C6000";
3821               default:
3822                 break;
3823               }
3824             break;
3825
3826           default:
3827             break;
3828           }
3829       snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3830       return buff;
3831     }
3832 }
3833
3834 static const char *
3835 get_aarch64_segment_type (unsigned long type)
3836 {
3837   switch (type)
3838     {
3839     case PT_AARCH64_ARCHEXT:  return "AARCH64_ARCHEXT";
3840     default:                  return NULL;
3841     }
3842 }
3843
3844 static const char *
3845 get_arm_segment_type (unsigned long type)
3846 {
3847   switch (type)
3848     {
3849     case PT_ARM_EXIDX: return "EXIDX";
3850     default:           return NULL;
3851     }
3852 }
3853
3854 static const char *
3855 get_s390_segment_type (unsigned long type)
3856 {
3857   switch (type)
3858     {
3859     case PT_S390_PGSTE: return "S390_PGSTE";
3860     default:            return NULL;
3861     }
3862 }
3863
3864 static const char *
3865 get_mips_segment_type (unsigned long type)
3866 {
3867   switch (type)
3868     {
3869     case PT_MIPS_REGINFO:   return "REGINFO";
3870     case PT_MIPS_RTPROC:    return "RTPROC";
3871     case PT_MIPS_OPTIONS:   return "OPTIONS";
3872     case PT_MIPS_ABIFLAGS:  return "ABIFLAGS";
3873     default:                return NULL;
3874     }
3875 }
3876
3877 static const char *
3878 get_parisc_segment_type (unsigned long type)
3879 {
3880   switch (type)
3881     {
3882     case PT_HP_TLS:             return "HP_TLS";
3883     case PT_HP_CORE_NONE:       return "HP_CORE_NONE";
3884     case PT_HP_CORE_VERSION:    return "HP_CORE_VERSION";
3885     case PT_HP_CORE_KERNEL:     return "HP_CORE_KERNEL";
3886     case PT_HP_CORE_COMM:       return "HP_CORE_COMM";
3887     case PT_HP_CORE_PROC:       return "HP_CORE_PROC";
3888     case PT_HP_CORE_LOADABLE:   return "HP_CORE_LOADABLE";
3889     case PT_HP_CORE_STACK:      return "HP_CORE_STACK";
3890     case PT_HP_CORE_SHM:        return "HP_CORE_SHM";
3891     case PT_HP_CORE_MMF:        return "HP_CORE_MMF";
3892     case PT_HP_PARALLEL:        return "HP_PARALLEL";
3893     case PT_HP_FASTBIND:        return "HP_FASTBIND";
3894     case PT_HP_OPT_ANNOT:       return "HP_OPT_ANNOT";
3895     case PT_HP_HSL_ANNOT:       return "HP_HSL_ANNOT";
3896     case PT_HP_STACK:           return "HP_STACK";
3897     case PT_HP_CORE_UTSNAME:    return "HP_CORE_UTSNAME";
3898     case PT_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
3899     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
3900     case PT_PARISC_WEAKORDER:   return "PARISC_WEAKORDER";
3901     default:                    return NULL;
3902     }
3903 }
3904
3905 static const char *
3906 get_ia64_segment_type (unsigned long type)
3907 {
3908   switch (type)
3909     {
3910     case PT_IA_64_ARCHEXT:      return "IA_64_ARCHEXT";
3911     case PT_IA_64_UNWIND:       return "IA_64_UNWIND";
3912     case PT_HP_TLS:             return "HP_TLS";
3913     case PT_IA_64_HP_OPT_ANOT:  return "HP_OPT_ANNOT";
3914     case PT_IA_64_HP_HSL_ANOT:  return "HP_HSL_ANNOT";
3915     case PT_IA_64_HP_STACK:     return "HP_STACK";
3916     default:                    return NULL;
3917     }
3918 }
3919
3920 static const char *
3921 get_tic6x_segment_type (unsigned long type)
3922 {
3923   switch (type)
3924     {
3925     case PT_C6000_PHATTR:  return "C6000_PHATTR";
3926     default:               return NULL;
3927     }
3928 }
3929
3930 static const char *
3931 get_solaris_segment_type (unsigned long type)
3932 {
3933   switch (type)
3934     {
3935     case 0x6464e550: return "PT_SUNW_UNWIND";
3936     case 0x6474e550: return "PT_SUNW_EH_FRAME";
3937     case 0x6ffffff7: return "PT_LOSUNW";
3938     case 0x6ffffffa: return "PT_SUNWBSS";
3939     case 0x6ffffffb: return "PT_SUNWSTACK";
3940     case 0x6ffffffc: return "PT_SUNWDTRACE";
3941     case 0x6ffffffd: return "PT_SUNWCAP";
3942     case 0x6fffffff: return "PT_HISUNW";
3943     default:         return NULL;
3944     }
3945 }
3946
3947 static const char *
3948 get_segment_type (Filedata * filedata, unsigned long p_type)
3949 {
3950   static char buff[32];
3951
3952   switch (p_type)
3953     {
3954     case PT_NULL:       return "NULL";
3955     case PT_LOAD:       return "LOAD";
3956     case PT_DYNAMIC:    return "DYNAMIC";
3957     case PT_INTERP:     return "INTERP";
3958     case PT_NOTE:       return "NOTE";
3959     case PT_SHLIB:      return "SHLIB";
3960     case PT_PHDR:       return "PHDR";
3961     case PT_TLS:        return "TLS";
3962     case PT_GNU_EH_FRAME: return "GNU_EH_FRAME";
3963     case PT_GNU_STACK:  return "GNU_STACK";
3964     case PT_GNU_RELRO:  return "GNU_RELRO";
3965     case PT_GNU_PROPERTY: return "GNU_PROPERTY";
3966
3967     default:
3968       if (p_type >= PT_GNU_MBIND_LO && p_type <= PT_GNU_MBIND_HI)
3969         {
3970           sprintf (buff, "GNU_MBIND+%#lx",
3971                    p_type - PT_GNU_MBIND_LO);
3972         }
3973       else if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3974         {
3975           const char * result;
3976
3977           switch (filedata->file_header.e_machine)
3978             {
3979             case EM_AARCH64:
3980               result = get_aarch64_segment_type (p_type);
3981               break;
3982             case EM_ARM:
3983               result = get_arm_segment_type (p_type);
3984               break;
3985             case EM_MIPS:
3986             case EM_MIPS_RS3_LE:
3987               result = get_mips_segment_type (p_type);
3988               break;
3989             case EM_PARISC:
3990               result = get_parisc_segment_type (p_type);
3991               break;
3992             case EM_IA_64:
3993               result = get_ia64_segment_type (p_type);
3994               break;
3995             case EM_TI_C6000:
3996               result = get_tic6x_segment_type (p_type);
3997               break;
3998             case EM_S390:
3999             case EM_S390_OLD:
4000               result = get_s390_segment_type (p_type);
4001               break;
4002             default:
4003               result = NULL;
4004               break;
4005             }
4006
4007           if (result != NULL)
4008             return result;
4009
4010           sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
4011         }
4012       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
4013         {
4014           const char * result;
4015
4016           switch (filedata->file_header.e_machine)
4017             {
4018             case EM_PARISC:
4019               result = get_parisc_segment_type (p_type);
4020               break;
4021             case EM_IA_64:
4022               result = get_ia64_segment_type (p_type);
4023               break;
4024             default:
4025               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4026                 result = get_solaris_segment_type (p_type);
4027               else
4028                 result = NULL;
4029               break;
4030             }
4031
4032           if (result != NULL)
4033             return result;
4034
4035           sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
4036         }
4037       else
4038         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
4039
4040       return buff;
4041     }
4042 }
4043
4044 static const char *
4045 get_arc_section_type_name (unsigned int sh_type)
4046 {
4047   switch (sh_type)
4048     {
4049     case SHT_ARC_ATTRIBUTES:      return "ARC_ATTRIBUTES";
4050     default:
4051       break;
4052     }
4053   return NULL;
4054 }
4055
4056 static const char *
4057 get_mips_section_type_name (unsigned int sh_type)
4058 {
4059   switch (sh_type)
4060     {
4061     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
4062     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
4063     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
4064     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
4065     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
4066     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
4067     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
4068     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
4069     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
4070     case SHT_MIPS_RELD:          return "MIPS_RELD";
4071     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
4072     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
4073     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
4074     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
4075     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
4076     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
4077     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
4078     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
4079     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
4080     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
4081     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
4082     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
4083     case SHT_MIPS_LINE:          return "MIPS_LINE";
4084     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
4085     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
4086     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
4087     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
4088     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
4089     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
4090     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
4091     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
4092     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
4093     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
4094     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
4095     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
4096     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
4097     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
4098     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
4099     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
4100     case SHT_MIPS_ABIFLAGS:      return "MIPS_ABIFLAGS";
4101     default:
4102       break;
4103     }
4104   return NULL;
4105 }
4106
4107 static const char *
4108 get_parisc_section_type_name (unsigned int sh_type)
4109 {
4110   switch (sh_type)
4111     {
4112     case SHT_PARISC_EXT:        return "PARISC_EXT";
4113     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
4114     case SHT_PARISC_DOC:        return "PARISC_DOC";
4115     case SHT_PARISC_ANNOT:      return "PARISC_ANNOT";
4116     case SHT_PARISC_SYMEXTN:    return "PARISC_SYMEXTN";
4117     case SHT_PARISC_STUBS:      return "PARISC_STUBS";
4118     case SHT_PARISC_DLKM:       return "PARISC_DLKM";
4119     default:                    return NULL;
4120     }
4121 }
4122
4123 static const char *
4124 get_ia64_section_type_name (Filedata * filedata, unsigned int sh_type)
4125 {
4126   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
4127   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
4128     return get_osabi_name (filedata, (sh_type & 0x00FF0000) >> 16);
4129
4130   switch (sh_type)
4131     {
4132     case SHT_IA_64_EXT:                return "IA_64_EXT";
4133     case SHT_IA_64_UNWIND:             return "IA_64_UNWIND";
4134     case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
4135     case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
4136     case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
4137     case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
4138     case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
4139     case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
4140     case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
4141     case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
4142     default:
4143       break;
4144     }
4145   return NULL;
4146 }
4147
4148 static const char *
4149 get_x86_64_section_type_name (unsigned int sh_type)
4150 {
4151   switch (sh_type)
4152     {
4153     case SHT_X86_64_UNWIND:     return "X86_64_UNWIND";
4154     default:                    return NULL;
4155     }
4156 }
4157
4158 static const char *
4159 get_aarch64_section_type_name (unsigned int sh_type)
4160 {
4161   switch (sh_type)
4162     {
4163     case SHT_AARCH64_ATTRIBUTES: return "AARCH64_ATTRIBUTES";
4164     default:                     return NULL;
4165     }
4166 }
4167
4168 static const char *
4169 get_arm_section_type_name (unsigned int sh_type)
4170 {
4171   switch (sh_type)
4172     {
4173     case SHT_ARM_EXIDX:           return "ARM_EXIDX";
4174     case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
4175     case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
4176     case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
4177     case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
4178     default:                      return NULL;
4179     }
4180 }
4181
4182 static const char *
4183 get_tic6x_section_type_name (unsigned int sh_type)
4184 {
4185   switch (sh_type)
4186     {
4187     case SHT_C6000_UNWIND:      return "C6000_UNWIND";
4188     case SHT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
4189     case SHT_C6000_ATTRIBUTES:  return "C6000_ATTRIBUTES";
4190     case SHT_TI_ICODE:          return "TI_ICODE";
4191     case SHT_TI_XREF:           return "TI_XREF";
4192     case SHT_TI_HANDLER:        return "TI_HANDLER";
4193     case SHT_TI_INITINFO:       return "TI_INITINFO";
4194     case SHT_TI_PHATTRS:        return "TI_PHATTRS";
4195     default:                    return NULL;
4196     }
4197 }
4198
4199 static const char *
4200 get_msp430x_section_type_name (unsigned int sh_type)
4201 {
4202   switch (sh_type)
4203     {
4204     case SHT_MSP430_SEC_FLAGS:    return "MSP430_SEC_FLAGS";
4205     case SHT_MSP430_SYM_ALIASES:  return "MSP430_SYM_ALIASES";
4206     case SHT_MSP430_ATTRIBUTES:   return "MSP430_ATTRIBUTES";
4207     default:                      return NULL;
4208     }
4209 }
4210
4211 static const char *
4212 get_nfp_section_type_name (unsigned int sh_type)
4213 {
4214   switch (sh_type)
4215     {
4216     case SHT_NFP_MECONFIG:      return "NFP_MECONFIG";
4217     case SHT_NFP_INITREG:       return "NFP_INITREG";
4218     case SHT_NFP_UDEBUG:        return "NFP_UDEBUG";
4219     default:                    return NULL;
4220     }
4221 }
4222
4223 static const char *
4224 get_v850_section_type_name (unsigned int sh_type)
4225 {
4226   switch (sh_type)
4227     {
4228     case SHT_V850_SCOMMON:  return "V850 Small Common";
4229     case SHT_V850_TCOMMON:  return "V850 Tiny Common";
4230     case SHT_V850_ZCOMMON:  return "V850 Zero Common";
4231     case SHT_RENESAS_IOP:   return "RENESAS IOP";
4232     case SHT_RENESAS_INFO:  return "RENESAS INFO";
4233     default:                return NULL;
4234     }
4235 }
4236
4237 static const char *
4238 get_riscv_section_type_name (unsigned int sh_type)
4239 {
4240   switch (sh_type)
4241     {
4242     case SHT_RISCV_ATTRIBUTES:  return "RISCV_ATTRIBUTES";
4243     default: return NULL;
4244     }
4245 }
4246
4247 static const char *
4248 get_section_type_name (Filedata * filedata, unsigned int sh_type)
4249 {
4250   static char buff[32];
4251   const char * result;
4252
4253   switch (sh_type)
4254     {
4255     case SHT_NULL:              return "NULL";
4256     case SHT_PROGBITS:          return "PROGBITS";
4257     case SHT_SYMTAB:            return "SYMTAB";
4258     case SHT_STRTAB:            return "STRTAB";
4259     case SHT_RELA:              return "RELA";
4260     case SHT_HASH:              return "HASH";
4261     case SHT_DYNAMIC:           return "DYNAMIC";
4262     case SHT_NOTE:              return "NOTE";
4263     case SHT_NOBITS:            return "NOBITS";
4264     case SHT_REL:               return "REL";
4265     case SHT_SHLIB:             return "SHLIB";
4266     case SHT_DYNSYM:            return "DYNSYM";
4267     case SHT_INIT_ARRAY:        return "INIT_ARRAY";
4268     case SHT_FINI_ARRAY:        return "FINI_ARRAY";
4269     case SHT_PREINIT_ARRAY:     return "PREINIT_ARRAY";
4270     case SHT_GNU_HASH:          return "GNU_HASH";
4271     case SHT_GROUP:             return "GROUP";
4272     case SHT_SYMTAB_SHNDX:      return "SYMTAB SECTION INDICES";
4273     case SHT_GNU_verdef:        return "VERDEF";
4274     case SHT_GNU_verneed:       return "VERNEED";
4275     case SHT_GNU_versym:        return "VERSYM";
4276     case 0x6ffffff0:            return "VERSYM";
4277     case 0x6ffffffc:            return "VERDEF";
4278     case 0x7ffffffd:            return "AUXILIARY";
4279     case 0x7fffffff:            return "FILTER";
4280     case SHT_GNU_LIBLIST:       return "GNU_LIBLIST";
4281
4282     default:
4283       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4284         {
4285           switch (filedata->file_header.e_machine)
4286             {
4287             case EM_ARC:
4288             case EM_ARC_COMPACT:
4289             case EM_ARC_COMPACT2:
4290               result = get_arc_section_type_name (sh_type);
4291               break;
4292             case EM_MIPS:
4293             case EM_MIPS_RS3_LE:
4294               result = get_mips_section_type_name (sh_type);
4295               break;
4296             case EM_PARISC:
4297               result = get_parisc_section_type_name (sh_type);
4298               break;
4299             case EM_IA_64:
4300               result = get_ia64_section_type_name (filedata, sh_type);
4301               break;
4302             case EM_X86_64:
4303             case EM_L1OM:
4304             case EM_K1OM:
4305               result = get_x86_64_section_type_name (sh_type);
4306               break;
4307             case EM_AARCH64:
4308               result = get_aarch64_section_type_name (sh_type);
4309               break;
4310             case EM_ARM:
4311               result = get_arm_section_type_name (sh_type);
4312               break;
4313             case EM_TI_C6000:
4314               result = get_tic6x_section_type_name (sh_type);
4315               break;
4316             case EM_MSP430:
4317               result = get_msp430x_section_type_name (sh_type);
4318               break;
4319             case EM_NFP:
4320               result = get_nfp_section_type_name (sh_type);
4321               break;
4322             case EM_V800:
4323             case EM_V850:
4324             case EM_CYGNUS_V850:
4325               result = get_v850_section_type_name (sh_type);
4326               break;
4327             case EM_RISCV:
4328               result = get_riscv_section_type_name (sh_type);
4329               break;
4330             default:
4331               result = NULL;
4332               break;
4333             }
4334
4335           if (result != NULL)
4336             return result;
4337
4338           sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4339         }
4340       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4341         {
4342           switch (filedata->file_header.e_machine)
4343             {
4344             case EM_IA_64:
4345               result = get_ia64_section_type_name (filedata, sh_type);
4346               break;
4347             default:
4348               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4349                 result = get_solaris_section_type (sh_type);
4350               else
4351                 {
4352                   switch (sh_type)
4353                     {
4354                     case SHT_GNU_INCREMENTAL_INPUTS: result = "GNU_INCREMENTAL_INPUTS"; break;
4355                     case SHT_GNU_ATTRIBUTES: result = "GNU_ATTRIBUTES"; break;
4356                     case SHT_GNU_HASH: result = "GNU_HASH"; break;
4357                     case SHT_GNU_LIBLIST: result = "GNU_LIBLIST"; break;
4358                     default:
4359                       result = NULL;
4360                       break;
4361                     }
4362                 }
4363               break;
4364             }
4365
4366           if (result != NULL)
4367             return result;
4368
4369           sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4370         }
4371       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4372         {
4373           switch (filedata->file_header.e_machine)
4374             {
4375             case EM_V800:
4376             case EM_V850:
4377             case EM_CYGNUS_V850:
4378               result = get_v850_section_type_name (sh_type);
4379               break;
4380             default:
4381               result = NULL;
4382               break;
4383             }
4384
4385           if (result != NULL)
4386             return result;
4387
4388           sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4389         }
4390       else
4391         /* This message is probably going to be displayed in a 15
4392            character wide field, so put the hex value first.  */
4393         snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4394
4395       return buff;
4396     }
4397 }
4398
4399 #define OPTION_DEBUG_DUMP       512
4400 #define OPTION_DYN_SYMS         513
4401 #define OPTION_DWARF_DEPTH      514
4402 #define OPTION_DWARF_START      515
4403 #define OPTION_DWARF_CHECK      516
4404 #define OPTION_CTF_DUMP         517
4405 #define OPTION_CTF_PARENT       518
4406 #define OPTION_CTF_SYMBOLS      519
4407 #define OPTION_CTF_STRINGS      520
4408
4409 static struct option options[] =
4410 {
4411   {"all",              no_argument, 0, 'a'},
4412   {"file-header",      no_argument, 0, 'h'},
4413   {"program-headers",  no_argument, 0, 'l'},
4414   {"headers",          no_argument, 0, 'e'},
4415   {"histogram",        no_argument, 0, 'I'},
4416   {"segments",         no_argument, 0, 'l'},
4417   {"sections",         no_argument, 0, 'S'},
4418   {"section-headers",  no_argument, 0, 'S'},
4419   {"section-groups",   no_argument, 0, 'g'},
4420   {"section-details",  no_argument, 0, 't'},
4421   {"full-section-name",no_argument, 0, 'N'},
4422   {"symbols",          no_argument, 0, 's'},
4423   {"syms",             no_argument, 0, 's'},
4424   {"dyn-syms",         no_argument, 0, OPTION_DYN_SYMS},
4425   {"relocs",           no_argument, 0, 'r'},
4426   {"notes",            no_argument, 0, 'n'},
4427   {"dynamic",          no_argument, 0, 'd'},
4428   {"arch-specific",    no_argument, 0, 'A'},
4429   {"version-info",     no_argument, 0, 'V'},
4430   {"use-dynamic",      no_argument, 0, 'D'},
4431   {"unwind",           no_argument, 0, 'u'},
4432   {"archive-index",    no_argument, 0, 'c'},
4433   {"hex-dump",         required_argument, 0, 'x'},
4434   {"relocated-dump",   required_argument, 0, 'R'},
4435   {"string-dump",      required_argument, 0, 'p'},
4436   {"decompress",       no_argument, 0, 'z'},
4437 #ifdef SUPPORT_DISASSEMBLY
4438   {"instruction-dump", required_argument, 0, 'i'},
4439 #endif
4440   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
4441
4442   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
4443   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
4444   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
4445
4446   {"ctf",              required_argument, 0, OPTION_CTF_DUMP},
4447
4448   {"ctf-symbols",      required_argument, 0, OPTION_CTF_SYMBOLS},
4449   {"ctf-strings",      required_argument, 0, OPTION_CTF_STRINGS},
4450   {"ctf-parent",       required_argument, 0, OPTION_CTF_PARENT},
4451
4452   {"version",          no_argument, 0, 'v'},
4453   {"wide",             no_argument, 0, 'W'},
4454   {"help",             no_argument, 0, 'H'},
4455   {0,                  no_argument, 0, 0}
4456 };
4457
4458 static void
4459 usage (FILE * stream)
4460 {
4461   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4462   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4463   fprintf (stream, _(" Options are:\n\
4464   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4465   -h --file-header       Display the ELF file header\n\
4466   -l --program-headers   Display the program headers\n\
4467      --segments          An alias for --program-headers\n\
4468   -S --section-headers   Display the sections' header\n\
4469      --sections          An alias for --section-headers\n\
4470   -g --section-groups    Display the section groups\n\
4471   -t --section-details   Display the section details\n\
4472   -e --headers           Equivalent to: -h -l -S\n\
4473   -s --syms              Display the symbol table\n\
4474      --symbols           An alias for --syms\n\
4475   --dyn-syms             Display the dynamic symbol table\n\
4476   -n --notes             Display the core notes (if present)\n\
4477   -r --relocs            Display the relocations (if present)\n\
4478   -u --unwind            Display the unwind info (if present)\n\
4479   -d --dynamic           Display the dynamic section (if present)\n\
4480   -V --version-info      Display the version sections (if present)\n\
4481   -A --arch-specific     Display architecture specific information (if any)\n\
4482   -c --archive-index     Display the symbol/file index in an archive\n\
4483   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
4484   -x --hex-dump=<number|name>\n\
4485                          Dump the contents of section <number|name> as bytes\n\
4486   -p --string-dump=<number|name>\n\
4487                          Dump the contents of section <number|name> as strings\n\
4488   -R --relocated-dump=<number|name>\n\
4489                          Dump the contents of section <number|name> as relocated bytes\n\
4490   -z --decompress        Decompress section before dumping it\n\
4491   -w[lLiaprmfFsoRtUuTgAckK] or\n\
4492   --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4493                =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4494                =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4495                =addr,=cu_index,=links,=follow-links]\n\
4496                          Display the contents of DWARF debug sections\n"));
4497   fprintf (stream, _("\
4498   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
4499   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
4500                          or deeper\n"));
4501   fprintf (stream, _("\
4502   --ctf=<number|name>    Display CTF info from section <number|name>\n\
4503   --ctf-parent=<number|name>\n\
4504                          Use section <number|name> as the CTF parent\n\n\
4505   --ctf-symbols=<number|name>\n\
4506                          Use section <number|name> as the CTF external symtab\n\n\
4507   --ctf-strings=<number|name>\n\
4508                          Use section <number|name> as the CTF external strtab\n\n"));
4509
4510 #ifdef SUPPORT_DISASSEMBLY
4511   fprintf (stream, _("\
4512   -i --instruction-dump=<number|name>\n\
4513                          Disassemble the contents of section <number|name>\n"));
4514 #endif
4515   fprintf (stream, _("\
4516   -I --histogram         Display histogram of bucket list lengths\n\
4517   -W --wide              Allow output width to exceed 80 characters\n\
4518   @<file>                Read options from <file>\n\
4519   -H --help              Display this information\n\
4520   -v --version           Display the version number of readelf\n"));
4521
4522   if (REPORT_BUGS_TO[0] && stream == stdout)
4523     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4524
4525   exit (stream == stdout ? 0 : 1);
4526 }
4527
4528 /* Record the fact that the user wants the contents of section number
4529    SECTION to be displayed using the method(s) encoded as flags bits
4530    in TYPE.  Note, TYPE can be zero if we are creating the array for
4531    the first time.  */
4532
4533 static void
4534 request_dump_bynumber (Filedata * filedata, unsigned int section, dump_type type)
4535 {
4536   if (section >= filedata->num_dump_sects)
4537     {
4538       dump_type * new_dump_sects;
4539
4540       new_dump_sects = (dump_type *) calloc (section + 1,
4541                                              sizeof (* new_dump_sects));
4542
4543       if (new_dump_sects == NULL)
4544         error (_("Out of memory allocating dump request table.\n"));
4545       else
4546         {
4547           if (filedata->dump_sects)
4548             {
4549               /* Copy current flag settings.  */
4550               memcpy (new_dump_sects, filedata->dump_sects,
4551                       filedata->num_dump_sects * sizeof (* new_dump_sects));
4552
4553               free (filedata->dump_sects);
4554             }
4555
4556           filedata->dump_sects = new_dump_sects;
4557           filedata->num_dump_sects = section + 1;
4558         }
4559     }
4560
4561   if (filedata->dump_sects)
4562     filedata->dump_sects[section] |= type;
4563 }
4564
4565 /* Request a dump by section name.  */
4566
4567 static void
4568 request_dump_byname (const char * section, dump_type type)
4569 {
4570   struct dump_list_entry * new_request;
4571
4572   new_request = (struct dump_list_entry *)
4573       malloc (sizeof (struct dump_list_entry));
4574   if (!new_request)
4575     error (_("Out of memory allocating dump request table.\n"));
4576
4577   new_request->name = strdup (section);
4578   if (!new_request->name)
4579     error (_("Out of memory allocating dump request table.\n"));
4580
4581   new_request->type = type;
4582
4583   new_request->next = dump_sects_byname;
4584   dump_sects_byname = new_request;
4585 }
4586
4587 static inline void
4588 request_dump (Filedata * filedata, dump_type type)
4589 {
4590   int section;
4591   char * cp;
4592
4593   do_dump++;
4594   section = strtoul (optarg, & cp, 0);
4595
4596   if (! *cp && section >= 0)
4597     request_dump_bynumber (filedata, section, type);
4598   else
4599     request_dump_byname (optarg, type);
4600 }
4601
4602 static void
4603 parse_args (Filedata * filedata, int argc, char ** argv)
4604 {
4605   int c;
4606
4607   if (argc < 2)
4608     usage (stderr);
4609
4610   while ((c = getopt_long
4611           (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4612     {
4613       switch (c)
4614         {
4615         case 0:
4616           /* Long options.  */
4617           break;
4618         case 'H':
4619           usage (stdout);
4620           break;
4621
4622         case 'a':
4623           do_syms = TRUE;
4624           do_reloc = TRUE;
4625           do_unwind = TRUE;
4626           do_dynamic = TRUE;
4627           do_header = TRUE;
4628           do_sections = TRUE;
4629           do_section_groups = TRUE;
4630           do_segments = TRUE;
4631           do_version = TRUE;
4632           do_histogram = TRUE;
4633           do_arch = TRUE;
4634           do_notes = TRUE;
4635           break;
4636         case 'g':
4637           do_section_groups = TRUE;
4638           break;
4639         case 't':
4640         case 'N':
4641           do_sections = TRUE;
4642           do_section_details = TRUE;
4643           break;
4644         case 'e':
4645           do_header = TRUE;
4646           do_sections = TRUE;
4647           do_segments = TRUE;
4648           break;
4649         case 'A':
4650           do_arch = TRUE;
4651           break;
4652         case 'D':
4653           do_using_dynamic = TRUE;
4654           break;
4655         case 'r':
4656           do_reloc = TRUE;
4657           break;
4658         case 'u':
4659           do_unwind = TRUE;
4660           break;
4661         case 'h':
4662           do_header = TRUE;
4663           break;
4664         case 'l':
4665           do_segments = TRUE;
4666           break;
4667         case 's':
4668           do_syms = TRUE;
4669           break;
4670         case 'S':
4671           do_sections = TRUE;
4672           break;
4673         case 'd':
4674           do_dynamic = TRUE;
4675           break;
4676         case 'I':
4677           do_histogram = TRUE;
4678           break;
4679         case 'n':
4680           do_notes = TRUE;
4681           break;
4682         case 'c':
4683           do_archive_index = TRUE;
4684           break;
4685         case 'x':
4686           request_dump (filedata, HEX_DUMP);
4687           break;
4688         case 'p':
4689           request_dump (filedata, STRING_DUMP);
4690           break;
4691         case 'R':
4692           request_dump (filedata, RELOC_DUMP);
4693           break;
4694         case 'z':
4695           decompress_dumps = TRUE;
4696           break;
4697         case 'w':
4698           do_dump = TRUE;
4699           if (optarg == 0)
4700             {
4701               do_debugging = TRUE;
4702               dwarf_select_sections_all ();
4703             }
4704           else
4705             {
4706               do_debugging = FALSE;
4707               dwarf_select_sections_by_letters (optarg);
4708             }
4709           break;
4710         case OPTION_DEBUG_DUMP:
4711           do_dump = TRUE;
4712           if (optarg == 0)
4713             do_debugging = TRUE;
4714           else
4715             {
4716               do_debugging = FALSE;
4717               dwarf_select_sections_by_names (optarg);
4718             }
4719           break;
4720         case OPTION_DWARF_DEPTH:
4721           {
4722             char *cp;
4723
4724             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4725           }
4726           break;
4727         case OPTION_DWARF_START:
4728           {
4729             char *cp;
4730
4731             dwarf_start_die = strtoul (optarg, & cp, 0);
4732           }
4733           break;
4734         case OPTION_DWARF_CHECK:
4735           dwarf_check = TRUE;
4736           break;
4737         case OPTION_CTF_DUMP:
4738           do_ctf = TRUE;
4739           request_dump (filedata, CTF_DUMP);
4740           break;
4741         case OPTION_CTF_SYMBOLS:
4742           dump_ctf_symtab_name = strdup (optarg);
4743           break;
4744         case OPTION_CTF_STRINGS:
4745           dump_ctf_strtab_name = strdup (optarg);
4746           break;
4747         case OPTION_CTF_PARENT:
4748           dump_ctf_parent_name = strdup (optarg);
4749           break;
4750         case OPTION_DYN_SYMS:
4751           do_dyn_syms = TRUE;
4752           break;
4753 #ifdef SUPPORT_DISASSEMBLY
4754         case 'i':
4755           request_dump (filedata, DISASS_DUMP);
4756           break;
4757 #endif
4758         case 'v':
4759           print_version (program_name);
4760           break;
4761         case 'V':
4762           do_version = TRUE;
4763           break;
4764         case 'W':
4765           do_wide = TRUE;
4766           break;
4767         default:
4768           /* xgettext:c-format */
4769           error (_("Invalid option '-%c'\n"), c);
4770           /* Fall through.  */
4771         case '?':
4772           usage (stderr);
4773         }
4774     }
4775
4776   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4777       && !do_segments && !do_header && !do_dump && !do_version
4778       && !do_histogram && !do_debugging && !do_arch && !do_notes
4779       && !do_section_groups && !do_archive_index
4780       && !do_dyn_syms)
4781     usage (stderr);
4782 }
4783
4784 static const char *
4785 get_elf_class (unsigned int elf_class)
4786 {
4787   static char buff[32];
4788
4789   switch (elf_class)
4790     {
4791     case ELFCLASSNONE: return _("none");
4792     case ELFCLASS32:   return "ELF32";
4793     case ELFCLASS64:   return "ELF64";
4794     default:
4795       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4796       return buff;
4797     }
4798 }
4799
4800 static const char *
4801 get_data_encoding (unsigned int encoding)
4802 {
4803   static char buff[32];
4804
4805   switch (encoding)
4806     {
4807     case ELFDATANONE: return _("none");
4808     case ELFDATA2LSB: return _("2's complement, little endian");
4809     case ELFDATA2MSB: return _("2's complement, big endian");
4810     default:
4811       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4812       return buff;
4813     }
4814 }
4815
4816 /* Decode the data held in 'filedata->file_header'.  */
4817
4818 static bfd_boolean
4819 process_file_header (Filedata * filedata)
4820 {
4821   Elf_Internal_Ehdr * header = & filedata->file_header;
4822
4823   if (   header->e_ident[EI_MAG0] != ELFMAG0
4824       || header->e_ident[EI_MAG1] != ELFMAG1
4825       || header->e_ident[EI_MAG2] != ELFMAG2
4826       || header->e_ident[EI_MAG3] != ELFMAG3)
4827     {
4828       error
4829         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4830       return FALSE;
4831     }
4832
4833   init_dwarf_regnames (header->e_machine);
4834
4835   if (do_header)
4836     {
4837       unsigned i;
4838
4839       printf (_("ELF Header:\n"));
4840       printf (_("  Magic:   "));
4841       for (i = 0; i < EI_NIDENT; i++)
4842         printf ("%2.2x ", header->e_ident[i]);
4843       printf ("\n");
4844       printf (_("  Class:                             %s\n"),
4845               get_elf_class (header->e_ident[EI_CLASS]));
4846       printf (_("  Data:                              %s\n"),
4847               get_data_encoding (header->e_ident[EI_DATA]));
4848       printf (_("  Version:                           %d%s\n"),
4849               header->e_ident[EI_VERSION],
4850               (header->e_ident[EI_VERSION] == EV_CURRENT
4851                ? _(" (current)")
4852                : (header->e_ident[EI_VERSION] != EV_NONE
4853                   ? _(" <unknown>")
4854                   : "")));
4855       printf (_("  OS/ABI:                            %s\n"),
4856               get_osabi_name (filedata, header->e_ident[EI_OSABI]));
4857       printf (_("  ABI Version:                       %d\n"),
4858               header->e_ident[EI_ABIVERSION]);
4859       printf (_("  Type:                              %s\n"),
4860               get_file_type (header->e_type));
4861       printf (_("  Machine:                           %s\n"),
4862               get_machine_name (header->e_machine));
4863       printf (_("  Version:                           0x%lx\n"),
4864               header->e_version);
4865
4866       printf (_("  Entry point address:               "));
4867       print_vma (header->e_entry, PREFIX_HEX);
4868       printf (_("\n  Start of program headers:          "));
4869       print_vma (header->e_phoff, DEC);
4870       printf (_(" (bytes into file)\n  Start of section headers:          "));
4871       print_vma (header->e_shoff, DEC);
4872       printf (_(" (bytes into file)\n"));
4873
4874       printf (_("  Flags:                             0x%lx%s\n"),
4875               header->e_flags,
4876               get_machine_flags (filedata, header->e_flags, header->e_machine));
4877       printf (_("  Size of this header:               %u (bytes)\n"),
4878               header->e_ehsize);
4879       printf (_("  Size of program headers:           %u (bytes)\n"),
4880               header->e_phentsize);
4881       printf (_("  Number of program headers:         %u"),
4882               header->e_phnum);
4883       if (filedata->section_headers != NULL
4884           && header->e_phnum == PN_XNUM
4885           && filedata->section_headers[0].sh_info != 0)
4886         {
4887           header->e_phnum = filedata->section_headers[0].sh_info;
4888           printf (" (%u)", header->e_phnum);
4889         }
4890       putc ('\n', stdout);
4891       printf (_("  Size of section headers:           %u (bytes)\n"),
4892               header->e_shentsize);
4893       printf (_("  Number of section headers:         %u"),
4894               header->e_shnum);
4895       if (filedata->section_headers != NULL && header->e_shnum == SHN_UNDEF)
4896         {
4897           header->e_shnum = filedata->section_headers[0].sh_size;
4898           printf (" (%u)", header->e_shnum);
4899         }
4900       putc ('\n', stdout);
4901       printf (_("  Section header string table index: %u"),
4902               header->e_shstrndx);
4903       if (filedata->section_headers != NULL
4904           && header->e_shstrndx == (SHN_XINDEX & 0xffff))
4905         {
4906           header->e_shstrndx = filedata->section_headers[0].sh_link;
4907           printf (" (%u)", header->e_shstrndx);
4908         }
4909       if (header->e_shstrndx != SHN_UNDEF
4910           && header->e_shstrndx >= header->e_shnum)
4911         {
4912           header->e_shstrndx = SHN_UNDEF;
4913           printf (_(" <corrupt: out of range>"));
4914         }
4915       putc ('\n', stdout);
4916     }
4917
4918   if (filedata->section_headers != NULL)
4919     {
4920       if (header->e_phnum == PN_XNUM
4921           && filedata->section_headers[0].sh_info != 0)
4922         header->e_phnum = filedata->section_headers[0].sh_info;
4923       if (header->e_shnum == SHN_UNDEF)
4924         header->e_shnum = filedata->section_headers[0].sh_size;
4925       if (header->e_shstrndx == (SHN_XINDEX & 0xffff))
4926         header->e_shstrndx = filedata->section_headers[0].sh_link;
4927       if (header->e_shstrndx >= header->e_shnum)
4928         header->e_shstrndx = SHN_UNDEF;
4929       free (filedata->section_headers);
4930       filedata->section_headers = NULL;
4931     }
4932
4933   return TRUE;
4934 }
4935
4936 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4937    Returns TRUE upon success, FALSE otherwise.  Loads 32-bit headers.  */
4938
4939 static bfd_boolean
4940 get_32bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4941 {
4942   Elf32_External_Phdr * phdrs;
4943   Elf32_External_Phdr * external;
4944   Elf_Internal_Phdr *   internal;
4945   unsigned int i;
4946   unsigned int size = filedata->file_header.e_phentsize;
4947   unsigned int num  = filedata->file_header.e_phnum;
4948
4949   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4950   if (size == 0 || num == 0)
4951     return FALSE;
4952   if (size < sizeof * phdrs)
4953     {
4954       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4955       return FALSE;
4956     }
4957   if (size > sizeof * phdrs)
4958     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4959
4960   phdrs = (Elf32_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4961                                             size, num, _("program headers"));
4962   if (phdrs == NULL)
4963     return FALSE;
4964
4965   for (i = 0, internal = pheaders, external = phdrs;
4966        i < filedata->file_header.e_phnum;
4967        i++, internal++, external++)
4968     {
4969       internal->p_type   = BYTE_GET (external->p_type);
4970       internal->p_offset = BYTE_GET (external->p_offset);
4971       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4972       internal->p_paddr  = BYTE_GET (external->p_paddr);
4973       internal->p_filesz = BYTE_GET (external->p_filesz);
4974       internal->p_memsz  = BYTE_GET (external->p_memsz);
4975       internal->p_flags  = BYTE_GET (external->p_flags);
4976       internal->p_align  = BYTE_GET (external->p_align);
4977     }
4978
4979   free (phdrs);
4980   return TRUE;
4981 }
4982
4983 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4984    Returns TRUE upon success, FALSE otherwise.  Loads 64-bit headers.  */
4985
4986 static bfd_boolean
4987 get_64bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4988 {
4989   Elf64_External_Phdr * phdrs;
4990   Elf64_External_Phdr * external;
4991   Elf_Internal_Phdr *   internal;
4992   unsigned int i;
4993   unsigned int size = filedata->file_header.e_phentsize;
4994   unsigned int num  = filedata->file_header.e_phnum;
4995
4996   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4997   if (size == 0 || num == 0)
4998     return FALSE;
4999   if (size < sizeof * phdrs)
5000     {
5001       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
5002       return FALSE;
5003     }
5004   if (size > sizeof * phdrs)
5005     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
5006
5007   phdrs = (Elf64_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
5008                                             size, num, _("program headers"));
5009   if (!phdrs)
5010     return FALSE;
5011
5012   for (i = 0, internal = pheaders, external = phdrs;
5013        i < filedata->file_header.e_phnum;
5014        i++, internal++, external++)
5015     {
5016       internal->p_type   = BYTE_GET (external->p_type);
5017       internal->p_flags  = BYTE_GET (external->p_flags);
5018       internal->p_offset = BYTE_GET (external->p_offset);
5019       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
5020       internal->p_paddr  = BYTE_GET (external->p_paddr);
5021       internal->p_filesz = BYTE_GET (external->p_filesz);
5022       internal->p_memsz  = BYTE_GET (external->p_memsz);
5023       internal->p_align  = BYTE_GET (external->p_align);
5024     }
5025
5026   free (phdrs);
5027   return TRUE;
5028 }
5029
5030 /* Returns TRUE if the program headers were read into `program_headers'.  */
5031
5032 static bfd_boolean
5033 get_program_headers (Filedata * filedata)
5034 {
5035   Elf_Internal_Phdr * phdrs;
5036
5037   /* Check cache of prior read.  */
5038   if (filedata->program_headers != NULL)
5039     return TRUE;
5040
5041   /* Be kind to memory checkers by looking for
5042      e_phnum values which we know must be invalid.  */
5043   if (filedata->file_header.e_phnum
5044       * (is_32bit_elf ? sizeof (Elf32_External_Phdr) : sizeof (Elf64_External_Phdr))
5045       >= filedata->file_size)
5046     {
5047       error (_("Too many program headers - %#x - the file is not that big\n"),
5048              filedata->file_header.e_phnum);
5049       return FALSE;
5050     }
5051
5052   phdrs = (Elf_Internal_Phdr *) cmalloc (filedata->file_header.e_phnum,
5053                                          sizeof (Elf_Internal_Phdr));
5054   if (phdrs == NULL)
5055     {
5056       error (_("Out of memory reading %u program headers\n"),
5057              filedata->file_header.e_phnum);
5058       return FALSE;
5059     }
5060
5061   if (is_32bit_elf
5062       ? get_32bit_program_headers (filedata, phdrs)
5063       : get_64bit_program_headers (filedata, phdrs))
5064     {
5065       filedata->program_headers = phdrs;
5066       return TRUE;
5067     }
5068
5069   free (phdrs);
5070   return FALSE;
5071 }
5072
5073 /* Returns TRUE if the program headers were loaded.  */
5074
5075 static bfd_boolean
5076 process_program_headers (Filedata * filedata)
5077 {
5078   Elf_Internal_Phdr * segment;
5079   unsigned int i;
5080   Elf_Internal_Phdr * previous_load = NULL;
5081
5082   if (filedata->file_header.e_phnum == 0)
5083     {
5084       /* PR binutils/12467.  */
5085       if (filedata->file_header.e_phoff != 0)
5086         {
5087           warn (_("possibly corrupt ELF header - it has a non-zero program"
5088                   " header offset, but no program headers\n"));
5089           return FALSE;
5090         }
5091       else if (do_segments)
5092         printf (_("\nThere are no program headers in this file.\n"));
5093       return TRUE;
5094     }
5095
5096   if (do_segments && !do_header)
5097     {
5098       printf (_("\nElf file type is %s\n"), get_file_type (filedata->file_header.e_type));
5099       printf (_("Entry point 0x%s\n"), bfd_vmatoa ("x", filedata->file_header.e_entry));
5100       printf (ngettext ("There is %d program header, starting at offset %s\n",
5101                         "There are %d program headers, starting at offset %s\n",
5102                         filedata->file_header.e_phnum),
5103               filedata->file_header.e_phnum,
5104               bfd_vmatoa ("u", filedata->file_header.e_phoff));
5105     }
5106
5107   if (! get_program_headers (filedata))
5108     return TRUE;
5109
5110   if (do_segments)
5111     {
5112       if (filedata->file_header.e_phnum > 1)
5113         printf (_("\nProgram Headers:\n"));
5114       else
5115         printf (_("\nProgram Headers:\n"));
5116
5117       if (is_32bit_elf)
5118         printf
5119           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
5120       else if (do_wide)
5121         printf
5122           (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
5123       else
5124         {
5125           printf
5126             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
5127           printf
5128             (_("                 FileSiz            MemSiz              Flags  Align\n"));
5129         }
5130     }
5131
5132   dynamic_addr = 0;
5133   dynamic_size = 0;
5134
5135   for (i = 0, segment = filedata->program_headers;
5136        i < filedata->file_header.e_phnum;
5137        i++, segment++)
5138     {
5139       if (do_segments)
5140         {
5141           printf ("  %-14.14s ", get_segment_type (filedata, segment->p_type));
5142
5143           if (is_32bit_elf)
5144             {
5145               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5146               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
5147               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
5148               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
5149               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
5150               printf ("%c%c%c ",
5151                       (segment->p_flags & PF_R ? 'R' : ' '),
5152                       (segment->p_flags & PF_W ? 'W' : ' '),
5153                       (segment->p_flags & PF_X ? 'E' : ' '));
5154               printf ("%#lx", (unsigned long) segment->p_align);
5155             }
5156           else if (do_wide)
5157             {
5158               if ((unsigned long) segment->p_offset == segment->p_offset)
5159                 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5160               else
5161                 {
5162                   print_vma (segment->p_offset, FULL_HEX);
5163                   putchar (' ');
5164                 }
5165
5166               print_vma (segment->p_vaddr, FULL_HEX);
5167               putchar (' ');
5168               print_vma (segment->p_paddr, FULL_HEX);
5169               putchar (' ');
5170
5171               if ((unsigned long) segment->p_filesz == segment->p_filesz)
5172                 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
5173               else
5174                 {
5175                   print_vma (segment->p_filesz, FULL_HEX);
5176                   putchar (' ');
5177                 }
5178
5179               if ((unsigned long) segment->p_memsz == segment->p_memsz)
5180                 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
5181               else
5182                 {
5183                   print_vma (segment->p_memsz, FULL_HEX);
5184                 }
5185
5186               printf (" %c%c%c ",
5187                       (segment->p_flags & PF_R ? 'R' : ' '),
5188                       (segment->p_flags & PF_W ? 'W' : ' '),
5189                       (segment->p_flags & PF_X ? 'E' : ' '));
5190
5191               if ((unsigned long) segment->p_align == segment->p_align)
5192                 printf ("%#lx", (unsigned long) segment->p_align);
5193               else
5194                 {
5195                   print_vma (segment->p_align, PREFIX_HEX);
5196                 }
5197             }
5198           else
5199             {
5200               print_vma (segment->p_offset, FULL_HEX);
5201               putchar (' ');
5202               print_vma (segment->p_vaddr, FULL_HEX);
5203               putchar (' ');
5204               print_vma (segment->p_paddr, FULL_HEX);
5205               printf ("\n                 ");
5206               print_vma (segment->p_filesz, FULL_HEX);
5207               putchar (' ');
5208               print_vma (segment->p_memsz, FULL_HEX);
5209               printf ("  %c%c%c    ",
5210                       (segment->p_flags & PF_R ? 'R' : ' '),
5211                       (segment->p_flags & PF_W ? 'W' : ' '),
5212                       (segment->p_flags & PF_X ? 'E' : ' '));
5213               print_vma (segment->p_align, PREFIX_HEX);
5214             }
5215
5216           putc ('\n', stdout);
5217         }
5218
5219       switch (segment->p_type)
5220         {
5221         case PT_LOAD:
5222 #if 0 /* Do not warn about out of order PT_LOAD segments.  Although officially
5223          required by the ELF standard, several programs, including the Linux
5224          kernel, make use of non-ordered segments.  */
5225           if (previous_load
5226               && previous_load->p_vaddr > segment->p_vaddr)
5227             error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
5228 #endif
5229           if (segment->p_memsz < segment->p_filesz)
5230             error (_("the segment's file size is larger than its memory size\n"));
5231           previous_load = segment;
5232           break;
5233
5234         case PT_PHDR:
5235           /* PR 20815 - Verify that the program header is loaded into memory.  */
5236           if (i > 0 && previous_load != NULL)
5237             error (_("the PHDR segment must occur before any LOAD segment\n"));
5238           if (filedata->file_header.e_machine != EM_PARISC)
5239             {
5240               unsigned int j;
5241
5242               for (j = 1; j < filedata->file_header.e_phnum; j++)
5243                 if (filedata->program_headers[j].p_vaddr <= segment->p_vaddr
5244                     && (filedata->program_headers[j].p_vaddr
5245                         + filedata->program_headers[j].p_memsz)
5246                     >= (segment->p_vaddr + segment->p_filesz))
5247                   break;
5248               if (j == filedata->file_header.e_phnum)
5249                 error (_("the PHDR segment is not covered by a LOAD segment\n"));
5250             }
5251           break;
5252
5253         case PT_DYNAMIC:
5254           if (dynamic_addr)
5255             error (_("more than one dynamic segment\n"));
5256
5257           /* By default, assume that the .dynamic section is the first
5258              section in the DYNAMIC segment.  */
5259           dynamic_addr = segment->p_offset;
5260           dynamic_size = segment->p_filesz;
5261
5262           /* Try to locate the .dynamic section. If there is
5263              a section header table, we can easily locate it.  */
5264           if (filedata->section_headers != NULL)
5265             {
5266               Elf_Internal_Shdr * sec;
5267
5268               sec = find_section (filedata, ".dynamic");
5269               if (sec == NULL || sec->sh_size == 0)
5270                 {
5271                   /* A corresponding .dynamic section is expected, but on
5272                      IA-64/OpenVMS it is OK for it to be missing.  */
5273                   if (!is_ia64_vms (filedata))
5274                     error (_("no .dynamic section in the dynamic segment\n"));
5275                   break;
5276                 }
5277
5278               if (sec->sh_type == SHT_NOBITS)
5279                 {
5280                   dynamic_size = 0;
5281                   break;
5282                 }
5283
5284               dynamic_addr = sec->sh_offset;
5285               dynamic_size = sec->sh_size;
5286
5287               if (dynamic_addr < segment->p_offset
5288                   || dynamic_addr > segment->p_offset + segment->p_filesz)
5289                 warn (_("the .dynamic section is not contained"
5290                         " within the dynamic segment\n"));
5291               else if (dynamic_addr > segment->p_offset)
5292                 warn (_("the .dynamic section is not the first section"
5293                         " in the dynamic segment.\n"));
5294             }
5295
5296           /* PR binutils/17512: Avoid corrupt dynamic section info in the
5297              segment.  Check this after matching against the section headers
5298              so we don't warn on debuginfo file (which have NOBITS .dynamic
5299              sections).  */
5300           if (dynamic_addr > filedata->file_size
5301               || dynamic_size > filedata->file_size - dynamic_addr)
5302             {
5303               error (_("the dynamic segment offset + size exceeds the size of the file\n"));
5304               dynamic_addr = dynamic_size = 0;
5305             }
5306           break;
5307
5308         case PT_INTERP:
5309           if (fseek (filedata->handle, archive_file_offset + (long) segment->p_offset,
5310                      SEEK_SET))
5311             error (_("Unable to find program interpreter name\n"));
5312           else
5313             {
5314               char fmt [32];
5315               int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
5316
5317               if (ret >= (int) sizeof (fmt) || ret < 0)
5318                 error (_("Internal error: failed to create format string to display program interpreter\n"));
5319
5320               program_interpreter[0] = 0;
5321               if (fscanf (filedata->handle, fmt, program_interpreter) <= 0)
5322                 error (_("Unable to read program interpreter name\n"));
5323
5324               if (do_segments)
5325                 printf (_("      [Requesting program interpreter: %s]\n"),
5326                     program_interpreter);
5327             }
5328           break;
5329         }
5330     }
5331
5332   if (do_segments
5333       && filedata->section_headers != NULL
5334       && filedata->string_table != NULL)
5335     {
5336       printf (_("\n Section to Segment mapping:\n"));
5337       printf (_("  Segment Sections...\n"));
5338
5339       for (i = 0; i < filedata->file_header.e_phnum; i++)
5340         {
5341           unsigned int j;
5342           Elf_Internal_Shdr * section;
5343
5344           segment = filedata->program_headers + i;
5345           section = filedata->section_headers + 1;
5346
5347           printf ("   %2.2d     ", i);
5348
5349           for (j = 1; j < filedata->file_header.e_shnum; j++, section++)
5350             {
5351               if (!ELF_TBSS_SPECIAL (section, segment)
5352                   && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
5353                 printf ("%s ", printable_section_name (filedata, section));
5354             }
5355
5356           putc ('\n',stdout);
5357         }
5358     }
5359
5360   return TRUE;
5361 }
5362
5363
5364 /* Find the file offset corresponding to VMA by using the program headers.  */
5365
5366 static long
5367 offset_from_vma (Filedata * filedata, bfd_vma vma, bfd_size_type size)
5368 {
5369   Elf_Internal_Phdr * seg;
5370
5371   if (! get_program_headers (filedata))
5372     {
5373       warn (_("Cannot interpret virtual addresses without program headers.\n"));
5374       return (long) vma;
5375     }
5376
5377   for (seg = filedata->program_headers;
5378        seg < filedata->program_headers + filedata->file_header.e_phnum;
5379        ++seg)
5380     {
5381       if (seg->p_type != PT_LOAD)
5382         continue;
5383
5384       if (vma >= (seg->p_vaddr & -seg->p_align)
5385           && vma + size <= seg->p_vaddr + seg->p_filesz)
5386         return vma - seg->p_vaddr + seg->p_offset;
5387     }
5388
5389   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
5390         (unsigned long) vma);
5391   return (long) vma;
5392 }
5393
5394
5395 /* Allocate memory and load the sections headers into FILEDATA->filedata->section_headers.
5396    If PROBE is true, this is just a probe and we do not generate any error
5397    messages if the load fails.  */
5398
5399 static bfd_boolean
5400 get_32bit_section_headers (Filedata * filedata, bfd_boolean probe)
5401 {
5402   Elf32_External_Shdr * shdrs;
5403   Elf_Internal_Shdr *   internal;
5404   unsigned int          i;
5405   unsigned int          size = filedata->file_header.e_shentsize;
5406   unsigned int          num = probe ? 1 : filedata->file_header.e_shnum;
5407
5408   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5409   if (size == 0 || num == 0)
5410     return FALSE;
5411   if (size < sizeof * shdrs)
5412     {
5413       if (! probe)
5414         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5415       return FALSE;
5416     }
5417   if (!probe && size > sizeof * shdrs)
5418     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5419
5420   shdrs = (Elf32_External_Shdr *) get_data (NULL, filedata, filedata->file_header.e_shoff,
5421                                             size, num,
5422                                             probe ? NULL : _("section headers"));
5423   if (shdrs == NULL)
5424     return FALSE;
5425
5426   free (filedata->section_headers);
5427   filedata->section_headers = (Elf_Internal_Shdr *)
5428     cmalloc (num, sizeof (Elf_Internal_Shdr));
5429   if (filedata->section_headers == NULL)
5430     {
5431       if (!probe)
5432         error (_("Out of memory reading %u section headers\n"), num);
5433       free (shdrs);
5434       return FALSE;
5435     }
5436
5437   for (i = 0, internal = filedata->section_headers;
5438        i < num;
5439        i++, internal++)
5440     {
5441       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5442       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5443       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5444       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5445       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5446       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5447       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5448       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5449       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5450       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5451       if (!probe && internal->sh_link > num)
5452         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5453       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5454         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5455     }
5456
5457   free (shdrs);
5458   return TRUE;
5459 }
5460
5461 /* Like get_32bit_section_headers, except that it fetches 64-bit headers.  */
5462
5463 static bfd_boolean
5464 get_64bit_section_headers (Filedata * filedata, bfd_boolean probe)
5465 {
5466   Elf64_External_Shdr *  shdrs;
5467   Elf_Internal_Shdr *    internal;
5468   unsigned int           i;
5469   unsigned int           size = filedata->file_header.e_shentsize;
5470   unsigned int           num = probe ? 1 : filedata->file_header.e_shnum;
5471
5472   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5473   if (size == 0 || num == 0)
5474     return FALSE;
5475
5476   if (size < sizeof * shdrs)
5477     {
5478       if (! probe)
5479         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5480       return FALSE;
5481     }
5482
5483   if (! probe && size > sizeof * shdrs)
5484     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5485
5486   shdrs = (Elf64_External_Shdr *) get_data (NULL, filedata,
5487                                             filedata->file_header.e_shoff,
5488                                             size, num,
5489                                             probe ? NULL : _("section headers"));
5490   if (shdrs == NULL)
5491     return FALSE;
5492
5493   free (filedata->section_headers);
5494   filedata->section_headers = (Elf_Internal_Shdr *)
5495     cmalloc (num, sizeof (Elf_Internal_Shdr));
5496   if (filedata->section_headers == NULL)
5497     {
5498       if (! probe)
5499         error (_("Out of memory reading %u section headers\n"), num);
5500       free (shdrs);
5501       return FALSE;
5502     }
5503
5504   for (i = 0, internal = filedata->section_headers;
5505        i < num;
5506        i++, internal++)
5507     {
5508       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5509       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5510       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5511       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5512       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5513       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5514       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5515       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5516       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5517       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5518       if (!probe && internal->sh_link > num)
5519         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5520       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5521         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5522     }
5523
5524   free (shdrs);
5525   return TRUE;
5526 }
5527
5528 static Elf_Internal_Sym *
5529 get_32bit_elf_symbols (Filedata *           filedata,
5530                        Elf_Internal_Shdr *  section,
5531                        unsigned long *      num_syms_return)
5532 {
5533   unsigned long number = 0;
5534   Elf32_External_Sym * esyms = NULL;
5535   Elf_External_Sym_Shndx * shndx = NULL;
5536   Elf_Internal_Sym * isyms = NULL;
5537   Elf_Internal_Sym * psym;
5538   unsigned int j;
5539   elf_section_list * entry;
5540
5541   if (section->sh_size == 0)
5542     {
5543       if (num_syms_return != NULL)
5544         * num_syms_return = 0;
5545       return NULL;
5546     }
5547
5548   /* Run some sanity checks first.  */
5549   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5550     {
5551       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5552              printable_section_name (filedata, section),
5553              (unsigned long) section->sh_entsize);
5554       goto exit_point;
5555     }
5556
5557   if (section->sh_size > filedata->file_size)
5558     {
5559       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5560              printable_section_name (filedata, section),
5561              (unsigned long) section->sh_size);
5562       goto exit_point;
5563     }
5564
5565   number = section->sh_size / section->sh_entsize;
5566
5567   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5568     {
5569       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5570              (unsigned long) section->sh_size,
5571              printable_section_name (filedata, section),
5572              (unsigned long) section->sh_entsize);
5573       goto exit_point;
5574     }
5575
5576   esyms = (Elf32_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5577                                            section->sh_size, _("symbols"));
5578   if (esyms == NULL)
5579     goto exit_point;
5580
5581   shndx = NULL;
5582   for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5583     {
5584       if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5585         continue;
5586
5587       if (shndx != NULL)
5588         {
5589           error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5590           free (shndx);
5591         }
5592
5593       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5594                                                    entry->hdr->sh_offset,
5595                                                    1, entry->hdr->sh_size,
5596                                                    _("symbol table section indices"));
5597       if (shndx == NULL)
5598         goto exit_point;
5599
5600       /* PR17531: file: heap-buffer-overflow */
5601       if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5602         {
5603           error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5604                  printable_section_name (filedata, entry->hdr),
5605                  (unsigned long) entry->hdr->sh_size,
5606                  (unsigned long) section->sh_size);
5607           goto exit_point;
5608         }
5609     }
5610
5611   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5612
5613   if (isyms == NULL)
5614     {
5615       error (_("Out of memory reading %lu symbols\n"),
5616              (unsigned long) number);
5617       goto exit_point;
5618     }
5619
5620   for (j = 0, psym = isyms; j < number; j++, psym++)
5621     {
5622       psym->st_name  = BYTE_GET (esyms[j].st_name);
5623       psym->st_value = BYTE_GET (esyms[j].st_value);
5624       psym->st_size  = BYTE_GET (esyms[j].st_size);
5625       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5626       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5627         psym->st_shndx
5628           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5629       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5630         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5631       psym->st_info  = BYTE_GET (esyms[j].st_info);
5632       psym->st_other = BYTE_GET (esyms[j].st_other);
5633     }
5634
5635  exit_point:
5636   free (shndx);
5637   free (esyms);
5638
5639   if (num_syms_return != NULL)
5640     * num_syms_return = isyms == NULL ? 0 : number;
5641
5642   return isyms;
5643 }
5644
5645 static Elf_Internal_Sym *
5646 get_64bit_elf_symbols (Filedata *           filedata,
5647                        Elf_Internal_Shdr *  section,
5648                        unsigned long *      num_syms_return)
5649 {
5650   unsigned long number = 0;
5651   Elf64_External_Sym * esyms = NULL;
5652   Elf_External_Sym_Shndx * shndx = NULL;
5653   Elf_Internal_Sym * isyms = NULL;
5654   Elf_Internal_Sym * psym;
5655   unsigned int j;
5656   elf_section_list * entry;
5657
5658   if (section->sh_size == 0)
5659     {
5660       if (num_syms_return != NULL)
5661         * num_syms_return = 0;
5662       return NULL;
5663     }
5664
5665   /* Run some sanity checks first.  */
5666   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5667     {
5668       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5669              printable_section_name (filedata, section),
5670              (unsigned long) section->sh_entsize);
5671       goto exit_point;
5672     }
5673
5674   if (section->sh_size > filedata->file_size)
5675     {
5676       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5677              printable_section_name (filedata, section),
5678              (unsigned long) section->sh_size);
5679       goto exit_point;
5680     }
5681
5682   number = section->sh_size / section->sh_entsize;
5683
5684   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5685     {
5686       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5687              (unsigned long) section->sh_size,
5688              printable_section_name (filedata, section),
5689              (unsigned long) section->sh_entsize);
5690       goto exit_point;
5691     }
5692
5693   esyms = (Elf64_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5694                                            section->sh_size, _("symbols"));
5695   if (!esyms)
5696     goto exit_point;
5697
5698   shndx = NULL;
5699   for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5700     {
5701       if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5702         continue;
5703
5704       if (shndx != NULL)
5705         {
5706           error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5707           free (shndx);
5708         }
5709
5710       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5711                                                    entry->hdr->sh_offset,
5712                                                    1, entry->hdr->sh_size,
5713                                                    _("symbol table section indices"));
5714       if (shndx == NULL)
5715         goto exit_point;
5716
5717       /* PR17531: file: heap-buffer-overflow */
5718       if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5719         {
5720           error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5721                  printable_section_name (filedata, entry->hdr),
5722                  (unsigned long) entry->hdr->sh_size,
5723                  (unsigned long) section->sh_size);
5724           goto exit_point;
5725         }
5726     }
5727
5728   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5729
5730   if (isyms == NULL)
5731     {
5732       error (_("Out of memory reading %lu symbols\n"),
5733              (unsigned long) number);
5734       goto exit_point;
5735     }
5736
5737   for (j = 0, psym = isyms; j < number; j++, psym++)
5738     {
5739       psym->st_name  = BYTE_GET (esyms[j].st_name);
5740       psym->st_info  = BYTE_GET (esyms[j].st_info);
5741       psym->st_other = BYTE_GET (esyms[j].st_other);
5742       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5743
5744       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5745         psym->st_shndx
5746           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5747       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5748         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5749
5750       psym->st_value = BYTE_GET (esyms[j].st_value);
5751       psym->st_size  = BYTE_GET (esyms[j].st_size);
5752     }
5753
5754  exit_point:
5755   free (shndx);
5756   free (esyms);
5757
5758   if (num_syms_return != NULL)
5759     * num_syms_return = isyms == NULL ? 0 : number;
5760
5761   return isyms;
5762 }
5763
5764 static const char *
5765 get_elf_section_flags (Filedata * filedata, bfd_vma sh_flags)
5766 {
5767   static char buff[1024];
5768   char * p = buff;
5769   unsigned int field_size = is_32bit_elf ? 8 : 16;
5770   signed int sindex;
5771   unsigned int size = sizeof (buff) - (field_size + 4 + 1);
5772   bfd_vma os_flags = 0;
5773   bfd_vma proc_flags = 0;
5774   bfd_vma unknown_flags = 0;
5775   static const struct
5776     {
5777       const char * str;
5778       unsigned int len;
5779     }
5780   flags [] =
5781     {
5782       /*  0 */ { STRING_COMMA_LEN ("WRITE") },
5783       /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
5784       /*  2 */ { STRING_COMMA_LEN ("EXEC") },
5785       /*  3 */ { STRING_COMMA_LEN ("MERGE") },
5786       /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
5787       /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
5788       /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5789       /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5790       /*  8 */ { STRING_COMMA_LEN ("GROUP") },
5791       /*  9 */ { STRING_COMMA_LEN ("TLS") },
5792       /* IA-64 specific.  */
5793       /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5794       /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5795       /* IA-64 OpenVMS specific.  */
5796       /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5797       /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5798       /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5799       /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5800       /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5801       /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5802       /* Generic.  */
5803       /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5804       /* SPARC specific.  */
5805       /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5806       /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5807       /* ARM specific.  */
5808       /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5809       /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5810       /* 23 */ { STRING_COMMA_LEN ("COMDEF") },
5811       /* GNU specific.  */
5812       /* 24 */ { STRING_COMMA_LEN ("GNU_MBIND") },
5813       /* VLE specific.  */
5814       /* 25 */ { STRING_COMMA_LEN ("VLE") },
5815     };
5816
5817   if (do_section_details)
5818     {
5819       sprintf (buff, "[%*.*lx]: ",
5820                field_size, field_size, (unsigned long) sh_flags);
5821       p += field_size + 4;
5822     }
5823
5824   while (sh_flags)
5825     {
5826       bfd_vma flag;
5827
5828       flag = sh_flags & - sh_flags;
5829       sh_flags &= ~ flag;
5830
5831       if (do_section_details)
5832         {
5833           switch (flag)
5834             {
5835             case SHF_WRITE:             sindex = 0; break;
5836             case SHF_ALLOC:             sindex = 1; break;
5837             case SHF_EXECINSTR:         sindex = 2; break;
5838             case SHF_MERGE:             sindex = 3; break;
5839             case SHF_STRINGS:           sindex = 4; break;
5840             case SHF_INFO_LINK:         sindex = 5; break;
5841             case SHF_LINK_ORDER:        sindex = 6; break;
5842             case SHF_OS_NONCONFORMING:  sindex = 7; break;
5843             case SHF_GROUP:             sindex = 8; break;
5844             case SHF_TLS:               sindex = 9; break;
5845             case SHF_EXCLUDE:           sindex = 18; break;
5846             case SHF_COMPRESSED:        sindex = 20; break;
5847             case SHF_GNU_MBIND:         sindex = 24; break;
5848
5849             default:
5850               sindex = -1;
5851               switch (filedata->file_header.e_machine)
5852                 {
5853                 case EM_IA_64:
5854                   if (flag == SHF_IA_64_SHORT)
5855                     sindex = 10;
5856                   else if (flag == SHF_IA_64_NORECOV)
5857                     sindex = 11;
5858 #ifdef BFD64
5859                   else if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5860                     switch (flag)
5861                       {
5862                       case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
5863                       case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
5864                       case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
5865                       case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
5866                       case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5867                       case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
5868                       default:                        break;
5869                       }
5870 #endif
5871                   break;
5872
5873                 case EM_386:
5874                 case EM_IAMCU:
5875                 case EM_X86_64:
5876                 case EM_L1OM:
5877                 case EM_K1OM:
5878                 case EM_OLD_SPARCV9:
5879                 case EM_SPARC32PLUS:
5880                 case EM_SPARCV9:
5881                 case EM_SPARC:
5882                   if (flag == SHF_ORDERED)
5883                     sindex = 19;
5884                   break;
5885
5886                 case EM_ARM:
5887                   switch (flag)
5888                     {
5889                     case SHF_ENTRYSECT: sindex = 21; break;
5890                     case SHF_ARM_PURECODE: sindex = 22; break;
5891                     case SHF_COMDEF: sindex = 23; break;
5892                     default: break;
5893                     }
5894                   break;
5895                 case EM_PPC:
5896                   if (flag == SHF_PPC_VLE)
5897                     sindex = 25;
5898                   break;
5899
5900                 default:
5901                   break;
5902                 }
5903             }
5904
5905           if (sindex != -1)
5906             {
5907               if (p != buff + field_size + 4)
5908                 {
5909                   if (size < (10 + 2))
5910                     {
5911                       warn (_("Internal error: not enough buffer room for section flag info"));
5912                       return _("<unknown>");
5913                     }
5914                   size -= 2;
5915                   *p++ = ',';
5916                   *p++ = ' ';
5917                 }
5918
5919               size -= flags [sindex].len;
5920               p = stpcpy (p, flags [sindex].str);
5921             }
5922           else if (flag & SHF_MASKOS)
5923             os_flags |= flag;
5924           else if (flag & SHF_MASKPROC)
5925             proc_flags |= flag;
5926           else
5927             unknown_flags |= flag;
5928         }
5929       else
5930         {
5931           switch (flag)
5932             {
5933             case SHF_WRITE:             *p = 'W'; break;
5934             case SHF_ALLOC:             *p = 'A'; break;
5935             case SHF_EXECINSTR:         *p = 'X'; break;
5936             case SHF_MERGE:             *p = 'M'; break;
5937             case SHF_STRINGS:           *p = 'S'; break;
5938             case SHF_INFO_LINK:         *p = 'I'; break;
5939             case SHF_LINK_ORDER:        *p = 'L'; break;
5940             case SHF_OS_NONCONFORMING:  *p = 'O'; break;
5941             case SHF_GROUP:             *p = 'G'; break;
5942             case SHF_TLS:               *p = 'T'; break;
5943             case SHF_EXCLUDE:           *p = 'E'; break;
5944             case SHF_COMPRESSED:        *p = 'C'; break;
5945             case SHF_GNU_MBIND:         *p = 'D'; break;
5946
5947             default:
5948               if ((filedata->file_header.e_machine == EM_X86_64
5949                    || filedata->file_header.e_machine == EM_L1OM
5950                    || filedata->file_header.e_machine == EM_K1OM)
5951                   && flag == SHF_X86_64_LARGE)
5952                 *p = 'l';
5953               else if (filedata->file_header.e_machine == EM_ARM
5954                        && flag == SHF_ARM_PURECODE)
5955                   *p = 'y';
5956               else if (filedata->file_header.e_machine == EM_PPC
5957                        && flag == SHF_PPC_VLE)
5958                   *p = 'v';
5959               else if (flag & SHF_MASKOS)
5960                 {
5961                   *p = 'o';
5962                   sh_flags &= ~ SHF_MASKOS;
5963                 }
5964               else if (flag & SHF_MASKPROC)
5965                 {
5966                   *p = 'p';
5967                   sh_flags &= ~ SHF_MASKPROC;
5968                 }
5969               else
5970                 *p = 'x';
5971               break;
5972             }
5973           p++;
5974         }
5975     }
5976
5977   if (do_section_details)
5978     {
5979       if (os_flags)
5980         {
5981           size -= 5 + field_size;
5982           if (p != buff + field_size + 4)
5983             {
5984               if (size < (2 + 1))
5985                 {
5986                   warn (_("Internal error: not enough buffer room for section flag info"));
5987                   return _("<unknown>");
5988                 }
5989               size -= 2;
5990               *p++ = ',';
5991               *p++ = ' ';
5992             }
5993           sprintf (p, "OS (%*.*lx)", field_size, field_size,
5994                    (unsigned long) os_flags);
5995           p += 5 + field_size;
5996         }
5997       if (proc_flags)
5998         {
5999           size -= 7 + field_size;
6000           if (p != buff + field_size + 4)
6001             {
6002               if (size < (2 + 1))
6003                 {
6004                   warn (_("Internal error: not enough buffer room for section flag info"));
6005                   return _("<unknown>");
6006                 }
6007               size -= 2;
6008               *p++ = ',';
6009               *p++ = ' ';
6010             }
6011           sprintf (p, "PROC (%*.*lx)", field_size, field_size,
6012                    (unsigned long) proc_flags);
6013           p += 7 + field_size;
6014         }
6015       if (unknown_flags)
6016         {
6017           size -= 10 + field_size;
6018           if (p != buff + field_size + 4)
6019             {
6020               if (size < (2 + 1))
6021                 {
6022                   warn (_("Internal error: not enough buffer room for section flag info"));
6023                   return _("<unknown>");
6024                 }
6025               size -= 2;
6026               *p++ = ',';
6027               *p++ = ' ';
6028             }
6029           sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
6030                    (unsigned long) unknown_flags);
6031           p += 10 + field_size;
6032         }
6033     }
6034
6035   *p = '\0';
6036   return buff;
6037 }
6038
6039 static unsigned int
6040 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf, bfd_size_type size)
6041 {
6042   if (is_32bit_elf)
6043     {
6044       Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
6045
6046       if (size < sizeof (* echdr))
6047         {
6048           error (_("Compressed section is too small even for a compression header\n"));
6049           return 0;
6050         }
6051
6052       chdr->ch_type = BYTE_GET (echdr->ch_type);
6053       chdr->ch_size = BYTE_GET (echdr->ch_size);
6054       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
6055       return sizeof (*echdr);
6056     }
6057   else
6058     {
6059       Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
6060
6061       if (size < sizeof (* echdr))
6062         {
6063           error (_("Compressed section is too small even for a compression header\n"));
6064           return 0;
6065         }
6066
6067       chdr->ch_type = BYTE_GET (echdr->ch_type);
6068       chdr->ch_size = BYTE_GET (echdr->ch_size);
6069       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
6070       return sizeof (*echdr);
6071     }
6072 }
6073
6074 static bfd_boolean
6075 process_section_headers (Filedata * filedata)
6076 {
6077   Elf_Internal_Shdr * section;
6078   unsigned int i;
6079
6080   filedata->section_headers = NULL;
6081
6082   if (filedata->file_header.e_shnum == 0)
6083     {
6084       /* PR binutils/12467.  */
6085       if (filedata->file_header.e_shoff != 0)
6086         {
6087           warn (_("possibly corrupt ELF file header - it has a non-zero"
6088                   " section header offset, but no section headers\n"));
6089           return FALSE;
6090         }
6091       else if (do_sections)
6092         printf (_("\nThere are no sections in this file.\n"));
6093
6094       return TRUE;
6095     }
6096
6097   if (do_sections && !do_header)
6098     printf (ngettext ("There is %d section header, "
6099                       "starting at offset 0x%lx:\n",
6100                       "There are %d section headers, "
6101                       "starting at offset 0x%lx:\n",
6102                       filedata->file_header.e_shnum),
6103             filedata->file_header.e_shnum,
6104             (unsigned long) filedata->file_header.e_shoff);
6105
6106   if (is_32bit_elf)
6107     {
6108       if (! get_32bit_section_headers (filedata, FALSE))
6109         return FALSE;
6110     }
6111   else
6112     {
6113       if (! get_64bit_section_headers (filedata, FALSE))
6114         return FALSE;
6115     }
6116
6117   /* Read in the string table, so that we have names to display.  */
6118   if (filedata->file_header.e_shstrndx != SHN_UNDEF
6119        && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
6120     {
6121       section = filedata->section_headers + filedata->file_header.e_shstrndx;
6122
6123       if (section->sh_size != 0)
6124         {
6125           filedata->string_table = (char *) get_data (NULL, filedata, section->sh_offset,
6126                                                       1, section->sh_size,
6127                                                       _("string table"));
6128
6129           filedata->string_table_length = filedata->string_table != NULL ? section->sh_size : 0;
6130         }
6131     }
6132
6133   /* Scan the sections for the dynamic symbol table
6134      and dynamic string table and debug sections.  */
6135   dynamic_symbols = NULL;
6136   dynamic_strings = NULL;
6137   dynamic_syminfo = NULL;
6138   symtab_shndx_list = NULL;
6139
6140   eh_addr_size = is_32bit_elf ? 4 : 8;
6141   switch (filedata->file_header.e_machine)
6142     {
6143     case EM_MIPS:
6144     case EM_MIPS_RS3_LE:
6145       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
6146          FDE addresses.  However, the ABI also has a semi-official ILP32
6147          variant for which the normal FDE address size rules apply.
6148
6149          GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
6150          section, where XX is the size of longs in bits.  Unfortunately,
6151          earlier compilers provided no way of distinguishing ILP32 objects
6152          from LP64 objects, so if there's any doubt, we should assume that
6153          the official LP64 form is being used.  */
6154       if ((filedata->file_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
6155           && find_section (filedata, ".gcc_compiled_long32") == NULL)
6156         eh_addr_size = 8;
6157       break;
6158
6159     case EM_H8_300:
6160     case EM_H8_300H:
6161       switch (filedata->file_header.e_flags & EF_H8_MACH)
6162         {
6163         case E_H8_MACH_H8300:
6164         case E_H8_MACH_H8300HN:
6165         case E_H8_MACH_H8300SN:
6166         case E_H8_MACH_H8300SXN:
6167           eh_addr_size = 2;
6168           break;
6169         case E_H8_MACH_H8300H:
6170         case E_H8_MACH_H8300S:
6171         case E_H8_MACH_H8300SX:
6172           eh_addr_size = 4;
6173           break;
6174         }
6175       break;
6176
6177     case EM_M32C_OLD:
6178     case EM_M32C:
6179       switch (filedata->file_header.e_flags & EF_M32C_CPU_MASK)
6180         {
6181         case EF_M32C_CPU_M16C:
6182           eh_addr_size = 2;
6183           break;
6184         }
6185       break;
6186     }
6187
6188 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64)                \
6189   do                                                                    \
6190     {                                                                   \
6191       bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64;  \
6192       if (section->sh_entsize != expected_entsize)                      \
6193         {                                                               \
6194           char buf[40];                                                 \
6195           sprintf_vma (buf, section->sh_entsize);                       \
6196           /* Note: coded this way so that there is a single string for  \
6197              translation.  */ \
6198           error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
6199           error (_("(Using the expected size of %u for the rest of this dump)\n"), \
6200                    (unsigned) expected_entsize);                        \
6201           section->sh_entsize = expected_entsize;                       \
6202         }                                                               \
6203     }                                                                   \
6204   while (0)
6205
6206 #define CHECK_ENTSIZE(section, i, type)                                 \
6207   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),         \
6208                         sizeof (Elf64_External_##type))
6209
6210   for (i = 0, section = filedata->section_headers;
6211        i < filedata->file_header.e_shnum;
6212        i++, section++)
6213     {
6214       char * name = SECTION_NAME (section);
6215
6216       if (section->sh_type == SHT_DYNSYM)
6217         {
6218           if (dynamic_symbols != NULL)
6219             {
6220               error (_("File contains multiple dynamic symbol tables\n"));
6221               continue;
6222             }
6223
6224           CHECK_ENTSIZE (section, i, Sym);
6225           dynamic_symbols = GET_ELF_SYMBOLS (filedata, section, & num_dynamic_syms);
6226         }
6227       else if (section->sh_type == SHT_STRTAB
6228                && streq (name, ".dynstr"))
6229         {
6230           if (dynamic_strings != NULL)
6231             {
6232               error (_("File contains multiple dynamic string tables\n"));
6233               continue;
6234             }
6235
6236           dynamic_strings = (char *) get_data (NULL, filedata, section->sh_offset,
6237                                                1, section->sh_size,
6238                                                _("dynamic strings"));
6239           dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
6240         }
6241       else if (section->sh_type == SHT_SYMTAB_SHNDX)
6242         {
6243           elf_section_list * entry = xmalloc (sizeof * entry);
6244
6245           entry->hdr = section;
6246           entry->next = symtab_shndx_list;
6247           symtab_shndx_list = entry;
6248         }
6249       else if (section->sh_type == SHT_SYMTAB)
6250         CHECK_ENTSIZE (section, i, Sym);
6251       else if (section->sh_type == SHT_GROUP)
6252         CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
6253       else if (section->sh_type == SHT_REL)
6254         CHECK_ENTSIZE (section, i, Rel);
6255       else if (section->sh_type == SHT_RELA)
6256         CHECK_ENTSIZE (section, i, Rela);
6257       else if ((do_debugging || do_debug_info || do_debug_abbrevs
6258                 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
6259                 || do_debug_aranges || do_debug_frames || do_debug_macinfo
6260                 || do_debug_str || do_debug_loc || do_debug_ranges
6261                 || do_debug_addr || do_debug_cu_index || do_debug_links)
6262                && (const_strneq (name, ".debug_")
6263                    || const_strneq (name, ".zdebug_")))
6264         {
6265           if (name[1] == 'z')
6266             name += sizeof (".zdebug_") - 1;
6267           else
6268             name += sizeof (".debug_") - 1;
6269
6270           if (do_debugging
6271               || (do_debug_info     && const_strneq (name, "info"))
6272               || (do_debug_info     && const_strneq (name, "types"))
6273               || (do_debug_abbrevs  && const_strneq (name, "abbrev"))
6274               || (do_debug_lines    && strcmp (name, "line") == 0)
6275               || (do_debug_lines    && const_strneq (name, "line."))
6276               || (do_debug_pubnames && const_strneq (name, "pubnames"))
6277               || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
6278               || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
6279               || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
6280               || (do_debug_aranges  && const_strneq (name, "aranges"))
6281               || (do_debug_ranges   && const_strneq (name, "ranges"))
6282               || (do_debug_ranges   && const_strneq (name, "rnglists"))
6283               || (do_debug_frames   && const_strneq (name, "frame"))
6284               || (do_debug_macinfo  && const_strneq (name, "macinfo"))
6285               || (do_debug_macinfo  && const_strneq (name, "macro"))
6286               || (do_debug_str      && const_strneq (name, "str"))
6287               || (do_debug_loc      && const_strneq (name, "loc"))
6288               || (do_debug_loc      && const_strneq (name, "loclists"))
6289               || (do_debug_addr     && const_strneq (name, "addr"))
6290               || (do_debug_cu_index && const_strneq (name, "cu_index"))
6291               || (do_debug_cu_index && const_strneq (name, "tu_index"))
6292               )
6293             request_dump_bynumber (filedata, i, DEBUG_DUMP);
6294         }
6295       /* Linkonce section to be combined with .debug_info at link time.  */
6296       else if ((do_debugging || do_debug_info)
6297                && const_strneq (name, ".gnu.linkonce.wi."))
6298         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6299       else if (do_debug_frames && streq (name, ".eh_frame"))
6300         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6301       else if (do_gdb_index && (streq (name, ".gdb_index")
6302                                 || streq (name, ".debug_names")))
6303         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6304       /* Trace sections for Itanium VMS.  */
6305       else if ((do_debugging || do_trace_info || do_trace_abbrevs
6306                 || do_trace_aranges)
6307                && const_strneq (name, ".trace_"))
6308         {
6309           name += sizeof (".trace_") - 1;
6310
6311           if (do_debugging
6312               || (do_trace_info     && streq (name, "info"))
6313               || (do_trace_abbrevs  && streq (name, "abbrev"))
6314               || (do_trace_aranges  && streq (name, "aranges"))
6315               )
6316             request_dump_bynumber (filedata, i, DEBUG_DUMP);
6317         }
6318       else if ((do_debugging || do_debug_links)
6319                && (const_strneq (name, ".gnu_debuglink")
6320                    || const_strneq (name, ".gnu_debugaltlink")))
6321         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6322     }
6323
6324   if (! do_sections)
6325     return TRUE;
6326
6327   if (filedata->file_header.e_shnum > 1)
6328     printf (_("\nSection Headers:\n"));
6329   else
6330     printf (_("\nSection Header:\n"));
6331
6332   if (is_32bit_elf)
6333     {
6334       if (do_section_details)
6335         {
6336           printf (_("  [Nr] Name\n"));
6337           printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
6338         }
6339       else
6340         printf
6341           (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
6342     }
6343   else if (do_wide)
6344     {
6345       if (do_section_details)
6346         {
6347           printf (_("  [Nr] Name\n"));
6348           printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
6349         }
6350       else
6351         printf
6352           (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
6353     }
6354   else
6355     {
6356       if (do_section_details)
6357         {
6358           printf (_("  [Nr] Name\n"));
6359           printf (_("       Type              Address          Offset            Link\n"));
6360           printf (_("       Size              EntSize          Info              Align\n"));
6361         }
6362       else
6363         {
6364           printf (_("  [Nr] Name              Type             Address           Offset\n"));
6365           printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
6366         }
6367     }
6368
6369   if (do_section_details)
6370     printf (_("       Flags\n"));
6371
6372   for (i = 0, section = filedata->section_headers;
6373        i < filedata->file_header.e_shnum;
6374        i++, section++)
6375     {
6376       /* Run some sanity checks on the section header.  */
6377
6378       /* Check the sh_link field.  */
6379       switch (section->sh_type)
6380         {
6381         case SHT_REL:
6382         case SHT_RELA:
6383           if (section->sh_link == 0
6384               && (filedata->file_header.e_type == ET_EXEC
6385                   || filedata->file_header.e_type == ET_DYN))
6386             /* A dynamic relocation section where all entries use a
6387                zero symbol index need not specify a symtab section.  */
6388             break;
6389           /* Fall through.  */
6390         case SHT_SYMTAB_SHNDX:
6391         case SHT_GROUP:
6392         case SHT_HASH:
6393         case SHT_GNU_HASH:
6394         case SHT_GNU_versym:
6395           if (section->sh_link == 0
6396               || section->sh_link >= filedata->file_header.e_shnum
6397               || (filedata->section_headers[section->sh_link].sh_type != SHT_SYMTAB
6398                   && filedata->section_headers[section->sh_link].sh_type != SHT_DYNSYM))
6399             warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6400                   i, section->sh_link);
6401           break;
6402
6403         case SHT_DYNAMIC:
6404         case SHT_SYMTAB:
6405         case SHT_DYNSYM:
6406         case SHT_GNU_verneed:
6407         case SHT_GNU_verdef:
6408         case SHT_GNU_LIBLIST:
6409           if (section->sh_link == 0
6410               || section->sh_link >= filedata->file_header.e_shnum
6411               || filedata->section_headers[section->sh_link].sh_type != SHT_STRTAB)
6412             warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6413                   i, section->sh_link);
6414           break;
6415
6416         case SHT_INIT_ARRAY:
6417         case SHT_FINI_ARRAY:
6418         case SHT_PREINIT_ARRAY:
6419           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6420             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6421                   i, section->sh_link);
6422           break;
6423
6424         default:
6425           /* FIXME: Add support for target specific section types.  */
6426 #if 0     /* Currently we do not check other section types as there are too
6427              many special cases.  Stab sections for example have a type
6428              of SHT_PROGBITS but an sh_link field that links to the .stabstr
6429              section.  */
6430           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6431             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6432                   i, section->sh_link);
6433 #endif
6434           break;
6435         }
6436
6437       /* Check the sh_info field.  */
6438       switch (section->sh_type)
6439         {
6440         case SHT_REL:
6441         case SHT_RELA:
6442           if (section->sh_info == 0
6443               && (filedata->file_header.e_type == ET_EXEC
6444                   || filedata->file_header.e_type == ET_DYN))
6445             /* Dynamic relocations apply to segments, so they do not
6446                need to specify the section they relocate.  */
6447             break;
6448           if (section->sh_info == 0
6449               || section->sh_info >= filedata->file_header.e_shnum
6450               || (filedata->section_headers[section->sh_info].sh_type != SHT_PROGBITS
6451                   && filedata->section_headers[section->sh_info].sh_type != SHT_NOBITS
6452                   && filedata->section_headers[section->sh_info].sh_type != SHT_NOTE
6453                   && filedata->section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
6454                   && filedata->section_headers[section->sh_info].sh_type != SHT_FINI_ARRAY
6455                   && filedata->section_headers[section->sh_info].sh_type != SHT_PREINIT_ARRAY
6456                   /* FIXME: Are other section types valid ?  */
6457                   && filedata->section_headers[section->sh_info].sh_type < SHT_LOOS))
6458             warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6459                   i, section->sh_info);
6460           break;
6461
6462         case SHT_DYNAMIC:
6463         case SHT_HASH:
6464         case SHT_SYMTAB_SHNDX:
6465         case SHT_INIT_ARRAY:
6466         case SHT_FINI_ARRAY:
6467         case SHT_PREINIT_ARRAY:
6468           if (section->sh_info != 0)
6469             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6470                   i, section->sh_info);
6471           break;
6472
6473         case SHT_GROUP:
6474         case SHT_SYMTAB:
6475         case SHT_DYNSYM:
6476           /* A symbol index - we assume that it is valid.  */
6477           break;
6478
6479         default:
6480           /* FIXME: Add support for target specific section types.  */
6481           if (section->sh_type == SHT_NOBITS)
6482             /* NOBITS section headers with non-zero sh_info fields can be
6483                created when a binary is stripped of everything but its debug
6484                information.  The stripped sections have their headers
6485                preserved but their types set to SHT_NOBITS.  So do not check
6486                this type of section.  */
6487             ;
6488           else if (section->sh_flags & SHF_INFO_LINK)
6489             {
6490               if (section->sh_info < 1 || section->sh_info >= filedata->file_header.e_shnum)
6491                 warn (_("[%2u]: Expected link to another section in info field"), i);
6492             }
6493           else if (section->sh_type < SHT_LOOS
6494                    && (section->sh_flags & SHF_GNU_MBIND) == 0
6495                    && section->sh_info != 0)
6496             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6497                   i, section->sh_info);
6498           break;
6499         }
6500
6501       /* Check the sh_size field.  */
6502       if (section->sh_size > filedata->file_size
6503           && section->sh_type != SHT_NOBITS
6504           && section->sh_type != SHT_NULL
6505           && section->sh_type < SHT_LOOS)
6506         warn (_("Size of section %u is larger than the entire file!\n"), i);
6507
6508       printf ("  [%2u] ", i);
6509       if (do_section_details)
6510         printf ("%s\n      ", printable_section_name (filedata, section));
6511       else
6512         print_symbol (-17, SECTION_NAME (section));
6513
6514       printf (do_wide ? " %-15s " : " %-15.15s ",
6515               get_section_type_name (filedata, section->sh_type));
6516
6517       if (is_32bit_elf)
6518         {
6519           const char * link_too_big = NULL;
6520
6521           print_vma (section->sh_addr, LONG_HEX);
6522
6523           printf ( " %6.6lx %6.6lx %2.2lx",
6524                    (unsigned long) section->sh_offset,
6525                    (unsigned long) section->sh_size,
6526                    (unsigned long) section->sh_entsize);
6527
6528           if (do_section_details)
6529             fputs ("  ", stdout);
6530           else
6531             printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6532
6533           if (section->sh_link >= filedata->file_header.e_shnum)
6534             {
6535               link_too_big = "";
6536               /* The sh_link value is out of range.  Normally this indicates
6537                  an error but it can have special values in Solaris binaries.  */
6538               switch (filedata->file_header.e_machine)
6539                 {
6540                 case EM_386:
6541                 case EM_IAMCU:
6542                 case EM_X86_64:
6543                 case EM_L1OM:
6544                 case EM_K1OM:
6545                 case EM_OLD_SPARCV9:
6546                 case EM_SPARC32PLUS:
6547                 case EM_SPARCV9:
6548                 case EM_SPARC:
6549                   if (section->sh_link == (SHN_BEFORE & 0xffff))
6550                     link_too_big = "BEFORE";
6551                   else if (section->sh_link == (SHN_AFTER & 0xffff))
6552                     link_too_big = "AFTER";
6553                   break;
6554                 default:
6555                   break;
6556                 }
6557             }
6558
6559           if (do_section_details)
6560             {
6561               if (link_too_big != NULL && * link_too_big)
6562                 printf ("<%s> ", link_too_big);
6563               else
6564                 printf ("%2u ", section->sh_link);
6565               printf ("%3u %2lu\n", section->sh_info,
6566                       (unsigned long) section->sh_addralign);
6567             }
6568           else
6569             printf ("%2u %3u %2lu\n",
6570                     section->sh_link,
6571                     section->sh_info,
6572                     (unsigned long) section->sh_addralign);
6573
6574           if (link_too_big && ! * link_too_big)
6575             warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6576                   i, section->sh_link);
6577         }
6578       else if (do_wide)
6579         {
6580           print_vma (section->sh_addr, LONG_HEX);
6581
6582           if ((long) section->sh_offset == section->sh_offset)
6583             printf (" %6.6lx", (unsigned long) section->sh_offset);
6584           else
6585             {
6586               putchar (' ');
6587               print_vma (section->sh_offset, LONG_HEX);
6588             }
6589
6590           if ((unsigned long) section->sh_size == section->sh_size)
6591             printf (" %6.6lx", (unsigned long) section->sh_size);
6592           else
6593             {
6594               putchar (' ');
6595               print_vma (section->sh_size, LONG_HEX);
6596             }
6597
6598           if ((unsigned long) section->sh_entsize == section->sh_entsize)
6599             printf (" %2.2lx", (unsigned long) section->sh_entsize);
6600           else
6601             {
6602               putchar (' ');
6603               print_vma (section->sh_entsize, LONG_HEX);
6604             }
6605
6606           if (do_section_details)
6607             fputs ("  ", stdout);
6608           else
6609             printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6610
6611           printf ("%2u %3u ", section->sh_link, section->sh_info);
6612
6613           if ((unsigned long) section->sh_addralign == section->sh_addralign)
6614             printf ("%2lu\n", (unsigned long) section->sh_addralign);
6615           else
6616             {
6617               print_vma (section->sh_addralign, DEC);
6618               putchar ('\n');
6619             }
6620         }
6621       else if (do_section_details)
6622         {
6623           putchar (' ');
6624           print_vma (section->sh_addr, LONG_HEX);
6625           if ((long) section->sh_offset == section->sh_offset)
6626             printf ("  %16.16lx", (unsigned long) section->sh_offset);
6627           else
6628             {
6629               printf ("  ");
6630               print_vma (section->sh_offset, LONG_HEX);
6631             }
6632           printf ("  %u\n       ", section->sh_link);
6633           print_vma (section->sh_size, LONG_HEX);
6634           putchar (' ');
6635           print_vma (section->sh_entsize, LONG_HEX);
6636
6637           printf ("  %-16u  %lu\n",
6638                   section->sh_info,
6639                   (unsigned long) section->sh_addralign);
6640         }
6641       else
6642         {
6643           putchar (' ');
6644           print_vma (section->sh_addr, LONG_HEX);
6645           if ((long) section->sh_offset == section->sh_offset)
6646             printf ("  %8.8lx", (unsigned long) section->sh_offset);
6647           else
6648             {
6649               printf ("  ");
6650               print_vma (section->sh_offset, LONG_HEX);
6651             }
6652           printf ("\n       ");
6653           print_vma (section->sh_size, LONG_HEX);
6654           printf ("  ");
6655           print_vma (section->sh_entsize, LONG_HEX);
6656
6657           printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6658
6659           printf ("     %2u   %3u     %lu\n",
6660                   section->sh_link,
6661                   section->sh_info,
6662                   (unsigned long) section->sh_addralign);
6663         }
6664
6665       if (do_section_details)
6666         {
6667           printf ("       %s\n", get_elf_section_flags (filedata, section->sh_flags));
6668           if ((section->sh_flags & SHF_COMPRESSED) != 0)
6669             {
6670               /* Minimum section size is 12 bytes for 32-bit compression
6671                  header + 12 bytes for compressed data header.  */
6672               unsigned char buf[24];
6673
6674               assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6675               if (get_data (&buf, filedata, section->sh_offset, 1,
6676                             sizeof (buf), _("compression header")))
6677                 {
6678                   Elf_Internal_Chdr chdr;
6679
6680                   (void) get_compression_header (&chdr, buf, sizeof (buf));
6681
6682                   if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6683                     printf ("       ZLIB, ");
6684                   else
6685                     printf (_("       [<unknown>: 0x%x], "),
6686                             chdr.ch_type);
6687                   print_vma (chdr.ch_size, LONG_HEX);
6688                   printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6689                 }
6690             }
6691         }
6692     }
6693
6694   if (!do_section_details)
6695     {
6696       /* The ordering of the letters shown here matches the ordering of the
6697          corresponding SHF_xxx values, and hence the order in which these
6698          letters will be displayed to the user.  */
6699       printf (_("Key to Flags:\n\
6700   W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6701   L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6702   C (compressed), x (unknown), o (OS specific), E (exclude),\n  "));
6703       if (filedata->file_header.e_machine == EM_X86_64
6704           || filedata->file_header.e_machine == EM_L1OM
6705           || filedata->file_header.e_machine == EM_K1OM)
6706         printf (_("l (large), "));
6707       else if (filedata->file_header.e_machine == EM_ARM)
6708         printf (_("y (purecode), "));
6709       else if (filedata->file_header.e_machine == EM_PPC)
6710         printf (_("v (VLE), "));
6711       printf ("p (processor specific)\n");
6712     }
6713
6714   return TRUE;
6715 }
6716
6717 static const char *
6718 get_group_flags (unsigned int flags)
6719 {
6720   static char buff[128];
6721
6722   if (flags == 0)
6723     return "";
6724   else if (flags == GRP_COMDAT)
6725     return "COMDAT ";
6726
6727   snprintf (buff, 14, _("[0x%x: "), flags);
6728
6729   flags &= ~ GRP_COMDAT;
6730   if (flags & GRP_MASKOS)
6731     {
6732       strcat (buff, "<OS specific>");
6733       flags &= ~ GRP_MASKOS;
6734     }
6735
6736   if (flags & GRP_MASKPROC)
6737     {
6738       strcat (buff, "<PROC specific>");
6739       flags &= ~ GRP_MASKPROC;
6740     }
6741
6742   if (flags)
6743     strcat (buff, "<unknown>");
6744
6745   strcat (buff, "]");
6746   return buff;
6747 }
6748
6749 static bfd_boolean
6750 process_section_groups (Filedata * filedata)
6751 {
6752   Elf_Internal_Shdr * section;
6753   unsigned int i;
6754   struct group * group;
6755   Elf_Internal_Shdr * symtab_sec;
6756   Elf_Internal_Shdr * strtab_sec;
6757   Elf_Internal_Sym * symtab;
6758   unsigned long num_syms;
6759   char * strtab;
6760   size_t strtab_size;
6761
6762   /* Don't process section groups unless needed.  */
6763   if (!do_unwind && !do_section_groups)
6764     return TRUE;
6765
6766   if (filedata->file_header.e_shnum == 0)
6767     {
6768       if (do_section_groups)
6769         printf (_("\nThere are no sections to group in this file.\n"));
6770
6771       return TRUE;
6772     }
6773
6774   if (filedata->section_headers == NULL)
6775     {
6776       error (_("Section headers are not available!\n"));
6777       /* PR 13622: This can happen with a corrupt ELF header.  */
6778       return FALSE;
6779     }
6780
6781   section_headers_groups = (struct group **) calloc (filedata->file_header.e_shnum,
6782                                                      sizeof (struct group *));
6783
6784   if (section_headers_groups == NULL)
6785     {
6786       error (_("Out of memory reading %u section group headers\n"),
6787              filedata->file_header.e_shnum);
6788       return FALSE;
6789     }
6790
6791   /* Scan the sections for the group section.  */
6792   group_count = 0;
6793   for (i = 0, section = filedata->section_headers;
6794        i < filedata->file_header.e_shnum;
6795        i++, section++)
6796     if (section->sh_type == SHT_GROUP)
6797       group_count++;
6798
6799   if (group_count == 0)
6800     {
6801       if (do_section_groups)
6802         printf (_("\nThere are no section groups in this file.\n"));
6803
6804       return TRUE;
6805     }
6806
6807   section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6808
6809   if (section_groups == NULL)
6810     {
6811       error (_("Out of memory reading %lu groups\n"),
6812              (unsigned long) group_count);
6813       return FALSE;
6814     }
6815
6816   symtab_sec = NULL;
6817   strtab_sec = NULL;
6818   symtab = NULL;
6819   num_syms = 0;
6820   strtab = NULL;
6821   strtab_size = 0;
6822   for (i = 0, section = filedata->section_headers, group = section_groups;
6823        i < filedata->file_header.e_shnum;
6824        i++, section++)
6825     {
6826       if (section->sh_type == SHT_GROUP)
6827         {
6828           const char * name = printable_section_name (filedata, section);
6829           const char * group_name;
6830           unsigned char * start;
6831           unsigned char * indices;
6832           unsigned int entry, j, size;
6833           Elf_Internal_Shdr * sec;
6834           Elf_Internal_Sym * sym;
6835
6836           /* Get the symbol table.  */
6837           if (section->sh_link >= filedata->file_header.e_shnum
6838               || ((sec = filedata->section_headers + section->sh_link)->sh_type
6839                   != SHT_SYMTAB))
6840             {
6841               error (_("Bad sh_link in group section `%s'\n"), name);
6842               continue;
6843             }
6844
6845           if (symtab_sec != sec)
6846             {
6847               symtab_sec = sec;
6848               if (symtab)
6849                 free (symtab);
6850               symtab = GET_ELF_SYMBOLS (filedata, symtab_sec, & num_syms);
6851             }
6852
6853           if (symtab == NULL)
6854             {
6855               error (_("Corrupt header in group section `%s'\n"), name);
6856               continue;
6857             }
6858
6859           if (section->sh_info >= num_syms)
6860             {
6861               error (_("Bad sh_info in group section `%s'\n"), name);
6862               continue;
6863             }
6864
6865           sym = symtab + section->sh_info;
6866
6867           if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6868             {
6869               if (sym->st_shndx == 0
6870                   || sym->st_shndx >= filedata->file_header.e_shnum)
6871                 {
6872                   error (_("Bad sh_info in group section `%s'\n"), name);
6873                   continue;
6874                 }
6875
6876               group_name = SECTION_NAME (filedata->section_headers + sym->st_shndx);
6877               strtab_sec = NULL;
6878               if (strtab)
6879                 free (strtab);
6880               strtab = NULL;
6881               strtab_size = 0;
6882             }
6883           else
6884             {
6885               /* Get the string table.  */
6886               if (symtab_sec->sh_link >= filedata->file_header.e_shnum)
6887                 {
6888                   strtab_sec = NULL;
6889                   if (strtab)
6890                     free (strtab);
6891                   strtab = NULL;
6892                   strtab_size = 0;
6893                 }
6894               else if (strtab_sec
6895                        != (sec = filedata->section_headers + symtab_sec->sh_link))
6896                 {
6897                   strtab_sec = sec;
6898                   if (strtab)
6899                     free (strtab);
6900
6901                   strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
6902                                               1, strtab_sec->sh_size,
6903                                               _("string table"));
6904                   strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6905                 }
6906               group_name = sym->st_name < strtab_size
6907                 ? strtab + sym->st_name : _("<corrupt>");
6908             }
6909
6910           /* PR 17531: file: loop.  */
6911           if (section->sh_entsize > section->sh_size)
6912             {
6913               error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6914                      printable_section_name (filedata, section),
6915                      (unsigned long) section->sh_entsize,
6916                      (unsigned long) section->sh_size);
6917               continue;
6918             }
6919
6920           start = (unsigned char *) get_data (NULL, filedata, section->sh_offset,
6921                                               1, section->sh_size,
6922                                               _("section data"));
6923           if (start == NULL)
6924             continue;
6925
6926           indices = start;
6927           size = (section->sh_size / section->sh_entsize) - 1;
6928           entry = byte_get (indices, 4);
6929           indices += 4;
6930
6931           if (do_section_groups)
6932             {
6933               printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6934                       get_group_flags (entry), i, name, group_name, size);
6935
6936               printf (_("   [Index]    Name\n"));
6937             }
6938
6939           group->group_index = i;
6940
6941           for (j = 0; j < size; j++)
6942             {
6943               struct group_list * g;
6944
6945               entry = byte_get (indices, 4);
6946               indices += 4;
6947
6948               if (entry >= filedata->file_header.e_shnum)
6949                 {
6950                   static unsigned num_group_errors = 0;
6951
6952                   if (num_group_errors ++ < 10)
6953                     {
6954                       error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6955                              entry, i, filedata->file_header.e_shnum - 1);
6956                       if (num_group_errors == 10)
6957                         warn (_("Further error messages about overlarge group section indices suppressed\n"));
6958                     }
6959                   continue;
6960                 }
6961
6962               if (section_headers_groups [entry] != NULL)
6963                 {
6964                   if (entry)
6965                     {
6966                       static unsigned num_errs = 0;
6967
6968                       if (num_errs ++ < 10)
6969                         {
6970                           error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6971                                  entry, i,
6972                                  section_headers_groups [entry]->group_index);
6973                           if (num_errs == 10)
6974                             warn (_("Further error messages about already contained group sections suppressed\n"));
6975                         }
6976                       continue;
6977                     }
6978                   else
6979                     {
6980                       /* Intel C/C++ compiler may put section 0 in a
6981                          section group.  We just warn it the first time
6982                          and ignore it afterwards.  */
6983                       static bfd_boolean warned = FALSE;
6984                       if (!warned)
6985                         {
6986                           error (_("section 0 in group section [%5u]\n"),
6987                                  section_headers_groups [entry]->group_index);
6988                           warned = TRUE;
6989                         }
6990                     }
6991                 }
6992
6993               section_headers_groups [entry] = group;
6994
6995               if (do_section_groups)
6996                 {
6997                   sec = filedata->section_headers + entry;
6998                   printf ("   [%5u]   %s\n", entry, printable_section_name (filedata, sec));
6999                 }
7000
7001               g = (struct group_list *) xmalloc (sizeof (struct group_list));
7002               g->section_index = entry;
7003               g->next = group->root;
7004               group->root = g;
7005             }
7006
7007           if (start)
7008             free (start);
7009
7010           group++;
7011         }
7012     }
7013
7014   if (symtab)
7015     free (symtab);
7016   if (strtab)
7017     free (strtab);
7018   return TRUE;
7019 }
7020
7021 /* Data used to display dynamic fixups.  */
7022
7023 struct ia64_vms_dynfixup
7024 {
7025   bfd_vma needed_ident;         /* Library ident number.  */
7026   bfd_vma needed;               /* Index in the dstrtab of the library name.  */
7027   bfd_vma fixup_needed;         /* Index of the library.  */
7028   bfd_vma fixup_rela_cnt;       /* Number of fixups.  */
7029   bfd_vma fixup_rela_off;       /* Fixups offset in the dynamic segment.  */
7030 };
7031
7032 /* Data used to display dynamic relocations.  */
7033
7034 struct ia64_vms_dynimgrela
7035 {
7036   bfd_vma img_rela_cnt;         /* Number of relocations.  */
7037   bfd_vma img_rela_off;         /* Reloc offset in the dynamic segment.  */
7038 };
7039
7040 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
7041    library).  */
7042
7043 static bfd_boolean
7044 dump_ia64_vms_dynamic_fixups (Filedata *                  filedata,
7045                               struct ia64_vms_dynfixup *  fixup,
7046                               const char *                strtab,
7047                               unsigned int                strtab_sz)
7048 {
7049   Elf64_External_VMS_IMAGE_FIXUP * imfs;
7050   long i;
7051   const char * lib_name;
7052
7053   imfs = get_data (NULL, filedata, dynamic_addr + fixup->fixup_rela_off,
7054                    1, fixup->fixup_rela_cnt * sizeof (*imfs),
7055                    _("dynamic section image fixups"));
7056   if (!imfs)
7057     return FALSE;
7058
7059   if (fixup->needed < strtab_sz)
7060     lib_name = strtab + fixup->needed;
7061   else
7062     {
7063       warn (_("corrupt library name index of 0x%lx found in dynamic entry"),
7064             (unsigned long) fixup->needed);
7065       lib_name = "???";
7066     }
7067   printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
7068           (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
7069   printf
7070     (_("Seg Offset           Type                             SymVec DataType\n"));
7071
7072   for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
7073     {
7074       unsigned int type;
7075       const char *rtype;
7076
7077       printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
7078       printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
7079       type = BYTE_GET (imfs [i].type);
7080       rtype = elf_ia64_reloc_type (type);
7081       if (rtype == NULL)
7082         printf (" 0x%08x                       ", type);
7083       else
7084         printf (" %-32s ", rtype);
7085       printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
7086       printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
7087     }
7088
7089   free (imfs);
7090   return TRUE;
7091 }
7092
7093 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
7094
7095 static bfd_boolean
7096 dump_ia64_vms_dynamic_relocs (Filedata * filedata, struct ia64_vms_dynimgrela *imgrela)
7097 {
7098   Elf64_External_VMS_IMAGE_RELA *imrs;
7099   long i;
7100
7101   imrs = get_data (NULL, filedata, dynamic_addr + imgrela->img_rela_off,
7102                    1, imgrela->img_rela_cnt * sizeof (*imrs),
7103                    _("dynamic section image relocations"));
7104   if (!imrs)
7105     return FALSE;
7106
7107   printf (_("\nImage relocs\n"));
7108   printf
7109     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
7110
7111   for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
7112     {
7113       unsigned int type;
7114       const char *rtype;
7115
7116       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
7117       printf ("%08" BFD_VMA_FMT "x ",
7118               (bfd_vma) BYTE_GET (imrs [i].rela_offset));
7119       type = BYTE_GET (imrs [i].type);
7120       rtype = elf_ia64_reloc_type (type);
7121       if (rtype == NULL)
7122         printf ("0x%08x                      ", type);
7123       else
7124         printf ("%-31s ", rtype);
7125       print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
7126       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
7127       printf ("%08" BFD_VMA_FMT "x\n",
7128               (bfd_vma) BYTE_GET (imrs [i].sym_offset));
7129     }
7130
7131   free (imrs);
7132   return TRUE;
7133 }
7134
7135 /* Display IA-64 OpenVMS dynamic relocations and fixups.  */
7136
7137 static bfd_boolean
7138 process_ia64_vms_dynamic_relocs (Filedata * filedata)
7139 {
7140   struct ia64_vms_dynfixup fixup;
7141   struct ia64_vms_dynimgrela imgrela;
7142   Elf_Internal_Dyn *entry;
7143   bfd_vma strtab_off = 0;
7144   bfd_vma strtab_sz = 0;
7145   char *strtab = NULL;
7146   bfd_boolean res = TRUE;
7147
7148   memset (&fixup, 0, sizeof (fixup));
7149   memset (&imgrela, 0, sizeof (imgrela));
7150
7151   /* Note: the order of the entries is specified by the OpenVMS specs.  */
7152   for (entry = dynamic_section;
7153        entry < dynamic_section + dynamic_nent;
7154        entry++)
7155     {
7156       switch (entry->d_tag)
7157         {
7158         case DT_IA_64_VMS_STRTAB_OFFSET:
7159           strtab_off = entry->d_un.d_val;
7160           break;
7161         case DT_STRSZ:
7162           strtab_sz = entry->d_un.d_val;
7163           if (strtab == NULL)
7164             strtab = get_data (NULL, filedata, dynamic_addr + strtab_off,
7165                                1, strtab_sz, _("dynamic string section"));
7166           break;
7167
7168         case DT_IA_64_VMS_NEEDED_IDENT:
7169           fixup.needed_ident = entry->d_un.d_val;
7170           break;
7171         case DT_NEEDED:
7172           fixup.needed = entry->d_un.d_val;
7173           break;
7174         case DT_IA_64_VMS_FIXUP_NEEDED:
7175           fixup.fixup_needed = entry->d_un.d_val;
7176           break;
7177         case DT_IA_64_VMS_FIXUP_RELA_CNT:
7178           fixup.fixup_rela_cnt = entry->d_un.d_val;
7179           break;
7180         case DT_IA_64_VMS_FIXUP_RELA_OFF:
7181           fixup.fixup_rela_off = entry->d_un.d_val;
7182           if (! dump_ia64_vms_dynamic_fixups (filedata, &fixup, strtab, strtab_sz))
7183             res = FALSE;
7184           break;
7185         case DT_IA_64_VMS_IMG_RELA_CNT:
7186           imgrela.img_rela_cnt = entry->d_un.d_val;
7187           break;
7188         case DT_IA_64_VMS_IMG_RELA_OFF:
7189           imgrela.img_rela_off = entry->d_un.d_val;
7190           if (! dump_ia64_vms_dynamic_relocs (filedata, &imgrela))
7191             res = FALSE;
7192           break;
7193
7194         default:
7195           break;
7196         }
7197     }
7198
7199   if (strtab != NULL)
7200     free (strtab);
7201
7202   return res;
7203 }
7204
7205 static struct
7206 {
7207   const char * name;
7208   int reloc;
7209   int size;
7210   int rela;
7211 }
7212   dynamic_relocations [] =
7213 {
7214   { "REL", DT_REL, DT_RELSZ, FALSE },
7215   { "RELA", DT_RELA, DT_RELASZ, TRUE },
7216   { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
7217 };
7218
7219 /* Process the reloc section.  */
7220
7221 static bfd_boolean
7222 process_relocs (Filedata * filedata)
7223 {
7224   unsigned long rel_size;
7225   unsigned long rel_offset;
7226
7227   if (!do_reloc)
7228     return TRUE;
7229
7230   if (do_using_dynamic)
7231     {
7232       int          is_rela;
7233       const char * name;
7234       bfd_boolean  has_dynamic_reloc;
7235       unsigned int i;
7236
7237       has_dynamic_reloc = FALSE;
7238
7239       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7240         {
7241           is_rela = dynamic_relocations [i].rela;
7242           name = dynamic_relocations [i].name;
7243           rel_size = dynamic_info [dynamic_relocations [i].size];
7244           rel_offset = dynamic_info [dynamic_relocations [i].reloc];
7245
7246           if (rel_size)
7247             has_dynamic_reloc = TRUE;
7248
7249           if (is_rela == UNKNOWN)
7250             {
7251               if (dynamic_relocations [i].reloc == DT_JMPREL)
7252                 switch (dynamic_info[DT_PLTREL])
7253                   {
7254                   case DT_REL:
7255                     is_rela = FALSE;
7256                     break;
7257                   case DT_RELA:
7258                     is_rela = TRUE;
7259                     break;
7260                   }
7261             }
7262
7263           if (rel_size)
7264             {
7265               printf
7266                 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
7267                  name, rel_offset, rel_size);
7268
7269               dump_relocations (filedata,
7270                                 offset_from_vma (filedata, rel_offset, rel_size),
7271                                 rel_size,
7272                                 dynamic_symbols, num_dynamic_syms,
7273                                 dynamic_strings, dynamic_strings_length,
7274                                 is_rela, TRUE /* is_dynamic */);
7275             }
7276         }
7277
7278       if (is_ia64_vms (filedata))
7279         if (process_ia64_vms_dynamic_relocs (filedata))
7280           has_dynamic_reloc = TRUE;
7281
7282       if (! has_dynamic_reloc)
7283         printf (_("\nThere are no dynamic relocations in this file.\n"));
7284     }
7285   else
7286     {
7287       Elf_Internal_Shdr * section;
7288       unsigned long i;
7289       bfd_boolean found = FALSE;
7290
7291       for (i = 0, section = filedata->section_headers;
7292            i < filedata->file_header.e_shnum;
7293            i++, section++)
7294         {
7295           if (   section->sh_type != SHT_RELA
7296               && section->sh_type != SHT_REL)
7297             continue;
7298
7299           rel_offset = section->sh_offset;
7300           rel_size   = section->sh_size;
7301
7302           if (rel_size)
7303             {
7304               Elf_Internal_Shdr * strsec;
7305               int is_rela;
7306               unsigned long num_rela;
7307
7308               printf (_("\nRelocation section "));
7309
7310               if (filedata->string_table == NULL)
7311                 printf ("%d", section->sh_name);
7312               else
7313                 printf ("'%s'", printable_section_name (filedata, section));
7314
7315               num_rela = rel_size / section->sh_entsize;
7316               printf (ngettext (" at offset 0x%lx contains %lu entry:\n",
7317                                 " at offset 0x%lx contains %lu entries:\n",
7318                                 num_rela),
7319                       rel_offset, num_rela);
7320
7321               is_rela = section->sh_type == SHT_RELA;
7322
7323               if (section->sh_link != 0
7324                   && section->sh_link < filedata->file_header.e_shnum)
7325                 {
7326                   Elf_Internal_Shdr * symsec;
7327                   Elf_Internal_Sym *  symtab;
7328                   unsigned long nsyms;
7329                   unsigned long strtablen = 0;
7330                   char * strtab = NULL;
7331
7332                   symsec = filedata->section_headers + section->sh_link;
7333                   if (symsec->sh_type != SHT_SYMTAB
7334                       && symsec->sh_type != SHT_DYNSYM)
7335                     continue;
7336
7337                   symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
7338
7339                   if (symtab == NULL)
7340                     continue;
7341
7342                   if (symsec->sh_link != 0
7343                       && symsec->sh_link < filedata->file_header.e_shnum)
7344                     {
7345                       strsec = filedata->section_headers + symsec->sh_link;
7346
7347                       strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7348                                                   1, strsec->sh_size,
7349                                                   _("string table"));
7350                       strtablen = strtab == NULL ? 0 : strsec->sh_size;
7351                     }
7352
7353                   dump_relocations (filedata, rel_offset, rel_size,
7354                                     symtab, nsyms, strtab, strtablen,
7355                                     is_rela,
7356                                     symsec->sh_type == SHT_DYNSYM);
7357                   if (strtab)
7358                     free (strtab);
7359                   free (symtab);
7360                 }
7361               else
7362                 dump_relocations (filedata, rel_offset, rel_size,
7363                                   NULL, 0, NULL, 0, is_rela,
7364                                   FALSE /* is_dynamic */);
7365
7366               found = TRUE;
7367             }
7368         }
7369
7370       if (! found)
7371         {
7372           /* Users sometimes forget the -D option, so try to be helpful.  */
7373           for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7374             {
7375               if (dynamic_info [dynamic_relocations [i].size])
7376                 {
7377                   printf (_("\nThere are no static relocations in this file."));
7378                   printf (_("\nTo see the dynamic relocations add --use-dynamic to the command line.\n"));
7379
7380                   break;
7381                 }
7382             }
7383           if (i == ARRAY_SIZE (dynamic_relocations))
7384             printf (_("\nThere are no relocations in this file.\n"));
7385         }
7386     }
7387
7388   return TRUE;
7389 }
7390
7391 /* An absolute address consists of a section and an offset.  If the
7392    section is NULL, the offset itself is the address, otherwise, the
7393    address equals to LOAD_ADDRESS(section) + offset.  */
7394
7395 struct absaddr
7396 {
7397   unsigned short section;
7398   bfd_vma offset;
7399 };
7400
7401 #define ABSADDR(a) \
7402   ((a).section \
7403    ? filedata->section_headers [(a).section].sh_addr + (a).offset \
7404    : (a).offset)
7405
7406 /* Find the nearest symbol at or below ADDR.  Returns the symbol
7407    name, if found, and the offset from the symbol to ADDR.  */
7408
7409 static void
7410 find_symbol_for_address (Filedata *          filedata,
7411                          Elf_Internal_Sym *  symtab,
7412                          unsigned long       nsyms,
7413                          const char *        strtab,
7414                          unsigned long       strtab_size,
7415                          struct absaddr      addr,
7416                          const char **       symname,
7417                          bfd_vma *           offset)
7418 {
7419   bfd_vma dist = 0x100000;
7420   Elf_Internal_Sym * sym;
7421   Elf_Internal_Sym * beg;
7422   Elf_Internal_Sym * end;
7423   Elf_Internal_Sym * best = NULL;
7424
7425   REMOVE_ARCH_BITS (addr.offset);
7426   beg = symtab;
7427   end = symtab + nsyms;
7428
7429   while (beg < end)
7430     {
7431       bfd_vma value;
7432
7433       sym = beg + (end - beg) / 2;
7434
7435       value = sym->st_value;
7436       REMOVE_ARCH_BITS (value);
7437
7438       if (sym->st_name != 0
7439           && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
7440           && addr.offset >= value
7441           && addr.offset - value < dist)
7442         {
7443           best = sym;
7444           dist = addr.offset - value;
7445           if (!dist)
7446             break;
7447         }
7448
7449       if (addr.offset < value)
7450         end = sym;
7451       else
7452         beg = sym + 1;
7453     }
7454
7455   if (best)
7456     {
7457       *symname = (best->st_name >= strtab_size
7458                   ? _("<corrupt>") : strtab + best->st_name);
7459       *offset = dist;
7460       return;
7461     }
7462
7463   *symname = NULL;
7464   *offset = addr.offset;
7465 }
7466
7467 static /* signed */ int
7468 symcmp (const void *p, const void *q)
7469 {
7470   Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7471   Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7472
7473   return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7474 }
7475
7476 /* Process the unwind section.  */
7477
7478 #include "unwind-ia64.h"
7479
7480 struct ia64_unw_table_entry
7481 {
7482   struct absaddr start;
7483   struct absaddr end;
7484   struct absaddr info;
7485 };
7486
7487 struct ia64_unw_aux_info
7488 {
7489   struct ia64_unw_table_entry * table;          /* Unwind table.  */
7490   unsigned long                 table_len;      /* Length of unwind table.  */
7491   unsigned char *               info;           /* Unwind info.  */
7492   unsigned long                 info_size;      /* Size of unwind info.  */
7493   bfd_vma                       info_addr;      /* Starting address of unwind info.  */
7494   bfd_vma                       seg_base;       /* Starting address of segment.  */
7495   Elf_Internal_Sym *            symtab;         /* The symbol table.  */
7496   unsigned long                 nsyms;          /* Number of symbols.  */
7497   Elf_Internal_Sym *            funtab;         /* Sorted table of STT_FUNC symbols.  */
7498   unsigned long                 nfuns;          /* Number of entries in funtab.  */
7499   char *                        strtab;         /* The string table.  */
7500   unsigned long                 strtab_size;    /* Size of string table.  */
7501 };
7502
7503 static bfd_boolean
7504 dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
7505 {
7506   struct ia64_unw_table_entry * tp;
7507   unsigned long j, nfuns;
7508   int in_body;
7509   bfd_boolean res = TRUE;
7510
7511   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7512   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7513     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7514       aux->funtab[nfuns++] = aux->symtab[j];
7515   aux->nfuns = nfuns;
7516   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7517
7518   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7519     {
7520       bfd_vma stamp;
7521       bfd_vma offset;
7522       const unsigned char * dp;
7523       const unsigned char * head;
7524       const unsigned char * end;
7525       const char * procname;
7526
7527       find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7528                                aux->strtab_size, tp->start, &procname, &offset);
7529
7530       fputs ("\n<", stdout);
7531
7532       if (procname)
7533         {
7534           fputs (procname, stdout);
7535
7536           if (offset)
7537             printf ("+%lx", (unsigned long) offset);
7538         }
7539
7540       fputs (">: [", stdout);
7541       print_vma (tp->start.offset, PREFIX_HEX);
7542       fputc ('-', stdout);
7543       print_vma (tp->end.offset, PREFIX_HEX);
7544       printf ("], info at +0x%lx\n",
7545               (unsigned long) (tp->info.offset - aux->seg_base));
7546
7547       /* PR 17531: file: 86232b32.  */
7548       if (aux->info == NULL)
7549         continue;
7550
7551       /* PR 17531: file: 0997b4d1.  */
7552       if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7553         {
7554           warn (_("Invalid offset %lx in table entry %ld\n"),
7555                 (long) tp->info.offset, (long) (tp - aux->table));
7556           res = FALSE;
7557           continue;
7558         }
7559
7560       head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
7561       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7562
7563       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7564               (unsigned) UNW_VER (stamp),
7565               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7566               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7567               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7568               (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7569
7570       if (UNW_VER (stamp) != 1)
7571         {
7572           printf (_("\tUnknown version.\n"));
7573           continue;
7574         }
7575
7576       in_body = 0;
7577       end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7578       /* PR 17531: file: 16ceda89.  */
7579       if (end > aux->info + aux->info_size)
7580         end = aux->info + aux->info_size;
7581       for (dp = head + 8; dp < end;)
7582         dp = unw_decode (dp, in_body, & in_body, end);
7583     }
7584
7585   free (aux->funtab);
7586
7587   return res;
7588 }
7589
7590 static bfd_boolean
7591 slurp_ia64_unwind_table (Filedata *                  filedata,
7592                          struct ia64_unw_aux_info *  aux,
7593                          Elf_Internal_Shdr *         sec)
7594 {
7595   unsigned long size, nrelas, i;
7596   Elf_Internal_Phdr * seg;
7597   struct ia64_unw_table_entry * tep;
7598   Elf_Internal_Shdr * relsec;
7599   Elf_Internal_Rela * rela;
7600   Elf_Internal_Rela * rp;
7601   unsigned char * table;
7602   unsigned char * tp;
7603   Elf_Internal_Sym * sym;
7604   const char * relname;
7605
7606   aux->table_len = 0;
7607
7608   /* First, find the starting address of the segment that includes
7609      this section: */
7610
7611   if (filedata->file_header.e_phnum)
7612     {
7613       if (! get_program_headers (filedata))
7614           return FALSE;
7615
7616       for (seg = filedata->program_headers;
7617            seg < filedata->program_headers + filedata->file_header.e_phnum;
7618            ++seg)
7619         {
7620           if (seg->p_type != PT_LOAD)
7621             continue;
7622
7623           if (sec->sh_addr >= seg->p_vaddr
7624               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7625             {
7626               aux->seg_base = seg->p_vaddr;
7627               break;
7628             }
7629         }
7630     }
7631
7632   /* Second, build the unwind table from the contents of the unwind section:  */
7633   size = sec->sh_size;
7634   table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7635                                       _("unwind table"));
7636   if (!table)
7637     return FALSE;
7638
7639   aux->table_len = size / (3 * eh_addr_size);
7640   aux->table = (struct ia64_unw_table_entry *)
7641     xcmalloc (aux->table_len, sizeof (aux->table[0]));
7642   tep = aux->table;
7643
7644   for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7645     {
7646       tep->start.section = SHN_UNDEF;
7647       tep->end.section   = SHN_UNDEF;
7648       tep->info.section  = SHN_UNDEF;
7649       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7650       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7651       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7652       tep->start.offset += aux->seg_base;
7653       tep->end.offset   += aux->seg_base;
7654       tep->info.offset  += aux->seg_base;
7655     }
7656   free (table);
7657
7658   /* Third, apply any relocations to the unwind table:  */
7659   for (relsec = filedata->section_headers;
7660        relsec < filedata->section_headers + filedata->file_header.e_shnum;
7661        ++relsec)
7662     {
7663       if (relsec->sh_type != SHT_RELA
7664           || relsec->sh_info >= filedata->file_header.e_shnum
7665           || filedata->section_headers + relsec->sh_info != sec)
7666         continue;
7667
7668       if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
7669                               & rela, & nrelas))
7670         {
7671           free (aux->table);
7672           aux->table = NULL;
7673           aux->table_len = 0;
7674           return FALSE;
7675         }
7676
7677       for (rp = rela; rp < rela + nrelas; ++rp)
7678         {
7679           unsigned int sym_ndx;
7680           unsigned int r_type = get_reloc_type (filedata, rp->r_info);
7681           relname = elf_ia64_reloc_type (r_type);
7682
7683           /* PR 17531: file: 9fa67536.  */
7684           if (relname == NULL)
7685             {
7686               warn (_("Skipping unknown relocation type: %u\n"), r_type);
7687               continue;
7688             }
7689
7690           if (! const_strneq (relname, "R_IA64_SEGREL"))
7691             {
7692               warn (_("Skipping unexpected relocation type: %s\n"), relname);
7693               continue;
7694             }
7695
7696           i = rp->r_offset / (3 * eh_addr_size);
7697
7698           /* PR 17531: file: 5bc8d9bf.  */
7699           if (i >= aux->table_len)
7700             {
7701               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7702               continue;
7703             }
7704
7705           sym_ndx = get_reloc_symindex (rp->r_info);
7706           if (sym_ndx >= aux->nsyms)
7707             {
7708               warn (_("Skipping reloc with invalid symbol index: %u\n"),
7709                     sym_ndx);
7710               continue;
7711             }
7712           sym = aux->symtab + sym_ndx;
7713
7714           switch (rp->r_offset / eh_addr_size % 3)
7715             {
7716             case 0:
7717               aux->table[i].start.section = sym->st_shndx;
7718               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
7719               break;
7720             case 1:
7721               aux->table[i].end.section   = sym->st_shndx;
7722               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
7723               break;
7724             case 2:
7725               aux->table[i].info.section  = sym->st_shndx;
7726               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
7727               break;
7728             default:
7729               break;
7730             }
7731         }
7732
7733       free (rela);
7734     }
7735
7736   return TRUE;
7737 }
7738
7739 static bfd_boolean
7740 ia64_process_unwind (Filedata * filedata)
7741 {
7742   Elf_Internal_Shdr * sec;
7743   Elf_Internal_Shdr * unwsec = NULL;
7744   Elf_Internal_Shdr * strsec;
7745   unsigned long i, unwcount = 0, unwstart = 0;
7746   struct ia64_unw_aux_info aux;
7747   bfd_boolean res = TRUE;
7748
7749   memset (& aux, 0, sizeof (aux));
7750
7751   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
7752     {
7753       if (sec->sh_type == SHT_SYMTAB
7754           && sec->sh_link < filedata->file_header.e_shnum)
7755         {
7756           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
7757
7758           strsec = filedata->section_headers + sec->sh_link;
7759           if (aux.strtab != NULL)
7760             {
7761               error (_("Multiple auxillary string tables encountered\n"));
7762               free (aux.strtab);
7763               res = FALSE;
7764             }
7765           aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7766                                           1, strsec->sh_size,
7767                                           _("string table"));
7768           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7769         }
7770       else if (sec->sh_type == SHT_IA_64_UNWIND)
7771         unwcount++;
7772     }
7773
7774   if (!unwcount)
7775     printf (_("\nThere are no unwind sections in this file.\n"));
7776
7777   while (unwcount-- > 0)
7778     {
7779       char * suffix;
7780       size_t len, len2;
7781
7782       for (i = unwstart, sec = filedata->section_headers + unwstart, unwsec = NULL;
7783            i < filedata->file_header.e_shnum; ++i, ++sec)
7784         if (sec->sh_type == SHT_IA_64_UNWIND)
7785           {
7786             unwsec = sec;
7787             break;
7788           }
7789       /* We have already counted the number of SHT_IA64_UNWIND
7790          sections so the loop above should never fail.  */
7791       assert (unwsec != NULL);
7792
7793       unwstart = i + 1;
7794       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7795
7796       if ((unwsec->sh_flags & SHF_GROUP) != 0)
7797         {
7798           /* We need to find which section group it is in.  */
7799           struct group_list * g;
7800
7801           if (section_headers_groups == NULL
7802               || section_headers_groups [i] == NULL)
7803             i = filedata->file_header.e_shnum;
7804           else
7805             {
7806               g = section_headers_groups [i]->root;
7807
7808               for (; g != NULL; g = g->next)
7809                 {
7810                   sec = filedata->section_headers + g->section_index;
7811
7812                   if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7813                     break;
7814                 }
7815
7816               if (g == NULL)
7817                 i = filedata->file_header.e_shnum;
7818             }
7819         }
7820       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7821         {
7822           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
7823           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7824           suffix = SECTION_NAME (unwsec) + len;
7825           for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7826                ++i, ++sec)
7827             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7828                 && streq (SECTION_NAME (sec) + len2, suffix))
7829               break;
7830         }
7831       else
7832         {
7833           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7834              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
7835           len = sizeof (ELF_STRING_ia64_unwind) - 1;
7836           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7837           suffix = "";
7838           if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7839             suffix = SECTION_NAME (unwsec) + len;
7840           for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7841                ++i, ++sec)
7842             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7843                 && streq (SECTION_NAME (sec) + len2, suffix))
7844               break;
7845         }
7846
7847       if (i == filedata->file_header.e_shnum)
7848         {
7849           printf (_("\nCould not find unwind info section for "));
7850
7851           if (filedata->string_table == NULL)
7852             printf ("%d", unwsec->sh_name);
7853           else
7854             printf ("'%s'", printable_section_name (filedata, unwsec));
7855         }
7856       else
7857         {
7858           aux.info_addr = sec->sh_addr;
7859           aux.info = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1,
7860                                                  sec->sh_size,
7861                                                  _("unwind info"));
7862           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7863
7864           printf (_("\nUnwind section "));
7865
7866           if (filedata->string_table == NULL)
7867             printf ("%d", unwsec->sh_name);
7868           else
7869             printf ("'%s'", printable_section_name (filedata, unwsec));
7870
7871           printf (_(" at offset 0x%lx contains %lu entries:\n"),
7872                   (unsigned long) unwsec->sh_offset,
7873                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7874
7875           if (slurp_ia64_unwind_table (filedata, & aux, unwsec)
7876               && aux.table_len > 0)
7877             dump_ia64_unwind (filedata, & aux);
7878
7879           if (aux.table)
7880             free ((char *) aux.table);
7881           if (aux.info)
7882             free ((char *) aux.info);
7883           aux.table = NULL;
7884           aux.info = NULL;
7885         }
7886     }
7887
7888   if (aux.symtab)
7889     free (aux.symtab);
7890   if (aux.strtab)
7891     free ((char *) aux.strtab);
7892
7893   return res;
7894 }
7895
7896 struct hppa_unw_table_entry
7897 {
7898   struct absaddr start;
7899   struct absaddr end;
7900   unsigned int Cannot_unwind:1;                 /* 0 */
7901   unsigned int Millicode:1;                     /* 1 */
7902   unsigned int Millicode_save_sr0:1;            /* 2 */
7903   unsigned int Region_description:2;            /* 3..4 */
7904   unsigned int reserved1:1;                     /* 5 */
7905   unsigned int Entry_SR:1;                      /* 6 */
7906   unsigned int Entry_FR:4;     /* Number saved     7..10 */
7907   unsigned int Entry_GR:5;     /* Number saved     11..15 */
7908   unsigned int Args_stored:1;                   /* 16 */
7909   unsigned int Variable_Frame:1;                /* 17 */
7910   unsigned int Separate_Package_Body:1;         /* 18 */
7911   unsigned int Frame_Extension_Millicode:1;     /* 19 */
7912   unsigned int Stack_Overflow_Check:1;          /* 20 */
7913   unsigned int Two_Instruction_SP_Increment:1;  /* 21 */
7914   unsigned int Ada_Region:1;                    /* 22 */
7915   unsigned int cxx_info:1;                      /* 23 */
7916   unsigned int cxx_try_catch:1;                 /* 24 */
7917   unsigned int sched_entry_seq:1;               /* 25 */
7918   unsigned int reserved2:1;                     /* 26 */
7919   unsigned int Save_SP:1;                       /* 27 */
7920   unsigned int Save_RP:1;                       /* 28 */
7921   unsigned int Save_MRP_in_frame:1;             /* 29 */
7922   unsigned int extn_ptr_defined:1;              /* 30 */
7923   unsigned int Cleanup_defined:1;               /* 31 */
7924
7925   unsigned int MPE_XL_interrupt_marker:1;       /* 0 */
7926   unsigned int HP_UX_interrupt_marker:1;        /* 1 */
7927   unsigned int Large_frame:1;                   /* 2 */
7928   unsigned int Pseudo_SP_Set:1;                 /* 3 */
7929   unsigned int reserved4:1;                     /* 4 */
7930   unsigned int Total_frame_size:27;             /* 5..31 */
7931 };
7932
7933 struct hppa_unw_aux_info
7934 {
7935   struct hppa_unw_table_entry *  table;         /* Unwind table.  */
7936   unsigned long                  table_len;     /* Length of unwind table.  */
7937   bfd_vma                        seg_base;      /* Starting address of segment.  */
7938   Elf_Internal_Sym *             symtab;        /* The symbol table.  */
7939   unsigned long                  nsyms;         /* Number of symbols.  */
7940   Elf_Internal_Sym *             funtab;        /* Sorted table of STT_FUNC symbols.  */
7941   unsigned long                  nfuns;         /* Number of entries in funtab.  */
7942   char *                         strtab;        /* The string table.  */
7943   unsigned long                  strtab_size;   /* Size of string table.  */
7944 };
7945
7946 static bfd_boolean
7947 dump_hppa_unwind (Filedata * filedata, struct hppa_unw_aux_info * aux)
7948 {
7949   struct hppa_unw_table_entry * tp;
7950   unsigned long j, nfuns;
7951   bfd_boolean res = TRUE;
7952
7953   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7954   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7955     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7956       aux->funtab[nfuns++] = aux->symtab[j];
7957   aux->nfuns = nfuns;
7958   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7959
7960   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7961     {
7962       bfd_vma offset;
7963       const char * procname;
7964
7965       find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7966                                aux->strtab_size, tp->start, &procname,
7967                                &offset);
7968
7969       fputs ("\n<", stdout);
7970
7971       if (procname)
7972         {
7973           fputs (procname, stdout);
7974
7975           if (offset)
7976             printf ("+%lx", (unsigned long) offset);
7977         }
7978
7979       fputs (">: [", stdout);
7980       print_vma (tp->start.offset, PREFIX_HEX);
7981       fputc ('-', stdout);
7982       print_vma (tp->end.offset, PREFIX_HEX);
7983       printf ("]\n\t");
7984
7985 #define PF(_m) if (tp->_m) printf (#_m " ");
7986 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7987       PF(Cannot_unwind);
7988       PF(Millicode);
7989       PF(Millicode_save_sr0);
7990       /* PV(Region_description);  */
7991       PF(Entry_SR);
7992       PV(Entry_FR);
7993       PV(Entry_GR);
7994       PF(Args_stored);
7995       PF(Variable_Frame);
7996       PF(Separate_Package_Body);
7997       PF(Frame_Extension_Millicode);
7998       PF(Stack_Overflow_Check);
7999       PF(Two_Instruction_SP_Increment);
8000       PF(Ada_Region);
8001       PF(cxx_info);
8002       PF(cxx_try_catch);
8003       PF(sched_entry_seq);
8004       PF(Save_SP);
8005       PF(Save_RP);
8006       PF(Save_MRP_in_frame);
8007       PF(extn_ptr_defined);
8008       PF(Cleanup_defined);
8009       PF(MPE_XL_interrupt_marker);
8010       PF(HP_UX_interrupt_marker);
8011       PF(Large_frame);
8012       PF(Pseudo_SP_Set);
8013       PV(Total_frame_size);
8014 #undef PF
8015 #undef PV
8016     }
8017
8018   printf ("\n");
8019
8020   free (aux->funtab);
8021
8022   return res;
8023 }
8024
8025 static bfd_boolean
8026 slurp_hppa_unwind_table (Filedata *                  filedata,
8027                          struct hppa_unw_aux_info *  aux,
8028                          Elf_Internal_Shdr *         sec)
8029 {
8030   unsigned long size, unw_ent_size, nentries, nrelas, i;
8031   Elf_Internal_Phdr * seg;
8032   struct hppa_unw_table_entry * tep;
8033   Elf_Internal_Shdr * relsec;
8034   Elf_Internal_Rela * rela;
8035   Elf_Internal_Rela * rp;
8036   unsigned char * table;
8037   unsigned char * tp;
8038   Elf_Internal_Sym * sym;
8039   const char * relname;
8040
8041   /* First, find the starting address of the segment that includes
8042      this section.  */
8043   if (filedata->file_header.e_phnum)
8044     {
8045       if (! get_program_headers (filedata))
8046         return FALSE;
8047
8048       for (seg = filedata->program_headers;
8049            seg < filedata->program_headers + filedata->file_header.e_phnum;
8050            ++seg)
8051         {
8052           if (seg->p_type != PT_LOAD)
8053             continue;
8054
8055           if (sec->sh_addr >= seg->p_vaddr
8056               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
8057             {
8058               aux->seg_base = seg->p_vaddr;
8059               break;
8060             }
8061         }
8062     }
8063
8064   /* Second, build the unwind table from the contents of the unwind
8065      section.  */
8066   size = sec->sh_size;
8067   table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
8068                                       _("unwind table"));
8069   if (!table)
8070     return FALSE;
8071
8072   unw_ent_size = 16;
8073   nentries = size / unw_ent_size;
8074   size = unw_ent_size * nentries;
8075
8076   tep = aux->table = (struct hppa_unw_table_entry *)
8077       xcmalloc (nentries, sizeof (aux->table[0]));
8078
8079   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
8080     {
8081       unsigned int tmp1, tmp2;
8082
8083       tep->start.section = SHN_UNDEF;
8084       tep->end.section   = SHN_UNDEF;
8085
8086       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
8087       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
8088       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
8089       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
8090
8091       tep->start.offset += aux->seg_base;
8092       tep->end.offset   += aux->seg_base;
8093
8094       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
8095       tep->Millicode = (tmp1 >> 30) & 0x1;
8096       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
8097       tep->Region_description = (tmp1 >> 27) & 0x3;
8098       tep->reserved1 = (tmp1 >> 26) & 0x1;
8099       tep->Entry_SR = (tmp1 >> 25) & 0x1;
8100       tep->Entry_FR = (tmp1 >> 21) & 0xf;
8101       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
8102       tep->Args_stored = (tmp1 >> 15) & 0x1;
8103       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
8104       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
8105       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
8106       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
8107       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
8108       tep->Ada_Region = (tmp1 >> 9) & 0x1;
8109       tep->cxx_info = (tmp1 >> 8) & 0x1;
8110       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
8111       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
8112       tep->reserved2 = (tmp1 >> 5) & 0x1;
8113       tep->Save_SP = (tmp1 >> 4) & 0x1;
8114       tep->Save_RP = (tmp1 >> 3) & 0x1;
8115       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
8116       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
8117       tep->Cleanup_defined = tmp1 & 0x1;
8118
8119       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
8120       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
8121       tep->Large_frame = (tmp2 >> 29) & 0x1;
8122       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
8123       tep->reserved4 = (tmp2 >> 27) & 0x1;
8124       tep->Total_frame_size = tmp2 & 0x7ffffff;
8125     }
8126   free (table);
8127
8128   /* Third, apply any relocations to the unwind table.  */
8129   for (relsec = filedata->section_headers;
8130        relsec < filedata->section_headers + filedata->file_header.e_shnum;
8131        ++relsec)
8132     {
8133       if (relsec->sh_type != SHT_RELA
8134           || relsec->sh_info >= filedata->file_header.e_shnum
8135           || filedata->section_headers + relsec->sh_info != sec)
8136         continue;
8137
8138       if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
8139                               & rela, & nrelas))
8140         return FALSE;
8141
8142       for (rp = rela; rp < rela + nrelas; ++rp)
8143         {
8144           unsigned int sym_ndx;
8145           unsigned int r_type = get_reloc_type (filedata, rp->r_info);
8146           relname = elf_hppa_reloc_type (r_type);
8147
8148           if (relname == NULL)
8149             {
8150               warn (_("Skipping unknown relocation type: %u\n"), r_type);
8151               continue;
8152             }
8153
8154           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
8155           if (! const_strneq (relname, "R_PARISC_SEGREL"))
8156             {
8157               warn (_("Skipping unexpected relocation type: %s\n"), relname);
8158               continue;
8159             }
8160
8161           i = rp->r_offset / unw_ent_size;
8162           if (i >= aux->table_len)
8163             {
8164               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
8165               continue;
8166             }
8167
8168           sym_ndx = get_reloc_symindex (rp->r_info);
8169           if (sym_ndx >= aux->nsyms)
8170             {
8171               warn (_("Skipping reloc with invalid symbol index: %u\n"),
8172                     sym_ndx);
8173               continue;
8174             }
8175           sym = aux->symtab + sym_ndx;
8176
8177           switch ((rp->r_offset % unw_ent_size) / 4)
8178             {
8179             case 0:
8180               aux->table[i].start.section = sym->st_shndx;
8181               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
8182               break;
8183             case 1:
8184               aux->table[i].end.section   = sym->st_shndx;
8185               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
8186               break;
8187             default:
8188               break;
8189             }
8190         }
8191
8192       free (rela);
8193     }
8194
8195   aux->table_len = nentries;
8196
8197   return TRUE;
8198 }
8199
8200 static bfd_boolean
8201 hppa_process_unwind (Filedata * filedata)
8202 {
8203   struct hppa_unw_aux_info aux;
8204   Elf_Internal_Shdr * unwsec = NULL;
8205   Elf_Internal_Shdr * strsec;
8206   Elf_Internal_Shdr * sec;
8207   unsigned long i;
8208   bfd_boolean res = TRUE;
8209
8210   if (filedata->string_table == NULL)
8211     return FALSE;
8212
8213   memset (& aux, 0, sizeof (aux));
8214
8215   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8216     {
8217       if (sec->sh_type == SHT_SYMTAB
8218           && sec->sh_link < filedata->file_header.e_shnum)
8219         {
8220           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
8221
8222           strsec = filedata->section_headers + sec->sh_link;
8223           if (aux.strtab != NULL)
8224             {
8225               error (_("Multiple auxillary string tables encountered\n"));
8226               free (aux.strtab);
8227               res = FALSE;
8228             }
8229           aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
8230                                           1, strsec->sh_size,
8231                                           _("string table"));
8232           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8233         }
8234       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8235         unwsec = sec;
8236     }
8237
8238   if (!unwsec)
8239     printf (_("\nThere are no unwind sections in this file.\n"));
8240
8241   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8242     {
8243       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8244         {
8245           unsigned long num_unwind = sec->sh_size / 16;
8246
8247           printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
8248                             "contains %lu entry:\n",
8249                             "\nUnwind section '%s' at offset 0x%lx "
8250                             "contains %lu entries:\n",
8251                             num_unwind),
8252                   printable_section_name (filedata, sec),
8253                   (unsigned long) sec->sh_offset,
8254                   num_unwind);
8255
8256           if (! slurp_hppa_unwind_table (filedata, &aux, sec))
8257             res = FALSE;
8258
8259           if (res && aux.table_len > 0)
8260             {
8261               if (! dump_hppa_unwind (filedata, &aux))
8262                 res = FALSE;
8263             }
8264
8265           if (aux.table)
8266             free ((char *) aux.table);
8267           aux.table = NULL;
8268         }
8269     }
8270
8271   if (aux.symtab)
8272     free (aux.symtab);
8273   if (aux.strtab)
8274     free ((char *) aux.strtab);
8275
8276   return res;
8277 }
8278
8279 struct arm_section
8280 {
8281   unsigned char *      data;            /* The unwind data.  */
8282   Elf_Internal_Shdr *  sec;             /* The cached unwind section header.  */
8283   Elf_Internal_Rela *  rela;            /* The cached relocations for this section.  */
8284   unsigned long        nrelas;          /* The number of relocations.  */
8285   unsigned int         rel_type;        /* REL or RELA ?  */
8286   Elf_Internal_Rela *  next_rela;       /* Cyclic pointer to the next reloc to process.  */
8287 };
8288
8289 struct arm_unw_aux_info
8290 {
8291   Filedata *          filedata;         /* The file containing the unwind sections.  */
8292   Elf_Internal_Sym *  symtab;           /* The file's symbol table.  */
8293   unsigned long       nsyms;            /* Number of symbols.  */
8294   Elf_Internal_Sym *  funtab;           /* Sorted table of STT_FUNC symbols.  */
8295   unsigned long       nfuns;            /* Number of these symbols.  */
8296   char *              strtab;           /* The file's string table.  */
8297   unsigned long       strtab_size;      /* Size of string table.  */
8298 };
8299
8300 static const char *
8301 arm_print_vma_and_name (Filedata *                 filedata,
8302                         struct arm_unw_aux_info *  aux,
8303                         bfd_vma                    fn,
8304                         struct absaddr             addr)
8305 {
8306   const char *procname;
8307   bfd_vma sym_offset;
8308
8309   if (addr.section == SHN_UNDEF)
8310     addr.offset = fn;
8311
8312   find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
8313                            aux->strtab_size, addr, &procname,
8314                            &sym_offset);
8315
8316   print_vma (fn, PREFIX_HEX);
8317
8318   if (procname)
8319     {
8320       fputs (" <", stdout);
8321       fputs (procname, stdout);
8322
8323       if (sym_offset)
8324         printf ("+0x%lx", (unsigned long) sym_offset);
8325       fputc ('>', stdout);
8326     }
8327
8328   return procname;
8329 }
8330
8331 static void
8332 arm_free_section (struct arm_section *arm_sec)
8333 {
8334   if (arm_sec->data != NULL)
8335     free (arm_sec->data);
8336
8337   if (arm_sec->rela != NULL)
8338     free (arm_sec->rela);
8339 }
8340
8341 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
8342       cached section and install SEC instead.
8343    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
8344       and return its valued in * WORDP, relocating if necessary.
8345    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
8346       relocation's offset in ADDR.
8347    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
8348       into the string table of the symbol associated with the reloc.  If no
8349       reloc was applied store -1 there.
8350    5) Return TRUE upon success, FALSE otherwise.  */
8351
8352 static bfd_boolean
8353 get_unwind_section_word (Filedata *                 filedata,
8354                          struct arm_unw_aux_info *  aux,
8355                          struct arm_section *       arm_sec,
8356                          Elf_Internal_Shdr *        sec,
8357                          bfd_vma                    word_offset,
8358                          unsigned int *             wordp,
8359                          struct absaddr *           addr,
8360                          bfd_vma *                  sym_name)
8361 {
8362   Elf_Internal_Rela *rp;
8363   Elf_Internal_Sym *sym;
8364   const char * relname;
8365   unsigned int word;
8366   bfd_boolean wrapped;
8367
8368   if (sec == NULL || arm_sec == NULL)
8369     return FALSE;
8370
8371   addr->section = SHN_UNDEF;
8372   addr->offset = 0;
8373
8374   if (sym_name != NULL)
8375     *sym_name = (bfd_vma) -1;
8376
8377   /* If necessary, update the section cache.  */
8378   if (sec != arm_sec->sec)
8379     {
8380       Elf_Internal_Shdr *relsec;
8381
8382       arm_free_section (arm_sec);
8383
8384       arm_sec->sec = sec;
8385       arm_sec->data = get_data (NULL, aux->filedata, sec->sh_offset, 1,
8386                                 sec->sh_size, _("unwind data"));
8387       arm_sec->rela = NULL;
8388       arm_sec->nrelas = 0;
8389
8390       for (relsec = filedata->section_headers;
8391            relsec < filedata->section_headers + filedata->file_header.e_shnum;
8392            ++relsec)
8393         {
8394           if (relsec->sh_info >= filedata->file_header.e_shnum
8395               || filedata->section_headers + relsec->sh_info != sec
8396               /* PR 15745: Check the section type as well.  */
8397               || (relsec->sh_type != SHT_REL
8398                   && relsec->sh_type != SHT_RELA))
8399             continue;
8400
8401           arm_sec->rel_type = relsec->sh_type;
8402           if (relsec->sh_type == SHT_REL)
8403             {
8404               if (!slurp_rel_relocs (aux->filedata, relsec->sh_offset,
8405                                      relsec->sh_size,
8406                                      & arm_sec->rela, & arm_sec->nrelas))
8407                 return FALSE;
8408             }
8409           else /* relsec->sh_type == SHT_RELA */
8410             {
8411               if (!slurp_rela_relocs (aux->filedata, relsec->sh_offset,
8412                                       relsec->sh_size,
8413                                       & arm_sec->rela, & arm_sec->nrelas))
8414                 return FALSE;
8415             }
8416           break;
8417         }
8418
8419       arm_sec->next_rela = arm_sec->rela;
8420     }
8421
8422   /* If there is no unwind data we can do nothing.  */
8423   if (arm_sec->data == NULL)
8424     return FALSE;
8425
8426   /* If the offset is invalid then fail.  */
8427   if (/* PR 21343 *//* PR 18879 */
8428       sec->sh_size < 4
8429       || word_offset > (sec->sh_size - 4)
8430       || ((bfd_signed_vma) word_offset) < 0)
8431     return FALSE;
8432
8433   /* Get the word at the required offset.  */
8434   word = byte_get (arm_sec->data + word_offset, 4);
8435
8436   /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128.  */
8437   if (arm_sec->rela == NULL)
8438     {
8439       * wordp = word;
8440       return TRUE;
8441     }
8442
8443   /* Look through the relocs to find the one that applies to the provided offset.  */
8444   wrapped = FALSE;
8445   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
8446     {
8447       bfd_vma prelval, offset;
8448
8449       if (rp->r_offset > word_offset && !wrapped)
8450         {
8451           rp = arm_sec->rela;
8452           wrapped = TRUE;
8453         }
8454       if (rp->r_offset > word_offset)
8455         break;
8456
8457       if (rp->r_offset & 3)
8458         {
8459           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8460                 (unsigned long) rp->r_offset);
8461           continue;
8462         }
8463
8464       if (rp->r_offset < word_offset)
8465         continue;
8466
8467       /* PR 17531: file: 027-161405-0.004  */
8468       if (aux->symtab == NULL)
8469         continue;
8470
8471       if (arm_sec->rel_type == SHT_REL)
8472         {
8473           offset = word & 0x7fffffff;
8474           if (offset & 0x40000000)
8475             offset |= ~ (bfd_vma) 0x7fffffff;
8476         }
8477       else if (arm_sec->rel_type == SHT_RELA)
8478         offset = rp->r_addend;
8479       else
8480         {
8481           error (_("Unknown section relocation type %d encountered\n"),
8482                  arm_sec->rel_type);
8483           break;
8484         }
8485
8486       /* PR 17531 file: 027-1241568-0.004.  */
8487       if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8488         {
8489           error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8490                  (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8491           break;
8492         }
8493
8494       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
8495       offset += sym->st_value;
8496       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8497
8498       /* Check that we are processing the expected reloc type.  */
8499       if (filedata->file_header.e_machine == EM_ARM)
8500         {
8501           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
8502           if (relname == NULL)
8503             {
8504               warn (_("Skipping unknown ARM relocation type: %d\n"),
8505                     (int) ELF32_R_TYPE (rp->r_info));
8506               continue;
8507             }
8508
8509           if (streq (relname, "R_ARM_NONE"))
8510               continue;
8511
8512           if (! streq (relname, "R_ARM_PREL31"))
8513             {
8514               warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
8515               continue;
8516             }
8517         }
8518       else if (filedata->file_header.e_machine == EM_TI_C6000)
8519         {
8520           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
8521           if (relname == NULL)
8522             {
8523               warn (_("Skipping unknown C6000 relocation type: %d\n"),
8524                     (int) ELF32_R_TYPE (rp->r_info));
8525               continue;
8526             }
8527
8528           if (streq (relname, "R_C6000_NONE"))
8529             continue;
8530
8531           if (! streq (relname, "R_C6000_PREL31"))
8532             {
8533               warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
8534               continue;
8535             }
8536
8537           prelval >>= 1;
8538         }
8539       else
8540         {
8541           /* This function currently only supports ARM and TI unwinders.  */
8542           warn (_("Only TI and ARM unwinders are currently supported\n"));
8543           break;
8544         }
8545
8546       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8547       addr->section = sym->st_shndx;
8548       addr->offset = offset;
8549
8550       if (sym_name)
8551         * sym_name = sym->st_name;
8552       break;
8553     }
8554
8555   *wordp = word;
8556   arm_sec->next_rela = rp;
8557
8558   return TRUE;
8559 }
8560
8561 static const char *tic6x_unwind_regnames[16] =
8562 {
8563   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8564   "A14", "A13", "A12", "A11", "A10",
8565   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8566 };
8567
8568 static void
8569 decode_tic6x_unwind_regmask (unsigned int mask)
8570 {
8571   int i;
8572
8573   for (i = 12; mask; mask >>= 1, i--)
8574     {
8575       if (mask & 1)
8576         {
8577           fputs (tic6x_unwind_regnames[i], stdout);
8578           if (mask > 1)
8579             fputs (", ", stdout);
8580         }
8581     }
8582 }
8583
8584 #define ADVANCE                                                 \
8585   if (remaining == 0 && more_words)                             \
8586     {                                                           \
8587       data_offset += 4;                                         \
8588       if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec,     \
8589                                      data_offset, & word, & addr, NULL))        \
8590         return FALSE;                                           \
8591       remaining = 4;                                            \
8592       more_words--;                                             \
8593     }                                                           \
8594
8595 #define GET_OP(OP)                      \
8596   ADVANCE;                              \
8597   if (remaining)                        \
8598     {                                   \
8599       remaining--;                      \
8600       (OP) = word >> 24;                \
8601       word <<= 8;                       \
8602     }                                   \
8603   else                                  \
8604     {                                   \
8605       printf (_("[Truncated opcode]\n"));       \
8606       return FALSE;                     \
8607     }                                   \
8608   printf ("0x%02x ", OP)
8609
8610 static bfd_boolean
8611 decode_arm_unwind_bytecode (Filedata *                 filedata,
8612                             struct arm_unw_aux_info *  aux,
8613                             unsigned int               word,
8614                             unsigned int               remaining,
8615                             unsigned int               more_words,
8616                             bfd_vma                    data_offset,
8617                             Elf_Internal_Shdr *        data_sec,
8618                             struct arm_section *       data_arm_sec)
8619 {
8620   struct absaddr addr;
8621   bfd_boolean res = TRUE;
8622
8623   /* Decode the unwinding instructions.  */
8624   while (1)
8625     {
8626       unsigned int op, op2;
8627
8628       ADVANCE;
8629       if (remaining == 0)
8630         break;
8631       remaining--;
8632       op = word >> 24;
8633       word <<= 8;
8634
8635       printf ("  0x%02x ", op);
8636
8637       if ((op & 0xc0) == 0x00)
8638         {
8639           int offset = ((op & 0x3f) << 2) + 4;
8640
8641           printf ("     vsp = vsp + %d", offset);
8642         }
8643       else if ((op & 0xc0) == 0x40)
8644         {
8645           int offset = ((op & 0x3f) << 2) + 4;
8646
8647           printf ("     vsp = vsp - %d", offset);
8648         }
8649       else if ((op & 0xf0) == 0x80)
8650         {
8651           GET_OP (op2);
8652           if (op == 0x80 && op2 == 0)
8653             printf (_("Refuse to unwind"));
8654           else
8655             {
8656               unsigned int mask = ((op & 0x0f) << 8) | op2;
8657               bfd_boolean first = TRUE;
8658               int i;
8659
8660               printf ("pop {");
8661               for (i = 0; i < 12; i++)
8662                 if (mask & (1 << i))
8663                   {
8664                     if (first)
8665                       first = FALSE;
8666                     else
8667                       printf (", ");
8668                     printf ("r%d", 4 + i);
8669                   }
8670               printf ("}");
8671             }
8672         }
8673       else if ((op & 0xf0) == 0x90)
8674         {
8675           if (op == 0x9d || op == 0x9f)
8676             printf (_("     [Reserved]"));
8677           else
8678             printf ("     vsp = r%d", op & 0x0f);
8679         }
8680       else if ((op & 0xf0) == 0xa0)
8681         {
8682           int end = 4 + (op & 0x07);
8683           bfd_boolean first = TRUE;
8684           int i;
8685
8686           printf ("     pop {");
8687           for (i = 4; i <= end; i++)
8688             {
8689               if (first)
8690                 first = FALSE;
8691               else
8692                 printf (", ");
8693               printf ("r%d", i);
8694             }
8695           if (op & 0x08)
8696             {
8697               if (!first)
8698                 printf (", ");
8699               printf ("r14");
8700             }
8701           printf ("}");
8702         }
8703       else if (op == 0xb0)
8704         printf (_("     finish"));
8705       else if (op == 0xb1)
8706         {
8707           GET_OP (op2);
8708           if (op2 == 0 || (op2 & 0xf0) != 0)
8709             printf (_("[Spare]"));
8710           else
8711             {
8712               unsigned int mask = op2 & 0x0f;
8713               bfd_boolean first = TRUE;
8714               int i;
8715
8716               printf ("pop {");
8717               for (i = 0; i < 12; i++)
8718                 if (mask & (1 << i))
8719                   {
8720                     if (first)
8721                       first = FALSE;
8722                     else
8723                       printf (", ");
8724                     printf ("r%d", i);
8725                   }
8726               printf ("}");
8727             }
8728         }
8729       else if (op == 0xb2)
8730         {
8731           unsigned char buf[9];
8732           unsigned int i, len;
8733           unsigned long offset;
8734
8735           for (i = 0; i < sizeof (buf); i++)
8736             {
8737               GET_OP (buf[i]);
8738               if ((buf[i] & 0x80) == 0)
8739                 break;
8740             }
8741           if (i == sizeof (buf))
8742             {
8743               error (_("corrupt change to vsp"));
8744               res = FALSE;
8745             }
8746           else
8747             {
8748               offset = read_uleb128 (buf, &len, buf + i + 1);
8749               assert (len == i + 1);
8750               offset = offset * 4 + 0x204;
8751               printf ("vsp = vsp + %ld", offset);
8752             }
8753         }
8754       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8755         {
8756           unsigned int first, last;
8757
8758           GET_OP (op2);
8759           first = op2 >> 4;
8760           last = op2 & 0x0f;
8761           if (op == 0xc8)
8762             first = first + 16;
8763           printf ("pop {D%d", first);
8764           if (last)
8765             printf ("-D%d", first + last);
8766           printf ("}");
8767         }
8768       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8769         {
8770           unsigned int count = op & 0x07;
8771
8772           printf ("pop {D8");
8773           if (count)
8774             printf ("-D%d", 8 + count);
8775           printf ("}");
8776         }
8777       else if (op >= 0xc0 && op <= 0xc5)
8778         {
8779           unsigned int count = op & 0x07;
8780
8781           printf ("     pop {wR10");
8782           if (count)
8783             printf ("-wR%d", 10 + count);
8784           printf ("}");
8785         }
8786       else if (op == 0xc6)
8787         {
8788           unsigned int first, last;
8789
8790           GET_OP (op2);
8791           first = op2 >> 4;
8792           last = op2 & 0x0f;
8793           printf ("pop {wR%d", first);
8794           if (last)
8795             printf ("-wR%d", first + last);
8796           printf ("}");
8797         }
8798       else if (op == 0xc7)
8799         {
8800           GET_OP (op2);
8801           if (op2 == 0 || (op2 & 0xf0) != 0)
8802             printf (_("[Spare]"));
8803           else
8804             {
8805               unsigned int mask = op2 & 0x0f;
8806               bfd_boolean first = TRUE;
8807               int i;
8808
8809               printf ("pop {");
8810               for (i = 0; i < 4; i++)
8811                 if (mask & (1 << i))
8812                   {
8813                     if (first)
8814                       first = FALSE;
8815                     else
8816                       printf (", ");
8817                     printf ("wCGR%d", i);
8818                   }
8819               printf ("}");
8820             }
8821         }
8822       else
8823         {
8824           printf (_("     [unsupported opcode]"));
8825           res = FALSE;
8826         }
8827
8828       printf ("\n");
8829     }
8830
8831   return res;
8832 }
8833
8834 static bfd_boolean
8835 decode_tic6x_unwind_bytecode (Filedata *                 filedata,
8836                               struct arm_unw_aux_info *  aux,
8837                               unsigned int               word,
8838                               unsigned int               remaining,
8839                               unsigned int               more_words,
8840                               bfd_vma                    data_offset,
8841                               Elf_Internal_Shdr *        data_sec,
8842                               struct arm_section *       data_arm_sec)
8843 {
8844   struct absaddr addr;
8845
8846   /* Decode the unwinding instructions.  */
8847   while (1)
8848     {
8849       unsigned int op, op2;
8850
8851       ADVANCE;
8852       if (remaining == 0)
8853         break;
8854       remaining--;
8855       op = word >> 24;
8856       word <<= 8;
8857
8858       printf ("  0x%02x ", op);
8859
8860       if ((op & 0xc0) == 0x00)
8861         {
8862           int offset = ((op & 0x3f) << 3) + 8;
8863           printf ("     sp = sp + %d", offset);
8864         }
8865       else if ((op & 0xc0) == 0x80)
8866         {
8867           GET_OP (op2);
8868           if (op == 0x80 && op2 == 0)
8869             printf (_("Refuse to unwind"));
8870           else
8871             {
8872               unsigned int mask = ((op & 0x1f) << 8) | op2;
8873               if (op & 0x20)
8874                 printf ("pop compact {");
8875               else
8876                 printf ("pop {");
8877
8878               decode_tic6x_unwind_regmask (mask);
8879               printf("}");
8880             }
8881         }
8882       else if ((op & 0xf0) == 0xc0)
8883         {
8884           unsigned int reg;
8885           unsigned int nregs;
8886           unsigned int i;
8887           const char *name;
8888           struct
8889           {
8890             unsigned int offset;
8891             unsigned int reg;
8892           } regpos[16];
8893
8894           /* Scan entire instruction first so that GET_OP output is not
8895              interleaved with disassembly.  */
8896           nregs = 0;
8897           for (i = 0; nregs < (op & 0xf); i++)
8898             {
8899               GET_OP (op2);
8900               reg = op2 >> 4;
8901               if (reg != 0xf)
8902                 {
8903                   regpos[nregs].offset = i * 2;
8904                   regpos[nregs].reg = reg;
8905                   nregs++;
8906                 }
8907
8908               reg = op2 & 0xf;
8909               if (reg != 0xf)
8910                 {
8911                   regpos[nregs].offset = i * 2 + 1;
8912                   regpos[nregs].reg = reg;
8913                   nregs++;
8914                 }
8915             }
8916
8917           printf (_("pop frame {"));
8918           if (nregs == 0)
8919             {
8920               printf (_("*corrupt* - no registers specified"));
8921             }
8922           else
8923             {
8924               reg = nregs - 1;
8925               for (i = i * 2; i > 0; i--)
8926                 {
8927                   if (regpos[reg].offset == i - 1)
8928                     {
8929                       name = tic6x_unwind_regnames[regpos[reg].reg];
8930                       if (reg > 0)
8931                         reg--;
8932                     }
8933                   else
8934                     name = _("[pad]");
8935
8936                   fputs (name, stdout);
8937                   if (i > 1)
8938                     printf (", ");
8939                 }
8940             }
8941
8942           printf ("}");
8943         }
8944       else if (op == 0xd0)
8945         printf ("     MOV FP, SP");
8946       else if (op == 0xd1)
8947         printf ("     __c6xabi_pop_rts");
8948       else if (op == 0xd2)
8949         {
8950           unsigned char buf[9];
8951           unsigned int i, len;
8952           unsigned long offset;
8953
8954           for (i = 0; i < sizeof (buf); i++)
8955             {
8956               GET_OP (buf[i]);
8957               if ((buf[i] & 0x80) == 0)
8958                 break;
8959             }
8960           /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2.  */
8961           if (i == sizeof (buf))
8962             {
8963               warn (_("Corrupt stack pointer adjustment detected\n"));
8964               return FALSE;
8965             }
8966
8967           offset = read_uleb128 (buf, &len, buf + i + 1);
8968           assert (len == i + 1);
8969           offset = offset * 8 + 0x408;
8970           printf (_("sp = sp + %ld"), offset);
8971         }
8972       else if ((op & 0xf0) == 0xe0)
8973         {
8974           if ((op & 0x0f) == 7)
8975             printf ("     RETURN");
8976           else
8977             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8978         }
8979       else
8980         {
8981           printf (_("     [unsupported opcode]"));
8982         }
8983       putchar ('\n');
8984     }
8985
8986   return TRUE;
8987 }
8988
8989 static bfd_vma
8990 arm_expand_prel31 (Filedata * filedata, bfd_vma word, bfd_vma where)
8991 {
8992   bfd_vma offset;
8993
8994   offset = word & 0x7fffffff;
8995   if (offset & 0x40000000)
8996     offset |= ~ (bfd_vma) 0x7fffffff;
8997
8998   if (filedata->file_header.e_machine == EM_TI_C6000)
8999     offset <<= 1;
9000
9001   return offset + where;
9002 }
9003
9004 static bfd_boolean
9005 decode_arm_unwind (Filedata *                 filedata,
9006                    struct arm_unw_aux_info *  aux,
9007                    unsigned int               word,
9008                    unsigned int               remaining,
9009                    bfd_vma                    data_offset,
9010                    Elf_Internal_Shdr *        data_sec,
9011                    struct arm_section *       data_arm_sec)
9012 {
9013   int per_index;
9014   unsigned int more_words = 0;
9015   struct absaddr addr;
9016   bfd_vma sym_name = (bfd_vma) -1;
9017   bfd_boolean res = TRUE;
9018
9019   if (remaining == 0)
9020     {
9021       /* Fetch the first word.
9022          Note - when decoding an object file the address extracted
9023          here will always be 0.  So we also pass in the sym_name
9024          parameter so that we can find the symbol associated with
9025          the personality routine.  */
9026       if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, data_offset,
9027                                      & word, & addr, & sym_name))
9028         return FALSE;
9029
9030       remaining = 4;
9031     }
9032
9033   if ((word & 0x80000000) == 0)
9034     {
9035       /* Expand prel31 for personality routine.  */
9036       bfd_vma fn;
9037       const char *procname;
9038
9039       fn = arm_expand_prel31 (filedata, word, data_sec->sh_addr + data_offset);
9040       printf (_("  Personality routine: "));
9041       if (fn == 0
9042           && addr.section == SHN_UNDEF && addr.offset == 0
9043           && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
9044         {
9045           procname = aux->strtab + sym_name;
9046           print_vma (fn, PREFIX_HEX);
9047           if (procname)
9048             {
9049               fputs (" <", stdout);
9050               fputs (procname, stdout);
9051               fputc ('>', stdout);
9052             }
9053         }
9054       else
9055         procname = arm_print_vma_and_name (filedata, aux, fn, addr);
9056       fputc ('\n', stdout);
9057
9058       /* The GCC personality routines use the standard compact
9059          encoding, starting with one byte giving the number of
9060          words.  */
9061       if (procname != NULL
9062           && (const_strneq (procname, "__gcc_personality_v0")
9063               || const_strneq (procname, "__gxx_personality_v0")
9064               || const_strneq (procname, "__gcj_personality_v0")
9065               || const_strneq (procname, "__gnu_objc_personality_v0")))
9066         {
9067           remaining = 0;
9068           more_words = 1;
9069           ADVANCE;
9070           if (!remaining)
9071             {
9072               printf (_("  [Truncated data]\n"));
9073               return FALSE;
9074             }
9075           more_words = word >> 24;
9076           word <<= 8;
9077           remaining--;
9078           per_index = -1;
9079         }
9080       else
9081         return TRUE;
9082     }
9083   else
9084     {
9085       /* ARM EHABI Section 6.3:
9086
9087          An exception-handling table entry for the compact model looks like:
9088
9089            31 30-28 27-24 23-0
9090            -- ----- ----- ----
9091             1   0   index Data for personalityRoutine[index]    */
9092
9093       if (filedata->file_header.e_machine == EM_ARM
9094           && (word & 0x70000000))
9095         {
9096           warn (_("Corrupt ARM compact model table entry: %x \n"), word);
9097           res = FALSE;
9098         }
9099
9100       per_index = (word >> 24) & 0x7f;
9101       printf (_("  Compact model index: %d\n"), per_index);
9102       if (per_index == 0)
9103         {
9104           more_words = 0;
9105           word <<= 8;
9106           remaining--;
9107         }
9108       else if (per_index < 3)
9109         {
9110           more_words = (word >> 16) & 0xff;
9111           word <<= 16;
9112           remaining -= 2;
9113         }
9114     }
9115
9116   switch (filedata->file_header.e_machine)
9117     {
9118     case EM_ARM:
9119       if (per_index < 3)
9120         {
9121           if (! decode_arm_unwind_bytecode (filedata, aux, word, remaining, more_words,
9122                                             data_offset, data_sec, data_arm_sec))
9123             res = FALSE;
9124         }
9125       else
9126         {
9127           warn (_("Unknown ARM compact model index encountered\n"));
9128           printf (_("  [reserved]\n"));
9129           res = FALSE;
9130         }
9131       break;
9132
9133     case EM_TI_C6000:
9134       if (per_index < 3)
9135         {
9136           if (! decode_tic6x_unwind_bytecode (filedata, aux, word, remaining, more_words,
9137                                               data_offset, data_sec, data_arm_sec))
9138             res = FALSE;
9139         }
9140       else if (per_index < 5)
9141         {
9142           if (((word >> 17) & 0x7f) == 0x7f)
9143             printf (_("  Restore stack from frame pointer\n"));
9144           else
9145             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
9146           printf (_("  Registers restored: "));
9147           if (per_index == 4)
9148             printf (" (compact) ");
9149           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
9150           putchar ('\n');
9151           printf (_("  Return register: %s\n"),
9152                   tic6x_unwind_regnames[word & 0xf]);
9153         }
9154       else
9155         printf (_("  [reserved (%d)]\n"), per_index);
9156       break;
9157
9158     default:
9159       error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
9160              filedata->file_header.e_machine);
9161       res = FALSE;
9162     }
9163
9164   /* Decode the descriptors.  Not implemented.  */
9165
9166   return res;
9167 }
9168
9169 static bfd_boolean
9170 dump_arm_unwind (Filedata *                 filedata,
9171                  struct arm_unw_aux_info *  aux,
9172                  Elf_Internal_Shdr *        exidx_sec)
9173 {
9174   struct arm_section exidx_arm_sec, extab_arm_sec;
9175   unsigned int i, exidx_len;
9176   unsigned long j, nfuns;
9177   bfd_boolean res = TRUE;
9178
9179   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
9180   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
9181   exidx_len = exidx_sec->sh_size / 8;
9182
9183   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
9184   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
9185     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
9186       aux->funtab[nfuns++] = aux->symtab[j];
9187   aux->nfuns = nfuns;
9188   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
9189
9190   for (i = 0; i < exidx_len; i++)
9191     {
9192       unsigned int exidx_fn, exidx_entry;
9193       struct absaddr fn_addr, entry_addr;
9194       bfd_vma fn;
9195
9196       fputc ('\n', stdout);
9197
9198       if (! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9199                                      8 * i, & exidx_fn, & fn_addr, NULL)
9200           || ! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9201                                         8 * i + 4, & exidx_entry, & entry_addr, NULL))
9202         {
9203           free (aux->funtab);
9204           arm_free_section (& exidx_arm_sec);
9205           arm_free_section (& extab_arm_sec);
9206           return FALSE;
9207         }
9208
9209       /* ARM EHABI, Section 5:
9210          An index table entry consists of 2 words.
9211          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
9212       if (exidx_fn & 0x80000000)
9213         {
9214           warn (_("corrupt index table entry: %x\n"), exidx_fn);
9215           res = FALSE;
9216         }
9217
9218       fn = arm_expand_prel31 (filedata, exidx_fn, exidx_sec->sh_addr + 8 * i);
9219
9220       arm_print_vma_and_name (filedata, aux, fn, fn_addr);
9221       fputs (": ", stdout);
9222
9223       if (exidx_entry == 1)
9224         {
9225           print_vma (exidx_entry, PREFIX_HEX);
9226           fputs (" [cantunwind]\n", stdout);
9227         }
9228       else if (exidx_entry & 0x80000000)
9229         {
9230           print_vma (exidx_entry, PREFIX_HEX);
9231           fputc ('\n', stdout);
9232           decode_arm_unwind (filedata, aux, exidx_entry, 4, 0, NULL, NULL);
9233         }
9234       else
9235         {
9236           bfd_vma table, table_offset = 0;
9237           Elf_Internal_Shdr *table_sec;
9238
9239           fputs ("@", stdout);
9240           table = arm_expand_prel31 (filedata, exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
9241           print_vma (table, PREFIX_HEX);
9242           printf ("\n");
9243
9244           /* Locate the matching .ARM.extab.  */
9245           if (entry_addr.section != SHN_UNDEF
9246               && entry_addr.section < filedata->file_header.e_shnum)
9247             {
9248               table_sec = filedata->section_headers + entry_addr.section;
9249               table_offset = entry_addr.offset;
9250               /* PR 18879 */
9251               if (table_offset > table_sec->sh_size
9252                   || ((bfd_signed_vma) table_offset) < 0)
9253                 {
9254                   warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
9255                         (unsigned long) table_offset,
9256                         printable_section_name (filedata, table_sec));
9257                   res = FALSE;
9258                   continue;
9259                 }
9260             }
9261           else
9262             {
9263               table_sec = find_section_by_address (filedata, table);
9264               if (table_sec != NULL)
9265                 table_offset = table - table_sec->sh_addr;
9266             }
9267
9268           if (table_sec == NULL)
9269             {
9270               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
9271                     (unsigned long) table);
9272               res = FALSE;
9273               continue;
9274             }
9275
9276           if (! decode_arm_unwind (filedata, aux, 0, 0, table_offset, table_sec,
9277                                    &extab_arm_sec))
9278             res = FALSE;
9279         }
9280     }
9281
9282   printf ("\n");
9283
9284   free (aux->funtab);
9285   arm_free_section (&exidx_arm_sec);
9286   arm_free_section (&extab_arm_sec);
9287
9288   return res;
9289 }
9290
9291 /* Used for both ARM and C6X unwinding tables.  */
9292
9293 static bfd_boolean
9294 arm_process_unwind (Filedata * filedata)
9295 {
9296   struct arm_unw_aux_info aux;
9297   Elf_Internal_Shdr *unwsec = NULL;
9298   Elf_Internal_Shdr *strsec;
9299   Elf_Internal_Shdr *sec;
9300   unsigned long i;
9301   unsigned int sec_type;
9302   bfd_boolean res = TRUE;
9303
9304   switch (filedata->file_header.e_machine)
9305     {
9306     case EM_ARM:
9307       sec_type = SHT_ARM_EXIDX;
9308       break;
9309
9310     case EM_TI_C6000:
9311       sec_type = SHT_C6000_UNWIND;
9312       break;
9313
9314     default:
9315       error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
9316              filedata->file_header.e_machine);
9317       return FALSE;
9318     }
9319
9320   if (filedata->string_table == NULL)
9321     return FALSE;
9322
9323   memset (& aux, 0, sizeof (aux));
9324   aux.filedata = filedata;
9325
9326   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9327     {
9328       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < filedata->file_header.e_shnum)
9329         {
9330           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
9331
9332           strsec = filedata->section_headers + sec->sh_link;
9333
9334           /* PR binutils/17531 file: 011-12666-0.004.  */
9335           if (aux.strtab != NULL)
9336             {
9337               error (_("Multiple string tables found in file.\n"));
9338               free (aux.strtab);
9339               res = FALSE;
9340             }
9341           aux.strtab = get_data (NULL, filedata, strsec->sh_offset,
9342                                  1, strsec->sh_size, _("string table"));
9343           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
9344         }
9345       else if (sec->sh_type == sec_type)
9346         unwsec = sec;
9347     }
9348
9349   if (unwsec == NULL)
9350     printf (_("\nThere are no unwind sections in this file.\n"));
9351   else
9352     for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9353       {
9354         if (sec->sh_type == sec_type)
9355           {
9356             unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size);
9357             printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
9358                               "contains %lu entry:\n",
9359                               "\nUnwind section '%s' at offset 0x%lx "
9360                               "contains %lu entries:\n",
9361                               num_unwind),
9362                     printable_section_name (filedata, sec),
9363                     (unsigned long) sec->sh_offset,
9364                     num_unwind);
9365
9366             if (! dump_arm_unwind (filedata, &aux, sec))
9367               res = FALSE;
9368           }
9369       }
9370
9371   if (aux.symtab)
9372     free (aux.symtab);
9373   if (aux.strtab)
9374     free ((char *) aux.strtab);
9375
9376   return res;
9377 }
9378
9379 static bfd_boolean
9380 process_unwind (Filedata * filedata)
9381 {
9382   struct unwind_handler
9383   {
9384     unsigned int machtype;
9385     bfd_boolean (* handler)(Filedata *);
9386   } handlers[] =
9387   {
9388     { EM_ARM, arm_process_unwind },
9389     { EM_IA_64, ia64_process_unwind },
9390     { EM_PARISC, hppa_process_unwind },
9391     { EM_TI_C6000, arm_process_unwind },
9392     { 0, NULL }
9393   };
9394   int i;
9395
9396   if (!do_unwind)
9397     return TRUE;
9398
9399   for (i = 0; handlers[i].handler != NULL; i++)
9400     if (filedata->file_header.e_machine == handlers[i].machtype)
9401       return handlers[i].handler (filedata);
9402
9403   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
9404           get_machine_name (filedata->file_header.e_machine));
9405   return TRUE;
9406 }
9407
9408 static void
9409 dynamic_section_aarch64_val (Elf_Internal_Dyn * entry)
9410 {
9411   switch (entry->d_tag)
9412     {
9413     case DT_AARCH64_BTI_PLT:
9414     case DT_AARCH64_PAC_PLT:
9415       break;
9416     default:
9417       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9418       break;
9419     }
9420   putchar ('\n');
9421 }
9422
9423 static void
9424 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
9425 {
9426   switch (entry->d_tag)
9427     {
9428     case DT_MIPS_FLAGS:
9429       if (entry->d_un.d_val == 0)
9430         printf (_("NONE"));
9431       else
9432         {
9433           static const char * opts[] =
9434           {
9435             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
9436             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
9437             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
9438             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
9439             "RLD_ORDER_SAFE"
9440           };
9441           unsigned int cnt;
9442           bfd_boolean first = TRUE;
9443
9444           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
9445             if (entry->d_un.d_val & (1 << cnt))
9446               {
9447                 printf ("%s%s", first ? "" : " ", opts[cnt]);
9448                 first = FALSE;
9449               }
9450         }
9451       break;
9452
9453     case DT_MIPS_IVERSION:
9454       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9455         printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
9456       else
9457         {
9458           char buf[40];
9459           sprintf_vma (buf, entry->d_un.d_ptr);
9460           /* Note: coded this way so that there is a single string for translation.  */
9461           printf (_("<corrupt: %s>"), buf);
9462         }
9463       break;
9464
9465     case DT_MIPS_TIME_STAMP:
9466       {
9467         char timebuf[128];
9468         struct tm * tmp;
9469         time_t atime = entry->d_un.d_val;
9470
9471         tmp = gmtime (&atime);
9472         /* PR 17531: file: 6accc532.  */
9473         if (tmp == NULL)
9474           snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
9475         else
9476           snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
9477                     tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9478                     tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9479         printf (_("Time Stamp: %s"), timebuf);
9480       }
9481       break;
9482
9483     case DT_MIPS_RLD_VERSION:
9484     case DT_MIPS_LOCAL_GOTNO:
9485     case DT_MIPS_CONFLICTNO:
9486     case DT_MIPS_LIBLISTNO:
9487     case DT_MIPS_SYMTABNO:
9488     case DT_MIPS_UNREFEXTNO:
9489     case DT_MIPS_HIPAGENO:
9490     case DT_MIPS_DELTA_CLASS_NO:
9491     case DT_MIPS_DELTA_INSTANCE_NO:
9492     case DT_MIPS_DELTA_RELOC_NO:
9493     case DT_MIPS_DELTA_SYM_NO:
9494     case DT_MIPS_DELTA_CLASSSYM_NO:
9495     case DT_MIPS_COMPACT_SIZE:
9496       print_vma (entry->d_un.d_val, DEC);
9497       break;
9498
9499     default:
9500       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9501     }
9502     putchar ('\n');
9503 }
9504
9505 static void
9506 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
9507 {
9508   switch (entry->d_tag)
9509     {
9510     case DT_HP_DLD_FLAGS:
9511       {
9512         static struct
9513         {
9514           long int bit;
9515           const char * str;
9516         }
9517         flags[] =
9518         {
9519           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
9520           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
9521           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
9522           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
9523           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
9524           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
9525           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9526           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9527           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9528           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
9529           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9530           { DT_HP_GST, "HP_GST" },
9531           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9532           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9533           { DT_HP_NODELETE, "HP_NODELETE" },
9534           { DT_HP_GROUP, "HP_GROUP" },
9535           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
9536         };
9537         bfd_boolean first = TRUE;
9538         size_t cnt;
9539         bfd_vma val = entry->d_un.d_val;
9540
9541         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
9542           if (val & flags[cnt].bit)
9543             {
9544               if (! first)
9545                 putchar (' ');
9546               fputs (flags[cnt].str, stdout);
9547               first = FALSE;
9548               val ^= flags[cnt].bit;
9549             }
9550
9551         if (val != 0 || first)
9552           {
9553             if (! first)
9554               putchar (' ');
9555             print_vma (val, HEX);
9556           }
9557       }
9558       break;
9559
9560     default:
9561       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9562       break;
9563     }
9564   putchar ('\n');
9565 }
9566
9567 #ifdef BFD64
9568
9569 /* VMS vs Unix time offset and factor.  */
9570
9571 #define VMS_EPOCH_OFFSET 35067168000000000LL
9572 #define VMS_GRANULARITY_FACTOR 10000000
9573
9574 /* Display a VMS time in a human readable format.  */
9575
9576 static void
9577 print_vms_time (bfd_int64_t vmstime)
9578 {
9579   struct tm *tm;
9580   time_t unxtime;
9581
9582   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9583   tm = gmtime (&unxtime);
9584   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9585           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9586           tm->tm_hour, tm->tm_min, tm->tm_sec);
9587 }
9588 #endif /* BFD64 */
9589
9590 static void
9591 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
9592 {
9593   switch (entry->d_tag)
9594     {
9595     case DT_IA_64_PLT_RESERVE:
9596       /* First 3 slots reserved.  */
9597       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9598       printf (" -- ");
9599       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
9600       break;
9601
9602     case DT_IA_64_VMS_LINKTIME:
9603 #ifdef BFD64
9604       print_vms_time (entry->d_un.d_val);
9605 #endif
9606       break;
9607
9608     case DT_IA_64_VMS_LNKFLAGS:
9609       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9610       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9611         printf (" CALL_DEBUG");
9612       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9613         printf (" NOP0BUFS");
9614       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9615         printf (" P0IMAGE");
9616       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9617         printf (" MKTHREADS");
9618       if (entry->d_un.d_val & VMS_LF_UPCALLS)
9619         printf (" UPCALLS");
9620       if (entry->d_un.d_val & VMS_LF_IMGSTA)
9621         printf (" IMGSTA");
9622       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9623         printf (" INITIALIZE");
9624       if (entry->d_un.d_val & VMS_LF_MAIN)
9625         printf (" MAIN");
9626       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9627         printf (" EXE_INIT");
9628       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9629         printf (" TBK_IN_IMG");
9630       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9631         printf (" DBG_IN_IMG");
9632       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9633         printf (" TBK_IN_DSF");
9634       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9635         printf (" DBG_IN_DSF");
9636       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9637         printf (" SIGNATURES");
9638       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9639         printf (" REL_SEG_OFF");
9640       break;
9641
9642     default:
9643       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9644       break;
9645     }
9646   putchar ('\n');
9647 }
9648
9649 static bfd_boolean
9650 get_32bit_dynamic_section (Filedata * filedata)
9651 {
9652   Elf32_External_Dyn * edyn;
9653   Elf32_External_Dyn * ext;
9654   Elf_Internal_Dyn * entry;
9655
9656   edyn = (Elf32_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9657                                           dynamic_size, _("dynamic section"));
9658   if (!edyn)
9659     return FALSE;
9660
9661   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9662      might not have the luxury of section headers.  Look for the DT_NULL
9663      terminator to determine the number of entries.  */
9664   for (ext = edyn, dynamic_nent = 0;
9665        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9666        ext++)
9667     {
9668       dynamic_nent++;
9669       if (BYTE_GET (ext->d_tag) == DT_NULL)
9670         break;
9671     }
9672
9673   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9674                                                   sizeof (* entry));
9675   if (dynamic_section == NULL)
9676     {
9677       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9678              (unsigned long) dynamic_nent);
9679       free (edyn);
9680       return FALSE;
9681     }
9682
9683   for (ext = edyn, entry = dynamic_section;
9684        entry < dynamic_section + dynamic_nent;
9685        ext++, entry++)
9686     {
9687       entry->d_tag      = BYTE_GET (ext->d_tag);
9688       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9689     }
9690
9691   free (edyn);
9692
9693   return TRUE;
9694 }
9695
9696 static bfd_boolean
9697 get_64bit_dynamic_section (Filedata * filedata)
9698 {
9699   Elf64_External_Dyn * edyn;
9700   Elf64_External_Dyn * ext;
9701   Elf_Internal_Dyn * entry;
9702
9703   /* Read in the data.  */
9704   edyn = (Elf64_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9705                                           dynamic_size, _("dynamic section"));
9706   if (!edyn)
9707     return FALSE;
9708
9709   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9710      might not have the luxury of section headers.  Look for the DT_NULL
9711      terminator to determine the number of entries.  */
9712   for (ext = edyn, dynamic_nent = 0;
9713        /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer.  */
9714        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9715        ext++)
9716     {
9717       dynamic_nent++;
9718       if (BYTE_GET (ext->d_tag) == DT_NULL)
9719         break;
9720     }
9721
9722   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9723                                                   sizeof (* entry));
9724   if (dynamic_section == NULL)
9725     {
9726       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9727              (unsigned long) dynamic_nent);
9728       free (edyn);
9729       return FALSE;
9730     }
9731
9732   /* Convert from external to internal formats.  */
9733   for (ext = edyn, entry = dynamic_section;
9734        entry < dynamic_section + dynamic_nent;
9735        ext++, entry++)
9736     {
9737       entry->d_tag      = BYTE_GET (ext->d_tag);
9738       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9739     }
9740
9741   free (edyn);
9742
9743   return TRUE;
9744 }
9745
9746 static void
9747 print_dynamic_flags (bfd_vma flags)
9748 {
9749   bfd_boolean first = TRUE;
9750
9751   while (flags)
9752     {
9753       bfd_vma flag;
9754
9755       flag = flags & - flags;
9756       flags &= ~ flag;
9757
9758       if (first)
9759         first = FALSE;
9760       else
9761         putc (' ', stdout);
9762
9763       switch (flag)
9764         {
9765         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
9766         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
9767         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
9768         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
9769         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
9770         default:                fputs (_("unknown"), stdout); break;
9771         }
9772     }
9773   puts ("");
9774 }
9775
9776 /* Parse and display the contents of the dynamic section.  */
9777
9778 static bfd_boolean
9779 process_dynamic_section (Filedata * filedata)
9780 {
9781   Elf_Internal_Dyn * entry;
9782
9783   if (dynamic_size == 0)
9784     {
9785       if (do_dynamic)
9786         printf (_("\nThere is no dynamic section in this file.\n"));
9787
9788       return TRUE;
9789     }
9790
9791   if (is_32bit_elf)
9792     {
9793       if (! get_32bit_dynamic_section (filedata))
9794         return FALSE;
9795     }
9796   else
9797     {
9798       if (! get_64bit_dynamic_section (filedata))
9799         return FALSE;
9800     }
9801
9802   /* Find the appropriate symbol table.  */
9803   if (dynamic_symbols == NULL)
9804     {
9805       for (entry = dynamic_section;
9806            entry < dynamic_section + dynamic_nent;
9807            ++entry)
9808         {
9809           Elf_Internal_Shdr section;
9810
9811           if (entry->d_tag != DT_SYMTAB)
9812             continue;
9813
9814           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9815
9816           /* Since we do not know how big the symbol table is,
9817              we default to reading in the entire file (!) and
9818              processing that.  This is overkill, I know, but it
9819              should work.  */
9820           section.sh_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9821           if ((bfd_size_type) section.sh_offset > filedata->file_size)
9822             {
9823               /* See PR 21379 for a reproducer.  */
9824               error (_("Invalid DT_SYMTAB entry: %lx"), (long) section.sh_offset);
9825               return FALSE;
9826             }
9827
9828           if (archive_file_offset != 0)
9829             section.sh_size = archive_file_size - section.sh_offset;
9830           else
9831             section.sh_size = filedata->file_size - section.sh_offset;
9832
9833           if (is_32bit_elf)
9834             section.sh_entsize = sizeof (Elf32_External_Sym);
9835           else
9836             section.sh_entsize = sizeof (Elf64_External_Sym);
9837           section.sh_name = filedata->string_table_length;
9838
9839           if (dynamic_symbols != NULL)
9840             {
9841               error (_("Multiple dynamic symbol table sections found\n"));
9842               free (dynamic_symbols);
9843             }
9844           dynamic_symbols = GET_ELF_SYMBOLS (filedata, &section, & num_dynamic_syms);
9845           if (num_dynamic_syms < 1)
9846             {
9847               error (_("Unable to determine the number of symbols to load\n"));
9848               continue;
9849             }
9850         }
9851     }
9852
9853   /* Similarly find a string table.  */
9854   if (dynamic_strings == NULL)
9855     {
9856       for (entry = dynamic_section;
9857            entry < dynamic_section + dynamic_nent;
9858            ++entry)
9859         {
9860           unsigned long offset;
9861           long str_tab_len;
9862
9863           if (entry->d_tag != DT_STRTAB)
9864             continue;
9865
9866           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9867
9868           /* Since we do not know how big the string table is,
9869              we default to reading in the entire file (!) and
9870              processing that.  This is overkill, I know, but it
9871              should work.  */
9872
9873           offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9874
9875           if (archive_file_offset != 0)
9876             str_tab_len = archive_file_size - offset;
9877           else
9878             str_tab_len = filedata->file_size - offset;
9879
9880           if (str_tab_len < 1)
9881             {
9882               error
9883                 (_("Unable to determine the length of the dynamic string table\n"));
9884               continue;
9885             }
9886
9887           if (dynamic_strings != NULL)
9888             {
9889               error (_("Multiple dynamic string tables found\n"));
9890               free (dynamic_strings);
9891             }
9892
9893           dynamic_strings = (char *) get_data (NULL, filedata, offset, 1,
9894                                                str_tab_len,
9895                                                _("dynamic string table"));
9896           dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9897         }
9898     }
9899
9900   /* And find the syminfo section if available.  */
9901   if (dynamic_syminfo == NULL)
9902     {
9903       unsigned long syminsz = 0;
9904
9905       for (entry = dynamic_section;
9906            entry < dynamic_section + dynamic_nent;
9907            ++entry)
9908         {
9909           if (entry->d_tag == DT_SYMINENT)
9910             {
9911               /* Note: these braces are necessary to avoid a syntax
9912                  error from the SunOS4 C compiler.  */
9913               /* PR binutils/17531: A corrupt file can trigger this test.
9914                  So do not use an assert, instead generate an error message.  */
9915               if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9916                 error (_("Bad value (%d) for SYMINENT entry\n"),
9917                        (int) entry->d_un.d_val);
9918             }
9919           else if (entry->d_tag == DT_SYMINSZ)
9920             syminsz = entry->d_un.d_val;
9921           else if (entry->d_tag == DT_SYMINFO)
9922             dynamic_syminfo_offset = offset_from_vma (filedata, entry->d_un.d_val,
9923                                                       syminsz);
9924         }
9925
9926       if (dynamic_syminfo_offset != 0 && syminsz != 0)
9927         {
9928           Elf_External_Syminfo * extsyminfo;
9929           Elf_External_Syminfo * extsym;
9930           Elf_Internal_Syminfo * syminfo;
9931
9932           /* There is a syminfo section.  Read the data.  */
9933           extsyminfo = (Elf_External_Syminfo *)
9934               get_data (NULL, filedata, dynamic_syminfo_offset, 1, syminsz,
9935                         _("symbol information"));
9936           if (!extsyminfo)
9937             return FALSE;
9938
9939           if (dynamic_syminfo != NULL)
9940             {
9941               error (_("Multiple dynamic symbol information sections found\n"));
9942               free (dynamic_syminfo);
9943             }
9944           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9945           if (dynamic_syminfo == NULL)
9946             {
9947               error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9948                      (unsigned long) syminsz);
9949               return FALSE;
9950             }
9951
9952           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9953           for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9954                syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9955                ++syminfo, ++extsym)
9956             {
9957               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9958               syminfo->si_flags = BYTE_GET (extsym->si_flags);
9959             }
9960
9961           free (extsyminfo);
9962         }
9963     }
9964
9965   if (do_dynamic && dynamic_addr)
9966     printf (ngettext ("\nDynamic section at offset 0x%lx "
9967                       "contains %lu entry:\n",
9968                       "\nDynamic section at offset 0x%lx "
9969                       "contains %lu entries:\n",
9970                       dynamic_nent),
9971             dynamic_addr, (unsigned long) dynamic_nent);
9972   if (do_dynamic)
9973     printf (_("  Tag        Type                         Name/Value\n"));
9974
9975   for (entry = dynamic_section;
9976        entry < dynamic_section + dynamic_nent;
9977        entry++)
9978     {
9979       if (do_dynamic)
9980         {
9981           const char * dtype;
9982
9983           putchar (' ');
9984           print_vma (entry->d_tag, FULL_HEX);
9985           dtype = get_dynamic_type (filedata, entry->d_tag);
9986           printf (" (%s)%*s", dtype,
9987                   ((is_32bit_elf ? 27 : 19) - (int) strlen (dtype)), " ");
9988         }
9989
9990       switch (entry->d_tag)
9991         {
9992         case DT_FLAGS:
9993           if (do_dynamic)
9994             print_dynamic_flags (entry->d_un.d_val);
9995           break;
9996
9997         case DT_AUXILIARY:
9998         case DT_FILTER:
9999         case DT_CONFIG:
10000         case DT_DEPAUDIT:
10001         case DT_AUDIT:
10002           if (do_dynamic)
10003             {
10004               switch (entry->d_tag)
10005                 {
10006                 case DT_AUXILIARY:
10007                   printf (_("Auxiliary library"));
10008                   break;
10009
10010                 case DT_FILTER:
10011                   printf (_("Filter library"));
10012                   break;
10013
10014                 case DT_CONFIG:
10015                   printf (_("Configuration file"));
10016                   break;
10017
10018                 case DT_DEPAUDIT:
10019                   printf (_("Dependency audit library"));
10020                   break;
10021
10022                 case DT_AUDIT:
10023                   printf (_("Audit library"));
10024                   break;
10025                 }
10026
10027               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
10028                 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
10029               else
10030                 {
10031                   printf (": ");
10032                   print_vma (entry->d_un.d_val, PREFIX_HEX);
10033                   putchar ('\n');
10034                 }
10035             }
10036           break;
10037
10038         case DT_FEATURE:
10039           if (do_dynamic)
10040             {
10041               printf (_("Flags:"));
10042
10043               if (entry->d_un.d_val == 0)
10044                 printf (_(" None\n"));
10045               else
10046                 {
10047                   unsigned long int val = entry->d_un.d_val;
10048
10049                   if (val & DTF_1_PARINIT)
10050                     {
10051                       printf (" PARINIT");
10052                       val ^= DTF_1_PARINIT;
10053                     }
10054                   if (val & DTF_1_CONFEXP)
10055                     {
10056                       printf (" CONFEXP");
10057                       val ^= DTF_1_CONFEXP;
10058                     }
10059                   if (val != 0)
10060                     printf (" %lx", val);
10061                   puts ("");
10062                 }
10063             }
10064           break;
10065
10066         case DT_POSFLAG_1:
10067           if (do_dynamic)
10068             {
10069               printf (_("Flags:"));
10070
10071               if (entry->d_un.d_val == 0)
10072                 printf (_(" None\n"));
10073               else
10074                 {
10075                   unsigned long int val = entry->d_un.d_val;
10076
10077                   if (val & DF_P1_LAZYLOAD)
10078                     {
10079                       printf (" LAZYLOAD");
10080                       val ^= DF_P1_LAZYLOAD;
10081                     }
10082                   if (val & DF_P1_GROUPPERM)
10083                     {
10084                       printf (" GROUPPERM");
10085                       val ^= DF_P1_GROUPPERM;
10086                     }
10087                   if (val != 0)
10088                     printf (" %lx", val);
10089                   puts ("");
10090                 }
10091             }
10092           break;
10093
10094         case DT_FLAGS_1:
10095           if (do_dynamic)
10096             {
10097               printf (_("Flags:"));
10098               if (entry->d_un.d_val == 0)
10099                 printf (_(" None\n"));
10100               else
10101                 {
10102                   unsigned long int val = entry->d_un.d_val;
10103
10104                   if (val & DF_1_NOW)
10105                     {
10106                       printf (" NOW");
10107                       val ^= DF_1_NOW;
10108                     }
10109                   if (val & DF_1_GLOBAL)
10110                     {
10111                       printf (" GLOBAL");
10112                       val ^= DF_1_GLOBAL;
10113                     }
10114                   if (val & DF_1_GROUP)
10115                     {
10116                       printf (" GROUP");
10117                       val ^= DF_1_GROUP;
10118                     }
10119                   if (val & DF_1_NODELETE)
10120                     {
10121                       printf (" NODELETE");
10122                       val ^= DF_1_NODELETE;
10123                     }
10124                   if (val & DF_1_LOADFLTR)
10125                     {
10126                       printf (" LOADFLTR");
10127                       val ^= DF_1_LOADFLTR;
10128                     }
10129                   if (val & DF_1_INITFIRST)
10130                     {
10131                       printf (" INITFIRST");
10132                       val ^= DF_1_INITFIRST;
10133                     }
10134                   if (val & DF_1_NOOPEN)
10135                     {
10136                       printf (" NOOPEN");
10137                       val ^= DF_1_NOOPEN;
10138                     }
10139                   if (val & DF_1_ORIGIN)
10140                     {
10141                       printf (" ORIGIN");
10142                       val ^= DF_1_ORIGIN;
10143                     }
10144                   if (val & DF_1_DIRECT)
10145                     {
10146                       printf (" DIRECT");
10147                       val ^= DF_1_DIRECT;
10148                     }
10149                   if (val & DF_1_TRANS)
10150                     {
10151                       printf (" TRANS");
10152                       val ^= DF_1_TRANS;
10153                     }
10154                   if (val & DF_1_INTERPOSE)
10155                     {
10156                       printf (" INTERPOSE");
10157                       val ^= DF_1_INTERPOSE;
10158                     }
10159                   if (val & DF_1_NODEFLIB)
10160                     {
10161                       printf (" NODEFLIB");
10162                       val ^= DF_1_NODEFLIB;
10163                     }
10164                   if (val & DF_1_NODUMP)
10165                     {
10166                       printf (" NODUMP");
10167                       val ^= DF_1_NODUMP;
10168                     }
10169                   if (val & DF_1_CONFALT)
10170                     {
10171                       printf (" CONFALT");
10172                       val ^= DF_1_CONFALT;
10173                     }
10174                   if (val & DF_1_ENDFILTEE)
10175                     {
10176                       printf (" ENDFILTEE");
10177                       val ^= DF_1_ENDFILTEE;
10178                     }
10179                   if (val & DF_1_DISPRELDNE)
10180                     {
10181                       printf (" DISPRELDNE");
10182                       val ^= DF_1_DISPRELDNE;
10183                     }
10184                   if (val & DF_1_DISPRELPND)
10185                     {
10186                       printf (" DISPRELPND");
10187                       val ^= DF_1_DISPRELPND;
10188                     }
10189                   if (val & DF_1_NODIRECT)
10190                     {
10191                       printf (" NODIRECT");
10192                       val ^= DF_1_NODIRECT;
10193                     }
10194                   if (val & DF_1_IGNMULDEF)
10195                     {
10196                       printf (" IGNMULDEF");
10197                       val ^= DF_1_IGNMULDEF;
10198                     }
10199                   if (val & DF_1_NOKSYMS)
10200                     {
10201                       printf (" NOKSYMS");
10202                       val ^= DF_1_NOKSYMS;
10203                     }
10204                   if (val & DF_1_NOHDR)
10205                     {
10206                       printf (" NOHDR");
10207                       val ^= DF_1_NOHDR;
10208                     }
10209                   if (val & DF_1_EDITED)
10210                     {
10211                       printf (" EDITED");
10212                       val ^= DF_1_EDITED;
10213                     }
10214                   if (val & DF_1_NORELOC)
10215                     {
10216                       printf (" NORELOC");
10217                       val ^= DF_1_NORELOC;
10218                     }
10219                   if (val & DF_1_SYMINTPOSE)
10220                     {
10221                       printf (" SYMINTPOSE");
10222                       val ^= DF_1_SYMINTPOSE;
10223                     }
10224                   if (val & DF_1_GLOBAUDIT)
10225                     {
10226                       printf (" GLOBAUDIT");
10227                       val ^= DF_1_GLOBAUDIT;
10228                     }
10229                   if (val & DF_1_SINGLETON)
10230                     {
10231                       printf (" SINGLETON");
10232                       val ^= DF_1_SINGLETON;
10233                     }
10234                   if (val & DF_1_STUB)
10235                     {
10236                       printf (" STUB");
10237                       val ^= DF_1_STUB;
10238                     }
10239                   if (val & DF_1_PIE)
10240                     {
10241                       printf (" PIE");
10242                       val ^= DF_1_PIE;
10243                     }
10244                   if (val & DF_1_KMOD)
10245                     {
10246                       printf (" KMOD");
10247                       val ^= DF_1_KMOD;
10248                     }
10249                   if (val & DF_1_WEAKFILTER)
10250                     {
10251                       printf (" WEAKFILTER");
10252                       val ^= DF_1_WEAKFILTER;
10253                     }
10254                   if (val & DF_1_NOCOMMON)
10255                     {
10256                       printf (" NOCOMMON");
10257                       val ^= DF_1_NOCOMMON;
10258                     }
10259                   if (val != 0)
10260                     printf (" %lx", val);
10261                   puts ("");
10262                 }
10263             }
10264           break;
10265
10266         case DT_PLTREL:
10267           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10268           if (do_dynamic)
10269             puts (get_dynamic_type (filedata, entry->d_un.d_val));
10270           break;
10271
10272         case DT_NULL    :
10273         case DT_NEEDED  :
10274         case DT_PLTGOT  :
10275         case DT_HASH    :
10276         case DT_STRTAB  :
10277         case DT_SYMTAB  :
10278         case DT_RELA    :
10279         case DT_INIT    :
10280         case DT_FINI    :
10281         case DT_SONAME  :
10282         case DT_RPATH   :
10283         case DT_SYMBOLIC:
10284         case DT_REL     :
10285         case DT_DEBUG   :
10286         case DT_TEXTREL :
10287         case DT_JMPREL  :
10288         case DT_RUNPATH :
10289           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10290
10291           if (do_dynamic)
10292             {
10293               char * name;
10294
10295               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
10296                 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10297               else
10298                 name = NULL;
10299
10300               if (name)
10301                 {
10302                   switch (entry->d_tag)
10303                     {
10304                     case DT_NEEDED:
10305                       printf (_("Shared library: [%s]"), name);
10306
10307                       if (streq (name, program_interpreter))
10308                         printf (_(" program interpreter"));
10309                       break;
10310
10311                     case DT_SONAME:
10312                       printf (_("Library soname: [%s]"), name);
10313                       break;
10314
10315                     case DT_RPATH:
10316                       printf (_("Library rpath: [%s]"), name);
10317                       break;
10318
10319                     case DT_RUNPATH:
10320                       printf (_("Library runpath: [%s]"), name);
10321                       break;
10322
10323                     default:
10324                       print_vma (entry->d_un.d_val, PREFIX_HEX);
10325                       break;
10326                     }
10327                 }
10328               else
10329                 print_vma (entry->d_un.d_val, PREFIX_HEX);
10330
10331               putchar ('\n');
10332             }
10333           break;
10334
10335         case DT_PLTRELSZ:
10336         case DT_RELASZ  :
10337         case DT_STRSZ   :
10338         case DT_RELSZ   :
10339         case DT_RELAENT :
10340         case DT_SYMENT  :
10341         case DT_RELENT  :
10342           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10343           /* Fall through.  */
10344         case DT_PLTPADSZ:
10345         case DT_MOVEENT :
10346         case DT_MOVESZ  :
10347         case DT_INIT_ARRAYSZ:
10348         case DT_FINI_ARRAYSZ:
10349         case DT_GNU_CONFLICTSZ:
10350         case DT_GNU_LIBLISTSZ:
10351           if (do_dynamic)
10352             {
10353               print_vma (entry->d_un.d_val, UNSIGNED);
10354               printf (_(" (bytes)\n"));
10355             }
10356           break;
10357
10358         case DT_VERDEFNUM:
10359         case DT_VERNEEDNUM:
10360         case DT_RELACOUNT:
10361         case DT_RELCOUNT:
10362           if (do_dynamic)
10363             {
10364               print_vma (entry->d_un.d_val, UNSIGNED);
10365               putchar ('\n');
10366             }
10367           break;
10368
10369         case DT_SYMINSZ:
10370         case DT_SYMINENT:
10371         case DT_SYMINFO:
10372         case DT_USED:
10373         case DT_INIT_ARRAY:
10374         case DT_FINI_ARRAY:
10375           if (do_dynamic)
10376             {
10377               if (entry->d_tag == DT_USED
10378                   && VALID_DYNAMIC_NAME (entry->d_un.d_val))
10379                 {
10380                   char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10381
10382                   if (*name)
10383                     {
10384                       printf (_("Not needed object: [%s]\n"), name);
10385                       break;
10386                     }
10387                 }
10388
10389               print_vma (entry->d_un.d_val, PREFIX_HEX);
10390               putchar ('\n');
10391             }
10392           break;
10393
10394         case DT_BIND_NOW:
10395           /* The value of this entry is ignored.  */
10396           if (do_dynamic)
10397             putchar ('\n');
10398           break;
10399
10400         case DT_GNU_PRELINKED:
10401           if (do_dynamic)
10402             {
10403               struct tm * tmp;
10404               time_t atime = entry->d_un.d_val;
10405
10406               tmp = gmtime (&atime);
10407               /* PR 17533 file: 041-1244816-0.004.  */
10408               if (tmp == NULL)
10409                 printf (_("<corrupt time val: %lx"),
10410                         (unsigned long) atime);
10411               else
10412                 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
10413                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
10414                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
10415
10416             }
10417           break;
10418
10419         case DT_GNU_HASH:
10420           dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
10421           if (do_dynamic)
10422             {
10423               print_vma (entry->d_un.d_val, PREFIX_HEX);
10424               putchar ('\n');
10425             }
10426           break;
10427
10428         default:
10429           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
10430             version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
10431               entry->d_un.d_val;
10432
10433           if (do_dynamic)
10434             {
10435               switch (filedata->file_header.e_machine)
10436                 {
10437                 case EM_AARCH64:
10438                   dynamic_section_aarch64_val (entry);
10439                   break;
10440                 case EM_MIPS:
10441                 case EM_MIPS_RS3_LE:
10442                   dynamic_section_mips_val (entry);
10443                   break;
10444                 case EM_PARISC:
10445                   dynamic_section_parisc_val (entry);
10446                   break;
10447                 case EM_IA_64:
10448                   dynamic_section_ia64_val (entry);
10449                   break;
10450                 default:
10451                   print_vma (entry->d_un.d_val, PREFIX_HEX);
10452                   putchar ('\n');
10453                 }
10454             }
10455           break;
10456         }
10457     }
10458
10459   return TRUE;
10460 }
10461
10462 static char *
10463 get_ver_flags (unsigned int flags)
10464 {
10465   static char buff[128];
10466
10467   buff[0] = 0;
10468
10469   if (flags == 0)
10470     return _("none");
10471
10472   if (flags & VER_FLG_BASE)
10473     strcat (buff, "BASE");
10474
10475   if (flags & VER_FLG_WEAK)
10476     {
10477       if (flags & VER_FLG_BASE)
10478         strcat (buff, " | ");
10479
10480       strcat (buff, "WEAK");
10481     }
10482
10483   if (flags & VER_FLG_INFO)
10484     {
10485       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
10486         strcat (buff, " | ");
10487
10488       strcat (buff, "INFO");
10489     }
10490
10491   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10492     {
10493       if (flags & (VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10494         strcat (buff, " | ");
10495
10496       strcat (buff, _("<unknown>"));
10497     }
10498
10499   return buff;
10500 }
10501
10502 /* Display the contents of the version sections.  */
10503
10504 static bfd_boolean
10505 process_version_sections (Filedata * filedata)
10506 {
10507   Elf_Internal_Shdr * section;
10508   unsigned i;
10509   bfd_boolean found = FALSE;
10510
10511   if (! do_version)
10512     return TRUE;
10513
10514   for (i = 0, section = filedata->section_headers;
10515        i < filedata->file_header.e_shnum;
10516        i++, section++)
10517     {
10518       switch (section->sh_type)
10519         {
10520         case SHT_GNU_verdef:
10521           {
10522             Elf_External_Verdef * edefs;
10523             unsigned long idx;
10524             unsigned long cnt;
10525             char * endbuf;
10526
10527             found = TRUE;
10528
10529             printf (ngettext ("\nVersion definition section '%s' "
10530                               "contains %u entry:\n",
10531                               "\nVersion definition section '%s' "
10532                               "contains %u entries:\n",
10533                               section->sh_info),
10534                     printable_section_name (filedata, section),
10535                     section->sh_info);
10536
10537             printf (_(" Addr: 0x"));
10538             printf_vma (section->sh_addr);
10539             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10540                     (unsigned long) section->sh_offset, section->sh_link,
10541                     printable_section_name_from_index (filedata, section->sh_link));
10542
10543             edefs = (Elf_External_Verdef *)
10544                 get_data (NULL, filedata, section->sh_offset, 1,section->sh_size,
10545                           _("version definition section"));
10546             if (!edefs)
10547               break;
10548             endbuf = (char *) edefs + section->sh_size;
10549
10550             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10551               {
10552                 char * vstart;
10553                 Elf_External_Verdef * edef;
10554                 Elf_Internal_Verdef ent;
10555                 Elf_External_Verdaux * eaux;
10556                 Elf_Internal_Verdaux aux;
10557                 unsigned long isum;
10558                 int j;
10559
10560                 vstart = ((char *) edefs) + idx;
10561                 if (vstart + sizeof (*edef) > endbuf)
10562                   break;
10563
10564                 edef = (Elf_External_Verdef *) vstart;
10565
10566                 ent.vd_version = BYTE_GET (edef->vd_version);
10567                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
10568                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
10569                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
10570                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
10571                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
10572                 ent.vd_next    = BYTE_GET (edef->vd_next);
10573
10574                 printf (_("  %#06lx: Rev: %d  Flags: %s"),
10575                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
10576
10577                 printf (_("  Index: %d  Cnt: %d  "),
10578                         ent.vd_ndx, ent.vd_cnt);
10579
10580                 /* Check for overflow.  */
10581                 if (ent.vd_aux > (size_t) (endbuf - vstart))
10582                   break;
10583
10584                 vstart += ent.vd_aux;
10585
10586                 if (vstart + sizeof (*eaux) > endbuf)
10587                   break;
10588                 eaux = (Elf_External_Verdaux *) vstart;
10589
10590                 aux.vda_name = BYTE_GET (eaux->vda_name);
10591                 aux.vda_next = BYTE_GET (eaux->vda_next);
10592
10593                 if (VALID_DYNAMIC_NAME (aux.vda_name))
10594                   printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
10595                 else
10596                   printf (_("Name index: %ld\n"), aux.vda_name);
10597
10598                 isum = idx + ent.vd_aux;
10599
10600                 for (j = 1; j < ent.vd_cnt; j++)
10601                   {
10602                     if (aux.vda_next < sizeof (*eaux)
10603                         && !(j == ent.vd_cnt - 1 && aux.vda_next == 0))
10604                       {
10605                         warn (_("Invalid vda_next field of %lx\n"),
10606                               aux.vda_next);
10607                         j = ent.vd_cnt;
10608                         break;
10609                       }
10610                     /* Check for overflow.  */
10611                     if (aux.vda_next > (size_t) (endbuf - vstart))
10612                       break;
10613
10614                     isum   += aux.vda_next;
10615                     vstart += aux.vda_next;
10616
10617                     if (vstart + sizeof (*eaux) > endbuf)
10618                       break;
10619                     eaux = (Elf_External_Verdaux *) vstart;
10620
10621                     aux.vda_name = BYTE_GET (eaux->vda_name);
10622                     aux.vda_next = BYTE_GET (eaux->vda_next);
10623
10624                     if (VALID_DYNAMIC_NAME (aux.vda_name))
10625                       printf (_("  %#06lx: Parent %d: %s\n"),
10626                               isum, j, GET_DYNAMIC_NAME (aux.vda_name));
10627                     else
10628                       printf (_("  %#06lx: Parent %d, name index: %ld\n"),
10629                               isum, j, aux.vda_name);
10630                   }
10631
10632                 if (j < ent.vd_cnt)
10633                   printf (_("  Version def aux past end of section\n"));
10634
10635                 /* PR 17531:
10636                    file: id:000001,src:000172+005151,op:splice,rep:2.  */
10637                 if (ent.vd_next < sizeof (*edef)
10638                     && !(cnt == section->sh_info - 1 && ent.vd_next == 0))
10639                   {
10640                     warn (_("Invalid vd_next field of %lx\n"), ent.vd_next);
10641                     cnt = section->sh_info;
10642                     break;
10643                   }
10644                 if (ent.vd_next > (size_t) (endbuf - ((char *) edefs + idx)))
10645                   break;
10646
10647                 idx += ent.vd_next;
10648               }
10649
10650             if (cnt < section->sh_info)
10651               printf (_("  Version definition past end of section\n"));
10652
10653             free (edefs);
10654           }
10655           break;
10656
10657         case SHT_GNU_verneed:
10658           {
10659             Elf_External_Verneed * eneed;
10660             unsigned long idx;
10661             unsigned long cnt;
10662             char * endbuf;
10663
10664             found = TRUE;
10665
10666             printf (ngettext ("\nVersion needs section '%s' "
10667                               "contains %u entry:\n",
10668                               "\nVersion needs section '%s' "
10669                               "contains %u entries:\n",
10670                               section->sh_info),
10671                     printable_section_name (filedata, section), section->sh_info);
10672
10673             printf (_(" Addr: 0x"));
10674             printf_vma (section->sh_addr);
10675             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10676                     (unsigned long) section->sh_offset, section->sh_link,
10677                     printable_section_name_from_index (filedata, section->sh_link));
10678
10679             eneed = (Elf_External_Verneed *) get_data (NULL, filedata,
10680                                                        section->sh_offset, 1,
10681                                                        section->sh_size,
10682                                                        _("Version Needs section"));
10683             if (!eneed)
10684               break;
10685             endbuf = (char *) eneed + section->sh_size;
10686
10687             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10688               {
10689                 Elf_External_Verneed * entry;
10690                 Elf_Internal_Verneed ent;
10691                 unsigned long isum;
10692                 int j;
10693                 char * vstart;
10694
10695                 vstart = ((char *) eneed) + idx;
10696                 if (vstart + sizeof (*entry) > endbuf)
10697                   break;
10698
10699                 entry = (Elf_External_Verneed *) vstart;
10700
10701                 ent.vn_version = BYTE_GET (entry->vn_version);
10702                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
10703                 ent.vn_file    = BYTE_GET (entry->vn_file);
10704                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
10705                 ent.vn_next    = BYTE_GET (entry->vn_next);
10706
10707                 printf (_("  %#06lx: Version: %d"), idx, ent.vn_version);
10708
10709                 if (VALID_DYNAMIC_NAME (ent.vn_file))
10710                   printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
10711                 else
10712                   printf (_("  File: %lx"), ent.vn_file);
10713
10714                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
10715
10716                 /* Check for overflow.  */
10717                 if (ent.vn_aux > (size_t) (endbuf - vstart))
10718                   break;
10719                 vstart += ent.vn_aux;
10720
10721                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10722                   {
10723                     Elf_External_Vernaux * eaux;
10724                     Elf_Internal_Vernaux aux;
10725
10726                     if (vstart + sizeof (*eaux) > endbuf)
10727                       break;
10728                     eaux = (Elf_External_Vernaux *) vstart;
10729
10730                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
10731                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
10732                     aux.vna_other = BYTE_GET (eaux->vna_other);
10733                     aux.vna_name  = BYTE_GET (eaux->vna_name);
10734                     aux.vna_next  = BYTE_GET (eaux->vna_next);
10735
10736                     if (VALID_DYNAMIC_NAME (aux.vna_name))
10737                       printf (_("  %#06lx:   Name: %s"),
10738                               isum, GET_DYNAMIC_NAME (aux.vna_name));
10739                     else
10740                       printf (_("  %#06lx:   Name index: %lx"),
10741                               isum, aux.vna_name);
10742
10743                     printf (_("  Flags: %s  Version: %d\n"),
10744                             get_ver_flags (aux.vna_flags), aux.vna_other);
10745
10746                     if (aux.vna_next < sizeof (*eaux)
10747                         && !(j == ent.vn_cnt - 1 && aux.vna_next == 0))
10748                       {
10749                         warn (_("Invalid vna_next field of %lx\n"),
10750                               aux.vna_next);
10751                         j = ent.vn_cnt;
10752                         break;
10753                       }
10754                     /* Check for overflow.  */
10755                     if (aux.vna_next > (size_t) (endbuf - vstart))
10756                       break;
10757                     isum   += aux.vna_next;
10758                     vstart += aux.vna_next;
10759                   }
10760
10761                 if (j < ent.vn_cnt)
10762                   warn (_("Missing Version Needs auxillary information\n"));
10763
10764                 if (ent.vn_next < sizeof (*entry)
10765                     && !(cnt == section->sh_info - 1 && ent.vn_next == 0))
10766                   {
10767                     warn (_("Invalid vn_next field of %lx\n"), ent.vn_next);
10768                     cnt = section->sh_info;
10769                     break;
10770                   }
10771                 if (ent.vn_next > (size_t) (endbuf - ((char *) eneed + idx)))
10772                   break;
10773                 idx += ent.vn_next;
10774               }
10775
10776             if (cnt < section->sh_info)
10777               warn (_("Missing Version Needs information\n"));
10778
10779             free (eneed);
10780           }
10781           break;
10782
10783         case SHT_GNU_versym:
10784           {
10785             Elf_Internal_Shdr * link_section;
10786             size_t total;
10787             unsigned int cnt;
10788             unsigned char * edata;
10789             unsigned short * data;
10790             char * strtab;
10791             Elf_Internal_Sym * symbols;
10792             Elf_Internal_Shdr * string_sec;
10793             unsigned long num_syms;
10794             long off;
10795
10796             if (section->sh_link >= filedata->file_header.e_shnum)
10797               break;
10798
10799             link_section = filedata->section_headers + section->sh_link;
10800             total = section->sh_size / sizeof (Elf_External_Versym);
10801
10802             if (link_section->sh_link >= filedata->file_header.e_shnum)
10803               break;
10804
10805             found = TRUE;
10806
10807             symbols = GET_ELF_SYMBOLS (filedata, link_section, & num_syms);
10808             if (symbols == NULL)
10809               break;
10810
10811             string_sec = filedata->section_headers + link_section->sh_link;
10812
10813             strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
10814                                         string_sec->sh_size,
10815                                         _("version string table"));
10816             if (!strtab)
10817               {
10818                 free (symbols);
10819                 break;
10820               }
10821
10822             printf (ngettext ("\nVersion symbols section '%s' "
10823                               "contains %lu entry:\n",
10824                               "\nVersion symbols section '%s' "
10825                               "contains %lu entries:\n",
10826                               total),
10827                     printable_section_name (filedata, section), (unsigned long) total);
10828
10829             printf (_(" Addr: 0x"));
10830             printf_vma (section->sh_addr);
10831             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10832                     (unsigned long) section->sh_offset, section->sh_link,
10833                     printable_section_name (filedata, link_section));
10834
10835             off = offset_from_vma (filedata,
10836                                    version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10837                                    total * sizeof (short));
10838             edata = (unsigned char *) get_data (NULL, filedata, off, total,
10839                                                 sizeof (short),
10840                                                 _("version symbol data"));
10841             if (!edata)
10842               {
10843                 free (strtab);
10844                 free (symbols);
10845                 break;
10846               }
10847
10848             data = (short unsigned int *) cmalloc (total, sizeof (short));
10849
10850             for (cnt = total; cnt --;)
10851               data[cnt] = byte_get (edata + cnt * sizeof (short),
10852                                     sizeof (short));
10853
10854             free (edata);
10855
10856             for (cnt = 0; cnt < total; cnt += 4)
10857               {
10858                 int j, nn;
10859                 char *name;
10860                 char *invalid = _("*invalid*");
10861
10862                 printf ("  %03x:", cnt);
10863
10864                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10865                   switch (data[cnt + j])
10866                     {
10867                     case 0:
10868                       fputs (_("   0 (*local*)    "), stdout);
10869                       break;
10870
10871                     case 1:
10872                       fputs (_("   1 (*global*)   "), stdout);
10873                       break;
10874
10875                     default:
10876                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10877                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10878
10879                       /* If this index value is greater than the size of the symbols
10880                          array, break to avoid an out-of-bounds read.  */
10881                       if ((unsigned long)(cnt + j) >= num_syms)
10882                         {
10883                           warn (_("invalid index into symbol array\n"));
10884                           break;
10885                         }
10886
10887                       name = NULL;
10888                       if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10889                         {
10890                           Elf_Internal_Verneed ivn;
10891                           unsigned long offset;
10892
10893                           offset = offset_from_vma
10894                             (filedata, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10895                              sizeof (Elf_External_Verneed));
10896
10897                           do
10898                             {
10899                               Elf_Internal_Vernaux ivna;
10900                               Elf_External_Verneed evn;
10901                               Elf_External_Vernaux evna;
10902                               unsigned long a_off;
10903
10904                               if (get_data (&evn, filedata, offset, sizeof (evn), 1,
10905                                             _("version need")) == NULL)
10906                                 break;
10907
10908                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10909                               ivn.vn_next = BYTE_GET (evn.vn_next);
10910
10911                               a_off = offset + ivn.vn_aux;
10912
10913                               do
10914                                 {
10915                                   if (get_data (&evna, filedata, a_off, sizeof (evna),
10916                                                 1, _("version need aux (2)")) == NULL)
10917                                     {
10918                                       ivna.vna_next  = 0;
10919                                       ivna.vna_other = 0;
10920                                     }
10921                                   else
10922                                     {
10923                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
10924                                       ivna.vna_other = BYTE_GET (evna.vna_other);
10925                                     }
10926
10927                                   a_off += ivna.vna_next;
10928                                 }
10929                               while (ivna.vna_other != data[cnt + j]
10930                                      && ivna.vna_next != 0);
10931
10932                               if (ivna.vna_other == data[cnt + j])
10933                                 {
10934                                   ivna.vna_name = BYTE_GET (evna.vna_name);
10935
10936                                   if (ivna.vna_name >= string_sec->sh_size)
10937                                     name = invalid;
10938                                   else
10939                                     name = strtab + ivna.vna_name;
10940                                   break;
10941                                 }
10942
10943                               offset += ivn.vn_next;
10944                             }
10945                           while (ivn.vn_next);
10946                         }
10947
10948                       if (data[cnt + j] != 0x8001
10949                           && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10950                         {
10951                           Elf_Internal_Verdef ivd;
10952                           Elf_External_Verdef evd;
10953                           unsigned long offset;
10954
10955                           offset = offset_from_vma
10956                             (filedata, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10957                              sizeof evd);
10958
10959                           do
10960                             {
10961                               if (get_data (&evd, filedata, offset, sizeof (evd), 1,
10962                                             _("version def")) == NULL)
10963                                 {
10964                                   ivd.vd_next = 0;
10965                                   /* PR 17531: file: 046-1082287-0.004.  */
10966                                   ivd.vd_ndx  = (data[cnt + j] & VERSYM_VERSION) + 1;
10967                                   break;
10968                                 }
10969                               else
10970                                 {
10971                                   ivd.vd_next = BYTE_GET (evd.vd_next);
10972                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
10973                                 }
10974
10975                               offset += ivd.vd_next;
10976                             }
10977                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10978                                  && ivd.vd_next != 0);
10979
10980                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10981                             {
10982                               Elf_External_Verdaux evda;
10983                               Elf_Internal_Verdaux ivda;
10984
10985                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
10986
10987                               if (get_data (&evda, filedata,
10988                                             offset - ivd.vd_next + ivd.vd_aux,
10989                                             sizeof (evda), 1,
10990                                             _("version def aux")) == NULL)
10991                                 break;
10992
10993                               ivda.vda_name = BYTE_GET (evda.vda_name);
10994
10995                               if (ivda.vda_name >= string_sec->sh_size)
10996                                 name = invalid;
10997                               else if (name != NULL && name != invalid)
10998                                 name = _("*both*");
10999                               else
11000                                 name = strtab + ivda.vda_name;
11001                             }
11002                         }
11003                       if (name != NULL)
11004                         nn += printf ("(%s%-*s",
11005                                       name,
11006                                       12 - (int) strlen (name),
11007                                       ")");
11008
11009                       if (nn < 18)
11010                         printf ("%*c", 18 - nn, ' ');
11011                     }
11012
11013                 putchar ('\n');
11014               }
11015
11016             free (data);
11017             free (strtab);
11018             free (symbols);
11019           }
11020           break;
11021
11022         default:
11023           break;
11024         }
11025     }
11026
11027   if (! found)
11028     printf (_("\nNo version information found in this file.\n"));
11029
11030   return TRUE;
11031 }
11032
11033 static const char *
11034 get_symbol_binding (Filedata * filedata, unsigned int binding)
11035 {
11036   static char buff[32];
11037
11038   switch (binding)
11039     {
11040     case STB_LOCAL:     return "LOCAL";
11041     case STB_GLOBAL:    return "GLOBAL";
11042     case STB_WEAK:      return "WEAK";
11043     default:
11044       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
11045         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
11046                   binding);
11047       else if (binding >= STB_LOOS && binding <= STB_HIOS)
11048         {
11049           if (binding == STB_GNU_UNIQUE
11050               && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
11051                   /* GNU is still using the default value 0.  */
11052                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
11053             return "UNIQUE";
11054           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
11055         }
11056       else
11057         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
11058       return buff;
11059     }
11060 }
11061
11062 static const char *
11063 get_symbol_type (Filedata * filedata, unsigned int type)
11064 {
11065   static char buff[32];
11066
11067   switch (type)
11068     {
11069     case STT_NOTYPE:    return "NOTYPE";
11070     case STT_OBJECT:    return "OBJECT";
11071     case STT_FUNC:      return "FUNC";
11072     case STT_SECTION:   return "SECTION";
11073     case STT_FILE:      return "FILE";
11074     case STT_COMMON:    return "COMMON";
11075     case STT_TLS:       return "TLS";
11076     case STT_RELC:      return "RELC";
11077     case STT_SRELC:     return "SRELC";
11078     default:
11079       if (type >= STT_LOPROC && type <= STT_HIPROC)
11080         {
11081           if (filedata->file_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
11082             return "THUMB_FUNC";
11083
11084           if (filedata->file_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
11085             return "REGISTER";
11086
11087           if (filedata->file_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
11088             return "PARISC_MILLI";
11089
11090           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
11091         }
11092       else if (type >= STT_LOOS && type <= STT_HIOS)
11093         {
11094           if (filedata->file_header.e_machine == EM_PARISC)
11095             {
11096               if (type == STT_HP_OPAQUE)
11097                 return "HP_OPAQUE";
11098               if (type == STT_HP_STUB)
11099                 return "HP_STUB";
11100             }
11101
11102           if (type == STT_GNU_IFUNC
11103               && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
11104                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
11105                   /* GNU is still using the default value 0.  */
11106                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
11107             return "IFUNC";
11108
11109           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
11110         }
11111       else
11112         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
11113       return buff;
11114     }
11115 }
11116
11117 static const char *
11118 get_symbol_visibility (unsigned int visibility)
11119 {
11120   switch (visibility)
11121     {
11122     case STV_DEFAULT:   return "DEFAULT";
11123     case STV_INTERNAL:  return "INTERNAL";
11124     case STV_HIDDEN:    return "HIDDEN";
11125     case STV_PROTECTED: return "PROTECTED";
11126     default:
11127       error (_("Unrecognized visibility value: %u"), visibility);
11128       return _("<unknown>");
11129     }
11130 }
11131
11132 static const char *
11133 get_solaris_symbol_visibility (unsigned int visibility)
11134 {
11135   switch (visibility)
11136     {
11137     case 4: return "EXPORTED";
11138     case 5: return "SINGLETON";
11139     case 6: return "ELIMINATE";
11140     default: return get_symbol_visibility (visibility);
11141     }
11142 }
11143
11144 static const char *
11145 get_aarch64_symbol_other (unsigned int other)
11146 {
11147   static char buf[32];
11148
11149   if (other & STO_AARCH64_VARIANT_PCS)
11150     {
11151       other &= ~STO_AARCH64_VARIANT_PCS;
11152       if (other == 0)
11153         return "VARIANT_PCS";
11154       snprintf (buf, sizeof buf, "VARIANT_PCS | %x", other);
11155       return buf;
11156     }
11157   return NULL;
11158 }
11159
11160 static const char *
11161 get_mips_symbol_other (unsigned int other)
11162 {
11163   switch (other)
11164     {
11165     case STO_OPTIONAL:      return "OPTIONAL";
11166     case STO_MIPS_PLT:      return "MIPS PLT";
11167     case STO_MIPS_PIC:      return "MIPS PIC";
11168     case STO_MICROMIPS:     return "MICROMIPS";
11169     case STO_MICROMIPS | STO_MIPS_PIC:      return "MICROMIPS, MIPS PIC";
11170     case STO_MIPS16:        return "MIPS16";
11171     default:                return NULL;
11172     }
11173 }
11174
11175 static const char *
11176 get_ia64_symbol_other (Filedata * filedata, unsigned int other)
11177 {
11178   if (is_ia64_vms (filedata))
11179     {
11180       static char res[32];
11181
11182       res[0] = 0;
11183
11184       /* Function types is for images and .STB files only.  */
11185       switch (filedata->file_header.e_type)
11186         {
11187         case ET_DYN:
11188         case ET_EXEC:
11189           switch (VMS_ST_FUNC_TYPE (other))
11190             {
11191             case VMS_SFT_CODE_ADDR:
11192               strcat (res, " CA");
11193               break;
11194             case VMS_SFT_SYMV_IDX:
11195               strcat (res, " VEC");
11196               break;
11197             case VMS_SFT_FD:
11198               strcat (res, " FD");
11199               break;
11200             case VMS_SFT_RESERVE:
11201               strcat (res, " RSV");
11202               break;
11203             default:
11204               warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
11205                     VMS_ST_FUNC_TYPE (other));
11206               strcat (res, " <unknown>");
11207               break;
11208             }
11209           break;
11210         default:
11211           break;
11212         }
11213       switch (VMS_ST_LINKAGE (other))
11214         {
11215         case VMS_STL_IGNORE:
11216           strcat (res, " IGN");
11217           break;
11218         case VMS_STL_RESERVE:
11219           strcat (res, " RSV");
11220           break;
11221         case VMS_STL_STD:
11222           strcat (res, " STD");
11223           break;
11224         case VMS_STL_LNK:
11225           strcat (res, " LNK");
11226           break;
11227         default:
11228           warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
11229                 VMS_ST_LINKAGE (other));
11230           strcat (res, " <unknown>");
11231           break;
11232         }
11233
11234       if (res[0] != 0)
11235         return res + 1;
11236       else
11237         return res;
11238     }
11239   return NULL;
11240 }
11241
11242 static const char *
11243 get_ppc64_symbol_other (unsigned int other)
11244 {
11245   if ((other & ~STO_PPC64_LOCAL_MASK) != 0)
11246     return NULL;
11247
11248   other >>= STO_PPC64_LOCAL_BIT;
11249   if (other <= 6)
11250     {
11251       static char buf[32];
11252       if (other >= 2)
11253         other = ppc64_decode_local_entry (other);
11254       snprintf (buf, sizeof buf, _("<localentry>: %d"), other);
11255       return buf;
11256     }
11257   return NULL;
11258 }
11259
11260 static const char *
11261 get_symbol_other (Filedata * filedata, unsigned int other)
11262 {
11263   const char * result = NULL;
11264   static char buff [32];
11265
11266   if (other == 0)
11267     return "";
11268
11269   switch (filedata->file_header.e_machine)
11270     {
11271     case EM_AARCH64:
11272       result = get_aarch64_symbol_other (other);
11273       break;
11274     case EM_MIPS:
11275       result = get_mips_symbol_other (other);
11276       break;
11277     case EM_IA_64:
11278       result = get_ia64_symbol_other (filedata, other);
11279       break;
11280     case EM_PPC64:
11281       result = get_ppc64_symbol_other (other);
11282       break;
11283     default:
11284       result = NULL;
11285       break;
11286     }
11287
11288   if (result)
11289     return result;
11290
11291   snprintf (buff, sizeof buff, _("<other>: %x"), other);
11292   return buff;
11293 }
11294
11295 static const char *
11296 get_symbol_index_type (Filedata * filedata, unsigned int type)
11297 {
11298   static char buff[32];
11299
11300   switch (type)
11301     {
11302     case SHN_UNDEF:     return "UND";
11303     case SHN_ABS:       return "ABS";
11304     case SHN_COMMON:    return "COM";
11305     default:
11306       if (type == SHN_IA_64_ANSI_COMMON
11307           && filedata->file_header.e_machine == EM_IA_64
11308           && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
11309         return "ANSI_COM";
11310       else if ((filedata->file_header.e_machine == EM_X86_64
11311                 || filedata->file_header.e_machine == EM_L1OM
11312                 || filedata->file_header.e_machine == EM_K1OM)
11313                && type == SHN_X86_64_LCOMMON)
11314         return "LARGE_COM";
11315       else if ((type == SHN_MIPS_SCOMMON
11316                 && filedata->file_header.e_machine == EM_MIPS)
11317                || (type == SHN_TIC6X_SCOMMON
11318                    && filedata->file_header.e_machine == EM_TI_C6000))
11319         return "SCOM";
11320       else if (type == SHN_MIPS_SUNDEFINED
11321                && filedata->file_header.e_machine == EM_MIPS)
11322         return "SUND";
11323       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
11324         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
11325       else if (type >= SHN_LOOS && type <= SHN_HIOS)
11326         sprintf (buff, "OS [0x%04x]", type & 0xffff);
11327       else if (type >= SHN_LORESERVE)
11328         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
11329       else if (type >= filedata->file_header.e_shnum)
11330         sprintf (buff, _("bad section index[%3d]"), type);
11331       else
11332         sprintf (buff, "%3d", type);
11333       break;
11334     }
11335
11336   return buff;
11337 }
11338
11339 static bfd_vma *
11340 get_dynamic_data (Filedata * filedata, bfd_size_type number, unsigned int ent_size)
11341 {
11342   unsigned char * e_data;
11343   bfd_vma * i_data;
11344
11345   /* If the size_t type is smaller than the bfd_size_type, eg because
11346      you are building a 32-bit tool on a 64-bit host, then make sure
11347      that when (number) is cast to (size_t) no information is lost.  */
11348   if (sizeof (size_t) < sizeof (bfd_size_type)
11349       && (bfd_size_type) ((size_t) number) != number)
11350     {
11351       error (_("Size truncation prevents reading %s elements of size %u\n"),
11352              bfd_vmatoa ("u", number), ent_size);
11353       return NULL;
11354     }
11355
11356   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
11357      attempting to allocate memory when the read is bound to fail.  */
11358   if (ent_size * number > filedata->file_size)
11359     {
11360       error (_("Invalid number of dynamic entries: %s\n"),
11361              bfd_vmatoa ("u", number));
11362       return NULL;
11363     }
11364
11365   e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
11366   if (e_data == NULL)
11367     {
11368       error (_("Out of memory reading %s dynamic entries\n"),
11369              bfd_vmatoa ("u", number));
11370       return NULL;
11371     }
11372
11373   if (fread (e_data, ent_size, (size_t) number, filedata->handle) != number)
11374     {
11375       error (_("Unable to read in %s bytes of dynamic data\n"),
11376              bfd_vmatoa ("u", number * ent_size));
11377       free (e_data);
11378       return NULL;
11379     }
11380
11381   i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
11382   if (i_data == NULL)
11383     {
11384       error (_("Out of memory allocating space for %s dynamic entries\n"),
11385              bfd_vmatoa ("u", number));
11386       free (e_data);
11387       return NULL;
11388     }
11389
11390   while (number--)
11391     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
11392
11393   free (e_data);
11394
11395   return i_data;
11396 }
11397
11398 static void
11399 print_dynamic_symbol (Filedata * filedata, bfd_vma si, unsigned long hn)
11400 {
11401   Elf_Internal_Sym * psym;
11402   int n;
11403
11404   n = print_vma (si, DEC_5);
11405   if (n < 5)
11406     fputs (&"     "[n], stdout);
11407   printf (" %3lu: ", hn);
11408
11409   if (dynamic_symbols == NULL || si >= num_dynamic_syms)
11410     {
11411       printf (_("<No info available for dynamic symbol number %lu>\n"),
11412               (unsigned long) si);
11413       return;
11414     }
11415
11416   psym = dynamic_symbols + si;
11417   print_vma (psym->st_value, LONG_HEX);
11418   putchar (' ');
11419   print_vma (psym->st_size, DEC_5);
11420
11421   printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11422   printf (" %-6s",  get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11423
11424   if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11425     printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11426   else
11427     {
11428       unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11429
11430       printf (" %-7s",  get_symbol_visibility (vis));
11431       /* Check to see if any other bits in the st_other field are set.
11432          Note - displaying this information disrupts the layout of the
11433          table being generated, but for the moment this case is very
11434          rare.  */
11435       if (psym->st_other ^ vis)
11436         printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11437     }
11438
11439   printf (" %3.3s ", get_symbol_index_type (filedata, psym->st_shndx));
11440   if (VALID_DYNAMIC_NAME (psym->st_name))
11441     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11442   else
11443     printf (_(" <corrupt: %14ld>"), psym->st_name);
11444   putchar ('\n');
11445 }
11446
11447 static const char *
11448 get_symbol_version_string (Filedata *                   filedata,
11449                            bfd_boolean                  is_dynsym,
11450                            const char *                 strtab,
11451                            unsigned long int            strtab_size,
11452                            unsigned int                 si,
11453                            Elf_Internal_Sym *           psym,
11454                            enum versioned_symbol_info * sym_info,
11455                            unsigned short *             vna_other)
11456 {
11457   unsigned char data[2];
11458   unsigned short vers_data;
11459   unsigned long offset;
11460   unsigned short max_vd_ndx;
11461
11462   if (!is_dynsym
11463       || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
11464     return NULL;
11465
11466   offset = offset_from_vma (filedata, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
11467                             sizeof data + si * sizeof (vers_data));
11468
11469   if (get_data (&data, filedata, offset + si * sizeof (vers_data),
11470                 sizeof (data), 1, _("version data")) == NULL)
11471     return NULL;
11472
11473   vers_data = byte_get (data, 2);
11474
11475   if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data == 0)
11476     return NULL;
11477
11478   max_vd_ndx = 0;
11479
11480   /* Usually we'd only see verdef for defined symbols, and verneed for
11481      undefined symbols.  However, symbols defined by the linker in
11482      .dynbss for variables copied from a shared library in order to
11483      avoid text relocations are defined yet have verneed.  We could
11484      use a heuristic to detect the special case, for example, check
11485      for verneed first on symbols defined in SHT_NOBITS sections, but
11486      it is simpler and more reliable to just look for both verdef and
11487      verneed.  .dynbss might not be mapped to a SHT_NOBITS section.  */
11488
11489   if (psym->st_shndx != SHN_UNDEF
11490       && vers_data != 0x8001
11491       && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
11492     {
11493       Elf_Internal_Verdef ivd;
11494       Elf_Internal_Verdaux ivda;
11495       Elf_External_Verdaux evda;
11496       unsigned long off;
11497
11498       off = offset_from_vma (filedata,
11499                              version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
11500                              sizeof (Elf_External_Verdef));
11501
11502       do
11503         {
11504           Elf_External_Verdef evd;
11505
11506           if (get_data (&evd, filedata, off, sizeof (evd), 1,
11507                         _("version def")) == NULL)
11508             {
11509               ivd.vd_ndx = 0;
11510               ivd.vd_aux = 0;
11511               ivd.vd_next = 0;
11512               ivd.vd_flags = 0;
11513             }
11514           else
11515             {
11516               ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
11517               ivd.vd_aux = BYTE_GET (evd.vd_aux);
11518               ivd.vd_next = BYTE_GET (evd.vd_next);
11519               ivd.vd_flags = BYTE_GET (evd.vd_flags);
11520             }
11521
11522           if ((ivd.vd_ndx & VERSYM_VERSION) > max_vd_ndx)
11523             max_vd_ndx = ivd.vd_ndx & VERSYM_VERSION;
11524
11525           off += ivd.vd_next;
11526         }
11527       while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
11528
11529       if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
11530         {
11531           if (ivd.vd_ndx == 1 && ivd.vd_flags == VER_FLG_BASE) 
11532             return NULL;
11533
11534           off -= ivd.vd_next;
11535           off += ivd.vd_aux;
11536
11537           if (get_data (&evda, filedata, off, sizeof (evda), 1,
11538                         _("version def aux")) != NULL)
11539             {
11540               ivda.vda_name = BYTE_GET (evda.vda_name);
11541
11542               if (psym->st_name != ivda.vda_name)
11543                 {
11544                   *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
11545                                ? symbol_hidden : symbol_public);
11546                   return (ivda.vda_name < strtab_size
11547                           ? strtab + ivda.vda_name : _("<corrupt>"));
11548                 }
11549             }
11550         }
11551     }
11552
11553   if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
11554     {
11555       Elf_External_Verneed evn;
11556       Elf_Internal_Verneed ivn;
11557       Elf_Internal_Vernaux ivna;
11558
11559       offset = offset_from_vma (filedata,
11560                                 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
11561                                 sizeof evn);
11562       do
11563         {
11564           unsigned long vna_off;
11565
11566           if (get_data (&evn, filedata, offset, sizeof (evn), 1,
11567                         _("version need")) == NULL)
11568             {
11569               ivna.vna_next = 0;
11570               ivna.vna_other = 0;
11571               ivna.vna_name = 0;
11572               break;
11573             }
11574
11575           ivn.vn_aux  = BYTE_GET (evn.vn_aux);
11576           ivn.vn_next = BYTE_GET (evn.vn_next);
11577
11578           vna_off = offset + ivn.vn_aux;
11579
11580           do
11581             {
11582               Elf_External_Vernaux evna;
11583
11584               if (get_data (&evna, filedata, vna_off, sizeof (evna), 1,
11585                             _("version need aux (3)")) == NULL)
11586                 {
11587                   ivna.vna_next = 0;
11588                   ivna.vna_other = 0;
11589                   ivna.vna_name = 0;
11590                 }
11591               else
11592                 {
11593                   ivna.vna_other = BYTE_GET (evna.vna_other);
11594                   ivna.vna_next  = BYTE_GET (evna.vna_next);
11595                   ivna.vna_name  = BYTE_GET (evna.vna_name);
11596                 }
11597
11598               vna_off += ivna.vna_next;
11599             }
11600           while (ivna.vna_other != vers_data && ivna.vna_next != 0);
11601
11602           if (ivna.vna_other == vers_data)
11603             break;
11604
11605           offset += ivn.vn_next;
11606         }
11607       while (ivn.vn_next != 0);
11608
11609       if (ivna.vna_other == vers_data)
11610         {
11611           *sym_info = symbol_undefined;
11612           *vna_other = ivna.vna_other;
11613           return (ivna.vna_name < strtab_size
11614                   ? strtab + ivna.vna_name : _("<corrupt>"));
11615         }
11616       else if ((max_vd_ndx || (vers_data & VERSYM_VERSION) != 1)
11617                && (vers_data & VERSYM_VERSION) > max_vd_ndx)
11618         return _("<corrupt>");
11619     }
11620   return NULL;
11621 }
11622
11623 /* Dump the symbol table.  */
11624 static bfd_boolean
11625 process_symbol_table (Filedata * filedata)
11626 {
11627   Elf_Internal_Shdr * section;
11628   bfd_size_type nbuckets = 0;
11629   bfd_size_type nchains = 0;
11630   bfd_vma * buckets = NULL;
11631   bfd_vma * chains = NULL;
11632   bfd_vma ngnubuckets = 0;
11633   bfd_vma * gnubuckets = NULL;
11634   bfd_vma * gnuchains = NULL;
11635   bfd_vma gnusymidx = 0;
11636   bfd_size_type ngnuchains = 0;
11637
11638   if (!do_syms && !do_dyn_syms && !do_histogram)
11639     return TRUE;
11640
11641   if (dynamic_info[DT_HASH]
11642       && (do_histogram
11643           || (do_using_dynamic
11644               && !do_dyn_syms
11645               && dynamic_strings != NULL)))
11646     {
11647       unsigned char nb[8];
11648       unsigned char nc[8];
11649       unsigned int hash_ent_size = 4;
11650
11651       if ((filedata->file_header.e_machine == EM_ALPHA
11652            || filedata->file_header.e_machine == EM_S390
11653            || filedata->file_header.e_machine == EM_S390_OLD)
11654           && filedata->file_header.e_ident[EI_CLASS] == ELFCLASS64)
11655         hash_ent_size = 8;
11656
11657       if (fseek (filedata->handle,
11658                  (archive_file_offset
11659                   + offset_from_vma (filedata, dynamic_info[DT_HASH],
11660                                      sizeof nb + sizeof nc)),
11661                  SEEK_SET))
11662         {
11663           error (_("Unable to seek to start of dynamic information\n"));
11664           goto no_hash;
11665         }
11666
11667       if (fread (nb, hash_ent_size, 1, filedata->handle) != 1)
11668         {
11669           error (_("Failed to read in number of buckets\n"));
11670           goto no_hash;
11671         }
11672
11673       if (fread (nc, hash_ent_size, 1, filedata->handle) != 1)
11674         {
11675           error (_("Failed to read in number of chains\n"));
11676           goto no_hash;
11677         }
11678
11679       nbuckets = byte_get (nb, hash_ent_size);
11680       nchains  = byte_get (nc, hash_ent_size);
11681
11682       buckets = get_dynamic_data (filedata, nbuckets, hash_ent_size);
11683       chains  = get_dynamic_data (filedata, nchains, hash_ent_size);
11684
11685     no_hash:
11686       if (buckets == NULL || chains == NULL)
11687         {
11688           if (do_using_dynamic)
11689             return FALSE;
11690           free (buckets);
11691           free (chains);
11692           buckets = NULL;
11693           chains = NULL;
11694           nbuckets = 0;
11695           nchains = 0;
11696         }
11697     }
11698
11699   if (dynamic_info_DT_GNU_HASH
11700       && (do_histogram
11701           || (do_using_dynamic
11702               && !do_dyn_syms
11703               && dynamic_strings != NULL)))
11704     {
11705       unsigned char nb[16];
11706       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11707       bfd_vma buckets_vma;
11708
11709       if (fseek (filedata->handle,
11710                  (archive_file_offset
11711                   + offset_from_vma (filedata, dynamic_info_DT_GNU_HASH,
11712                                      sizeof nb)),
11713                  SEEK_SET))
11714         {
11715           error (_("Unable to seek to start of dynamic information\n"));
11716           goto no_gnu_hash;
11717         }
11718
11719       if (fread (nb, 16, 1, filedata->handle) != 1)
11720         {
11721           error (_("Failed to read in number of buckets\n"));
11722           goto no_gnu_hash;
11723         }
11724
11725       ngnubuckets = byte_get (nb, 4);
11726       gnusymidx = byte_get (nb + 4, 4);
11727       bitmaskwords = byte_get (nb + 8, 4);
11728       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
11729       if (is_32bit_elf)
11730         buckets_vma += bitmaskwords * 4;
11731       else
11732         buckets_vma += bitmaskwords * 8;
11733
11734       if (fseek (filedata->handle,
11735                  (archive_file_offset
11736                   + offset_from_vma (filedata, buckets_vma, 4)),
11737                  SEEK_SET))
11738         {
11739           error (_("Unable to seek to start of dynamic information\n"));
11740           goto no_gnu_hash;
11741         }
11742
11743       gnubuckets = get_dynamic_data (filedata, ngnubuckets, 4);
11744
11745       if (gnubuckets == NULL)
11746         goto no_gnu_hash;
11747
11748       for (i = 0; i < ngnubuckets; i++)
11749         if (gnubuckets[i] != 0)
11750           {
11751             if (gnubuckets[i] < gnusymidx)
11752               return FALSE;
11753
11754             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11755               maxchain = gnubuckets[i];
11756           }
11757
11758       if (maxchain == 0xffffffff)
11759         goto no_gnu_hash;
11760
11761       maxchain -= gnusymidx;
11762
11763       if (fseek (filedata->handle,
11764                  (archive_file_offset
11765                   + offset_from_vma (filedata, buckets_vma
11766                                            + 4 * (ngnubuckets + maxchain), 4)),
11767                  SEEK_SET))
11768         {
11769           error (_("Unable to seek to start of dynamic information\n"));
11770           goto no_gnu_hash;
11771         }
11772
11773       do
11774         {
11775           if (fread (nb, 4, 1, filedata->handle) != 1)
11776             {
11777               error (_("Failed to determine last chain length\n"));
11778               goto no_gnu_hash;
11779             }
11780
11781           if (maxchain + 1 == 0)
11782             goto no_gnu_hash;
11783
11784           ++maxchain;
11785         }
11786       while ((byte_get (nb, 4) & 1) == 0);
11787
11788       if (fseek (filedata->handle,
11789                  (archive_file_offset
11790                   + offset_from_vma (filedata, buckets_vma + 4 * ngnubuckets, 4)),
11791                  SEEK_SET))
11792         {
11793           error (_("Unable to seek to start of dynamic information\n"));
11794           goto no_gnu_hash;
11795         }
11796
11797       gnuchains = get_dynamic_data (filedata, maxchain, 4);
11798       ngnuchains = maxchain;
11799
11800     no_gnu_hash:
11801       if (gnuchains == NULL)
11802         {
11803           free (gnubuckets);
11804           gnubuckets = NULL;
11805           ngnubuckets = 0;
11806           if (do_using_dynamic)
11807             return FALSE;
11808         }
11809     }
11810
11811   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11812       && do_syms
11813       && do_using_dynamic
11814       && dynamic_strings != NULL
11815       && dynamic_symbols != NULL)
11816     {
11817       unsigned long hn;
11818
11819       if (dynamic_info[DT_HASH])
11820         {
11821           bfd_vma si;
11822           char *visited;
11823
11824           printf (_("\nSymbol table for image:\n"));
11825           if (is_32bit_elf)
11826             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11827           else
11828             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11829
11830           visited = xcmalloc (nchains, 1);
11831           memset (visited, 0, nchains);
11832           for (hn = 0; hn < nbuckets; hn++)
11833             {
11834               for (si = buckets[hn]; si > 0; si = chains[si])
11835                 {
11836                   print_dynamic_symbol (filedata, si, hn);
11837                   if (si >= nchains || visited[si])
11838                     {
11839                       error (_("histogram chain is corrupt\n"));
11840                       break;
11841                     }
11842                   visited[si] = 1;
11843                 }
11844             }
11845           free (visited);
11846         }
11847
11848       if (dynamic_info_DT_GNU_HASH)
11849         {
11850           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11851           if (is_32bit_elf)
11852             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11853           else
11854             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11855
11856           for (hn = 0; hn < ngnubuckets; ++hn)
11857             if (gnubuckets[hn] != 0)
11858               {
11859                 bfd_vma si = gnubuckets[hn];
11860                 bfd_vma off = si - gnusymidx;
11861
11862                 do
11863                   {
11864                     print_dynamic_symbol (filedata, si, hn);
11865                     si++;
11866                   }
11867                 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11868               }
11869         }
11870     }
11871   else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11872            && filedata->section_headers != NULL)
11873     {
11874       unsigned int i;
11875
11876       for (i = 0, section = filedata->section_headers;
11877            i < filedata->file_header.e_shnum;
11878            i++, section++)
11879         {
11880           unsigned int si;
11881           char * strtab = NULL;
11882           unsigned long int strtab_size = 0;
11883           Elf_Internal_Sym * symtab;
11884           Elf_Internal_Sym * psym;
11885           unsigned long num_syms;
11886
11887           if ((section->sh_type != SHT_SYMTAB
11888                && section->sh_type != SHT_DYNSYM)
11889               || (!do_syms
11890                   && section->sh_type == SHT_SYMTAB))
11891             continue;
11892
11893           if (section->sh_entsize == 0)
11894             {
11895               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11896                       printable_section_name (filedata, section));
11897               continue;
11898             }
11899
11900           num_syms = section->sh_size / section->sh_entsize;
11901           printf (ngettext ("\nSymbol table '%s' contains %lu entry:\n",
11902                             "\nSymbol table '%s' contains %lu entries:\n",
11903                             num_syms),
11904                   printable_section_name (filedata, section),
11905                   num_syms);
11906
11907           if (is_32bit_elf)
11908             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
11909           else
11910             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
11911
11912           symtab = GET_ELF_SYMBOLS (filedata, section, & num_syms);
11913           if (symtab == NULL)
11914             continue;
11915
11916           if (section->sh_link == filedata->file_header.e_shstrndx)
11917             {
11918               strtab = filedata->string_table;
11919               strtab_size = filedata->string_table_length;
11920             }
11921           else if (section->sh_link < filedata->file_header.e_shnum)
11922             {
11923               Elf_Internal_Shdr * string_sec;
11924
11925               string_sec = filedata->section_headers + section->sh_link;
11926
11927               strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset,
11928                                           1, string_sec->sh_size,
11929                                           _("string table"));
11930               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11931             }
11932
11933           for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11934             {
11935               const char *version_string;
11936               enum versioned_symbol_info sym_info;
11937               unsigned short vna_other;
11938
11939               printf ("%6d: ", si);
11940               print_vma (psym->st_value, LONG_HEX);
11941               putchar (' ');
11942               print_vma (psym->st_size, DEC_5);
11943               printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11944               printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11945               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11946                 printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11947               else
11948                 {
11949                   unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11950
11951                   printf (" %-7s", get_symbol_visibility (vis));
11952                   /* Check to see if any other bits in the st_other field are set.
11953                      Note - displaying this information disrupts the layout of the
11954                      table being generated, but for the moment this case is very rare.  */
11955                   if (psym->st_other ^ vis)
11956                     printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11957                 }
11958               printf (" %4s ", get_symbol_index_type (filedata, psym->st_shndx));
11959               print_symbol (25, psym->st_name < strtab_size
11960                             ? strtab + psym->st_name : _("<corrupt>"));
11961
11962               version_string
11963                 = get_symbol_version_string (filedata,
11964                                              section->sh_type == SHT_DYNSYM,
11965                                              strtab, strtab_size, si,
11966                                              psym, &sym_info, &vna_other);
11967               if (version_string)
11968                 {
11969                   if (sym_info == symbol_undefined)
11970                     printf ("@%s (%d)", version_string, vna_other);
11971                   else
11972                     printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11973                             version_string);
11974                 }
11975
11976               putchar ('\n');
11977
11978               if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
11979                   && si >= section->sh_info
11980                   /* Irix 5 and 6 MIPS binaries are known to ignore this requirement.  */
11981                   && filedata->file_header.e_machine != EM_MIPS
11982                   /* Solaris binaries have been found to violate this requirement as
11983                      well.  Not sure if this is a bug or an ABI requirement.  */
11984                   && filedata->file_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
11985                 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11986                       si, printable_section_name (filedata, section), section->sh_info);
11987             }
11988
11989           free (symtab);
11990           if (strtab != filedata->string_table)
11991             free (strtab);
11992         }
11993     }
11994   else if (do_syms)
11995     printf
11996       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11997
11998   if (do_histogram && buckets != NULL)
11999     {
12000       unsigned long * lengths;
12001       unsigned long * counts;
12002       unsigned long hn;
12003       bfd_vma si;
12004       unsigned long maxlength = 0;
12005       unsigned long nzero_counts = 0;
12006       unsigned long nsyms = 0;
12007       char *visited;
12008
12009       printf (ngettext ("\nHistogram for bucket list length "
12010                         "(total of %lu bucket):\n",
12011                         "\nHistogram for bucket list length "
12012                         "(total of %lu buckets):\n",
12013                         (unsigned long) nbuckets),
12014               (unsigned long) nbuckets);
12015
12016       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
12017       if (lengths == NULL)
12018         {
12019           error (_("Out of memory allocating space for histogram buckets\n"));
12020           return FALSE;
12021         }
12022       visited = xcmalloc (nchains, 1);
12023       memset (visited, 0, nchains);
12024
12025       printf (_(" Length  Number     %% of total  Coverage\n"));
12026       for (hn = 0; hn < nbuckets; ++hn)
12027         {
12028           for (si = buckets[hn]; si > 0; si = chains[si])
12029             {
12030               ++nsyms;
12031               if (maxlength < ++lengths[hn])
12032                 ++maxlength;
12033               if (si >= nchains || visited[si])
12034                 {
12035                   error (_("histogram chain is corrupt\n"));
12036                   break;
12037                 }
12038               visited[si] = 1;
12039             }
12040         }
12041       free (visited);
12042
12043       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
12044       if (counts == NULL)
12045         {
12046           free (lengths);
12047           error (_("Out of memory allocating space for histogram counts\n"));
12048           return FALSE;
12049         }
12050
12051       for (hn = 0; hn < nbuckets; ++hn)
12052         ++counts[lengths[hn]];
12053
12054       if (nbuckets > 0)
12055         {
12056           unsigned long i;
12057           printf ("      0  %-10lu (%5.1f%%)\n",
12058                   counts[0], (counts[0] * 100.0) / nbuckets);
12059           for (i = 1; i <= maxlength; ++i)
12060             {
12061               nzero_counts += counts[i] * i;
12062               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
12063                       i, counts[i], (counts[i] * 100.0) / nbuckets,
12064                       (nzero_counts * 100.0) / nsyms);
12065             }
12066         }
12067
12068       free (counts);
12069       free (lengths);
12070     }
12071
12072   if (buckets != NULL)
12073     {
12074       free (buckets);
12075       free (chains);
12076     }
12077
12078   if (do_histogram && gnubuckets != NULL)
12079     {
12080       unsigned long * lengths;
12081       unsigned long * counts;
12082       unsigned long hn;
12083       unsigned long maxlength = 0;
12084       unsigned long nzero_counts = 0;
12085       unsigned long nsyms = 0;
12086
12087       printf (ngettext ("\nHistogram for `.gnu.hash' bucket list length "
12088                         "(total of %lu bucket):\n",
12089                         "\nHistogram for `.gnu.hash' bucket list length "
12090                         "(total of %lu buckets):\n",
12091                         (unsigned long) ngnubuckets),
12092               (unsigned long) ngnubuckets);
12093
12094       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
12095       if (lengths == NULL)
12096         {
12097           error (_("Out of memory allocating space for gnu histogram buckets\n"));
12098           return FALSE;
12099         }
12100
12101       printf (_(" Length  Number     %% of total  Coverage\n"));
12102
12103       for (hn = 0; hn < ngnubuckets; ++hn)
12104         if (gnubuckets[hn] != 0)
12105           {
12106             bfd_vma off, length = 1;
12107
12108             for (off = gnubuckets[hn] - gnusymidx;
12109                  /* PR 17531 file: 010-77222-0.004.  */
12110                  off < ngnuchains && (gnuchains[off] & 1) == 0;
12111                  ++off)
12112               ++length;
12113             lengths[hn] = length;
12114             if (length > maxlength)
12115               maxlength = length;
12116             nsyms += length;
12117           }
12118
12119       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
12120       if (counts == NULL)
12121         {
12122           free (lengths);
12123           error (_("Out of memory allocating space for gnu histogram counts\n"));
12124           return FALSE;
12125         }
12126
12127       for (hn = 0; hn < ngnubuckets; ++hn)
12128         ++counts[lengths[hn]];
12129
12130       if (ngnubuckets > 0)
12131         {
12132           unsigned long j;
12133           printf ("      0  %-10lu (%5.1f%%)\n",
12134                   counts[0], (counts[0] * 100.0) / ngnubuckets);
12135           for (j = 1; j <= maxlength; ++j)
12136             {
12137               nzero_counts += counts[j] * j;
12138               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
12139                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
12140                       (nzero_counts * 100.0) / nsyms);
12141             }
12142         }
12143
12144       free (counts);
12145       free (lengths);
12146       free (gnubuckets);
12147       free (gnuchains);
12148     }
12149
12150   return TRUE;
12151 }
12152
12153 static bfd_boolean
12154 process_syminfo (Filedata * filedata ATTRIBUTE_UNUSED)
12155 {
12156   unsigned int i;
12157
12158   if (dynamic_syminfo == NULL
12159       || !do_dynamic)
12160     /* No syminfo, this is ok.  */
12161     return TRUE;
12162
12163   /* There better should be a dynamic symbol section.  */
12164   if (dynamic_symbols == NULL || dynamic_strings == NULL)
12165     return FALSE;
12166
12167   if (dynamic_addr)
12168     printf (ngettext ("\nDynamic info segment at offset 0x%lx "
12169                       "contains %d entry:\n",
12170                       "\nDynamic info segment at offset 0x%lx "
12171                       "contains %d entries:\n",
12172                       dynamic_syminfo_nent),
12173             dynamic_syminfo_offset, dynamic_syminfo_nent);
12174
12175   printf (_(" Num: Name                           BoundTo     Flags\n"));
12176   for (i = 0; i < dynamic_syminfo_nent; ++i)
12177     {
12178       unsigned short int flags = dynamic_syminfo[i].si_flags;
12179
12180       printf ("%4d: ", i);
12181       if (i >= num_dynamic_syms)
12182         printf (_("<corrupt index>"));
12183       else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
12184         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
12185       else
12186         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
12187       putchar (' ');
12188
12189       switch (dynamic_syminfo[i].si_boundto)
12190         {
12191         case SYMINFO_BT_SELF:
12192           fputs ("SELF       ", stdout);
12193           break;
12194         case SYMINFO_BT_PARENT:
12195           fputs ("PARENT     ", stdout);
12196           break;
12197         default:
12198           if (dynamic_syminfo[i].si_boundto > 0
12199               && dynamic_syminfo[i].si_boundto < dynamic_nent
12200               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
12201             {
12202               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
12203               putchar (' ' );
12204             }
12205           else
12206             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
12207           break;
12208         }
12209
12210       if (flags & SYMINFO_FLG_DIRECT)
12211         printf (" DIRECT");
12212       if (flags & SYMINFO_FLG_PASSTHRU)
12213         printf (" PASSTHRU");
12214       if (flags & SYMINFO_FLG_COPY)
12215         printf (" COPY");
12216       if (flags & SYMINFO_FLG_LAZYLOAD)
12217         printf (" LAZYLOAD");
12218
12219       puts ("");
12220     }
12221
12222   return TRUE;
12223 }
12224
12225 #define IN_RANGE(START,END,ADDR,OFF)            \
12226   (((ADDR) >= (START)) && ((ADDR) + (OFF) < (END)))
12227
12228 /* Check to see if the given reloc needs to be handled in a target specific
12229    manner.  If so then process the reloc and return TRUE otherwise return
12230    FALSE.
12231
12232    If called with reloc == NULL, then this is a signal that reloc processing
12233    for the current section has finished, and any saved state should be
12234    discarded.  */
12235
12236 static bfd_boolean
12237 target_specific_reloc_handling (Filedata *           filedata,
12238                                 Elf_Internal_Rela *  reloc,
12239                                 unsigned char *      start,
12240                                 unsigned char *      end,
12241                                 Elf_Internal_Sym *   symtab,
12242                                 unsigned long        num_syms)
12243 {
12244   unsigned int reloc_type = 0;
12245   unsigned long sym_index = 0;
12246
12247   if (reloc)
12248     {
12249       reloc_type = get_reloc_type (filedata, reloc->r_info);
12250       sym_index = get_reloc_symindex (reloc->r_info);
12251     }
12252
12253   switch (filedata->file_header.e_machine)
12254     {
12255     case EM_MSP430:
12256     case EM_MSP430_OLD:
12257       {
12258         static Elf_Internal_Sym * saved_sym = NULL;
12259
12260         if (reloc == NULL)
12261           {
12262             saved_sym = NULL;
12263             return TRUE;
12264           }
12265
12266         switch (reloc_type)
12267           {
12268           case 10: /* R_MSP430_SYM_DIFF */
12269             if (uses_msp430x_relocs (filedata))
12270               break;
12271             /* Fall through.  */
12272           case 21: /* R_MSP430X_SYM_DIFF */
12273             /* PR 21139.  */
12274             if (sym_index >= num_syms)
12275               error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
12276                      sym_index);
12277             else
12278               saved_sym = symtab + sym_index;
12279             return TRUE;
12280
12281           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
12282           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
12283             goto handle_sym_diff;
12284
12285           case 5: /* R_MSP430_16_BYTE */
12286           case 9: /* R_MSP430_8 */
12287             if (uses_msp430x_relocs (filedata))
12288               break;
12289             goto handle_sym_diff;
12290
12291           case 2: /* R_MSP430_ABS16 */
12292           case 15: /* R_MSP430X_ABS16 */
12293             if (! uses_msp430x_relocs (filedata))
12294               break;
12295             goto handle_sym_diff;
12296
12297           handle_sym_diff:
12298             if (saved_sym != NULL)
12299               {
12300                 int reloc_size = reloc_type == 1 ? 4 : 2;
12301                 bfd_vma value;
12302
12303                 if (sym_index >= num_syms)
12304                   error (_("MSP430 reloc contains invalid symbol index %lu\n"),
12305                          sym_index);
12306                 else
12307                   {
12308                     value = reloc->r_addend + (symtab[sym_index].st_value
12309                                                - saved_sym->st_value);
12310
12311                     if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12312                       byte_put (start + reloc->r_offset, value, reloc_size);
12313                     else
12314                       /* PR 21137 */
12315                       error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
12316                              (long) reloc->r_offset);
12317                   }
12318
12319                 saved_sym = NULL;
12320                 return TRUE;
12321               }
12322             break;
12323
12324           default:
12325             if (saved_sym != NULL)
12326               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
12327             break;
12328           }
12329         break;
12330       }
12331
12332     case EM_MN10300:
12333     case EM_CYGNUS_MN10300:
12334       {
12335         static Elf_Internal_Sym * saved_sym = NULL;
12336
12337         if (reloc == NULL)
12338           {
12339             saved_sym = NULL;
12340             return TRUE;
12341           }
12342
12343         switch (reloc_type)
12344           {
12345           case 34: /* R_MN10300_ALIGN */
12346             return TRUE;
12347           case 33: /* R_MN10300_SYM_DIFF */
12348             if (sym_index >= num_syms)
12349               error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
12350                      sym_index);
12351             else
12352               saved_sym = symtab + sym_index;
12353             return TRUE;
12354
12355           case 1: /* R_MN10300_32 */
12356           case 2: /* R_MN10300_16 */
12357             if (saved_sym != NULL)
12358               {
12359                 int reloc_size = reloc_type == 1 ? 4 : 2;
12360                 bfd_vma value;
12361
12362                 if (sym_index >= num_syms)
12363                   error (_("MN10300 reloc contains invalid symbol index %lu\n"),
12364                          sym_index);
12365                 else
12366                   {
12367                     value = reloc->r_addend + (symtab[sym_index].st_value
12368                                                - saved_sym->st_value);
12369
12370                     if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12371                       byte_put (start + reloc->r_offset, value, reloc_size);
12372                     else
12373                       error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
12374                              (long) reloc->r_offset);
12375                   }
12376
12377                 saved_sym = NULL;
12378                 return TRUE;
12379               }
12380             break;
12381           default:
12382             if (saved_sym != NULL)
12383               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
12384             break;
12385           }
12386         break;
12387       }
12388
12389     case EM_RL78:
12390       {
12391         static bfd_vma saved_sym1 = 0;
12392         static bfd_vma saved_sym2 = 0;
12393         static bfd_vma value;
12394
12395         if (reloc == NULL)
12396           {
12397             saved_sym1 = saved_sym2 = 0;
12398             return TRUE;
12399           }
12400
12401         switch (reloc_type)
12402           {
12403           case 0x80: /* R_RL78_SYM.  */
12404             saved_sym1 = saved_sym2;
12405             if (sym_index >= num_syms)
12406               error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
12407                      sym_index);
12408             else
12409               {
12410                 saved_sym2 = symtab[sym_index].st_value;
12411                 saved_sym2 += reloc->r_addend;
12412               }
12413             return TRUE;
12414
12415           case 0x83: /* R_RL78_OPsub.  */
12416             value = saved_sym1 - saved_sym2;
12417             saved_sym2 = saved_sym1 = 0;
12418             return TRUE;
12419             break;
12420
12421           case 0x41: /* R_RL78_ABS32.  */
12422             if (IN_RANGE (start, end, start + reloc->r_offset, 4))
12423               byte_put (start + reloc->r_offset, value, 4);
12424             else
12425               error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12426                      (long) reloc->r_offset);
12427             value = 0;
12428             return TRUE;
12429
12430           case 0x43: /* R_RL78_ABS16.  */
12431             if (IN_RANGE (start, end, start + reloc->r_offset, 2))
12432               byte_put (start + reloc->r_offset, value, 2);
12433             else
12434               error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12435                      (long) reloc->r_offset);
12436             value = 0;
12437             return TRUE;
12438
12439           default:
12440             break;
12441           }
12442         break;
12443       }
12444     }
12445
12446   return FALSE;
12447 }
12448
12449 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
12450    DWARF debug sections.  This is a target specific test.  Note - we do not
12451    go through the whole including-target-headers-multiple-times route, (as
12452    we have already done with <elf/h8.h>) because this would become very
12453    messy and even then this function would have to contain target specific
12454    information (the names of the relocs instead of their numeric values).
12455    FIXME: This is not the correct way to solve this problem.  The proper way
12456    is to have target specific reloc sizing and typing functions created by
12457    the reloc-macros.h header, in the same way that it already creates the
12458    reloc naming functions.  */
12459
12460 static bfd_boolean
12461 is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12462 {
12463   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12464   switch (filedata->file_header.e_machine)
12465     {
12466     case EM_386:
12467     case EM_IAMCU:
12468       return reloc_type == 1; /* R_386_32.  */
12469     case EM_68K:
12470       return reloc_type == 1; /* R_68K_32.  */
12471     case EM_860:
12472       return reloc_type == 1; /* R_860_32.  */
12473     case EM_960:
12474       return reloc_type == 2; /* R_960_32.  */
12475     case EM_AARCH64:
12476       return (reloc_type == 258
12477               || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
12478     case EM_BPF:
12479       return reloc_type == 11; /* R_BPF_DATA_32 */
12480     case EM_ADAPTEVA_EPIPHANY:
12481       return reloc_type == 3;
12482     case EM_ALPHA:
12483       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
12484     case EM_ARC:
12485       return reloc_type == 1; /* R_ARC_32.  */
12486     case EM_ARC_COMPACT:
12487     case EM_ARC_COMPACT2:
12488       return reloc_type == 4; /* R_ARC_32.  */
12489     case EM_ARM:
12490       return reloc_type == 2; /* R_ARM_ABS32 */
12491     case EM_AVR_OLD:
12492     case EM_AVR:
12493       return reloc_type == 1;
12494     case EM_BLACKFIN:
12495       return reloc_type == 0x12; /* R_byte4_data.  */
12496     case EM_CRIS:
12497       return reloc_type == 3; /* R_CRIS_32.  */
12498     case EM_CR16:
12499       return reloc_type == 3; /* R_CR16_NUM32.  */
12500     case EM_CRX:
12501       return reloc_type == 15; /* R_CRX_NUM32.  */
12502     case EM_CSKY:
12503       return reloc_type == 1; /* R_CKCORE_ADDR32.  */
12504     case EM_CYGNUS_FRV:
12505       return reloc_type == 1;
12506     case EM_CYGNUS_D10V:
12507     case EM_D10V:
12508       return reloc_type == 6; /* R_D10V_32.  */
12509     case EM_CYGNUS_D30V:
12510     case EM_D30V:
12511       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
12512     case EM_DLX:
12513       return reloc_type == 3; /* R_DLX_RELOC_32.  */
12514     case EM_CYGNUS_FR30:
12515     case EM_FR30:
12516       return reloc_type == 3; /* R_FR30_32.  */
12517     case EM_FT32:
12518       return reloc_type == 1; /* R_FT32_32.  */
12519     case EM_H8S:
12520     case EM_H8_300:
12521     case EM_H8_300H:
12522       return reloc_type == 1; /* R_H8_DIR32.  */
12523     case EM_IA_64:
12524       return (reloc_type == 0x64    /* R_IA64_SECREL32MSB.  */
12525               || reloc_type == 0x65 /* R_IA64_SECREL32LSB.  */
12526               || reloc_type == 0x24 /* R_IA64_DIR32MSB.  */
12527               || reloc_type == 0x25 /* R_IA64_DIR32LSB.  */);
12528     case EM_IP2K_OLD:
12529     case EM_IP2K:
12530       return reloc_type == 2; /* R_IP2K_32.  */
12531     case EM_IQ2000:
12532       return reloc_type == 2; /* R_IQ2000_32.  */
12533     case EM_LATTICEMICO32:
12534       return reloc_type == 3; /* R_LM32_32.  */
12535     case EM_M32C_OLD:
12536     case EM_M32C:
12537       return reloc_type == 3; /* R_M32C_32.  */
12538     case EM_M32R:
12539       return reloc_type == 34; /* R_M32R_32_RELA.  */
12540     case EM_68HC11:
12541     case EM_68HC12:
12542       return reloc_type == 6; /* R_M68HC11_32.  */
12543     case EM_S12Z:
12544       return reloc_type == 7 || /* R_S12Z_EXT32 */
12545         reloc_type == 6;        /* R_S12Z_CW32.  */
12546     case EM_MCORE:
12547       return reloc_type == 1; /* R_MCORE_ADDR32.  */
12548     case EM_CYGNUS_MEP:
12549       return reloc_type == 4; /* R_MEP_32.  */
12550     case EM_METAG:
12551       return reloc_type == 2; /* R_METAG_ADDR32.  */
12552     case EM_MICROBLAZE:
12553       return reloc_type == 1; /* R_MICROBLAZE_32.  */
12554     case EM_MIPS:
12555       return reloc_type == 2; /* R_MIPS_32.  */
12556     case EM_MMIX:
12557       return reloc_type == 4; /* R_MMIX_32.  */
12558     case EM_CYGNUS_MN10200:
12559     case EM_MN10200:
12560       return reloc_type == 1; /* R_MN10200_32.  */
12561     case EM_CYGNUS_MN10300:
12562     case EM_MN10300:
12563       return reloc_type == 1; /* R_MN10300_32.  */
12564     case EM_MOXIE:
12565       return reloc_type == 1; /* R_MOXIE_32.  */
12566     case EM_MSP430_OLD:
12567     case EM_MSP430:
12568       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
12569     case EM_MT:
12570       return reloc_type == 2; /* R_MT_32.  */
12571     case EM_NDS32:
12572       return reloc_type == 20; /* R_NDS32_RELA.  */
12573     case EM_ALTERA_NIOS2:
12574       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
12575     case EM_NIOS32:
12576       return reloc_type == 1; /* R_NIOS_32.  */
12577     case EM_OR1K:
12578       return reloc_type == 1; /* R_OR1K_32.  */
12579     case EM_PARISC:
12580       return (reloc_type == 1 /* R_PARISC_DIR32.  */          
12581               || reloc_type == 2 /* R_PARISC_DIR21L.  */
12582               || reloc_type == 41); /* R_PARISC_SECREL32.  */
12583     case EM_PJ:
12584     case EM_PJ_OLD:
12585       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
12586     case EM_PPC64:
12587       return reloc_type == 1; /* R_PPC64_ADDR32.  */
12588     case EM_PPC:
12589       return reloc_type == 1; /* R_PPC_ADDR32.  */
12590     case EM_TI_PRU:
12591       return reloc_type == 11; /* R_PRU_BFD_RELOC_32.  */
12592     case EM_RISCV:
12593       return reloc_type == 1; /* R_RISCV_32.  */
12594     case EM_RL78:
12595       return reloc_type == 1; /* R_RL78_DIR32.  */
12596     case EM_RX:
12597       return reloc_type == 1; /* R_RX_DIR32.  */
12598     case EM_S370:
12599       return reloc_type == 1; /* R_I370_ADDR31.  */
12600     case EM_S390_OLD:
12601     case EM_S390:
12602       return reloc_type == 4; /* R_S390_32.  */
12603     case EM_SCORE:
12604       return reloc_type == 8; /* R_SCORE_ABS32.  */
12605     case EM_SH:
12606       return reloc_type == 1; /* R_SH_DIR32.  */
12607     case EM_SPARC32PLUS:
12608     case EM_SPARCV9:
12609     case EM_SPARC:
12610       return reloc_type == 3 /* R_SPARC_32.  */
12611         || reloc_type == 23; /* R_SPARC_UA32.  */
12612     case EM_SPU:
12613       return reloc_type == 6; /* R_SPU_ADDR32 */
12614     case EM_TI_C6000:
12615       return reloc_type == 1; /* R_C6000_ABS32.  */
12616     case EM_TILEGX:
12617       return reloc_type == 2; /* R_TILEGX_32.  */
12618     case EM_TILEPRO:
12619       return reloc_type == 1; /* R_TILEPRO_32.  */
12620     case EM_CYGNUS_V850:
12621     case EM_V850:
12622       return reloc_type == 6; /* R_V850_ABS32.  */
12623     case EM_V800:
12624       return reloc_type == 0x33; /* R_V810_WORD.  */
12625     case EM_VAX:
12626       return reloc_type == 1; /* R_VAX_32.  */
12627     case EM_VISIUM:
12628       return reloc_type == 3;  /* R_VISIUM_32. */
12629     case EM_WEBASSEMBLY:
12630       return reloc_type == 1;  /* R_WASM32_32.  */
12631     case EM_X86_64:
12632     case EM_L1OM:
12633     case EM_K1OM:
12634       return reloc_type == 10; /* R_X86_64_32.  */
12635     case EM_XC16X:
12636     case EM_C166:
12637       return reloc_type == 3; /* R_XC16C_ABS_32.  */
12638     case EM_XGATE:
12639       return reloc_type == 4; /* R_XGATE_32.  */
12640     case EM_XSTORMY16:
12641       return reloc_type == 1; /* R_XSTROMY16_32.  */
12642     case EM_XTENSA_OLD:
12643     case EM_XTENSA:
12644       return reloc_type == 1; /* R_XTENSA_32.  */
12645     default:
12646       {
12647         static unsigned int prev_warn = 0;
12648
12649         /* Avoid repeating the same warning multiple times.  */
12650         if (prev_warn != filedata->file_header.e_machine)
12651           error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
12652                  filedata->file_header.e_machine);
12653         prev_warn = filedata->file_header.e_machine;
12654         return FALSE;
12655       }
12656     }
12657 }
12658
12659 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12660    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
12661
12662 static bfd_boolean
12663 is_32bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12664 {
12665   switch (filedata->file_header.e_machine)
12666   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12667     {
12668     case EM_386:
12669     case EM_IAMCU:
12670       return reloc_type == 2;  /* R_386_PC32.  */
12671     case EM_68K:
12672       return reloc_type == 4;  /* R_68K_PC32.  */
12673     case EM_AARCH64:
12674       return reloc_type == 261; /* R_AARCH64_PREL32 */
12675     case EM_ADAPTEVA_EPIPHANY:
12676       return reloc_type == 6;
12677     case EM_ALPHA:
12678       return reloc_type == 10; /* R_ALPHA_SREL32.  */
12679     case EM_ARC_COMPACT:
12680     case EM_ARC_COMPACT2:
12681       return reloc_type == 49; /* R_ARC_32_PCREL.  */
12682     case EM_ARM:
12683       return reloc_type == 3;  /* R_ARM_REL32 */
12684     case EM_AVR_OLD:
12685     case EM_AVR:
12686       return reloc_type == 36; /* R_AVR_32_PCREL.  */
12687     case EM_MICROBLAZE:
12688       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
12689     case EM_OR1K:
12690       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
12691     case EM_PARISC:
12692       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
12693     case EM_PPC:
12694       return reloc_type == 26; /* R_PPC_REL32.  */
12695     case EM_PPC64:
12696       return reloc_type == 26; /* R_PPC64_REL32.  */
12697     case EM_RISCV:
12698       return reloc_type == 57;  /* R_RISCV_32_PCREL.  */
12699     case EM_S390_OLD:
12700     case EM_S390:
12701       return reloc_type == 5;  /* R_390_PC32.  */
12702     case EM_SH:
12703       return reloc_type == 2;  /* R_SH_REL32.  */
12704     case EM_SPARC32PLUS:
12705     case EM_SPARCV9:
12706     case EM_SPARC:
12707       return reloc_type == 6;  /* R_SPARC_DISP32.  */
12708     case EM_SPU:
12709       return reloc_type == 13; /* R_SPU_REL32.  */
12710     case EM_TILEGX:
12711       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
12712     case EM_TILEPRO:
12713       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
12714     case EM_VISIUM:
12715       return reloc_type == 6;  /* R_VISIUM_32_PCREL */
12716     case EM_X86_64:
12717     case EM_L1OM:
12718     case EM_K1OM:
12719       return reloc_type == 2;  /* R_X86_64_PC32.  */
12720     case EM_XTENSA_OLD:
12721     case EM_XTENSA:
12722       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
12723     default:
12724       /* Do not abort or issue an error message here.  Not all targets use
12725          pc-relative 32-bit relocs in their DWARF debug information and we
12726          have already tested for target coverage in is_32bit_abs_reloc.  A
12727          more helpful warning message will be generated by apply_relocations
12728          anyway, so just return.  */
12729       return FALSE;
12730     }
12731 }
12732
12733 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12734    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
12735
12736 static bfd_boolean
12737 is_64bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12738 {
12739   switch (filedata->file_header.e_machine)
12740     {
12741     case EM_AARCH64:
12742       return reloc_type == 257; /* R_AARCH64_ABS64.  */
12743     case EM_ALPHA:
12744       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
12745     case EM_IA_64:
12746       return (reloc_type == 0x26    /* R_IA64_DIR64MSB.  */
12747               || reloc_type == 0x27 /* R_IA64_DIR64LSB.  */);
12748     case EM_PARISC:
12749       return reloc_type == 80; /* R_PARISC_DIR64.  */
12750     case EM_PPC64:
12751       return reloc_type == 38; /* R_PPC64_ADDR64.  */
12752     case EM_RISCV:
12753       return reloc_type == 2; /* R_RISCV_64.  */
12754     case EM_SPARC32PLUS:
12755     case EM_SPARCV9:
12756     case EM_SPARC:
12757       return reloc_type == 32 /* R_SPARC_64.  */
12758         || reloc_type == 54; /* R_SPARC_UA64.  */
12759     case EM_X86_64:
12760     case EM_L1OM:
12761     case EM_K1OM:
12762       return reloc_type == 1; /* R_X86_64_64.  */
12763     case EM_S390_OLD:
12764     case EM_S390:
12765       return reloc_type == 22;  /* R_S390_64.  */
12766     case EM_TILEGX:
12767       return reloc_type == 1; /* R_TILEGX_64.  */
12768     case EM_MIPS:
12769       return reloc_type == 18;  /* R_MIPS_64.  */
12770     default:
12771       return FALSE;
12772     }
12773 }
12774
12775 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12776    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
12777
12778 static bfd_boolean
12779 is_64bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12780 {
12781   switch (filedata->file_header.e_machine)
12782     {
12783     case EM_AARCH64:
12784       return reloc_type == 260; /* R_AARCH64_PREL64.  */
12785     case EM_ALPHA:
12786       return reloc_type == 11; /* R_ALPHA_SREL64.  */
12787     case EM_IA_64:
12788       return (reloc_type == 0x4e    /* R_IA64_PCREL64MSB.  */
12789               || reloc_type == 0x4f /* R_IA64_PCREL64LSB.  */);
12790     case EM_PARISC:
12791       return reloc_type == 72; /* R_PARISC_PCREL64.  */
12792     case EM_PPC64:
12793       return reloc_type == 44; /* R_PPC64_REL64.  */
12794     case EM_SPARC32PLUS:
12795     case EM_SPARCV9:
12796     case EM_SPARC:
12797       return reloc_type == 46; /* R_SPARC_DISP64.  */
12798     case EM_X86_64:
12799     case EM_L1OM:
12800     case EM_K1OM:
12801       return reloc_type == 24; /* R_X86_64_PC64.  */
12802     case EM_S390_OLD:
12803     case EM_S390:
12804       return reloc_type == 23;  /* R_S390_PC64.  */
12805     case EM_TILEGX:
12806       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
12807     default:
12808       return FALSE;
12809     }
12810 }
12811
12812 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12813    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
12814
12815 static bfd_boolean
12816 is_24bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12817 {
12818   switch (filedata->file_header.e_machine)
12819     {
12820     case EM_CYGNUS_MN10200:
12821     case EM_MN10200:
12822       return reloc_type == 4; /* R_MN10200_24.  */
12823     case EM_FT32:
12824       return reloc_type == 5; /* R_FT32_20.  */
12825     default:
12826       return FALSE;
12827     }
12828 }
12829
12830 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12831    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
12832
12833 static bfd_boolean
12834 is_16bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12835 {
12836   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12837   switch (filedata->file_header.e_machine)
12838     {
12839     case EM_ARC:
12840     case EM_ARC_COMPACT:
12841     case EM_ARC_COMPACT2:
12842       return reloc_type == 2; /* R_ARC_16.  */
12843     case EM_ADAPTEVA_EPIPHANY:
12844       return reloc_type == 5;
12845     case EM_AVR_OLD:
12846     case EM_AVR:
12847       return reloc_type == 4; /* R_AVR_16.  */
12848     case EM_CYGNUS_D10V:
12849     case EM_D10V:
12850       return reloc_type == 3; /* R_D10V_16.  */
12851     case EM_FT32:
12852       return reloc_type == 2; /* R_FT32_16.  */
12853     case EM_H8S:
12854     case EM_H8_300:
12855     case EM_H8_300H:
12856       return reloc_type == R_H8_DIR16;
12857     case EM_IP2K_OLD:
12858     case EM_IP2K:
12859       return reloc_type == 1; /* R_IP2K_16.  */
12860     case EM_M32C_OLD:
12861     case EM_M32C:
12862       return reloc_type == 1; /* R_M32C_16 */
12863     case EM_CYGNUS_MN10200:
12864     case EM_MN10200:
12865       return reloc_type == 2; /* R_MN10200_16.  */
12866     case EM_CYGNUS_MN10300:
12867     case EM_MN10300:
12868       return reloc_type == 2; /* R_MN10300_16.  */
12869     case EM_MSP430:
12870       if (uses_msp430x_relocs (filedata))
12871         return reloc_type == 2; /* R_MSP430_ABS16.  */
12872       /* Fall through.  */
12873     case EM_MSP430_OLD:
12874       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
12875     case EM_NDS32:
12876       return reloc_type == 19; /* R_NDS32_RELA.  */
12877     case EM_ALTERA_NIOS2:
12878       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
12879     case EM_NIOS32:
12880       return reloc_type == 9; /* R_NIOS_16.  */
12881     case EM_OR1K:
12882       return reloc_type == 2; /* R_OR1K_16.  */
12883     case EM_RISCV:
12884       return reloc_type == 55; /* R_RISCV_SET16.  */
12885     case EM_TI_PRU:
12886       return reloc_type == 8; /* R_PRU_BFD_RELOC_16.  */
12887     case EM_TI_C6000:
12888       return reloc_type == 2; /* R_C6000_ABS16.  */
12889     case EM_VISIUM:
12890       return reloc_type == 2; /* R_VISIUM_16. */
12891     case EM_XC16X:
12892     case EM_C166:
12893       return reloc_type == 2; /* R_XC16C_ABS_16.  */
12894     case EM_XGATE:
12895       return reloc_type == 3; /* R_XGATE_16.  */
12896     default:
12897       return FALSE;
12898     }
12899 }
12900
12901 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12902    a 8-bit absolute RELA relocation used in DWARF debug sections.  */
12903
12904 static bfd_boolean
12905 is_8bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12906 {
12907   switch (filedata->file_header.e_machine)
12908     {
12909     case EM_RISCV:
12910       return reloc_type == 54; /* R_RISCV_SET8.  */
12911     default:
12912       return FALSE;
12913     }
12914 }
12915
12916 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12917    a 6-bit absolute RELA relocation used in DWARF debug sections.  */
12918
12919 static bfd_boolean
12920 is_6bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12921 {
12922   switch (filedata->file_header.e_machine)
12923     {
12924     case EM_RISCV:
12925       return reloc_type == 53; /* R_RISCV_SET6.  */
12926     default:
12927       return FALSE;
12928     }
12929 }
12930
12931 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12932    a 32-bit inplace add RELA relocation used in DWARF debug sections.  */
12933
12934 static bfd_boolean
12935 is_32bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12936 {
12937   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12938   switch (filedata->file_header.e_machine)
12939     {
12940     case EM_RISCV:
12941       return reloc_type == 35; /* R_RISCV_ADD32.  */
12942     default:
12943       return FALSE;
12944     }
12945 }
12946
12947 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12948    a 32-bit inplace sub RELA relocation used in DWARF debug sections.  */
12949
12950 static bfd_boolean
12951 is_32bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12952 {
12953   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12954   switch (filedata->file_header.e_machine)
12955     {
12956     case EM_RISCV:
12957       return reloc_type == 39; /* R_RISCV_SUB32.  */
12958     default:
12959       return FALSE;
12960     }
12961 }
12962
12963 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12964    a 64-bit inplace add RELA relocation used in DWARF debug sections.  */
12965
12966 static bfd_boolean
12967 is_64bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12968 {
12969   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12970   switch (filedata->file_header.e_machine)
12971     {
12972     case EM_RISCV:
12973       return reloc_type == 36; /* R_RISCV_ADD64.  */
12974     default:
12975       return FALSE;
12976     }
12977 }
12978
12979 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12980    a 64-bit inplace sub RELA relocation used in DWARF debug sections.  */
12981
12982 static bfd_boolean
12983 is_64bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12984 {
12985   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12986   switch (filedata->file_header.e_machine)
12987     {
12988     case EM_RISCV:
12989       return reloc_type == 40; /* R_RISCV_SUB64.  */
12990     default:
12991       return FALSE;
12992     }
12993 }
12994
12995 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12996    a 16-bit inplace add RELA relocation used in DWARF debug sections.  */
12997
12998 static bfd_boolean
12999 is_16bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
13000 {
13001   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13002   switch (filedata->file_header.e_machine)
13003     {
13004     case EM_RISCV:
13005       return reloc_type == 34; /* R_RISCV_ADD16.  */
13006     default:
13007       return FALSE;
13008     }
13009 }
13010
13011 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13012    a 16-bit inplace sub RELA relocation used in DWARF debug sections.  */
13013
13014 static bfd_boolean
13015 is_16bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
13016 {
13017   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13018   switch (filedata->file_header.e_machine)
13019     {
13020     case EM_RISCV:
13021       return reloc_type == 38; /* R_RISCV_SUB16.  */
13022     default:
13023       return FALSE;
13024     }
13025 }
13026
13027 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13028    a 8-bit inplace add RELA relocation used in DWARF debug sections.  */
13029
13030 static bfd_boolean
13031 is_8bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
13032 {
13033   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13034   switch (filedata->file_header.e_machine)
13035     {
13036     case EM_RISCV:
13037       return reloc_type == 33; /* R_RISCV_ADD8.  */
13038     default:
13039       return FALSE;
13040     }
13041 }
13042
13043 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13044    a 8-bit inplace sub RELA relocation used in DWARF debug sections.  */
13045
13046 static bfd_boolean
13047 is_8bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
13048 {
13049   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13050   switch (filedata->file_header.e_machine)
13051     {
13052     case EM_RISCV:
13053       return reloc_type == 37; /* R_RISCV_SUB8.  */
13054     default:
13055       return FALSE;
13056     }
13057 }
13058
13059 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13060    a 6-bit inplace sub RELA relocation used in DWARF debug sections.  */
13061
13062 static bfd_boolean
13063 is_6bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
13064 {
13065   switch (filedata->file_header.e_machine)
13066     {
13067     case EM_RISCV:
13068       return reloc_type == 52; /* R_RISCV_SUB6.  */
13069     default:
13070       return FALSE;
13071     }
13072 }
13073
13074 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
13075    relocation entries (possibly formerly used for SHT_GROUP sections).  */
13076
13077 static bfd_boolean
13078 is_none_reloc (Filedata * filedata, unsigned int reloc_type)
13079 {
13080   switch (filedata->file_header.e_machine)
13081     {
13082     case EM_386:     /* R_386_NONE.  */
13083     case EM_68K:     /* R_68K_NONE.  */
13084     case EM_ADAPTEVA_EPIPHANY:
13085     case EM_ALPHA:   /* R_ALPHA_NONE.  */
13086     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
13087     case EM_ARC:     /* R_ARC_NONE.  */
13088     case EM_ARC_COMPACT2: /* R_ARC_NONE.  */
13089     case EM_ARC_COMPACT: /* R_ARC_NONE.  */
13090     case EM_ARM:     /* R_ARM_NONE.  */
13091     case EM_C166:    /* R_XC16X_NONE.  */
13092     case EM_CRIS:    /* R_CRIS_NONE.  */
13093     case EM_FT32:    /* R_FT32_NONE.  */
13094     case EM_IA_64:   /* R_IA64_NONE.  */
13095     case EM_K1OM:    /* R_X86_64_NONE.  */
13096     case EM_L1OM:    /* R_X86_64_NONE.  */
13097     case EM_M32R:    /* R_M32R_NONE.  */
13098     case EM_MIPS:    /* R_MIPS_NONE.  */
13099     case EM_MN10300: /* R_MN10300_NONE.  */
13100     case EM_MOXIE:   /* R_MOXIE_NONE.  */
13101     case EM_NIOS32:  /* R_NIOS_NONE.  */
13102     case EM_OR1K:    /* R_OR1K_NONE. */
13103     case EM_PARISC:  /* R_PARISC_NONE.  */
13104     case EM_PPC64:   /* R_PPC64_NONE.  */
13105     case EM_PPC:     /* R_PPC_NONE.  */
13106     case EM_RISCV:   /* R_RISCV_NONE.  */
13107     case EM_S390:    /* R_390_NONE.  */
13108     case EM_S390_OLD:
13109     case EM_SH:      /* R_SH_NONE.  */
13110     case EM_SPARC32PLUS:
13111     case EM_SPARC:   /* R_SPARC_NONE.  */
13112     case EM_SPARCV9:
13113     case EM_TILEGX:  /* R_TILEGX_NONE.  */
13114     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
13115     case EM_TI_C6000:/* R_C6000_NONE.  */
13116     case EM_X86_64:  /* R_X86_64_NONE.  */
13117     case EM_XC16X:
13118     case EM_WEBASSEMBLY: /* R_WASM32_NONE.  */
13119       return reloc_type == 0;
13120
13121     case EM_AARCH64:
13122       return reloc_type == 0 || reloc_type == 256;
13123     case EM_AVR_OLD:
13124     case EM_AVR:
13125       return (reloc_type == 0 /* R_AVR_NONE.  */
13126               || reloc_type == 30 /* R_AVR_DIFF8.  */
13127               || reloc_type == 31 /* R_AVR_DIFF16.  */
13128               || reloc_type == 32 /* R_AVR_DIFF32.  */);
13129     case EM_METAG:
13130       return reloc_type == 3; /* R_METAG_NONE.  */
13131     case EM_NDS32:
13132       return (reloc_type == 0       /* R_XTENSA_NONE.  */
13133               || reloc_type == 204  /* R_NDS32_DIFF8.  */
13134               || reloc_type == 205  /* R_NDS32_DIFF16.  */
13135               || reloc_type == 206  /* R_NDS32_DIFF32.  */
13136               || reloc_type == 207  /* R_NDS32_ULEB128.  */);
13137     case EM_TI_PRU:
13138       return (reloc_type == 0       /* R_PRU_NONE.  */
13139               || reloc_type == 65   /* R_PRU_DIFF8.  */
13140               || reloc_type == 66   /* R_PRU_DIFF16.  */
13141               || reloc_type == 67   /* R_PRU_DIFF32.  */);
13142     case EM_XTENSA_OLD:
13143     case EM_XTENSA:
13144       return (reloc_type == 0      /* R_XTENSA_NONE.  */
13145               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
13146               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
13147               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
13148     }
13149   return FALSE;
13150 }
13151
13152 /* Returns TRUE if there is a relocation against
13153    section NAME at OFFSET bytes.  */
13154
13155 bfd_boolean
13156 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
13157 {
13158   Elf_Internal_Rela * relocs;
13159   Elf_Internal_Rela * rp;
13160
13161   if (dsec == NULL || dsec->reloc_info == NULL)
13162     return FALSE;
13163
13164   relocs = (Elf_Internal_Rela *) dsec->reloc_info;
13165
13166   for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
13167     if (rp->r_offset == offset)
13168       return TRUE;
13169
13170    return FALSE;
13171 }
13172
13173 /* Apply relocations to a section.
13174    Returns TRUE upon success, FALSE otherwise.
13175    If RELOCS_RETURN is non-NULL then it is set to point to the loaded relocs.
13176    It is then the caller's responsibility to free them.  NUM_RELOCS_RETURN
13177    will be set to the number of relocs loaded.
13178
13179    Note: So far support has been added only for those relocations
13180    which can be found in debug sections. FIXME: Add support for
13181    more relocations ?  */
13182
13183 static bfd_boolean
13184 apply_relocations (Filedata *                 filedata,
13185                    const Elf_Internal_Shdr *  section,
13186                    unsigned char *            start,
13187                    bfd_size_type              size,
13188                    void **                    relocs_return,
13189                    unsigned long *            num_relocs_return)
13190 {
13191   Elf_Internal_Shdr * relsec;
13192   unsigned char * end = start + size;
13193
13194   if (relocs_return != NULL)
13195     {
13196       * (Elf_Internal_Rela **) relocs_return = NULL;
13197       * num_relocs_return = 0;
13198     }
13199
13200   if (filedata->file_header.e_type != ET_REL)
13201     /* No relocs to apply.  */
13202     return TRUE;
13203
13204   /* Find the reloc section associated with the section.  */
13205   for (relsec = filedata->section_headers;
13206        relsec < filedata->section_headers + filedata->file_header.e_shnum;
13207        ++relsec)
13208     {
13209       bfd_boolean is_rela;
13210       unsigned long num_relocs;
13211       Elf_Internal_Rela * relocs;
13212       Elf_Internal_Rela * rp;
13213       Elf_Internal_Shdr * symsec;
13214       Elf_Internal_Sym * symtab;
13215       unsigned long num_syms;
13216       Elf_Internal_Sym * sym;
13217
13218       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13219           || relsec->sh_info >= filedata->file_header.e_shnum
13220           || filedata->section_headers + relsec->sh_info != section
13221           || relsec->sh_size == 0
13222           || relsec->sh_link >= filedata->file_header.e_shnum)
13223         continue;
13224
13225       is_rela = relsec->sh_type == SHT_RELA;
13226
13227       if (is_rela)
13228         {
13229           if (!slurp_rela_relocs (filedata, relsec->sh_offset,
13230                                   relsec->sh_size, & relocs, & num_relocs))
13231             return FALSE;
13232         }
13233       else
13234         {
13235           if (!slurp_rel_relocs (filedata, relsec->sh_offset,
13236                                  relsec->sh_size, & relocs, & num_relocs))
13237             return FALSE;
13238         }
13239
13240       /* SH uses RELA but uses in place value instead of the addend field.  */
13241       if (filedata->file_header.e_machine == EM_SH)
13242         is_rela = FALSE;
13243
13244       symsec = filedata->section_headers + relsec->sh_link;
13245       if (symsec->sh_type != SHT_SYMTAB
13246           && symsec->sh_type != SHT_DYNSYM)
13247         return FALSE;
13248       symtab = GET_ELF_SYMBOLS (filedata, symsec, & num_syms);
13249
13250       for (rp = relocs; rp < relocs + num_relocs; ++rp)
13251         {
13252           bfd_vma         addend;
13253           unsigned int    reloc_type;
13254           unsigned int    reloc_size;
13255           bfd_boolean     reloc_inplace = FALSE;
13256           bfd_boolean     reloc_subtract = FALSE;
13257           unsigned char * rloc;
13258           unsigned long   sym_index;
13259
13260           reloc_type = get_reloc_type (filedata, rp->r_info);
13261
13262           if (target_specific_reloc_handling (filedata, rp, start, end, symtab, num_syms))
13263             continue;
13264           else if (is_none_reloc (filedata, reloc_type))
13265             continue;
13266           else if (is_32bit_abs_reloc (filedata, reloc_type)
13267                    || is_32bit_pcrel_reloc (filedata, reloc_type))
13268             reloc_size = 4;
13269           else if (is_64bit_abs_reloc (filedata, reloc_type)
13270                    || is_64bit_pcrel_reloc (filedata, reloc_type))
13271             reloc_size = 8;
13272           else if (is_24bit_abs_reloc (filedata, reloc_type))
13273             reloc_size = 3;
13274           else if (is_16bit_abs_reloc (filedata, reloc_type))
13275             reloc_size = 2;
13276           else if (is_8bit_abs_reloc (filedata, reloc_type)
13277                    || is_6bit_abs_reloc (filedata, reloc_type))
13278             reloc_size = 1;
13279           else if ((reloc_subtract = is_32bit_inplace_sub_reloc (filedata,
13280                                                                  reloc_type))
13281                    || is_32bit_inplace_add_reloc (filedata, reloc_type))
13282             {
13283               reloc_size = 4;
13284               reloc_inplace = TRUE;
13285             }
13286           else if ((reloc_subtract = is_64bit_inplace_sub_reloc (filedata,
13287                                                                  reloc_type))
13288                    || is_64bit_inplace_add_reloc (filedata, reloc_type))
13289             {
13290               reloc_size = 8;
13291               reloc_inplace = TRUE;
13292             }
13293           else if ((reloc_subtract = is_16bit_inplace_sub_reloc (filedata,
13294                                                                  reloc_type))
13295                    || is_16bit_inplace_add_reloc (filedata, reloc_type))
13296             {
13297               reloc_size = 2;
13298               reloc_inplace = TRUE;
13299             }
13300           else if ((reloc_subtract = is_8bit_inplace_sub_reloc (filedata,
13301                                                                 reloc_type))
13302                    || is_8bit_inplace_add_reloc (filedata, reloc_type))
13303             {
13304               reloc_size = 1;
13305               reloc_inplace = TRUE;
13306             }
13307           else if ((reloc_subtract = is_6bit_inplace_sub_reloc (filedata,
13308                                                                 reloc_type)))
13309             {
13310               reloc_size = 1;
13311               reloc_inplace = TRUE;
13312             }
13313           else
13314             {
13315               static unsigned int prev_reloc = 0;
13316
13317               if (reloc_type != prev_reloc)
13318                 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
13319                       reloc_type, printable_section_name (filedata, section));
13320               prev_reloc = reloc_type;
13321               continue;
13322             }
13323
13324           rloc = start + rp->r_offset;
13325           if ((rloc + reloc_size) > end || (rloc < start))
13326             {
13327               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
13328                     (unsigned long) rp->r_offset,
13329                     printable_section_name (filedata, section));
13330               continue;
13331             }
13332
13333           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
13334           if (sym_index >= num_syms)
13335             {
13336               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
13337                     sym_index, printable_section_name (filedata, section));
13338               continue;
13339             }
13340           sym = symtab + sym_index;
13341
13342           /* If the reloc has a symbol associated with it,
13343              make sure that it is of an appropriate type.
13344
13345              Relocations against symbols without type can happen.
13346              Gcc -feliminate-dwarf2-dups may generate symbols
13347              without type for debug info.
13348
13349              Icc generates relocations against function symbols
13350              instead of local labels.
13351
13352              Relocations against object symbols can happen, eg when
13353              referencing a global array.  For an example of this see
13354              the _clz.o binary in libgcc.a.  */
13355           if (sym != symtab
13356               && ELF_ST_TYPE (sym->st_info) != STT_COMMON
13357               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
13358             {
13359               warn (_("skipping unexpected symbol type %s in section %s relocation %ld\n"),
13360                     get_symbol_type (filedata, ELF_ST_TYPE (sym->st_info)),
13361                     printable_section_name (filedata, relsec),
13362                     (long int)(rp - relocs));
13363               continue;
13364             }
13365
13366           addend = 0;
13367           if (is_rela)
13368             addend += rp->r_addend;
13369           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
13370              partial_inplace.  */
13371           if (!is_rela
13372               || (filedata->file_header.e_machine == EM_XTENSA
13373                   && reloc_type == 1)
13374               || ((filedata->file_header.e_machine == EM_PJ
13375                    || filedata->file_header.e_machine == EM_PJ_OLD)
13376                   && reloc_type == 1)
13377               || ((filedata->file_header.e_machine == EM_D30V
13378                    || filedata->file_header.e_machine == EM_CYGNUS_D30V)
13379                   && reloc_type == 12)
13380               || reloc_inplace)
13381             {
13382               if (is_6bit_inplace_sub_reloc (filedata, reloc_type))
13383                 addend += byte_get (rloc, reloc_size) & 0x3f;
13384               else
13385                 addend += byte_get (rloc, reloc_size);
13386             }
13387
13388           if (is_32bit_pcrel_reloc (filedata, reloc_type)
13389               || is_64bit_pcrel_reloc (filedata, reloc_type))
13390             {
13391               /* On HPPA, all pc-relative relocations are biased by 8.  */
13392               if (filedata->file_header.e_machine == EM_PARISC)
13393                 addend -= 8;
13394               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
13395                         reloc_size);
13396             }
13397           else if (is_6bit_abs_reloc (filedata, reloc_type)
13398                    || is_6bit_inplace_sub_reloc (filedata, reloc_type))
13399             {
13400               if (reloc_subtract)
13401                 addend -= sym->st_value;
13402               else
13403                 addend += sym->st_value;
13404               addend = (addend & 0x3f) | (byte_get (rloc, reloc_size) & 0xc0);
13405               byte_put (rloc, addend, reloc_size);
13406             }
13407           else if (reloc_subtract)
13408             byte_put (rloc, addend - sym->st_value, reloc_size);
13409           else
13410             byte_put (rloc, addend + sym->st_value, reloc_size);
13411         }
13412
13413       free (symtab);
13414       /* Let the target specific reloc processing code know that
13415          we have finished with these relocs.  */
13416       target_specific_reloc_handling (filedata, NULL, NULL, NULL, NULL, 0);
13417
13418       if (relocs_return)
13419         {
13420           * (Elf_Internal_Rela **) relocs_return = relocs;
13421           * num_relocs_return = num_relocs;
13422         }
13423       else
13424         free (relocs);
13425
13426       break;
13427     }
13428
13429   return TRUE;
13430 }
13431
13432 #ifdef SUPPORT_DISASSEMBLY
13433 static bfd_boolean
13434 disassemble_section (Elf_Internal_Shdr * section, Filedata * filedata)
13435 {
13436   printf (_("\nAssembly dump of section %s\n"), printable_section_name (filedata, section));
13437
13438   /* FIXME: XXX -- to be done --- XXX */
13439
13440   return TRUE;
13441 }
13442 #endif
13443
13444 /* Reads in the contents of SECTION from FILE, returning a pointer
13445    to a malloc'ed buffer or NULL if something went wrong.  */
13446
13447 static char *
13448 get_section_contents (Elf_Internal_Shdr * section, Filedata * filedata)
13449 {
13450   bfd_size_type num_bytes = section->sh_size;
13451
13452   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
13453     {
13454       printf (_("Section '%s' has no data to dump.\n"),
13455               printable_section_name (filedata, section));
13456       return NULL;
13457     }
13458
13459   return  (char *) get_data (NULL, filedata, section->sh_offset, 1, num_bytes,
13460                              _("section contents"));
13461 }
13462
13463 /* Uncompresses a section that was compressed using zlib, in place.  */
13464
13465 static bfd_boolean
13466 uncompress_section_contents (unsigned char **   buffer,
13467                              dwarf_size_type    uncompressed_size,
13468                              dwarf_size_type *  size)
13469 {
13470   dwarf_size_type compressed_size = *size;
13471   unsigned char * compressed_buffer = *buffer;
13472   unsigned char * uncompressed_buffer;
13473   z_stream strm;
13474   int rc;
13475
13476   /* It is possible the section consists of several compressed
13477      buffers concatenated together, so we uncompress in a loop.  */
13478   /* PR 18313: The state field in the z_stream structure is supposed
13479      to be invisible to the user (ie us), but some compilers will
13480      still complain about it being used without initialisation.  So
13481      we first zero the entire z_stream structure and then set the fields
13482      that we need.  */
13483   memset (& strm, 0, sizeof strm);
13484   strm.avail_in = compressed_size;
13485   strm.next_in = (Bytef *) compressed_buffer;
13486   strm.avail_out = uncompressed_size;
13487   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
13488
13489   rc = inflateInit (& strm);
13490   while (strm.avail_in > 0)
13491     {
13492       if (rc != Z_OK)
13493         goto fail;
13494       strm.next_out = ((Bytef *) uncompressed_buffer
13495                        + (uncompressed_size - strm.avail_out));
13496       rc = inflate (&strm, Z_FINISH);
13497       if (rc != Z_STREAM_END)
13498         goto fail;
13499       rc = inflateReset (& strm);
13500     }
13501   rc = inflateEnd (& strm);
13502   if (rc != Z_OK
13503       || strm.avail_out != 0)
13504     goto fail;
13505
13506   *buffer = uncompressed_buffer;
13507   *size = uncompressed_size;
13508   return TRUE;
13509
13510  fail:
13511   free (uncompressed_buffer);
13512   /* Indicate decompression failure.  */
13513   *buffer = NULL;
13514   return FALSE;
13515 }
13516
13517 static bfd_boolean
13518 dump_section_as_strings (Elf_Internal_Shdr * section, Filedata * filedata)
13519 {
13520   Elf_Internal_Shdr *  relsec;
13521   bfd_size_type        num_bytes;
13522   unsigned char *      data;
13523   unsigned char *      end;
13524   unsigned char *      real_start;
13525   unsigned char *      start;
13526   bfd_boolean          some_strings_shown;
13527
13528   real_start = start = (unsigned char *) get_section_contents (section, filedata);
13529   if (start == NULL)
13530     /* PR 21820: Do not fail if the section was empty.  */
13531     return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13532
13533   num_bytes = section->sh_size;
13534
13535   printf (_("\nString dump of section '%s':\n"), printable_section_name (filedata, section));
13536
13537   if (decompress_dumps)
13538     {
13539       dwarf_size_type new_size = num_bytes;
13540       dwarf_size_type uncompressed_size = 0;
13541
13542       if ((section->sh_flags & SHF_COMPRESSED) != 0)
13543         {
13544           Elf_Internal_Chdr chdr;
13545           unsigned int compression_header_size
13546             = get_compression_header (& chdr, (unsigned char *) start,
13547                                       num_bytes);
13548
13549           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13550             {
13551               warn (_("section '%s' has unsupported compress type: %d\n"),
13552                     printable_section_name (filedata, section), chdr.ch_type);
13553               return FALSE;
13554             }
13555           uncompressed_size = chdr.ch_size;
13556           start += compression_header_size;
13557           new_size -= compression_header_size;
13558         }
13559       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13560         {
13561           /* Read the zlib header.  In this case, it should be "ZLIB"
13562              followed by the uncompressed section size, 8 bytes in
13563              big-endian order.  */
13564           uncompressed_size = start[4]; uncompressed_size <<= 8;
13565           uncompressed_size += start[5]; uncompressed_size <<= 8;
13566           uncompressed_size += start[6]; uncompressed_size <<= 8;
13567           uncompressed_size += start[7]; uncompressed_size <<= 8;
13568           uncompressed_size += start[8]; uncompressed_size <<= 8;
13569           uncompressed_size += start[9]; uncompressed_size <<= 8;
13570           uncompressed_size += start[10]; uncompressed_size <<= 8;
13571           uncompressed_size += start[11];
13572           start += 12;
13573           new_size -= 12;
13574         }
13575
13576       if (uncompressed_size)
13577         {
13578           if (uncompress_section_contents (& start,
13579                                            uncompressed_size, & new_size))
13580             num_bytes = new_size;
13581           else
13582             {
13583               error (_("Unable to decompress section %s\n"),
13584                      printable_section_name (filedata, section));
13585               return FALSE;
13586             }
13587         }
13588       else
13589         start = real_start;
13590     }
13591
13592   /* If the section being dumped has relocations against it the user might
13593      be expecting these relocations to have been applied.  Check for this
13594      case and issue a warning message in order to avoid confusion.
13595      FIXME: Maybe we ought to have an option that dumps a section with
13596      relocs applied ?  */
13597   for (relsec = filedata->section_headers;
13598        relsec < filedata->section_headers + filedata->file_header.e_shnum;
13599        ++relsec)
13600     {
13601       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13602           || relsec->sh_info >= filedata->file_header.e_shnum
13603           || filedata->section_headers + relsec->sh_info != section
13604           || relsec->sh_size == 0
13605           || relsec->sh_link >= filedata->file_header.e_shnum)
13606         continue;
13607
13608       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13609       break;
13610     }
13611
13612   data = start;
13613   end  = start + num_bytes;
13614   some_strings_shown = FALSE;
13615
13616   while (data < end)
13617     {
13618       while (!ISPRINT (* data))
13619         if (++ data >= end)
13620           break;
13621
13622       if (data < end)
13623         {
13624           size_t maxlen = end - data;
13625
13626 #ifndef __MSVCRT__
13627           /* PR 11128: Use two separate invocations in order to work
13628              around bugs in the Solaris 8 implementation of printf.  */
13629           printf ("  [%6tx]  ", data - start);
13630 #else
13631           printf ("  [%6Ix]  ", (size_t) (data - start));
13632 #endif
13633           if (maxlen > 0)
13634             {
13635               print_symbol ((int) maxlen, (const char *) data);
13636               putchar ('\n');
13637               data += strnlen ((const char *) data, maxlen);
13638             }
13639           else
13640             {
13641               printf (_("<corrupt>\n"));
13642               data = end;
13643             }
13644           some_strings_shown = TRUE;
13645         }
13646     }
13647
13648   if (! some_strings_shown)
13649     printf (_("  No strings found in this section."));
13650
13651   free (real_start);
13652
13653   putchar ('\n');
13654   return TRUE;
13655 }
13656
13657 static bfd_boolean
13658 dump_section_as_bytes (Elf_Internal_Shdr *  section,
13659                        Filedata *           filedata,
13660                        bfd_boolean          relocate)
13661 {
13662   Elf_Internal_Shdr * relsec;
13663   bfd_size_type       bytes;
13664   bfd_size_type       section_size;
13665   bfd_vma             addr;
13666   unsigned char *     data;
13667   unsigned char *     real_start;
13668   unsigned char *     start;
13669
13670   real_start = start = (unsigned char *) get_section_contents (section, filedata);
13671   if (start == NULL)
13672     /* PR 21820: Do not fail if the section was empty.  */
13673     return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13674
13675   section_size = section->sh_size;
13676
13677   printf (_("\nHex dump of section '%s':\n"), printable_section_name (filedata, section));
13678
13679   if (decompress_dumps)
13680     {
13681       dwarf_size_type new_size = section_size;
13682       dwarf_size_type uncompressed_size = 0;
13683
13684       if ((section->sh_flags & SHF_COMPRESSED) != 0)
13685         {
13686           Elf_Internal_Chdr chdr;
13687           unsigned int compression_header_size
13688             = get_compression_header (& chdr, start, section_size);
13689
13690           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13691             {
13692               warn (_("section '%s' has unsupported compress type: %d\n"),
13693                     printable_section_name (filedata, section), chdr.ch_type);
13694               return FALSE;
13695             }
13696           uncompressed_size = chdr.ch_size;
13697           start += compression_header_size;
13698           new_size -= compression_header_size;
13699         }
13700       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13701         {
13702           /* Read the zlib header.  In this case, it should be "ZLIB"
13703              followed by the uncompressed section size, 8 bytes in
13704              big-endian order.  */
13705           uncompressed_size = start[4]; uncompressed_size <<= 8;
13706           uncompressed_size += start[5]; uncompressed_size <<= 8;
13707           uncompressed_size += start[6]; uncompressed_size <<= 8;
13708           uncompressed_size += start[7]; uncompressed_size <<= 8;
13709           uncompressed_size += start[8]; uncompressed_size <<= 8;
13710           uncompressed_size += start[9]; uncompressed_size <<= 8;
13711           uncompressed_size += start[10]; uncompressed_size <<= 8;
13712           uncompressed_size += start[11];
13713           start += 12;
13714           new_size -= 12;
13715         }
13716
13717       if (uncompressed_size)
13718         {
13719           if (uncompress_section_contents (& start, uncompressed_size,
13720                                            & new_size))
13721             {
13722               section_size = new_size;
13723             }
13724           else
13725             {
13726               error (_("Unable to decompress section %s\n"),
13727                      printable_section_name (filedata, section));
13728               /* FIXME: Print the section anyway ?  */
13729               return FALSE;
13730             }
13731         }
13732       else
13733         start = real_start;
13734     }
13735
13736   if (relocate)
13737     {
13738       if (! apply_relocations (filedata, section, start, section_size, NULL, NULL))
13739         return FALSE;
13740     }
13741   else
13742     {
13743       /* If the section being dumped has relocations against it the user might
13744          be expecting these relocations to have been applied.  Check for this
13745          case and issue a warning message in order to avoid confusion.
13746          FIXME: Maybe we ought to have an option that dumps a section with
13747          relocs applied ?  */
13748       for (relsec = filedata->section_headers;
13749            relsec < filedata->section_headers + filedata->file_header.e_shnum;
13750            ++relsec)
13751         {
13752           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13753               || relsec->sh_info >= filedata->file_header.e_shnum
13754               || filedata->section_headers + relsec->sh_info != section
13755               || relsec->sh_size == 0
13756               || relsec->sh_link >= filedata->file_header.e_shnum)
13757             continue;
13758
13759           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13760           break;
13761         }
13762     }
13763
13764   addr = section->sh_addr;
13765   bytes = section_size;
13766   data = start;
13767
13768   while (bytes)
13769     {
13770       int j;
13771       int k;
13772       int lbytes;
13773
13774       lbytes = (bytes > 16 ? 16 : bytes);
13775
13776       printf ("  0x%8.8lx ", (unsigned long) addr);
13777
13778       for (j = 0; j < 16; j++)
13779         {
13780           if (j < lbytes)
13781             printf ("%2.2x", data[j]);
13782           else
13783             printf ("  ");
13784
13785           if ((j & 3) == 3)
13786             printf (" ");
13787         }
13788
13789       for (j = 0; j < lbytes; j++)
13790         {
13791           k = data[j];
13792           if (k >= ' ' && k < 0x7f)
13793             printf ("%c", k);
13794           else
13795             printf (".");
13796         }
13797
13798       putchar ('\n');
13799
13800       data  += lbytes;
13801       addr  += lbytes;
13802       bytes -= lbytes;
13803     }
13804
13805   free (real_start);
13806
13807   putchar ('\n');
13808   return TRUE;
13809 }
13810
13811 static ctf_sect_t *
13812 shdr_to_ctf_sect (ctf_sect_t *buf, Elf_Internal_Shdr *shdr, Filedata *filedata)
13813 {
13814   buf->cts_name = SECTION_NAME (shdr);
13815   buf->cts_size = shdr->sh_size;
13816   buf->cts_entsize = shdr->sh_entsize;
13817
13818   return buf;
13819 }
13820
13821 /* Formatting callback function passed to ctf_dump.  Returns either the pointer
13822    it is passed, or a pointer to newly-allocated storage, in which case
13823    dump_ctf() will free it when it no longer needs it.  */
13824
13825 static char *dump_ctf_indent_lines (ctf_sect_names_t sect ATTRIBUTE_UNUSED,
13826                                     char *s, void *arg)
13827 {
13828   char *spaces = arg;
13829   char *new_s;
13830
13831   if (asprintf (&new_s, "%s%s", spaces, s) < 0)
13832     return s;
13833   return new_s;
13834 }
13835
13836 static bfd_boolean
13837 dump_section_as_ctf (Elf_Internal_Shdr * section, Filedata * filedata)
13838 {
13839   Elf_Internal_Shdr *  parent_sec = NULL;
13840   Elf_Internal_Shdr *  symtab_sec = NULL;
13841   Elf_Internal_Shdr *  strtab_sec = NULL;
13842   void *               data = NULL;
13843   void *               symdata = NULL;
13844   void *               strdata = NULL;
13845   void *               parentdata = NULL;
13846   ctf_sect_t           ctfsect, symsect, strsect, parentsect;
13847   ctf_sect_t *         symsectp = NULL;
13848   ctf_sect_t *         strsectp = NULL;
13849   ctf_file_t *         ctf = NULL;
13850   ctf_file_t *         parent = NULL;
13851
13852   const char *things[] = {"Labels", "Data objects", "Function objects",
13853                           "Variables", "Types", "Strings", ""};
13854   const char **thing;
13855   int err;
13856   bfd_boolean ret = FALSE;
13857   size_t i;
13858
13859   shdr_to_ctf_sect (&ctfsect, section, filedata);
13860   data = get_section_contents (section, filedata);
13861   ctfsect.cts_data = data;
13862
13863   if (dump_ctf_symtab_name)
13864     {
13865       if ((symtab_sec = find_section (filedata, dump_ctf_symtab_name)) == NULL)
13866         {
13867           error (_("No symbol section named %s\n"), dump_ctf_symtab_name);
13868           goto fail;
13869         }
13870       if ((symdata = (void *) get_data (NULL, filedata,
13871                                         symtab_sec->sh_offset, 1,
13872                                         symtab_sec->sh_size,
13873                                         _("symbols"))) == NULL)
13874         goto fail;
13875       symsectp = shdr_to_ctf_sect (&symsect, symtab_sec, filedata);
13876       symsect.cts_data = symdata;
13877     }
13878   if (dump_ctf_strtab_name)
13879     {
13880       if ((strtab_sec = find_section (filedata, dump_ctf_strtab_name)) == NULL)
13881         {
13882           error (_("No string table section named %s\n"),
13883                  dump_ctf_strtab_name);
13884           goto fail;
13885         }
13886       if ((strdata = (void *) get_data (NULL, filedata,
13887                                         strtab_sec->sh_offset, 1,
13888                                         strtab_sec->sh_size,
13889                                         _("strings"))) == NULL)
13890         goto fail;
13891       strsectp = shdr_to_ctf_sect (&strsect, strtab_sec, filedata);
13892       strsect.cts_data = strdata;
13893     }
13894   if (dump_ctf_parent_name)
13895     {
13896       if ((parent_sec = find_section (filedata, dump_ctf_parent_name)) == NULL)
13897         {
13898           error (_("No CTF parent section named %s\n"), dump_ctf_parent_name);
13899           goto fail;
13900         }
13901       if ((parentdata = (void *) get_data (NULL, filedata,
13902                                            parent_sec->sh_offset, 1,
13903                                            parent_sec->sh_size,
13904                                            _("CTF parent"))) == NULL)
13905         goto fail;
13906       shdr_to_ctf_sect (&parentsect, parent_sec, filedata);
13907       parentsect.cts_data = parentdata;
13908     }
13909
13910   /* Load the CTF file and dump it.  */
13911
13912   if ((ctf = ctf_bufopen (&ctfsect, symsectp, strsectp, &err)) == NULL)
13913     {
13914       error (_("CTF open failure: %s\n"), ctf_errmsg (err));
13915       goto fail;
13916     }
13917
13918   if (parentdata)
13919     {
13920       if ((parent = ctf_bufopen (&parentsect, symsectp, strsectp, &err)) == NULL)
13921         {
13922           error (_("CTF open failure: %s\n"), ctf_errmsg (err));
13923           goto fail;
13924         }
13925
13926       ctf_import (ctf, parent);
13927     }
13928
13929   ret = TRUE;
13930
13931   printf (_("\nDump of CTF section '%s':\n"),
13932           printable_section_name (filedata, section));
13933
13934   for (i = 1, thing = things; *thing[0]; thing++, i++)
13935     {
13936       ctf_dump_state_t *s = NULL;
13937       char *item;
13938
13939       printf ("\n  %s:\n", *thing);
13940       while ((item = ctf_dump (ctf, &s, i, dump_ctf_indent_lines,
13941                                (void *) "    ")) != NULL)
13942         {
13943           printf ("%s\n", item);
13944           free (item);
13945         }
13946
13947       if (ctf_errno (ctf))
13948         {
13949           error (_("Iteration failed: %s, %s\n"), *thing,
13950                    ctf_errmsg (ctf_errno (ctf)));
13951           ret = FALSE;
13952         }
13953     }
13954
13955  fail:
13956   ctf_file_close (ctf);
13957   ctf_file_close (parent);
13958   free (parentdata);
13959   free (data);
13960   free (symdata);
13961   free (strdata);
13962   return ret;
13963 }
13964
13965 static bfd_boolean
13966 load_specific_debug_section (enum dwarf_section_display_enum  debug,
13967                              const Elf_Internal_Shdr *        sec,
13968                              void *                           data)
13969 {
13970   struct dwarf_section * section = &debug_displays [debug].section;
13971   char buf [64];
13972   Filedata * filedata = (Filedata *) data;
13973   
13974   if (section->start != NULL)
13975     {
13976       /* If it is already loaded, do nothing.  */
13977       if (streq (section->filename, filedata->file_name))
13978         return TRUE;
13979       free (section->start);
13980     }
13981
13982   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
13983   section->address = sec->sh_addr;
13984   section->user_data = NULL;
13985   section->filename = filedata->file_name;
13986   section->start = (unsigned char *) get_data (NULL, filedata,
13987                                                sec->sh_offset, 1,
13988                                                sec->sh_size, buf);
13989   if (section->start == NULL)
13990     section->size = 0;
13991   else
13992     {
13993       unsigned char *start = section->start;
13994       dwarf_size_type size = sec->sh_size;
13995       dwarf_size_type uncompressed_size = 0;
13996
13997       if ((sec->sh_flags & SHF_COMPRESSED) != 0)
13998         {
13999           Elf_Internal_Chdr chdr;
14000           unsigned int compression_header_size;
14001
14002           if (size < (is_32bit_elf
14003                       ? sizeof (Elf32_External_Chdr)
14004                       : sizeof (Elf64_External_Chdr)))
14005             {
14006               warn (_("compressed section %s is too small to contain a compression header"),
14007                     section->name);
14008               return FALSE;
14009             }
14010
14011           compression_header_size = get_compression_header (&chdr, start, size);
14012
14013           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
14014             {
14015               warn (_("section '%s' has unsupported compress type: %d\n"),
14016                     section->name, chdr.ch_type);
14017               return FALSE;
14018             }
14019           uncompressed_size = chdr.ch_size;
14020           start += compression_header_size;
14021           size -= compression_header_size;
14022         }
14023       else if (size > 12 && streq ((char *) start, "ZLIB"))
14024         {
14025           /* Read the zlib header.  In this case, it should be "ZLIB"
14026              followed by the uncompressed section size, 8 bytes in
14027              big-endian order.  */
14028           uncompressed_size = start[4]; uncompressed_size <<= 8;
14029           uncompressed_size += start[5]; uncompressed_size <<= 8;
14030           uncompressed_size += start[6]; uncompressed_size <<= 8;
14031           uncompressed_size += start[7]; uncompressed_size <<= 8;
14032           uncompressed_size += start[8]; uncompressed_size <<= 8;
14033           uncompressed_size += start[9]; uncompressed_size <<= 8;
14034           uncompressed_size += start[10]; uncompressed_size <<= 8;
14035           uncompressed_size += start[11];
14036           start += 12;
14037           size -= 12;
14038         }
14039
14040       if (uncompressed_size)
14041         {
14042           if (uncompress_section_contents (&start, uncompressed_size,
14043                                            &size))
14044             {
14045               /* Free the compressed buffer, update the section buffer
14046                  and the section size if uncompress is successful.  */
14047               free (section->start);
14048               section->start = start;
14049             }
14050           else
14051             {
14052               error (_("Unable to decompress section %s\n"),
14053                      printable_section_name (filedata, sec));
14054               return FALSE;
14055             }
14056         }
14057
14058       section->size = size;
14059     }
14060
14061   if (section->start == NULL)
14062     return FALSE;
14063
14064   if (debug_displays [debug].relocate)
14065     {
14066       if (! apply_relocations (filedata, sec, section->start, section->size,
14067                                & section->reloc_info, & section->num_relocs))
14068         return FALSE;
14069     }
14070   else
14071     {
14072       section->reloc_info = NULL;
14073       section->num_relocs = 0;
14074     }
14075
14076   return TRUE;
14077 }
14078
14079 /* If this is not NULL, load_debug_section will only look for sections
14080    within the list of sections given here.  */
14081 static unsigned int * section_subset = NULL;
14082
14083 bfd_boolean
14084 load_debug_section (enum dwarf_section_display_enum debug, void * data)
14085 {
14086   struct dwarf_section * section = &debug_displays [debug].section;
14087   Elf_Internal_Shdr * sec;
14088   Filedata * filedata = (Filedata *) data;
14089
14090   /* Without section headers we cannot find any sections.  */
14091   if (filedata->section_headers == NULL)
14092     return FALSE;
14093
14094   if (filedata->string_table == NULL
14095       && filedata->file_header.e_shstrndx != SHN_UNDEF
14096       && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
14097     {
14098       Elf_Internal_Shdr * strs;
14099
14100       /* Read in the string table, so that we have section names to scan.  */
14101       strs = filedata->section_headers + filedata->file_header.e_shstrndx;
14102
14103       if (strs != NULL && strs->sh_size != 0)
14104         {
14105           filedata->string_table
14106             = (char *) get_data (NULL, filedata, strs->sh_offset,
14107                                  1, strs->sh_size, _("string table"));
14108
14109           filedata->string_table_length
14110             = filedata->string_table != NULL ? strs->sh_size : 0;
14111         }
14112     }
14113
14114   /* Locate the debug section.  */
14115   sec = find_section_in_set (filedata, section->uncompressed_name, section_subset);
14116   if (sec != NULL)
14117     section->name = section->uncompressed_name;
14118   else
14119     {
14120       sec = find_section_in_set (filedata, section->compressed_name, section_subset);
14121       if (sec != NULL)
14122         section->name = section->compressed_name;
14123     }
14124   if (sec == NULL)
14125     return FALSE;
14126
14127   /* If we're loading from a subset of sections, and we've loaded
14128      a section matching this name before, it's likely that it's a
14129      different one.  */
14130   if (section_subset != NULL)
14131     free_debug_section (debug);
14132
14133   return load_specific_debug_section (debug, sec, data);
14134 }
14135
14136 void
14137 free_debug_section (enum dwarf_section_display_enum debug)
14138 {
14139   struct dwarf_section * section = &debug_displays [debug].section;
14140
14141   if (section->start == NULL)
14142     return;
14143
14144   free ((char *) section->start);
14145   section->start = NULL;
14146   section->address = 0;
14147   section->size = 0;
14148 }
14149
14150 static bfd_boolean
14151 display_debug_section (int shndx, Elf_Internal_Shdr * section, Filedata * filedata)
14152 {
14153   char * name = SECTION_NAME (section);
14154   const char * print_name = printable_section_name (filedata, section);
14155   bfd_size_type length;
14156   bfd_boolean result = TRUE;
14157   int i;
14158
14159   length = section->sh_size;
14160   if (length == 0)
14161     {
14162       printf (_("\nSection '%s' has no debugging data.\n"), print_name);
14163       return TRUE;
14164     }
14165   if (section->sh_type == SHT_NOBITS)
14166     {
14167       /* There is no point in dumping the contents of a debugging section
14168          which has the NOBITS type - the bits in the file will be random.
14169          This can happen when a file containing a .eh_frame section is
14170          stripped with the --only-keep-debug command line option.  */
14171       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
14172               print_name);
14173       return FALSE;
14174     }
14175
14176   if (const_strneq (name, ".gnu.linkonce.wi."))
14177     name = ".debug_info";
14178
14179   /* See if we know how to display the contents of this section.  */
14180   for (i = 0; i < max; i++)
14181     {
14182       enum dwarf_section_display_enum  id = (enum dwarf_section_display_enum) i;
14183       struct dwarf_section_display *   display = debug_displays + i;
14184       struct dwarf_section *           sec = & display->section;
14185
14186       if (streq (sec->uncompressed_name, name)
14187           || (id == line && const_strneq (name, ".debug_line."))
14188           || streq (sec->compressed_name, name))
14189         {
14190           bfd_boolean secondary = (section != find_section (filedata, name));
14191
14192           if (secondary)
14193             free_debug_section (id);
14194
14195           if (i == line && const_strneq (name, ".debug_line."))
14196             sec->name = name;
14197           else if (streq (sec->uncompressed_name, name))
14198             sec->name = sec->uncompressed_name;
14199           else
14200             sec->name = sec->compressed_name;
14201
14202           if (load_specific_debug_section (id, section, filedata))
14203             {
14204               /* If this debug section is part of a CU/TU set in a .dwp file,
14205                  restrict load_debug_section to the sections in that set.  */
14206               section_subset = find_cu_tu_set (filedata, shndx);
14207
14208               result &= display->display (sec, filedata);
14209
14210               section_subset = NULL;
14211
14212               if (secondary || (id != info && id != abbrev))
14213                 free_debug_section (id);
14214             }
14215           break;
14216         }
14217     }
14218
14219   if (i == max)
14220     {
14221       printf (_("Unrecognized debug section: %s\n"), print_name);
14222       result = FALSE;
14223     }
14224
14225   return result;
14226 }
14227
14228 /* Set DUMP_SECTS for all sections where dumps were requested
14229    based on section name.  */
14230
14231 static void
14232 initialise_dumps_byname (Filedata * filedata)
14233 {
14234   struct dump_list_entry * cur;
14235
14236   for (cur = dump_sects_byname; cur; cur = cur->next)
14237     {
14238       unsigned int i;
14239       bfd_boolean any = FALSE;
14240
14241       for (i = 0; i < filedata->file_header.e_shnum; i++)
14242         if (streq (SECTION_NAME (filedata->section_headers + i), cur->name))
14243           {
14244             request_dump_bynumber (filedata, i, cur->type);
14245             any = TRUE;
14246           }
14247
14248       if (!any)
14249         warn (_("Section '%s' was not dumped because it does not exist!\n"),
14250               cur->name);
14251     }
14252 }
14253
14254 static bfd_boolean
14255 process_section_contents (Filedata * filedata)
14256 {
14257   Elf_Internal_Shdr * section;
14258   unsigned int i;
14259   bfd_boolean res = TRUE;
14260
14261   if (! do_dump)
14262     return TRUE;
14263
14264   initialise_dumps_byname (filedata);
14265
14266   for (i = 0, section = filedata->section_headers;
14267        i < filedata->file_header.e_shnum && i < filedata->num_dump_sects;
14268        i++, section++)
14269     {
14270       dump_type dump = filedata->dump_sects[i];
14271
14272 #ifdef SUPPORT_DISASSEMBLY
14273       if (dump & DISASS_DUMP)
14274         {
14275           if (! disassemble_section (section, filedata))
14276             res = FALSE;
14277         }
14278 #endif
14279       if (dump & HEX_DUMP)
14280         {
14281           if (! dump_section_as_bytes (section, filedata, FALSE))
14282             res = FALSE;
14283         }
14284
14285       if (dump & RELOC_DUMP)
14286         {
14287           if (! dump_section_as_bytes (section, filedata, TRUE))
14288             res = FALSE;
14289         }
14290
14291       if (dump & STRING_DUMP)
14292         {
14293           if (! dump_section_as_strings (section, filedata))
14294             res = FALSE;
14295         }
14296
14297       if (dump & DEBUG_DUMP)
14298         {
14299           if (! display_debug_section (i, section, filedata))
14300             res = FALSE;
14301         }
14302
14303       if (dump & CTF_DUMP)
14304         {
14305           if (! dump_section_as_ctf (section, filedata))
14306             res = FALSE;
14307         }
14308     }
14309
14310   /* Check to see if the user requested a
14311      dump of a section that does not exist.  */
14312   while (i < filedata->num_dump_sects)
14313     {
14314       if (filedata->dump_sects[i])
14315         {
14316           warn (_("Section %d was not dumped because it does not exist!\n"), i);
14317           res = FALSE;
14318         }
14319       i++;
14320     }
14321
14322   return res;
14323 }
14324
14325 static void
14326 process_mips_fpe_exception (int mask)
14327 {
14328   if (mask)
14329     {
14330       bfd_boolean first = TRUE;
14331
14332       if (mask & OEX_FPU_INEX)
14333         fputs ("INEX", stdout), first = FALSE;
14334       if (mask & OEX_FPU_UFLO)
14335         printf ("%sUFLO", first ? "" : "|"), first = FALSE;
14336       if (mask & OEX_FPU_OFLO)
14337         printf ("%sOFLO", first ? "" : "|"), first = FALSE;
14338       if (mask & OEX_FPU_DIV0)
14339         printf ("%sDIV0", first ? "" : "|"), first = FALSE;
14340       if (mask & OEX_FPU_INVAL)
14341         printf ("%sINVAL", first ? "" : "|");
14342     }
14343   else
14344     fputs ("0", stdout);
14345 }
14346
14347 /* Display's the value of TAG at location P.  If TAG is
14348    greater than 0 it is assumed to be an unknown tag, and
14349    a message is printed to this effect.  Otherwise it is
14350    assumed that a message has already been printed.
14351
14352    If the bottom bit of TAG is set it assumed to have a
14353    string value, otherwise it is assumed to have an integer
14354    value.
14355
14356    Returns an updated P pointing to the first unread byte
14357    beyond the end of TAG's value.
14358
14359    Reads at or beyond END will not be made.  */
14360
14361 static unsigned char *
14362 display_tag_value (signed int tag,
14363                    unsigned char * p,
14364                    const unsigned char * const end)
14365 {
14366   unsigned long val;
14367
14368   if (tag > 0)
14369     printf ("  Tag_unknown_%d: ", tag);
14370
14371   if (p >= end)
14372     {
14373       warn (_("<corrupt tag>\n"));
14374     }
14375   else if (tag & 1)
14376     {
14377       /* PR 17531 file: 027-19978-0.004.  */
14378       size_t maxlen = (end - p) - 1;
14379
14380       putchar ('"');
14381       if (maxlen > 0)
14382         {
14383           print_symbol ((int) maxlen, (const char *) p);
14384           p += strnlen ((char *) p, maxlen) + 1;
14385         }
14386       else
14387         {
14388           printf (_("<corrupt string tag>"));
14389           p = (unsigned char *) end;
14390         }
14391       printf ("\"\n");
14392     }
14393   else
14394     {
14395       unsigned int len;
14396
14397       val = read_uleb128 (p, &len, end);
14398       p += len;
14399       printf ("%ld (0x%lx)\n", val, val);
14400     }
14401
14402   assert (p <= end);
14403   return p;
14404 }
14405
14406 /* ARC ABI attributes section.  */
14407
14408 static unsigned char *
14409 display_arc_attribute (unsigned char * p,
14410                        const unsigned char * const end)
14411 {
14412   unsigned int tag;
14413   unsigned int len;
14414   unsigned int val;
14415
14416   tag = read_uleb128 (p, &len, end);
14417   p += len;
14418
14419   switch (tag)
14420     {
14421     case Tag_ARC_PCS_config:
14422       val = read_uleb128 (p, &len, end);
14423       p += len;
14424       printf ("  Tag_ARC_PCS_config: ");
14425       switch (val)
14426         {
14427         case 0:
14428           printf (_("Absent/Non standard\n"));
14429           break;
14430         case 1:
14431           printf (_("Bare metal/mwdt\n"));
14432           break;
14433         case 2:
14434           printf (_("Bare metal/newlib\n"));
14435           break;
14436         case 3:
14437           printf (_("Linux/uclibc\n"));
14438           break;
14439         case 4:
14440           printf (_("Linux/glibc\n"));
14441           break;
14442         default:
14443           printf (_("Unknown\n"));
14444           break;
14445         }
14446       break;
14447
14448     case Tag_ARC_CPU_base:
14449       val = read_uleb128 (p, &len, end);
14450       p += len;
14451       printf ("  Tag_ARC_CPU_base: ");
14452       switch (val)
14453         {
14454         default:
14455         case TAG_CPU_NONE:
14456           printf (_("Absent\n"));
14457           break;
14458         case TAG_CPU_ARC6xx:
14459           printf ("ARC6xx\n");
14460           break;
14461         case TAG_CPU_ARC7xx:
14462           printf ("ARC7xx\n");
14463           break;
14464         case TAG_CPU_ARCEM:
14465           printf ("ARCEM\n");
14466           break;
14467         case TAG_CPU_ARCHS:
14468           printf ("ARCHS\n");
14469           break;
14470         }
14471       break;
14472
14473     case Tag_ARC_CPU_variation:
14474       val = read_uleb128 (p, &len, end);
14475       p += len;
14476       printf ("  Tag_ARC_CPU_variation: ");
14477       switch (val)
14478         {
14479         default:
14480           if (val > 0 && val < 16)
14481               printf ("Core%d\n", val);
14482           else
14483               printf ("Unknown\n");
14484           break;
14485
14486         case 0:
14487           printf (_("Absent\n"));
14488           break;
14489         }
14490       break;
14491
14492     case Tag_ARC_CPU_name:
14493       printf ("  Tag_ARC_CPU_name: ");
14494       p = display_tag_value (-1, p, end);
14495       break;
14496
14497     case Tag_ARC_ABI_rf16:
14498       val = read_uleb128 (p, &len, end);
14499       p += len;
14500       printf ("  Tag_ARC_ABI_rf16: %s\n", val ? _("yes") : _("no"));
14501       break;
14502
14503     case Tag_ARC_ABI_osver:
14504       val = read_uleb128 (p, &len, end);
14505       p += len;
14506       printf ("  Tag_ARC_ABI_osver: v%d\n", val);
14507       break;
14508
14509     case Tag_ARC_ABI_pic:
14510     case Tag_ARC_ABI_sda:
14511       val = read_uleb128 (p, &len, end);
14512       p += len;
14513       printf (tag == Tag_ARC_ABI_sda ? "  Tag_ARC_ABI_sda: "
14514               : "  Tag_ARC_ABI_pic: ");
14515       switch (val)
14516         {
14517         case 0:
14518           printf (_("Absent\n"));
14519           break;
14520         case 1:
14521           printf ("MWDT\n");
14522           break;
14523         case 2:
14524           printf ("GNU\n");
14525           break;
14526         default:
14527           printf (_("Unknown\n"));
14528           break;
14529         }
14530       break;
14531
14532     case Tag_ARC_ABI_tls:
14533       val = read_uleb128 (p, &len, end);
14534       p += len;
14535       printf ("  Tag_ARC_ABI_tls: %s\n", val ? "r25": "none");
14536       break;
14537
14538     case Tag_ARC_ABI_enumsize:
14539       val = read_uleb128 (p, &len, end);
14540       p += len;
14541       printf ("  Tag_ARC_ABI_enumsize: %s\n", val ? _("default") :
14542               _("smallest"));
14543       break;
14544
14545     case Tag_ARC_ABI_exceptions:
14546       val = read_uleb128 (p, &len, end);
14547       p += len;
14548       printf ("  Tag_ARC_ABI_exceptions: %s\n", val ? _("OPTFP")
14549               : _("default"));
14550       break;
14551
14552     case Tag_ARC_ABI_double_size:
14553       val = read_uleb128 (p, &len, end);
14554       p += len;
14555       printf ("  Tag_ARC_ABI_double_size: %d\n", val);
14556       break;
14557
14558     case Tag_ARC_ISA_config:
14559       printf ("  Tag_ARC_ISA_config: ");
14560       p = display_tag_value (-1, p, end);
14561       break;
14562
14563     case Tag_ARC_ISA_apex:
14564       printf ("  Tag_ARC_ISA_apex: ");
14565       p = display_tag_value (-1, p, end);
14566       break;
14567
14568     case Tag_ARC_ISA_mpy_option:
14569       val = read_uleb128 (p, &len, end);
14570       p += len;
14571       printf ("  Tag_ARC_ISA_mpy_option: %d\n", val);
14572       break;
14573
14574     case Tag_ARC_ATR_version:
14575       val = read_uleb128 (p, &len, end);
14576       p += len;
14577       printf ("  Tag_ARC_ATR_version: %d\n", val);
14578       break;
14579
14580     default:
14581       return display_tag_value (tag & 1, p, end);
14582     }
14583
14584   return p;
14585 }
14586
14587 /* ARM EABI attributes section.  */
14588 typedef struct
14589 {
14590   unsigned int tag;
14591   const char * name;
14592   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
14593   unsigned int type;
14594   const char ** table;
14595 } arm_attr_public_tag;
14596
14597 static const char * arm_attr_tag_CPU_arch[] =
14598   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
14599    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "v8-R", "v8-M.baseline",
14600    "v8-M.mainline", "", "", "", "v8.1-M.mainline"};
14601 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
14602 static const char * arm_attr_tag_THUMB_ISA_use[] =
14603   {"No", "Thumb-1", "Thumb-2", "Yes"};
14604 static const char * arm_attr_tag_FP_arch[] =
14605   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
14606    "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
14607 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
14608 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
14609   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
14610    "NEON for ARMv8.1"};
14611 static const char * arm_attr_tag_PCS_config[] =
14612   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
14613    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
14614 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
14615   {"V6", "SB", "TLS", "Unused"};
14616 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
14617   {"Absolute", "PC-relative", "SB-relative", "None"};
14618 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
14619   {"Absolute", "PC-relative", "None"};
14620 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
14621   {"None", "direct", "GOT-indirect"};
14622 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
14623   {"None", "??? 1", "2", "??? 3", "4"};
14624 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
14625 static const char * arm_attr_tag_ABI_FP_denormal[] =
14626   {"Unused", "Needed", "Sign only"};
14627 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
14628 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
14629 static const char * arm_attr_tag_ABI_FP_number_model[] =
14630   {"Unused", "Finite", "RTABI", "IEEE 754"};
14631 static const char * arm_attr_tag_ABI_enum_size[] =
14632   {"Unused", "small", "int", "forced to int"};
14633 static const char * arm_attr_tag_ABI_HardFP_use[] =
14634   {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
14635 static const char * arm_attr_tag_ABI_VFP_args[] =
14636   {"AAPCS", "VFP registers", "custom", "compatible"};
14637 static const char * arm_attr_tag_ABI_WMMX_args[] =
14638   {"AAPCS", "WMMX registers", "custom"};
14639 static const char * arm_attr_tag_ABI_optimization_goals[] =
14640   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14641     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
14642 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
14643   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14644     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
14645 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
14646 static const char * arm_attr_tag_FP_HP_extension[] =
14647   {"Not Allowed", "Allowed"};
14648 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
14649   {"None", "IEEE 754", "Alternative Format"};
14650 static const char * arm_attr_tag_DSP_extension[] =
14651   {"Follow architecture", "Allowed"};
14652 static const char * arm_attr_tag_MPextension_use[] =
14653   {"Not Allowed", "Allowed"};
14654 static const char * arm_attr_tag_DIV_use[] =
14655   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
14656     "Allowed in v7-A with integer division extension"};
14657 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
14658 static const char * arm_attr_tag_Virtualization_use[] =
14659   {"Not Allowed", "TrustZone", "Virtualization Extensions",
14660     "TrustZone and Virtualization Extensions"};
14661 static const char * arm_attr_tag_MPextension_use_legacy[] =
14662   {"Not Allowed", "Allowed"};
14663
14664 static const char * arm_attr_tag_MVE_arch[] =
14665   {"No MVE", "MVE Integer only", "MVE Integer and FP"};
14666
14667 #define LOOKUP(id, name) \
14668   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
14669 static arm_attr_public_tag arm_attr_public_tags[] =
14670 {
14671   {4, "CPU_raw_name", 1, NULL},
14672   {5, "CPU_name", 1, NULL},
14673   LOOKUP(6, CPU_arch),
14674   {7, "CPU_arch_profile", 0, NULL},
14675   LOOKUP(8, ARM_ISA_use),
14676   LOOKUP(9, THUMB_ISA_use),
14677   LOOKUP(10, FP_arch),
14678   LOOKUP(11, WMMX_arch),
14679   LOOKUP(12, Advanced_SIMD_arch),
14680   LOOKUP(13, PCS_config),
14681   LOOKUP(14, ABI_PCS_R9_use),
14682   LOOKUP(15, ABI_PCS_RW_data),
14683   LOOKUP(16, ABI_PCS_RO_data),
14684   LOOKUP(17, ABI_PCS_GOT_use),
14685   LOOKUP(18, ABI_PCS_wchar_t),
14686   LOOKUP(19, ABI_FP_rounding),
14687   LOOKUP(20, ABI_FP_denormal),
14688   LOOKUP(21, ABI_FP_exceptions),
14689   LOOKUP(22, ABI_FP_user_exceptions),
14690   LOOKUP(23, ABI_FP_number_model),
14691   {24, "ABI_align_needed", 0, NULL},
14692   {25, "ABI_align_preserved", 0, NULL},
14693   LOOKUP(26, ABI_enum_size),
14694   LOOKUP(27, ABI_HardFP_use),
14695   LOOKUP(28, ABI_VFP_args),
14696   LOOKUP(29, ABI_WMMX_args),
14697   LOOKUP(30, ABI_optimization_goals),
14698   LOOKUP(31, ABI_FP_optimization_goals),
14699   {32, "compatibility", 0, NULL},
14700   LOOKUP(34, CPU_unaligned_access),
14701   LOOKUP(36, FP_HP_extension),
14702   LOOKUP(38, ABI_FP_16bit_format),
14703   LOOKUP(42, MPextension_use),
14704   LOOKUP(44, DIV_use),
14705   LOOKUP(46, DSP_extension),
14706   LOOKUP(48, MVE_arch),
14707   {64, "nodefaults", 0, NULL},
14708   {65, "also_compatible_with", 0, NULL},
14709   LOOKUP(66, T2EE_use),
14710   {67, "conformance", 1, NULL},
14711   LOOKUP(68, Virtualization_use),
14712   LOOKUP(70, MPextension_use_legacy)
14713 };
14714 #undef LOOKUP
14715
14716 static unsigned char *
14717 display_arm_attribute (unsigned char * p,
14718                        const unsigned char * const end)
14719 {
14720   unsigned int tag;
14721   unsigned int len;
14722   unsigned int val;
14723   arm_attr_public_tag * attr;
14724   unsigned i;
14725   unsigned int type;
14726
14727   tag = read_uleb128 (p, &len, end);
14728   p += len;
14729   attr = NULL;
14730   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
14731     {
14732       if (arm_attr_public_tags[i].tag == tag)
14733         {
14734           attr = &arm_attr_public_tags[i];
14735           break;
14736         }
14737     }
14738
14739   if (attr)
14740     {
14741       printf ("  Tag_%s: ", attr->name);
14742       switch (attr->type)
14743         {
14744         case 0:
14745           switch (tag)
14746             {
14747             case 7: /* Tag_CPU_arch_profile.  */
14748               val = read_uleb128 (p, &len, end);
14749               p += len;
14750               switch (val)
14751                 {
14752                 case 0: printf (_("None\n")); break;
14753                 case 'A': printf (_("Application\n")); break;
14754                 case 'R': printf (_("Realtime\n")); break;
14755                 case 'M': printf (_("Microcontroller\n")); break;
14756                 case 'S': printf (_("Application or Realtime\n")); break;
14757                 default: printf ("??? (%d)\n", val); break;
14758                 }
14759               break;
14760
14761             case 24: /* Tag_align_needed.  */
14762               val = read_uleb128 (p, &len, end);
14763               p += len;
14764               switch (val)
14765                 {
14766                 case 0: printf (_("None\n")); break;
14767                 case 1: printf (_("8-byte\n")); break;
14768                 case 2: printf (_("4-byte\n")); break;
14769                 case 3: printf ("??? 3\n"); break;
14770                 default:
14771                   if (val <= 12)
14772                     printf (_("8-byte and up to %d-byte extended\n"),
14773                             1 << val);
14774                   else
14775                     printf ("??? (%d)\n", val);
14776                   break;
14777                 }
14778               break;
14779
14780             case 25: /* Tag_align_preserved.  */
14781               val = read_uleb128 (p, &len, end);
14782               p += len;
14783               switch (val)
14784                 {
14785                 case 0: printf (_("None\n")); break;
14786                 case 1: printf (_("8-byte, except leaf SP\n")); break;
14787                 case 2: printf (_("8-byte\n")); break;
14788                 case 3: printf ("??? 3\n"); break;
14789                 default:
14790                   if (val <= 12)
14791                     printf (_("8-byte and up to %d-byte extended\n"),
14792                             1 << val);
14793                   else
14794                     printf ("??? (%d)\n", val);
14795                   break;
14796                 }
14797               break;
14798
14799             case 32: /* Tag_compatibility.  */
14800               {
14801                 val = read_uleb128 (p, &len, end);
14802                 p += len;
14803                 printf (_("flag = %d, vendor = "), val);
14804                 if (p < end - 1)
14805                   {
14806                     size_t maxlen = (end - p) - 1;
14807
14808                     print_symbol ((int) maxlen, (const char *) p);
14809                     p += strnlen ((char *) p, maxlen) + 1;
14810                   }
14811                 else
14812                   {
14813                     printf (_("<corrupt>"));
14814                     p = (unsigned char *) end;
14815                   }
14816                 putchar ('\n');
14817               }
14818               break;
14819
14820             case 64: /* Tag_nodefaults.  */
14821               /* PR 17531: file: 001-505008-0.01.  */
14822               if (p < end)
14823                 p++;
14824               printf (_("True\n"));
14825               break;
14826
14827             case 65: /* Tag_also_compatible_with.  */
14828               val = read_uleb128 (p, &len, end);
14829               p += len;
14830               if (val == 6 /* Tag_CPU_arch.  */)
14831                 {
14832                   val = read_uleb128 (p, &len, end);
14833                   p += len;
14834                   if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
14835                     printf ("??? (%d)\n", val);
14836                   else
14837                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
14838                 }
14839               else
14840                 printf ("???\n");
14841               while (p < end && *(p++) != '\0' /* NUL terminator.  */)
14842                 ;
14843               break;
14844
14845             default:
14846               printf (_("<unknown: %d>\n"), tag);
14847               break;
14848             }
14849           return p;
14850
14851         case 1:
14852           return display_tag_value (-1, p, end);
14853         case 2:
14854           return display_tag_value (0, p, end);
14855
14856         default:
14857           assert (attr->type & 0x80);
14858           val = read_uleb128 (p, &len, end);
14859           p += len;
14860           type = attr->type & 0x7f;
14861           if (val >= type)
14862             printf ("??? (%d)\n", val);
14863           else
14864             printf ("%s\n", attr->table[val]);
14865           return p;
14866         }
14867     }
14868
14869   return display_tag_value (tag, p, end);
14870 }
14871
14872 static unsigned char *
14873 display_gnu_attribute (unsigned char * p,
14874                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const),
14875                        const unsigned char * const end)
14876 {
14877   int tag;
14878   unsigned int len;
14879   unsigned int val;
14880
14881   tag = read_uleb128 (p, &len, end);
14882   p += len;
14883
14884   /* Tag_compatibility is the only generic GNU attribute defined at
14885      present.  */
14886   if (tag == 32)
14887     {
14888       val = read_uleb128 (p, &len, end);
14889       p += len;
14890
14891       printf (_("flag = %d, vendor = "), val);
14892       if (p == end)
14893         {
14894           printf (_("<corrupt>\n"));
14895           warn (_("corrupt vendor attribute\n"));
14896         }
14897       else
14898         {
14899           if (p < end - 1)
14900             {
14901               size_t maxlen = (end - p) - 1;
14902
14903               print_symbol ((int) maxlen, (const char *) p);
14904               p += strnlen ((char *) p, maxlen) + 1;
14905             }
14906           else
14907             {
14908               printf (_("<corrupt>"));
14909               p = (unsigned char *) end;
14910             }
14911           putchar ('\n');
14912         }
14913       return p;
14914     }
14915
14916   if ((tag & 2) == 0 && display_proc_gnu_attribute)
14917     return display_proc_gnu_attribute (p, tag, end);
14918
14919   return display_tag_value (tag, p, end);
14920 }
14921
14922 static unsigned char *
14923 display_power_gnu_attribute (unsigned char * p,
14924                              unsigned int tag,
14925                              const unsigned char * const end)
14926 {
14927   unsigned int len;
14928   unsigned int val;
14929
14930   if (tag == Tag_GNU_Power_ABI_FP)
14931     {
14932       val = read_uleb128 (p, &len, end);
14933       p += len;
14934       printf ("  Tag_GNU_Power_ABI_FP: ");
14935       if (len == 0)
14936         {
14937           printf (_("<corrupt>\n"));
14938           return p;
14939         }
14940
14941       if (val > 15)
14942         printf ("(%#x), ", val);
14943
14944       switch (val & 3)
14945         {
14946         case 0:
14947           printf (_("unspecified hard/soft float, "));
14948           break;
14949         case 1:
14950           printf (_("hard float, "));
14951           break;
14952         case 2:
14953           printf (_("soft float, "));
14954           break;
14955         case 3:
14956           printf (_("single-precision hard float, "));
14957           break;
14958         }
14959
14960       switch (val & 0xC)
14961         {
14962         case 0:
14963           printf (_("unspecified long double\n"));
14964           break;
14965         case 4:
14966           printf (_("128-bit IBM long double\n"));
14967           break;
14968         case 8:
14969           printf (_("64-bit long double\n"));
14970           break;
14971         case 12:
14972           printf (_("128-bit IEEE long double\n"));
14973           break;
14974         }
14975       return p;
14976     }
14977
14978   if (tag == Tag_GNU_Power_ABI_Vector)
14979     {
14980       val = read_uleb128 (p, &len, end);
14981       p += len;
14982       printf ("  Tag_GNU_Power_ABI_Vector: ");
14983       if (len == 0)
14984         {
14985           printf (_("<corrupt>\n"));
14986           return p;
14987         }
14988
14989       if (val > 3)
14990         printf ("(%#x), ", val);
14991
14992       switch (val & 3)
14993         {
14994         case 0:
14995           printf (_("unspecified\n"));
14996           break;
14997         case 1:
14998           printf (_("generic\n"));
14999           break;
15000         case 2:
15001           printf ("AltiVec\n");
15002           break;
15003         case 3:
15004           printf ("SPE\n");
15005           break;
15006         }
15007       return p;
15008     }
15009
15010   if (tag == Tag_GNU_Power_ABI_Struct_Return)
15011     {
15012       val = read_uleb128 (p, &len, end);
15013       p += len;
15014       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
15015       if (len == 0)
15016         {
15017           printf (_("<corrupt>\n"));
15018           return p;
15019         }
15020
15021       if (val > 2)
15022         printf ("(%#x), ", val);
15023
15024       switch (val & 3)
15025         {
15026         case 0:
15027           printf (_("unspecified\n"));
15028           break;
15029         case 1:
15030           printf ("r3/r4\n");
15031           break;
15032         case 2:
15033           printf (_("memory\n"));
15034           break;
15035         case 3:
15036           printf ("???\n");
15037           break;
15038         }
15039       return p;
15040     }
15041
15042   return display_tag_value (tag & 1, p, end);
15043 }
15044
15045 static unsigned char *
15046 display_s390_gnu_attribute (unsigned char * p,
15047                             unsigned int tag,
15048                             const unsigned char * const end)
15049 {
15050   unsigned int len;
15051   int val;
15052
15053   if (tag == Tag_GNU_S390_ABI_Vector)
15054     {
15055       val = read_uleb128 (p, &len, end);
15056       p += len;
15057       printf ("  Tag_GNU_S390_ABI_Vector: ");
15058
15059       switch (val)
15060         {
15061         case 0:
15062           printf (_("any\n"));
15063           break;
15064         case 1:
15065           printf (_("software\n"));
15066           break;
15067         case 2:
15068           printf (_("hardware\n"));
15069           break;
15070         default:
15071           printf ("??? (%d)\n", val);
15072           break;
15073         }
15074       return p;
15075    }
15076
15077   return display_tag_value (tag & 1, p, end);
15078 }
15079
15080 static void
15081 display_sparc_hwcaps (unsigned int mask)
15082 {
15083   if (mask)
15084     {
15085       bfd_boolean first = TRUE;
15086
15087       if (mask & ELF_SPARC_HWCAP_MUL32)
15088         fputs ("mul32", stdout), first = FALSE;
15089       if (mask & ELF_SPARC_HWCAP_DIV32)
15090         printf ("%sdiv32", first ? "" : "|"), first = FALSE;
15091       if (mask & ELF_SPARC_HWCAP_FSMULD)
15092         printf ("%sfsmuld", first ? "" : "|"), first = FALSE;
15093       if (mask & ELF_SPARC_HWCAP_V8PLUS)
15094         printf ("%sv8plus", first ? "" : "|"), first = FALSE;
15095       if (mask & ELF_SPARC_HWCAP_POPC)
15096         printf ("%spopc", first ? "" : "|"), first = FALSE;
15097       if (mask & ELF_SPARC_HWCAP_VIS)
15098         printf ("%svis", first ? "" : "|"), first = FALSE;
15099       if (mask & ELF_SPARC_HWCAP_VIS2)
15100         printf ("%svis2", first ? "" : "|"), first = FALSE;
15101       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
15102         printf ("%sASIBlkInit", first ? "" : "|"), first = FALSE;
15103       if (mask & ELF_SPARC_HWCAP_FMAF)
15104         printf ("%sfmaf", first ? "" : "|"), first = FALSE;
15105       if (mask & ELF_SPARC_HWCAP_VIS3)
15106         printf ("%svis3", first ? "" : "|"), first = FALSE;
15107       if (mask & ELF_SPARC_HWCAP_HPC)
15108         printf ("%shpc", first ? "" : "|"), first = FALSE;
15109       if (mask & ELF_SPARC_HWCAP_RANDOM)
15110         printf ("%srandom", first ? "" : "|"), first = FALSE;
15111       if (mask & ELF_SPARC_HWCAP_TRANS)
15112         printf ("%strans", first ? "" : "|"), first = FALSE;
15113       if (mask & ELF_SPARC_HWCAP_FJFMAU)
15114         printf ("%sfjfmau", first ? "" : "|"), first = FALSE;
15115       if (mask & ELF_SPARC_HWCAP_IMA)
15116         printf ("%sima", first ? "" : "|"), first = FALSE;
15117       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
15118         printf ("%scspare", first ? "" : "|"), first = FALSE;
15119     }
15120   else
15121     fputc ('0', stdout);
15122   fputc ('\n', stdout);
15123 }
15124
15125 static void
15126 display_sparc_hwcaps2 (unsigned int mask)
15127 {
15128   if (mask)
15129     {
15130       bfd_boolean first = TRUE;
15131
15132       if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
15133         fputs ("fjathplus", stdout), first = FALSE;
15134       if (mask & ELF_SPARC_HWCAP2_VIS3B)
15135         printf ("%svis3b", first ? "" : "|"), first = FALSE;
15136       if (mask & ELF_SPARC_HWCAP2_ADP)
15137         printf ("%sadp", first ? "" : "|"), first = FALSE;
15138       if (mask & ELF_SPARC_HWCAP2_SPARC5)
15139         printf ("%ssparc5", first ? "" : "|"), first = FALSE;
15140       if (mask & ELF_SPARC_HWCAP2_MWAIT)
15141         printf ("%smwait", first ? "" : "|"), first = FALSE;
15142       if (mask & ELF_SPARC_HWCAP2_XMPMUL)
15143         printf ("%sxmpmul", first ? "" : "|"), first = FALSE;
15144       if (mask & ELF_SPARC_HWCAP2_XMONT)
15145         printf ("%sxmont2", first ? "" : "|"), first = FALSE;
15146       if (mask & ELF_SPARC_HWCAP2_NSEC)
15147         printf ("%snsec", first ? "" : "|"), first = FALSE;
15148       if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
15149         printf ("%sfjathhpc", first ? "" : "|"), first = FALSE;
15150       if (mask & ELF_SPARC_HWCAP2_FJDES)
15151         printf ("%sfjdes", first ? "" : "|"), first = FALSE;
15152       if (mask & ELF_SPARC_HWCAP2_FJAES)
15153         printf ("%sfjaes", first ? "" : "|"), first = FALSE;
15154     }
15155   else
15156     fputc ('0', stdout);
15157   fputc ('\n', stdout);
15158 }
15159
15160 static unsigned char *
15161 display_sparc_gnu_attribute (unsigned char * p,
15162                              unsigned int tag,
15163                              const unsigned char * const end)
15164 {
15165   unsigned int len;
15166   int val;
15167
15168   if (tag == Tag_GNU_Sparc_HWCAPS)
15169     {
15170       val = read_uleb128 (p, &len, end);
15171       p += len;
15172       printf ("  Tag_GNU_Sparc_HWCAPS: ");
15173       display_sparc_hwcaps (val);
15174       return p;
15175     }
15176   if (tag == Tag_GNU_Sparc_HWCAPS2)
15177     {
15178       val = read_uleb128 (p, &len, end);
15179       p += len;
15180       printf ("  Tag_GNU_Sparc_HWCAPS2: ");
15181       display_sparc_hwcaps2 (val);
15182       return p;
15183     }
15184
15185   return display_tag_value (tag, p, end);
15186 }
15187
15188 static void
15189 print_mips_fp_abi_value (unsigned int val)
15190 {
15191   switch (val)
15192     {
15193     case Val_GNU_MIPS_ABI_FP_ANY:
15194       printf (_("Hard or soft float\n"));
15195       break;
15196     case Val_GNU_MIPS_ABI_FP_DOUBLE:
15197       printf (_("Hard float (double precision)\n"));
15198       break;
15199     case Val_GNU_MIPS_ABI_FP_SINGLE:
15200       printf (_("Hard float (single precision)\n"));
15201       break;
15202     case Val_GNU_MIPS_ABI_FP_SOFT:
15203       printf (_("Soft float\n"));
15204       break;
15205     case Val_GNU_MIPS_ABI_FP_OLD_64:
15206       printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
15207       break;
15208     case Val_GNU_MIPS_ABI_FP_XX:
15209       printf (_("Hard float (32-bit CPU, Any FPU)\n"));
15210       break;
15211     case Val_GNU_MIPS_ABI_FP_64:
15212       printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
15213       break;
15214     case Val_GNU_MIPS_ABI_FP_64A:
15215       printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
15216       break;
15217     case Val_GNU_MIPS_ABI_FP_NAN2008:
15218       printf (_("NaN 2008 compatibility\n"));
15219       break;
15220     default:
15221       printf ("??? (%d)\n", val);
15222       break;
15223     }
15224 }
15225
15226 static unsigned char *
15227 display_mips_gnu_attribute (unsigned char * p,
15228                             unsigned int tag,
15229                             const unsigned char * const end)
15230 {
15231   if (tag == Tag_GNU_MIPS_ABI_FP)
15232     {
15233       unsigned int len;
15234       unsigned int val;
15235
15236       val = read_uleb128 (p, &len, end);
15237       p += len;
15238       printf ("  Tag_GNU_MIPS_ABI_FP: ");
15239
15240       print_mips_fp_abi_value (val);
15241
15242       return p;
15243    }
15244
15245   if (tag == Tag_GNU_MIPS_ABI_MSA)
15246     {
15247       unsigned int len;
15248       unsigned int val;
15249
15250       val = read_uleb128 (p, &len, end);
15251       p += len;
15252       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
15253
15254       switch (val)
15255         {
15256         case Val_GNU_MIPS_ABI_MSA_ANY:
15257           printf (_("Any MSA or not\n"));
15258           break;
15259         case Val_GNU_MIPS_ABI_MSA_128:
15260           printf (_("128-bit MSA\n"));
15261           break;
15262         default:
15263           printf ("??? (%d)\n", val);
15264           break;
15265         }
15266       return p;
15267     }
15268
15269   return display_tag_value (tag & 1, p, end);
15270 }
15271
15272 static unsigned char *
15273 display_tic6x_attribute (unsigned char * p,
15274                          const unsigned char * const end)
15275 {
15276   unsigned int tag;
15277   unsigned int len;
15278   int val;
15279
15280   tag = read_uleb128 (p, &len, end);
15281   p += len;
15282
15283   switch (tag)
15284     {
15285     case Tag_ISA:
15286       val = read_uleb128 (p, &len, end);
15287       p += len;
15288       printf ("  Tag_ISA: ");
15289
15290       switch (val)
15291         {
15292         case C6XABI_Tag_ISA_none:
15293           printf (_("None\n"));
15294           break;
15295         case C6XABI_Tag_ISA_C62X:
15296           printf ("C62x\n");
15297           break;
15298         case C6XABI_Tag_ISA_C67X:
15299           printf ("C67x\n");
15300           break;
15301         case C6XABI_Tag_ISA_C67XP:
15302           printf ("C67x+\n");
15303           break;
15304         case C6XABI_Tag_ISA_C64X:
15305           printf ("C64x\n");
15306           break;
15307         case C6XABI_Tag_ISA_C64XP:
15308           printf ("C64x+\n");
15309           break;
15310         case C6XABI_Tag_ISA_C674X:
15311           printf ("C674x\n");
15312           break;
15313         default:
15314           printf ("??? (%d)\n", val);
15315           break;
15316         }
15317       return p;
15318
15319     case Tag_ABI_wchar_t:
15320       val = read_uleb128 (p, &len, end);
15321       p += len;
15322       printf ("  Tag_ABI_wchar_t: ");
15323       switch (val)
15324         {
15325         case 0:
15326           printf (_("Not used\n"));
15327           break;
15328         case 1:
15329           printf (_("2 bytes\n"));
15330           break;
15331         case 2:
15332           printf (_("4 bytes\n"));
15333           break;
15334         default:
15335           printf ("??? (%d)\n", val);
15336           break;
15337         }
15338       return p;
15339
15340     case Tag_ABI_stack_align_needed:
15341       val = read_uleb128 (p, &len, end);
15342       p += len;
15343       printf ("  Tag_ABI_stack_align_needed: ");
15344       switch (val)
15345         {
15346         case 0:
15347           printf (_("8-byte\n"));
15348           break;
15349         case 1:
15350           printf (_("16-byte\n"));
15351           break;
15352         default:
15353           printf ("??? (%d)\n", val);
15354           break;
15355         }
15356       return p;
15357
15358     case Tag_ABI_stack_align_preserved:
15359       val = read_uleb128 (p, &len, end);
15360       p += len;
15361       printf ("  Tag_ABI_stack_align_preserved: ");
15362       switch (val)
15363         {
15364         case 0:
15365           printf (_("8-byte\n"));
15366           break;
15367         case 1:
15368           printf (_("16-byte\n"));
15369           break;
15370         default:
15371           printf ("??? (%d)\n", val);
15372           break;
15373         }
15374       return p;
15375
15376     case Tag_ABI_DSBT:
15377       val = read_uleb128 (p, &len, end);
15378       p += len;
15379       printf ("  Tag_ABI_DSBT: ");
15380       switch (val)
15381         {
15382         case 0:
15383           printf (_("DSBT addressing not used\n"));
15384           break;
15385         case 1:
15386           printf (_("DSBT addressing used\n"));
15387           break;
15388         default:
15389           printf ("??? (%d)\n", val);
15390           break;
15391         }
15392       return p;
15393
15394     case Tag_ABI_PID:
15395       val = read_uleb128 (p, &len, end);
15396       p += len;
15397       printf ("  Tag_ABI_PID: ");
15398       switch (val)
15399         {
15400         case 0:
15401           printf (_("Data addressing position-dependent\n"));
15402           break;
15403         case 1:
15404           printf (_("Data addressing position-independent, GOT near DP\n"));
15405           break;
15406         case 2:
15407           printf (_("Data addressing position-independent, GOT far from DP\n"));
15408           break;
15409         default:
15410           printf ("??? (%d)\n", val);
15411           break;
15412         }
15413       return p;
15414
15415     case Tag_ABI_PIC:
15416       val = read_uleb128 (p, &len, end);
15417       p += len;
15418       printf ("  Tag_ABI_PIC: ");
15419       switch (val)
15420         {
15421         case 0:
15422           printf (_("Code addressing position-dependent\n"));
15423           break;
15424         case 1:
15425           printf (_("Code addressing position-independent\n"));
15426           break;
15427         default:
15428           printf ("??? (%d)\n", val);
15429           break;
15430         }
15431       return p;
15432
15433     case Tag_ABI_array_object_alignment:
15434       val = read_uleb128 (p, &len, end);
15435       p += len;
15436       printf ("  Tag_ABI_array_object_alignment: ");
15437       switch (val)
15438         {
15439         case 0:
15440           printf (_("8-byte\n"));
15441           break;
15442         case 1:
15443           printf (_("4-byte\n"));
15444           break;
15445         case 2:
15446           printf (_("16-byte\n"));
15447           break;
15448         default:
15449           printf ("??? (%d)\n", val);
15450           break;
15451         }
15452       return p;
15453
15454     case Tag_ABI_array_object_align_expected:
15455       val = read_uleb128 (p, &len, end);
15456       p += len;
15457       printf ("  Tag_ABI_array_object_align_expected: ");
15458       switch (val)
15459         {
15460         case 0:
15461           printf (_("8-byte\n"));
15462           break;
15463         case 1:
15464           printf (_("4-byte\n"));
15465           break;
15466         case 2:
15467           printf (_("16-byte\n"));
15468           break;
15469         default:
15470           printf ("??? (%d)\n", val);
15471           break;
15472         }
15473       return p;
15474
15475     case Tag_ABI_compatibility:
15476       {
15477         val = read_uleb128 (p, &len, end);
15478         p += len;
15479         printf ("  Tag_ABI_compatibility: ");
15480         printf (_("flag = %d, vendor = "), val);
15481         if (p < end - 1)
15482           {
15483             size_t maxlen = (end - p) - 1;
15484
15485             print_symbol ((int) maxlen, (const char *) p);
15486             p += strnlen ((char *) p, maxlen) + 1;
15487           }
15488         else
15489           {
15490             printf (_("<corrupt>"));
15491             p = (unsigned char *) end;
15492           }
15493         putchar ('\n');
15494         return p;
15495       }
15496
15497     case Tag_ABI_conformance:
15498       {
15499         printf ("  Tag_ABI_conformance: \"");
15500         if (p < end - 1)
15501           {
15502             size_t maxlen = (end - p) - 1;
15503
15504             print_symbol ((int) maxlen, (const char *) p);
15505             p += strnlen ((char *) p, maxlen) + 1;
15506           }
15507         else
15508           {
15509             printf (_("<corrupt>"));
15510             p = (unsigned char *) end;
15511           }
15512         printf ("\"\n");
15513         return p;
15514       }
15515     }
15516
15517   return display_tag_value (tag, p, end);
15518 }
15519
15520 static void
15521 display_raw_attribute (unsigned char * p, unsigned char const * const end)
15522 {
15523   unsigned long addr = 0;
15524   size_t bytes = end - p;
15525
15526   assert (end >= p);
15527   while (bytes)
15528     {
15529       int j;
15530       int k;
15531       int lbytes = (bytes > 16 ? 16 : bytes);
15532
15533       printf ("  0x%8.8lx ", addr);
15534
15535       for (j = 0; j < 16; j++)
15536         {
15537           if (j < lbytes)
15538             printf ("%2.2x", p[j]);
15539           else
15540             printf ("  ");
15541
15542           if ((j & 3) == 3)
15543             printf (" ");
15544         }
15545
15546       for (j = 0; j < lbytes; j++)
15547         {
15548           k = p[j];
15549           if (k >= ' ' && k < 0x7f)
15550             printf ("%c", k);
15551           else
15552             printf (".");
15553         }
15554
15555       putchar ('\n');
15556
15557       p  += lbytes;
15558       bytes -= lbytes;
15559       addr += lbytes;
15560     }
15561
15562   putchar ('\n');
15563 }
15564
15565 static unsigned char *
15566 display_msp430x_attribute (unsigned char * p,
15567                            const unsigned char * const end)
15568 {
15569   unsigned int len;
15570   unsigned int val;
15571   unsigned int tag;
15572
15573   tag = read_uleb128 (p, & len, end);
15574   p += len;
15575
15576   switch (tag)
15577     {
15578     case OFBA_MSPABI_Tag_ISA:
15579       val = read_uleb128 (p, &len, end);
15580       p += len;
15581       printf ("  Tag_ISA: ");
15582       switch (val)
15583         {
15584         case 0: printf (_("None\n")); break;
15585         case 1: printf (_("MSP430\n")); break;
15586         case 2: printf (_("MSP430X\n")); break;
15587         default: printf ("??? (%d)\n", val); break;
15588         }
15589       break;
15590
15591     case OFBA_MSPABI_Tag_Code_Model:
15592       val = read_uleb128 (p, &len, end);
15593       p += len;
15594       printf ("  Tag_Code_Model: ");
15595       switch (val)
15596         {
15597         case 0: printf (_("None\n")); break;
15598         case 1: printf (_("Small\n")); break;
15599         case 2: printf (_("Large\n")); break;
15600         default: printf ("??? (%d)\n", val); break;
15601         }
15602       break;
15603
15604     case OFBA_MSPABI_Tag_Data_Model:
15605       val = read_uleb128 (p, &len, end);
15606       p += len;
15607       printf ("  Tag_Data_Model: ");
15608       switch (val)
15609         {
15610         case 0: printf (_("None\n")); break;
15611         case 1: printf (_("Small\n")); break;
15612         case 2: printf (_("Large\n")); break;
15613         case 3: printf (_("Restricted Large\n")); break;
15614         default: printf ("??? (%d)\n", val); break;
15615         }
15616       break;
15617
15618     default:
15619       printf (_("  <unknown tag %d>: "), tag);
15620
15621       if (tag & 1)
15622         {
15623           putchar ('"');
15624           if (p < end - 1)
15625             {
15626               size_t maxlen = (end - p) - 1;
15627
15628               print_symbol ((int) maxlen, (const char *) p);
15629               p += strnlen ((char *) p, maxlen) + 1;
15630             }
15631           else
15632             {
15633               printf (_("<corrupt>"));
15634               p = (unsigned char *) end;
15635             }
15636           printf ("\"\n");
15637         }
15638       else
15639         {
15640           val = read_uleb128 (p, &len, end);
15641           p += len;
15642           printf ("%d (0x%x)\n", val, val);
15643         }
15644       break;
15645    }
15646
15647   assert (p <= end);
15648   return p;
15649 }
15650
15651 struct riscv_attr_tag_t {
15652   const char *name;
15653   int tag;
15654 };
15655
15656 static struct riscv_attr_tag_t riscv_attr_tag[] =
15657 {
15658 #define T(tag) {"Tag_RISCV_" #tag, Tag_RISCV_##tag}
15659   T(arch),
15660   T(priv_spec),
15661   T(priv_spec_minor),
15662   T(priv_spec_revision),
15663   T(unaligned_access),
15664   T(stack_align),
15665 #undef T
15666 };
15667
15668 static unsigned char *
15669 display_riscv_attribute (unsigned char *p,
15670                          const unsigned char * const end)
15671 {
15672   unsigned int len;
15673   int val;
15674   int tag;
15675   struct riscv_attr_tag_t *attr = NULL;
15676   unsigned i;
15677
15678   tag = read_uleb128 (p, &len, end);
15679   p += len;
15680
15681   /* Find the name of attribute. */
15682   for (i = 0; i < ARRAY_SIZE (riscv_attr_tag); i++)
15683     {
15684       if (riscv_attr_tag[i].tag == tag)
15685         {
15686           attr = &riscv_attr_tag[i];
15687           break;
15688         }
15689     }
15690
15691   if (attr)
15692     printf ("  %s: ", attr->name);
15693   else
15694     return display_tag_value (tag, p, end);
15695
15696   switch (tag)
15697     {
15698     case Tag_RISCV_priv_spec:
15699     case Tag_RISCV_priv_spec_minor:
15700     case Tag_RISCV_priv_spec_revision:
15701       val = read_uleb128 (p, &len, end);
15702       p += len;
15703       printf (_("%d\n"), val);
15704       break;
15705     case Tag_RISCV_unaligned_access:
15706       val = read_uleb128 (p, &len, end);
15707       p += len;
15708       switch (val)
15709         {
15710         case 0:
15711           printf (_("No unaligned access\n"));
15712           break;
15713         case 1:
15714           printf (_("Unaligned access\n"));
15715           break;
15716         }
15717       break;
15718     case Tag_RISCV_stack_align:
15719       val = read_uleb128 (p, &len, end);
15720       p += len;
15721       printf (_("%d-bytes\n"), val);
15722       break;
15723     case Tag_RISCV_arch:
15724       p = display_tag_value (-1, p, end);
15725       break;
15726     default:
15727       return display_tag_value (tag, p, end);
15728     }
15729
15730   return p;
15731 }
15732
15733 static bfd_boolean
15734 process_attributes (Filedata * filedata,
15735                     const char * public_name,
15736                     unsigned int proc_type,
15737                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
15738                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const))
15739 {
15740   Elf_Internal_Shdr * sect;
15741   unsigned i;
15742   bfd_boolean res = TRUE;
15743
15744   /* Find the section header so that we get the size.  */
15745   for (i = 0, sect = filedata->section_headers;
15746        i < filedata->file_header.e_shnum;
15747        i++, sect++)
15748     {
15749       unsigned char * contents;
15750       unsigned char * p;
15751
15752       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
15753         continue;
15754
15755       contents = (unsigned char *) get_data (NULL, filedata, sect->sh_offset, 1,
15756                                              sect->sh_size, _("attributes"));
15757       if (contents == NULL)
15758         {
15759           res = FALSE;
15760           continue;
15761         }
15762
15763       p = contents;
15764       /* The first character is the version of the attributes.
15765          Currently only version 1, (aka 'A') is recognised here.  */
15766       if (*p != 'A')
15767         {
15768           printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p);
15769           res = FALSE;
15770         }
15771       else
15772         {
15773           bfd_vma section_len;
15774
15775           section_len = sect->sh_size - 1;
15776           p++;
15777
15778           while (section_len > 0)
15779             {
15780               bfd_vma attr_len;
15781               unsigned int namelen;
15782               bfd_boolean public_section;
15783               bfd_boolean gnu_section;
15784
15785               if (section_len <= 4)
15786                 {
15787                   error (_("Tag section ends prematurely\n"));
15788                   res = FALSE;
15789                   break;
15790                 }
15791               attr_len = byte_get (p, 4);
15792               p += 4;
15793
15794               if (attr_len > section_len)
15795                 {
15796                   error (_("Bad attribute length (%u > %u)\n"),
15797                           (unsigned) attr_len, (unsigned) section_len);
15798                   attr_len = section_len;
15799                   res = FALSE;
15800                 }
15801               /* PR 17531: file: 001-101425-0.004  */
15802               else if (attr_len < 5)
15803                 {
15804                   error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
15805                   res = FALSE;
15806                   break;
15807                 }
15808
15809               section_len -= attr_len;
15810               attr_len -= 4;
15811
15812               namelen = strnlen ((char *) p, attr_len) + 1;
15813               if (namelen == 0 || namelen >= attr_len)
15814                 {
15815                   error (_("Corrupt attribute section name\n"));
15816                   res = FALSE;
15817                   break;
15818                 }
15819
15820               printf (_("Attribute Section: "));
15821               print_symbol (INT_MAX, (const char *) p);
15822               putchar ('\n');
15823
15824               if (public_name && streq ((char *) p, public_name))
15825                 public_section = TRUE;
15826               else
15827                 public_section = FALSE;
15828
15829               if (streq ((char *) p, "gnu"))
15830                 gnu_section = TRUE;
15831               else
15832                 gnu_section = FALSE;
15833
15834               p += namelen;
15835               attr_len -= namelen;
15836
15837               while (attr_len > 0 && p < contents + sect->sh_size)
15838                 {
15839                   int tag;
15840                   int val;
15841                   bfd_vma size;
15842                   unsigned char * end;
15843
15844                   /* PR binutils/17531: Safe handling of corrupt files.  */
15845                   if (attr_len < 6)
15846                     {
15847                       error (_("Unused bytes at end of section\n"));
15848                       res = FALSE;
15849                       section_len = 0;
15850                       break;
15851                     }
15852
15853                   tag = *(p++);
15854                   size = byte_get (p, 4);
15855                   if (size > attr_len)
15856                     {
15857                       error (_("Bad subsection length (%u > %u)\n"),
15858                               (unsigned) size, (unsigned) attr_len);
15859                       res = FALSE;
15860                       size = attr_len;
15861                     }
15862                   /* PR binutils/17531: Safe handling of corrupt files.  */
15863                   if (size < 6)
15864                     {
15865                       error (_("Bad subsection length (%u < 6)\n"),
15866                               (unsigned) size);
15867                       res = FALSE;
15868                       section_len = 0;
15869                       break;
15870                     }
15871
15872                   attr_len -= size;
15873                   end = p + size - 1;
15874                   assert (end <= contents + sect->sh_size);
15875                   p += 4;
15876
15877                   switch (tag)
15878                     {
15879                     case 1:
15880                       printf (_("File Attributes\n"));
15881                       break;
15882                     case 2:
15883                       printf (_("Section Attributes:"));
15884                       goto do_numlist;
15885                     case 3:
15886                       printf (_("Symbol Attributes:"));
15887                       /* Fall through.  */
15888                     do_numlist:
15889                       for (;;)
15890                         {
15891                           unsigned int j;
15892
15893                           val = read_uleb128 (p, &j, end);
15894                           p += j;
15895                           if (val == 0)
15896                             break;
15897                           printf (" %d", val);
15898                         }
15899                       printf ("\n");
15900                       break;
15901                     default:
15902                       printf (_("Unknown tag: %d\n"), tag);
15903                       public_section = FALSE;
15904                       break;
15905                     }
15906
15907                   if (public_section && display_pub_attribute != NULL)
15908                     {
15909                       while (p < end)
15910                         p = display_pub_attribute (p, end);
15911                       assert (p == end);
15912                     }
15913                   else if (gnu_section && display_proc_gnu_attribute != NULL)
15914                     {
15915                       while (p < end)
15916                         p = display_gnu_attribute (p,
15917                                                    display_proc_gnu_attribute,
15918                                                    end);
15919                       assert (p == end);
15920                     }
15921                   else if (p < end)
15922                     {
15923                       printf (_("  Unknown attribute:\n"));
15924                       display_raw_attribute (p, end);
15925                       p = end;
15926                     }
15927                   else
15928                     attr_len = 0;
15929                 }
15930             }
15931         }
15932
15933       free (contents);
15934     }
15935
15936   return res;
15937 }
15938
15939 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
15940    Print the Address, Access and Initial fields of an entry at VMA ADDR
15941    and return the VMA of the next entry, or -1 if there was a problem.
15942    Does not read from DATA_END or beyond.  */
15943
15944 static bfd_vma
15945 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
15946                       unsigned char * data_end)
15947 {
15948   printf ("  ");
15949   print_vma (addr, LONG_HEX);
15950   printf (" ");
15951   if (addr < pltgot + 0xfff0)
15952     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
15953   else
15954     printf ("%10s", "");
15955   printf (" ");
15956   if (data == NULL)
15957     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15958   else
15959     {
15960       bfd_vma entry;
15961       unsigned char * from = data + addr - pltgot;
15962
15963       if (from + (is_32bit_elf ? 4 : 8) > data_end)
15964         {
15965           warn (_("MIPS GOT entry extends beyond the end of available data\n"));
15966           printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
15967           return (bfd_vma) -1;
15968         }
15969       else
15970         {
15971           entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15972           print_vma (entry, LONG_HEX);
15973         }
15974     }
15975   return addr + (is_32bit_elf ? 4 : 8);
15976 }
15977
15978 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
15979    PLTGOT.  Print the Address and Initial fields of an entry at VMA
15980    ADDR and return the VMA of the next entry.  */
15981
15982 static bfd_vma
15983 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
15984 {
15985   printf ("  ");
15986   print_vma (addr, LONG_HEX);
15987   printf (" ");
15988   if (data == NULL)
15989     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15990   else
15991     {
15992       bfd_vma entry;
15993
15994       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15995       print_vma (entry, LONG_HEX);
15996     }
15997   return addr + (is_32bit_elf ? 4 : 8);
15998 }
15999
16000 static void
16001 print_mips_ases (unsigned int mask)
16002 {
16003   if (mask & AFL_ASE_DSP)
16004     fputs ("\n\tDSP ASE", stdout);
16005   if (mask & AFL_ASE_DSPR2)
16006     fputs ("\n\tDSP R2 ASE", stdout);
16007   if (mask & AFL_ASE_DSPR3)
16008     fputs ("\n\tDSP R3 ASE", stdout);
16009   if (mask & AFL_ASE_EVA)
16010     fputs ("\n\tEnhanced VA Scheme", stdout);
16011   if (mask & AFL_ASE_MCU)
16012     fputs ("\n\tMCU (MicroController) ASE", stdout);
16013   if (mask & AFL_ASE_MDMX)
16014     fputs ("\n\tMDMX ASE", stdout);
16015   if (mask & AFL_ASE_MIPS3D)
16016     fputs ("\n\tMIPS-3D ASE", stdout);
16017   if (mask & AFL_ASE_MT)
16018     fputs ("\n\tMT ASE", stdout);
16019   if (mask & AFL_ASE_SMARTMIPS)
16020     fputs ("\n\tSmartMIPS ASE", stdout);
16021   if (mask & AFL_ASE_VIRT)
16022     fputs ("\n\tVZ ASE", stdout);
16023   if (mask & AFL_ASE_MSA)
16024     fputs ("\n\tMSA ASE", stdout);
16025   if (mask & AFL_ASE_MIPS16)
16026     fputs ("\n\tMIPS16 ASE", stdout);
16027   if (mask & AFL_ASE_MICROMIPS)
16028     fputs ("\n\tMICROMIPS ASE", stdout);
16029   if (mask & AFL_ASE_XPA)
16030     fputs ("\n\tXPA ASE", stdout);
16031   if (mask & AFL_ASE_MIPS16E2)
16032     fputs ("\n\tMIPS16e2 ASE", stdout);
16033   if (mask & AFL_ASE_CRC)
16034     fputs ("\n\tCRC ASE", stdout);
16035   if (mask & AFL_ASE_GINV)
16036     fputs ("\n\tGINV ASE", stdout);
16037   if (mask & AFL_ASE_LOONGSON_MMI)
16038     fputs ("\n\tLoongson MMI ASE", stdout);
16039   if (mask & AFL_ASE_LOONGSON_CAM)
16040     fputs ("\n\tLoongson CAM ASE", stdout);
16041   if (mask & AFL_ASE_LOONGSON_EXT)
16042     fputs ("\n\tLoongson EXT ASE", stdout);
16043   if (mask & AFL_ASE_LOONGSON_EXT2)
16044     fputs ("\n\tLoongson EXT2 ASE", stdout);
16045   if (mask == 0)
16046     fprintf (stdout, "\n\t%s", _("None"));
16047   else if ((mask & ~AFL_ASE_MASK) != 0)
16048     fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
16049 }
16050
16051 static void
16052 print_mips_isa_ext (unsigned int isa_ext)
16053 {
16054   switch (isa_ext)
16055     {
16056     case 0:
16057       fputs (_("None"), stdout);
16058       break;
16059     case AFL_EXT_XLR:
16060       fputs ("RMI XLR", stdout);
16061       break;
16062     case AFL_EXT_OCTEON3:
16063       fputs ("Cavium Networks Octeon3", stdout);
16064       break;
16065     case AFL_EXT_OCTEON2:
16066       fputs ("Cavium Networks Octeon2", stdout);
16067       break;
16068     case AFL_EXT_OCTEONP:
16069       fputs ("Cavium Networks OcteonP", stdout);
16070       break;
16071     case AFL_EXT_OCTEON:
16072       fputs ("Cavium Networks Octeon", stdout);
16073       break;
16074     case AFL_EXT_5900:
16075       fputs ("Toshiba R5900", stdout);
16076       break;
16077     case AFL_EXT_4650:
16078       fputs ("MIPS R4650", stdout);
16079       break;
16080     case AFL_EXT_4010:
16081       fputs ("LSI R4010", stdout);
16082       break;
16083     case AFL_EXT_4100:
16084       fputs ("NEC VR4100", stdout);
16085       break;
16086     case AFL_EXT_3900:
16087       fputs ("Toshiba R3900", stdout);
16088       break;
16089     case AFL_EXT_10000:
16090       fputs ("MIPS R10000", stdout);
16091       break;
16092     case AFL_EXT_SB1:
16093       fputs ("Broadcom SB-1", stdout);
16094       break;
16095     case AFL_EXT_4111:
16096       fputs ("NEC VR4111/VR4181", stdout);
16097       break;
16098     case AFL_EXT_4120:
16099       fputs ("NEC VR4120", stdout);
16100       break;
16101     case AFL_EXT_5400:
16102       fputs ("NEC VR5400", stdout);
16103       break;
16104     case AFL_EXT_5500:
16105       fputs ("NEC VR5500", stdout);
16106       break;
16107     case AFL_EXT_LOONGSON_2E:
16108       fputs ("ST Microelectronics Loongson 2E", stdout);
16109       break;
16110     case AFL_EXT_LOONGSON_2F:
16111       fputs ("ST Microelectronics Loongson 2F", stdout);
16112       break;
16113     case AFL_EXT_INTERAPTIV_MR2:
16114       fputs ("Imagination interAptiv MR2", stdout);
16115       break;
16116     default:
16117       fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
16118     }
16119 }
16120
16121 static signed int
16122 get_mips_reg_size (int reg_size)
16123 {
16124   return (reg_size == AFL_REG_NONE) ? 0
16125          : (reg_size == AFL_REG_32) ? 32
16126          : (reg_size == AFL_REG_64) ? 64
16127          : (reg_size == AFL_REG_128) ? 128
16128          : -1;
16129 }
16130
16131 static bfd_boolean
16132 process_mips_specific (Filedata * filedata)
16133 {
16134   Elf_Internal_Dyn * entry;
16135   Elf_Internal_Shdr *sect = NULL;
16136   size_t liblist_offset = 0;
16137   size_t liblistno = 0;
16138   size_t conflictsno = 0;
16139   size_t options_offset = 0;
16140   size_t conflicts_offset = 0;
16141   size_t pltrelsz = 0;
16142   size_t pltrel = 0;
16143   bfd_vma pltgot = 0;
16144   bfd_vma mips_pltgot = 0;
16145   bfd_vma jmprel = 0;
16146   bfd_vma local_gotno = 0;
16147   bfd_vma gotsym = 0;
16148   bfd_vma symtabno = 0;
16149   bfd_boolean res = TRUE;
16150
16151   if (! process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
16152                             display_mips_gnu_attribute))
16153     res = FALSE;
16154
16155   sect = find_section (filedata, ".MIPS.abiflags");
16156
16157   if (sect != NULL)
16158     {
16159       Elf_External_ABIFlags_v0 *abiflags_ext;
16160       Elf_Internal_ABIFlags_v0 abiflags_in;
16161
16162       if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
16163         {
16164           error (_("Corrupt MIPS ABI Flags section.\n"));
16165           res = FALSE;
16166         }
16167       else
16168         {
16169           abiflags_ext = get_data (NULL, filedata, sect->sh_offset, 1,
16170                                    sect->sh_size, _("MIPS ABI Flags section"));
16171           if (abiflags_ext)
16172             {
16173               abiflags_in.version = BYTE_GET (abiflags_ext->version);
16174               abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
16175               abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
16176               abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
16177               abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
16178               abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
16179               abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
16180               abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
16181               abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
16182               abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
16183               abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
16184
16185               printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
16186               printf ("\nISA: MIPS%d", abiflags_in.isa_level);
16187               if (abiflags_in.isa_rev > 1)
16188                 printf ("r%d", abiflags_in.isa_rev);
16189               printf ("\nGPR size: %d",
16190                       get_mips_reg_size (abiflags_in.gpr_size));
16191               printf ("\nCPR1 size: %d",
16192                       get_mips_reg_size (abiflags_in.cpr1_size));
16193               printf ("\nCPR2 size: %d",
16194                       get_mips_reg_size (abiflags_in.cpr2_size));
16195               fputs ("\nFP ABI: ", stdout);
16196               print_mips_fp_abi_value (abiflags_in.fp_abi);
16197               fputs ("ISA Extension: ", stdout);
16198               print_mips_isa_ext (abiflags_in.isa_ext);
16199               fputs ("\nASEs:", stdout);
16200               print_mips_ases (abiflags_in.ases);
16201               printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
16202               printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
16203               fputc ('\n', stdout);
16204               free (abiflags_ext);
16205             }
16206         }
16207     }
16208
16209   /* We have a lot of special sections.  Thanks SGI!  */
16210   if (dynamic_section == NULL)
16211     {
16212       /* No dynamic information available.  See if there is static GOT.  */
16213       sect = find_section (filedata, ".got");
16214       if (sect != NULL)
16215         {
16216           unsigned char *data_end;
16217           unsigned char *data;
16218           bfd_vma ent, end;
16219           int addr_size;
16220
16221           pltgot = sect->sh_addr;
16222
16223           ent = pltgot;
16224           addr_size = (is_32bit_elf ? 4 : 8);
16225           end = pltgot + sect->sh_size;
16226
16227           data = (unsigned char *) get_data (NULL, filedata, sect->sh_offset,
16228                                              end - pltgot, 1,
16229                                              _("Global Offset Table data"));
16230           /* PR 12855: Null data is handled gracefully throughout.  */
16231           data_end = data + (end - pltgot);
16232
16233           printf (_("\nStatic GOT:\n"));
16234           printf (_(" Canonical gp value: "));
16235           print_vma (ent + 0x7ff0, LONG_HEX);
16236           printf ("\n\n");
16237
16238           /* In a dynamic binary GOT[0] is reserved for the dynamic
16239              loader to store the lazy resolver pointer, however in
16240              a static binary it may well have been omitted and GOT
16241              reduced to a table of addresses.
16242              PR 21344: Check for the entry being fully available
16243              before fetching it.  */
16244           if (data
16245               && data + ent - pltgot + addr_size <= data_end
16246               && byte_get (data + ent - pltgot, addr_size) == 0)
16247             {
16248               printf (_(" Reserved entries:\n"));
16249               printf (_("  %*s %10s %*s\n"),
16250                       addr_size * 2, _("Address"), _("Access"),
16251                       addr_size * 2, _("Value"));
16252               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16253               printf ("\n");
16254               if (ent == (bfd_vma) -1)
16255                 goto sgot_print_fail;
16256
16257               /* Check for the MSB of GOT[1] being set, identifying a
16258                  GNU object.  This entry will be used by some runtime
16259                  loaders, to store the module pointer.  Otherwise this
16260                  is an ordinary local entry.
16261                  PR 21344: Check for the entry being fully available
16262                  before fetching it.  */
16263               if (data
16264                   && data + ent - pltgot + addr_size <= data_end
16265                   && (byte_get (data + ent - pltgot, addr_size)
16266                       >> (addr_size * 8 - 1)) != 0)
16267                 {
16268                   ent = print_mips_got_entry (data, pltgot, ent, data_end);
16269                   printf ("\n");
16270                   if (ent == (bfd_vma) -1)
16271                     goto sgot_print_fail;
16272                 }
16273               printf ("\n");
16274             }
16275
16276           if (data != NULL && ent < end)
16277             {
16278               printf (_(" Local entries:\n"));
16279               printf ("  %*s %10s %*s\n",
16280                       addr_size * 2, _("Address"), _("Access"),
16281                       addr_size * 2, _("Value"));
16282               while (ent < end)
16283                 {
16284                   ent = print_mips_got_entry (data, pltgot, ent, data_end);
16285                   printf ("\n");
16286                   if (ent == (bfd_vma) -1)
16287                     goto sgot_print_fail;
16288                 }
16289               printf ("\n");
16290             }
16291
16292         sgot_print_fail:
16293           if (data)
16294             free (data);
16295         }
16296       return res;
16297     }
16298
16299   for (entry = dynamic_section;
16300        /* PR 17531 file: 012-50589-0.004.  */
16301        entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
16302        ++entry)
16303     switch (entry->d_tag)
16304       {
16305       case DT_MIPS_LIBLIST:
16306         liblist_offset
16307           = offset_from_vma (filedata, entry->d_un.d_val,
16308                              liblistno * sizeof (Elf32_External_Lib));
16309         break;
16310       case DT_MIPS_LIBLISTNO:
16311         liblistno = entry->d_un.d_val;
16312         break;
16313       case DT_MIPS_OPTIONS:
16314         options_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
16315         break;
16316       case DT_MIPS_CONFLICT:
16317         conflicts_offset
16318           = offset_from_vma (filedata, entry->d_un.d_val,
16319                              conflictsno * sizeof (Elf32_External_Conflict));
16320         break;
16321       case DT_MIPS_CONFLICTNO:
16322         conflictsno = entry->d_un.d_val;
16323         break;
16324       case DT_PLTGOT:
16325         pltgot = entry->d_un.d_ptr;
16326         break;
16327       case DT_MIPS_LOCAL_GOTNO:
16328         local_gotno = entry->d_un.d_val;
16329         break;
16330       case DT_MIPS_GOTSYM:
16331         gotsym = entry->d_un.d_val;
16332         break;
16333       case DT_MIPS_SYMTABNO:
16334         symtabno = entry->d_un.d_val;
16335         break;
16336       case DT_MIPS_PLTGOT:
16337         mips_pltgot = entry->d_un.d_ptr;
16338         break;
16339       case DT_PLTREL:
16340         pltrel = entry->d_un.d_val;
16341         break;
16342       case DT_PLTRELSZ:
16343         pltrelsz = entry->d_un.d_val;
16344         break;
16345       case DT_JMPREL:
16346         jmprel = entry->d_un.d_ptr;
16347         break;
16348       default:
16349         break;
16350       }
16351
16352   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
16353     {
16354       Elf32_External_Lib * elib;
16355       size_t cnt;
16356
16357       elib = (Elf32_External_Lib *) get_data (NULL, filedata, liblist_offset,
16358                                               liblistno,
16359                                               sizeof (Elf32_External_Lib),
16360                                               _("liblist section data"));
16361       if (elib)
16362         {
16363           printf (ngettext ("\nSection '.liblist' contains %lu entry:\n",
16364                             "\nSection '.liblist' contains %lu entries:\n",
16365                             (unsigned long) liblistno),
16366                   (unsigned long) liblistno);
16367           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
16368                  stdout);
16369
16370           for (cnt = 0; cnt < liblistno; ++cnt)
16371             {
16372               Elf32_Lib liblist;
16373               time_t atime;
16374               char timebuf[128];
16375               struct tm * tmp;
16376
16377               liblist.l_name = BYTE_GET (elib[cnt].l_name);
16378               atime = BYTE_GET (elib[cnt].l_time_stamp);
16379               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16380               liblist.l_version = BYTE_GET (elib[cnt].l_version);
16381               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16382
16383               tmp = gmtime (&atime);
16384               snprintf (timebuf, sizeof (timebuf),
16385                         "%04u-%02u-%02uT%02u:%02u:%02u",
16386                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16387                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16388
16389               printf ("%3lu: ", (unsigned long) cnt);
16390               if (VALID_DYNAMIC_NAME (liblist.l_name))
16391                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
16392               else
16393                 printf (_("<corrupt: %9ld>"), liblist.l_name);
16394               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
16395                       liblist.l_version);
16396
16397               if (liblist.l_flags == 0)
16398                 puts (_(" NONE"));
16399               else
16400                 {
16401                   static const struct
16402                   {
16403                     const char * name;
16404                     int bit;
16405                   }
16406                   l_flags_vals[] =
16407                   {
16408                     { " EXACT_MATCH", LL_EXACT_MATCH },
16409                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
16410                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
16411                     { " EXPORTS", LL_EXPORTS },
16412                     { " DELAY_LOAD", LL_DELAY_LOAD },
16413                     { " DELTA", LL_DELTA }
16414                   };
16415                   int flags = liblist.l_flags;
16416                   size_t fcnt;
16417
16418                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
16419                     if ((flags & l_flags_vals[fcnt].bit) != 0)
16420                       {
16421                         fputs (l_flags_vals[fcnt].name, stdout);
16422                         flags ^= l_flags_vals[fcnt].bit;
16423                       }
16424                   if (flags != 0)
16425                     printf (" %#x", (unsigned int) flags);
16426
16427                   puts ("");
16428                 }
16429             }
16430
16431           free (elib);
16432         }
16433       else
16434         res = FALSE;
16435     }
16436
16437   if (options_offset != 0)
16438     {
16439       Elf_External_Options * eopt;
16440       Elf_Internal_Options * iopt;
16441       Elf_Internal_Options * option;
16442       size_t offset;
16443       int cnt;
16444       sect = filedata->section_headers;
16445
16446       /* Find the section header so that we get the size.  */
16447       sect = find_section_by_type (filedata, SHT_MIPS_OPTIONS);
16448       /* PR 17533 file: 012-277276-0.004.  */
16449       if (sect == NULL)
16450         {
16451           error (_("No MIPS_OPTIONS header found\n"));
16452           return FALSE;
16453         }
16454       /* PR 24243  */
16455       if (sect->sh_size < sizeof (* eopt))
16456         {
16457           error (_("The MIPS options section is too small.\n"));
16458           return FALSE;
16459         }
16460
16461       eopt = (Elf_External_Options *) get_data (NULL, filedata, options_offset, 1,
16462                                                 sect->sh_size, _("options"));
16463       if (eopt)
16464         {
16465           iopt = (Elf_Internal_Options *)
16466               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
16467           if (iopt == NULL)
16468             {
16469               error (_("Out of memory allocating space for MIPS options\n"));
16470               return FALSE;
16471             }
16472
16473           offset = cnt = 0;
16474           option = iopt;
16475
16476           while (offset <= sect->sh_size - sizeof (* eopt))
16477             {
16478               Elf_External_Options * eoption;
16479
16480               eoption = (Elf_External_Options *) ((char *) eopt + offset);
16481
16482               option->kind = BYTE_GET (eoption->kind);
16483               option->size = BYTE_GET (eoption->size);
16484               option->section = BYTE_GET (eoption->section);
16485               option->info = BYTE_GET (eoption->info);
16486
16487               /* PR 17531: file: ffa0fa3b.  */
16488               if (option->size < sizeof (* eopt)
16489                   || offset + option->size > sect->sh_size)
16490                 {
16491                   error (_("Invalid size (%u) for MIPS option\n"), option->size);
16492                   return FALSE;
16493                 }
16494               offset += option->size;
16495
16496               ++option;
16497               ++cnt;
16498             }
16499
16500           printf (ngettext ("\nSection '%s' contains %d entry:\n",
16501                             "\nSection '%s' contains %d entries:\n",
16502                             cnt),
16503                   printable_section_name (filedata, sect), cnt);
16504
16505           option = iopt;
16506           offset = 0;
16507
16508           while (cnt-- > 0)
16509             {
16510               size_t len;
16511
16512               switch (option->kind)
16513                 {
16514                 case ODK_NULL:
16515                   /* This shouldn't happen.  */
16516                   printf (" NULL       %d %lx", option->section, option->info);
16517                   break;
16518                 case ODK_REGINFO:
16519                   printf (" REGINFO    ");
16520                   if (filedata->file_header.e_machine == EM_MIPS)
16521                     {
16522                       /* 32bit form.  */
16523                       Elf32_External_RegInfo * ereg;
16524                       Elf32_RegInfo reginfo;
16525
16526                       ereg = (Elf32_External_RegInfo *) (option + 1);
16527                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
16528                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16529                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16530                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16531                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16532                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
16533
16534                       printf ("GPR %08lx  GP 0x%lx\n",
16535                               reginfo.ri_gprmask,
16536                               (unsigned long) reginfo.ri_gp_value);
16537                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
16538                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16539                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16540                     }
16541                   else
16542                     {
16543                       /* 64 bit form.  */
16544                       Elf64_External_RegInfo * ereg;
16545                       Elf64_Internal_RegInfo reginfo;
16546
16547                       ereg = (Elf64_External_RegInfo *) (option + 1);
16548                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
16549                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16550                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16551                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16552                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16553                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
16554
16555                       printf ("GPR %08lx  GP 0x",
16556                               reginfo.ri_gprmask);
16557                       printf_vma (reginfo.ri_gp_value);
16558                       printf ("\n");
16559
16560                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
16561                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16562                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16563                     }
16564                   ++option;
16565                   continue;
16566                 case ODK_EXCEPTIONS:
16567                   fputs (" EXCEPTIONS fpe_min(", stdout);
16568                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
16569                   fputs (") fpe_max(", stdout);
16570                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
16571                   fputs (")", stdout);
16572
16573                   if (option->info & OEX_PAGE0)
16574                     fputs (" PAGE0", stdout);
16575                   if (option->info & OEX_SMM)
16576                     fputs (" SMM", stdout);
16577                   if (option->info & OEX_FPDBUG)
16578                     fputs (" FPDBUG", stdout);
16579                   if (option->info & OEX_DISMISS)
16580                     fputs (" DISMISS", stdout);
16581                   break;
16582                 case ODK_PAD:
16583                   fputs (" PAD       ", stdout);
16584                   if (option->info & OPAD_PREFIX)
16585                     fputs (" PREFIX", stdout);
16586                   if (option->info & OPAD_POSTFIX)
16587                     fputs (" POSTFIX", stdout);
16588                   if (option->info & OPAD_SYMBOL)
16589                     fputs (" SYMBOL", stdout);
16590                   break;
16591                 case ODK_HWPATCH:
16592                   fputs (" HWPATCH   ", stdout);
16593                   if (option->info & OHW_R4KEOP)
16594                     fputs (" R4KEOP", stdout);
16595                   if (option->info & OHW_R8KPFETCH)
16596                     fputs (" R8KPFETCH", stdout);
16597                   if (option->info & OHW_R5KEOP)
16598                     fputs (" R5KEOP", stdout);
16599                   if (option->info & OHW_R5KCVTL)
16600                     fputs (" R5KCVTL", stdout);
16601                   break;
16602                 case ODK_FILL:
16603                   fputs (" FILL       ", stdout);
16604                   /* XXX Print content of info word?  */
16605                   break;
16606                 case ODK_TAGS:
16607                   fputs (" TAGS       ", stdout);
16608                   /* XXX Print content of info word?  */
16609                   break;
16610                 case ODK_HWAND:
16611                   fputs (" HWAND     ", stdout);
16612                   if (option->info & OHWA0_R4KEOP_CHECKED)
16613                     fputs (" R4KEOP_CHECKED", stdout);
16614                   if (option->info & OHWA0_R4KEOP_CLEAN)
16615                     fputs (" R4KEOP_CLEAN", stdout);
16616                   break;
16617                 case ODK_HWOR:
16618                   fputs (" HWOR      ", stdout);
16619                   if (option->info & OHWA0_R4KEOP_CHECKED)
16620                     fputs (" R4KEOP_CHECKED", stdout);
16621                   if (option->info & OHWA0_R4KEOP_CLEAN)
16622                     fputs (" R4KEOP_CLEAN", stdout);
16623                   break;
16624                 case ODK_GP_GROUP:
16625                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
16626                           option->info & OGP_GROUP,
16627                           (option->info & OGP_SELF) >> 16);
16628                   break;
16629                 case ODK_IDENT:
16630                   printf (" IDENT     %#06lx  self-contained %#06lx",
16631                           option->info & OGP_GROUP,
16632                           (option->info & OGP_SELF) >> 16);
16633                   break;
16634                 default:
16635                   /* This shouldn't happen.  */
16636                   printf (" %3d ???     %d %lx",
16637                           option->kind, option->section, option->info);
16638                   break;
16639                 }
16640
16641               len = sizeof (* eopt);
16642               while (len < option->size)
16643                 {
16644                   unsigned char datum = * ((unsigned char *) eopt + offset + len);
16645
16646                   if (ISPRINT (datum))
16647                     printf ("%c", datum);
16648                   else
16649                     printf ("\\%03o", datum);
16650                   len ++;
16651                 }
16652               fputs ("\n", stdout);
16653
16654               offset += option->size;
16655               ++option;
16656             }
16657
16658           free (eopt);
16659         }
16660       else
16661         res = FALSE;
16662     }
16663
16664   if (conflicts_offset != 0 && conflictsno != 0)
16665     {
16666       Elf32_Conflict * iconf;
16667       size_t cnt;
16668
16669       if (dynamic_symbols == NULL)
16670         {
16671           error (_("conflict list found without a dynamic symbol table\n"));
16672           return FALSE;
16673         }
16674
16675       /* PR 21345 - print a slightly more helpful error message
16676          if we are sure that the cmalloc will fail.  */
16677       if (conflictsno * sizeof (* iconf) > filedata->file_size)
16678         {
16679           error (_("Overlarge number of conflicts detected: %lx\n"),
16680                  (long) conflictsno);
16681           return FALSE;
16682         }
16683
16684       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
16685       if (iconf == NULL)
16686         {
16687           error (_("Out of memory allocating space for dynamic conflicts\n"));
16688           return FALSE;
16689         }
16690
16691       if (is_32bit_elf)
16692         {
16693           Elf32_External_Conflict * econf32;
16694
16695           econf32 = (Elf32_External_Conflict *)
16696               get_data (NULL, filedata, conflicts_offset, conflictsno,
16697                         sizeof (* econf32), _("conflict"));
16698           if (!econf32)
16699             return FALSE;
16700
16701           for (cnt = 0; cnt < conflictsno; ++cnt)
16702             iconf[cnt] = BYTE_GET (econf32[cnt]);
16703
16704           free (econf32);
16705         }
16706       else
16707         {
16708           Elf64_External_Conflict * econf64;
16709
16710           econf64 = (Elf64_External_Conflict *)
16711               get_data (NULL, filedata, conflicts_offset, conflictsno,
16712                         sizeof (* econf64), _("conflict"));
16713           if (!econf64)
16714             return FALSE;
16715
16716           for (cnt = 0; cnt < conflictsno; ++cnt)
16717             iconf[cnt] = BYTE_GET (econf64[cnt]);
16718
16719           free (econf64);
16720         }
16721
16722       printf (ngettext ("\nSection '.conflict' contains %lu entry:\n",
16723                         "\nSection '.conflict' contains %lu entries:\n",
16724                         (unsigned long) conflictsno),
16725               (unsigned long) conflictsno);
16726       puts (_("  Num:    Index       Value  Name"));
16727
16728       for (cnt = 0; cnt < conflictsno; ++cnt)
16729         {
16730           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
16731
16732           if (iconf[cnt] >= num_dynamic_syms)
16733             printf (_("<corrupt symbol index>"));
16734           else
16735             {
16736               Elf_Internal_Sym * psym;
16737
16738               psym = & dynamic_symbols[iconf[cnt]];
16739               print_vma (psym->st_value, FULL_HEX);
16740               putchar (' ');
16741               if (VALID_DYNAMIC_NAME (psym->st_name))
16742                 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
16743               else
16744                 printf (_("<corrupt: %14ld>"), psym->st_name);
16745             }
16746           putchar ('\n');
16747         }
16748
16749       free (iconf);
16750     }
16751
16752   if (pltgot != 0 && local_gotno != 0)
16753     {
16754       bfd_vma ent, local_end, global_end;
16755       size_t i, offset;
16756       unsigned char * data;
16757       unsigned char * data_end;
16758       int addr_size;
16759
16760       ent = pltgot;
16761       addr_size = (is_32bit_elf ? 4 : 8);
16762       local_end = pltgot + local_gotno * addr_size;
16763
16764       /* PR binutils/17533 file: 012-111227-0.004  */
16765       if (symtabno < gotsym)
16766         {
16767           error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
16768                  (unsigned long) gotsym, (unsigned long) symtabno);
16769           return FALSE;
16770         }
16771
16772       global_end = local_end + (symtabno - gotsym) * addr_size;
16773       /* PR 17531: file: 54c91a34.  */
16774       if (global_end < local_end)
16775         {
16776           error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
16777           return FALSE;
16778         }
16779
16780       offset = offset_from_vma (filedata, pltgot, global_end - pltgot);
16781       data = (unsigned char *) get_data (NULL, filedata, offset,
16782                                          global_end - pltgot, 1,
16783                                          _("Global Offset Table data"));
16784       /* PR 12855: Null data is handled gracefully throughout.  */
16785       data_end = data + (global_end - pltgot);
16786
16787       printf (_("\nPrimary GOT:\n"));
16788       printf (_(" Canonical gp value: "));
16789       print_vma (pltgot + 0x7ff0, LONG_HEX);
16790       printf ("\n\n");
16791
16792       printf (_(" Reserved entries:\n"));
16793       printf (_("  %*s %10s %*s Purpose\n"),
16794               addr_size * 2, _("Address"), _("Access"),
16795               addr_size * 2, _("Initial"));
16796       ent = print_mips_got_entry (data, pltgot, ent, data_end);
16797       printf (_(" Lazy resolver\n"));
16798       if (ent == (bfd_vma) -1)
16799         goto got_print_fail;
16800
16801       /* Check for the MSB of GOT[1] being set, denoting a GNU object.
16802          This entry will be used by some runtime loaders, to store the
16803          module pointer.  Otherwise this is an ordinary local entry.
16804          PR 21344: Check for the entry being fully available before
16805          fetching it.  */
16806       if (data
16807           && data + ent - pltgot + addr_size <= data_end
16808           && (byte_get (data + ent - pltgot, addr_size)
16809               >> (addr_size * 8 - 1)) != 0)
16810         {
16811           ent = print_mips_got_entry (data, pltgot, ent, data_end);
16812           printf (_(" Module pointer (GNU extension)\n"));
16813           if (ent == (bfd_vma) -1)
16814             goto got_print_fail;
16815         }
16816       printf ("\n");
16817
16818       if (data != NULL && ent < local_end)
16819         {
16820           printf (_(" Local entries:\n"));
16821           printf ("  %*s %10s %*s\n",
16822                   addr_size * 2, _("Address"), _("Access"),
16823                   addr_size * 2, _("Initial"));
16824           while (ent < local_end)
16825             {
16826               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16827               printf ("\n");
16828               if (ent == (bfd_vma) -1)
16829                 goto got_print_fail;
16830             }
16831           printf ("\n");
16832         }
16833
16834       if (data != NULL && gotsym < symtabno)
16835         {
16836           int sym_width;
16837
16838           printf (_(" Global entries:\n"));
16839           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
16840                   addr_size * 2, _("Address"),
16841                   _("Access"),
16842                   addr_size * 2, _("Initial"),
16843                   addr_size * 2, _("Sym.Val."),
16844                   _("Type"),
16845                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
16846                   _("Ndx"), _("Name"));
16847
16848           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
16849
16850           for (i = gotsym; i < symtabno; i++)
16851             {
16852               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16853               printf (" ");
16854
16855               if (dynamic_symbols == NULL)
16856                 printf (_("<no dynamic symbols>"));
16857               else if (i < num_dynamic_syms)
16858                 {
16859                   Elf_Internal_Sym * psym = dynamic_symbols + i;
16860
16861                   print_vma (psym->st_value, LONG_HEX);
16862                   printf (" %-7s %3s ",
16863                           get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16864                           get_symbol_index_type (filedata, psym->st_shndx));
16865
16866                   if (VALID_DYNAMIC_NAME (psym->st_name))
16867                     print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16868                   else
16869                     printf (_("<corrupt: %14ld>"), psym->st_name);
16870                 }
16871               else
16872                 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
16873                         (unsigned long) i);
16874
16875               printf ("\n");
16876               if (ent == (bfd_vma) -1)
16877                 break;
16878             }
16879           printf ("\n");
16880         }
16881
16882     got_print_fail:
16883       if (data)
16884         free (data);
16885     }
16886
16887   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
16888     {
16889       bfd_vma ent, end;
16890       size_t offset, rel_offset;
16891       unsigned long count, i;
16892       unsigned char * data;
16893       int addr_size, sym_width;
16894       Elf_Internal_Rela * rels;
16895
16896       rel_offset = offset_from_vma (filedata, jmprel, pltrelsz);
16897       if (pltrel == DT_RELA)
16898         {
16899           if (!slurp_rela_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16900             return FALSE;
16901         }
16902       else
16903         {
16904           if (!slurp_rel_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16905             return FALSE;
16906         }
16907
16908       ent = mips_pltgot;
16909       addr_size = (is_32bit_elf ? 4 : 8);
16910       end = mips_pltgot + (2 + count) * addr_size;
16911
16912       offset = offset_from_vma (filedata, mips_pltgot, end - mips_pltgot);
16913       data = (unsigned char *) get_data (NULL, filedata, offset, end - mips_pltgot,
16914                                          1, _("Procedure Linkage Table data"));
16915       if (data == NULL)
16916         return FALSE;
16917
16918       printf ("\nPLT GOT:\n\n");
16919       printf (_(" Reserved entries:\n"));
16920       printf (_("  %*s %*s Purpose\n"),
16921               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
16922       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16923       printf (_(" PLT lazy resolver\n"));
16924       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16925       printf (_(" Module pointer\n"));
16926       printf ("\n");
16927
16928       printf (_(" Entries:\n"));
16929       printf ("  %*s %*s %*s %-7s %3s %s\n",
16930               addr_size * 2, _("Address"),
16931               addr_size * 2, _("Initial"),
16932               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
16933       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
16934       for (i = 0; i < count; i++)
16935         {
16936           unsigned long idx = get_reloc_symindex (rels[i].r_info);
16937
16938           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16939           printf (" ");
16940
16941           if (idx >= num_dynamic_syms)
16942             printf (_("<corrupt symbol index: %lu>"), idx);
16943           else
16944             {
16945               Elf_Internal_Sym * psym = dynamic_symbols + idx;
16946
16947               print_vma (psym->st_value, LONG_HEX);
16948               printf (" %-7s %3s ",
16949                       get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16950                       get_symbol_index_type (filedata, psym->st_shndx));
16951               if (VALID_DYNAMIC_NAME (psym->st_name))
16952                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16953               else
16954                 printf (_("<corrupt: %14ld>"), psym->st_name);
16955             }
16956           printf ("\n");
16957         }
16958       printf ("\n");
16959
16960       if (data)
16961         free (data);
16962       free (rels);
16963     }
16964
16965   return res;
16966 }
16967
16968 static bfd_boolean
16969 process_nds32_specific (Filedata * filedata)
16970 {
16971   Elf_Internal_Shdr *sect = NULL;
16972
16973   sect = find_section (filedata, ".nds32_e_flags");
16974   if (sect != NULL)
16975     {
16976       unsigned int *flag;
16977
16978       printf ("\nNDS32 elf flags section:\n");
16979       flag = get_data (NULL, filedata, sect->sh_offset, 1,
16980                        sect->sh_size, _("NDS32 elf flags section"));
16981
16982       if (! flag)
16983         return FALSE;
16984
16985       switch ((*flag) & 0x3)
16986         {
16987         case 0:
16988           printf ("(VEC_SIZE):\tNo entry.\n");
16989           break;
16990         case 1:
16991           printf ("(VEC_SIZE):\t4 bytes\n");
16992           break;
16993         case 2:
16994           printf ("(VEC_SIZE):\t16 bytes\n");
16995           break;
16996         case 3:
16997           printf ("(VEC_SIZE):\treserved\n");
16998           break;
16999         }
17000     }
17001
17002   return TRUE;
17003 }
17004
17005 static bfd_boolean
17006 process_gnu_liblist (Filedata * filedata)
17007 {
17008   Elf_Internal_Shdr * section;
17009   Elf_Internal_Shdr * string_sec;
17010   Elf32_External_Lib * elib;
17011   char * strtab;
17012   size_t strtab_size;
17013   size_t cnt;
17014   unsigned long num_liblist;
17015   unsigned i;
17016   bfd_boolean res = TRUE;
17017
17018   if (! do_arch)
17019     return TRUE;
17020
17021   for (i = 0, section = filedata->section_headers;
17022        i < filedata->file_header.e_shnum;
17023        i++, section++)
17024     {
17025       switch (section->sh_type)
17026         {
17027         case SHT_GNU_LIBLIST:
17028           if (section->sh_link >= filedata->file_header.e_shnum)
17029             break;
17030
17031           elib = (Elf32_External_Lib *)
17032               get_data (NULL, filedata, section->sh_offset, 1, section->sh_size,
17033                         _("liblist section data"));
17034
17035           if (elib == NULL)
17036             {
17037               res = FALSE;
17038               break;
17039             }
17040
17041           string_sec = filedata->section_headers + section->sh_link;
17042           strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
17043                                       string_sec->sh_size,
17044                                       _("liblist string table"));
17045           if (strtab == NULL
17046               || section->sh_entsize != sizeof (Elf32_External_Lib))
17047             {
17048               free (elib);
17049               free (strtab);
17050               res = FALSE;
17051               break;
17052             }
17053           strtab_size = string_sec->sh_size;
17054
17055           num_liblist = section->sh_size / sizeof (Elf32_External_Lib);
17056           printf (ngettext ("\nLibrary list section '%s' contains %lu entries:\n",
17057                             "\nLibrary list section '%s' contains %lu entries:\n",
17058                             num_liblist),
17059                   printable_section_name (filedata, section),
17060                   num_liblist);
17061
17062           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
17063
17064           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
17065                ++cnt)
17066             {
17067               Elf32_Lib liblist;
17068               time_t atime;
17069               char timebuf[128];
17070               struct tm * tmp;
17071
17072               liblist.l_name = BYTE_GET (elib[cnt].l_name);
17073               atime = BYTE_GET (elib[cnt].l_time_stamp);
17074               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
17075               liblist.l_version = BYTE_GET (elib[cnt].l_version);
17076               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
17077
17078               tmp = gmtime (&atime);
17079               snprintf (timebuf, sizeof (timebuf),
17080                         "%04u-%02u-%02uT%02u:%02u:%02u",
17081                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
17082                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
17083
17084               printf ("%3lu: ", (unsigned long) cnt);
17085               if (do_wide)
17086                 printf ("%-20s", liblist.l_name < strtab_size
17087                         ? strtab + liblist.l_name : _("<corrupt>"));
17088               else
17089                 printf ("%-20.20s", liblist.l_name < strtab_size
17090                         ? strtab + liblist.l_name : _("<corrupt>"));
17091               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
17092                       liblist.l_version, liblist.l_flags);
17093             }
17094
17095           free (elib);
17096           free (strtab);
17097         }
17098     }
17099
17100   return res;
17101 }
17102
17103 static const char *
17104 get_note_type (Filedata * filedata, unsigned e_type)
17105 {
17106   static char buff[64];
17107
17108   if (filedata->file_header.e_type == ET_CORE)
17109     switch (e_type)
17110       {
17111       case NT_AUXV:
17112         return _("NT_AUXV (auxiliary vector)");
17113       case NT_PRSTATUS:
17114         return _("NT_PRSTATUS (prstatus structure)");
17115       case NT_FPREGSET:
17116         return _("NT_FPREGSET (floating point registers)");
17117       case NT_PRPSINFO:
17118         return _("NT_PRPSINFO (prpsinfo structure)");
17119       case NT_TASKSTRUCT:
17120         return _("NT_TASKSTRUCT (task structure)");
17121       case NT_PRXFPREG:
17122         return _("NT_PRXFPREG (user_xfpregs structure)");
17123       case NT_PPC_VMX:
17124         return _("NT_PPC_VMX (ppc Altivec registers)");
17125       case NT_PPC_VSX:
17126         return _("NT_PPC_VSX (ppc VSX registers)");
17127       case NT_PPC_TAR:
17128         return _("NT_PPC_TAR (ppc TAR register)");
17129       case NT_PPC_PPR:
17130         return _("NT_PPC_PPR (ppc PPR register)");
17131       case NT_PPC_DSCR:
17132         return _("NT_PPC_DSCR (ppc DSCR register)");
17133       case NT_PPC_EBB:
17134         return _("NT_PPC_EBB (ppc EBB registers)");
17135       case NT_PPC_PMU:
17136         return _("NT_PPC_PMU (ppc PMU registers)");
17137       case NT_PPC_TM_CGPR:
17138         return _("NT_PPC_TM_CGPR (ppc checkpointed GPR registers)");
17139       case NT_PPC_TM_CFPR:
17140         return _("NT_PPC_TM_CFPR (ppc checkpointed floating point registers)");
17141       case NT_PPC_TM_CVMX:
17142         return _("NT_PPC_TM_CVMX (ppc checkpointed Altivec registers)");
17143       case NT_PPC_TM_CVSX:
17144         return _("NT_PPC_TM_CVSX (ppc checkpointed VSX registers)");
17145       case NT_PPC_TM_SPR:
17146         return _("NT_PPC_TM_SPR (ppc TM special purpose registers)");
17147       case NT_PPC_TM_CTAR:
17148         return _("NT_PPC_TM_CTAR (ppc checkpointed TAR register)");
17149       case NT_PPC_TM_CPPR:
17150         return _("NT_PPC_TM_CPPR (ppc checkpointed PPR register)");
17151       case NT_PPC_TM_CDSCR:
17152         return _("NT_PPC_TM_CDSCR (ppc checkpointed DSCR register)");
17153       case NT_386_TLS:
17154         return _("NT_386_TLS (x86 TLS information)");
17155       case NT_386_IOPERM:
17156         return _("NT_386_IOPERM (x86 I/O permissions)");
17157       case NT_X86_XSTATE:
17158         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
17159       case NT_S390_HIGH_GPRS:
17160         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
17161       case NT_S390_TIMER:
17162         return _("NT_S390_TIMER (s390 timer register)");
17163       case NT_S390_TODCMP:
17164         return _("NT_S390_TODCMP (s390 TOD comparator register)");
17165       case NT_S390_TODPREG:
17166         return _("NT_S390_TODPREG (s390 TOD programmable register)");
17167       case NT_S390_CTRS:
17168         return _("NT_S390_CTRS (s390 control registers)");
17169       case NT_S390_PREFIX:
17170         return _("NT_S390_PREFIX (s390 prefix register)");
17171       case NT_S390_LAST_BREAK:
17172         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
17173       case NT_S390_SYSTEM_CALL:
17174         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
17175       case NT_S390_TDB:
17176         return _("NT_S390_TDB (s390 transaction diagnostic block)");
17177       case NT_S390_VXRS_LOW:
17178         return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
17179       case NT_S390_VXRS_HIGH:
17180         return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
17181       case NT_S390_GS_CB:
17182         return _("NT_S390_GS_CB (s390 guarded-storage registers)");
17183       case NT_S390_GS_BC:
17184         return _("NT_S390_GS_BC (s390 guarded-storage broadcast control)");
17185       case NT_ARM_VFP:
17186         return _("NT_ARM_VFP (arm VFP registers)");
17187       case NT_ARM_TLS:
17188         return _("NT_ARM_TLS (AArch TLS registers)");
17189       case NT_ARM_HW_BREAK:
17190         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
17191       case NT_ARM_HW_WATCH:
17192         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
17193       case NT_PSTATUS:
17194         return _("NT_PSTATUS (pstatus structure)");
17195       case NT_FPREGS:
17196         return _("NT_FPREGS (floating point registers)");
17197       case NT_PSINFO:
17198         return _("NT_PSINFO (psinfo structure)");
17199       case NT_LWPSTATUS:
17200         return _("NT_LWPSTATUS (lwpstatus_t structure)");
17201       case NT_LWPSINFO:
17202         return _("NT_LWPSINFO (lwpsinfo_t structure)");
17203       case NT_WIN32PSTATUS:
17204         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
17205       case NT_SIGINFO:
17206         return _("NT_SIGINFO (siginfo_t data)");
17207       case NT_FILE:
17208         return _("NT_FILE (mapped files)");
17209       default:
17210         break;
17211       }
17212   else
17213     switch (e_type)
17214       {
17215       case NT_VERSION:
17216         return _("NT_VERSION (version)");
17217       case NT_ARCH:
17218         return _("NT_ARCH (architecture)");
17219       case NT_GNU_BUILD_ATTRIBUTE_OPEN:
17220         return _("OPEN");
17221       case NT_GNU_BUILD_ATTRIBUTE_FUNC:
17222         return _("func");
17223       default:
17224         break;
17225       }
17226
17227   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17228   return buff;
17229 }
17230
17231 static bfd_boolean
17232 print_core_note (Elf_Internal_Note *pnote)
17233 {
17234   unsigned int addr_size = is_32bit_elf ? 4 : 8;
17235   bfd_vma count, page_size;
17236   unsigned char *descdata, *filenames, *descend;
17237
17238   if (pnote->type != NT_FILE)
17239     {
17240       if (do_wide)
17241         printf ("\n");
17242       return TRUE;
17243     }
17244
17245 #ifndef BFD64
17246   if (!is_32bit_elf)
17247     {
17248       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
17249       /* Still "successful".  */
17250       return TRUE;
17251     }
17252 #endif
17253
17254   if (pnote->descsz < 2 * addr_size)
17255     {
17256       error (_("    Malformed note - too short for header\n"));
17257       return FALSE;
17258     }
17259
17260   descdata = (unsigned char *) pnote->descdata;
17261   descend = descdata + pnote->descsz;
17262
17263   if (descdata[pnote->descsz - 1] != '\0')
17264     {
17265       error (_("    Malformed note - does not end with \\0\n"));
17266       return FALSE;
17267     }
17268
17269   count = byte_get (descdata, addr_size);
17270   descdata += addr_size;
17271
17272   page_size = byte_get (descdata, addr_size);
17273   descdata += addr_size;
17274
17275   if (count > ((bfd_vma) -1 - 2 * addr_size) / (3 * addr_size)
17276       || pnote->descsz < 2 * addr_size + count * 3 * addr_size)
17277     {
17278       error (_("    Malformed note - too short for supplied file count\n"));
17279       return FALSE;
17280     }
17281
17282   printf (_("    Page size: "));
17283   print_vma (page_size, DEC);
17284   printf ("\n");
17285
17286   printf (_("    %*s%*s%*s\n"),
17287           (int) (2 + 2 * addr_size), _("Start"),
17288           (int) (4 + 2 * addr_size), _("End"),
17289           (int) (4 + 2 * addr_size), _("Page Offset"));
17290   filenames = descdata + count * 3 * addr_size;
17291   while (count-- > 0)
17292     {
17293       bfd_vma start, end, file_ofs;
17294
17295       if (filenames == descend)
17296         {
17297           error (_("    Malformed note - filenames end too early\n"));
17298           return FALSE;
17299         }
17300
17301       start = byte_get (descdata, addr_size);
17302       descdata += addr_size;
17303       end = byte_get (descdata, addr_size);
17304       descdata += addr_size;
17305       file_ofs = byte_get (descdata, addr_size);
17306       descdata += addr_size;
17307
17308       printf ("    ");
17309       print_vma (start, FULL_HEX);
17310       printf ("  ");
17311       print_vma (end, FULL_HEX);
17312       printf ("  ");
17313       print_vma (file_ofs, FULL_HEX);
17314       printf ("\n        %s\n", filenames);
17315
17316       filenames += 1 + strlen ((char *) filenames);
17317     }
17318
17319   return TRUE;
17320 }
17321
17322 static const char *
17323 get_gnu_elf_note_type (unsigned e_type)
17324 {
17325   /* NB/ Keep this switch statement in sync with print_gnu_note ().  */
17326   switch (e_type)
17327     {
17328     case NT_GNU_ABI_TAG:
17329       return _("NT_GNU_ABI_TAG (ABI version tag)");
17330     case NT_GNU_HWCAP:
17331       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
17332     case NT_GNU_BUILD_ID:
17333       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
17334     case NT_GNU_GOLD_VERSION:
17335       return _("NT_GNU_GOLD_VERSION (gold version)");
17336     case NT_GNU_PROPERTY_TYPE_0:
17337       return _("NT_GNU_PROPERTY_TYPE_0");
17338     case NT_GNU_BUILD_ATTRIBUTE_OPEN:
17339       return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
17340     case NT_GNU_BUILD_ATTRIBUTE_FUNC:
17341       return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
17342     default:
17343       {
17344         static char buff[64];
17345
17346         snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17347         return buff;
17348       }
17349     }
17350 }
17351
17352 static void
17353 decode_x86_compat_isa (unsigned int bitmask)
17354 {
17355   while (bitmask)
17356     {
17357       unsigned int bit = bitmask & (- bitmask);
17358
17359       bitmask &= ~ bit;
17360       switch (bit)
17361         {
17362         case GNU_PROPERTY_X86_COMPAT_ISA_1_486:
17363           printf ("i486");
17364           break;
17365         case GNU_PROPERTY_X86_COMPAT_ISA_1_586:
17366           printf ("586");
17367           break;
17368         case GNU_PROPERTY_X86_COMPAT_ISA_1_686:
17369           printf ("686");
17370           break;
17371         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE:
17372           printf ("SSE");
17373           break;
17374         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE2:
17375           printf ("SSE2");
17376           break;
17377         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE3:
17378           printf ("SSE3");
17379           break;
17380         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSSE3:
17381           printf ("SSSE3");
17382           break;
17383         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_1:
17384           printf ("SSE4_1");
17385           break;
17386         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_2:
17387           printf ("SSE4_2");
17388           break;
17389         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX:
17390           printf ("AVX");
17391           break;
17392         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX2:
17393           printf ("AVX2");
17394           break;
17395         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512F:
17396           printf ("AVX512F");
17397           break;
17398         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512CD:
17399           printf ("AVX512CD");
17400           break;
17401         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512ER:
17402           printf ("AVX512ER");
17403           break;
17404         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512PF:
17405           printf ("AVX512PF");
17406           break;
17407         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512VL:
17408           printf ("AVX512VL");
17409           break;
17410         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512DQ:
17411           printf ("AVX512DQ");
17412           break;
17413         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512BW:
17414           printf ("AVX512BW");
17415           break;
17416         default:
17417           printf (_("<unknown: %x>"), bit);
17418           break;
17419         }
17420       if (bitmask)
17421         printf (", ");
17422     }
17423 }
17424
17425 static void
17426 decode_x86_isa (unsigned int bitmask)
17427 {
17428   if (!bitmask)
17429     {
17430       printf (_("<None>"));
17431       return;
17432     }
17433
17434   while (bitmask)
17435     {
17436       unsigned int bit = bitmask & (- bitmask);
17437
17438       bitmask &= ~ bit;
17439       switch (bit)
17440         {
17441         case GNU_PROPERTY_X86_ISA_1_CMOV:
17442           printf ("CMOV");
17443           break;
17444         case GNU_PROPERTY_X86_ISA_1_SSE:
17445           printf ("SSE");
17446           break;
17447         case GNU_PROPERTY_X86_ISA_1_SSE2:
17448           printf ("SSE2");
17449           break;
17450         case GNU_PROPERTY_X86_ISA_1_SSE3:
17451           printf ("SSE3");
17452           break;
17453         case GNU_PROPERTY_X86_ISA_1_SSSE3:
17454           printf ("SSSE3");
17455           break;
17456         case GNU_PROPERTY_X86_ISA_1_SSE4_1:
17457           printf ("SSE4_1");
17458           break;
17459         case GNU_PROPERTY_X86_ISA_1_SSE4_2:
17460           printf ("SSE4_2");
17461           break;
17462         case GNU_PROPERTY_X86_ISA_1_AVX:
17463           printf ("AVX");
17464           break;
17465         case GNU_PROPERTY_X86_ISA_1_AVX2:
17466           printf ("AVX2");
17467           break;
17468         case GNU_PROPERTY_X86_ISA_1_FMA:
17469           printf ("FMA");
17470           break;
17471         case GNU_PROPERTY_X86_ISA_1_AVX512F:
17472           printf ("AVX512F");
17473           break;
17474         case GNU_PROPERTY_X86_ISA_1_AVX512CD:
17475           printf ("AVX512CD");
17476           break;
17477         case GNU_PROPERTY_X86_ISA_1_AVX512ER:
17478           printf ("AVX512ER");
17479           break;
17480         case GNU_PROPERTY_X86_ISA_1_AVX512PF:
17481           printf ("AVX512PF");
17482           break;
17483         case GNU_PROPERTY_X86_ISA_1_AVX512VL:
17484           printf ("AVX512VL");
17485           break;
17486         case GNU_PROPERTY_X86_ISA_1_AVX512DQ:
17487           printf ("AVX512DQ");
17488           break;
17489         case GNU_PROPERTY_X86_ISA_1_AVX512BW:
17490           printf ("AVX512BW");
17491           break;
17492         case GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS:
17493           printf ("AVX512_4FMAPS");
17494           break;
17495         case GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW:
17496           printf ("AVX512_4VNNIW");
17497           break;
17498         case GNU_PROPERTY_X86_ISA_1_AVX512_BITALG:
17499           printf ("AVX512_BITALG");
17500           break;
17501         case GNU_PROPERTY_X86_ISA_1_AVX512_IFMA:
17502           printf ("AVX512_IFMA");
17503           break;
17504         case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI:
17505           printf ("AVX512_VBMI");
17506           break;
17507         case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2:
17508           printf ("AVX512_VBMI2");
17509           break;
17510         case GNU_PROPERTY_X86_ISA_1_AVX512_VNNI:
17511           printf ("AVX512_VNNI");
17512           break;
17513         case GNU_PROPERTY_X86_ISA_1_AVX512_BF16:
17514           printf ("AVX512_BF16");
17515           break;
17516         default:
17517           printf (_("<unknown: %x>"), bit);
17518           break;
17519         }
17520       if (bitmask)
17521         printf (", ");
17522     }
17523 }
17524
17525 static void
17526 decode_x86_feature_1 (unsigned int bitmask)
17527 {
17528   if (!bitmask)
17529     {
17530       printf (_("<None>"));
17531       return;
17532     }
17533
17534   while (bitmask)
17535     {
17536       unsigned int bit = bitmask & (- bitmask);
17537
17538       bitmask &= ~ bit;
17539       switch (bit)
17540         {
17541         case GNU_PROPERTY_X86_FEATURE_1_IBT:
17542           printf ("IBT");
17543           break;
17544         case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
17545           printf ("SHSTK");
17546           break;
17547         default:
17548           printf (_("<unknown: %x>"), bit);
17549           break;
17550         }
17551       if (bitmask)
17552         printf (", ");
17553     }
17554 }
17555
17556 static void
17557 decode_x86_feature_2 (unsigned int bitmask)
17558 {
17559   if (!bitmask)
17560     {
17561       printf (_("<None>"));
17562       return;
17563     }
17564
17565   while (bitmask)
17566     {
17567       unsigned int bit = bitmask & (- bitmask);
17568
17569       bitmask &= ~ bit;
17570       switch (bit)
17571         {
17572         case GNU_PROPERTY_X86_FEATURE_2_X86:
17573           printf ("x86");
17574           break;
17575         case GNU_PROPERTY_X86_FEATURE_2_X87:
17576           printf ("x87");
17577           break;
17578         case GNU_PROPERTY_X86_FEATURE_2_MMX:
17579           printf ("MMX");
17580           break;
17581         case GNU_PROPERTY_X86_FEATURE_2_XMM:
17582           printf ("XMM");
17583           break;
17584         case GNU_PROPERTY_X86_FEATURE_2_YMM:
17585           printf ("YMM");
17586           break;
17587         case GNU_PROPERTY_X86_FEATURE_2_ZMM:
17588           printf ("ZMM");
17589           break;
17590         case GNU_PROPERTY_X86_FEATURE_2_FXSR:
17591           printf ("FXSR");
17592           break;
17593         case GNU_PROPERTY_X86_FEATURE_2_XSAVE:
17594           printf ("XSAVE");
17595           break;
17596         case GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT:
17597           printf ("XSAVEOPT");
17598           break;
17599         case GNU_PROPERTY_X86_FEATURE_2_XSAVEC:
17600           printf ("XSAVEC");
17601           break;
17602         default:
17603           printf (_("<unknown: %x>"), bit);
17604           break;
17605         }
17606       if (bitmask)
17607         printf (", ");
17608     }
17609 }
17610
17611 static void
17612 decode_aarch64_feature_1_and (unsigned int bitmask)
17613 {
17614   while (bitmask)
17615     {
17616       unsigned int bit = bitmask & (- bitmask);
17617
17618       bitmask &= ~ bit;
17619       switch (bit)
17620         {
17621         case GNU_PROPERTY_AARCH64_FEATURE_1_BTI:
17622           printf ("BTI");
17623           break;
17624
17625         case GNU_PROPERTY_AARCH64_FEATURE_1_PAC:
17626           printf ("PAC");
17627           break;
17628
17629         default:
17630           printf (_("<unknown: %x>"), bit);
17631           break;
17632         }
17633       if (bitmask)
17634         printf (", ");
17635     }
17636 }
17637
17638 static void
17639 print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
17640 {
17641   unsigned char * ptr = (unsigned char *) pnote->descdata;
17642   unsigned char * ptr_end = ptr + pnote->descsz;
17643   unsigned int    size = is_32bit_elf ? 4 : 8;
17644
17645   printf (_("      Properties: "));
17646
17647   if (pnote->descsz < 8 || (pnote->descsz % size) != 0)
17648     {
17649       printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz);
17650       return;
17651     }
17652
17653   while (ptr < ptr_end)
17654     {
17655       unsigned int j;
17656       unsigned int type;
17657       unsigned int datasz;
17658
17659       if ((size_t) (ptr_end - ptr) < 8)
17660         {
17661           printf (_("<corrupt descsz: %#lx>\n"), pnote->descsz);
17662           break;
17663         }
17664
17665       type = byte_get (ptr, 4);
17666       datasz = byte_get (ptr + 4, 4);
17667
17668       ptr += 8;
17669
17670       if (datasz > (size_t) (ptr_end - ptr))
17671         {
17672           printf (_("<corrupt type (%#x) datasz: %#x>\n"),
17673                   type, datasz);
17674           break;
17675         }
17676
17677       if (type >= GNU_PROPERTY_LOPROC && type <= GNU_PROPERTY_HIPROC)
17678         {
17679           if (filedata->file_header.e_machine == EM_X86_64
17680               || filedata->file_header.e_machine == EM_IAMCU
17681               || filedata->file_header.e_machine == EM_386)
17682             {
17683               unsigned int bitmask;
17684
17685               if (datasz == 4)
17686                 bitmask = byte_get (ptr, 4);
17687               else
17688                 bitmask = 0;
17689
17690               switch (type)
17691                 {
17692                 case GNU_PROPERTY_X86_ISA_1_USED:
17693                   if (datasz != 4)
17694                     printf (_("x86 ISA used: <corrupt length: %#x> "),
17695                             datasz);
17696                   else
17697                     {
17698                       printf ("x86 ISA used: ");
17699                       decode_x86_isa (bitmask);
17700                     }
17701                   goto next;
17702
17703                 case GNU_PROPERTY_X86_ISA_1_NEEDED:
17704                   if (datasz != 4)
17705                     printf (_("x86 ISA needed: <corrupt length: %#x> "),
17706                             datasz);
17707                   else
17708                     {
17709                       printf ("x86 ISA needed: ");
17710                       decode_x86_isa (bitmask);
17711                     }
17712                   goto next;
17713
17714                 case GNU_PROPERTY_X86_FEATURE_1_AND:
17715                   if (datasz != 4)
17716                     printf (_("x86 feature: <corrupt length: %#x> "),
17717                             datasz);
17718                   else
17719                     {
17720                       printf ("x86 feature: ");
17721                       decode_x86_feature_1 (bitmask);
17722                     }
17723                   goto next;
17724
17725                 case GNU_PROPERTY_X86_FEATURE_2_USED:
17726                   if (datasz != 4)
17727                     printf (_("x86 feature used: <corrupt length: %#x> "),
17728                             datasz);
17729                   else
17730                     {
17731                       printf ("x86 feature used: ");
17732                       decode_x86_feature_2 (bitmask);
17733                     }
17734                   goto next;
17735
17736                 case GNU_PROPERTY_X86_FEATURE_2_NEEDED:
17737                   if (datasz != 4)
17738                     printf (_("x86 feature needed: <corrupt length: %#x> "), datasz);
17739                   else
17740                     {
17741                       printf ("x86 feature needed: ");
17742                       decode_x86_feature_2 (bitmask);
17743                     }
17744                   goto next;
17745
17746                 case GNU_PROPERTY_X86_COMPAT_ISA_1_USED:
17747                   if (datasz != 4)
17748                     printf (_("x86 ISA used: <corrupt length: %#x> "),
17749                             datasz);
17750                   else
17751                     {
17752                       printf ("x86 ISA used: ");
17753                       decode_x86_compat_isa (bitmask);
17754                     }
17755                   goto next;
17756
17757                 case GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED:
17758                   if (datasz != 4)
17759                     printf (_("x86 ISA needed: <corrupt length: %#x> "),
17760                             datasz);
17761                   else
17762                     {
17763                       printf ("x86 ISA needed: ");
17764                       decode_x86_compat_isa (bitmask);
17765                     }
17766                   goto next;
17767
17768                 default:
17769                   break;
17770                 }
17771             }
17772           else if (filedata->file_header.e_machine == EM_AARCH64)
17773             {
17774               if (type == GNU_PROPERTY_AARCH64_FEATURE_1_AND)
17775                 {
17776                   printf ("AArch64 feature: ");
17777                   if (datasz != 4)
17778                     printf (_("<corrupt length: %#x> "), datasz);
17779                   else
17780                     decode_aarch64_feature_1_and (byte_get (ptr, 4));
17781                   goto next;
17782                 }
17783             }
17784         }
17785       else
17786         {
17787           switch (type)
17788             {
17789             case GNU_PROPERTY_STACK_SIZE:
17790               printf (_("stack size: "));
17791               if (datasz != size)
17792                 printf (_("<corrupt length: %#x> "), datasz);
17793               else
17794                 printf ("%#lx", (unsigned long) byte_get (ptr, size));
17795               goto next;
17796
17797             case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
17798               printf ("no copy on protected ");
17799               if (datasz)
17800                 printf (_("<corrupt length: %#x> "), datasz);
17801               goto next;
17802
17803             default:
17804               break;
17805             }
17806         }
17807
17808       if (type < GNU_PROPERTY_LOPROC)
17809         printf (_("<unknown type %#x data: "), type);
17810       else if (type < GNU_PROPERTY_LOUSER)
17811         printf (_("<procesor-specific type %#x data: "), type);
17812       else
17813         printf (_("<application-specific type %#x data: "), type);
17814       for (j = 0; j < datasz; ++j)
17815         printf ("%02x ", ptr[j] & 0xff);
17816       printf (">");
17817
17818 next:
17819       ptr += ((datasz + (size - 1)) & ~ (size - 1));
17820       if (ptr == ptr_end)
17821         break;
17822
17823       if (do_wide)
17824         printf (", ");
17825       else
17826         printf ("\n\t");
17827     }
17828
17829   printf ("\n");
17830 }
17831
17832 static bfd_boolean
17833 print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
17834 {
17835   /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type ().  */
17836   switch (pnote->type)
17837     {
17838     case NT_GNU_BUILD_ID:
17839       {
17840         unsigned long i;
17841
17842         printf (_("    Build ID: "));
17843         for (i = 0; i < pnote->descsz; ++i)
17844           printf ("%02x", pnote->descdata[i] & 0xff);
17845         printf ("\n");
17846       }
17847       break;
17848
17849     case NT_GNU_ABI_TAG:
17850       {
17851         unsigned long os, major, minor, subminor;
17852         const char *osname;
17853
17854         /* PR 17531: file: 030-599401-0.004.  */
17855         if (pnote->descsz < 16)
17856           {
17857             printf (_("    <corrupt GNU_ABI_TAG>\n"));
17858             break;
17859           }
17860
17861         os = byte_get ((unsigned char *) pnote->descdata, 4);
17862         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17863         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
17864         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
17865
17866         switch (os)
17867           {
17868           case GNU_ABI_TAG_LINUX:
17869             osname = "Linux";
17870             break;
17871           case GNU_ABI_TAG_HURD:
17872             osname = "Hurd";
17873             break;
17874           case GNU_ABI_TAG_SOLARIS:
17875             osname = "Solaris";
17876             break;
17877           case GNU_ABI_TAG_FREEBSD:
17878             osname = "FreeBSD";
17879             break;
17880           case GNU_ABI_TAG_NETBSD:
17881             osname = "NetBSD";
17882             break;
17883           case GNU_ABI_TAG_SYLLABLE:
17884             osname = "Syllable";
17885             break;
17886           case GNU_ABI_TAG_NACL:
17887             osname = "NaCl";
17888             break;
17889           default:
17890             osname = "Unknown";
17891             break;
17892           }
17893
17894         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
17895                 major, minor, subminor);
17896       }
17897       break;
17898
17899     case NT_GNU_GOLD_VERSION:
17900       {
17901         unsigned long i;
17902
17903         printf (_("    Version: "));
17904         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
17905           printf ("%c", pnote->descdata[i]);
17906         printf ("\n");
17907       }
17908       break;
17909
17910     case NT_GNU_HWCAP:
17911       {
17912         unsigned long num_entries, mask;
17913
17914         /* Hardware capabilities information.  Word 0 is the number of entries.
17915            Word 1 is a bitmask of enabled entries.  The rest of the descriptor
17916            is a series of entries, where each entry is a single byte followed
17917            by a nul terminated string.  The byte gives the bit number to test
17918            if enabled in the bitmask.  */
17919         printf (_("      Hardware Capabilities: "));
17920         if (pnote->descsz < 8)
17921           {
17922             error (_("<corrupt GNU_HWCAP>\n"));
17923             return FALSE;
17924           }
17925         num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
17926         mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17927         printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
17928         /* FIXME: Add code to display the entries... */
17929       }
17930       break;
17931
17932     case NT_GNU_PROPERTY_TYPE_0:
17933       print_gnu_property_note (filedata, pnote);
17934       break;
17935       
17936     default:
17937       /* Handle unrecognised types.  An error message should have already been
17938          created by get_gnu_elf_note_type(), so all that we need to do is to
17939          display the data.  */
17940       {
17941         unsigned long i;
17942
17943         printf (_("    Description data: "));
17944         for (i = 0; i < pnote->descsz; ++i)
17945           printf ("%02x ", pnote->descdata[i] & 0xff);
17946         printf ("\n");
17947       }
17948       break;
17949     }
17950
17951   return TRUE;
17952 }
17953
17954 static const char *
17955 get_v850_elf_note_type (enum v850_notes n_type)
17956 {
17957   static char buff[64];
17958
17959   switch (n_type)
17960     {
17961     case V850_NOTE_ALIGNMENT:  return _("Alignment of 8-byte objects");
17962     case V850_NOTE_DATA_SIZE:  return _("Sizeof double and long double");
17963     case V850_NOTE_FPU_INFO:   return _("Type of FPU support needed");
17964     case V850_NOTE_SIMD_INFO:  return _("Use of SIMD instructions");
17965     case V850_NOTE_CACHE_INFO: return _("Use of cache");
17966     case V850_NOTE_MMU_INFO:   return _("Use of MMU");
17967     default:
17968       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
17969       return buff;
17970     }
17971 }
17972
17973 static bfd_boolean
17974 print_v850_note (Elf_Internal_Note * pnote)
17975 {
17976   unsigned int val;
17977
17978   if (pnote->descsz != 4)
17979     return FALSE;
17980
17981   val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
17982
17983   if (val == 0)
17984     {
17985       printf (_("not set\n"));
17986       return TRUE;
17987     }
17988
17989   switch (pnote->type)
17990     {
17991     case V850_NOTE_ALIGNMENT:
17992       switch (val)
17993         {
17994         case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return TRUE;
17995         case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return TRUE;
17996         }
17997       break;
17998
17999     case V850_NOTE_DATA_SIZE:
18000       switch (val)
18001         {
18002         case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return TRUE;
18003         case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return TRUE;
18004         }
18005       break;
18006
18007     case V850_NOTE_FPU_INFO:
18008       switch (val)
18009         {
18010         case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return TRUE;
18011         case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return TRUE;
18012         }
18013       break;
18014
18015     case V850_NOTE_MMU_INFO:
18016     case V850_NOTE_CACHE_INFO:
18017     case V850_NOTE_SIMD_INFO:
18018       if (val == EF_RH850_SIMD)
18019         {
18020           printf (_("yes\n"));
18021           return TRUE;
18022         }
18023       break;
18024
18025     default:
18026       /* An 'unknown note type' message will already have been displayed.  */
18027       break;
18028     }
18029
18030   printf (_("unknown value: %x\n"), val);
18031   return FALSE;
18032 }
18033
18034 static bfd_boolean
18035 process_netbsd_elf_note (Elf_Internal_Note * pnote)
18036 {
18037   unsigned int version;
18038
18039   switch (pnote->type)
18040     {
18041     case NT_NETBSD_IDENT:
18042       version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
18043       if ((version / 10000) % 100)
18044         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
18045                 version, version / 100000000, (version / 1000000) % 100,
18046                 (version / 10000) % 100 > 26 ? "Z" : "",
18047                 'A' + (version / 10000) % 26);
18048       else
18049         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
18050                 version, version / 100000000, (version / 1000000) % 100,
18051                 (version / 100) % 100);
18052       return TRUE;
18053
18054     case NT_NETBSD_MARCH:
18055       printf ("  NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
18056               pnote->descdata);
18057       return TRUE;
18058
18059     default:
18060       printf ("  NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
18061               pnote->type);
18062       return FALSE;
18063     }
18064 }
18065
18066 static const char *
18067 get_freebsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
18068 {
18069   switch (e_type)
18070     {
18071     case NT_FREEBSD_THRMISC:
18072       return _("NT_THRMISC (thrmisc structure)");
18073     case NT_FREEBSD_PROCSTAT_PROC:
18074       return _("NT_PROCSTAT_PROC (proc data)");
18075     case NT_FREEBSD_PROCSTAT_FILES:
18076       return _("NT_PROCSTAT_FILES (files data)");
18077     case NT_FREEBSD_PROCSTAT_VMMAP:
18078       return _("NT_PROCSTAT_VMMAP (vmmap data)");
18079     case NT_FREEBSD_PROCSTAT_GROUPS:
18080       return _("NT_PROCSTAT_GROUPS (groups data)");
18081     case NT_FREEBSD_PROCSTAT_UMASK:
18082       return _("NT_PROCSTAT_UMASK (umask data)");
18083     case NT_FREEBSD_PROCSTAT_RLIMIT:
18084       return _("NT_PROCSTAT_RLIMIT (rlimit data)");
18085     case NT_FREEBSD_PROCSTAT_OSREL:
18086       return _("NT_PROCSTAT_OSREL (osreldate data)");
18087     case NT_FREEBSD_PROCSTAT_PSSTRINGS:
18088       return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
18089     case NT_FREEBSD_PROCSTAT_AUXV:
18090       return _("NT_PROCSTAT_AUXV (auxv data)");
18091     case NT_FREEBSD_PTLWPINFO:
18092       return _("NT_PTLWPINFO (ptrace_lwpinfo structure)");
18093     }
18094   return get_note_type (filedata, e_type);
18095 }
18096
18097 static const char *
18098 get_netbsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
18099 {
18100   static char buff[64];
18101
18102   if (e_type == NT_NETBSDCORE_PROCINFO)
18103     return _("NetBSD procinfo structure");
18104
18105   /* As of Jan 2002 there are no other machine-independent notes
18106      defined for NetBSD core files.  If the note type is less
18107      than the start of the machine-dependent note types, we don't
18108      understand it.  */
18109
18110   if (e_type < NT_NETBSDCORE_FIRSTMACH)
18111     {
18112       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
18113       return buff;
18114     }
18115
18116   switch (filedata->file_header.e_machine)
18117     {
18118     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
18119        and PT_GETFPREGS == mach+2.  */
18120
18121     case EM_OLD_ALPHA:
18122     case EM_ALPHA:
18123     case EM_SPARC:
18124     case EM_SPARC32PLUS:
18125     case EM_SPARCV9:
18126       switch (e_type)
18127         {
18128         case NT_NETBSDCORE_FIRSTMACH + 0:
18129           return _("PT_GETREGS (reg structure)");
18130         case NT_NETBSDCORE_FIRSTMACH + 2:
18131           return _("PT_GETFPREGS (fpreg structure)");
18132         default:
18133           break;
18134         }
18135       break;
18136
18137     /* On all other arch's, PT_GETREGS == mach+1 and
18138        PT_GETFPREGS == mach+3.  */
18139     default:
18140       switch (e_type)
18141         {
18142         case NT_NETBSDCORE_FIRSTMACH + 1:
18143           return _("PT_GETREGS (reg structure)");
18144         case NT_NETBSDCORE_FIRSTMACH + 3:
18145           return _("PT_GETFPREGS (fpreg structure)");
18146         default:
18147           break;
18148         }
18149     }
18150
18151   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
18152             e_type - NT_NETBSDCORE_FIRSTMACH);
18153   return buff;
18154 }
18155
18156 static const char *
18157 get_stapsdt_note_type (unsigned e_type)
18158 {
18159   static char buff[64];
18160
18161   switch (e_type)
18162     {
18163     case NT_STAPSDT:
18164       return _("NT_STAPSDT (SystemTap probe descriptors)");
18165
18166     default:
18167       break;
18168     }
18169
18170   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
18171   return buff;
18172 }
18173
18174 static bfd_boolean
18175 print_stapsdt_note (Elf_Internal_Note *pnote)
18176 {
18177   size_t len, maxlen;
18178   unsigned long addr_size = is_32bit_elf ? 4 : 8;
18179   char *data = pnote->descdata;
18180   char *data_end = pnote->descdata + pnote->descsz;
18181   bfd_vma pc, base_addr, semaphore;
18182   char *provider, *probe, *arg_fmt;
18183
18184   if (pnote->descsz < (addr_size * 3))
18185     goto stapdt_note_too_small;
18186
18187   pc = byte_get ((unsigned char *) data, addr_size);
18188   data += addr_size;
18189
18190   base_addr = byte_get ((unsigned char *) data, addr_size);
18191   data += addr_size;
18192
18193   semaphore = byte_get ((unsigned char *) data, addr_size);
18194   data += addr_size;
18195
18196   if (data >= data_end)
18197     goto stapdt_note_too_small;
18198   maxlen = data_end - data;
18199   len = strnlen (data, maxlen);
18200   if (len < maxlen)
18201     {
18202       provider = data;
18203       data += len + 1;
18204     }
18205   else
18206     goto stapdt_note_too_small;
18207
18208   if (data >= data_end)
18209     goto stapdt_note_too_small;
18210   maxlen = data_end - data;
18211   len = strnlen (data, maxlen);
18212   if (len < maxlen)
18213     {
18214       probe = data;
18215       data += len + 1;
18216     }
18217   else
18218     goto stapdt_note_too_small;
18219   
18220   if (data >= data_end)
18221     goto stapdt_note_too_small;
18222   maxlen = data_end - data;
18223   len = strnlen (data, maxlen);
18224   if (len < maxlen)
18225     {
18226       arg_fmt = data;
18227       data += len + 1;
18228     }
18229   else
18230     goto stapdt_note_too_small;
18231
18232   printf (_("    Provider: %s\n"), provider);
18233   printf (_("    Name: %s\n"), probe);
18234   printf (_("    Location: "));
18235   print_vma (pc, FULL_HEX);
18236   printf (_(", Base: "));
18237   print_vma (base_addr, FULL_HEX);
18238   printf (_(", Semaphore: "));
18239   print_vma (semaphore, FULL_HEX);
18240   printf ("\n");
18241   printf (_("    Arguments: %s\n"), arg_fmt);
18242
18243   return data == data_end;
18244
18245  stapdt_note_too_small:
18246   printf (_("  <corrupt - note is too small>\n"));
18247   error (_("corrupt stapdt note - the data size is too small\n"));
18248   return FALSE;
18249 }
18250
18251 static const char *
18252 get_ia64_vms_note_type (unsigned e_type)
18253 {
18254   static char buff[64];
18255
18256   switch (e_type)
18257     {
18258     case NT_VMS_MHD:
18259       return _("NT_VMS_MHD (module header)");
18260     case NT_VMS_LNM:
18261       return _("NT_VMS_LNM (language name)");
18262     case NT_VMS_SRC:
18263       return _("NT_VMS_SRC (source files)");
18264     case NT_VMS_TITLE:
18265       return "NT_VMS_TITLE";
18266     case NT_VMS_EIDC:
18267       return _("NT_VMS_EIDC (consistency check)");
18268     case NT_VMS_FPMODE:
18269       return _("NT_VMS_FPMODE (FP mode)");
18270     case NT_VMS_LINKTIME:
18271       return "NT_VMS_LINKTIME";
18272     case NT_VMS_IMGNAM:
18273       return _("NT_VMS_IMGNAM (image name)");
18274     case NT_VMS_IMGID:
18275       return _("NT_VMS_IMGID (image id)");
18276     case NT_VMS_LINKID:
18277       return _("NT_VMS_LINKID (link id)");
18278     case NT_VMS_IMGBID:
18279       return _("NT_VMS_IMGBID (build id)");
18280     case NT_VMS_GSTNAM:
18281       return _("NT_VMS_GSTNAM (sym table name)");
18282     case NT_VMS_ORIG_DYN:
18283       return "NT_VMS_ORIG_DYN";
18284     case NT_VMS_PATCHTIME:
18285       return "NT_VMS_PATCHTIME";
18286     default:
18287       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
18288       return buff;
18289     }
18290 }
18291
18292 static bfd_boolean
18293 print_ia64_vms_note (Elf_Internal_Note * pnote)
18294 {
18295   int maxlen = pnote->descsz;
18296
18297   if (maxlen < 2 || (unsigned long) maxlen != pnote->descsz)
18298     goto desc_size_fail;
18299
18300   switch (pnote->type)
18301     {
18302     case NT_VMS_MHD:
18303       if (maxlen <= 36)
18304         goto desc_size_fail;
18305
18306       int l = (int) strnlen (pnote->descdata + 34, maxlen - 34);
18307
18308       printf (_("    Creation date  : %.17s\n"), pnote->descdata);
18309       printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
18310       if (l + 34 < maxlen)
18311         {
18312           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
18313           if (l + 35 < maxlen)
18314             printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
18315           else
18316             printf (_("    Module version : <missing>\n"));
18317         }
18318       else
18319         {
18320           printf (_("    Module name    : <missing>\n"));
18321           printf (_("    Module version : <missing>\n"));
18322         }
18323       break;
18324
18325     case NT_VMS_LNM:
18326       printf (_("   Language: %.*s\n"), maxlen, pnote->descdata);
18327       break;
18328
18329 #ifdef BFD64
18330     case NT_VMS_FPMODE:
18331       printf (_("   Floating Point mode: "));
18332       if (maxlen < 8)
18333         goto desc_size_fail;
18334       /* FIXME: Generate an error if descsz > 8 ?  */
18335
18336       printf ("0x%016" BFD_VMA_FMT "x\n",
18337               (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
18338       break;
18339
18340     case NT_VMS_LINKTIME:
18341       printf (_("   Link time: "));
18342       if (maxlen < 8)
18343         goto desc_size_fail;
18344       /* FIXME: Generate an error if descsz > 8 ?  */
18345
18346       print_vms_time
18347         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
18348       printf ("\n");
18349       break;
18350
18351     case NT_VMS_PATCHTIME:
18352       printf (_("   Patch time: "));
18353       if (maxlen < 8)
18354         goto desc_size_fail;
18355       /* FIXME: Generate an error if descsz > 8 ?  */
18356
18357       print_vms_time
18358         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
18359       printf ("\n");
18360       break;
18361
18362     case NT_VMS_ORIG_DYN:
18363       if (maxlen < 34)
18364         goto desc_size_fail;
18365
18366       printf (_("   Major id: %u,  minor id: %u\n"),
18367               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
18368               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
18369       printf (_("   Last modified  : "));
18370       print_vms_time
18371         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
18372       printf (_("\n   Link flags  : "));
18373       printf ("0x%016" BFD_VMA_FMT "x\n",
18374               (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
18375       printf (_("   Header flags: 0x%08x\n"),
18376               (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
18377       printf (_("   Image id    : %.*s\n"), maxlen - 32, pnote->descdata + 32);
18378       break;
18379 #endif
18380
18381     case NT_VMS_IMGNAM:
18382       printf (_("    Image name: %.*s\n"), maxlen, pnote->descdata);
18383       break;
18384
18385     case NT_VMS_GSTNAM:
18386       printf (_("    Global symbol table name: %.*s\n"), maxlen, pnote->descdata);
18387       break;
18388
18389     case NT_VMS_IMGID:
18390       printf (_("    Image id: %.*s\n"), maxlen, pnote->descdata);
18391       break;
18392
18393     case NT_VMS_LINKID:
18394       printf (_("    Linker id: %.*s\n"), maxlen, pnote->descdata);
18395       break;
18396
18397     default:
18398       return FALSE;
18399     }
18400
18401   return TRUE;
18402
18403  desc_size_fail:
18404   printf (_("  <corrupt - data size is too small>\n"));
18405   error (_("corrupt IA64 note: data size is too small\n"));
18406   return FALSE;
18407 }
18408
18409 /* Find the symbol associated with a build attribute that is attached
18410    to address OFFSET.  If PNAME is non-NULL then store the name of
18411    the symbol (if found) in the provided pointer,  Returns NULL if a
18412    symbol could not be found.  */
18413
18414 static Elf_Internal_Sym *
18415 get_symbol_for_build_attribute (Filedata *       filedata,
18416                                 unsigned long    offset,
18417                                 bfd_boolean      is_open_attr,
18418                                 const char **    pname)
18419 {
18420   static Filedata *         saved_filedata = NULL;
18421   static char *             strtab;
18422   static unsigned long      strtablen;
18423   static Elf_Internal_Sym * symtab;
18424   static unsigned long      nsyms;
18425   Elf_Internal_Sym *        saved_sym = NULL;
18426   Elf_Internal_Sym *        sym;
18427
18428   if (filedata->section_headers != NULL
18429       && (saved_filedata == NULL || filedata != saved_filedata))
18430     {
18431       Elf_Internal_Shdr * symsec;
18432
18433       /* Load the symbol and string sections.  */
18434       for (symsec = filedata->section_headers;
18435            symsec < filedata->section_headers + filedata->file_header.e_shnum;
18436            symsec ++)
18437         {
18438           if (symsec->sh_type == SHT_SYMTAB)
18439             {
18440               symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
18441
18442               if (symsec->sh_link < filedata->file_header.e_shnum)
18443                 {
18444                   Elf_Internal_Shdr * strtab_sec = filedata->section_headers + symsec->sh_link;
18445
18446                   strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
18447                                               1, strtab_sec->sh_size,
18448                                               _("string table"));
18449                   strtablen = strtab != NULL ? strtab_sec->sh_size : 0;
18450                 }
18451             }
18452         }
18453       saved_filedata = filedata;
18454     }
18455
18456   if (symtab == NULL || strtab == NULL)
18457     return NULL;
18458
18459   /* Find a symbol whose value matches offset.  */
18460   for (sym = symtab; sym < symtab + nsyms; sym ++)
18461     if (sym->st_value == offset)
18462       {
18463         if (sym->st_name >= strtablen)
18464           /* Huh ?  This should not happen.  */
18465           continue;
18466
18467         if (strtab[sym->st_name] == 0)
18468           continue;
18469
18470         /* The AArch64 and ARM architectures define mapping symbols
18471            (eg $d, $x, $t) which we want to ignore.  */
18472         if (strtab[sym->st_name] == '$'
18473             && strtab[sym->st_name + 1] != 0
18474             && strtab[sym->st_name + 2] == 0)
18475           continue;
18476
18477         if (is_open_attr)
18478           {
18479             /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
18480                and FILE or OBJECT symbols over NOTYPE symbols.  We skip
18481                FUNC symbols entirely.  */
18482             switch (ELF_ST_TYPE (sym->st_info))
18483               {
18484               case STT_OBJECT:
18485               case STT_FILE:
18486                 saved_sym = sym;
18487                 if (sym->st_size)
18488                   {
18489                     /* If the symbol has a size associated
18490                        with it then we can stop searching.  */
18491                     sym = symtab + nsyms;
18492                   }
18493                 continue;
18494
18495               case STT_FUNC:
18496                 /* Ignore function symbols.  */
18497                 continue;
18498
18499               default:
18500                 break;
18501               }
18502
18503             switch (ELF_ST_BIND (sym->st_info))
18504               {
18505               case STB_GLOBAL:
18506                 if (saved_sym == NULL
18507                     || ELF_ST_TYPE (saved_sym->st_info) != STT_OBJECT)
18508                   saved_sym = sym;
18509                 break;
18510
18511               case STB_LOCAL:
18512                 if (saved_sym == NULL)
18513                   saved_sym = sym;
18514                 break;
18515
18516               default:
18517                 break;
18518               }
18519           }
18520         else
18521           {
18522             if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
18523               continue;
18524
18525             saved_sym = sym;
18526             break;
18527           }
18528       }
18529
18530   if (saved_sym && pname)
18531     * pname = strtab + saved_sym->st_name;
18532
18533   return saved_sym;
18534 }
18535
18536 /* Returns true iff addr1 and addr2 are in the same section.  */
18537
18538 static bfd_boolean
18539 same_section (Filedata * filedata, unsigned long addr1, unsigned long addr2)
18540 {
18541   Elf_Internal_Shdr * a1;
18542   Elf_Internal_Shdr * a2;
18543
18544   a1 = find_section_by_address (filedata, addr1);
18545   a2 = find_section_by_address (filedata, addr2);
18546   
18547   return a1 == a2 && a1 != NULL;
18548 }
18549
18550 static bfd_boolean
18551 print_gnu_build_attribute_description (Elf_Internal_Note *  pnote,
18552                                        Filedata *           filedata)
18553 {
18554   static unsigned long  global_offset = 0;
18555   static unsigned long  global_end = 0;
18556   static unsigned long  func_offset = 0;
18557   static unsigned long  func_end = 0;
18558
18559   Elf_Internal_Sym *    sym;
18560   const char *          name;
18561   unsigned long         start;
18562   unsigned long         end;
18563   bfd_boolean           is_open_attr = pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN;
18564
18565   switch (pnote->descsz)
18566     {
18567     case 0:
18568       /* A zero-length description means that the range of
18569          the previous note of the same type should be used.  */
18570       if (is_open_attr)
18571         {
18572           if (global_end > global_offset)
18573             printf (_("    Applies to region from %#lx to %#lx\n"),
18574                     global_offset, global_end);
18575           else
18576             printf (_("    Applies to region from %#lx\n"), global_offset);
18577         }
18578       else
18579         {
18580           if (func_end > func_offset)
18581             printf (_("    Applies to region from %#lx to %#lx\n"), func_offset, func_end);
18582           else
18583             printf (_("    Applies to region from %#lx\n"), func_offset);
18584         }
18585       return TRUE;
18586
18587     case 4:
18588       start = byte_get ((unsigned char *) pnote->descdata, 4);
18589       end = 0;
18590       break;
18591
18592     case 8:
18593       if (is_32bit_elf)
18594         {
18595           /* FIXME: We should check that version 3+ notes are being used here...  */
18596           start = byte_get ((unsigned char *) pnote->descdata, 4);
18597           end = byte_get ((unsigned char *) pnote->descdata + 4, 4);
18598         }
18599       else
18600         {
18601           start = byte_get ((unsigned char *) pnote->descdata, 8);
18602           end = 0;
18603         }
18604       break;
18605
18606     case 16:
18607       start = byte_get ((unsigned char *) pnote->descdata, 8);
18608       end = byte_get ((unsigned char *) pnote->descdata + 8, 8);
18609       break;
18610       
18611     default:
18612       error (_("    <invalid description size: %lx>\n"), pnote->descsz);
18613       printf (_("    <invalid descsz>"));
18614       return FALSE;
18615     }
18616
18617   name = NULL;
18618   sym = get_symbol_for_build_attribute (filedata, start, is_open_attr, & name);
18619   /* As of version 5 of the annobin plugin, filename symbols are biased by 2
18620      in order to avoid them being confused with the start address of the
18621      first function in the file...  */
18622   if (sym == NULL && is_open_attr)
18623     sym = get_symbol_for_build_attribute (filedata, start + 2, is_open_attr,
18624                                           & name);
18625
18626   if (end == 0 && sym != NULL && sym->st_size > 0)
18627     end = start + sym->st_size;
18628
18629   if (is_open_attr)
18630     {
18631       /* FIXME: Need to properly allow for section alignment.
18632          16 is just the alignment used on x86_64.  */
18633       if (global_end > 0
18634           && start > BFD_ALIGN (global_end, 16)
18635           /* Build notes are not guaranteed to be organised in order of
18636              increasing address, but we should find the all of the notes
18637              for one section in the same place.  */
18638           && same_section (filedata, start, global_end))
18639         warn (_("Gap in build notes detected from %#lx to %#lx\n"),
18640               global_end + 1, start - 1);
18641
18642       printf (_("    Applies to region from %#lx"), start);
18643       global_offset = start;
18644
18645       if (end)
18646         {
18647           printf (_(" to %#lx"), end);
18648           global_end = end;
18649         }
18650     }
18651   else
18652     {
18653       printf (_("    Applies to region from %#lx"), start);
18654       func_offset = start;
18655
18656       if (end)
18657         {
18658           printf (_(" to %#lx"), end);
18659           func_end = end;
18660         }
18661     }
18662
18663   if (sym && name)
18664     printf (_(" (%s)"), name);
18665
18666   printf ("\n");
18667   return TRUE;
18668 }
18669
18670 static bfd_boolean
18671 print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
18672 {
18673   static const char string_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_STRING, 0 };
18674   static const char number_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC, 0 };
18675   static const char bool_expected [3] = { GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE, GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE, 0 };
18676   char         name_type;
18677   char         name_attribute;
18678   const char * expected_types;
18679   const char * name = pnote->namedata;
18680   const char * text;
18681   signed int   left;
18682
18683   if (name == NULL || pnote->namesz < 2)
18684     {
18685       error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
18686       print_symbol (-20, _("  <corrupt name>"));
18687       return FALSE;
18688     }
18689
18690   if (do_wide)
18691     left = 28;
18692   else
18693     left = 20;
18694
18695   /* Version 2 of the spec adds a "GA" prefix to the name field.  */
18696   if (name[0] == 'G' && name[1] == 'A')
18697     {
18698       if (pnote->namesz < 4)
18699         {
18700           error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
18701           print_symbol (-20, _("  <corrupt name>"));
18702           return FALSE;
18703         }
18704
18705       printf ("GA");
18706       name += 2;
18707       left -= 2;
18708     }
18709
18710   switch ((name_type = * name))
18711     {
18712     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18713     case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
18714     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
18715     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
18716       printf ("%c", * name);
18717       left --;
18718       break;
18719     default:
18720       error (_("unrecognised attribute type in name field: %d\n"), name_type);
18721       print_symbol (-20, _("<unknown name type>"));
18722       return FALSE;
18723     }
18724
18725   ++ name;
18726   text = NULL;
18727
18728   switch ((name_attribute = * name))
18729     {
18730     case GNU_BUILD_ATTRIBUTE_VERSION:
18731       text = _("<version>");
18732       expected_types = string_expected;
18733       ++ name;
18734       break;
18735     case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18736       text = _("<stack prot>");
18737       expected_types = "!+*";
18738       ++ name;
18739       break;
18740     case GNU_BUILD_ATTRIBUTE_RELRO:
18741       text = _("<relro>");
18742       expected_types = bool_expected;
18743       ++ name;
18744       break;
18745     case GNU_BUILD_ATTRIBUTE_STACK_SIZE:
18746       text = _("<stack size>");
18747       expected_types = number_expected;
18748       ++ name;
18749       break;
18750     case GNU_BUILD_ATTRIBUTE_TOOL:
18751       text = _("<tool>");
18752       expected_types = string_expected;
18753       ++ name;
18754       break;
18755     case GNU_BUILD_ATTRIBUTE_ABI:
18756       text = _("<ABI>");
18757       expected_types = "$*";
18758       ++ name;
18759       break;
18760     case GNU_BUILD_ATTRIBUTE_PIC:
18761       text = _("<PIC>");
18762       expected_types = number_expected;
18763       ++ name;
18764       break;
18765     case GNU_BUILD_ATTRIBUTE_SHORT_ENUM:
18766       text = _("<short enum>");
18767       expected_types = bool_expected;
18768       ++ name;
18769       break;
18770     default:
18771       if (ISPRINT (* name))
18772         {
18773           int len = strnlen (name, pnote->namesz - (name - pnote->namedata)) + 1;
18774
18775           if (len > left && ! do_wide)
18776             len = left;
18777           printf ("%.*s:", len, name);
18778           left -= len;
18779           name += len;
18780         }
18781       else
18782         {
18783           static char tmpbuf [128];
18784
18785           error (_("unrecognised byte in name field: %d\n"), * name);
18786           sprintf (tmpbuf, _("<unknown:_%d>"), * name);
18787           text = tmpbuf;
18788           name ++;
18789         }
18790       expected_types = "*$!+";
18791       break;
18792     }
18793
18794   if (text)
18795     left -= printf ("%s", text);
18796
18797   if (strchr (expected_types, name_type) == NULL)
18798     warn (_("attribute does not have an expected type (%c)\n"), name_type);
18799
18800   if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
18801     {
18802       error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
18803              (unsigned long) pnote->namesz,
18804              (long) (name - pnote->namedata));
18805       return FALSE;
18806     }
18807
18808   if (left < 1 && ! do_wide)
18809     return TRUE;
18810
18811   switch (name_type)
18812     {
18813     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18814       {
18815         unsigned int        bytes;
18816         unsigned long long  val = 0;
18817         unsigned int        shift = 0;
18818         char *              decoded = NULL;
18819
18820         bytes = pnote->namesz - (name - pnote->namedata);
18821         if (bytes > 0)
18822           /* The -1 is because the name field is always 0 terminated, and we
18823              want to be able to ensure that the shift in the while loop below
18824              will not overflow.  */
18825           -- bytes;
18826
18827         if (bytes > sizeof (val))
18828           {
18829             error (_("corrupt numeric name field: too many bytes in the value: %x\n"),
18830                    bytes);
18831             bytes = sizeof (val);
18832           }
18833         /* We do not bother to warn if bytes == 0 as this can
18834            happen with some early versions of the gcc plugin.  */
18835
18836         while (bytes --)
18837           {
18838             unsigned long byte = (* name ++) & 0xff;
18839
18840             val |= byte << shift;
18841             shift += 8;
18842           }
18843
18844         switch (name_attribute)
18845           {
18846           case GNU_BUILD_ATTRIBUTE_PIC:
18847             switch (val)
18848               {
18849               case 0: decoded = "static"; break;
18850               case 1: decoded = "pic"; break;
18851               case 2: decoded = "PIC"; break;
18852               case 3: decoded = "pie"; break;
18853               case 4: decoded = "PIE"; break;
18854               default: break;
18855               }
18856             break;
18857           case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18858             switch (val)
18859               {
18860                 /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c.  */
18861               case 0: decoded = "off"; break;
18862               case 1: decoded = "on"; break;
18863               case 2: decoded = "all"; break;
18864               case 3: decoded = "strong"; break;
18865               case 4: decoded = "explicit"; break;
18866               default: break;
18867               }
18868             break;
18869           default:
18870             break;
18871           }
18872
18873         if (decoded != NULL)
18874           {
18875             print_symbol (-left, decoded);
18876             left = 0;
18877           }
18878         else if (val == 0)
18879           {
18880             printf ("0x0");
18881             left -= 3;
18882           }
18883         else
18884           {
18885             if (do_wide)
18886               left -= printf ("0x%llx", val);
18887             else
18888               left -= printf ("0x%-.*llx", left, val);
18889           }
18890       }
18891       break;
18892     case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
18893       left -= print_symbol (- left, name);
18894       break;
18895     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
18896       left -= print_symbol (- left, "true");
18897       break;
18898     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
18899       left -= print_symbol (- left, "false");
18900       break;
18901     }
18902
18903   if (do_wide && left > 0)
18904     printf ("%-*s", left, " ");
18905     
18906   return TRUE;
18907 }
18908
18909 /* Note that by the ELF standard, the name field is already null byte
18910    terminated, and namesz includes the terminating null byte.
18911    I.E. the value of namesz for the name "FSF" is 4.
18912
18913    If the value of namesz is zero, there is no name present.  */
18914
18915 static bfd_boolean
18916 process_note (Elf_Internal_Note *  pnote,
18917               Filedata *           filedata)
18918 {
18919   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
18920   const char * nt;
18921
18922   if (pnote->namesz == 0)
18923     /* If there is no note name, then use the default set of
18924        note type strings.  */
18925     nt = get_note_type (filedata, pnote->type);
18926
18927   else if (const_strneq (pnote->namedata, "GNU"))
18928     /* GNU-specific object file notes.  */
18929     nt = get_gnu_elf_note_type (pnote->type);
18930
18931   else if (const_strneq (pnote->namedata, "FreeBSD"))
18932     /* FreeBSD-specific core file notes.  */
18933     nt = get_freebsd_elfcore_note_type (filedata, pnote->type);
18934
18935   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
18936     /* NetBSD-specific core file notes.  */
18937     nt = get_netbsd_elfcore_note_type (filedata, pnote->type);
18938
18939   else if (const_strneq (pnote->namedata, "NetBSD"))
18940     /* NetBSD-specific core file notes.  */
18941     return process_netbsd_elf_note (pnote);
18942
18943   else if (strneq (pnote->namedata, "SPU/", 4))
18944     {
18945       /* SPU-specific core file notes.  */
18946       nt = pnote->namedata + 4;
18947       name = "SPU";
18948     }
18949
18950   else if (const_strneq (pnote->namedata, "IPF/VMS"))
18951     /* VMS/ia64-specific file notes.  */
18952     nt = get_ia64_vms_note_type (pnote->type);
18953
18954   else if (const_strneq (pnote->namedata, "stapsdt"))
18955     nt = get_stapsdt_note_type (pnote->type);
18956
18957   else
18958     /* Don't recognize this note name; just use the default set of
18959        note type strings.  */
18960     nt = get_note_type (filedata, pnote->type);
18961
18962   printf ("  ");
18963
18964   if (((const_strneq (pnote->namedata, "GA")
18965         && strchr ("*$!+", pnote->namedata[2]) != NULL)
18966        || strchr ("*$!+", pnote->namedata[0]) != NULL)
18967       && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18968           || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
18969     print_gnu_build_attribute_name (pnote);
18970   else
18971     print_symbol (-20, name);
18972
18973   if (do_wide)
18974     printf (" 0x%08lx\t%s\t", pnote->descsz, nt);
18975   else
18976     printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
18977
18978   if (const_strneq (pnote->namedata, "IPF/VMS"))
18979     return print_ia64_vms_note (pnote);
18980   else if (const_strneq (pnote->namedata, "GNU"))
18981     return print_gnu_note (filedata, pnote);
18982   else if (const_strneq (pnote->namedata, "stapsdt"))
18983     return print_stapsdt_note (pnote);
18984   else if (const_strneq (pnote->namedata, "CORE"))
18985     return print_core_note (pnote);
18986   else if (((const_strneq (pnote->namedata, "GA")
18987              && strchr ("*$!+", pnote->namedata[2]) != NULL)
18988             || strchr ("*$!+", pnote->namedata[0]) != NULL)
18989            && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18990                || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
18991     return print_gnu_build_attribute_description (pnote, filedata);
18992
18993   if (pnote->descsz)
18994     {
18995       unsigned long i;
18996
18997       printf (_("   description data: "));
18998       for (i = 0; i < pnote->descsz; i++)
18999         printf ("%02x ", pnote->descdata[i]);
19000       if (!do_wide)
19001         printf ("\n");
19002     }
19003
19004   if (do_wide)
19005     printf ("\n");
19006
19007   return TRUE;
19008 }
19009
19010 static bfd_boolean
19011 process_notes_at (Filedata *           filedata,
19012                   Elf_Internal_Shdr *  section,
19013                   bfd_vma              offset,
19014                   bfd_vma              length,
19015                   bfd_vma              align)
19016 {
19017   Elf_External_Note * pnotes;
19018   Elf_External_Note * external;
19019   char *              end;
19020   bfd_boolean         res = TRUE;
19021
19022   if (length <= 0)
19023     return FALSE;
19024
19025   if (section)
19026     {
19027       pnotes = (Elf_External_Note *) get_section_contents (section, filedata);
19028       if (pnotes)
19029         {
19030           if (! apply_relocations (filedata, section, (unsigned char *) pnotes, length, NULL, NULL))
19031             return FALSE;
19032         }
19033     }
19034   else
19035     pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
19036                                              _("notes"));
19037
19038   if (pnotes == NULL)
19039     return FALSE;
19040
19041   external = pnotes;
19042
19043   if (section)
19044     printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (filedata, section));
19045   else
19046     printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
19047             (unsigned long) offset, (unsigned long) length);
19048
19049   /* NB: Some note sections may have alignment value of 0 or 1.  gABI
19050      specifies that notes should be aligned to 4 bytes in 32-bit
19051      objects and to 8 bytes in 64-bit objects.  As a Linux extension,
19052      we also support 4 byte alignment in 64-bit objects.  If section
19053      alignment is less than 4, we treate alignment as 4 bytes.   */
19054   if (align < 4)
19055     align = 4;
19056   else if (align != 4 && align != 8)
19057     {
19058       warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
19059             (long) align);
19060       return FALSE;
19061     }
19062
19063   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
19064
19065   end = (char *) pnotes + length;
19066   while ((char *) external < end)
19067     {
19068       Elf_Internal_Note inote;
19069       size_t min_notesz;
19070       char * next;
19071       char * temp = NULL;
19072       size_t data_remaining = end - (char *) external;
19073
19074       if (!is_ia64_vms (filedata))
19075         {
19076           /* PR binutils/15191
19077              Make sure that there is enough data to read.  */
19078           min_notesz = offsetof (Elf_External_Note, name);
19079           if (data_remaining < min_notesz)
19080             {
19081               warn (ngettext ("Corrupt note: only %ld byte remains, "
19082                               "not enough for a full note\n",
19083                               "Corrupt note: only %ld bytes remain, "
19084                               "not enough for a full note\n",
19085                               data_remaining),
19086                     (long) data_remaining);
19087               break;
19088             }
19089           data_remaining -= min_notesz;
19090
19091           inote.type     = BYTE_GET (external->type);
19092           inote.namesz   = BYTE_GET (external->namesz);
19093           inote.namedata = external->name;
19094           inote.descsz   = BYTE_GET (external->descsz);
19095           inote.descdata = ((char *) external
19096                             + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
19097           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
19098           next = ((char *) external
19099                   + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
19100         }
19101       else
19102         {
19103           Elf64_External_VMS_Note *vms_external;
19104
19105           /* PR binutils/15191
19106              Make sure that there is enough data to read.  */
19107           min_notesz = offsetof (Elf64_External_VMS_Note, name);
19108           if (data_remaining < min_notesz)
19109             {
19110               warn (ngettext ("Corrupt note: only %ld byte remains, "
19111                               "not enough for a full note\n",
19112                               "Corrupt note: only %ld bytes remain, "
19113                               "not enough for a full note\n",
19114                               data_remaining),
19115                     (long) data_remaining);
19116               break;
19117             }
19118           data_remaining -= min_notesz;
19119
19120           vms_external = (Elf64_External_VMS_Note *) external;
19121           inote.type     = BYTE_GET (vms_external->type);
19122           inote.namesz   = BYTE_GET (vms_external->namesz);
19123           inote.namedata = vms_external->name;
19124           inote.descsz   = BYTE_GET (vms_external->descsz);
19125           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
19126           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
19127           next = inote.descdata + align_power (inote.descsz, 3);
19128         }
19129
19130       /* PR 17531: file: 3443835e.  */
19131       /* PR 17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4.  */
19132       if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
19133           || (size_t) (inote.descdata - inote.namedata) > data_remaining
19134           || (size_t) (next - inote.descdata) < inote.descsz
19135           || ((size_t) (next - inote.descdata)
19136               > data_remaining - (size_t) (inote.descdata - inote.namedata)))
19137         {
19138           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
19139                 (unsigned long) ((char *) external - (char *) pnotes));
19140           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
19141                 inote.type, inote.namesz, inote.descsz, (int) align);
19142           break;
19143         }
19144
19145       external = (Elf_External_Note *) next;
19146
19147       /* Verify that name is null terminated.  It appears that at least
19148          one version of Linux (RedHat 6.0) generates corefiles that don't
19149          comply with the ELF spec by failing to include the null byte in
19150          namesz.  */
19151       if (inote.namesz > 0 && inote.namedata[inote.namesz - 1] != '\0')
19152         {
19153           if ((size_t) (inote.descdata - inote.namedata) == inote.namesz)
19154             {
19155               temp = (char *) malloc (inote.namesz + 1);
19156               if (temp == NULL)
19157                 {
19158                   error (_("Out of memory allocating space for inote name\n"));
19159                   res = FALSE;
19160                   break;
19161                 }
19162
19163               memcpy (temp, inote.namedata, inote.namesz);
19164               inote.namedata = temp;
19165             }
19166           inote.namedata[inote.namesz] = 0;
19167         }
19168
19169       if (! process_note (& inote, filedata))
19170         res = FALSE;
19171
19172       if (temp != NULL)
19173         {
19174           free (temp);
19175           temp = NULL;
19176         }
19177     }
19178
19179   free (pnotes);
19180
19181   return res;
19182 }
19183
19184 static bfd_boolean
19185 process_corefile_note_segments (Filedata * filedata)
19186 {
19187   Elf_Internal_Phdr * segment;
19188   unsigned int i;
19189   bfd_boolean res = TRUE;
19190
19191   if (! get_program_headers (filedata))
19192     return TRUE;
19193
19194   for (i = 0, segment = filedata->program_headers;
19195        i < filedata->file_header.e_phnum;
19196        i++, segment++)
19197     {
19198       if (segment->p_type == PT_NOTE)
19199         if (! process_notes_at (filedata, NULL,
19200                                 (bfd_vma) segment->p_offset,
19201                                 (bfd_vma) segment->p_filesz,
19202                                 (bfd_vma) segment->p_align))
19203           res = FALSE;
19204     }
19205
19206   return res;
19207 }
19208
19209 static bfd_boolean
19210 process_v850_notes (Filedata * filedata, bfd_vma offset, bfd_vma length)
19211 {
19212   Elf_External_Note * pnotes;
19213   Elf_External_Note * external;
19214   char * end;
19215   bfd_boolean res = TRUE;
19216
19217   if (length <= 0)
19218     return FALSE;
19219
19220   pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
19221                                            _("v850 notes"));
19222   if (pnotes == NULL)
19223     return FALSE;
19224
19225   external = pnotes;
19226   end = (char*) pnotes + length;
19227
19228   printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
19229           (unsigned long) offset, (unsigned long) length);
19230
19231   while ((char *) external + sizeof (Elf_External_Note) < end)
19232     {
19233       Elf_External_Note * next;
19234       Elf_Internal_Note inote;
19235
19236       inote.type     = BYTE_GET (external->type);
19237       inote.namesz   = BYTE_GET (external->namesz);
19238       inote.namedata = external->name;
19239       inote.descsz   = BYTE_GET (external->descsz);
19240       inote.descdata = inote.namedata + align_power (inote.namesz, 2);
19241       inote.descpos  = offset + (inote.descdata - (char *) pnotes);
19242
19243       if (inote.descdata < (char *) pnotes || inote.descdata >= end)
19244         {
19245           warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
19246           inote.descdata = inote.namedata;
19247           inote.namesz   = 0;
19248         }
19249
19250       next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
19251
19252       if (   ((char *) next > end)
19253           || ((char *) next <  (char *) pnotes))
19254         {
19255           warn (_("corrupt descsz found in note at offset 0x%lx\n"),
19256                 (unsigned long) ((char *) external - (char *) pnotes));
19257           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
19258                 inote.type, inote.namesz, inote.descsz);
19259           break;
19260         }
19261
19262       external = next;
19263
19264       /* Prevent out-of-bounds indexing.  */
19265       if (   inote.namedata + inote.namesz > end
19266           || inote.namedata + inote.namesz < inote.namedata)
19267         {
19268           warn (_("corrupt namesz found in note at offset 0x%lx\n"),
19269                 (unsigned long) ((char *) external - (char *) pnotes));
19270           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
19271                 inote.type, inote.namesz, inote.descsz);
19272           break;
19273         }
19274
19275       printf ("  %s: ", get_v850_elf_note_type (inote.type));
19276
19277       if (! print_v850_note (& inote))
19278         {
19279           res = FALSE;
19280           printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
19281                   inote.namesz, inote.descsz);
19282         }
19283     }
19284
19285   free (pnotes);
19286
19287   return res;
19288 }
19289
19290 static bfd_boolean
19291 process_note_sections (Filedata * filedata)
19292 {
19293   Elf_Internal_Shdr * section;
19294   unsigned long i;
19295   unsigned int n = 0;
19296   bfd_boolean res = TRUE;
19297
19298   for (i = 0, section = filedata->section_headers;
19299        i < filedata->file_header.e_shnum && section != NULL;
19300        i++, section++)
19301     {
19302       if (section->sh_type == SHT_NOTE)
19303         {
19304           if (! process_notes_at (filedata, section,
19305                                   (bfd_vma) section->sh_offset,
19306                                   (bfd_vma) section->sh_size,
19307                                   (bfd_vma) section->sh_addralign))
19308             res = FALSE;
19309           n++;
19310         }
19311
19312       if ((   filedata->file_header.e_machine == EM_V800
19313            || filedata->file_header.e_machine == EM_V850
19314            || filedata->file_header.e_machine == EM_CYGNUS_V850)
19315           && section->sh_type == SHT_RENESAS_INFO)
19316         {
19317           if (! process_v850_notes (filedata,
19318                                     (bfd_vma) section->sh_offset,
19319                                     (bfd_vma) section->sh_size))
19320             res = FALSE;
19321           n++;
19322         }
19323     }
19324
19325   if (n == 0)
19326     /* Try processing NOTE segments instead.  */
19327     return process_corefile_note_segments (filedata);
19328
19329   return res;
19330 }
19331
19332 static bfd_boolean
19333 process_notes (Filedata * filedata)
19334 {
19335   /* If we have not been asked to display the notes then do nothing.  */
19336   if (! do_notes)
19337     return TRUE;
19338
19339   if (filedata->file_header.e_type != ET_CORE)
19340     return process_note_sections (filedata);
19341
19342   /* No program headers means no NOTE segment.  */
19343   if (filedata->file_header.e_phnum > 0)
19344     return process_corefile_note_segments (filedata);
19345
19346   printf (_("No note segments present in the core file.\n"));
19347   return TRUE;
19348 }
19349
19350 static unsigned char *
19351 display_public_gnu_attributes (unsigned char * start,
19352                                const unsigned char * const end)
19353 {
19354   printf (_("  Unknown GNU attribute: %s\n"), start);
19355
19356   start += strnlen ((char *) start, end - start);
19357   display_raw_attribute (start, end);
19358
19359   return (unsigned char *) end;
19360 }
19361
19362 static unsigned char *
19363 display_generic_attribute (unsigned char * start,
19364                            unsigned int tag,
19365                            const unsigned char * const end)
19366 {
19367   if (tag == 0)
19368     return (unsigned char *) end;
19369
19370   return display_tag_value (tag, start, end);
19371 }
19372
19373 static bfd_boolean
19374 process_arch_specific (Filedata * filedata)
19375 {
19376   if (! do_arch)
19377     return TRUE;
19378
19379   switch (filedata->file_header.e_machine)
19380     {
19381     case EM_ARC:
19382     case EM_ARC_COMPACT:
19383     case EM_ARC_COMPACT2:
19384       return process_attributes (filedata, "ARC", SHT_ARC_ATTRIBUTES,
19385                                  display_arc_attribute,
19386                                  display_generic_attribute);
19387     case EM_ARM:
19388       return process_attributes (filedata, "aeabi", SHT_ARM_ATTRIBUTES,
19389                                  display_arm_attribute,
19390                                  display_generic_attribute);
19391
19392     case EM_MIPS:
19393     case EM_MIPS_RS3_LE:
19394       return process_mips_specific (filedata);
19395
19396     case EM_MSP430:
19397      return process_attributes (filedata, "mspabi", SHT_MSP430_ATTRIBUTES,
19398                                 display_msp430x_attribute,
19399                                 display_generic_attribute);
19400
19401     case EM_RISCV:
19402      return process_attributes (filedata, "riscv", SHT_RISCV_ATTRIBUTES,
19403                                 display_riscv_attribute,
19404                                 display_generic_attribute);
19405
19406     case EM_NDS32:
19407       return process_nds32_specific (filedata);
19408
19409     case EM_PPC:
19410     case EM_PPC64:
19411       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19412                                  display_power_gnu_attribute);
19413
19414     case EM_S390:
19415     case EM_S390_OLD:
19416       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19417                                  display_s390_gnu_attribute);
19418
19419     case EM_SPARC:
19420     case EM_SPARC32PLUS:
19421     case EM_SPARCV9:
19422       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19423                                  display_sparc_gnu_attribute);
19424
19425     case EM_TI_C6000:
19426       return process_attributes (filedata, "c6xabi", SHT_C6000_ATTRIBUTES,
19427                                  display_tic6x_attribute,
19428                                  display_generic_attribute);
19429
19430     default:
19431       return process_attributes (filedata, "gnu", SHT_GNU_ATTRIBUTES,
19432                                  display_public_gnu_attributes,
19433                                  display_generic_attribute);
19434     }
19435 }
19436
19437 static bfd_boolean
19438 get_file_header (Filedata * filedata)
19439 {
19440   /* Read in the identity array.  */
19441   if (fread (filedata->file_header.e_ident, EI_NIDENT, 1, filedata->handle) != 1)
19442     return FALSE;
19443
19444   /* Determine how to read the rest of the header.  */
19445   switch (filedata->file_header.e_ident[EI_DATA])
19446     {
19447     default:
19448     case ELFDATANONE:
19449     case ELFDATA2LSB:
19450       byte_get = byte_get_little_endian;
19451       byte_put = byte_put_little_endian;
19452       break;
19453     case ELFDATA2MSB:
19454       byte_get = byte_get_big_endian;
19455       byte_put = byte_put_big_endian;
19456       break;
19457     }
19458
19459   /* For now we only support 32 bit and 64 bit ELF files.  */
19460   is_32bit_elf = (filedata->file_header.e_ident[EI_CLASS] != ELFCLASS64);
19461
19462   /* Read in the rest of the header.  */
19463   if (is_32bit_elf)
19464     {
19465       Elf32_External_Ehdr ehdr32;
19466
19467       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, filedata->handle) != 1)
19468         return FALSE;
19469
19470       filedata->file_header.e_type      = BYTE_GET (ehdr32.e_type);
19471       filedata->file_header.e_machine   = BYTE_GET (ehdr32.e_machine);
19472       filedata->file_header.e_version   = BYTE_GET (ehdr32.e_version);
19473       filedata->file_header.e_entry     = BYTE_GET (ehdr32.e_entry);
19474       filedata->file_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
19475       filedata->file_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
19476       filedata->file_header.e_flags     = BYTE_GET (ehdr32.e_flags);
19477       filedata->file_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
19478       filedata->file_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
19479       filedata->file_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
19480       filedata->file_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
19481       filedata->file_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
19482       filedata->file_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
19483     }
19484   else
19485     {
19486       Elf64_External_Ehdr ehdr64;
19487
19488       /* If we have been compiled with sizeof (bfd_vma) == 4, then
19489          we will not be able to cope with the 64bit data found in
19490          64 ELF files.  Detect this now and abort before we start
19491          overwriting things.  */
19492       if (sizeof (bfd_vma) < 8)
19493         {
19494           error (_("This instance of readelf has been built without support for a\n\
19495 64 bit data type and so it cannot read 64 bit ELF files.\n"));
19496           return FALSE;
19497         }
19498
19499       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, filedata->handle) != 1)
19500         return FALSE;
19501
19502       filedata->file_header.e_type      = BYTE_GET (ehdr64.e_type);
19503       filedata->file_header.e_machine   = BYTE_GET (ehdr64.e_machine);
19504       filedata->file_header.e_version   = BYTE_GET (ehdr64.e_version);
19505       filedata->file_header.e_entry     = BYTE_GET (ehdr64.e_entry);
19506       filedata->file_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
19507       filedata->file_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
19508       filedata->file_header.e_flags     = BYTE_GET (ehdr64.e_flags);
19509       filedata->file_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
19510       filedata->file_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
19511       filedata->file_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
19512       filedata->file_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
19513       filedata->file_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
19514       filedata->file_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
19515     }
19516
19517   if (filedata->file_header.e_shoff)
19518     {
19519       /* There may be some extensions in the first section header.  Don't
19520          bomb if we can't read it.  */
19521       if (is_32bit_elf)
19522         get_32bit_section_headers (filedata, TRUE);
19523       else
19524         get_64bit_section_headers (filedata, TRUE);
19525     }
19526
19527   return TRUE;
19528 }
19529
19530 static void
19531 close_file (Filedata * filedata)
19532 {
19533   if (filedata)
19534     {
19535       if (filedata->handle)
19536         fclose (filedata->handle);
19537       free (filedata);
19538     }
19539 }
19540
19541 void
19542 close_debug_file (void * data)
19543 {
19544   close_file ((Filedata *) data);
19545 }
19546
19547 static Filedata *
19548 open_file (const char * pathname)
19549 {
19550   struct stat  statbuf;
19551   Filedata *   filedata = NULL;
19552
19553   if (stat (pathname, & statbuf) < 0
19554       || ! S_ISREG (statbuf.st_mode))
19555     goto fail;
19556
19557   filedata = calloc (1, sizeof * filedata);
19558   if (filedata == NULL)
19559     goto fail;
19560
19561   filedata->handle = fopen (pathname, "rb");
19562   if (filedata->handle == NULL)
19563     goto fail;
19564
19565   filedata->file_size = (bfd_size_type) statbuf.st_size;
19566   filedata->file_name = pathname;
19567
19568   if (! get_file_header (filedata))
19569     goto fail;
19570
19571   if (filedata->file_header.e_shoff)
19572     {
19573       bfd_boolean res;
19574
19575       /* Read the section headers again, this time for real.  */
19576       if (is_32bit_elf)
19577         res = get_32bit_section_headers (filedata, FALSE);
19578       else
19579         res = get_64bit_section_headers (filedata, FALSE);
19580
19581       if (!res)
19582         goto fail;
19583     }
19584
19585   return filedata;
19586
19587  fail:
19588   if (filedata)
19589     {
19590       if (filedata->handle)
19591         fclose (filedata->handle);
19592       free (filedata);
19593     }
19594   return NULL;
19595 }
19596
19597 void *
19598 open_debug_file (const char * pathname)
19599 {
19600   return open_file (pathname);
19601 }
19602
19603 /* Process one ELF object file according to the command line options.
19604    This file may actually be stored in an archive.  The file is
19605    positioned at the start of the ELF object.  Returns TRUE if no
19606    problems were encountered, FALSE otherwise.  */
19607
19608 static bfd_boolean
19609 process_object (Filedata * filedata)
19610 {
19611   bfd_boolean  have_separate_files;
19612   unsigned int i;
19613   bfd_boolean res = TRUE;
19614
19615   if (! get_file_header (filedata))
19616     {
19617       error (_("%s: Failed to read file header\n"), filedata->file_name);
19618       return FALSE;
19619     }
19620
19621   /* Initialise per file variables.  */
19622   for (i = ARRAY_SIZE (version_info); i--;)
19623     version_info[i] = 0;
19624
19625   for (i = ARRAY_SIZE (dynamic_info); i--;)
19626     dynamic_info[i] = 0;
19627   dynamic_info_DT_GNU_HASH = 0;
19628
19629   /* Process the file.  */
19630   if (show_name)
19631     printf (_("\nFile: %s\n"), filedata->file_name);
19632
19633   /* Initialise the dump_sects array from the cmdline_dump_sects array.
19634      Note we do this even if cmdline_dump_sects is empty because we
19635      must make sure that the dump_sets array is zeroed out before each
19636      object file is processed.  */
19637   if (filedata->num_dump_sects > cmdline.num_dump_sects)
19638     memset (filedata->dump_sects, 0, filedata->num_dump_sects * sizeof (* filedata->dump_sects));
19639
19640   if (cmdline.num_dump_sects > 0)
19641     {
19642       if (filedata->num_dump_sects == 0)
19643         /* A sneaky way of allocating the dump_sects array.  */
19644         request_dump_bynumber (filedata, cmdline.num_dump_sects, 0);
19645
19646       assert (filedata->num_dump_sects >= cmdline.num_dump_sects);
19647       memcpy (filedata->dump_sects, cmdline.dump_sects,
19648               cmdline.num_dump_sects * sizeof (* filedata->dump_sects));
19649     }
19650
19651   if (! process_file_header (filedata))
19652     return FALSE;
19653
19654   if (! process_section_headers (filedata))
19655     {
19656       /* Without loaded section headers we cannot process lots of things.  */
19657       do_unwind = do_version = do_dump = do_arch = FALSE;
19658
19659       if (! do_using_dynamic)
19660         do_syms = do_dyn_syms = do_reloc = FALSE;
19661     }
19662
19663   if (! process_section_groups (filedata))
19664     /* Without loaded section groups we cannot process unwind.  */
19665     do_unwind = FALSE;
19666
19667   if (process_program_headers (filedata))
19668     process_dynamic_section (filedata);
19669   else
19670     res = FALSE;
19671
19672   if (! process_relocs (filedata))
19673     res = FALSE;
19674
19675   if (! process_unwind (filedata))
19676     res = FALSE;
19677
19678   if (! process_symbol_table (filedata))
19679     res = FALSE;
19680
19681   if (! process_syminfo (filedata))
19682     res = FALSE;
19683
19684   if (! process_version_sections (filedata))
19685     res = FALSE;
19686
19687   if (filedata->file_header.e_shstrndx != SHN_UNDEF)
19688     have_separate_files = load_separate_debug_files (filedata, filedata->file_name);
19689   else
19690     have_separate_files = FALSE;
19691
19692   if (! process_section_contents (filedata))
19693     res = FALSE;
19694
19695   if (have_separate_files)
19696     {
19697       separate_info * d;
19698
19699       for (d = first_separate_info; d != NULL; d = d->next)
19700         {
19701           if (! process_section_headers (d->handle))
19702             res = FALSE;
19703           else if (! process_section_contents (d->handle))
19704             res = FALSE;
19705         }
19706
19707       /* The file handles are closed by the call to free_debug_memory() below.  */
19708     }
19709
19710   if (! process_notes (filedata))
19711     res = FALSE;
19712
19713   if (! process_gnu_liblist (filedata))
19714     res = FALSE;
19715
19716   if (! process_arch_specific (filedata))
19717     res = FALSE;
19718
19719   free (filedata->program_headers);
19720   filedata->program_headers = NULL;
19721
19722   free (filedata->section_headers);
19723   filedata->section_headers = NULL;
19724
19725   free (filedata->string_table);
19726   filedata->string_table = NULL;
19727   filedata->string_table_length = 0;
19728
19729   if (dynamic_strings)
19730     {
19731       free (dynamic_strings);
19732       dynamic_strings = NULL;
19733       dynamic_strings_length = 0;
19734     }
19735
19736   if (dynamic_symbols)
19737     {
19738       free (dynamic_symbols);
19739       dynamic_symbols = NULL;
19740       num_dynamic_syms = 0;
19741     }
19742
19743   if (dynamic_syminfo)
19744     {
19745       free (dynamic_syminfo);
19746       dynamic_syminfo = NULL;
19747     }
19748
19749   if (dynamic_section)
19750     {
19751       free (dynamic_section);
19752       dynamic_section = NULL;
19753     }
19754
19755   if (section_headers_groups)
19756     {
19757       free (section_headers_groups);
19758       section_headers_groups = NULL;
19759     }
19760
19761   if (section_groups)
19762     {
19763       struct group_list * g;
19764       struct group_list * next;
19765
19766       for (i = 0; i < group_count; i++)
19767         {
19768           for (g = section_groups [i].root; g != NULL; g = next)
19769             {
19770               next = g->next;
19771               free (g);
19772             }
19773         }
19774
19775       free (section_groups);
19776       section_groups = NULL;
19777     }
19778
19779   free_debug_memory ();
19780
19781   return res;
19782 }
19783
19784 /* Process an ELF archive.
19785    On entry the file is positioned just after the ARMAG string.
19786    Returns TRUE upon success, FALSE otherwise.  */
19787
19788 static bfd_boolean
19789 process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
19790 {
19791   struct archive_info arch;
19792   struct archive_info nested_arch;
19793   size_t got;
19794   bfd_boolean ret = TRUE;
19795
19796   show_name = TRUE;
19797
19798   /* The ARCH structure is used to hold information about this archive.  */
19799   arch.file_name = NULL;
19800   arch.file = NULL;
19801   arch.index_array = NULL;
19802   arch.sym_table = NULL;
19803   arch.longnames = NULL;
19804
19805   /* The NESTED_ARCH structure is used as a single-item cache of information
19806      about a nested archive (when members of a thin archive reside within
19807      another regular archive file).  */
19808   nested_arch.file_name = NULL;
19809   nested_arch.file = NULL;
19810   nested_arch.index_array = NULL;
19811   nested_arch.sym_table = NULL;
19812   nested_arch.longnames = NULL;
19813
19814   if (setup_archive (&arch, filedata->file_name, filedata->handle,
19815                      is_thin_archive, do_archive_index) != 0)
19816     {
19817       ret = FALSE;
19818       goto out;
19819     }
19820
19821   if (do_archive_index)
19822     {
19823       if (arch.sym_table == NULL)
19824         error (_("%s: unable to dump the index as none was found\n"), filedata->file_name);
19825       else
19826         {
19827           unsigned long i, l;
19828           unsigned long current_pos;
19829
19830           printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
19831                   filedata->file_name, (unsigned long) arch.index_num, arch.sym_size);
19832
19833           current_pos = ftell (filedata->handle);
19834
19835           for (i = l = 0; i < arch.index_num; i++)
19836             {
19837               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
19838                 {
19839                   char * member_name;
19840
19841                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
19842
19843                   if (member_name != NULL)
19844                     {
19845                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
19846
19847                       if (qualified_name != NULL)
19848                         {
19849                           printf (_("Contents of binary %s at offset "), qualified_name);
19850                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
19851                           putchar ('\n');
19852                           free (qualified_name);
19853                         }
19854                     }
19855                 }
19856
19857               if (l >= arch.sym_size)
19858                 {
19859                   error (_("%s: end of the symbol table reached before the end of the index\n"),
19860                          filedata->file_name);
19861                   ret = FALSE;
19862                   break;
19863                 }
19864               /* PR 17531: file: 0b6630b2.  */
19865               printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
19866               l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
19867             }
19868
19869           if (arch.uses_64bit_indices)
19870             l = (l + 7) & ~ 7;
19871           else
19872             l += l & 1;
19873
19874           if (l < arch.sym_size)
19875             {
19876               error (ngettext ("%s: %ld byte remains in the symbol table, "
19877                                "but without corresponding entries in "
19878                                "the index table\n",
19879                                "%s: %ld bytes remain in the symbol table, "
19880                                "but without corresponding entries in "
19881                                "the index table\n",
19882                                arch.sym_size - l),
19883                      filedata->file_name, arch.sym_size - l);
19884               ret = FALSE;
19885             }
19886
19887           if (fseek (filedata->handle, current_pos, SEEK_SET) != 0)
19888             {
19889               error (_("%s: failed to seek back to start of object files in the archive\n"),
19890                      filedata->file_name);
19891               ret = FALSE;
19892               goto out;
19893             }
19894         }
19895
19896       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
19897           && !do_segments && !do_header && !do_dump && !do_version
19898           && !do_histogram && !do_debugging && !do_arch && !do_notes
19899           && !do_section_groups && !do_dyn_syms)
19900         {
19901           ret = TRUE; /* Archive index only.  */
19902           goto out;
19903         }
19904     }
19905
19906   while (1)
19907     {
19908       char * name;
19909       size_t namelen;
19910       char * qualified_name;
19911
19912       /* Read the next archive header.  */
19913       if (fseek (filedata->handle, arch.next_arhdr_offset, SEEK_SET) != 0)
19914         {
19915           error (_("%s: failed to seek to next archive header\n"), arch.file_name);
19916           return FALSE;
19917         }
19918       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, filedata->handle);
19919       if (got != sizeof arch.arhdr)
19920         {
19921           if (got == 0)
19922             break;
19923           /* PR 24049 - we cannot use filedata->file_name as this will
19924              have already been freed.  */
19925           error (_("%s: failed to read archive header\n"), arch.file_name);
19926             
19927           ret = FALSE;
19928           break;
19929         }
19930       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
19931         {
19932           error (_("%s: did not find a valid archive header\n"), arch.file_name);
19933           ret = FALSE;
19934           break;
19935         }
19936
19937       arch.next_arhdr_offset += sizeof arch.arhdr;
19938
19939       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
19940       if (archive_file_size & 01)
19941         ++archive_file_size;
19942
19943       name = get_archive_member_name (&arch, &nested_arch);
19944       if (name == NULL)
19945         {
19946           error (_("%s: bad archive file name\n"), arch.file_name);
19947           ret = FALSE;
19948           break;
19949         }
19950       namelen = strlen (name);
19951
19952       qualified_name = make_qualified_name (&arch, &nested_arch, name);
19953       if (qualified_name == NULL)
19954         {
19955           error (_("%s: bad archive file name\n"), arch.file_name);
19956           ret = FALSE;
19957           break;
19958         }
19959
19960       if (is_thin_archive && arch.nested_member_origin == 0)
19961         {
19962           /* This is a proxy for an external member of a thin archive.  */
19963           Filedata * member_filedata;
19964           char * member_file_name = adjust_relative_path
19965             (filedata->file_name, name, namelen);
19966
19967           if (member_file_name == NULL)
19968             {
19969               ret = FALSE;
19970               break;
19971             }
19972
19973           member_filedata = open_file (member_file_name);
19974           if (member_filedata == NULL)
19975             {
19976               error (_("Input file '%s' is not readable.\n"), member_file_name);
19977               free (member_file_name);
19978               ret = FALSE;
19979               break;
19980             }
19981
19982           archive_file_offset = arch.nested_member_origin;
19983           member_filedata->file_name = qualified_name;
19984
19985           if (! process_object (member_filedata))
19986             ret = FALSE;
19987
19988           close_file (member_filedata);
19989           free (member_file_name);
19990         }
19991       else if (is_thin_archive)
19992         {
19993           Filedata thin_filedata;
19994
19995           memset (&thin_filedata, 0, sizeof (thin_filedata));
19996
19997           /* PR 15140: Allow for corrupt thin archives.  */
19998           if (nested_arch.file == NULL)
19999             {
20000               error (_("%s: contains corrupt thin archive: %s\n"),
20001                      qualified_name, name);
20002               ret = FALSE;
20003               break;
20004             }
20005
20006           /* This is a proxy for a member of a nested archive.  */
20007           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
20008
20009           /* The nested archive file will have been opened and setup by
20010              get_archive_member_name.  */
20011           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
20012             {
20013               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
20014               ret = FALSE;
20015               break;
20016             }
20017
20018           thin_filedata.handle = nested_arch.file;
20019           thin_filedata.file_name = qualified_name;
20020           
20021           if (! process_object (& thin_filedata))
20022             ret = FALSE;
20023         }
20024       else
20025         {
20026           archive_file_offset = arch.next_arhdr_offset;
20027           arch.next_arhdr_offset += archive_file_size;
20028
20029           filedata->file_name = qualified_name;
20030           if (! process_object (filedata))
20031             ret = FALSE;
20032         }
20033
20034       if (filedata->dump_sects != NULL)
20035         {
20036           free (filedata->dump_sects);
20037           filedata->dump_sects = NULL;
20038           filedata->num_dump_sects = 0;
20039         }
20040
20041       free (qualified_name);
20042     }
20043
20044  out:
20045   if (nested_arch.file != NULL)
20046     fclose (nested_arch.file);
20047   release_archive (&nested_arch);
20048   release_archive (&arch);
20049
20050   return ret;
20051 }
20052
20053 static bfd_boolean
20054 process_file (char * file_name)
20055 {
20056   Filedata * filedata = NULL;
20057   struct stat statbuf;
20058   char armag[SARMAG];
20059   bfd_boolean ret = TRUE;
20060
20061   if (stat (file_name, &statbuf) < 0)
20062     {
20063       if (errno == ENOENT)
20064         error (_("'%s': No such file\n"), file_name);
20065       else
20066         error (_("Could not locate '%s'.  System error message: %s\n"),
20067                file_name, strerror (errno));
20068       return FALSE;
20069     }
20070
20071   if (! S_ISREG (statbuf.st_mode))
20072     {
20073       error (_("'%s' is not an ordinary file\n"), file_name);
20074       return FALSE;
20075     }
20076
20077   filedata = calloc (1, sizeof * filedata);
20078   if (filedata == NULL)
20079     {
20080       error (_("Out of memory allocating file data structure\n"));
20081       return FALSE;
20082     }
20083
20084   filedata->file_name = file_name;
20085   filedata->handle = fopen (file_name, "rb");
20086   if (filedata->handle == NULL)
20087     {
20088       error (_("Input file '%s' is not readable.\n"), file_name);
20089       free (filedata);
20090       return FALSE;
20091     }
20092
20093   if (fread (armag, SARMAG, 1, filedata->handle) != 1)
20094     {
20095       error (_("%s: Failed to read file's magic number\n"), file_name);
20096       fclose (filedata->handle);
20097       free (filedata);
20098       return FALSE;
20099     }
20100
20101   filedata->file_size = (bfd_size_type) statbuf.st_size;
20102
20103   if (memcmp (armag, ARMAG, SARMAG) == 0)
20104     {
20105       if (! process_archive (filedata, FALSE))
20106         ret = FALSE;
20107     }
20108   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
20109     {
20110       if ( ! process_archive (filedata, TRUE))
20111         ret = FALSE;
20112     }
20113   else
20114     {
20115       if (do_archive_index)
20116         error (_("File %s is not an archive so its index cannot be displayed.\n"),
20117                file_name);
20118
20119       rewind (filedata->handle);
20120       archive_file_size = archive_file_offset = 0;
20121
20122       if (! process_object (filedata))
20123         ret = FALSE;
20124     }
20125
20126   fclose (filedata->handle);
20127   free (filedata);
20128
20129   return ret;
20130 }
20131
20132 #ifdef SUPPORT_DISASSEMBLY
20133 /* Needed by the i386 disassembler.  For extra credit, someone could
20134    fix this so that we insert symbolic addresses here, esp for GOT/PLT
20135    symbols.  */
20136
20137 void
20138 print_address (unsigned int addr, FILE * outfile)
20139 {
20140   fprintf (outfile,"0x%8.8x", addr);
20141 }
20142
20143 /* Needed by the i386 disassembler.  */
20144
20145 void
20146 db_task_printsym (unsigned int addr)
20147 {
20148   print_address (addr, stderr);
20149 }
20150 #endif
20151
20152 int
20153 main (int argc, char ** argv)
20154 {
20155   int err;
20156
20157 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
20158   setlocale (LC_MESSAGES, "");
20159 #endif
20160 #if defined (HAVE_SETLOCALE)
20161   setlocale (LC_CTYPE, "");
20162 #endif
20163   bindtextdomain (PACKAGE, LOCALEDIR);
20164   textdomain (PACKAGE);
20165
20166   expandargv (&argc, &argv);
20167
20168   cmdline.file_name = "<cmdline>";
20169   parse_args (& cmdline, argc, argv);
20170
20171   if (optind < (argc - 1))
20172     show_name = TRUE;
20173   else if (optind >= argc)
20174     {
20175       warn (_("Nothing to do.\n"));
20176       usage (stderr);
20177     }
20178
20179   err = FALSE;
20180   while (optind < argc)
20181     if (! process_file (argv[optind++]))
20182       err = TRUE;
20183
20184   if (cmdline.dump_sects != NULL)
20185     free (cmdline.dump_sects);
20186
20187   free (dump_ctf_symtab_name);
20188   free (dump_ctf_strtab_name);
20189   free (dump_ctf_parent_name);
20190
20191   return err ? EXIT_FAILURE : EXIT_SUCCESS;
20192 }