binutils: CTF support for objdump and readelf
[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: "));
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_type = shdr->sh_type;
13816   buf->cts_flags = shdr->sh_flags;
13817   buf->cts_size = shdr->sh_size;
13818   buf->cts_entsize = shdr->sh_entsize;
13819   buf->cts_offset = (off64_t) shdr->sh_offset;
13820
13821   return buf;
13822 }
13823
13824 /* Formatting callback function passed to ctf_dump.  Returns either the pointer
13825    it is passed, or a pointer to newly-allocated storage, in which case
13826    dump_ctf() will free it when it no longer needs it.  */
13827
13828 static char *dump_ctf_indent_lines (ctf_sect_names_t sect ATTRIBUTE_UNUSED,
13829                                     char *s, void *arg)
13830 {
13831   char *spaces = arg;
13832   char *new_s;
13833
13834   if (asprintf (&new_s, "%s%s", spaces, s) < 0)
13835     return s;
13836   return new_s;
13837 }
13838
13839 static bfd_boolean
13840 dump_section_as_ctf (Elf_Internal_Shdr * section, Filedata * filedata)
13841 {
13842   Elf_Internal_Shdr *  parent_sec = NULL;
13843   Elf_Internal_Shdr *  symtab_sec = NULL;
13844   Elf_Internal_Shdr *  strtab_sec = NULL;
13845   void *               data = NULL;
13846   void *               symdata = NULL;
13847   void *               strdata = NULL;
13848   void *               parentdata = NULL;
13849   ctf_sect_t           ctfsect, symsect, strsect, parentsect;
13850   ctf_sect_t *         symsectp = NULL;
13851   ctf_sect_t *         strsectp = NULL;
13852   ctf_file_t *         ctf = NULL;
13853   ctf_file_t *         parent = NULL;
13854
13855   const char *things[] = {"Labels", "Data objects", "Function objects",
13856                           "Variables", "Types", "Strings", ""};
13857   const char **thing;
13858   int err;
13859   bfd_boolean ret = FALSE;
13860   size_t i;
13861
13862   shdr_to_ctf_sect (&ctfsect, section, filedata);
13863   data = get_section_contents (section, filedata);
13864   ctfsect.cts_data = data;
13865
13866   if (dump_ctf_symtab_name)
13867     {
13868       if ((symtab_sec = find_section (filedata, dump_ctf_symtab_name)) == NULL)
13869         {
13870           error (_("No symbol section named %s\n"), dump_ctf_symtab_name);
13871           goto fail;
13872         }
13873       if ((symdata = (void *) get_data (NULL, filedata,
13874                                         symtab_sec->sh_offset, 1,
13875                                         symtab_sec->sh_size,
13876                                         _("symbols"))) == NULL)
13877         goto fail;
13878       symsectp = shdr_to_ctf_sect (&symsect, symtab_sec, filedata);
13879       symsect.cts_data = symdata;
13880     }
13881   if (dump_ctf_strtab_name)
13882     {
13883       if ((strtab_sec = find_section (filedata, dump_ctf_strtab_name)) == NULL)
13884         {
13885           error (_("No string table section named %s\n"),
13886                  dump_ctf_strtab_name);
13887           goto fail;
13888         }
13889       if ((strdata = (void *) get_data (NULL, filedata,
13890                                         strtab_sec->sh_offset, 1,
13891                                         strtab_sec->sh_size,
13892                                         _("strings"))) == NULL)
13893         goto fail;
13894       strsectp = shdr_to_ctf_sect (&strsect, strtab_sec, filedata);
13895       strsect.cts_data = strdata;
13896     }
13897   if (dump_ctf_parent_name)
13898     {
13899       if ((parent_sec = find_section (filedata, dump_ctf_parent_name)) == NULL)
13900         {
13901           error (_("No CTF parent section named %s\n"), dump_ctf_parent_name);
13902           goto fail;
13903         }
13904       if ((parentdata = (void *) get_data (NULL, filedata,
13905                                            parent_sec->sh_offset, 1,
13906                                            parent_sec->sh_size,
13907                                            _("CTF parent"))) == NULL)
13908         goto fail;
13909       shdr_to_ctf_sect (&parentsect, parent_sec, filedata);
13910       parentsect.cts_data = parentdata;
13911     }
13912
13913   /* Load the CTF file and dump it.  */
13914
13915   if ((ctf = ctf_bufopen (&ctfsect, symsectp, strsectp, &err)) == NULL)
13916     {
13917       error (_("CTF open failure: %s\n"), ctf_errmsg (err));
13918       goto fail;
13919     }
13920
13921   if (parentdata)
13922     {
13923       if ((parent = ctf_bufopen (&parentsect, symsectp, strsectp, &err)) == NULL)
13924         {
13925           error (_("CTF open failure: %s\n"), ctf_errmsg (err));
13926           goto fail;
13927         }
13928
13929       ctf_import (ctf, parent);
13930     }
13931
13932   ret = TRUE;
13933
13934   printf (_("\nDump of CTF section '%s':\n"),
13935           printable_section_name (filedata, section));
13936
13937   for (i = 1, thing = things; *thing[0]; thing++, i++)
13938     {
13939       ctf_dump_state_t *s = NULL;
13940       char *item;
13941
13942       printf ("\n  %s:\n", *thing);
13943       while ((item = ctf_dump (ctf, &s, i, dump_ctf_indent_lines,
13944                                (void *) "    ")) != NULL)
13945         {
13946           printf ("%s\n", item);
13947           free (item);
13948         }
13949
13950       if (ctf_errno (ctf))
13951         {
13952           error (_("Iteration failed: %s, %s\n"), *thing,
13953                    ctf_errmsg (ctf_errno (ctf)));
13954           ret = FALSE;
13955         }
13956     }
13957
13958  fail:
13959   ctf_file_close (ctf);
13960   ctf_file_close (parent);
13961   free (parentdata);
13962   free (data);
13963   free (symdata);
13964   free (strdata);
13965   return ret;
13966 }
13967
13968 static bfd_boolean
13969 load_specific_debug_section (enum dwarf_section_display_enum  debug,
13970                              const Elf_Internal_Shdr *        sec,
13971                              void *                           data)
13972 {
13973   struct dwarf_section * section = &debug_displays [debug].section;
13974   char buf [64];
13975   Filedata * filedata = (Filedata *) data;
13976   
13977   if (section->start != NULL)
13978     {
13979       /* If it is already loaded, do nothing.  */
13980       if (streq (section->filename, filedata->file_name))
13981         return TRUE;
13982       free (section->start);
13983     }
13984
13985   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
13986   section->address = sec->sh_addr;
13987   section->user_data = NULL;
13988   section->filename = filedata->file_name;
13989   section->start = (unsigned char *) get_data (NULL, filedata,
13990                                                sec->sh_offset, 1,
13991                                                sec->sh_size, buf);
13992   if (section->start == NULL)
13993     section->size = 0;
13994   else
13995     {
13996       unsigned char *start = section->start;
13997       dwarf_size_type size = sec->sh_size;
13998       dwarf_size_type uncompressed_size = 0;
13999
14000       if ((sec->sh_flags & SHF_COMPRESSED) != 0)
14001         {
14002           Elf_Internal_Chdr chdr;
14003           unsigned int compression_header_size;
14004
14005           if (size < (is_32bit_elf
14006                       ? sizeof (Elf32_External_Chdr)
14007                       : sizeof (Elf64_External_Chdr)))
14008             {
14009               warn (_("compressed section %s is too small to contain a compression header"),
14010                     section->name);
14011               return FALSE;
14012             }
14013
14014           compression_header_size = get_compression_header (&chdr, start, size);
14015
14016           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
14017             {
14018               warn (_("section '%s' has unsupported compress type: %d\n"),
14019                     section->name, chdr.ch_type);
14020               return FALSE;
14021             }
14022           uncompressed_size = chdr.ch_size;
14023           start += compression_header_size;
14024           size -= compression_header_size;
14025         }
14026       else if (size > 12 && streq ((char *) start, "ZLIB"))
14027         {
14028           /* Read the zlib header.  In this case, it should be "ZLIB"
14029              followed by the uncompressed section size, 8 bytes in
14030              big-endian order.  */
14031           uncompressed_size = start[4]; uncompressed_size <<= 8;
14032           uncompressed_size += start[5]; uncompressed_size <<= 8;
14033           uncompressed_size += start[6]; uncompressed_size <<= 8;
14034           uncompressed_size += start[7]; uncompressed_size <<= 8;
14035           uncompressed_size += start[8]; uncompressed_size <<= 8;
14036           uncompressed_size += start[9]; uncompressed_size <<= 8;
14037           uncompressed_size += start[10]; uncompressed_size <<= 8;
14038           uncompressed_size += start[11];
14039           start += 12;
14040           size -= 12;
14041         }
14042
14043       if (uncompressed_size)
14044         {
14045           if (uncompress_section_contents (&start, uncompressed_size,
14046                                            &size))
14047             {
14048               /* Free the compressed buffer, update the section buffer
14049                  and the section size if uncompress is successful.  */
14050               free (section->start);
14051               section->start = start;
14052             }
14053           else
14054             {
14055               error (_("Unable to decompress section %s\n"),
14056                      printable_section_name (filedata, sec));
14057               return FALSE;
14058             }
14059         }
14060
14061       section->size = size;
14062     }
14063
14064   if (section->start == NULL)
14065     return FALSE;
14066
14067   if (debug_displays [debug].relocate)
14068     {
14069       if (! apply_relocations (filedata, sec, section->start, section->size,
14070                                & section->reloc_info, & section->num_relocs))
14071         return FALSE;
14072     }
14073   else
14074     {
14075       section->reloc_info = NULL;
14076       section->num_relocs = 0;
14077     }
14078
14079   return TRUE;
14080 }
14081
14082 /* If this is not NULL, load_debug_section will only look for sections
14083    within the list of sections given here.  */
14084 static unsigned int * section_subset = NULL;
14085
14086 bfd_boolean
14087 load_debug_section (enum dwarf_section_display_enum debug, void * data)
14088 {
14089   struct dwarf_section * section = &debug_displays [debug].section;
14090   Elf_Internal_Shdr * sec;
14091   Filedata * filedata = (Filedata *) data;
14092
14093   /* Without section headers we cannot find any sections.  */
14094   if (filedata->section_headers == NULL)
14095     return FALSE;
14096
14097   if (filedata->string_table == NULL
14098       && filedata->file_header.e_shstrndx != SHN_UNDEF
14099       && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
14100     {
14101       Elf_Internal_Shdr * strs;
14102
14103       /* Read in the string table, so that we have section names to scan.  */
14104       strs = filedata->section_headers + filedata->file_header.e_shstrndx;
14105
14106       if (strs != NULL && strs->sh_size != 0)
14107         {
14108           filedata->string_table
14109             = (char *) get_data (NULL, filedata, strs->sh_offset,
14110                                  1, strs->sh_size, _("string table"));
14111
14112           filedata->string_table_length
14113             = filedata->string_table != NULL ? strs->sh_size : 0;
14114         }
14115     }
14116
14117   /* Locate the debug section.  */
14118   sec = find_section_in_set (filedata, section->uncompressed_name, section_subset);
14119   if (sec != NULL)
14120     section->name = section->uncompressed_name;
14121   else
14122     {
14123       sec = find_section_in_set (filedata, section->compressed_name, section_subset);
14124       if (sec != NULL)
14125         section->name = section->compressed_name;
14126     }
14127   if (sec == NULL)
14128     return FALSE;
14129
14130   /* If we're loading from a subset of sections, and we've loaded
14131      a section matching this name before, it's likely that it's a
14132      different one.  */
14133   if (section_subset != NULL)
14134     free_debug_section (debug);
14135
14136   return load_specific_debug_section (debug, sec, data);
14137 }
14138
14139 void
14140 free_debug_section (enum dwarf_section_display_enum debug)
14141 {
14142   struct dwarf_section * section = &debug_displays [debug].section;
14143
14144   if (section->start == NULL)
14145     return;
14146
14147   free ((char *) section->start);
14148   section->start = NULL;
14149   section->address = 0;
14150   section->size = 0;
14151 }
14152
14153 static bfd_boolean
14154 display_debug_section (int shndx, Elf_Internal_Shdr * section, Filedata * filedata)
14155 {
14156   char * name = SECTION_NAME (section);
14157   const char * print_name = printable_section_name (filedata, section);
14158   bfd_size_type length;
14159   bfd_boolean result = TRUE;
14160   int i;
14161
14162   length = section->sh_size;
14163   if (length == 0)
14164     {
14165       printf (_("\nSection '%s' has no debugging data.\n"), print_name);
14166       return TRUE;
14167     }
14168   if (section->sh_type == SHT_NOBITS)
14169     {
14170       /* There is no point in dumping the contents of a debugging section
14171          which has the NOBITS type - the bits in the file will be random.
14172          This can happen when a file containing a .eh_frame section is
14173          stripped with the --only-keep-debug command line option.  */
14174       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
14175               print_name);
14176       return FALSE;
14177     }
14178
14179   if (const_strneq (name, ".gnu.linkonce.wi."))
14180     name = ".debug_info";
14181
14182   /* See if we know how to display the contents of this section.  */
14183   for (i = 0; i < max; i++)
14184     {
14185       enum dwarf_section_display_enum  id = (enum dwarf_section_display_enum) i;
14186       struct dwarf_section_display *   display = debug_displays + i;
14187       struct dwarf_section *           sec = & display->section;
14188
14189       if (streq (sec->uncompressed_name, name)
14190           || (id == line && const_strneq (name, ".debug_line."))
14191           || streq (sec->compressed_name, name))
14192         {
14193           bfd_boolean secondary = (section != find_section (filedata, name));
14194
14195           if (secondary)
14196             free_debug_section (id);
14197
14198           if (i == line && const_strneq (name, ".debug_line."))
14199             sec->name = name;
14200           else if (streq (sec->uncompressed_name, name))
14201             sec->name = sec->uncompressed_name;
14202           else
14203             sec->name = sec->compressed_name;
14204
14205           if (load_specific_debug_section (id, section, filedata))
14206             {
14207               /* If this debug section is part of a CU/TU set in a .dwp file,
14208                  restrict load_debug_section to the sections in that set.  */
14209               section_subset = find_cu_tu_set (filedata, shndx);
14210
14211               result &= display->display (sec, filedata);
14212
14213               section_subset = NULL;
14214
14215               if (secondary || (id != info && id != abbrev))
14216                 free_debug_section (id);
14217             }
14218           break;
14219         }
14220     }
14221
14222   if (i == max)
14223     {
14224       printf (_("Unrecognized debug section: %s\n"), print_name);
14225       result = FALSE;
14226     }
14227
14228   return result;
14229 }
14230
14231 /* Set DUMP_SECTS for all sections where dumps were requested
14232    based on section name.  */
14233
14234 static void
14235 initialise_dumps_byname (Filedata * filedata)
14236 {
14237   struct dump_list_entry * cur;
14238
14239   for (cur = dump_sects_byname; cur; cur = cur->next)
14240     {
14241       unsigned int i;
14242       bfd_boolean any = FALSE;
14243
14244       for (i = 0; i < filedata->file_header.e_shnum; i++)
14245         if (streq (SECTION_NAME (filedata->section_headers + i), cur->name))
14246           {
14247             request_dump_bynumber (filedata, i, cur->type);
14248             any = TRUE;
14249           }
14250
14251       if (!any)
14252         warn (_("Section '%s' was not dumped because it does not exist!\n"),
14253               cur->name);
14254     }
14255 }
14256
14257 static bfd_boolean
14258 process_section_contents (Filedata * filedata)
14259 {
14260   Elf_Internal_Shdr * section;
14261   unsigned int i;
14262   bfd_boolean res = TRUE;
14263
14264   if (! do_dump)
14265     return TRUE;
14266
14267   initialise_dumps_byname (filedata);
14268
14269   for (i = 0, section = filedata->section_headers;
14270        i < filedata->file_header.e_shnum && i < filedata->num_dump_sects;
14271        i++, section++)
14272     {
14273       dump_type dump = filedata->dump_sects[i];
14274
14275 #ifdef SUPPORT_DISASSEMBLY
14276       if (dump & DISASS_DUMP)
14277         {
14278           if (! disassemble_section (section, filedata))
14279             res = FALSE;
14280         }
14281 #endif
14282       if (dump & HEX_DUMP)
14283         {
14284           if (! dump_section_as_bytes (section, filedata, FALSE))
14285             res = FALSE;
14286         }
14287
14288       if (dump & RELOC_DUMP)
14289         {
14290           if (! dump_section_as_bytes (section, filedata, TRUE))
14291             res = FALSE;
14292         }
14293
14294       if (dump & STRING_DUMP)
14295         {
14296           if (! dump_section_as_strings (section, filedata))
14297             res = FALSE;
14298         }
14299
14300       if (dump & DEBUG_DUMP)
14301         {
14302           if (! display_debug_section (i, section, filedata))
14303             res = FALSE;
14304         }
14305
14306       if (dump & CTF_DUMP)
14307         {
14308           if (! dump_section_as_ctf (section, filedata))
14309             res = FALSE;
14310         }
14311     }
14312
14313   /* Check to see if the user requested a
14314      dump of a section that does not exist.  */
14315   while (i < filedata->num_dump_sects)
14316     {
14317       if (filedata->dump_sects[i])
14318         {
14319           warn (_("Section %d was not dumped because it does not exist!\n"), i);
14320           res = FALSE;
14321         }
14322       i++;
14323     }
14324
14325   return res;
14326 }
14327
14328 static void
14329 process_mips_fpe_exception (int mask)
14330 {
14331   if (mask)
14332     {
14333       bfd_boolean first = TRUE;
14334
14335       if (mask & OEX_FPU_INEX)
14336         fputs ("INEX", stdout), first = FALSE;
14337       if (mask & OEX_FPU_UFLO)
14338         printf ("%sUFLO", first ? "" : "|"), first = FALSE;
14339       if (mask & OEX_FPU_OFLO)
14340         printf ("%sOFLO", first ? "" : "|"), first = FALSE;
14341       if (mask & OEX_FPU_DIV0)
14342         printf ("%sDIV0", first ? "" : "|"), first = FALSE;
14343       if (mask & OEX_FPU_INVAL)
14344         printf ("%sINVAL", first ? "" : "|");
14345     }
14346   else
14347     fputs ("0", stdout);
14348 }
14349
14350 /* Display's the value of TAG at location P.  If TAG is
14351    greater than 0 it is assumed to be an unknown tag, and
14352    a message is printed to this effect.  Otherwise it is
14353    assumed that a message has already been printed.
14354
14355    If the bottom bit of TAG is set it assumed to have a
14356    string value, otherwise it is assumed to have an integer
14357    value.
14358
14359    Returns an updated P pointing to the first unread byte
14360    beyond the end of TAG's value.
14361
14362    Reads at or beyond END will not be made.  */
14363
14364 static unsigned char *
14365 display_tag_value (signed int tag,
14366                    unsigned char * p,
14367                    const unsigned char * const end)
14368 {
14369   unsigned long val;
14370
14371   if (tag > 0)
14372     printf ("  Tag_unknown_%d: ", tag);
14373
14374   if (p >= end)
14375     {
14376       warn (_("<corrupt tag>\n"));
14377     }
14378   else if (tag & 1)
14379     {
14380       /* PR 17531 file: 027-19978-0.004.  */
14381       size_t maxlen = (end - p) - 1;
14382
14383       putchar ('"');
14384       if (maxlen > 0)
14385         {
14386           print_symbol ((int) maxlen, (const char *) p);
14387           p += strnlen ((char *) p, maxlen) + 1;
14388         }
14389       else
14390         {
14391           printf (_("<corrupt string tag>"));
14392           p = (unsigned char *) end;
14393         }
14394       printf ("\"\n");
14395     }
14396   else
14397     {
14398       unsigned int len;
14399
14400       val = read_uleb128 (p, &len, end);
14401       p += len;
14402       printf ("%ld (0x%lx)\n", val, val);
14403     }
14404
14405   assert (p <= end);
14406   return p;
14407 }
14408
14409 /* ARC ABI attributes section.  */
14410
14411 static unsigned char *
14412 display_arc_attribute (unsigned char * p,
14413                        const unsigned char * const end)
14414 {
14415   unsigned int tag;
14416   unsigned int len;
14417   unsigned int val;
14418
14419   tag = read_uleb128 (p, &len, end);
14420   p += len;
14421
14422   switch (tag)
14423     {
14424     case Tag_ARC_PCS_config:
14425       val = read_uleb128 (p, &len, end);
14426       p += len;
14427       printf ("  Tag_ARC_PCS_config: ");
14428       switch (val)
14429         {
14430         case 0:
14431           printf (_("Absent/Non standard\n"));
14432           break;
14433         case 1:
14434           printf (_("Bare metal/mwdt\n"));
14435           break;
14436         case 2:
14437           printf (_("Bare metal/newlib\n"));
14438           break;
14439         case 3:
14440           printf (_("Linux/uclibc\n"));
14441           break;
14442         case 4:
14443           printf (_("Linux/glibc\n"));
14444           break;
14445         default:
14446           printf (_("Unknown\n"));
14447           break;
14448         }
14449       break;
14450
14451     case Tag_ARC_CPU_base:
14452       val = read_uleb128 (p, &len, end);
14453       p += len;
14454       printf ("  Tag_ARC_CPU_base: ");
14455       switch (val)
14456         {
14457         default:
14458         case TAG_CPU_NONE:
14459           printf (_("Absent\n"));
14460           break;
14461         case TAG_CPU_ARC6xx:
14462           printf ("ARC6xx\n");
14463           break;
14464         case TAG_CPU_ARC7xx:
14465           printf ("ARC7xx\n");
14466           break;
14467         case TAG_CPU_ARCEM:
14468           printf ("ARCEM\n");
14469           break;
14470         case TAG_CPU_ARCHS:
14471           printf ("ARCHS\n");
14472           break;
14473         }
14474       break;
14475
14476     case Tag_ARC_CPU_variation:
14477       val = read_uleb128 (p, &len, end);
14478       p += len;
14479       printf ("  Tag_ARC_CPU_variation: ");
14480       switch (val)
14481         {
14482         default:
14483           if (val > 0 && val < 16)
14484               printf ("Core%d\n", val);
14485           else
14486               printf ("Unknown\n");
14487           break;
14488
14489         case 0:
14490           printf (_("Absent\n"));
14491           break;
14492         }
14493       break;
14494
14495     case Tag_ARC_CPU_name:
14496       printf ("  Tag_ARC_CPU_name: ");
14497       p = display_tag_value (-1, p, end);
14498       break;
14499
14500     case Tag_ARC_ABI_rf16:
14501       val = read_uleb128 (p, &len, end);
14502       p += len;
14503       printf ("  Tag_ARC_ABI_rf16: %s\n", val ? _("yes") : _("no"));
14504       break;
14505
14506     case Tag_ARC_ABI_osver:
14507       val = read_uleb128 (p, &len, end);
14508       p += len;
14509       printf ("  Tag_ARC_ABI_osver: v%d\n", val);
14510       break;
14511
14512     case Tag_ARC_ABI_pic:
14513     case Tag_ARC_ABI_sda:
14514       val = read_uleb128 (p, &len, end);
14515       p += len;
14516       printf (tag == Tag_ARC_ABI_sda ? "  Tag_ARC_ABI_sda: "
14517               : "  Tag_ARC_ABI_pic: ");
14518       switch (val)
14519         {
14520         case 0:
14521           printf (_("Absent\n"));
14522           break;
14523         case 1:
14524           printf ("MWDT\n");
14525           break;
14526         case 2:
14527           printf ("GNU\n");
14528           break;
14529         default:
14530           printf (_("Unknown\n"));
14531           break;
14532         }
14533       break;
14534
14535     case Tag_ARC_ABI_tls:
14536       val = read_uleb128 (p, &len, end);
14537       p += len;
14538       printf ("  Tag_ARC_ABI_tls: %s\n", val ? "r25": "none");
14539       break;
14540
14541     case Tag_ARC_ABI_enumsize:
14542       val = read_uleb128 (p, &len, end);
14543       p += len;
14544       printf ("  Tag_ARC_ABI_enumsize: %s\n", val ? _("default") :
14545               _("smallest"));
14546       break;
14547
14548     case Tag_ARC_ABI_exceptions:
14549       val = read_uleb128 (p, &len, end);
14550       p += len;
14551       printf ("  Tag_ARC_ABI_exceptions: %s\n", val ? _("OPTFP")
14552               : _("default"));
14553       break;
14554
14555     case Tag_ARC_ABI_double_size:
14556       val = read_uleb128 (p, &len, end);
14557       p += len;
14558       printf ("  Tag_ARC_ABI_double_size: %d\n", val);
14559       break;
14560
14561     case Tag_ARC_ISA_config:
14562       printf ("  Tag_ARC_ISA_config: ");
14563       p = display_tag_value (-1, p, end);
14564       break;
14565
14566     case Tag_ARC_ISA_apex:
14567       printf ("  Tag_ARC_ISA_apex: ");
14568       p = display_tag_value (-1, p, end);
14569       break;
14570
14571     case Tag_ARC_ISA_mpy_option:
14572       val = read_uleb128 (p, &len, end);
14573       p += len;
14574       printf ("  Tag_ARC_ISA_mpy_option: %d\n", val);
14575       break;
14576
14577     case Tag_ARC_ATR_version:
14578       val = read_uleb128 (p, &len, end);
14579       p += len;
14580       printf ("  Tag_ARC_ATR_version: %d\n", val);
14581       break;
14582
14583     default:
14584       return display_tag_value (tag & 1, p, end);
14585     }
14586
14587   return p;
14588 }
14589
14590 /* ARM EABI attributes section.  */
14591 typedef struct
14592 {
14593   unsigned int tag;
14594   const char * name;
14595   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
14596   unsigned int type;
14597   const char ** table;
14598 } arm_attr_public_tag;
14599
14600 static const char * arm_attr_tag_CPU_arch[] =
14601   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
14602    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "v8-R", "v8-M.baseline",
14603    "v8-M.mainline", "", "", "", "v8.1-M.mainline"};
14604 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
14605 static const char * arm_attr_tag_THUMB_ISA_use[] =
14606   {"No", "Thumb-1", "Thumb-2", "Yes"};
14607 static const char * arm_attr_tag_FP_arch[] =
14608   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
14609    "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
14610 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
14611 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
14612   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
14613    "NEON for ARMv8.1"};
14614 static const char * arm_attr_tag_PCS_config[] =
14615   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
14616    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
14617 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
14618   {"V6", "SB", "TLS", "Unused"};
14619 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
14620   {"Absolute", "PC-relative", "SB-relative", "None"};
14621 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
14622   {"Absolute", "PC-relative", "None"};
14623 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
14624   {"None", "direct", "GOT-indirect"};
14625 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
14626   {"None", "??? 1", "2", "??? 3", "4"};
14627 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
14628 static const char * arm_attr_tag_ABI_FP_denormal[] =
14629   {"Unused", "Needed", "Sign only"};
14630 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
14631 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
14632 static const char * arm_attr_tag_ABI_FP_number_model[] =
14633   {"Unused", "Finite", "RTABI", "IEEE 754"};
14634 static const char * arm_attr_tag_ABI_enum_size[] =
14635   {"Unused", "small", "int", "forced to int"};
14636 static const char * arm_attr_tag_ABI_HardFP_use[] =
14637   {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
14638 static const char * arm_attr_tag_ABI_VFP_args[] =
14639   {"AAPCS", "VFP registers", "custom", "compatible"};
14640 static const char * arm_attr_tag_ABI_WMMX_args[] =
14641   {"AAPCS", "WMMX registers", "custom"};
14642 static const char * arm_attr_tag_ABI_optimization_goals[] =
14643   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14644     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
14645 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
14646   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14647     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
14648 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
14649 static const char * arm_attr_tag_FP_HP_extension[] =
14650   {"Not Allowed", "Allowed"};
14651 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
14652   {"None", "IEEE 754", "Alternative Format"};
14653 static const char * arm_attr_tag_DSP_extension[] =
14654   {"Follow architecture", "Allowed"};
14655 static const char * arm_attr_tag_MPextension_use[] =
14656   {"Not Allowed", "Allowed"};
14657 static const char * arm_attr_tag_DIV_use[] =
14658   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
14659     "Allowed in v7-A with integer division extension"};
14660 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
14661 static const char * arm_attr_tag_Virtualization_use[] =
14662   {"Not Allowed", "TrustZone", "Virtualization Extensions",
14663     "TrustZone and Virtualization Extensions"};
14664 static const char * arm_attr_tag_MPextension_use_legacy[] =
14665   {"Not Allowed", "Allowed"};
14666
14667 static const char * arm_attr_tag_MVE_arch[] =
14668   {"No MVE", "MVE Integer only", "MVE Integer and FP"};
14669
14670 #define LOOKUP(id, name) \
14671   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
14672 static arm_attr_public_tag arm_attr_public_tags[] =
14673 {
14674   {4, "CPU_raw_name", 1, NULL},
14675   {5, "CPU_name", 1, NULL},
14676   LOOKUP(6, CPU_arch),
14677   {7, "CPU_arch_profile", 0, NULL},
14678   LOOKUP(8, ARM_ISA_use),
14679   LOOKUP(9, THUMB_ISA_use),
14680   LOOKUP(10, FP_arch),
14681   LOOKUP(11, WMMX_arch),
14682   LOOKUP(12, Advanced_SIMD_arch),
14683   LOOKUP(13, PCS_config),
14684   LOOKUP(14, ABI_PCS_R9_use),
14685   LOOKUP(15, ABI_PCS_RW_data),
14686   LOOKUP(16, ABI_PCS_RO_data),
14687   LOOKUP(17, ABI_PCS_GOT_use),
14688   LOOKUP(18, ABI_PCS_wchar_t),
14689   LOOKUP(19, ABI_FP_rounding),
14690   LOOKUP(20, ABI_FP_denormal),
14691   LOOKUP(21, ABI_FP_exceptions),
14692   LOOKUP(22, ABI_FP_user_exceptions),
14693   LOOKUP(23, ABI_FP_number_model),
14694   {24, "ABI_align_needed", 0, NULL},
14695   {25, "ABI_align_preserved", 0, NULL},
14696   LOOKUP(26, ABI_enum_size),
14697   LOOKUP(27, ABI_HardFP_use),
14698   LOOKUP(28, ABI_VFP_args),
14699   LOOKUP(29, ABI_WMMX_args),
14700   LOOKUP(30, ABI_optimization_goals),
14701   LOOKUP(31, ABI_FP_optimization_goals),
14702   {32, "compatibility", 0, NULL},
14703   LOOKUP(34, CPU_unaligned_access),
14704   LOOKUP(36, FP_HP_extension),
14705   LOOKUP(38, ABI_FP_16bit_format),
14706   LOOKUP(42, MPextension_use),
14707   LOOKUP(44, DIV_use),
14708   LOOKUP(46, DSP_extension),
14709   LOOKUP(48, MVE_arch),
14710   {64, "nodefaults", 0, NULL},
14711   {65, "also_compatible_with", 0, NULL},
14712   LOOKUP(66, T2EE_use),
14713   {67, "conformance", 1, NULL},
14714   LOOKUP(68, Virtualization_use),
14715   LOOKUP(70, MPextension_use_legacy)
14716 };
14717 #undef LOOKUP
14718
14719 static unsigned char *
14720 display_arm_attribute (unsigned char * p,
14721                        const unsigned char * const end)
14722 {
14723   unsigned int tag;
14724   unsigned int len;
14725   unsigned int val;
14726   arm_attr_public_tag * attr;
14727   unsigned i;
14728   unsigned int type;
14729
14730   tag = read_uleb128 (p, &len, end);
14731   p += len;
14732   attr = NULL;
14733   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
14734     {
14735       if (arm_attr_public_tags[i].tag == tag)
14736         {
14737           attr = &arm_attr_public_tags[i];
14738           break;
14739         }
14740     }
14741
14742   if (attr)
14743     {
14744       printf ("  Tag_%s: ", attr->name);
14745       switch (attr->type)
14746         {
14747         case 0:
14748           switch (tag)
14749             {
14750             case 7: /* Tag_CPU_arch_profile.  */
14751               val = read_uleb128 (p, &len, end);
14752               p += len;
14753               switch (val)
14754                 {
14755                 case 0: printf (_("None\n")); break;
14756                 case 'A': printf (_("Application\n")); break;
14757                 case 'R': printf (_("Realtime\n")); break;
14758                 case 'M': printf (_("Microcontroller\n")); break;
14759                 case 'S': printf (_("Application or Realtime\n")); break;
14760                 default: printf ("??? (%d)\n", val); break;
14761                 }
14762               break;
14763
14764             case 24: /* Tag_align_needed.  */
14765               val = read_uleb128 (p, &len, end);
14766               p += len;
14767               switch (val)
14768                 {
14769                 case 0: printf (_("None\n")); break;
14770                 case 1: printf (_("8-byte\n")); break;
14771                 case 2: printf (_("4-byte\n")); break;
14772                 case 3: printf ("??? 3\n"); break;
14773                 default:
14774                   if (val <= 12)
14775                     printf (_("8-byte and up to %d-byte extended\n"),
14776                             1 << val);
14777                   else
14778                     printf ("??? (%d)\n", val);
14779                   break;
14780                 }
14781               break;
14782
14783             case 25: /* Tag_align_preserved.  */
14784               val = read_uleb128 (p, &len, end);
14785               p += len;
14786               switch (val)
14787                 {
14788                 case 0: printf (_("None\n")); break;
14789                 case 1: printf (_("8-byte, except leaf SP\n")); break;
14790                 case 2: printf (_("8-byte\n")); break;
14791                 case 3: printf ("??? 3\n"); break;
14792                 default:
14793                   if (val <= 12)
14794                     printf (_("8-byte and up to %d-byte extended\n"),
14795                             1 << val);
14796                   else
14797                     printf ("??? (%d)\n", val);
14798                   break;
14799                 }
14800               break;
14801
14802             case 32: /* Tag_compatibility.  */
14803               {
14804                 val = read_uleb128 (p, &len, end);
14805                 p += len;
14806                 printf (_("flag = %d, vendor = "), val);
14807                 if (p < end - 1)
14808                   {
14809                     size_t maxlen = (end - p) - 1;
14810
14811                     print_symbol ((int) maxlen, (const char *) p);
14812                     p += strnlen ((char *) p, maxlen) + 1;
14813                   }
14814                 else
14815                   {
14816                     printf (_("<corrupt>"));
14817                     p = (unsigned char *) end;
14818                   }
14819                 putchar ('\n');
14820               }
14821               break;
14822
14823             case 64: /* Tag_nodefaults.  */
14824               /* PR 17531: file: 001-505008-0.01.  */
14825               if (p < end)
14826                 p++;
14827               printf (_("True\n"));
14828               break;
14829
14830             case 65: /* Tag_also_compatible_with.  */
14831               val = read_uleb128 (p, &len, end);
14832               p += len;
14833               if (val == 6 /* Tag_CPU_arch.  */)
14834                 {
14835                   val = read_uleb128 (p, &len, end);
14836                   p += len;
14837                   if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
14838                     printf ("??? (%d)\n", val);
14839                   else
14840                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
14841                 }
14842               else
14843                 printf ("???\n");
14844               while (p < end && *(p++) != '\0' /* NUL terminator.  */)
14845                 ;
14846               break;
14847
14848             default:
14849               printf (_("<unknown: %d>\n"), tag);
14850               break;
14851             }
14852           return p;
14853
14854         case 1:
14855           return display_tag_value (-1, p, end);
14856         case 2:
14857           return display_tag_value (0, p, end);
14858
14859         default:
14860           assert (attr->type & 0x80);
14861           val = read_uleb128 (p, &len, end);
14862           p += len;
14863           type = attr->type & 0x7f;
14864           if (val >= type)
14865             printf ("??? (%d)\n", val);
14866           else
14867             printf ("%s\n", attr->table[val]);
14868           return p;
14869         }
14870     }
14871
14872   return display_tag_value (tag, p, end);
14873 }
14874
14875 static unsigned char *
14876 display_gnu_attribute (unsigned char * p,
14877                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const),
14878                        const unsigned char * const end)
14879 {
14880   int tag;
14881   unsigned int len;
14882   unsigned int val;
14883
14884   tag = read_uleb128 (p, &len, end);
14885   p += len;
14886
14887   /* Tag_compatibility is the only generic GNU attribute defined at
14888      present.  */
14889   if (tag == 32)
14890     {
14891       val = read_uleb128 (p, &len, end);
14892       p += len;
14893
14894       printf (_("flag = %d, vendor = "), val);
14895       if (p == end)
14896         {
14897           printf (_("<corrupt>\n"));
14898           warn (_("corrupt vendor attribute\n"));
14899         }
14900       else
14901         {
14902           if (p < end - 1)
14903             {
14904               size_t maxlen = (end - p) - 1;
14905
14906               print_symbol ((int) maxlen, (const char *) p);
14907               p += strnlen ((char *) p, maxlen) + 1;
14908             }
14909           else
14910             {
14911               printf (_("<corrupt>"));
14912               p = (unsigned char *) end;
14913             }
14914           putchar ('\n');
14915         }
14916       return p;
14917     }
14918
14919   if ((tag & 2) == 0 && display_proc_gnu_attribute)
14920     return display_proc_gnu_attribute (p, tag, end);
14921
14922   return display_tag_value (tag, p, end);
14923 }
14924
14925 static unsigned char *
14926 display_power_gnu_attribute (unsigned char * p,
14927                              unsigned int tag,
14928                              const unsigned char * const end)
14929 {
14930   unsigned int len;
14931   unsigned int val;
14932
14933   if (tag == Tag_GNU_Power_ABI_FP)
14934     {
14935       val = read_uleb128 (p, &len, end);
14936       p += len;
14937       printf ("  Tag_GNU_Power_ABI_FP: ");
14938       if (len == 0)
14939         {
14940           printf (_("<corrupt>\n"));
14941           return p;
14942         }
14943
14944       if (val > 15)
14945         printf ("(%#x), ", val);
14946
14947       switch (val & 3)
14948         {
14949         case 0:
14950           printf (_("unspecified hard/soft float, "));
14951           break;
14952         case 1:
14953           printf (_("hard float, "));
14954           break;
14955         case 2:
14956           printf (_("soft float, "));
14957           break;
14958         case 3:
14959           printf (_("single-precision hard float, "));
14960           break;
14961         }
14962
14963       switch (val & 0xC)
14964         {
14965         case 0:
14966           printf (_("unspecified long double\n"));
14967           break;
14968         case 4:
14969           printf (_("128-bit IBM long double\n"));
14970           break;
14971         case 8:
14972           printf (_("64-bit long double\n"));
14973           break;
14974         case 12:
14975           printf (_("128-bit IEEE long double\n"));
14976           break;
14977         }
14978       return p;
14979     }
14980
14981   if (tag == Tag_GNU_Power_ABI_Vector)
14982     {
14983       val = read_uleb128 (p, &len, end);
14984       p += len;
14985       printf ("  Tag_GNU_Power_ABI_Vector: ");
14986       if (len == 0)
14987         {
14988           printf (_("<corrupt>\n"));
14989           return p;
14990         }
14991
14992       if (val > 3)
14993         printf ("(%#x), ", val);
14994
14995       switch (val & 3)
14996         {
14997         case 0:
14998           printf (_("unspecified\n"));
14999           break;
15000         case 1:
15001           printf (_("generic\n"));
15002           break;
15003         case 2:
15004           printf ("AltiVec\n");
15005           break;
15006         case 3:
15007           printf ("SPE\n");
15008           break;
15009         }
15010       return p;
15011     }
15012
15013   if (tag == Tag_GNU_Power_ABI_Struct_Return)
15014     {
15015       val = read_uleb128 (p, &len, end);
15016       p += len;
15017       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
15018       if (len == 0)
15019         {
15020           printf (_("<corrupt>\n"));
15021           return p;
15022         }
15023
15024       if (val > 2)
15025         printf ("(%#x), ", val);
15026
15027       switch (val & 3)
15028         {
15029         case 0:
15030           printf (_("unspecified\n"));
15031           break;
15032         case 1:
15033           printf ("r3/r4\n");
15034           break;
15035         case 2:
15036           printf (_("memory\n"));
15037           break;
15038         case 3:
15039           printf ("???\n");
15040           break;
15041         }
15042       return p;
15043     }
15044
15045   return display_tag_value (tag & 1, p, end);
15046 }
15047
15048 static unsigned char *
15049 display_s390_gnu_attribute (unsigned char * p,
15050                             unsigned int tag,
15051                             const unsigned char * const end)
15052 {
15053   unsigned int len;
15054   int val;
15055
15056   if (tag == Tag_GNU_S390_ABI_Vector)
15057     {
15058       val = read_uleb128 (p, &len, end);
15059       p += len;
15060       printf ("  Tag_GNU_S390_ABI_Vector: ");
15061
15062       switch (val)
15063         {
15064         case 0:
15065           printf (_("any\n"));
15066           break;
15067         case 1:
15068           printf (_("software\n"));
15069           break;
15070         case 2:
15071           printf (_("hardware\n"));
15072           break;
15073         default:
15074           printf ("??? (%d)\n", val);
15075           break;
15076         }
15077       return p;
15078    }
15079
15080   return display_tag_value (tag & 1, p, end);
15081 }
15082
15083 static void
15084 display_sparc_hwcaps (unsigned int mask)
15085 {
15086   if (mask)
15087     {
15088       bfd_boolean first = TRUE;
15089
15090       if (mask & ELF_SPARC_HWCAP_MUL32)
15091         fputs ("mul32", stdout), first = FALSE;
15092       if (mask & ELF_SPARC_HWCAP_DIV32)
15093         printf ("%sdiv32", first ? "" : "|"), first = FALSE;
15094       if (mask & ELF_SPARC_HWCAP_FSMULD)
15095         printf ("%sfsmuld", first ? "" : "|"), first = FALSE;
15096       if (mask & ELF_SPARC_HWCAP_V8PLUS)
15097         printf ("%sv8plus", first ? "" : "|"), first = FALSE;
15098       if (mask & ELF_SPARC_HWCAP_POPC)
15099         printf ("%spopc", first ? "" : "|"), first = FALSE;
15100       if (mask & ELF_SPARC_HWCAP_VIS)
15101         printf ("%svis", first ? "" : "|"), first = FALSE;
15102       if (mask & ELF_SPARC_HWCAP_VIS2)
15103         printf ("%svis2", first ? "" : "|"), first = FALSE;
15104       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
15105         printf ("%sASIBlkInit", first ? "" : "|"), first = FALSE;
15106       if (mask & ELF_SPARC_HWCAP_FMAF)
15107         printf ("%sfmaf", first ? "" : "|"), first = FALSE;
15108       if (mask & ELF_SPARC_HWCAP_VIS3)
15109         printf ("%svis3", first ? "" : "|"), first = FALSE;
15110       if (mask & ELF_SPARC_HWCAP_HPC)
15111         printf ("%shpc", first ? "" : "|"), first = FALSE;
15112       if (mask & ELF_SPARC_HWCAP_RANDOM)
15113         printf ("%srandom", first ? "" : "|"), first = FALSE;
15114       if (mask & ELF_SPARC_HWCAP_TRANS)
15115         printf ("%strans", first ? "" : "|"), first = FALSE;
15116       if (mask & ELF_SPARC_HWCAP_FJFMAU)
15117         printf ("%sfjfmau", first ? "" : "|"), first = FALSE;
15118       if (mask & ELF_SPARC_HWCAP_IMA)
15119         printf ("%sima", first ? "" : "|"), first = FALSE;
15120       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
15121         printf ("%scspare", first ? "" : "|"), first = FALSE;
15122     }
15123   else
15124     fputc ('0', stdout);
15125   fputc ('\n', stdout);
15126 }
15127
15128 static void
15129 display_sparc_hwcaps2 (unsigned int mask)
15130 {
15131   if (mask)
15132     {
15133       bfd_boolean first = TRUE;
15134
15135       if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
15136         fputs ("fjathplus", stdout), first = FALSE;
15137       if (mask & ELF_SPARC_HWCAP2_VIS3B)
15138         printf ("%svis3b", first ? "" : "|"), first = FALSE;
15139       if (mask & ELF_SPARC_HWCAP2_ADP)
15140         printf ("%sadp", first ? "" : "|"), first = FALSE;
15141       if (mask & ELF_SPARC_HWCAP2_SPARC5)
15142         printf ("%ssparc5", first ? "" : "|"), first = FALSE;
15143       if (mask & ELF_SPARC_HWCAP2_MWAIT)
15144         printf ("%smwait", first ? "" : "|"), first = FALSE;
15145       if (mask & ELF_SPARC_HWCAP2_XMPMUL)
15146         printf ("%sxmpmul", first ? "" : "|"), first = FALSE;
15147       if (mask & ELF_SPARC_HWCAP2_XMONT)
15148         printf ("%sxmont2", first ? "" : "|"), first = FALSE;
15149       if (mask & ELF_SPARC_HWCAP2_NSEC)
15150         printf ("%snsec", first ? "" : "|"), first = FALSE;
15151       if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
15152         printf ("%sfjathhpc", first ? "" : "|"), first = FALSE;
15153       if (mask & ELF_SPARC_HWCAP2_FJDES)
15154         printf ("%sfjdes", first ? "" : "|"), first = FALSE;
15155       if (mask & ELF_SPARC_HWCAP2_FJAES)
15156         printf ("%sfjaes", first ? "" : "|"), first = FALSE;
15157     }
15158   else
15159     fputc ('0', stdout);
15160   fputc ('\n', stdout);
15161 }
15162
15163 static unsigned char *
15164 display_sparc_gnu_attribute (unsigned char * p,
15165                              unsigned int tag,
15166                              const unsigned char * const end)
15167 {
15168   unsigned int len;
15169   int val;
15170
15171   if (tag == Tag_GNU_Sparc_HWCAPS)
15172     {
15173       val = read_uleb128 (p, &len, end);
15174       p += len;
15175       printf ("  Tag_GNU_Sparc_HWCAPS: ");
15176       display_sparc_hwcaps (val);
15177       return p;
15178     }
15179   if (tag == Tag_GNU_Sparc_HWCAPS2)
15180     {
15181       val = read_uleb128 (p, &len, end);
15182       p += len;
15183       printf ("  Tag_GNU_Sparc_HWCAPS2: ");
15184       display_sparc_hwcaps2 (val);
15185       return p;
15186     }
15187
15188   return display_tag_value (tag, p, end);
15189 }
15190
15191 static void
15192 print_mips_fp_abi_value (unsigned int val)
15193 {
15194   switch (val)
15195     {
15196     case Val_GNU_MIPS_ABI_FP_ANY:
15197       printf (_("Hard or soft float\n"));
15198       break;
15199     case Val_GNU_MIPS_ABI_FP_DOUBLE:
15200       printf (_("Hard float (double precision)\n"));
15201       break;
15202     case Val_GNU_MIPS_ABI_FP_SINGLE:
15203       printf (_("Hard float (single precision)\n"));
15204       break;
15205     case Val_GNU_MIPS_ABI_FP_SOFT:
15206       printf (_("Soft float\n"));
15207       break;
15208     case Val_GNU_MIPS_ABI_FP_OLD_64:
15209       printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
15210       break;
15211     case Val_GNU_MIPS_ABI_FP_XX:
15212       printf (_("Hard float (32-bit CPU, Any FPU)\n"));
15213       break;
15214     case Val_GNU_MIPS_ABI_FP_64:
15215       printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
15216       break;
15217     case Val_GNU_MIPS_ABI_FP_64A:
15218       printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
15219       break;
15220     case Val_GNU_MIPS_ABI_FP_NAN2008:
15221       printf (_("NaN 2008 compatibility\n"));
15222       break;
15223     default:
15224       printf ("??? (%d)\n", val);
15225       break;
15226     }
15227 }
15228
15229 static unsigned char *
15230 display_mips_gnu_attribute (unsigned char * p,
15231                             unsigned int tag,
15232                             const unsigned char * const end)
15233 {
15234   if (tag == Tag_GNU_MIPS_ABI_FP)
15235     {
15236       unsigned int len;
15237       unsigned int val;
15238
15239       val = read_uleb128 (p, &len, end);
15240       p += len;
15241       printf ("  Tag_GNU_MIPS_ABI_FP: ");
15242
15243       print_mips_fp_abi_value (val);
15244
15245       return p;
15246    }
15247
15248   if (tag == Tag_GNU_MIPS_ABI_MSA)
15249     {
15250       unsigned int len;
15251       unsigned int val;
15252
15253       val = read_uleb128 (p, &len, end);
15254       p += len;
15255       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
15256
15257       switch (val)
15258         {
15259         case Val_GNU_MIPS_ABI_MSA_ANY:
15260           printf (_("Any MSA or not\n"));
15261           break;
15262         case Val_GNU_MIPS_ABI_MSA_128:
15263           printf (_("128-bit MSA\n"));
15264           break;
15265         default:
15266           printf ("??? (%d)\n", val);
15267           break;
15268         }
15269       return p;
15270     }
15271
15272   return display_tag_value (tag & 1, p, end);
15273 }
15274
15275 static unsigned char *
15276 display_tic6x_attribute (unsigned char * p,
15277                          const unsigned char * const end)
15278 {
15279   unsigned int tag;
15280   unsigned int len;
15281   int val;
15282
15283   tag = read_uleb128 (p, &len, end);
15284   p += len;
15285
15286   switch (tag)
15287     {
15288     case Tag_ISA:
15289       val = read_uleb128 (p, &len, end);
15290       p += len;
15291       printf ("  Tag_ISA: ");
15292
15293       switch (val)
15294         {
15295         case C6XABI_Tag_ISA_none:
15296           printf (_("None\n"));
15297           break;
15298         case C6XABI_Tag_ISA_C62X:
15299           printf ("C62x\n");
15300           break;
15301         case C6XABI_Tag_ISA_C67X:
15302           printf ("C67x\n");
15303           break;
15304         case C6XABI_Tag_ISA_C67XP:
15305           printf ("C67x+\n");
15306           break;
15307         case C6XABI_Tag_ISA_C64X:
15308           printf ("C64x\n");
15309           break;
15310         case C6XABI_Tag_ISA_C64XP:
15311           printf ("C64x+\n");
15312           break;
15313         case C6XABI_Tag_ISA_C674X:
15314           printf ("C674x\n");
15315           break;
15316         default:
15317           printf ("??? (%d)\n", val);
15318           break;
15319         }
15320       return p;
15321
15322     case Tag_ABI_wchar_t:
15323       val = read_uleb128 (p, &len, end);
15324       p += len;
15325       printf ("  Tag_ABI_wchar_t: ");
15326       switch (val)
15327         {
15328         case 0:
15329           printf (_("Not used\n"));
15330           break;
15331         case 1:
15332           printf (_("2 bytes\n"));
15333           break;
15334         case 2:
15335           printf (_("4 bytes\n"));
15336           break;
15337         default:
15338           printf ("??? (%d)\n", val);
15339           break;
15340         }
15341       return p;
15342
15343     case Tag_ABI_stack_align_needed:
15344       val = read_uleb128 (p, &len, end);
15345       p += len;
15346       printf ("  Tag_ABI_stack_align_needed: ");
15347       switch (val)
15348         {
15349         case 0:
15350           printf (_("8-byte\n"));
15351           break;
15352         case 1:
15353           printf (_("16-byte\n"));
15354           break;
15355         default:
15356           printf ("??? (%d)\n", val);
15357           break;
15358         }
15359       return p;
15360
15361     case Tag_ABI_stack_align_preserved:
15362       val = read_uleb128 (p, &len, end);
15363       p += len;
15364       printf ("  Tag_ABI_stack_align_preserved: ");
15365       switch (val)
15366         {
15367         case 0:
15368           printf (_("8-byte\n"));
15369           break;
15370         case 1:
15371           printf (_("16-byte\n"));
15372           break;
15373         default:
15374           printf ("??? (%d)\n", val);
15375           break;
15376         }
15377       return p;
15378
15379     case Tag_ABI_DSBT:
15380       val = read_uleb128 (p, &len, end);
15381       p += len;
15382       printf ("  Tag_ABI_DSBT: ");
15383       switch (val)
15384         {
15385         case 0:
15386           printf (_("DSBT addressing not used\n"));
15387           break;
15388         case 1:
15389           printf (_("DSBT addressing used\n"));
15390           break;
15391         default:
15392           printf ("??? (%d)\n", val);
15393           break;
15394         }
15395       return p;
15396
15397     case Tag_ABI_PID:
15398       val = read_uleb128 (p, &len, end);
15399       p += len;
15400       printf ("  Tag_ABI_PID: ");
15401       switch (val)
15402         {
15403         case 0:
15404           printf (_("Data addressing position-dependent\n"));
15405           break;
15406         case 1:
15407           printf (_("Data addressing position-independent, GOT near DP\n"));
15408           break;
15409         case 2:
15410           printf (_("Data addressing position-independent, GOT far from DP\n"));
15411           break;
15412         default:
15413           printf ("??? (%d)\n", val);
15414           break;
15415         }
15416       return p;
15417
15418     case Tag_ABI_PIC:
15419       val = read_uleb128 (p, &len, end);
15420       p += len;
15421       printf ("  Tag_ABI_PIC: ");
15422       switch (val)
15423         {
15424         case 0:
15425           printf (_("Code addressing position-dependent\n"));
15426           break;
15427         case 1:
15428           printf (_("Code addressing position-independent\n"));
15429           break;
15430         default:
15431           printf ("??? (%d)\n", val);
15432           break;
15433         }
15434       return p;
15435
15436     case Tag_ABI_array_object_alignment:
15437       val = read_uleb128 (p, &len, end);
15438       p += len;
15439       printf ("  Tag_ABI_array_object_alignment: ");
15440       switch (val)
15441         {
15442         case 0:
15443           printf (_("8-byte\n"));
15444           break;
15445         case 1:
15446           printf (_("4-byte\n"));
15447           break;
15448         case 2:
15449           printf (_("16-byte\n"));
15450           break;
15451         default:
15452           printf ("??? (%d)\n", val);
15453           break;
15454         }
15455       return p;
15456
15457     case Tag_ABI_array_object_align_expected:
15458       val = read_uleb128 (p, &len, end);
15459       p += len;
15460       printf ("  Tag_ABI_array_object_align_expected: ");
15461       switch (val)
15462         {
15463         case 0:
15464           printf (_("8-byte\n"));
15465           break;
15466         case 1:
15467           printf (_("4-byte\n"));
15468           break;
15469         case 2:
15470           printf (_("16-byte\n"));
15471           break;
15472         default:
15473           printf ("??? (%d)\n", val);
15474           break;
15475         }
15476       return p;
15477
15478     case Tag_ABI_compatibility:
15479       {
15480         val = read_uleb128 (p, &len, end);
15481         p += len;
15482         printf ("  Tag_ABI_compatibility: ");
15483         printf (_("flag = %d, vendor = "), val);
15484         if (p < end - 1)
15485           {
15486             size_t maxlen = (end - p) - 1;
15487
15488             print_symbol ((int) maxlen, (const char *) p);
15489             p += strnlen ((char *) p, maxlen) + 1;
15490           }
15491         else
15492           {
15493             printf (_("<corrupt>"));
15494             p = (unsigned char *) end;
15495           }
15496         putchar ('\n');
15497         return p;
15498       }
15499
15500     case Tag_ABI_conformance:
15501       {
15502         printf ("  Tag_ABI_conformance: \"");
15503         if (p < end - 1)
15504           {
15505             size_t maxlen = (end - p) - 1;
15506
15507             print_symbol ((int) maxlen, (const char *) p);
15508             p += strnlen ((char *) p, maxlen) + 1;
15509           }
15510         else
15511           {
15512             printf (_("<corrupt>"));
15513             p = (unsigned char *) end;
15514           }
15515         printf ("\"\n");
15516         return p;
15517       }
15518     }
15519
15520   return display_tag_value (tag, p, end);
15521 }
15522
15523 static void
15524 display_raw_attribute (unsigned char * p, unsigned char const * const end)
15525 {
15526   unsigned long addr = 0;
15527   size_t bytes = end - p;
15528
15529   assert (end >= p);
15530   while (bytes)
15531     {
15532       int j;
15533       int k;
15534       int lbytes = (bytes > 16 ? 16 : bytes);
15535
15536       printf ("  0x%8.8lx ", addr);
15537
15538       for (j = 0; j < 16; j++)
15539         {
15540           if (j < lbytes)
15541             printf ("%2.2x", p[j]);
15542           else
15543             printf ("  ");
15544
15545           if ((j & 3) == 3)
15546             printf (" ");
15547         }
15548
15549       for (j = 0; j < lbytes; j++)
15550         {
15551           k = p[j];
15552           if (k >= ' ' && k < 0x7f)
15553             printf ("%c", k);
15554           else
15555             printf (".");
15556         }
15557
15558       putchar ('\n');
15559
15560       p  += lbytes;
15561       bytes -= lbytes;
15562       addr += lbytes;
15563     }
15564
15565   putchar ('\n');
15566 }
15567
15568 static unsigned char *
15569 display_msp430x_attribute (unsigned char * p,
15570                            const unsigned char * const end)
15571 {
15572   unsigned int len;
15573   unsigned int val;
15574   unsigned int tag;
15575
15576   tag = read_uleb128 (p, & len, end);
15577   p += len;
15578
15579   switch (tag)
15580     {
15581     case OFBA_MSPABI_Tag_ISA:
15582       val = read_uleb128 (p, &len, end);
15583       p += len;
15584       printf ("  Tag_ISA: ");
15585       switch (val)
15586         {
15587         case 0: printf (_("None\n")); break;
15588         case 1: printf (_("MSP430\n")); break;
15589         case 2: printf (_("MSP430X\n")); break;
15590         default: printf ("??? (%d)\n", val); break;
15591         }
15592       break;
15593
15594     case OFBA_MSPABI_Tag_Code_Model:
15595       val = read_uleb128 (p, &len, end);
15596       p += len;
15597       printf ("  Tag_Code_Model: ");
15598       switch (val)
15599         {
15600         case 0: printf (_("None\n")); break;
15601         case 1: printf (_("Small\n")); break;
15602         case 2: printf (_("Large\n")); break;
15603         default: printf ("??? (%d)\n", val); break;
15604         }
15605       break;
15606
15607     case OFBA_MSPABI_Tag_Data_Model:
15608       val = read_uleb128 (p, &len, end);
15609       p += len;
15610       printf ("  Tag_Data_Model: ");
15611       switch (val)
15612         {
15613         case 0: printf (_("None\n")); break;
15614         case 1: printf (_("Small\n")); break;
15615         case 2: printf (_("Large\n")); break;
15616         case 3: printf (_("Restricted Large\n")); break;
15617         default: printf ("??? (%d)\n", val); break;
15618         }
15619       break;
15620
15621     default:
15622       printf (_("  <unknown tag %d>: "), tag);
15623
15624       if (tag & 1)
15625         {
15626           putchar ('"');
15627           if (p < end - 1)
15628             {
15629               size_t maxlen = (end - p) - 1;
15630
15631               print_symbol ((int) maxlen, (const char *) p);
15632               p += strnlen ((char *) p, maxlen) + 1;
15633             }
15634           else
15635             {
15636               printf (_("<corrupt>"));
15637               p = (unsigned char *) end;
15638             }
15639           printf ("\"\n");
15640         }
15641       else
15642         {
15643           val = read_uleb128 (p, &len, end);
15644           p += len;
15645           printf ("%d (0x%x)\n", val, val);
15646         }
15647       break;
15648    }
15649
15650   assert (p <= end);
15651   return p;
15652 }
15653
15654 struct riscv_attr_tag_t {
15655   const char *name;
15656   int tag;
15657 };
15658
15659 static struct riscv_attr_tag_t riscv_attr_tag[] =
15660 {
15661 #define T(tag) {"Tag_RISCV_" #tag, Tag_RISCV_##tag}
15662   T(arch),
15663   T(priv_spec),
15664   T(priv_spec_minor),
15665   T(priv_spec_revision),
15666   T(unaligned_access),
15667   T(stack_align),
15668 #undef T
15669 };
15670
15671 static unsigned char *
15672 display_riscv_attribute (unsigned char *p,
15673                          const unsigned char * const end)
15674 {
15675   unsigned int len;
15676   int val;
15677   int tag;
15678   struct riscv_attr_tag_t *attr = NULL;
15679   unsigned i;
15680
15681   tag = read_uleb128 (p, &len, end);
15682   p += len;
15683
15684   /* Find the name of attribute. */
15685   for (i = 0; i < ARRAY_SIZE (riscv_attr_tag); i++)
15686     {
15687       if (riscv_attr_tag[i].tag == tag)
15688         {
15689           attr = &riscv_attr_tag[i];
15690           break;
15691         }
15692     }
15693
15694   if (attr)
15695     printf ("  %s: ", attr->name);
15696   else
15697     return display_tag_value (tag, p, end);
15698
15699   switch (tag)
15700     {
15701     case Tag_RISCV_priv_spec:
15702     case Tag_RISCV_priv_spec_minor:
15703     case Tag_RISCV_priv_spec_revision:
15704       val = read_uleb128 (p, &len, end);
15705       p += len;
15706       printf (_("%d\n"), val);
15707       break;
15708     case Tag_RISCV_unaligned_access:
15709       val = read_uleb128 (p, &len, end);
15710       p += len;
15711       switch (val)
15712         {
15713         case 0:
15714           printf (_("No unaligned access\n"));
15715           break;
15716         case 1:
15717           printf (_("Unaligned access\n"));
15718           break;
15719         }
15720       break;
15721     case Tag_RISCV_stack_align:
15722       val = read_uleb128 (p, &len, end);
15723       p += len;
15724       printf (_("%d-bytes\n"), val);
15725       break;
15726     case Tag_RISCV_arch:
15727       p = display_tag_value (-1, p, end);
15728       break;
15729     default:
15730       return display_tag_value (tag, p, end);
15731     }
15732
15733   return p;
15734 }
15735
15736 static bfd_boolean
15737 process_attributes (Filedata * filedata,
15738                     const char * public_name,
15739                     unsigned int proc_type,
15740                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
15741                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const))
15742 {
15743   Elf_Internal_Shdr * sect;
15744   unsigned i;
15745   bfd_boolean res = TRUE;
15746
15747   /* Find the section header so that we get the size.  */
15748   for (i = 0, sect = filedata->section_headers;
15749        i < filedata->file_header.e_shnum;
15750        i++, sect++)
15751     {
15752       unsigned char * contents;
15753       unsigned char * p;
15754
15755       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
15756         continue;
15757
15758       contents = (unsigned char *) get_data (NULL, filedata, sect->sh_offset, 1,
15759                                              sect->sh_size, _("attributes"));
15760       if (contents == NULL)
15761         {
15762           res = FALSE;
15763           continue;
15764         }
15765
15766       p = contents;
15767       /* The first character is the version of the attributes.
15768          Currently only version 1, (aka 'A') is recognised here.  */
15769       if (*p != 'A')
15770         {
15771           printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p);
15772           res = FALSE;
15773         }
15774       else
15775         {
15776           bfd_vma section_len;
15777
15778           section_len = sect->sh_size - 1;
15779           p++;
15780
15781           while (section_len > 0)
15782             {
15783               bfd_vma attr_len;
15784               unsigned int namelen;
15785               bfd_boolean public_section;
15786               bfd_boolean gnu_section;
15787
15788               if (section_len <= 4)
15789                 {
15790                   error (_("Tag section ends prematurely\n"));
15791                   res = FALSE;
15792                   break;
15793                 }
15794               attr_len = byte_get (p, 4);
15795               p += 4;
15796
15797               if (attr_len > section_len)
15798                 {
15799                   error (_("Bad attribute length (%u > %u)\n"),
15800                           (unsigned) attr_len, (unsigned) section_len);
15801                   attr_len = section_len;
15802                   res = FALSE;
15803                 }
15804               /* PR 17531: file: 001-101425-0.004  */
15805               else if (attr_len < 5)
15806                 {
15807                   error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
15808                   res = FALSE;
15809                   break;
15810                 }
15811
15812               section_len -= attr_len;
15813               attr_len -= 4;
15814
15815               namelen = strnlen ((char *) p, attr_len) + 1;
15816               if (namelen == 0 || namelen >= attr_len)
15817                 {
15818                   error (_("Corrupt attribute section name\n"));
15819                   res = FALSE;
15820                   break;
15821                 }
15822
15823               printf (_("Attribute Section: "));
15824               print_symbol (INT_MAX, (const char *) p);
15825               putchar ('\n');
15826
15827               if (public_name && streq ((char *) p, public_name))
15828                 public_section = TRUE;
15829               else
15830                 public_section = FALSE;
15831
15832               if (streq ((char *) p, "gnu"))
15833                 gnu_section = TRUE;
15834               else
15835                 gnu_section = FALSE;
15836
15837               p += namelen;
15838               attr_len -= namelen;
15839
15840               while (attr_len > 0 && p < contents + sect->sh_size)
15841                 {
15842                   int tag;
15843                   int val;
15844                   bfd_vma size;
15845                   unsigned char * end;
15846
15847                   /* PR binutils/17531: Safe handling of corrupt files.  */
15848                   if (attr_len < 6)
15849                     {
15850                       error (_("Unused bytes at end of section\n"));
15851                       res = FALSE;
15852                       section_len = 0;
15853                       break;
15854                     }
15855
15856                   tag = *(p++);
15857                   size = byte_get (p, 4);
15858                   if (size > attr_len)
15859                     {
15860                       error (_("Bad subsection length (%u > %u)\n"),
15861                               (unsigned) size, (unsigned) attr_len);
15862                       res = FALSE;
15863                       size = attr_len;
15864                     }
15865                   /* PR binutils/17531: Safe handling of corrupt files.  */
15866                   if (size < 6)
15867                     {
15868                       error (_("Bad subsection length (%u < 6)\n"),
15869                               (unsigned) size);
15870                       res = FALSE;
15871                       section_len = 0;
15872                       break;
15873                     }
15874
15875                   attr_len -= size;
15876                   end = p + size - 1;
15877                   assert (end <= contents + sect->sh_size);
15878                   p += 4;
15879
15880                   switch (tag)
15881                     {
15882                     case 1:
15883                       printf (_("File Attributes\n"));
15884                       break;
15885                     case 2:
15886                       printf (_("Section Attributes:"));
15887                       goto do_numlist;
15888                     case 3:
15889                       printf (_("Symbol Attributes:"));
15890                       /* Fall through.  */
15891                     do_numlist:
15892                       for (;;)
15893                         {
15894                           unsigned int j;
15895
15896                           val = read_uleb128 (p, &j, end);
15897                           p += j;
15898                           if (val == 0)
15899                             break;
15900                           printf (" %d", val);
15901                         }
15902                       printf ("\n");
15903                       break;
15904                     default:
15905                       printf (_("Unknown tag: %d\n"), tag);
15906                       public_section = FALSE;
15907                       break;
15908                     }
15909
15910                   if (public_section && display_pub_attribute != NULL)
15911                     {
15912                       while (p < end)
15913                         p = display_pub_attribute (p, end);
15914                       assert (p == end);
15915                     }
15916                   else if (gnu_section && display_proc_gnu_attribute != NULL)
15917                     {
15918                       while (p < end)
15919                         p = display_gnu_attribute (p,
15920                                                    display_proc_gnu_attribute,
15921                                                    end);
15922                       assert (p == end);
15923                     }
15924                   else if (p < end)
15925                     {
15926                       printf (_("  Unknown attribute:\n"));
15927                       display_raw_attribute (p, end);
15928                       p = end;
15929                     }
15930                   else
15931                     attr_len = 0;
15932                 }
15933             }
15934         }
15935
15936       free (contents);
15937     }
15938
15939   return res;
15940 }
15941
15942 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
15943    Print the Address, Access and Initial fields of an entry at VMA ADDR
15944    and return the VMA of the next entry, or -1 if there was a problem.
15945    Does not read from DATA_END or beyond.  */
15946
15947 static bfd_vma
15948 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
15949                       unsigned char * data_end)
15950 {
15951   printf ("  ");
15952   print_vma (addr, LONG_HEX);
15953   printf (" ");
15954   if (addr < pltgot + 0xfff0)
15955     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
15956   else
15957     printf ("%10s", "");
15958   printf (" ");
15959   if (data == NULL)
15960     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15961   else
15962     {
15963       bfd_vma entry;
15964       unsigned char * from = data + addr - pltgot;
15965
15966       if (from + (is_32bit_elf ? 4 : 8) > data_end)
15967         {
15968           warn (_("MIPS GOT entry extends beyond the end of available data\n"));
15969           printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
15970           return (bfd_vma) -1;
15971         }
15972       else
15973         {
15974           entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15975           print_vma (entry, LONG_HEX);
15976         }
15977     }
15978   return addr + (is_32bit_elf ? 4 : 8);
15979 }
15980
15981 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
15982    PLTGOT.  Print the Address and Initial fields of an entry at VMA
15983    ADDR and return the VMA of the next entry.  */
15984
15985 static bfd_vma
15986 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
15987 {
15988   printf ("  ");
15989   print_vma (addr, LONG_HEX);
15990   printf (" ");
15991   if (data == NULL)
15992     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15993   else
15994     {
15995       bfd_vma entry;
15996
15997       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15998       print_vma (entry, LONG_HEX);
15999     }
16000   return addr + (is_32bit_elf ? 4 : 8);
16001 }
16002
16003 static void
16004 print_mips_ases (unsigned int mask)
16005 {
16006   if (mask & AFL_ASE_DSP)
16007     fputs ("\n\tDSP ASE", stdout);
16008   if (mask & AFL_ASE_DSPR2)
16009     fputs ("\n\tDSP R2 ASE", stdout);
16010   if (mask & AFL_ASE_DSPR3)
16011     fputs ("\n\tDSP R3 ASE", stdout);
16012   if (mask & AFL_ASE_EVA)
16013     fputs ("\n\tEnhanced VA Scheme", stdout);
16014   if (mask & AFL_ASE_MCU)
16015     fputs ("\n\tMCU (MicroController) ASE", stdout);
16016   if (mask & AFL_ASE_MDMX)
16017     fputs ("\n\tMDMX ASE", stdout);
16018   if (mask & AFL_ASE_MIPS3D)
16019     fputs ("\n\tMIPS-3D ASE", stdout);
16020   if (mask & AFL_ASE_MT)
16021     fputs ("\n\tMT ASE", stdout);
16022   if (mask & AFL_ASE_SMARTMIPS)
16023     fputs ("\n\tSmartMIPS ASE", stdout);
16024   if (mask & AFL_ASE_VIRT)
16025     fputs ("\n\tVZ ASE", stdout);
16026   if (mask & AFL_ASE_MSA)
16027     fputs ("\n\tMSA ASE", stdout);
16028   if (mask & AFL_ASE_MIPS16)
16029     fputs ("\n\tMIPS16 ASE", stdout);
16030   if (mask & AFL_ASE_MICROMIPS)
16031     fputs ("\n\tMICROMIPS ASE", stdout);
16032   if (mask & AFL_ASE_XPA)
16033     fputs ("\n\tXPA ASE", stdout);
16034   if (mask & AFL_ASE_MIPS16E2)
16035     fputs ("\n\tMIPS16e2 ASE", stdout);
16036   if (mask & AFL_ASE_CRC)
16037     fputs ("\n\tCRC ASE", stdout);
16038   if (mask & AFL_ASE_GINV)
16039     fputs ("\n\tGINV ASE", stdout);
16040   if (mask & AFL_ASE_LOONGSON_MMI)
16041     fputs ("\n\tLoongson MMI ASE", stdout);
16042   if (mask & AFL_ASE_LOONGSON_CAM)
16043     fputs ("\n\tLoongson CAM ASE", stdout);
16044   if (mask & AFL_ASE_LOONGSON_EXT)
16045     fputs ("\n\tLoongson EXT ASE", stdout);
16046   if (mask & AFL_ASE_LOONGSON_EXT2)
16047     fputs ("\n\tLoongson EXT2 ASE", stdout);
16048   if (mask == 0)
16049     fprintf (stdout, "\n\t%s", _("None"));
16050   else if ((mask & ~AFL_ASE_MASK) != 0)
16051     fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
16052 }
16053
16054 static void
16055 print_mips_isa_ext (unsigned int isa_ext)
16056 {
16057   switch (isa_ext)
16058     {
16059     case 0:
16060       fputs (_("None"), stdout);
16061       break;
16062     case AFL_EXT_XLR:
16063       fputs ("RMI XLR", stdout);
16064       break;
16065     case AFL_EXT_OCTEON3:
16066       fputs ("Cavium Networks Octeon3", stdout);
16067       break;
16068     case AFL_EXT_OCTEON2:
16069       fputs ("Cavium Networks Octeon2", stdout);
16070       break;
16071     case AFL_EXT_OCTEONP:
16072       fputs ("Cavium Networks OcteonP", stdout);
16073       break;
16074     case AFL_EXT_OCTEON:
16075       fputs ("Cavium Networks Octeon", stdout);
16076       break;
16077     case AFL_EXT_5900:
16078       fputs ("Toshiba R5900", stdout);
16079       break;
16080     case AFL_EXT_4650:
16081       fputs ("MIPS R4650", stdout);
16082       break;
16083     case AFL_EXT_4010:
16084       fputs ("LSI R4010", stdout);
16085       break;
16086     case AFL_EXT_4100:
16087       fputs ("NEC VR4100", stdout);
16088       break;
16089     case AFL_EXT_3900:
16090       fputs ("Toshiba R3900", stdout);
16091       break;
16092     case AFL_EXT_10000:
16093       fputs ("MIPS R10000", stdout);
16094       break;
16095     case AFL_EXT_SB1:
16096       fputs ("Broadcom SB-1", stdout);
16097       break;
16098     case AFL_EXT_4111:
16099       fputs ("NEC VR4111/VR4181", stdout);
16100       break;
16101     case AFL_EXT_4120:
16102       fputs ("NEC VR4120", stdout);
16103       break;
16104     case AFL_EXT_5400:
16105       fputs ("NEC VR5400", stdout);
16106       break;
16107     case AFL_EXT_5500:
16108       fputs ("NEC VR5500", stdout);
16109       break;
16110     case AFL_EXT_LOONGSON_2E:
16111       fputs ("ST Microelectronics Loongson 2E", stdout);
16112       break;
16113     case AFL_EXT_LOONGSON_2F:
16114       fputs ("ST Microelectronics Loongson 2F", stdout);
16115       break;
16116     case AFL_EXT_INTERAPTIV_MR2:
16117       fputs ("Imagination interAptiv MR2", stdout);
16118       break;
16119     default:
16120       fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
16121     }
16122 }
16123
16124 static signed int
16125 get_mips_reg_size (int reg_size)
16126 {
16127   return (reg_size == AFL_REG_NONE) ? 0
16128          : (reg_size == AFL_REG_32) ? 32
16129          : (reg_size == AFL_REG_64) ? 64
16130          : (reg_size == AFL_REG_128) ? 128
16131          : -1;
16132 }
16133
16134 static bfd_boolean
16135 process_mips_specific (Filedata * filedata)
16136 {
16137   Elf_Internal_Dyn * entry;
16138   Elf_Internal_Shdr *sect = NULL;
16139   size_t liblist_offset = 0;
16140   size_t liblistno = 0;
16141   size_t conflictsno = 0;
16142   size_t options_offset = 0;
16143   size_t conflicts_offset = 0;
16144   size_t pltrelsz = 0;
16145   size_t pltrel = 0;
16146   bfd_vma pltgot = 0;
16147   bfd_vma mips_pltgot = 0;
16148   bfd_vma jmprel = 0;
16149   bfd_vma local_gotno = 0;
16150   bfd_vma gotsym = 0;
16151   bfd_vma symtabno = 0;
16152   bfd_boolean res = TRUE;
16153
16154   if (! process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
16155                             display_mips_gnu_attribute))
16156     res = FALSE;
16157
16158   sect = find_section (filedata, ".MIPS.abiflags");
16159
16160   if (sect != NULL)
16161     {
16162       Elf_External_ABIFlags_v0 *abiflags_ext;
16163       Elf_Internal_ABIFlags_v0 abiflags_in;
16164
16165       if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
16166         {
16167           error (_("Corrupt MIPS ABI Flags section.\n"));
16168           res = FALSE;
16169         }
16170       else
16171         {
16172           abiflags_ext = get_data (NULL, filedata, sect->sh_offset, 1,
16173                                    sect->sh_size, _("MIPS ABI Flags section"));
16174           if (abiflags_ext)
16175             {
16176               abiflags_in.version = BYTE_GET (abiflags_ext->version);
16177               abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
16178               abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
16179               abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
16180               abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
16181               abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
16182               abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
16183               abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
16184               abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
16185               abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
16186               abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
16187
16188               printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
16189               printf ("\nISA: MIPS%d", abiflags_in.isa_level);
16190               if (abiflags_in.isa_rev > 1)
16191                 printf ("r%d", abiflags_in.isa_rev);
16192               printf ("\nGPR size: %d",
16193                       get_mips_reg_size (abiflags_in.gpr_size));
16194               printf ("\nCPR1 size: %d",
16195                       get_mips_reg_size (abiflags_in.cpr1_size));
16196               printf ("\nCPR2 size: %d",
16197                       get_mips_reg_size (abiflags_in.cpr2_size));
16198               fputs ("\nFP ABI: ", stdout);
16199               print_mips_fp_abi_value (abiflags_in.fp_abi);
16200               fputs ("ISA Extension: ", stdout);
16201               print_mips_isa_ext (abiflags_in.isa_ext);
16202               fputs ("\nASEs:", stdout);
16203               print_mips_ases (abiflags_in.ases);
16204               printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
16205               printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
16206               fputc ('\n', stdout);
16207               free (abiflags_ext);
16208             }
16209         }
16210     }
16211
16212   /* We have a lot of special sections.  Thanks SGI!  */
16213   if (dynamic_section == NULL)
16214     {
16215       /* No dynamic information available.  See if there is static GOT.  */
16216       sect = find_section (filedata, ".got");
16217       if (sect != NULL)
16218         {
16219           unsigned char *data_end;
16220           unsigned char *data;
16221           bfd_vma ent, end;
16222           int addr_size;
16223
16224           pltgot = sect->sh_addr;
16225
16226           ent = pltgot;
16227           addr_size = (is_32bit_elf ? 4 : 8);
16228           end = pltgot + sect->sh_size;
16229
16230           data = (unsigned char *) get_data (NULL, filedata, sect->sh_offset,
16231                                              end - pltgot, 1,
16232                                              _("Global Offset Table data"));
16233           /* PR 12855: Null data is handled gracefully throughout.  */
16234           data_end = data + (end - pltgot);
16235
16236           printf (_("\nStatic GOT:\n"));
16237           printf (_(" Canonical gp value: "));
16238           print_vma (ent + 0x7ff0, LONG_HEX);
16239           printf ("\n\n");
16240
16241           /* In a dynamic binary GOT[0] is reserved for the dynamic
16242              loader to store the lazy resolver pointer, however in
16243              a static binary it may well have been omitted and GOT
16244              reduced to a table of addresses.
16245              PR 21344: Check for the entry being fully available
16246              before fetching it.  */
16247           if (data
16248               && data + ent - pltgot + addr_size <= data_end
16249               && byte_get (data + ent - pltgot, addr_size) == 0)
16250             {
16251               printf (_(" Reserved entries:\n"));
16252               printf (_("  %*s %10s %*s\n"),
16253                       addr_size * 2, _("Address"), _("Access"),
16254                       addr_size * 2, _("Value"));
16255               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16256               printf ("\n");
16257               if (ent == (bfd_vma) -1)
16258                 goto sgot_print_fail;
16259
16260               /* Check for the MSB of GOT[1] being set, identifying a
16261                  GNU object.  This entry will be used by some runtime
16262                  loaders, to store the module pointer.  Otherwise this
16263                  is an ordinary local entry.
16264                  PR 21344: Check for the entry being fully available
16265                  before fetching it.  */
16266               if (data
16267                   && data + ent - pltgot + addr_size <= data_end
16268                   && (byte_get (data + ent - pltgot, addr_size)
16269                       >> (addr_size * 8 - 1)) != 0)
16270                 {
16271                   ent = print_mips_got_entry (data, pltgot, ent, data_end);
16272                   printf ("\n");
16273                   if (ent == (bfd_vma) -1)
16274                     goto sgot_print_fail;
16275                 }
16276               printf ("\n");
16277             }
16278
16279           if (data != NULL && ent < end)
16280             {
16281               printf (_(" Local entries:\n"));
16282               printf ("  %*s %10s %*s\n",
16283                       addr_size * 2, _("Address"), _("Access"),
16284                       addr_size * 2, _("Value"));
16285               while (ent < end)
16286                 {
16287                   ent = print_mips_got_entry (data, pltgot, ent, data_end);
16288                   printf ("\n");
16289                   if (ent == (bfd_vma) -1)
16290                     goto sgot_print_fail;
16291                 }
16292               printf ("\n");
16293             }
16294
16295         sgot_print_fail:
16296           if (data)
16297             free (data);
16298         }
16299       return res;
16300     }
16301
16302   for (entry = dynamic_section;
16303        /* PR 17531 file: 012-50589-0.004.  */
16304        entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
16305        ++entry)
16306     switch (entry->d_tag)
16307       {
16308       case DT_MIPS_LIBLIST:
16309         liblist_offset
16310           = offset_from_vma (filedata, entry->d_un.d_val,
16311                              liblistno * sizeof (Elf32_External_Lib));
16312         break;
16313       case DT_MIPS_LIBLISTNO:
16314         liblistno = entry->d_un.d_val;
16315         break;
16316       case DT_MIPS_OPTIONS:
16317         options_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
16318         break;
16319       case DT_MIPS_CONFLICT:
16320         conflicts_offset
16321           = offset_from_vma (filedata, entry->d_un.d_val,
16322                              conflictsno * sizeof (Elf32_External_Conflict));
16323         break;
16324       case DT_MIPS_CONFLICTNO:
16325         conflictsno = entry->d_un.d_val;
16326         break;
16327       case DT_PLTGOT:
16328         pltgot = entry->d_un.d_ptr;
16329         break;
16330       case DT_MIPS_LOCAL_GOTNO:
16331         local_gotno = entry->d_un.d_val;
16332         break;
16333       case DT_MIPS_GOTSYM:
16334         gotsym = entry->d_un.d_val;
16335         break;
16336       case DT_MIPS_SYMTABNO:
16337         symtabno = entry->d_un.d_val;
16338         break;
16339       case DT_MIPS_PLTGOT:
16340         mips_pltgot = entry->d_un.d_ptr;
16341         break;
16342       case DT_PLTREL:
16343         pltrel = entry->d_un.d_val;
16344         break;
16345       case DT_PLTRELSZ:
16346         pltrelsz = entry->d_un.d_val;
16347         break;
16348       case DT_JMPREL:
16349         jmprel = entry->d_un.d_ptr;
16350         break;
16351       default:
16352         break;
16353       }
16354
16355   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
16356     {
16357       Elf32_External_Lib * elib;
16358       size_t cnt;
16359
16360       elib = (Elf32_External_Lib *) get_data (NULL, filedata, liblist_offset,
16361                                               liblistno,
16362                                               sizeof (Elf32_External_Lib),
16363                                               _("liblist section data"));
16364       if (elib)
16365         {
16366           printf (ngettext ("\nSection '.liblist' contains %lu entry:\n",
16367                             "\nSection '.liblist' contains %lu entries:\n",
16368                             (unsigned long) liblistno),
16369                   (unsigned long) liblistno);
16370           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
16371                  stdout);
16372
16373           for (cnt = 0; cnt < liblistno; ++cnt)
16374             {
16375               Elf32_Lib liblist;
16376               time_t atime;
16377               char timebuf[128];
16378               struct tm * tmp;
16379
16380               liblist.l_name = BYTE_GET (elib[cnt].l_name);
16381               atime = BYTE_GET (elib[cnt].l_time_stamp);
16382               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16383               liblist.l_version = BYTE_GET (elib[cnt].l_version);
16384               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16385
16386               tmp = gmtime (&atime);
16387               snprintf (timebuf, sizeof (timebuf),
16388                         "%04u-%02u-%02uT%02u:%02u:%02u",
16389                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16390                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16391
16392               printf ("%3lu: ", (unsigned long) cnt);
16393               if (VALID_DYNAMIC_NAME (liblist.l_name))
16394                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
16395               else
16396                 printf (_("<corrupt: %9ld>"), liblist.l_name);
16397               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
16398                       liblist.l_version);
16399
16400               if (liblist.l_flags == 0)
16401                 puts (_(" NONE"));
16402               else
16403                 {
16404                   static const struct
16405                   {
16406                     const char * name;
16407                     int bit;
16408                   }
16409                   l_flags_vals[] =
16410                   {
16411                     { " EXACT_MATCH", LL_EXACT_MATCH },
16412                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
16413                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
16414                     { " EXPORTS", LL_EXPORTS },
16415                     { " DELAY_LOAD", LL_DELAY_LOAD },
16416                     { " DELTA", LL_DELTA }
16417                   };
16418                   int flags = liblist.l_flags;
16419                   size_t fcnt;
16420
16421                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
16422                     if ((flags & l_flags_vals[fcnt].bit) != 0)
16423                       {
16424                         fputs (l_flags_vals[fcnt].name, stdout);
16425                         flags ^= l_flags_vals[fcnt].bit;
16426                       }
16427                   if (flags != 0)
16428                     printf (" %#x", (unsigned int) flags);
16429
16430                   puts ("");
16431                 }
16432             }
16433
16434           free (elib);
16435         }
16436       else
16437         res = FALSE;
16438     }
16439
16440   if (options_offset != 0)
16441     {
16442       Elf_External_Options * eopt;
16443       Elf_Internal_Options * iopt;
16444       Elf_Internal_Options * option;
16445       size_t offset;
16446       int cnt;
16447       sect = filedata->section_headers;
16448
16449       /* Find the section header so that we get the size.  */
16450       sect = find_section_by_type (filedata, SHT_MIPS_OPTIONS);
16451       /* PR 17533 file: 012-277276-0.004.  */
16452       if (sect == NULL)
16453         {
16454           error (_("No MIPS_OPTIONS header found\n"));
16455           return FALSE;
16456         }
16457       /* PR 24243  */
16458       if (sect->sh_size < sizeof (* eopt))
16459         {
16460           error (_("The MIPS options section is too small.\n"));
16461           return FALSE;
16462         }
16463
16464       eopt = (Elf_External_Options *) get_data (NULL, filedata, options_offset, 1,
16465                                                 sect->sh_size, _("options"));
16466       if (eopt)
16467         {
16468           iopt = (Elf_Internal_Options *)
16469               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
16470           if (iopt == NULL)
16471             {
16472               error (_("Out of memory allocating space for MIPS options\n"));
16473               return FALSE;
16474             }
16475
16476           offset = cnt = 0;
16477           option = iopt;
16478
16479           while (offset <= sect->sh_size - sizeof (* eopt))
16480             {
16481               Elf_External_Options * eoption;
16482
16483               eoption = (Elf_External_Options *) ((char *) eopt + offset);
16484
16485               option->kind = BYTE_GET (eoption->kind);
16486               option->size = BYTE_GET (eoption->size);
16487               option->section = BYTE_GET (eoption->section);
16488               option->info = BYTE_GET (eoption->info);
16489
16490               /* PR 17531: file: ffa0fa3b.  */
16491               if (option->size < sizeof (* eopt)
16492                   || offset + option->size > sect->sh_size)
16493                 {
16494                   error (_("Invalid size (%u) for MIPS option\n"), option->size);
16495                   return FALSE;
16496                 }
16497               offset += option->size;
16498
16499               ++option;
16500               ++cnt;
16501             }
16502
16503           printf (ngettext ("\nSection '%s' contains %d entry:\n",
16504                             "\nSection '%s' contains %d entries:\n",
16505                             cnt),
16506                   printable_section_name (filedata, sect), cnt);
16507
16508           option = iopt;
16509           offset = 0;
16510
16511           while (cnt-- > 0)
16512             {
16513               size_t len;
16514
16515               switch (option->kind)
16516                 {
16517                 case ODK_NULL:
16518                   /* This shouldn't happen.  */
16519                   printf (" NULL       %d %lx", option->section, option->info);
16520                   break;
16521                 case ODK_REGINFO:
16522                   printf (" REGINFO    ");
16523                   if (filedata->file_header.e_machine == EM_MIPS)
16524                     {
16525                       /* 32bit form.  */
16526                       Elf32_External_RegInfo * ereg;
16527                       Elf32_RegInfo reginfo;
16528
16529                       ereg = (Elf32_External_RegInfo *) (option + 1);
16530                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
16531                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16532                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16533                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16534                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16535                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
16536
16537                       printf ("GPR %08lx  GP 0x%lx\n",
16538                               reginfo.ri_gprmask,
16539                               (unsigned long) reginfo.ri_gp_value);
16540                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
16541                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16542                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16543                     }
16544                   else
16545                     {
16546                       /* 64 bit form.  */
16547                       Elf64_External_RegInfo * ereg;
16548                       Elf64_Internal_RegInfo reginfo;
16549
16550                       ereg = (Elf64_External_RegInfo *) (option + 1);
16551                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
16552                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16553                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16554                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16555                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16556                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
16557
16558                       printf ("GPR %08lx  GP 0x",
16559                               reginfo.ri_gprmask);
16560                       printf_vma (reginfo.ri_gp_value);
16561                       printf ("\n");
16562
16563                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
16564                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16565                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16566                     }
16567                   ++option;
16568                   continue;
16569                 case ODK_EXCEPTIONS:
16570                   fputs (" EXCEPTIONS fpe_min(", stdout);
16571                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
16572                   fputs (") fpe_max(", stdout);
16573                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
16574                   fputs (")", stdout);
16575
16576                   if (option->info & OEX_PAGE0)
16577                     fputs (" PAGE0", stdout);
16578                   if (option->info & OEX_SMM)
16579                     fputs (" SMM", stdout);
16580                   if (option->info & OEX_FPDBUG)
16581                     fputs (" FPDBUG", stdout);
16582                   if (option->info & OEX_DISMISS)
16583                     fputs (" DISMISS", stdout);
16584                   break;
16585                 case ODK_PAD:
16586                   fputs (" PAD       ", stdout);
16587                   if (option->info & OPAD_PREFIX)
16588                     fputs (" PREFIX", stdout);
16589                   if (option->info & OPAD_POSTFIX)
16590                     fputs (" POSTFIX", stdout);
16591                   if (option->info & OPAD_SYMBOL)
16592                     fputs (" SYMBOL", stdout);
16593                   break;
16594                 case ODK_HWPATCH:
16595                   fputs (" HWPATCH   ", stdout);
16596                   if (option->info & OHW_R4KEOP)
16597                     fputs (" R4KEOP", stdout);
16598                   if (option->info & OHW_R8KPFETCH)
16599                     fputs (" R8KPFETCH", stdout);
16600                   if (option->info & OHW_R5KEOP)
16601                     fputs (" R5KEOP", stdout);
16602                   if (option->info & OHW_R5KCVTL)
16603                     fputs (" R5KCVTL", stdout);
16604                   break;
16605                 case ODK_FILL:
16606                   fputs (" FILL       ", stdout);
16607                   /* XXX Print content of info word?  */
16608                   break;
16609                 case ODK_TAGS:
16610                   fputs (" TAGS       ", stdout);
16611                   /* XXX Print content of info word?  */
16612                   break;
16613                 case ODK_HWAND:
16614                   fputs (" HWAND     ", stdout);
16615                   if (option->info & OHWA0_R4KEOP_CHECKED)
16616                     fputs (" R4KEOP_CHECKED", stdout);
16617                   if (option->info & OHWA0_R4KEOP_CLEAN)
16618                     fputs (" R4KEOP_CLEAN", stdout);
16619                   break;
16620                 case ODK_HWOR:
16621                   fputs (" HWOR      ", stdout);
16622                   if (option->info & OHWA0_R4KEOP_CHECKED)
16623                     fputs (" R4KEOP_CHECKED", stdout);
16624                   if (option->info & OHWA0_R4KEOP_CLEAN)
16625                     fputs (" R4KEOP_CLEAN", stdout);
16626                   break;
16627                 case ODK_GP_GROUP:
16628                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
16629                           option->info & OGP_GROUP,
16630                           (option->info & OGP_SELF) >> 16);
16631                   break;
16632                 case ODK_IDENT:
16633                   printf (" IDENT     %#06lx  self-contained %#06lx",
16634                           option->info & OGP_GROUP,
16635                           (option->info & OGP_SELF) >> 16);
16636                   break;
16637                 default:
16638                   /* This shouldn't happen.  */
16639                   printf (" %3d ???     %d %lx",
16640                           option->kind, option->section, option->info);
16641                   break;
16642                 }
16643
16644               len = sizeof (* eopt);
16645               while (len < option->size)
16646                 {
16647                   unsigned char datum = * ((unsigned char *) eopt + offset + len);
16648
16649                   if (ISPRINT (datum))
16650                     printf ("%c", datum);
16651                   else
16652                     printf ("\\%03o", datum);
16653                   len ++;
16654                 }
16655               fputs ("\n", stdout);
16656
16657               offset += option->size;
16658               ++option;
16659             }
16660
16661           free (eopt);
16662         }
16663       else
16664         res = FALSE;
16665     }
16666
16667   if (conflicts_offset != 0 && conflictsno != 0)
16668     {
16669       Elf32_Conflict * iconf;
16670       size_t cnt;
16671
16672       if (dynamic_symbols == NULL)
16673         {
16674           error (_("conflict list found without a dynamic symbol table\n"));
16675           return FALSE;
16676         }
16677
16678       /* PR 21345 - print a slightly more helpful error message
16679          if we are sure that the cmalloc will fail.  */
16680       if (conflictsno * sizeof (* iconf) > filedata->file_size)
16681         {
16682           error (_("Overlarge number of conflicts detected: %lx\n"),
16683                  (long) conflictsno);
16684           return FALSE;
16685         }
16686
16687       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
16688       if (iconf == NULL)
16689         {
16690           error (_("Out of memory allocating space for dynamic conflicts\n"));
16691           return FALSE;
16692         }
16693
16694       if (is_32bit_elf)
16695         {
16696           Elf32_External_Conflict * econf32;
16697
16698           econf32 = (Elf32_External_Conflict *)
16699               get_data (NULL, filedata, conflicts_offset, conflictsno,
16700                         sizeof (* econf32), _("conflict"));
16701           if (!econf32)
16702             return FALSE;
16703
16704           for (cnt = 0; cnt < conflictsno; ++cnt)
16705             iconf[cnt] = BYTE_GET (econf32[cnt]);
16706
16707           free (econf32);
16708         }
16709       else
16710         {
16711           Elf64_External_Conflict * econf64;
16712
16713           econf64 = (Elf64_External_Conflict *)
16714               get_data (NULL, filedata, conflicts_offset, conflictsno,
16715                         sizeof (* econf64), _("conflict"));
16716           if (!econf64)
16717             return FALSE;
16718
16719           for (cnt = 0; cnt < conflictsno; ++cnt)
16720             iconf[cnt] = BYTE_GET (econf64[cnt]);
16721
16722           free (econf64);
16723         }
16724
16725       printf (ngettext ("\nSection '.conflict' contains %lu entry:\n",
16726                         "\nSection '.conflict' contains %lu entries:\n",
16727                         (unsigned long) conflictsno),
16728               (unsigned long) conflictsno);
16729       puts (_("  Num:    Index       Value  Name"));
16730
16731       for (cnt = 0; cnt < conflictsno; ++cnt)
16732         {
16733           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
16734
16735           if (iconf[cnt] >= num_dynamic_syms)
16736             printf (_("<corrupt symbol index>"));
16737           else
16738             {
16739               Elf_Internal_Sym * psym;
16740
16741               psym = & dynamic_symbols[iconf[cnt]];
16742               print_vma (psym->st_value, FULL_HEX);
16743               putchar (' ');
16744               if (VALID_DYNAMIC_NAME (psym->st_name))
16745                 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
16746               else
16747                 printf (_("<corrupt: %14ld>"), psym->st_name);
16748             }
16749           putchar ('\n');
16750         }
16751
16752       free (iconf);
16753     }
16754
16755   if (pltgot != 0 && local_gotno != 0)
16756     {
16757       bfd_vma ent, local_end, global_end;
16758       size_t i, offset;
16759       unsigned char * data;
16760       unsigned char * data_end;
16761       int addr_size;
16762
16763       ent = pltgot;
16764       addr_size = (is_32bit_elf ? 4 : 8);
16765       local_end = pltgot + local_gotno * addr_size;
16766
16767       /* PR binutils/17533 file: 012-111227-0.004  */
16768       if (symtabno < gotsym)
16769         {
16770           error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
16771                  (unsigned long) gotsym, (unsigned long) symtabno);
16772           return FALSE;
16773         }
16774
16775       global_end = local_end + (symtabno - gotsym) * addr_size;
16776       /* PR 17531: file: 54c91a34.  */
16777       if (global_end < local_end)
16778         {
16779           error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
16780           return FALSE;
16781         }
16782
16783       offset = offset_from_vma (filedata, pltgot, global_end - pltgot);
16784       data = (unsigned char *) get_data (NULL, filedata, offset,
16785                                          global_end - pltgot, 1,
16786                                          _("Global Offset Table data"));
16787       /* PR 12855: Null data is handled gracefully throughout.  */
16788       data_end = data + (global_end - pltgot);
16789
16790       printf (_("\nPrimary GOT:\n"));
16791       printf (_(" Canonical gp value: "));
16792       print_vma (pltgot + 0x7ff0, LONG_HEX);
16793       printf ("\n\n");
16794
16795       printf (_(" Reserved entries:\n"));
16796       printf (_("  %*s %10s %*s Purpose\n"),
16797               addr_size * 2, _("Address"), _("Access"),
16798               addr_size * 2, _("Initial"));
16799       ent = print_mips_got_entry (data, pltgot, ent, data_end);
16800       printf (_(" Lazy resolver\n"));
16801       if (ent == (bfd_vma) -1)
16802         goto got_print_fail;
16803
16804       /* Check for the MSB of GOT[1] being set, denoting a GNU object.
16805          This entry will be used by some runtime loaders, to store the
16806          module pointer.  Otherwise this is an ordinary local entry.
16807          PR 21344: Check for the entry being fully available before
16808          fetching it.  */
16809       if (data
16810           && data + ent - pltgot + addr_size <= data_end
16811           && (byte_get (data + ent - pltgot, addr_size)
16812               >> (addr_size * 8 - 1)) != 0)
16813         {
16814           ent = print_mips_got_entry (data, pltgot, ent, data_end);
16815           printf (_(" Module pointer (GNU extension)\n"));
16816           if (ent == (bfd_vma) -1)
16817             goto got_print_fail;
16818         }
16819       printf ("\n");
16820
16821       if (data != NULL && ent < local_end)
16822         {
16823           printf (_(" Local entries:\n"));
16824           printf ("  %*s %10s %*s\n",
16825                   addr_size * 2, _("Address"), _("Access"),
16826                   addr_size * 2, _("Initial"));
16827           while (ent < local_end)
16828             {
16829               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16830               printf ("\n");
16831               if (ent == (bfd_vma) -1)
16832                 goto got_print_fail;
16833             }
16834           printf ("\n");
16835         }
16836
16837       if (data != NULL && gotsym < symtabno)
16838         {
16839           int sym_width;
16840
16841           printf (_(" Global entries:\n"));
16842           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
16843                   addr_size * 2, _("Address"),
16844                   _("Access"),
16845                   addr_size * 2, _("Initial"),
16846                   addr_size * 2, _("Sym.Val."),
16847                   _("Type"),
16848                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
16849                   _("Ndx"), _("Name"));
16850
16851           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
16852
16853           for (i = gotsym; i < symtabno; i++)
16854             {
16855               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16856               printf (" ");
16857
16858               if (dynamic_symbols == NULL)
16859                 printf (_("<no dynamic symbols>"));
16860               else if (i < num_dynamic_syms)
16861                 {
16862                   Elf_Internal_Sym * psym = dynamic_symbols + i;
16863
16864                   print_vma (psym->st_value, LONG_HEX);
16865                   printf (" %-7s %3s ",
16866                           get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16867                           get_symbol_index_type (filedata, psym->st_shndx));
16868
16869                   if (VALID_DYNAMIC_NAME (psym->st_name))
16870                     print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16871                   else
16872                     printf (_("<corrupt: %14ld>"), psym->st_name);
16873                 }
16874               else
16875                 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
16876                         (unsigned long) i);
16877
16878               printf ("\n");
16879               if (ent == (bfd_vma) -1)
16880                 break;
16881             }
16882           printf ("\n");
16883         }
16884
16885     got_print_fail:
16886       if (data)
16887         free (data);
16888     }
16889
16890   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
16891     {
16892       bfd_vma ent, end;
16893       size_t offset, rel_offset;
16894       unsigned long count, i;
16895       unsigned char * data;
16896       int addr_size, sym_width;
16897       Elf_Internal_Rela * rels;
16898
16899       rel_offset = offset_from_vma (filedata, jmprel, pltrelsz);
16900       if (pltrel == DT_RELA)
16901         {
16902           if (!slurp_rela_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16903             return FALSE;
16904         }
16905       else
16906         {
16907           if (!slurp_rel_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16908             return FALSE;
16909         }
16910
16911       ent = mips_pltgot;
16912       addr_size = (is_32bit_elf ? 4 : 8);
16913       end = mips_pltgot + (2 + count) * addr_size;
16914
16915       offset = offset_from_vma (filedata, mips_pltgot, end - mips_pltgot);
16916       data = (unsigned char *) get_data (NULL, filedata, offset, end - mips_pltgot,
16917                                          1, _("Procedure Linkage Table data"));
16918       if (data == NULL)
16919         return FALSE;
16920
16921       printf ("\nPLT GOT:\n\n");
16922       printf (_(" Reserved entries:\n"));
16923       printf (_("  %*s %*s Purpose\n"),
16924               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
16925       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16926       printf (_(" PLT lazy resolver\n"));
16927       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16928       printf (_(" Module pointer\n"));
16929       printf ("\n");
16930
16931       printf (_(" Entries:\n"));
16932       printf ("  %*s %*s %*s %-7s %3s %s\n",
16933               addr_size * 2, _("Address"),
16934               addr_size * 2, _("Initial"),
16935               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
16936       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
16937       for (i = 0; i < count; i++)
16938         {
16939           unsigned long idx = get_reloc_symindex (rels[i].r_info);
16940
16941           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16942           printf (" ");
16943
16944           if (idx >= num_dynamic_syms)
16945             printf (_("<corrupt symbol index: %lu>"), idx);
16946           else
16947             {
16948               Elf_Internal_Sym * psym = dynamic_symbols + idx;
16949
16950               print_vma (psym->st_value, LONG_HEX);
16951               printf (" %-7s %3s ",
16952                       get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16953                       get_symbol_index_type (filedata, psym->st_shndx));
16954               if (VALID_DYNAMIC_NAME (psym->st_name))
16955                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16956               else
16957                 printf (_("<corrupt: %14ld>"), psym->st_name);
16958             }
16959           printf ("\n");
16960         }
16961       printf ("\n");
16962
16963       if (data)
16964         free (data);
16965       free (rels);
16966     }
16967
16968   return res;
16969 }
16970
16971 static bfd_boolean
16972 process_nds32_specific (Filedata * filedata)
16973 {
16974   Elf_Internal_Shdr *sect = NULL;
16975
16976   sect = find_section (filedata, ".nds32_e_flags");
16977   if (sect != NULL)
16978     {
16979       unsigned int *flag;
16980
16981       printf ("\nNDS32 elf flags section:\n");
16982       flag = get_data (NULL, filedata, sect->sh_offset, 1,
16983                        sect->sh_size, _("NDS32 elf flags section"));
16984
16985       if (! flag)
16986         return FALSE;
16987
16988       switch ((*flag) & 0x3)
16989         {
16990         case 0:
16991           printf ("(VEC_SIZE):\tNo entry.\n");
16992           break;
16993         case 1:
16994           printf ("(VEC_SIZE):\t4 bytes\n");
16995           break;
16996         case 2:
16997           printf ("(VEC_SIZE):\t16 bytes\n");
16998           break;
16999         case 3:
17000           printf ("(VEC_SIZE):\treserved\n");
17001           break;
17002         }
17003     }
17004
17005   return TRUE;
17006 }
17007
17008 static bfd_boolean
17009 process_gnu_liblist (Filedata * filedata)
17010 {
17011   Elf_Internal_Shdr * section;
17012   Elf_Internal_Shdr * string_sec;
17013   Elf32_External_Lib * elib;
17014   char * strtab;
17015   size_t strtab_size;
17016   size_t cnt;
17017   unsigned long num_liblist;
17018   unsigned i;
17019   bfd_boolean res = TRUE;
17020
17021   if (! do_arch)
17022     return TRUE;
17023
17024   for (i = 0, section = filedata->section_headers;
17025        i < filedata->file_header.e_shnum;
17026        i++, section++)
17027     {
17028       switch (section->sh_type)
17029         {
17030         case SHT_GNU_LIBLIST:
17031           if (section->sh_link >= filedata->file_header.e_shnum)
17032             break;
17033
17034           elib = (Elf32_External_Lib *)
17035               get_data (NULL, filedata, section->sh_offset, 1, section->sh_size,
17036                         _("liblist section data"));
17037
17038           if (elib == NULL)
17039             {
17040               res = FALSE;
17041               break;
17042             }
17043
17044           string_sec = filedata->section_headers + section->sh_link;
17045           strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
17046                                       string_sec->sh_size,
17047                                       _("liblist string table"));
17048           if (strtab == NULL
17049               || section->sh_entsize != sizeof (Elf32_External_Lib))
17050             {
17051               free (elib);
17052               free (strtab);
17053               res = FALSE;
17054               break;
17055             }
17056           strtab_size = string_sec->sh_size;
17057
17058           num_liblist = section->sh_size / sizeof (Elf32_External_Lib);
17059           printf (ngettext ("\nLibrary list section '%s' contains %lu entries:\n",
17060                             "\nLibrary list section '%s' contains %lu entries:\n",
17061                             num_liblist),
17062                   printable_section_name (filedata, section),
17063                   num_liblist);
17064
17065           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
17066
17067           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
17068                ++cnt)
17069             {
17070               Elf32_Lib liblist;
17071               time_t atime;
17072               char timebuf[128];
17073               struct tm * tmp;
17074
17075               liblist.l_name = BYTE_GET (elib[cnt].l_name);
17076               atime = BYTE_GET (elib[cnt].l_time_stamp);
17077               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
17078               liblist.l_version = BYTE_GET (elib[cnt].l_version);
17079               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
17080
17081               tmp = gmtime (&atime);
17082               snprintf (timebuf, sizeof (timebuf),
17083                         "%04u-%02u-%02uT%02u:%02u:%02u",
17084                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
17085                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
17086
17087               printf ("%3lu: ", (unsigned long) cnt);
17088               if (do_wide)
17089                 printf ("%-20s", liblist.l_name < strtab_size
17090                         ? strtab + liblist.l_name : _("<corrupt>"));
17091               else
17092                 printf ("%-20.20s", liblist.l_name < strtab_size
17093                         ? strtab + liblist.l_name : _("<corrupt>"));
17094               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
17095                       liblist.l_version, liblist.l_flags);
17096             }
17097
17098           free (elib);
17099           free (strtab);
17100         }
17101     }
17102
17103   return res;
17104 }
17105
17106 static const char *
17107 get_note_type (Filedata * filedata, unsigned e_type)
17108 {
17109   static char buff[64];
17110
17111   if (filedata->file_header.e_type == ET_CORE)
17112     switch (e_type)
17113       {
17114       case NT_AUXV:
17115         return _("NT_AUXV (auxiliary vector)");
17116       case NT_PRSTATUS:
17117         return _("NT_PRSTATUS (prstatus structure)");
17118       case NT_FPREGSET:
17119         return _("NT_FPREGSET (floating point registers)");
17120       case NT_PRPSINFO:
17121         return _("NT_PRPSINFO (prpsinfo structure)");
17122       case NT_TASKSTRUCT:
17123         return _("NT_TASKSTRUCT (task structure)");
17124       case NT_PRXFPREG:
17125         return _("NT_PRXFPREG (user_xfpregs structure)");
17126       case NT_PPC_VMX:
17127         return _("NT_PPC_VMX (ppc Altivec registers)");
17128       case NT_PPC_VSX:
17129         return _("NT_PPC_VSX (ppc VSX registers)");
17130       case NT_PPC_TAR:
17131         return _("NT_PPC_TAR (ppc TAR register)");
17132       case NT_PPC_PPR:
17133         return _("NT_PPC_PPR (ppc PPR register)");
17134       case NT_PPC_DSCR:
17135         return _("NT_PPC_DSCR (ppc DSCR register)");
17136       case NT_PPC_EBB:
17137         return _("NT_PPC_EBB (ppc EBB registers)");
17138       case NT_PPC_PMU:
17139         return _("NT_PPC_PMU (ppc PMU registers)");
17140       case NT_PPC_TM_CGPR:
17141         return _("NT_PPC_TM_CGPR (ppc checkpointed GPR registers)");
17142       case NT_PPC_TM_CFPR:
17143         return _("NT_PPC_TM_CFPR (ppc checkpointed floating point registers)");
17144       case NT_PPC_TM_CVMX:
17145         return _("NT_PPC_TM_CVMX (ppc checkpointed Altivec registers)");
17146       case NT_PPC_TM_CVSX:
17147         return _("NT_PPC_TM_CVSX (ppc checkpointed VSX registers)");
17148       case NT_PPC_TM_SPR:
17149         return _("NT_PPC_TM_SPR (ppc TM special purpose registers)");
17150       case NT_PPC_TM_CTAR:
17151         return _("NT_PPC_TM_CTAR (ppc checkpointed TAR register)");
17152       case NT_PPC_TM_CPPR:
17153         return _("NT_PPC_TM_CPPR (ppc checkpointed PPR register)");
17154       case NT_PPC_TM_CDSCR:
17155         return _("NT_PPC_TM_CDSCR (ppc checkpointed DSCR register)");
17156       case NT_386_TLS:
17157         return _("NT_386_TLS (x86 TLS information)");
17158       case NT_386_IOPERM:
17159         return _("NT_386_IOPERM (x86 I/O permissions)");
17160       case NT_X86_XSTATE:
17161         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
17162       case NT_S390_HIGH_GPRS:
17163         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
17164       case NT_S390_TIMER:
17165         return _("NT_S390_TIMER (s390 timer register)");
17166       case NT_S390_TODCMP:
17167         return _("NT_S390_TODCMP (s390 TOD comparator register)");
17168       case NT_S390_TODPREG:
17169         return _("NT_S390_TODPREG (s390 TOD programmable register)");
17170       case NT_S390_CTRS:
17171         return _("NT_S390_CTRS (s390 control registers)");
17172       case NT_S390_PREFIX:
17173         return _("NT_S390_PREFIX (s390 prefix register)");
17174       case NT_S390_LAST_BREAK:
17175         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
17176       case NT_S390_SYSTEM_CALL:
17177         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
17178       case NT_S390_TDB:
17179         return _("NT_S390_TDB (s390 transaction diagnostic block)");
17180       case NT_S390_VXRS_LOW:
17181         return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
17182       case NT_S390_VXRS_HIGH:
17183         return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
17184       case NT_S390_GS_CB:
17185         return _("NT_S390_GS_CB (s390 guarded-storage registers)");
17186       case NT_S390_GS_BC:
17187         return _("NT_S390_GS_BC (s390 guarded-storage broadcast control)");
17188       case NT_ARM_VFP:
17189         return _("NT_ARM_VFP (arm VFP registers)");
17190       case NT_ARM_TLS:
17191         return _("NT_ARM_TLS (AArch TLS registers)");
17192       case NT_ARM_HW_BREAK:
17193         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
17194       case NT_ARM_HW_WATCH:
17195         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
17196       case NT_PSTATUS:
17197         return _("NT_PSTATUS (pstatus structure)");
17198       case NT_FPREGS:
17199         return _("NT_FPREGS (floating point registers)");
17200       case NT_PSINFO:
17201         return _("NT_PSINFO (psinfo structure)");
17202       case NT_LWPSTATUS:
17203         return _("NT_LWPSTATUS (lwpstatus_t structure)");
17204       case NT_LWPSINFO:
17205         return _("NT_LWPSINFO (lwpsinfo_t structure)");
17206       case NT_WIN32PSTATUS:
17207         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
17208       case NT_SIGINFO:
17209         return _("NT_SIGINFO (siginfo_t data)");
17210       case NT_FILE:
17211         return _("NT_FILE (mapped files)");
17212       default:
17213         break;
17214       }
17215   else
17216     switch (e_type)
17217       {
17218       case NT_VERSION:
17219         return _("NT_VERSION (version)");
17220       case NT_ARCH:
17221         return _("NT_ARCH (architecture)");
17222       case NT_GNU_BUILD_ATTRIBUTE_OPEN:
17223         return _("OPEN");
17224       case NT_GNU_BUILD_ATTRIBUTE_FUNC:
17225         return _("func");
17226       default:
17227         break;
17228       }
17229
17230   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17231   return buff;
17232 }
17233
17234 static bfd_boolean
17235 print_core_note (Elf_Internal_Note *pnote)
17236 {
17237   unsigned int addr_size = is_32bit_elf ? 4 : 8;
17238   bfd_vma count, page_size;
17239   unsigned char *descdata, *filenames, *descend;
17240
17241   if (pnote->type != NT_FILE)
17242     {
17243       if (do_wide)
17244         printf ("\n");
17245       return TRUE;
17246     }
17247
17248 #ifndef BFD64
17249   if (!is_32bit_elf)
17250     {
17251       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
17252       /* Still "successful".  */
17253       return TRUE;
17254     }
17255 #endif
17256
17257   if (pnote->descsz < 2 * addr_size)
17258     {
17259       error (_("    Malformed note - too short for header\n"));
17260       return FALSE;
17261     }
17262
17263   descdata = (unsigned char *) pnote->descdata;
17264   descend = descdata + pnote->descsz;
17265
17266   if (descdata[pnote->descsz - 1] != '\0')
17267     {
17268       error (_("    Malformed note - does not end with \\0\n"));
17269       return FALSE;
17270     }
17271
17272   count = byte_get (descdata, addr_size);
17273   descdata += addr_size;
17274
17275   page_size = byte_get (descdata, addr_size);
17276   descdata += addr_size;
17277
17278   if (count > ((bfd_vma) -1 - 2 * addr_size) / (3 * addr_size)
17279       || pnote->descsz < 2 * addr_size + count * 3 * addr_size)
17280     {
17281       error (_("    Malformed note - too short for supplied file count\n"));
17282       return FALSE;
17283     }
17284
17285   printf (_("    Page size: "));
17286   print_vma (page_size, DEC);
17287   printf ("\n");
17288
17289   printf (_("    %*s%*s%*s\n"),
17290           (int) (2 + 2 * addr_size), _("Start"),
17291           (int) (4 + 2 * addr_size), _("End"),
17292           (int) (4 + 2 * addr_size), _("Page Offset"));
17293   filenames = descdata + count * 3 * addr_size;
17294   while (count-- > 0)
17295     {
17296       bfd_vma start, end, file_ofs;
17297
17298       if (filenames == descend)
17299         {
17300           error (_("    Malformed note - filenames end too early\n"));
17301           return FALSE;
17302         }
17303
17304       start = byte_get (descdata, addr_size);
17305       descdata += addr_size;
17306       end = byte_get (descdata, addr_size);
17307       descdata += addr_size;
17308       file_ofs = byte_get (descdata, addr_size);
17309       descdata += addr_size;
17310
17311       printf ("    ");
17312       print_vma (start, FULL_HEX);
17313       printf ("  ");
17314       print_vma (end, FULL_HEX);
17315       printf ("  ");
17316       print_vma (file_ofs, FULL_HEX);
17317       printf ("\n        %s\n", filenames);
17318
17319       filenames += 1 + strlen ((char *) filenames);
17320     }
17321
17322   return TRUE;
17323 }
17324
17325 static const char *
17326 get_gnu_elf_note_type (unsigned e_type)
17327 {
17328   /* NB/ Keep this switch statement in sync with print_gnu_note ().  */
17329   switch (e_type)
17330     {
17331     case NT_GNU_ABI_TAG:
17332       return _("NT_GNU_ABI_TAG (ABI version tag)");
17333     case NT_GNU_HWCAP:
17334       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
17335     case NT_GNU_BUILD_ID:
17336       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
17337     case NT_GNU_GOLD_VERSION:
17338       return _("NT_GNU_GOLD_VERSION (gold version)");
17339     case NT_GNU_PROPERTY_TYPE_0:
17340       return _("NT_GNU_PROPERTY_TYPE_0");
17341     case NT_GNU_BUILD_ATTRIBUTE_OPEN:
17342       return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
17343     case NT_GNU_BUILD_ATTRIBUTE_FUNC:
17344       return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
17345     default:
17346       {
17347         static char buff[64];
17348
17349         snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17350         return buff;
17351       }
17352     }
17353 }
17354
17355 static void
17356 decode_x86_compat_isa (unsigned int bitmask)
17357 {
17358   while (bitmask)
17359     {
17360       unsigned int bit = bitmask & (- bitmask);
17361
17362       bitmask &= ~ bit;
17363       switch (bit)
17364         {
17365         case GNU_PROPERTY_X86_COMPAT_ISA_1_486:
17366           printf ("i486");
17367           break;
17368         case GNU_PROPERTY_X86_COMPAT_ISA_1_586:
17369           printf ("586");
17370           break;
17371         case GNU_PROPERTY_X86_COMPAT_ISA_1_686:
17372           printf ("686");
17373           break;
17374         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE:
17375           printf ("SSE");
17376           break;
17377         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE2:
17378           printf ("SSE2");
17379           break;
17380         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE3:
17381           printf ("SSE3");
17382           break;
17383         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSSE3:
17384           printf ("SSSE3");
17385           break;
17386         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_1:
17387           printf ("SSE4_1");
17388           break;
17389         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_2:
17390           printf ("SSE4_2");
17391           break;
17392         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX:
17393           printf ("AVX");
17394           break;
17395         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX2:
17396           printf ("AVX2");
17397           break;
17398         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512F:
17399           printf ("AVX512F");
17400           break;
17401         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512CD:
17402           printf ("AVX512CD");
17403           break;
17404         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512ER:
17405           printf ("AVX512ER");
17406           break;
17407         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512PF:
17408           printf ("AVX512PF");
17409           break;
17410         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512VL:
17411           printf ("AVX512VL");
17412           break;
17413         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512DQ:
17414           printf ("AVX512DQ");
17415           break;
17416         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512BW:
17417           printf ("AVX512BW");
17418           break;
17419         default:
17420           printf (_("<unknown: %x>"), bit);
17421           break;
17422         }
17423       if (bitmask)
17424         printf (", ");
17425     }
17426 }
17427
17428 static void
17429 decode_x86_isa (unsigned int bitmask)
17430 {
17431   if (!bitmask)
17432     {
17433       printf (_("<None>"));
17434       return;
17435     }
17436
17437   while (bitmask)
17438     {
17439       unsigned int bit = bitmask & (- bitmask);
17440
17441       bitmask &= ~ bit;
17442       switch (bit)
17443         {
17444         case GNU_PROPERTY_X86_ISA_1_CMOV:
17445           printf ("CMOV");
17446           break;
17447         case GNU_PROPERTY_X86_ISA_1_SSE:
17448           printf ("SSE");
17449           break;
17450         case GNU_PROPERTY_X86_ISA_1_SSE2:
17451           printf ("SSE2");
17452           break;
17453         case GNU_PROPERTY_X86_ISA_1_SSE3:
17454           printf ("SSE3");
17455           break;
17456         case GNU_PROPERTY_X86_ISA_1_SSSE3:
17457           printf ("SSSE3");
17458           break;
17459         case GNU_PROPERTY_X86_ISA_1_SSE4_1:
17460           printf ("SSE4_1");
17461           break;
17462         case GNU_PROPERTY_X86_ISA_1_SSE4_2:
17463           printf ("SSE4_2");
17464           break;
17465         case GNU_PROPERTY_X86_ISA_1_AVX:
17466           printf ("AVX");
17467           break;
17468         case GNU_PROPERTY_X86_ISA_1_AVX2:
17469           printf ("AVX2");
17470           break;
17471         case GNU_PROPERTY_X86_ISA_1_FMA:
17472           printf ("FMA");
17473           break;
17474         case GNU_PROPERTY_X86_ISA_1_AVX512F:
17475           printf ("AVX512F");
17476           break;
17477         case GNU_PROPERTY_X86_ISA_1_AVX512CD:
17478           printf ("AVX512CD");
17479           break;
17480         case GNU_PROPERTY_X86_ISA_1_AVX512ER:
17481           printf ("AVX512ER");
17482           break;
17483         case GNU_PROPERTY_X86_ISA_1_AVX512PF:
17484           printf ("AVX512PF");
17485           break;
17486         case GNU_PROPERTY_X86_ISA_1_AVX512VL:
17487           printf ("AVX512VL");
17488           break;
17489         case GNU_PROPERTY_X86_ISA_1_AVX512DQ:
17490           printf ("AVX512DQ");
17491           break;
17492         case GNU_PROPERTY_X86_ISA_1_AVX512BW:
17493           printf ("AVX512BW");
17494           break;
17495         case GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS:
17496           printf ("AVX512_4FMAPS");
17497           break;
17498         case GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW:
17499           printf ("AVX512_4VNNIW");
17500           break;
17501         case GNU_PROPERTY_X86_ISA_1_AVX512_BITALG:
17502           printf ("AVX512_BITALG");
17503           break;
17504         case GNU_PROPERTY_X86_ISA_1_AVX512_IFMA:
17505           printf ("AVX512_IFMA");
17506           break;
17507         case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI:
17508           printf ("AVX512_VBMI");
17509           break;
17510         case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2:
17511           printf ("AVX512_VBMI2");
17512           break;
17513         case GNU_PROPERTY_X86_ISA_1_AVX512_VNNI:
17514           printf ("AVX512_VNNI");
17515           break;
17516         case GNU_PROPERTY_X86_ISA_1_AVX512_BF16:
17517           printf ("AVX512_BF16");
17518           break;
17519         default:
17520           printf (_("<unknown: %x>"), bit);
17521           break;
17522         }
17523       if (bitmask)
17524         printf (", ");
17525     }
17526 }
17527
17528 static void
17529 decode_x86_feature_1 (unsigned int bitmask)
17530 {
17531   if (!bitmask)
17532     {
17533       printf (_("<None>"));
17534       return;
17535     }
17536
17537   while (bitmask)
17538     {
17539       unsigned int bit = bitmask & (- bitmask);
17540
17541       bitmask &= ~ bit;
17542       switch (bit)
17543         {
17544         case GNU_PROPERTY_X86_FEATURE_1_IBT:
17545           printf ("IBT");
17546           break;
17547         case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
17548           printf ("SHSTK");
17549           break;
17550         default:
17551           printf (_("<unknown: %x>"), bit);
17552           break;
17553         }
17554       if (bitmask)
17555         printf (", ");
17556     }
17557 }
17558
17559 static void
17560 decode_x86_feature_2 (unsigned int bitmask)
17561 {
17562   if (!bitmask)
17563     {
17564       printf (_("<None>"));
17565       return;
17566     }
17567
17568   while (bitmask)
17569     {
17570       unsigned int bit = bitmask & (- bitmask);
17571
17572       bitmask &= ~ bit;
17573       switch (bit)
17574         {
17575         case GNU_PROPERTY_X86_FEATURE_2_X86:
17576           printf ("x86");
17577           break;
17578         case GNU_PROPERTY_X86_FEATURE_2_X87:
17579           printf ("x87");
17580           break;
17581         case GNU_PROPERTY_X86_FEATURE_2_MMX:
17582           printf ("MMX");
17583           break;
17584         case GNU_PROPERTY_X86_FEATURE_2_XMM:
17585           printf ("XMM");
17586           break;
17587         case GNU_PROPERTY_X86_FEATURE_2_YMM:
17588           printf ("YMM");
17589           break;
17590         case GNU_PROPERTY_X86_FEATURE_2_ZMM:
17591           printf ("ZMM");
17592           break;
17593         case GNU_PROPERTY_X86_FEATURE_2_FXSR:
17594           printf ("FXSR");
17595           break;
17596         case GNU_PROPERTY_X86_FEATURE_2_XSAVE:
17597           printf ("XSAVE");
17598           break;
17599         case GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT:
17600           printf ("XSAVEOPT");
17601           break;
17602         case GNU_PROPERTY_X86_FEATURE_2_XSAVEC:
17603           printf ("XSAVEC");
17604           break;
17605         default:
17606           printf (_("<unknown: %x>"), bit);
17607           break;
17608         }
17609       if (bitmask)
17610         printf (", ");
17611     }
17612 }
17613
17614 static void
17615 decode_aarch64_feature_1_and (unsigned int bitmask)
17616 {
17617   while (bitmask)
17618     {
17619       unsigned int bit = bitmask & (- bitmask);
17620
17621       bitmask &= ~ bit;
17622       switch (bit)
17623         {
17624         case GNU_PROPERTY_AARCH64_FEATURE_1_BTI:
17625           printf ("BTI");
17626           break;
17627
17628         case GNU_PROPERTY_AARCH64_FEATURE_1_PAC:
17629           printf ("PAC");
17630           break;
17631
17632         default:
17633           printf (_("<unknown: %x>"), bit);
17634           break;
17635         }
17636       if (bitmask)
17637         printf (", ");
17638     }
17639 }
17640
17641 static void
17642 print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
17643 {
17644   unsigned char * ptr = (unsigned char *) pnote->descdata;
17645   unsigned char * ptr_end = ptr + pnote->descsz;
17646   unsigned int    size = is_32bit_elf ? 4 : 8;
17647
17648   printf (_("      Properties: "));
17649
17650   if (pnote->descsz < 8 || (pnote->descsz % size) != 0)
17651     {
17652       printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz);
17653       return;
17654     }
17655
17656   while (ptr < ptr_end)
17657     {
17658       unsigned int j;
17659       unsigned int type;
17660       unsigned int datasz;
17661
17662       if ((size_t) (ptr_end - ptr) < 8)
17663         {
17664           printf (_("<corrupt descsz: %#lx>\n"), pnote->descsz);
17665           break;
17666         }
17667
17668       type = byte_get (ptr, 4);
17669       datasz = byte_get (ptr + 4, 4);
17670
17671       ptr += 8;
17672
17673       if (datasz > (size_t) (ptr_end - ptr))
17674         {
17675           printf (_("<corrupt type (%#x) datasz: %#x>\n"),
17676                   type, datasz);
17677           break;
17678         }
17679
17680       if (type >= GNU_PROPERTY_LOPROC && type <= GNU_PROPERTY_HIPROC)
17681         {
17682           if (filedata->file_header.e_machine == EM_X86_64
17683               || filedata->file_header.e_machine == EM_IAMCU
17684               || filedata->file_header.e_machine == EM_386)
17685             {
17686               unsigned int bitmask;
17687
17688               if (datasz == 4)
17689                 bitmask = byte_get (ptr, 4);
17690               else
17691                 bitmask = 0;
17692
17693               switch (type)
17694                 {
17695                 case GNU_PROPERTY_X86_ISA_1_USED:
17696                   if (datasz != 4)
17697                     printf (_("x86 ISA used: <corrupt length: %#x> "),
17698                             datasz);
17699                   else
17700                     {
17701                       printf ("x86 ISA used: ");
17702                       decode_x86_isa (bitmask);
17703                     }
17704                   goto next;
17705
17706                 case GNU_PROPERTY_X86_ISA_1_NEEDED:
17707                   if (datasz != 4)
17708                     printf (_("x86 ISA needed: <corrupt length: %#x> "),
17709                             datasz);
17710                   else
17711                     {
17712                       printf ("x86 ISA needed: ");
17713                       decode_x86_isa (bitmask);
17714                     }
17715                   goto next;
17716
17717                 case GNU_PROPERTY_X86_FEATURE_1_AND:
17718                   if (datasz != 4)
17719                     printf (_("x86 feature: <corrupt length: %#x> "),
17720                             datasz);
17721                   else
17722                     {
17723                       printf ("x86 feature: ");
17724                       decode_x86_feature_1 (bitmask);
17725                     }
17726                   goto next;
17727
17728                 case GNU_PROPERTY_X86_FEATURE_2_USED:
17729                   if (datasz != 4)
17730                     printf (_("x86 feature used: <corrupt length: %#x> "),
17731                             datasz);
17732                   else
17733                     {
17734                       printf ("x86 feature used: ");
17735                       decode_x86_feature_2 (bitmask);
17736                     }
17737                   goto next;
17738
17739                 case GNU_PROPERTY_X86_FEATURE_2_NEEDED:
17740                   if (datasz != 4)
17741                     printf (_("x86 feature needed: <corrupt length: %#x> "), datasz);
17742                   else
17743                     {
17744                       printf ("x86 feature needed: ");
17745                       decode_x86_feature_2 (bitmask);
17746                     }
17747                   goto next;
17748
17749                 case GNU_PROPERTY_X86_COMPAT_ISA_1_USED:
17750                   if (datasz != 4)
17751                     printf (_("x86 ISA used: <corrupt length: %#x> "),
17752                             datasz);
17753                   else
17754                     {
17755                       printf ("x86 ISA used: ");
17756                       decode_x86_compat_isa (bitmask);
17757                     }
17758                   goto next;
17759
17760                 case GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED:
17761                   if (datasz != 4)
17762                     printf (_("x86 ISA needed: <corrupt length: %#x> "),
17763                             datasz);
17764                   else
17765                     {
17766                       printf ("x86 ISA needed: ");
17767                       decode_x86_compat_isa (bitmask);
17768                     }
17769                   goto next;
17770
17771                 default:
17772                   break;
17773                 }
17774             }
17775           else if (filedata->file_header.e_machine == EM_AARCH64)
17776             {
17777               if (type == GNU_PROPERTY_AARCH64_FEATURE_1_AND)
17778                 {
17779                   printf ("AArch64 feature: ");
17780                   if (datasz != 4)
17781                     printf (_("<corrupt length: %#x> "), datasz);
17782                   else
17783                     decode_aarch64_feature_1_and (byte_get (ptr, 4));
17784                   goto next;
17785                 }
17786             }
17787         }
17788       else
17789         {
17790           switch (type)
17791             {
17792             case GNU_PROPERTY_STACK_SIZE:
17793               printf (_("stack size: "));
17794               if (datasz != size)
17795                 printf (_("<corrupt length: %#x> "), datasz);
17796               else
17797                 printf ("%#lx", (unsigned long) byte_get (ptr, size));
17798               goto next;
17799
17800             case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
17801               printf ("no copy on protected ");
17802               if (datasz)
17803                 printf (_("<corrupt length: %#x> "), datasz);
17804               goto next;
17805
17806             default:
17807               break;
17808             }
17809         }
17810
17811       if (type < GNU_PROPERTY_LOPROC)
17812         printf (_("<unknown type %#x data: "), type);
17813       else if (type < GNU_PROPERTY_LOUSER)
17814         printf (_("<procesor-specific type %#x data: "), type);
17815       else
17816         printf (_("<application-specific type %#x data: "), type);
17817       for (j = 0; j < datasz; ++j)
17818         printf ("%02x ", ptr[j] & 0xff);
17819       printf (">");
17820
17821 next:
17822       ptr += ((datasz + (size - 1)) & ~ (size - 1));
17823       if (ptr == ptr_end)
17824         break;
17825
17826       if (do_wide)
17827         printf (", ");
17828       else
17829         printf ("\n\t");
17830     }
17831
17832   printf ("\n");
17833 }
17834
17835 static bfd_boolean
17836 print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
17837 {
17838   /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type ().  */
17839   switch (pnote->type)
17840     {
17841     case NT_GNU_BUILD_ID:
17842       {
17843         unsigned long i;
17844
17845         printf (_("    Build ID: "));
17846         for (i = 0; i < pnote->descsz; ++i)
17847           printf ("%02x", pnote->descdata[i] & 0xff);
17848         printf ("\n");
17849       }
17850       break;
17851
17852     case NT_GNU_ABI_TAG:
17853       {
17854         unsigned long os, major, minor, subminor;
17855         const char *osname;
17856
17857         /* PR 17531: file: 030-599401-0.004.  */
17858         if (pnote->descsz < 16)
17859           {
17860             printf (_("    <corrupt GNU_ABI_TAG>\n"));
17861             break;
17862           }
17863
17864         os = byte_get ((unsigned char *) pnote->descdata, 4);
17865         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17866         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
17867         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
17868
17869         switch (os)
17870           {
17871           case GNU_ABI_TAG_LINUX:
17872             osname = "Linux";
17873             break;
17874           case GNU_ABI_TAG_HURD:
17875             osname = "Hurd";
17876             break;
17877           case GNU_ABI_TAG_SOLARIS:
17878             osname = "Solaris";
17879             break;
17880           case GNU_ABI_TAG_FREEBSD:
17881             osname = "FreeBSD";
17882             break;
17883           case GNU_ABI_TAG_NETBSD:
17884             osname = "NetBSD";
17885             break;
17886           case GNU_ABI_TAG_SYLLABLE:
17887             osname = "Syllable";
17888             break;
17889           case GNU_ABI_TAG_NACL:
17890             osname = "NaCl";
17891             break;
17892           default:
17893             osname = "Unknown";
17894             break;
17895           }
17896
17897         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
17898                 major, minor, subminor);
17899       }
17900       break;
17901
17902     case NT_GNU_GOLD_VERSION:
17903       {
17904         unsigned long i;
17905
17906         printf (_("    Version: "));
17907         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
17908           printf ("%c", pnote->descdata[i]);
17909         printf ("\n");
17910       }
17911       break;
17912
17913     case NT_GNU_HWCAP:
17914       {
17915         unsigned long num_entries, mask;
17916
17917         /* Hardware capabilities information.  Word 0 is the number of entries.
17918            Word 1 is a bitmask of enabled entries.  The rest of the descriptor
17919            is a series of entries, where each entry is a single byte followed
17920            by a nul terminated string.  The byte gives the bit number to test
17921            if enabled in the bitmask.  */
17922         printf (_("      Hardware Capabilities: "));
17923         if (pnote->descsz < 8)
17924           {
17925             error (_("<corrupt GNU_HWCAP>\n"));
17926             return FALSE;
17927           }
17928         num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
17929         mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17930         printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
17931         /* FIXME: Add code to display the entries... */
17932       }
17933       break;
17934
17935     case NT_GNU_PROPERTY_TYPE_0:
17936       print_gnu_property_note (filedata, pnote);
17937       break;
17938       
17939     default:
17940       /* Handle unrecognised types.  An error message should have already been
17941          created by get_gnu_elf_note_type(), so all that we need to do is to
17942          display the data.  */
17943       {
17944         unsigned long i;
17945
17946         printf (_("    Description data: "));
17947         for (i = 0; i < pnote->descsz; ++i)
17948           printf ("%02x ", pnote->descdata[i] & 0xff);
17949         printf ("\n");
17950       }
17951       break;
17952     }
17953
17954   return TRUE;
17955 }
17956
17957 static const char *
17958 get_v850_elf_note_type (enum v850_notes n_type)
17959 {
17960   static char buff[64];
17961
17962   switch (n_type)
17963     {
17964     case V850_NOTE_ALIGNMENT:  return _("Alignment of 8-byte objects");
17965     case V850_NOTE_DATA_SIZE:  return _("Sizeof double and long double");
17966     case V850_NOTE_FPU_INFO:   return _("Type of FPU support needed");
17967     case V850_NOTE_SIMD_INFO:  return _("Use of SIMD instructions");
17968     case V850_NOTE_CACHE_INFO: return _("Use of cache");
17969     case V850_NOTE_MMU_INFO:   return _("Use of MMU");
17970     default:
17971       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
17972       return buff;
17973     }
17974 }
17975
17976 static bfd_boolean
17977 print_v850_note (Elf_Internal_Note * pnote)
17978 {
17979   unsigned int val;
17980
17981   if (pnote->descsz != 4)
17982     return FALSE;
17983
17984   val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
17985
17986   if (val == 0)
17987     {
17988       printf (_("not set\n"));
17989       return TRUE;
17990     }
17991
17992   switch (pnote->type)
17993     {
17994     case V850_NOTE_ALIGNMENT:
17995       switch (val)
17996         {
17997         case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return TRUE;
17998         case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return TRUE;
17999         }
18000       break;
18001
18002     case V850_NOTE_DATA_SIZE:
18003       switch (val)
18004         {
18005         case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return TRUE;
18006         case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return TRUE;
18007         }
18008       break;
18009
18010     case V850_NOTE_FPU_INFO:
18011       switch (val)
18012         {
18013         case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return TRUE;
18014         case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return TRUE;
18015         }
18016       break;
18017
18018     case V850_NOTE_MMU_INFO:
18019     case V850_NOTE_CACHE_INFO:
18020     case V850_NOTE_SIMD_INFO:
18021       if (val == EF_RH850_SIMD)
18022         {
18023           printf (_("yes\n"));
18024           return TRUE;
18025         }
18026       break;
18027
18028     default:
18029       /* An 'unknown note type' message will already have been displayed.  */
18030       break;
18031     }
18032
18033   printf (_("unknown value: %x\n"), val);
18034   return FALSE;
18035 }
18036
18037 static bfd_boolean
18038 process_netbsd_elf_note (Elf_Internal_Note * pnote)
18039 {
18040   unsigned int version;
18041
18042   switch (pnote->type)
18043     {
18044     case NT_NETBSD_IDENT:
18045       version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
18046       if ((version / 10000) % 100)
18047         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
18048                 version, version / 100000000, (version / 1000000) % 100,
18049                 (version / 10000) % 100 > 26 ? "Z" : "",
18050                 'A' + (version / 10000) % 26);
18051       else
18052         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
18053                 version, version / 100000000, (version / 1000000) % 100,
18054                 (version / 100) % 100);
18055       return TRUE;
18056
18057     case NT_NETBSD_MARCH:
18058       printf ("  NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
18059               pnote->descdata);
18060       return TRUE;
18061
18062     default:
18063       printf ("  NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
18064               pnote->type);
18065       return FALSE;
18066     }
18067 }
18068
18069 static const char *
18070 get_freebsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
18071 {
18072   switch (e_type)
18073     {
18074     case NT_FREEBSD_THRMISC:
18075       return _("NT_THRMISC (thrmisc structure)");
18076     case NT_FREEBSD_PROCSTAT_PROC:
18077       return _("NT_PROCSTAT_PROC (proc data)");
18078     case NT_FREEBSD_PROCSTAT_FILES:
18079       return _("NT_PROCSTAT_FILES (files data)");
18080     case NT_FREEBSD_PROCSTAT_VMMAP:
18081       return _("NT_PROCSTAT_VMMAP (vmmap data)");
18082     case NT_FREEBSD_PROCSTAT_GROUPS:
18083       return _("NT_PROCSTAT_GROUPS (groups data)");
18084     case NT_FREEBSD_PROCSTAT_UMASK:
18085       return _("NT_PROCSTAT_UMASK (umask data)");
18086     case NT_FREEBSD_PROCSTAT_RLIMIT:
18087       return _("NT_PROCSTAT_RLIMIT (rlimit data)");
18088     case NT_FREEBSD_PROCSTAT_OSREL:
18089       return _("NT_PROCSTAT_OSREL (osreldate data)");
18090     case NT_FREEBSD_PROCSTAT_PSSTRINGS:
18091       return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
18092     case NT_FREEBSD_PROCSTAT_AUXV:
18093       return _("NT_PROCSTAT_AUXV (auxv data)");
18094     case NT_FREEBSD_PTLWPINFO:
18095       return _("NT_PTLWPINFO (ptrace_lwpinfo structure)");
18096     }
18097   return get_note_type (filedata, e_type);
18098 }
18099
18100 static const char *
18101 get_netbsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
18102 {
18103   static char buff[64];
18104
18105   if (e_type == NT_NETBSDCORE_PROCINFO)
18106     return _("NetBSD procinfo structure");
18107
18108   /* As of Jan 2002 there are no other machine-independent notes
18109      defined for NetBSD core files.  If the note type is less
18110      than the start of the machine-dependent note types, we don't
18111      understand it.  */
18112
18113   if (e_type < NT_NETBSDCORE_FIRSTMACH)
18114     {
18115       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
18116       return buff;
18117     }
18118
18119   switch (filedata->file_header.e_machine)
18120     {
18121     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
18122        and PT_GETFPREGS == mach+2.  */
18123
18124     case EM_OLD_ALPHA:
18125     case EM_ALPHA:
18126     case EM_SPARC:
18127     case EM_SPARC32PLUS:
18128     case EM_SPARCV9:
18129       switch (e_type)
18130         {
18131         case NT_NETBSDCORE_FIRSTMACH + 0:
18132           return _("PT_GETREGS (reg structure)");
18133         case NT_NETBSDCORE_FIRSTMACH + 2:
18134           return _("PT_GETFPREGS (fpreg structure)");
18135         default:
18136           break;
18137         }
18138       break;
18139
18140     /* On all other arch's, PT_GETREGS == mach+1 and
18141        PT_GETFPREGS == mach+3.  */
18142     default:
18143       switch (e_type)
18144         {
18145         case NT_NETBSDCORE_FIRSTMACH + 1:
18146           return _("PT_GETREGS (reg structure)");
18147         case NT_NETBSDCORE_FIRSTMACH + 3:
18148           return _("PT_GETFPREGS (fpreg structure)");
18149         default:
18150           break;
18151         }
18152     }
18153
18154   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
18155             e_type - NT_NETBSDCORE_FIRSTMACH);
18156   return buff;
18157 }
18158
18159 static const char *
18160 get_stapsdt_note_type (unsigned e_type)
18161 {
18162   static char buff[64];
18163
18164   switch (e_type)
18165     {
18166     case NT_STAPSDT:
18167       return _("NT_STAPSDT (SystemTap probe descriptors)");
18168
18169     default:
18170       break;
18171     }
18172
18173   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
18174   return buff;
18175 }
18176
18177 static bfd_boolean
18178 print_stapsdt_note (Elf_Internal_Note *pnote)
18179 {
18180   size_t len, maxlen;
18181   unsigned long addr_size = is_32bit_elf ? 4 : 8;
18182   char *data = pnote->descdata;
18183   char *data_end = pnote->descdata + pnote->descsz;
18184   bfd_vma pc, base_addr, semaphore;
18185   char *provider, *probe, *arg_fmt;
18186
18187   if (pnote->descsz < (addr_size * 3))
18188     goto stapdt_note_too_small;
18189
18190   pc = byte_get ((unsigned char *) data, addr_size);
18191   data += addr_size;
18192
18193   base_addr = byte_get ((unsigned char *) data, addr_size);
18194   data += addr_size;
18195
18196   semaphore = byte_get ((unsigned char *) data, addr_size);
18197   data += addr_size;
18198
18199   if (data >= data_end)
18200     goto stapdt_note_too_small;
18201   maxlen = data_end - data;
18202   len = strnlen (data, maxlen);
18203   if (len < maxlen)
18204     {
18205       provider = data;
18206       data += len + 1;
18207     }
18208   else
18209     goto stapdt_note_too_small;
18210
18211   if (data >= data_end)
18212     goto stapdt_note_too_small;
18213   maxlen = data_end - data;
18214   len = strnlen (data, maxlen);
18215   if (len < maxlen)
18216     {
18217       probe = data;
18218       data += len + 1;
18219     }
18220   else
18221     goto stapdt_note_too_small;
18222   
18223   if (data >= data_end)
18224     goto stapdt_note_too_small;
18225   maxlen = data_end - data;
18226   len = strnlen (data, maxlen);
18227   if (len < maxlen)
18228     {
18229       arg_fmt = data;
18230       data += len + 1;
18231     }
18232   else
18233     goto stapdt_note_too_small;
18234
18235   printf (_("    Provider: %s\n"), provider);
18236   printf (_("    Name: %s\n"), probe);
18237   printf (_("    Location: "));
18238   print_vma (pc, FULL_HEX);
18239   printf (_(", Base: "));
18240   print_vma (base_addr, FULL_HEX);
18241   printf (_(", Semaphore: "));
18242   print_vma (semaphore, FULL_HEX);
18243   printf ("\n");
18244   printf (_("    Arguments: %s\n"), arg_fmt);
18245
18246   return data == data_end;
18247
18248  stapdt_note_too_small:
18249   printf (_("  <corrupt - note is too small>\n"));
18250   error (_("corrupt stapdt note - the data size is too small\n"));
18251   return FALSE;
18252 }
18253
18254 static const char *
18255 get_ia64_vms_note_type (unsigned e_type)
18256 {
18257   static char buff[64];
18258
18259   switch (e_type)
18260     {
18261     case NT_VMS_MHD:
18262       return _("NT_VMS_MHD (module header)");
18263     case NT_VMS_LNM:
18264       return _("NT_VMS_LNM (language name)");
18265     case NT_VMS_SRC:
18266       return _("NT_VMS_SRC (source files)");
18267     case NT_VMS_TITLE:
18268       return "NT_VMS_TITLE";
18269     case NT_VMS_EIDC:
18270       return _("NT_VMS_EIDC (consistency check)");
18271     case NT_VMS_FPMODE:
18272       return _("NT_VMS_FPMODE (FP mode)");
18273     case NT_VMS_LINKTIME:
18274       return "NT_VMS_LINKTIME";
18275     case NT_VMS_IMGNAM:
18276       return _("NT_VMS_IMGNAM (image name)");
18277     case NT_VMS_IMGID:
18278       return _("NT_VMS_IMGID (image id)");
18279     case NT_VMS_LINKID:
18280       return _("NT_VMS_LINKID (link id)");
18281     case NT_VMS_IMGBID:
18282       return _("NT_VMS_IMGBID (build id)");
18283     case NT_VMS_GSTNAM:
18284       return _("NT_VMS_GSTNAM (sym table name)");
18285     case NT_VMS_ORIG_DYN:
18286       return "NT_VMS_ORIG_DYN";
18287     case NT_VMS_PATCHTIME:
18288       return "NT_VMS_PATCHTIME";
18289     default:
18290       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
18291       return buff;
18292     }
18293 }
18294
18295 static bfd_boolean
18296 print_ia64_vms_note (Elf_Internal_Note * pnote)
18297 {
18298   int maxlen = pnote->descsz;
18299
18300   if (maxlen < 2 || (unsigned long) maxlen != pnote->descsz)
18301     goto desc_size_fail;
18302
18303   switch (pnote->type)
18304     {
18305     case NT_VMS_MHD:
18306       if (maxlen <= 36)
18307         goto desc_size_fail;
18308
18309       int l = (int) strnlen (pnote->descdata + 34, maxlen - 34);
18310
18311       printf (_("    Creation date  : %.17s\n"), pnote->descdata);
18312       printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
18313       if (l + 34 < maxlen)
18314         {
18315           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
18316           if (l + 35 < maxlen)
18317             printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
18318           else
18319             printf (_("    Module version : <missing>\n"));
18320         }
18321       else
18322         {
18323           printf (_("    Module name    : <missing>\n"));
18324           printf (_("    Module version : <missing>\n"));
18325         }
18326       break;
18327
18328     case NT_VMS_LNM:
18329       printf (_("   Language: %.*s\n"), maxlen, pnote->descdata);
18330       break;
18331
18332 #ifdef BFD64
18333     case NT_VMS_FPMODE:
18334       printf (_("   Floating Point mode: "));
18335       if (maxlen < 8)
18336         goto desc_size_fail;
18337       /* FIXME: Generate an error if descsz > 8 ?  */
18338
18339       printf ("0x%016" BFD_VMA_FMT "x\n",
18340               (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
18341       break;
18342
18343     case NT_VMS_LINKTIME:
18344       printf (_("   Link time: "));
18345       if (maxlen < 8)
18346         goto desc_size_fail;
18347       /* FIXME: Generate an error if descsz > 8 ?  */
18348
18349       print_vms_time
18350         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
18351       printf ("\n");
18352       break;
18353
18354     case NT_VMS_PATCHTIME:
18355       printf (_("   Patch time: "));
18356       if (maxlen < 8)
18357         goto desc_size_fail;
18358       /* FIXME: Generate an error if descsz > 8 ?  */
18359
18360       print_vms_time
18361         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
18362       printf ("\n");
18363       break;
18364
18365     case NT_VMS_ORIG_DYN:
18366       if (maxlen < 34)
18367         goto desc_size_fail;
18368
18369       printf (_("   Major id: %u,  minor id: %u\n"),
18370               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
18371               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
18372       printf (_("   Last modified  : "));
18373       print_vms_time
18374         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
18375       printf (_("\n   Link flags  : "));
18376       printf ("0x%016" BFD_VMA_FMT "x\n",
18377               (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
18378       printf (_("   Header flags: 0x%08x\n"),
18379               (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
18380       printf (_("   Image id    : %.*s\n"), maxlen - 32, pnote->descdata + 32);
18381       break;
18382 #endif
18383
18384     case NT_VMS_IMGNAM:
18385       printf (_("    Image name: %.*s\n"), maxlen, pnote->descdata);
18386       break;
18387
18388     case NT_VMS_GSTNAM:
18389       printf (_("    Global symbol table name: %.*s\n"), maxlen, pnote->descdata);
18390       break;
18391
18392     case NT_VMS_IMGID:
18393       printf (_("    Image id: %.*s\n"), maxlen, pnote->descdata);
18394       break;
18395
18396     case NT_VMS_LINKID:
18397       printf (_("    Linker id: %.*s\n"), maxlen, pnote->descdata);
18398       break;
18399
18400     default:
18401       return FALSE;
18402     }
18403
18404   return TRUE;
18405
18406  desc_size_fail:
18407   printf (_("  <corrupt - data size is too small>\n"));
18408   error (_("corrupt IA64 note: data size is too small\n"));
18409   return FALSE;
18410 }
18411
18412 /* Find the symbol associated with a build attribute that is attached
18413    to address OFFSET.  If PNAME is non-NULL then store the name of
18414    the symbol (if found) in the provided pointer,  Returns NULL if a
18415    symbol could not be found.  */
18416
18417 static Elf_Internal_Sym *
18418 get_symbol_for_build_attribute (Filedata *       filedata,
18419                                 unsigned long    offset,
18420                                 bfd_boolean      is_open_attr,
18421                                 const char **    pname)
18422 {
18423   static Filedata *         saved_filedata = NULL;
18424   static char *             strtab;
18425   static unsigned long      strtablen;
18426   static Elf_Internal_Sym * symtab;
18427   static unsigned long      nsyms;
18428   Elf_Internal_Sym *        saved_sym = NULL;
18429   Elf_Internal_Sym *        sym;
18430
18431   if (filedata->section_headers != NULL
18432       && (saved_filedata == NULL || filedata != saved_filedata))
18433     {
18434       Elf_Internal_Shdr * symsec;
18435
18436       /* Load the symbol and string sections.  */
18437       for (symsec = filedata->section_headers;
18438            symsec < filedata->section_headers + filedata->file_header.e_shnum;
18439            symsec ++)
18440         {
18441           if (symsec->sh_type == SHT_SYMTAB)
18442             {
18443               symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
18444
18445               if (symsec->sh_link < filedata->file_header.e_shnum)
18446                 {
18447                   Elf_Internal_Shdr * strtab_sec = filedata->section_headers + symsec->sh_link;
18448
18449                   strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
18450                                               1, strtab_sec->sh_size,
18451                                               _("string table"));
18452                   strtablen = strtab != NULL ? strtab_sec->sh_size : 0;
18453                 }
18454             }
18455         }
18456       saved_filedata = filedata;
18457     }
18458
18459   if (symtab == NULL || strtab == NULL)
18460     return NULL;
18461
18462   /* Find a symbol whose value matches offset.  */
18463   for (sym = symtab; sym < symtab + nsyms; sym ++)
18464     if (sym->st_value == offset)
18465       {
18466         if (sym->st_name >= strtablen)
18467           /* Huh ?  This should not happen.  */
18468           continue;
18469
18470         if (strtab[sym->st_name] == 0)
18471           continue;
18472
18473         /* The AArch64 and ARM architectures define mapping symbols
18474            (eg $d, $x, $t) which we want to ignore.  */
18475         if (strtab[sym->st_name] == '$'
18476             && strtab[sym->st_name + 1] != 0
18477             && strtab[sym->st_name + 2] == 0)
18478           continue;
18479
18480         if (is_open_attr)
18481           {
18482             /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
18483                and FILE or OBJECT symbols over NOTYPE symbols.  We skip
18484                FUNC symbols entirely.  */
18485             switch (ELF_ST_TYPE (sym->st_info))
18486               {
18487               case STT_OBJECT:
18488               case STT_FILE:
18489                 saved_sym = sym;
18490                 if (sym->st_size)
18491                   {
18492                     /* If the symbol has a size associated
18493                        with it then we can stop searching.  */
18494                     sym = symtab + nsyms;
18495                   }
18496                 continue;
18497
18498               case STT_FUNC:
18499                 /* Ignore function symbols.  */
18500                 continue;
18501
18502               default:
18503                 break;
18504               }
18505
18506             switch (ELF_ST_BIND (sym->st_info))
18507               {
18508               case STB_GLOBAL:
18509                 if (saved_sym == NULL
18510                     || ELF_ST_TYPE (saved_sym->st_info) != STT_OBJECT)
18511                   saved_sym = sym;
18512                 break;
18513
18514               case STB_LOCAL:
18515                 if (saved_sym == NULL)
18516                   saved_sym = sym;
18517                 break;
18518
18519               default:
18520                 break;
18521               }
18522           }
18523         else
18524           {
18525             if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
18526               continue;
18527
18528             saved_sym = sym;
18529             break;
18530           }
18531       }
18532
18533   if (saved_sym && pname)
18534     * pname = strtab + saved_sym->st_name;
18535
18536   return saved_sym;
18537 }
18538
18539 /* Returns true iff addr1 and addr2 are in the same section.  */
18540
18541 static bfd_boolean
18542 same_section (Filedata * filedata, unsigned long addr1, unsigned long addr2)
18543 {
18544   Elf_Internal_Shdr * a1;
18545   Elf_Internal_Shdr * a2;
18546
18547   a1 = find_section_by_address (filedata, addr1);
18548   a2 = find_section_by_address (filedata, addr2);
18549   
18550   return a1 == a2 && a1 != NULL;
18551 }
18552
18553 static bfd_boolean
18554 print_gnu_build_attribute_description (Elf_Internal_Note *  pnote,
18555                                        Filedata *           filedata)
18556 {
18557   static unsigned long  global_offset = 0;
18558   static unsigned long  global_end = 0;
18559   static unsigned long  func_offset = 0;
18560   static unsigned long  func_end = 0;
18561
18562   Elf_Internal_Sym *    sym;
18563   const char *          name;
18564   unsigned long         start;
18565   unsigned long         end;
18566   bfd_boolean           is_open_attr = pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN;
18567
18568   switch (pnote->descsz)
18569     {
18570     case 0:
18571       /* A zero-length description means that the range of
18572          the previous note of the same type should be used.  */
18573       if (is_open_attr)
18574         {
18575           if (global_end > global_offset)
18576             printf (_("    Applies to region from %#lx to %#lx\n"),
18577                     global_offset, global_end);
18578           else
18579             printf (_("    Applies to region from %#lx\n"), global_offset);
18580         }
18581       else
18582         {
18583           if (func_end > func_offset)
18584             printf (_("    Applies to region from %#lx to %#lx\n"), func_offset, func_end);
18585           else
18586             printf (_("    Applies to region from %#lx\n"), func_offset);
18587         }
18588       return TRUE;
18589
18590     case 4:
18591       start = byte_get ((unsigned char *) pnote->descdata, 4);
18592       end = 0;
18593       break;
18594
18595     case 8:
18596       if (is_32bit_elf)
18597         {
18598           /* FIXME: We should check that version 3+ notes are being used here...  */
18599           start = byte_get ((unsigned char *) pnote->descdata, 4);
18600           end = byte_get ((unsigned char *) pnote->descdata + 4, 4);
18601         }
18602       else
18603         {
18604           start = byte_get ((unsigned char *) pnote->descdata, 8);
18605           end = 0;
18606         }
18607       break;
18608
18609     case 16:
18610       start = byte_get ((unsigned char *) pnote->descdata, 8);
18611       end = byte_get ((unsigned char *) pnote->descdata + 8, 8);
18612       break;
18613       
18614     default:
18615       error (_("    <invalid description size: %lx>\n"), pnote->descsz);
18616       printf (_("    <invalid descsz>"));
18617       return FALSE;
18618     }
18619
18620   name = NULL;
18621   sym = get_symbol_for_build_attribute (filedata, start, is_open_attr, & name);
18622   /* As of version 5 of the annobin plugin, filename symbols are biased by 2
18623      in order to avoid them being confused with the start address of the
18624      first function in the file...  */
18625   if (sym == NULL && is_open_attr)
18626     sym = get_symbol_for_build_attribute (filedata, start + 2, is_open_attr,
18627                                           & name);
18628
18629   if (end == 0 && sym != NULL && sym->st_size > 0)
18630     end = start + sym->st_size;
18631
18632   if (is_open_attr)
18633     {
18634       /* FIXME: Need to properly allow for section alignment.
18635          16 is just the alignment used on x86_64.  */
18636       if (global_end > 0
18637           && start > BFD_ALIGN (global_end, 16)
18638           /* Build notes are not guaranteed to be organised in order of
18639              increasing address, but we should find the all of the notes
18640              for one section in the same place.  */
18641           && same_section (filedata, start, global_end))
18642         warn (_("Gap in build notes detected from %#lx to %#lx\n"),
18643               global_end + 1, start - 1);
18644
18645       printf (_("    Applies to region from %#lx"), start);
18646       global_offset = start;
18647
18648       if (end)
18649         {
18650           printf (_(" to %#lx"), end);
18651           global_end = end;
18652         }
18653     }
18654   else
18655     {
18656       printf (_("    Applies to region from %#lx"), start);
18657       func_offset = start;
18658
18659       if (end)
18660         {
18661           printf (_(" to %#lx"), end);
18662           func_end = end;
18663         }
18664     }
18665
18666   if (sym && name)
18667     printf (_(" (%s)"), name);
18668
18669   printf ("\n");
18670   return TRUE;
18671 }
18672
18673 static bfd_boolean
18674 print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
18675 {
18676   static const char string_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_STRING, 0 };
18677   static const char number_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC, 0 };
18678   static const char bool_expected [3] = { GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE, GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE, 0 };
18679   char         name_type;
18680   char         name_attribute;
18681   const char * expected_types;
18682   const char * name = pnote->namedata;
18683   const char * text;
18684   signed int   left;
18685
18686   if (name == NULL || pnote->namesz < 2)
18687     {
18688       error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
18689       print_symbol (-20, _("  <corrupt name>"));
18690       return FALSE;
18691     }
18692
18693   if (do_wide)
18694     left = 28;
18695   else
18696     left = 20;
18697
18698   /* Version 2 of the spec adds a "GA" prefix to the name field.  */
18699   if (name[0] == 'G' && name[1] == 'A')
18700     {
18701       if (pnote->namesz < 4)
18702         {
18703           error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
18704           print_symbol (-20, _("  <corrupt name>"));
18705           return FALSE;
18706         }
18707
18708       printf ("GA");
18709       name += 2;
18710       left -= 2;
18711     }
18712
18713   switch ((name_type = * name))
18714     {
18715     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18716     case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
18717     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
18718     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
18719       printf ("%c", * name);
18720       left --;
18721       break;
18722     default:
18723       error (_("unrecognised attribute type in name field: %d\n"), name_type);
18724       print_symbol (-20, _("<unknown name type>"));
18725       return FALSE;
18726     }
18727
18728   ++ name;
18729   text = NULL;
18730
18731   switch ((name_attribute = * name))
18732     {
18733     case GNU_BUILD_ATTRIBUTE_VERSION:
18734       text = _("<version>");
18735       expected_types = string_expected;
18736       ++ name;
18737       break;
18738     case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18739       text = _("<stack prot>");
18740       expected_types = "!+*";
18741       ++ name;
18742       break;
18743     case GNU_BUILD_ATTRIBUTE_RELRO:
18744       text = _("<relro>");
18745       expected_types = bool_expected;
18746       ++ name;
18747       break;
18748     case GNU_BUILD_ATTRIBUTE_STACK_SIZE:
18749       text = _("<stack size>");
18750       expected_types = number_expected;
18751       ++ name;
18752       break;
18753     case GNU_BUILD_ATTRIBUTE_TOOL:
18754       text = _("<tool>");
18755       expected_types = string_expected;
18756       ++ name;
18757       break;
18758     case GNU_BUILD_ATTRIBUTE_ABI:
18759       text = _("<ABI>");
18760       expected_types = "$*";
18761       ++ name;
18762       break;
18763     case GNU_BUILD_ATTRIBUTE_PIC:
18764       text = _("<PIC>");
18765       expected_types = number_expected;
18766       ++ name;
18767       break;
18768     case GNU_BUILD_ATTRIBUTE_SHORT_ENUM:
18769       text = _("<short enum>");
18770       expected_types = bool_expected;
18771       ++ name;
18772       break;
18773     default:
18774       if (ISPRINT (* name))
18775         {
18776           int len = strnlen (name, pnote->namesz - (name - pnote->namedata)) + 1;
18777
18778           if (len > left && ! do_wide)
18779             len = left;
18780           printf ("%.*s:", len, name);
18781           left -= len;
18782           name += len;
18783         }
18784       else
18785         {
18786           static char tmpbuf [128];
18787
18788           error (_("unrecognised byte in name field: %d\n"), * name);
18789           sprintf (tmpbuf, _("<unknown:_%d>"), * name);
18790           text = tmpbuf;
18791           name ++;
18792         }
18793       expected_types = "*$!+";
18794       break;
18795     }
18796
18797   if (text)
18798     left -= printf ("%s", text);
18799
18800   if (strchr (expected_types, name_type) == NULL)
18801     warn (_("attribute does not have an expected type (%c)\n"), name_type);
18802
18803   if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
18804     {
18805       error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
18806              (unsigned long) pnote->namesz,
18807              (long) (name - pnote->namedata));
18808       return FALSE;
18809     }
18810
18811   if (left < 1 && ! do_wide)
18812     return TRUE;
18813
18814   switch (name_type)
18815     {
18816     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18817       {
18818         unsigned int        bytes;
18819         unsigned long long  val = 0;
18820         unsigned int        shift = 0;
18821         char *              decoded = NULL;
18822
18823         bytes = pnote->namesz - (name - pnote->namedata);
18824         if (bytes > 0)
18825           /* The -1 is because the name field is always 0 terminated, and we
18826              want to be able to ensure that the shift in the while loop below
18827              will not overflow.  */
18828           -- bytes;
18829
18830         if (bytes > sizeof (val))
18831           {
18832             error (_("corrupt numeric name field: too many bytes in the value: %x\n"),
18833                    bytes);
18834             bytes = sizeof (val);
18835           }
18836         /* We do not bother to warn if bytes == 0 as this can
18837            happen with some early versions of the gcc plugin.  */
18838
18839         while (bytes --)
18840           {
18841             unsigned long byte = (* name ++) & 0xff;
18842
18843             val |= byte << shift;
18844             shift += 8;
18845           }
18846
18847         switch (name_attribute)
18848           {
18849           case GNU_BUILD_ATTRIBUTE_PIC:
18850             switch (val)
18851               {
18852               case 0: decoded = "static"; break;
18853               case 1: decoded = "pic"; break;
18854               case 2: decoded = "PIC"; break;
18855               case 3: decoded = "pie"; break;
18856               case 4: decoded = "PIE"; break;
18857               default: break;
18858               }
18859             break;
18860           case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18861             switch (val)
18862               {
18863                 /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c.  */
18864               case 0: decoded = "off"; break;
18865               case 1: decoded = "on"; break;
18866               case 2: decoded = "all"; break;
18867               case 3: decoded = "strong"; break;
18868               case 4: decoded = "explicit"; break;
18869               default: break;
18870               }
18871             break;
18872           default:
18873             break;
18874           }
18875
18876         if (decoded != NULL)
18877           {
18878             print_symbol (-left, decoded);
18879             left = 0;
18880           }
18881         else if (val == 0)
18882           {
18883             printf ("0x0");
18884             left -= 3;
18885           }
18886         else
18887           {
18888             if (do_wide)
18889               left -= printf ("0x%llx", val);
18890             else
18891               left -= printf ("0x%-.*llx", left, val);
18892           }
18893       }
18894       break;
18895     case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
18896       left -= print_symbol (- left, name);
18897       break;
18898     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
18899       left -= print_symbol (- left, "true");
18900       break;
18901     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
18902       left -= print_symbol (- left, "false");
18903       break;
18904     }
18905
18906   if (do_wide && left > 0)
18907     printf ("%-*s", left, " ");
18908     
18909   return TRUE;
18910 }
18911
18912 /* Note that by the ELF standard, the name field is already null byte
18913    terminated, and namesz includes the terminating null byte.
18914    I.E. the value of namesz for the name "FSF" is 4.
18915
18916    If the value of namesz is zero, there is no name present.  */
18917
18918 static bfd_boolean
18919 process_note (Elf_Internal_Note *  pnote,
18920               Filedata *           filedata)
18921 {
18922   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
18923   const char * nt;
18924
18925   if (pnote->namesz == 0)
18926     /* If there is no note name, then use the default set of
18927        note type strings.  */
18928     nt = get_note_type (filedata, pnote->type);
18929
18930   else if (const_strneq (pnote->namedata, "GNU"))
18931     /* GNU-specific object file notes.  */
18932     nt = get_gnu_elf_note_type (pnote->type);
18933
18934   else if (const_strneq (pnote->namedata, "FreeBSD"))
18935     /* FreeBSD-specific core file notes.  */
18936     nt = get_freebsd_elfcore_note_type (filedata, pnote->type);
18937
18938   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
18939     /* NetBSD-specific core file notes.  */
18940     nt = get_netbsd_elfcore_note_type (filedata, pnote->type);
18941
18942   else if (const_strneq (pnote->namedata, "NetBSD"))
18943     /* NetBSD-specific core file notes.  */
18944     return process_netbsd_elf_note (pnote);
18945
18946   else if (strneq (pnote->namedata, "SPU/", 4))
18947     {
18948       /* SPU-specific core file notes.  */
18949       nt = pnote->namedata + 4;
18950       name = "SPU";
18951     }
18952
18953   else if (const_strneq (pnote->namedata, "IPF/VMS"))
18954     /* VMS/ia64-specific file notes.  */
18955     nt = get_ia64_vms_note_type (pnote->type);
18956
18957   else if (const_strneq (pnote->namedata, "stapsdt"))
18958     nt = get_stapsdt_note_type (pnote->type);
18959
18960   else
18961     /* Don't recognize this note name; just use the default set of
18962        note type strings.  */
18963     nt = get_note_type (filedata, pnote->type);
18964
18965   printf ("  ");
18966
18967   if (((const_strneq (pnote->namedata, "GA")
18968         && strchr ("*$!+", pnote->namedata[2]) != NULL)
18969        || strchr ("*$!+", pnote->namedata[0]) != NULL)
18970       && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18971           || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
18972     print_gnu_build_attribute_name (pnote);
18973   else
18974     print_symbol (-20, name);
18975
18976   if (do_wide)
18977     printf (" 0x%08lx\t%s\t", pnote->descsz, nt);
18978   else
18979     printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
18980
18981   if (const_strneq (pnote->namedata, "IPF/VMS"))
18982     return print_ia64_vms_note (pnote);
18983   else if (const_strneq (pnote->namedata, "GNU"))
18984     return print_gnu_note (filedata, pnote);
18985   else if (const_strneq (pnote->namedata, "stapsdt"))
18986     return print_stapsdt_note (pnote);
18987   else if (const_strneq (pnote->namedata, "CORE"))
18988     return print_core_note (pnote);
18989   else if (((const_strneq (pnote->namedata, "GA")
18990              && strchr ("*$!+", pnote->namedata[2]) != NULL)
18991             || strchr ("*$!+", pnote->namedata[0]) != NULL)
18992            && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18993                || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
18994     return print_gnu_build_attribute_description (pnote, filedata);
18995
18996   if (pnote->descsz)
18997     {
18998       unsigned long i;
18999
19000       printf (_("   description data: "));
19001       for (i = 0; i < pnote->descsz; i++)
19002         printf ("%02x ", pnote->descdata[i]);
19003       if (!do_wide)
19004         printf ("\n");
19005     }
19006
19007   if (do_wide)
19008     printf ("\n");
19009
19010   return TRUE;
19011 }
19012
19013 static bfd_boolean
19014 process_notes_at (Filedata *           filedata,
19015                   Elf_Internal_Shdr *  section,
19016                   bfd_vma              offset,
19017                   bfd_vma              length,
19018                   bfd_vma              align)
19019 {
19020   Elf_External_Note * pnotes;
19021   Elf_External_Note * external;
19022   char *              end;
19023   bfd_boolean         res = TRUE;
19024
19025   if (length <= 0)
19026     return FALSE;
19027
19028   if (section)
19029     {
19030       pnotes = (Elf_External_Note *) get_section_contents (section, filedata);
19031       if (pnotes)
19032         {
19033           if (! apply_relocations (filedata, section, (unsigned char *) pnotes, length, NULL, NULL))
19034             return FALSE;
19035         }
19036     }
19037   else
19038     pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
19039                                              _("notes"));
19040
19041   if (pnotes == NULL)
19042     return FALSE;
19043
19044   external = pnotes;
19045
19046   if (section)
19047     printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (filedata, section));
19048   else
19049     printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
19050             (unsigned long) offset, (unsigned long) length);
19051
19052   /* NB: Some note sections may have alignment value of 0 or 1.  gABI
19053      specifies that notes should be aligned to 4 bytes in 32-bit
19054      objects and to 8 bytes in 64-bit objects.  As a Linux extension,
19055      we also support 4 byte alignment in 64-bit objects.  If section
19056      alignment is less than 4, we treate alignment as 4 bytes.   */
19057   if (align < 4)
19058     align = 4;
19059   else if (align != 4 && align != 8)
19060     {
19061       warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
19062             (long) align);
19063       return FALSE;
19064     }
19065
19066   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
19067
19068   end = (char *) pnotes + length;
19069   while ((char *) external < end)
19070     {
19071       Elf_Internal_Note inote;
19072       size_t min_notesz;
19073       char * next;
19074       char * temp = NULL;
19075       size_t data_remaining = end - (char *) external;
19076
19077       if (!is_ia64_vms (filedata))
19078         {
19079           /* PR binutils/15191
19080              Make sure that there is enough data to read.  */
19081           min_notesz = offsetof (Elf_External_Note, name);
19082           if (data_remaining < min_notesz)
19083             {
19084               warn (ngettext ("Corrupt note: only %ld byte remains, "
19085                               "not enough for a full note\n",
19086                               "Corrupt note: only %ld bytes remain, "
19087                               "not enough for a full note\n",
19088                               data_remaining),
19089                     (long) data_remaining);
19090               break;
19091             }
19092           data_remaining -= min_notesz;
19093
19094           inote.type     = BYTE_GET (external->type);
19095           inote.namesz   = BYTE_GET (external->namesz);
19096           inote.namedata = external->name;
19097           inote.descsz   = BYTE_GET (external->descsz);
19098           inote.descdata = ((char *) external
19099                             + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
19100           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
19101           next = ((char *) external
19102                   + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
19103         }
19104       else
19105         {
19106           Elf64_External_VMS_Note *vms_external;
19107
19108           /* PR binutils/15191
19109              Make sure that there is enough data to read.  */
19110           min_notesz = offsetof (Elf64_External_VMS_Note, name);
19111           if (data_remaining < min_notesz)
19112             {
19113               warn (ngettext ("Corrupt note: only %ld byte remains, "
19114                               "not enough for a full note\n",
19115                               "Corrupt note: only %ld bytes remain, "
19116                               "not enough for a full note\n",
19117                               data_remaining),
19118                     (long) data_remaining);
19119               break;
19120             }
19121           data_remaining -= min_notesz;
19122
19123           vms_external = (Elf64_External_VMS_Note *) external;
19124           inote.type     = BYTE_GET (vms_external->type);
19125           inote.namesz   = BYTE_GET (vms_external->namesz);
19126           inote.namedata = vms_external->name;
19127           inote.descsz   = BYTE_GET (vms_external->descsz);
19128           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
19129           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
19130           next = inote.descdata + align_power (inote.descsz, 3);
19131         }
19132
19133       /* PR 17531: file: 3443835e.  */
19134       /* PR 17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4.  */
19135       if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
19136           || (size_t) (inote.descdata - inote.namedata) > data_remaining
19137           || (size_t) (next - inote.descdata) < inote.descsz
19138           || ((size_t) (next - inote.descdata)
19139               > data_remaining - (size_t) (inote.descdata - inote.namedata)))
19140         {
19141           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
19142                 (unsigned long) ((char *) external - (char *) pnotes));
19143           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
19144                 inote.type, inote.namesz, inote.descsz, (int) align);
19145           break;
19146         }
19147
19148       external = (Elf_External_Note *) next;
19149
19150       /* Verify that name is null terminated.  It appears that at least
19151          one version of Linux (RedHat 6.0) generates corefiles that don't
19152          comply with the ELF spec by failing to include the null byte in
19153          namesz.  */
19154       if (inote.namesz > 0 && inote.namedata[inote.namesz - 1] != '\0')
19155         {
19156           if ((size_t) (inote.descdata - inote.namedata) == inote.namesz)
19157             {
19158               temp = (char *) malloc (inote.namesz + 1);
19159               if (temp == NULL)
19160                 {
19161                   error (_("Out of memory allocating space for inote name\n"));
19162                   res = FALSE;
19163                   break;
19164                 }
19165
19166               memcpy (temp, inote.namedata, inote.namesz);
19167               inote.namedata = temp;
19168             }
19169           inote.namedata[inote.namesz] = 0;
19170         }
19171
19172       if (! process_note (& inote, filedata))
19173         res = FALSE;
19174
19175       if (temp != NULL)
19176         {
19177           free (temp);
19178           temp = NULL;
19179         }
19180     }
19181
19182   free (pnotes);
19183
19184   return res;
19185 }
19186
19187 static bfd_boolean
19188 process_corefile_note_segments (Filedata * filedata)
19189 {
19190   Elf_Internal_Phdr * segment;
19191   unsigned int i;
19192   bfd_boolean res = TRUE;
19193
19194   if (! get_program_headers (filedata))
19195     return TRUE;
19196
19197   for (i = 0, segment = filedata->program_headers;
19198        i < filedata->file_header.e_phnum;
19199        i++, segment++)
19200     {
19201       if (segment->p_type == PT_NOTE)
19202         if (! process_notes_at (filedata, NULL,
19203                                 (bfd_vma) segment->p_offset,
19204                                 (bfd_vma) segment->p_filesz,
19205                                 (bfd_vma) segment->p_align))
19206           res = FALSE;
19207     }
19208
19209   return res;
19210 }
19211
19212 static bfd_boolean
19213 process_v850_notes (Filedata * filedata, bfd_vma offset, bfd_vma length)
19214 {
19215   Elf_External_Note * pnotes;
19216   Elf_External_Note * external;
19217   char * end;
19218   bfd_boolean res = TRUE;
19219
19220   if (length <= 0)
19221     return FALSE;
19222
19223   pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
19224                                            _("v850 notes"));
19225   if (pnotes == NULL)
19226     return FALSE;
19227
19228   external = pnotes;
19229   end = (char*) pnotes + length;
19230
19231   printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
19232           (unsigned long) offset, (unsigned long) length);
19233
19234   while ((char *) external + sizeof (Elf_External_Note) < end)
19235     {
19236       Elf_External_Note * next;
19237       Elf_Internal_Note inote;
19238
19239       inote.type     = BYTE_GET (external->type);
19240       inote.namesz   = BYTE_GET (external->namesz);
19241       inote.namedata = external->name;
19242       inote.descsz   = BYTE_GET (external->descsz);
19243       inote.descdata = inote.namedata + align_power (inote.namesz, 2);
19244       inote.descpos  = offset + (inote.descdata - (char *) pnotes);
19245
19246       if (inote.descdata < (char *) pnotes || inote.descdata >= end)
19247         {
19248           warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
19249           inote.descdata = inote.namedata;
19250           inote.namesz   = 0;
19251         }
19252
19253       next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
19254
19255       if (   ((char *) next > end)
19256           || ((char *) next <  (char *) pnotes))
19257         {
19258           warn (_("corrupt descsz found in note at offset 0x%lx\n"),
19259                 (unsigned long) ((char *) external - (char *) pnotes));
19260           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
19261                 inote.type, inote.namesz, inote.descsz);
19262           break;
19263         }
19264
19265       external = next;
19266
19267       /* Prevent out-of-bounds indexing.  */
19268       if (   inote.namedata + inote.namesz > end
19269           || inote.namedata + inote.namesz < inote.namedata)
19270         {
19271           warn (_("corrupt namesz found in note at offset 0x%lx\n"),
19272                 (unsigned long) ((char *) external - (char *) pnotes));
19273           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
19274                 inote.type, inote.namesz, inote.descsz);
19275           break;
19276         }
19277
19278       printf ("  %s: ", get_v850_elf_note_type (inote.type));
19279
19280       if (! print_v850_note (& inote))
19281         {
19282           res = FALSE;
19283           printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
19284                   inote.namesz, inote.descsz);
19285         }
19286     }
19287
19288   free (pnotes);
19289
19290   return res;
19291 }
19292
19293 static bfd_boolean
19294 process_note_sections (Filedata * filedata)
19295 {
19296   Elf_Internal_Shdr * section;
19297   unsigned long i;
19298   unsigned int n = 0;
19299   bfd_boolean res = TRUE;
19300
19301   for (i = 0, section = filedata->section_headers;
19302        i < filedata->file_header.e_shnum && section != NULL;
19303        i++, section++)
19304     {
19305       if (section->sh_type == SHT_NOTE)
19306         {
19307           if (! process_notes_at (filedata, section,
19308                                   (bfd_vma) section->sh_offset,
19309                                   (bfd_vma) section->sh_size,
19310                                   (bfd_vma) section->sh_addralign))
19311             res = FALSE;
19312           n++;
19313         }
19314
19315       if ((   filedata->file_header.e_machine == EM_V800
19316            || filedata->file_header.e_machine == EM_V850
19317            || filedata->file_header.e_machine == EM_CYGNUS_V850)
19318           && section->sh_type == SHT_RENESAS_INFO)
19319         {
19320           if (! process_v850_notes (filedata,
19321                                     (bfd_vma) section->sh_offset,
19322                                     (bfd_vma) section->sh_size))
19323             res = FALSE;
19324           n++;
19325         }
19326     }
19327
19328   if (n == 0)
19329     /* Try processing NOTE segments instead.  */
19330     return process_corefile_note_segments (filedata);
19331
19332   return res;
19333 }
19334
19335 static bfd_boolean
19336 process_notes (Filedata * filedata)
19337 {
19338   /* If we have not been asked to display the notes then do nothing.  */
19339   if (! do_notes)
19340     return TRUE;
19341
19342   if (filedata->file_header.e_type != ET_CORE)
19343     return process_note_sections (filedata);
19344
19345   /* No program headers means no NOTE segment.  */
19346   if (filedata->file_header.e_phnum > 0)
19347     return process_corefile_note_segments (filedata);
19348
19349   printf (_("No note segments present in the core file.\n"));
19350   return TRUE;
19351 }
19352
19353 static unsigned char *
19354 display_public_gnu_attributes (unsigned char * start,
19355                                const unsigned char * const end)
19356 {
19357   printf (_("  Unknown GNU attribute: %s\n"), start);
19358
19359   start += strnlen ((char *) start, end - start);
19360   display_raw_attribute (start, end);
19361
19362   return (unsigned char *) end;
19363 }
19364
19365 static unsigned char *
19366 display_generic_attribute (unsigned char * start,
19367                            unsigned int tag,
19368                            const unsigned char * const end)
19369 {
19370   if (tag == 0)
19371     return (unsigned char *) end;
19372
19373   return display_tag_value (tag, start, end);
19374 }
19375
19376 static bfd_boolean
19377 process_arch_specific (Filedata * filedata)
19378 {
19379   if (! do_arch)
19380     return TRUE;
19381
19382   switch (filedata->file_header.e_machine)
19383     {
19384     case EM_ARC:
19385     case EM_ARC_COMPACT:
19386     case EM_ARC_COMPACT2:
19387       return process_attributes (filedata, "ARC", SHT_ARC_ATTRIBUTES,
19388                                  display_arc_attribute,
19389                                  display_generic_attribute);
19390     case EM_ARM:
19391       return process_attributes (filedata, "aeabi", SHT_ARM_ATTRIBUTES,
19392                                  display_arm_attribute,
19393                                  display_generic_attribute);
19394
19395     case EM_MIPS:
19396     case EM_MIPS_RS3_LE:
19397       return process_mips_specific (filedata);
19398
19399     case EM_MSP430:
19400      return process_attributes (filedata, "mspabi", SHT_MSP430_ATTRIBUTES,
19401                                 display_msp430x_attribute,
19402                                 display_generic_attribute);
19403
19404     case EM_RISCV:
19405      return process_attributes (filedata, "riscv", SHT_RISCV_ATTRIBUTES,
19406                                 display_riscv_attribute,
19407                                 display_generic_attribute);
19408
19409     case EM_NDS32:
19410       return process_nds32_specific (filedata);
19411
19412     case EM_PPC:
19413     case EM_PPC64:
19414       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19415                                  display_power_gnu_attribute);
19416
19417     case EM_S390:
19418     case EM_S390_OLD:
19419       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19420                                  display_s390_gnu_attribute);
19421
19422     case EM_SPARC:
19423     case EM_SPARC32PLUS:
19424     case EM_SPARCV9:
19425       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19426                                  display_sparc_gnu_attribute);
19427
19428     case EM_TI_C6000:
19429       return process_attributes (filedata, "c6xabi", SHT_C6000_ATTRIBUTES,
19430                                  display_tic6x_attribute,
19431                                  display_generic_attribute);
19432
19433     default:
19434       return process_attributes (filedata, "gnu", SHT_GNU_ATTRIBUTES,
19435                                  display_public_gnu_attributes,
19436                                  display_generic_attribute);
19437     }
19438 }
19439
19440 static bfd_boolean
19441 get_file_header (Filedata * filedata)
19442 {
19443   /* Read in the identity array.  */
19444   if (fread (filedata->file_header.e_ident, EI_NIDENT, 1, filedata->handle) != 1)
19445     return FALSE;
19446
19447   /* Determine how to read the rest of the header.  */
19448   switch (filedata->file_header.e_ident[EI_DATA])
19449     {
19450     default:
19451     case ELFDATANONE:
19452     case ELFDATA2LSB:
19453       byte_get = byte_get_little_endian;
19454       byte_put = byte_put_little_endian;
19455       break;
19456     case ELFDATA2MSB:
19457       byte_get = byte_get_big_endian;
19458       byte_put = byte_put_big_endian;
19459       break;
19460     }
19461
19462   /* For now we only support 32 bit and 64 bit ELF files.  */
19463   is_32bit_elf = (filedata->file_header.e_ident[EI_CLASS] != ELFCLASS64);
19464
19465   /* Read in the rest of the header.  */
19466   if (is_32bit_elf)
19467     {
19468       Elf32_External_Ehdr ehdr32;
19469
19470       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, filedata->handle) != 1)
19471         return FALSE;
19472
19473       filedata->file_header.e_type      = BYTE_GET (ehdr32.e_type);
19474       filedata->file_header.e_machine   = BYTE_GET (ehdr32.e_machine);
19475       filedata->file_header.e_version   = BYTE_GET (ehdr32.e_version);
19476       filedata->file_header.e_entry     = BYTE_GET (ehdr32.e_entry);
19477       filedata->file_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
19478       filedata->file_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
19479       filedata->file_header.e_flags     = BYTE_GET (ehdr32.e_flags);
19480       filedata->file_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
19481       filedata->file_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
19482       filedata->file_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
19483       filedata->file_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
19484       filedata->file_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
19485       filedata->file_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
19486     }
19487   else
19488     {
19489       Elf64_External_Ehdr ehdr64;
19490
19491       /* If we have been compiled with sizeof (bfd_vma) == 4, then
19492          we will not be able to cope with the 64bit data found in
19493          64 ELF files.  Detect this now and abort before we start
19494          overwriting things.  */
19495       if (sizeof (bfd_vma) < 8)
19496         {
19497           error (_("This instance of readelf has been built without support for a\n\
19498 64 bit data type and so it cannot read 64 bit ELF files.\n"));
19499           return FALSE;
19500         }
19501
19502       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, filedata->handle) != 1)
19503         return FALSE;
19504
19505       filedata->file_header.e_type      = BYTE_GET (ehdr64.e_type);
19506       filedata->file_header.e_machine   = BYTE_GET (ehdr64.e_machine);
19507       filedata->file_header.e_version   = BYTE_GET (ehdr64.e_version);
19508       filedata->file_header.e_entry     = BYTE_GET (ehdr64.e_entry);
19509       filedata->file_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
19510       filedata->file_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
19511       filedata->file_header.e_flags     = BYTE_GET (ehdr64.e_flags);
19512       filedata->file_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
19513       filedata->file_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
19514       filedata->file_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
19515       filedata->file_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
19516       filedata->file_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
19517       filedata->file_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
19518     }
19519
19520   if (filedata->file_header.e_shoff)
19521     {
19522       /* There may be some extensions in the first section header.  Don't
19523          bomb if we can't read it.  */
19524       if (is_32bit_elf)
19525         get_32bit_section_headers (filedata, TRUE);
19526       else
19527         get_64bit_section_headers (filedata, TRUE);
19528     }
19529
19530   return TRUE;
19531 }
19532
19533 static void
19534 close_file (Filedata * filedata)
19535 {
19536   if (filedata)
19537     {
19538       if (filedata->handle)
19539         fclose (filedata->handle);
19540       free (filedata);
19541     }
19542 }
19543
19544 void
19545 close_debug_file (void * data)
19546 {
19547   close_file ((Filedata *) data);
19548 }
19549
19550 static Filedata *
19551 open_file (const char * pathname)
19552 {
19553   struct stat  statbuf;
19554   Filedata *   filedata = NULL;
19555
19556   if (stat (pathname, & statbuf) < 0
19557       || ! S_ISREG (statbuf.st_mode))
19558     goto fail;
19559
19560   filedata = calloc (1, sizeof * filedata);
19561   if (filedata == NULL)
19562     goto fail;
19563
19564   filedata->handle = fopen (pathname, "rb");
19565   if (filedata->handle == NULL)
19566     goto fail;
19567
19568   filedata->file_size = (bfd_size_type) statbuf.st_size;
19569   filedata->file_name = pathname;
19570
19571   if (! get_file_header (filedata))
19572     goto fail;
19573
19574   if (filedata->file_header.e_shoff)
19575     {
19576       bfd_boolean res;
19577
19578       /* Read the section headers again, this time for real.  */
19579       if (is_32bit_elf)
19580         res = get_32bit_section_headers (filedata, FALSE);
19581       else
19582         res = get_64bit_section_headers (filedata, FALSE);
19583
19584       if (!res)
19585         goto fail;
19586     }
19587
19588   return filedata;
19589
19590  fail:
19591   if (filedata)
19592     {
19593       if (filedata->handle)
19594         fclose (filedata->handle);
19595       free (filedata);
19596     }
19597   return NULL;
19598 }
19599
19600 void *
19601 open_debug_file (const char * pathname)
19602 {
19603   return open_file (pathname);
19604 }
19605
19606 /* Process one ELF object file according to the command line options.
19607    This file may actually be stored in an archive.  The file is
19608    positioned at the start of the ELF object.  Returns TRUE if no
19609    problems were encountered, FALSE otherwise.  */
19610
19611 static bfd_boolean
19612 process_object (Filedata * filedata)
19613 {
19614   bfd_boolean  have_separate_files;
19615   unsigned int i;
19616   bfd_boolean res = TRUE;
19617
19618   if (! get_file_header (filedata))
19619     {
19620       error (_("%s: Failed to read file header\n"), filedata->file_name);
19621       return FALSE;
19622     }
19623
19624   /* Initialise per file variables.  */
19625   for (i = ARRAY_SIZE (version_info); i--;)
19626     version_info[i] = 0;
19627
19628   for (i = ARRAY_SIZE (dynamic_info); i--;)
19629     dynamic_info[i] = 0;
19630   dynamic_info_DT_GNU_HASH = 0;
19631
19632   /* Process the file.  */
19633   if (show_name)
19634     printf (_("\nFile: %s\n"), filedata->file_name);
19635
19636   /* Initialise the dump_sects array from the cmdline_dump_sects array.
19637      Note we do this even if cmdline_dump_sects is empty because we
19638      must make sure that the dump_sets array is zeroed out before each
19639      object file is processed.  */
19640   if (filedata->num_dump_sects > cmdline.num_dump_sects)
19641     memset (filedata->dump_sects, 0, filedata->num_dump_sects * sizeof (* filedata->dump_sects));
19642
19643   if (cmdline.num_dump_sects > 0)
19644     {
19645       if (filedata->num_dump_sects == 0)
19646         /* A sneaky way of allocating the dump_sects array.  */
19647         request_dump_bynumber (filedata, cmdline.num_dump_sects, 0);
19648
19649       assert (filedata->num_dump_sects >= cmdline.num_dump_sects);
19650       memcpy (filedata->dump_sects, cmdline.dump_sects,
19651               cmdline.num_dump_sects * sizeof (* filedata->dump_sects));
19652     }
19653
19654   if (! process_file_header (filedata))
19655     return FALSE;
19656
19657   if (! process_section_headers (filedata))
19658     {
19659       /* Without loaded section headers we cannot process lots of things.  */
19660       do_unwind = do_version = do_dump = do_arch = FALSE;
19661
19662       if (! do_using_dynamic)
19663         do_syms = do_dyn_syms = do_reloc = FALSE;
19664     }
19665
19666   if (! process_section_groups (filedata))
19667     /* Without loaded section groups we cannot process unwind.  */
19668     do_unwind = FALSE;
19669
19670   if (process_program_headers (filedata))
19671     process_dynamic_section (filedata);
19672   else
19673     res = FALSE;
19674
19675   if (! process_relocs (filedata))
19676     res = FALSE;
19677
19678   if (! process_unwind (filedata))
19679     res = FALSE;
19680
19681   if (! process_symbol_table (filedata))
19682     res = FALSE;
19683
19684   if (! process_syminfo (filedata))
19685     res = FALSE;
19686
19687   if (! process_version_sections (filedata))
19688     res = FALSE;
19689
19690   if (filedata->file_header.e_shstrndx != SHN_UNDEF)
19691     have_separate_files = load_separate_debug_files (filedata, filedata->file_name);
19692   else
19693     have_separate_files = FALSE;
19694
19695   if (! process_section_contents (filedata))
19696     res = FALSE;
19697
19698   if (have_separate_files)
19699     {
19700       separate_info * d;
19701
19702       for (d = first_separate_info; d != NULL; d = d->next)
19703         {
19704           if (! process_section_headers (d->handle))
19705             res = FALSE;
19706           else if (! process_section_contents (d->handle))
19707             res = FALSE;
19708         }
19709
19710       /* The file handles are closed by the call to free_debug_memory() below.  */
19711     }
19712
19713   if (! process_notes (filedata))
19714     res = FALSE;
19715
19716   if (! process_gnu_liblist (filedata))
19717     res = FALSE;
19718
19719   if (! process_arch_specific (filedata))
19720     res = FALSE;
19721
19722   free (filedata->program_headers);
19723   filedata->program_headers = NULL;
19724
19725   free (filedata->section_headers);
19726   filedata->section_headers = NULL;
19727
19728   free (filedata->string_table);
19729   filedata->string_table = NULL;
19730   filedata->string_table_length = 0;
19731
19732   if (dynamic_strings)
19733     {
19734       free (dynamic_strings);
19735       dynamic_strings = NULL;
19736       dynamic_strings_length = 0;
19737     }
19738
19739   if (dynamic_symbols)
19740     {
19741       free (dynamic_symbols);
19742       dynamic_symbols = NULL;
19743       num_dynamic_syms = 0;
19744     }
19745
19746   if (dynamic_syminfo)
19747     {
19748       free (dynamic_syminfo);
19749       dynamic_syminfo = NULL;
19750     }
19751
19752   if (dynamic_section)
19753     {
19754       free (dynamic_section);
19755       dynamic_section = NULL;
19756     }
19757
19758   if (section_headers_groups)
19759     {
19760       free (section_headers_groups);
19761       section_headers_groups = NULL;
19762     }
19763
19764   if (section_groups)
19765     {
19766       struct group_list * g;
19767       struct group_list * next;
19768
19769       for (i = 0; i < group_count; i++)
19770         {
19771           for (g = section_groups [i].root; g != NULL; g = next)
19772             {
19773               next = g->next;
19774               free (g);
19775             }
19776         }
19777
19778       free (section_groups);
19779       section_groups = NULL;
19780     }
19781
19782   free_debug_memory ();
19783
19784   return res;
19785 }
19786
19787 /* Process an ELF archive.
19788    On entry the file is positioned just after the ARMAG string.
19789    Returns TRUE upon success, FALSE otherwise.  */
19790
19791 static bfd_boolean
19792 process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
19793 {
19794   struct archive_info arch;
19795   struct archive_info nested_arch;
19796   size_t got;
19797   bfd_boolean ret = TRUE;
19798
19799   show_name = TRUE;
19800
19801   /* The ARCH structure is used to hold information about this archive.  */
19802   arch.file_name = NULL;
19803   arch.file = NULL;
19804   arch.index_array = NULL;
19805   arch.sym_table = NULL;
19806   arch.longnames = NULL;
19807
19808   /* The NESTED_ARCH structure is used as a single-item cache of information
19809      about a nested archive (when members of a thin archive reside within
19810      another regular archive file).  */
19811   nested_arch.file_name = NULL;
19812   nested_arch.file = NULL;
19813   nested_arch.index_array = NULL;
19814   nested_arch.sym_table = NULL;
19815   nested_arch.longnames = NULL;
19816
19817   if (setup_archive (&arch, filedata->file_name, filedata->handle,
19818                      is_thin_archive, do_archive_index) != 0)
19819     {
19820       ret = FALSE;
19821       goto out;
19822     }
19823
19824   if (do_archive_index)
19825     {
19826       if (arch.sym_table == NULL)
19827         error (_("%s: unable to dump the index as none was found\n"), filedata->file_name);
19828       else
19829         {
19830           unsigned long i, l;
19831           unsigned long current_pos;
19832
19833           printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
19834                   filedata->file_name, (unsigned long) arch.index_num, arch.sym_size);
19835
19836           current_pos = ftell (filedata->handle);
19837
19838           for (i = l = 0; i < arch.index_num; i++)
19839             {
19840               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
19841                 {
19842                   char * member_name;
19843
19844                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
19845
19846                   if (member_name != NULL)
19847                     {
19848                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
19849
19850                       if (qualified_name != NULL)
19851                         {
19852                           printf (_("Contents of binary %s at offset "), qualified_name);
19853                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
19854                           putchar ('\n');
19855                           free (qualified_name);
19856                         }
19857                     }
19858                 }
19859
19860               if (l >= arch.sym_size)
19861                 {
19862                   error (_("%s: end of the symbol table reached before the end of the index\n"),
19863                          filedata->file_name);
19864                   ret = FALSE;
19865                   break;
19866                 }
19867               /* PR 17531: file: 0b6630b2.  */
19868               printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
19869               l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
19870             }
19871
19872           if (arch.uses_64bit_indices)
19873             l = (l + 7) & ~ 7;
19874           else
19875             l += l & 1;
19876
19877           if (l < arch.sym_size)
19878             {
19879               error (ngettext ("%s: %ld byte remains in the symbol table, "
19880                                "but without corresponding entries in "
19881                                "the index table\n",
19882                                "%s: %ld bytes remain in the symbol table, "
19883                                "but without corresponding entries in "
19884                                "the index table\n",
19885                                arch.sym_size - l),
19886                      filedata->file_name, arch.sym_size - l);
19887               ret = FALSE;
19888             }
19889
19890           if (fseek (filedata->handle, current_pos, SEEK_SET) != 0)
19891             {
19892               error (_("%s: failed to seek back to start of object files in the archive\n"),
19893                      filedata->file_name);
19894               ret = FALSE;
19895               goto out;
19896             }
19897         }
19898
19899       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
19900           && !do_segments && !do_header && !do_dump && !do_version
19901           && !do_histogram && !do_debugging && !do_arch && !do_notes
19902           && !do_section_groups && !do_dyn_syms)
19903         {
19904           ret = TRUE; /* Archive index only.  */
19905           goto out;
19906         }
19907     }
19908
19909   while (1)
19910     {
19911       char * name;
19912       size_t namelen;
19913       char * qualified_name;
19914
19915       /* Read the next archive header.  */
19916       if (fseek (filedata->handle, arch.next_arhdr_offset, SEEK_SET) != 0)
19917         {
19918           error (_("%s: failed to seek to next archive header\n"), arch.file_name);
19919           return FALSE;
19920         }
19921       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, filedata->handle);
19922       if (got != sizeof arch.arhdr)
19923         {
19924           if (got == 0)
19925             break;
19926           /* PR 24049 - we cannot use filedata->file_name as this will
19927              have already been freed.  */
19928           error (_("%s: failed to read archive header\n"), arch.file_name);
19929             
19930           ret = FALSE;
19931           break;
19932         }
19933       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
19934         {
19935           error (_("%s: did not find a valid archive header\n"), arch.file_name);
19936           ret = FALSE;
19937           break;
19938         }
19939
19940       arch.next_arhdr_offset += sizeof arch.arhdr;
19941
19942       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
19943       if (archive_file_size & 01)
19944         ++archive_file_size;
19945
19946       name = get_archive_member_name (&arch, &nested_arch);
19947       if (name == NULL)
19948         {
19949           error (_("%s: bad archive file name\n"), arch.file_name);
19950           ret = FALSE;
19951           break;
19952         }
19953       namelen = strlen (name);
19954
19955       qualified_name = make_qualified_name (&arch, &nested_arch, name);
19956       if (qualified_name == NULL)
19957         {
19958           error (_("%s: bad archive file name\n"), arch.file_name);
19959           ret = FALSE;
19960           break;
19961         }
19962
19963       if (is_thin_archive && arch.nested_member_origin == 0)
19964         {
19965           /* This is a proxy for an external member of a thin archive.  */
19966           Filedata * member_filedata;
19967           char * member_file_name = adjust_relative_path
19968             (filedata->file_name, name, namelen);
19969
19970           if (member_file_name == NULL)
19971             {
19972               ret = FALSE;
19973               break;
19974             }
19975
19976           member_filedata = open_file (member_file_name);
19977           if (member_filedata == NULL)
19978             {
19979               error (_("Input file '%s' is not readable.\n"), member_file_name);
19980               free (member_file_name);
19981               ret = FALSE;
19982               break;
19983             }
19984
19985           archive_file_offset = arch.nested_member_origin;
19986           member_filedata->file_name = qualified_name;
19987
19988           if (! process_object (member_filedata))
19989             ret = FALSE;
19990
19991           close_file (member_filedata);
19992           free (member_file_name);
19993         }
19994       else if (is_thin_archive)
19995         {
19996           Filedata thin_filedata;
19997
19998           memset (&thin_filedata, 0, sizeof (thin_filedata));
19999
20000           /* PR 15140: Allow for corrupt thin archives.  */
20001           if (nested_arch.file == NULL)
20002             {
20003               error (_("%s: contains corrupt thin archive: %s\n"),
20004                      qualified_name, name);
20005               ret = FALSE;
20006               break;
20007             }
20008
20009           /* This is a proxy for a member of a nested archive.  */
20010           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
20011
20012           /* The nested archive file will have been opened and setup by
20013              get_archive_member_name.  */
20014           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
20015             {
20016               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
20017               ret = FALSE;
20018               break;
20019             }
20020
20021           thin_filedata.handle = nested_arch.file;
20022           thin_filedata.file_name = qualified_name;
20023           
20024           if (! process_object (& thin_filedata))
20025             ret = FALSE;
20026         }
20027       else
20028         {
20029           archive_file_offset = arch.next_arhdr_offset;
20030           arch.next_arhdr_offset += archive_file_size;
20031
20032           filedata->file_name = qualified_name;
20033           if (! process_object (filedata))
20034             ret = FALSE;
20035         }
20036
20037       if (filedata->dump_sects != NULL)
20038         {
20039           free (filedata->dump_sects);
20040           filedata->dump_sects = NULL;
20041           filedata->num_dump_sects = 0;
20042         }
20043
20044       free (qualified_name);
20045     }
20046
20047  out:
20048   if (nested_arch.file != NULL)
20049     fclose (nested_arch.file);
20050   release_archive (&nested_arch);
20051   release_archive (&arch);
20052
20053   return ret;
20054 }
20055
20056 static bfd_boolean
20057 process_file (char * file_name)
20058 {
20059   Filedata * filedata = NULL;
20060   struct stat statbuf;
20061   char armag[SARMAG];
20062   bfd_boolean ret = TRUE;
20063
20064   if (stat (file_name, &statbuf) < 0)
20065     {
20066       if (errno == ENOENT)
20067         error (_("'%s': No such file\n"), file_name);
20068       else
20069         error (_("Could not locate '%s'.  System error message: %s\n"),
20070                file_name, strerror (errno));
20071       return FALSE;
20072     }
20073
20074   if (! S_ISREG (statbuf.st_mode))
20075     {
20076       error (_("'%s' is not an ordinary file\n"), file_name);
20077       return FALSE;
20078     }
20079
20080   filedata = calloc (1, sizeof * filedata);
20081   if (filedata == NULL)
20082     {
20083       error (_("Out of memory allocating file data structure\n"));
20084       return FALSE;
20085     }
20086
20087   filedata->file_name = file_name;
20088   filedata->handle = fopen (file_name, "rb");
20089   if (filedata->handle == NULL)
20090     {
20091       error (_("Input file '%s' is not readable.\n"), file_name);
20092       free (filedata);
20093       return FALSE;
20094     }
20095
20096   if (fread (armag, SARMAG, 1, filedata->handle) != 1)
20097     {
20098       error (_("%s: Failed to read file's magic number\n"), file_name);
20099       fclose (filedata->handle);
20100       free (filedata);
20101       return FALSE;
20102     }
20103
20104   filedata->file_size = (bfd_size_type) statbuf.st_size;
20105
20106   if (memcmp (armag, ARMAG, SARMAG) == 0)
20107     {
20108       if (! process_archive (filedata, FALSE))
20109         ret = FALSE;
20110     }
20111   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
20112     {
20113       if ( ! process_archive (filedata, TRUE))
20114         ret = FALSE;
20115     }
20116   else
20117     {
20118       if (do_archive_index)
20119         error (_("File %s is not an archive so its index cannot be displayed.\n"),
20120                file_name);
20121
20122       rewind (filedata->handle);
20123       archive_file_size = archive_file_offset = 0;
20124
20125       if (! process_object (filedata))
20126         ret = FALSE;
20127     }
20128
20129   fclose (filedata->handle);
20130   free (filedata);
20131
20132   return ret;
20133 }
20134
20135 #ifdef SUPPORT_DISASSEMBLY
20136 /* Needed by the i386 disassembler.  For extra credit, someone could
20137    fix this so that we insert symbolic addresses here, esp for GOT/PLT
20138    symbols.  */
20139
20140 void
20141 print_address (unsigned int addr, FILE * outfile)
20142 {
20143   fprintf (outfile,"0x%8.8x", addr);
20144 }
20145
20146 /* Needed by the i386 disassembler.  */
20147
20148 void
20149 db_task_printsym (unsigned int addr)
20150 {
20151   print_address (addr, stderr);
20152 }
20153 #endif
20154
20155 int
20156 main (int argc, char ** argv)
20157 {
20158   int err;
20159
20160 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
20161   setlocale (LC_MESSAGES, "");
20162 #endif
20163 #if defined (HAVE_SETLOCALE)
20164   setlocale (LC_CTYPE, "");
20165 #endif
20166   bindtextdomain (PACKAGE, LOCALEDIR);
20167   textdomain (PACKAGE);
20168
20169   expandargv (&argc, &argv);
20170
20171   cmdline.file_name = "<cmdline>";
20172   parse_args (& cmdline, argc, argv);
20173
20174   if (optind < (argc - 1))
20175     show_name = TRUE;
20176   else if (optind >= argc)
20177     {
20178       warn (_("Nothing to do.\n"));
20179       usage (stderr);
20180     }
20181
20182   err = FALSE;
20183   while (optind < argc)
20184     if (! process_file (argv[optind++]))
20185       err = TRUE;
20186
20187   if (cmdline.dump_sects != NULL)
20188     free (cmdline.dump_sects);
20189
20190   free (dump_ctf_symtab_name);
20191   free (dump_ctf_strtab_name);
20192   free (dump_ctf_parent_name);
20193
20194   return err ? EXIT_FAILURE : EXIT_SUCCESS;
20195 }