PR24871, readelf segv in dump_ia64_unwind
[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_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
3883     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
3884     case PT_PARISC_WEAKORDER:   return "PARISC_WEAKORDER";
3885     default:                    return NULL;
3886     }
3887 }
3888
3889 static const char *
3890 get_ia64_segment_type (unsigned long type)
3891 {
3892   switch (type)
3893     {
3894     case PT_IA_64_ARCHEXT:      return "IA_64_ARCHEXT";
3895     case PT_IA_64_UNWIND:       return "IA_64_UNWIND";
3896     default:                    return NULL;
3897     }
3898 }
3899
3900 static const char *
3901 get_tic6x_segment_type (unsigned long type)
3902 {
3903   switch (type)
3904     {
3905     case PT_C6000_PHATTR:  return "C6000_PHATTR";
3906     default:               return NULL;
3907     }
3908 }
3909
3910 static const char *
3911 get_hpux_segment_type (unsigned long type, unsigned e_machine)
3912 {
3913   if (e_machine == EM_PARISC)
3914     switch (type)
3915       {
3916       case PT_HP_TLS:           return "HP_TLS";
3917       case PT_HP_CORE_NONE:     return "HP_CORE_NONE";
3918       case PT_HP_CORE_VERSION:  return "HP_CORE_VERSION";
3919       case PT_HP_CORE_KERNEL:   return "HP_CORE_KERNEL";
3920       case PT_HP_CORE_COMM:     return "HP_CORE_COMM";
3921       case PT_HP_CORE_PROC:     return "HP_CORE_PROC";
3922       case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3923       case PT_HP_CORE_STACK:    return "HP_CORE_STACK";
3924       case PT_HP_CORE_SHM:      return "HP_CORE_SHM";
3925       case PT_HP_CORE_MMF:      return "HP_CORE_MMF";
3926       case PT_HP_PARALLEL:      return "HP_PARALLEL";
3927       case PT_HP_FASTBIND:      return "HP_FASTBIND";
3928       case PT_HP_OPT_ANNOT:     return "HP_OPT_ANNOT";
3929       case PT_HP_HSL_ANNOT:     return "HP_HSL_ANNOT";
3930       case PT_HP_STACK:         return "HP_STACK";
3931       case PT_HP_CORE_UTSNAME:  return "HP_CORE_UTSNAME";
3932       default:                  return NULL;
3933       }
3934
3935   if (e_machine == EM_IA_64)
3936     switch (type)
3937       {
3938       case PT_HP_TLS:            return "HP_TLS";
3939       case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
3940       case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
3941       case PT_IA_64_HP_STACK:    return "HP_STACK";
3942       default:                   return NULL;
3943       }
3944
3945   return NULL;
3946 }
3947
3948 static const char *
3949 get_solaris_segment_type (unsigned long type)
3950 {
3951   switch (type)
3952     {
3953     case 0x6464e550: return "PT_SUNW_UNWIND";
3954     case 0x6474e550: return "PT_SUNW_EH_FRAME";
3955     case 0x6ffffff7: return "PT_LOSUNW";
3956     case 0x6ffffffa: return "PT_SUNWBSS";
3957     case 0x6ffffffb: return "PT_SUNWSTACK";
3958     case 0x6ffffffc: return "PT_SUNWDTRACE";
3959     case 0x6ffffffd: return "PT_SUNWCAP";
3960     case 0x6fffffff: return "PT_HISUNW";
3961     default:         return NULL;
3962     }
3963 }
3964
3965 static const char *
3966 get_segment_type (Filedata * filedata, unsigned long p_type)
3967 {
3968   static char buff[32];
3969
3970   switch (p_type)
3971     {
3972     case PT_NULL:       return "NULL";
3973     case PT_LOAD:       return "LOAD";
3974     case PT_DYNAMIC:    return "DYNAMIC";
3975     case PT_INTERP:     return "INTERP";
3976     case PT_NOTE:       return "NOTE";
3977     case PT_SHLIB:      return "SHLIB";
3978     case PT_PHDR:       return "PHDR";
3979     case PT_TLS:        return "TLS";
3980     case PT_GNU_EH_FRAME: return "GNU_EH_FRAME";
3981     case PT_GNU_STACK:  return "GNU_STACK";
3982     case PT_GNU_RELRO:  return "GNU_RELRO";
3983     case PT_GNU_PROPERTY: return "GNU_PROPERTY";
3984
3985     default:
3986       if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3987         {
3988           const char * result;
3989
3990           switch (filedata->file_header.e_machine)
3991             {
3992             case EM_AARCH64:
3993               result = get_aarch64_segment_type (p_type);
3994               break;
3995             case EM_ARM:
3996               result = get_arm_segment_type (p_type);
3997               break;
3998             case EM_MIPS:
3999             case EM_MIPS_RS3_LE:
4000               result = get_mips_segment_type (p_type);
4001               break;
4002             case EM_PARISC:
4003               result = get_parisc_segment_type (p_type);
4004               break;
4005             case EM_IA_64:
4006               result = get_ia64_segment_type (p_type);
4007               break;
4008             case EM_TI_C6000:
4009               result = get_tic6x_segment_type (p_type);
4010               break;
4011             case EM_S390:
4012             case EM_S390_OLD:
4013               result = get_s390_segment_type (p_type);
4014               break;
4015             default:
4016               result = NULL;
4017               break;
4018             }
4019
4020           if (result != NULL)
4021             return result;
4022
4023           sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
4024         }
4025       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
4026         {
4027           const char * result = NULL;
4028
4029           switch (filedata->file_header.e_ident[EI_OSABI])
4030             {
4031             case ELFOSABI_GNU:
4032             case ELFOSABI_FREEBSD:
4033               if (p_type >= PT_GNU_MBIND_LO && p_type <= PT_GNU_MBIND_HI)
4034                 {
4035                   sprintf (buff, "GNU_MBIND+%#lx", p_type - PT_GNU_MBIND_LO);
4036                   result = buff;
4037                 }
4038               break;
4039             case ELFOSABI_HPUX:
4040               result = get_hpux_segment_type (p_type,
4041                                               filedata->file_header.e_machine);
4042               break;
4043             case ELFOSABI_SOLARIS:
4044               result = get_solaris_segment_type (p_type);
4045               break;
4046             default:
4047               break;
4048             }
4049           if (result != NULL)
4050             return result;
4051
4052           sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
4053         }
4054       else
4055         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
4056
4057       return buff;
4058     }
4059 }
4060
4061 static const char *
4062 get_arc_section_type_name (unsigned int sh_type)
4063 {
4064   switch (sh_type)
4065     {
4066     case SHT_ARC_ATTRIBUTES:      return "ARC_ATTRIBUTES";
4067     default:
4068       break;
4069     }
4070   return NULL;
4071 }
4072
4073 static const char *
4074 get_mips_section_type_name (unsigned int sh_type)
4075 {
4076   switch (sh_type)
4077     {
4078     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
4079     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
4080     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
4081     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
4082     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
4083     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
4084     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
4085     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
4086     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
4087     case SHT_MIPS_RELD:          return "MIPS_RELD";
4088     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
4089     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
4090     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
4091     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
4092     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
4093     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
4094     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
4095     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
4096     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
4097     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
4098     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
4099     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
4100     case SHT_MIPS_LINE:          return "MIPS_LINE";
4101     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
4102     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
4103     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
4104     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
4105     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
4106     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
4107     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
4108     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
4109     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
4110     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
4111     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
4112     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
4113     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
4114     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
4115     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
4116     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
4117     case SHT_MIPS_ABIFLAGS:      return "MIPS_ABIFLAGS";
4118     default:
4119       break;
4120     }
4121   return NULL;
4122 }
4123
4124 static const char *
4125 get_parisc_section_type_name (unsigned int sh_type)
4126 {
4127   switch (sh_type)
4128     {
4129     case SHT_PARISC_EXT:        return "PARISC_EXT";
4130     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
4131     case SHT_PARISC_DOC:        return "PARISC_DOC";
4132     case SHT_PARISC_ANNOT:      return "PARISC_ANNOT";
4133     case SHT_PARISC_SYMEXTN:    return "PARISC_SYMEXTN";
4134     case SHT_PARISC_STUBS:      return "PARISC_STUBS";
4135     case SHT_PARISC_DLKM:       return "PARISC_DLKM";
4136     default:                    return NULL;
4137     }
4138 }
4139
4140 static const char *
4141 get_ia64_section_type_name (Filedata * filedata, unsigned int sh_type)
4142 {
4143   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
4144   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
4145     return get_osabi_name (filedata, (sh_type & 0x00FF0000) >> 16);
4146
4147   switch (sh_type)
4148     {
4149     case SHT_IA_64_EXT:                return "IA_64_EXT";
4150     case SHT_IA_64_UNWIND:             return "IA_64_UNWIND";
4151     case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
4152     case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
4153     case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
4154     case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
4155     case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
4156     case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
4157     case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
4158     case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
4159     default:
4160       break;
4161     }
4162   return NULL;
4163 }
4164
4165 static const char *
4166 get_x86_64_section_type_name (unsigned int sh_type)
4167 {
4168   switch (sh_type)
4169     {
4170     case SHT_X86_64_UNWIND:     return "X86_64_UNWIND";
4171     default:                    return NULL;
4172     }
4173 }
4174
4175 static const char *
4176 get_aarch64_section_type_name (unsigned int sh_type)
4177 {
4178   switch (sh_type)
4179     {
4180     case SHT_AARCH64_ATTRIBUTES: return "AARCH64_ATTRIBUTES";
4181     default:                     return NULL;
4182     }
4183 }
4184
4185 static const char *
4186 get_arm_section_type_name (unsigned int sh_type)
4187 {
4188   switch (sh_type)
4189     {
4190     case SHT_ARM_EXIDX:           return "ARM_EXIDX";
4191     case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
4192     case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
4193     case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
4194     case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
4195     default:                      return NULL;
4196     }
4197 }
4198
4199 static const char *
4200 get_tic6x_section_type_name (unsigned int sh_type)
4201 {
4202   switch (sh_type)
4203     {
4204     case SHT_C6000_UNWIND:      return "C6000_UNWIND";
4205     case SHT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
4206     case SHT_C6000_ATTRIBUTES:  return "C6000_ATTRIBUTES";
4207     case SHT_TI_ICODE:          return "TI_ICODE";
4208     case SHT_TI_XREF:           return "TI_XREF";
4209     case SHT_TI_HANDLER:        return "TI_HANDLER";
4210     case SHT_TI_INITINFO:       return "TI_INITINFO";
4211     case SHT_TI_PHATTRS:        return "TI_PHATTRS";
4212     default:                    return NULL;
4213     }
4214 }
4215
4216 static const char *
4217 get_msp430x_section_type_name (unsigned int sh_type)
4218 {
4219   switch (sh_type)
4220     {
4221     case SHT_MSP430_SEC_FLAGS:    return "MSP430_SEC_FLAGS";
4222     case SHT_MSP430_SYM_ALIASES:  return "MSP430_SYM_ALIASES";
4223     case SHT_MSP430_ATTRIBUTES:   return "MSP430_ATTRIBUTES";
4224     default:                      return NULL;
4225     }
4226 }
4227
4228 static const char *
4229 get_nfp_section_type_name (unsigned int sh_type)
4230 {
4231   switch (sh_type)
4232     {
4233     case SHT_NFP_MECONFIG:      return "NFP_MECONFIG";
4234     case SHT_NFP_INITREG:       return "NFP_INITREG";
4235     case SHT_NFP_UDEBUG:        return "NFP_UDEBUG";
4236     default:                    return NULL;
4237     }
4238 }
4239
4240 static const char *
4241 get_v850_section_type_name (unsigned int sh_type)
4242 {
4243   switch (sh_type)
4244     {
4245     case SHT_V850_SCOMMON:  return "V850 Small Common";
4246     case SHT_V850_TCOMMON:  return "V850 Tiny Common";
4247     case SHT_V850_ZCOMMON:  return "V850 Zero Common";
4248     case SHT_RENESAS_IOP:   return "RENESAS IOP";
4249     case SHT_RENESAS_INFO:  return "RENESAS INFO";
4250     default:                return NULL;
4251     }
4252 }
4253
4254 static const char *
4255 get_riscv_section_type_name (unsigned int sh_type)
4256 {
4257   switch (sh_type)
4258     {
4259     case SHT_RISCV_ATTRIBUTES:  return "RISCV_ATTRIBUTES";
4260     default: return NULL;
4261     }
4262 }
4263
4264 static const char *
4265 get_section_type_name (Filedata * filedata, unsigned int sh_type)
4266 {
4267   static char buff[32];
4268   const char * result;
4269
4270   switch (sh_type)
4271     {
4272     case SHT_NULL:              return "NULL";
4273     case SHT_PROGBITS:          return "PROGBITS";
4274     case SHT_SYMTAB:            return "SYMTAB";
4275     case SHT_STRTAB:            return "STRTAB";
4276     case SHT_RELA:              return "RELA";
4277     case SHT_HASH:              return "HASH";
4278     case SHT_DYNAMIC:           return "DYNAMIC";
4279     case SHT_NOTE:              return "NOTE";
4280     case SHT_NOBITS:            return "NOBITS";
4281     case SHT_REL:               return "REL";
4282     case SHT_SHLIB:             return "SHLIB";
4283     case SHT_DYNSYM:            return "DYNSYM";
4284     case SHT_INIT_ARRAY:        return "INIT_ARRAY";
4285     case SHT_FINI_ARRAY:        return "FINI_ARRAY";
4286     case SHT_PREINIT_ARRAY:     return "PREINIT_ARRAY";
4287     case SHT_GNU_HASH:          return "GNU_HASH";
4288     case SHT_GROUP:             return "GROUP";
4289     case SHT_SYMTAB_SHNDX:      return "SYMTAB SECTION INDICES";
4290     case SHT_GNU_verdef:        return "VERDEF";
4291     case SHT_GNU_verneed:       return "VERNEED";
4292     case SHT_GNU_versym:        return "VERSYM";
4293     case 0x6ffffff0:            return "VERSYM";
4294     case 0x6ffffffc:            return "VERDEF";
4295     case 0x7ffffffd:            return "AUXILIARY";
4296     case 0x7fffffff:            return "FILTER";
4297     case SHT_GNU_LIBLIST:       return "GNU_LIBLIST";
4298
4299     default:
4300       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4301         {
4302           switch (filedata->file_header.e_machine)
4303             {
4304             case EM_ARC:
4305             case EM_ARC_COMPACT:
4306             case EM_ARC_COMPACT2:
4307               result = get_arc_section_type_name (sh_type);
4308               break;
4309             case EM_MIPS:
4310             case EM_MIPS_RS3_LE:
4311               result = get_mips_section_type_name (sh_type);
4312               break;
4313             case EM_PARISC:
4314               result = get_parisc_section_type_name (sh_type);
4315               break;
4316             case EM_IA_64:
4317               result = get_ia64_section_type_name (filedata, sh_type);
4318               break;
4319             case EM_X86_64:
4320             case EM_L1OM:
4321             case EM_K1OM:
4322               result = get_x86_64_section_type_name (sh_type);
4323               break;
4324             case EM_AARCH64:
4325               result = get_aarch64_section_type_name (sh_type);
4326               break;
4327             case EM_ARM:
4328               result = get_arm_section_type_name (sh_type);
4329               break;
4330             case EM_TI_C6000:
4331               result = get_tic6x_section_type_name (sh_type);
4332               break;
4333             case EM_MSP430:
4334               result = get_msp430x_section_type_name (sh_type);
4335               break;
4336             case EM_NFP:
4337               result = get_nfp_section_type_name (sh_type);
4338               break;
4339             case EM_V800:
4340             case EM_V850:
4341             case EM_CYGNUS_V850:
4342               result = get_v850_section_type_name (sh_type);
4343               break;
4344             case EM_RISCV:
4345               result = get_riscv_section_type_name (sh_type);
4346               break;
4347             default:
4348               result = NULL;
4349               break;
4350             }
4351
4352           if (result != NULL)
4353             return result;
4354
4355           sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4356         }
4357       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4358         {
4359           switch (filedata->file_header.e_machine)
4360             {
4361             case EM_IA_64:
4362               result = get_ia64_section_type_name (filedata, sh_type);
4363               break;
4364             default:
4365               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4366                 result = get_solaris_section_type (sh_type);
4367               else
4368                 {
4369                   switch (sh_type)
4370                     {
4371                     case SHT_GNU_INCREMENTAL_INPUTS: result = "GNU_INCREMENTAL_INPUTS"; break;
4372                     case SHT_GNU_ATTRIBUTES: result = "GNU_ATTRIBUTES"; break;
4373                     case SHT_GNU_HASH: result = "GNU_HASH"; break;
4374                     case SHT_GNU_LIBLIST: result = "GNU_LIBLIST"; break;
4375                     default:
4376                       result = NULL;
4377                       break;
4378                     }
4379                 }
4380               break;
4381             }
4382
4383           if (result != NULL)
4384             return result;
4385
4386           sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4387         }
4388       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4389         {
4390           switch (filedata->file_header.e_machine)
4391             {
4392             case EM_V800:
4393             case EM_V850:
4394             case EM_CYGNUS_V850:
4395               result = get_v850_section_type_name (sh_type);
4396               break;
4397             default:
4398               result = NULL;
4399               break;
4400             }
4401
4402           if (result != NULL)
4403             return result;
4404
4405           sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4406         }
4407       else
4408         /* This message is probably going to be displayed in a 15
4409            character wide field, so put the hex value first.  */
4410         snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4411
4412       return buff;
4413     }
4414 }
4415
4416 #define OPTION_DEBUG_DUMP       512
4417 #define OPTION_DYN_SYMS         513
4418 #define OPTION_DWARF_DEPTH      514
4419 #define OPTION_DWARF_START      515
4420 #define OPTION_DWARF_CHECK      516
4421 #define OPTION_CTF_DUMP         517
4422 #define OPTION_CTF_PARENT       518
4423 #define OPTION_CTF_SYMBOLS      519
4424 #define OPTION_CTF_STRINGS      520
4425
4426 static struct option options[] =
4427 {
4428   {"all",              no_argument, 0, 'a'},
4429   {"file-header",      no_argument, 0, 'h'},
4430   {"program-headers",  no_argument, 0, 'l'},
4431   {"headers",          no_argument, 0, 'e'},
4432   {"histogram",        no_argument, 0, 'I'},
4433   {"segments",         no_argument, 0, 'l'},
4434   {"sections",         no_argument, 0, 'S'},
4435   {"section-headers",  no_argument, 0, 'S'},
4436   {"section-groups",   no_argument, 0, 'g'},
4437   {"section-details",  no_argument, 0, 't'},
4438   {"full-section-name",no_argument, 0, 'N'},
4439   {"symbols",          no_argument, 0, 's'},
4440   {"syms",             no_argument, 0, 's'},
4441   {"dyn-syms",         no_argument, 0, OPTION_DYN_SYMS},
4442   {"relocs",           no_argument, 0, 'r'},
4443   {"notes",            no_argument, 0, 'n'},
4444   {"dynamic",          no_argument, 0, 'd'},
4445   {"arch-specific",    no_argument, 0, 'A'},
4446   {"version-info",     no_argument, 0, 'V'},
4447   {"use-dynamic",      no_argument, 0, 'D'},
4448   {"unwind",           no_argument, 0, 'u'},
4449   {"archive-index",    no_argument, 0, 'c'},
4450   {"hex-dump",         required_argument, 0, 'x'},
4451   {"relocated-dump",   required_argument, 0, 'R'},
4452   {"string-dump",      required_argument, 0, 'p'},
4453   {"decompress",       no_argument, 0, 'z'},
4454 #ifdef SUPPORT_DISASSEMBLY
4455   {"instruction-dump", required_argument, 0, 'i'},
4456 #endif
4457   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
4458
4459   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
4460   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
4461   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
4462
4463   {"ctf",              required_argument, 0, OPTION_CTF_DUMP},
4464
4465   {"ctf-symbols",      required_argument, 0, OPTION_CTF_SYMBOLS},
4466   {"ctf-strings",      required_argument, 0, OPTION_CTF_STRINGS},
4467   {"ctf-parent",       required_argument, 0, OPTION_CTF_PARENT},
4468
4469   {"version",          no_argument, 0, 'v'},
4470   {"wide",             no_argument, 0, 'W'},
4471   {"help",             no_argument, 0, 'H'},
4472   {0,                  no_argument, 0, 0}
4473 };
4474
4475 static void
4476 usage (FILE * stream)
4477 {
4478   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4479   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4480   fprintf (stream, _(" Options are:\n\
4481   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4482   -h --file-header       Display the ELF file header\n\
4483   -l --program-headers   Display the program headers\n\
4484      --segments          An alias for --program-headers\n\
4485   -S --section-headers   Display the sections' header\n\
4486      --sections          An alias for --section-headers\n\
4487   -g --section-groups    Display the section groups\n\
4488   -t --section-details   Display the section details\n\
4489   -e --headers           Equivalent to: -h -l -S\n\
4490   -s --syms              Display the symbol table\n\
4491      --symbols           An alias for --syms\n\
4492   --dyn-syms             Display the dynamic symbol table\n\
4493   -n --notes             Display the core notes (if present)\n\
4494   -r --relocs            Display the relocations (if present)\n\
4495   -u --unwind            Display the unwind info (if present)\n\
4496   -d --dynamic           Display the dynamic section (if present)\n\
4497   -V --version-info      Display the version sections (if present)\n\
4498   -A --arch-specific     Display architecture specific information (if any)\n\
4499   -c --archive-index     Display the symbol/file index in an archive\n\
4500   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
4501   -x --hex-dump=<number|name>\n\
4502                          Dump the contents of section <number|name> as bytes\n\
4503   -p --string-dump=<number|name>\n\
4504                          Dump the contents of section <number|name> as strings\n\
4505   -R --relocated-dump=<number|name>\n\
4506                          Dump the contents of section <number|name> as relocated bytes\n\
4507   -z --decompress        Decompress section before dumping it\n\
4508   -w[lLiaprmfFsoRtUuTgAckK] or\n\
4509   --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4510                =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4511                =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4512                =addr,=cu_index,=links,=follow-links]\n\
4513                          Display the contents of DWARF debug sections\n"));
4514   fprintf (stream, _("\
4515   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
4516   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
4517                          or deeper\n"));
4518   fprintf (stream, _("\
4519   --ctf=<number|name>    Display CTF info from section <number|name>\n\
4520   --ctf-parent=<number|name>\n\
4521                          Use section <number|name> as the CTF parent\n\n\
4522   --ctf-symbols=<number|name>\n\
4523                          Use section <number|name> as the CTF external symtab\n\n\
4524   --ctf-strings=<number|name>\n\
4525                          Use section <number|name> as the CTF external strtab\n\n"));
4526
4527 #ifdef SUPPORT_DISASSEMBLY
4528   fprintf (stream, _("\
4529   -i --instruction-dump=<number|name>\n\
4530                          Disassemble the contents of section <number|name>\n"));
4531 #endif
4532   fprintf (stream, _("\
4533   -I --histogram         Display histogram of bucket list lengths\n\
4534   -W --wide              Allow output width to exceed 80 characters\n\
4535   @<file>                Read options from <file>\n\
4536   -H --help              Display this information\n\
4537   -v --version           Display the version number of readelf\n"));
4538
4539   if (REPORT_BUGS_TO[0] && stream == stdout)
4540     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4541
4542   exit (stream == stdout ? 0 : 1);
4543 }
4544
4545 /* Record the fact that the user wants the contents of section number
4546    SECTION to be displayed using the method(s) encoded as flags bits
4547    in TYPE.  Note, TYPE can be zero if we are creating the array for
4548    the first time.  */
4549
4550 static void
4551 request_dump_bynumber (Filedata * filedata, unsigned int section, dump_type type)
4552 {
4553   if (section >= filedata->num_dump_sects)
4554     {
4555       dump_type * new_dump_sects;
4556
4557       new_dump_sects = (dump_type *) calloc (section + 1,
4558                                              sizeof (* new_dump_sects));
4559
4560       if (new_dump_sects == NULL)
4561         error (_("Out of memory allocating dump request table.\n"));
4562       else
4563         {
4564           if (filedata->dump_sects)
4565             {
4566               /* Copy current flag settings.  */
4567               memcpy (new_dump_sects, filedata->dump_sects,
4568                       filedata->num_dump_sects * sizeof (* new_dump_sects));
4569
4570               free (filedata->dump_sects);
4571             }
4572
4573           filedata->dump_sects = new_dump_sects;
4574           filedata->num_dump_sects = section + 1;
4575         }
4576     }
4577
4578   if (filedata->dump_sects)
4579     filedata->dump_sects[section] |= type;
4580 }
4581
4582 /* Request a dump by section name.  */
4583
4584 static void
4585 request_dump_byname (const char * section, dump_type type)
4586 {
4587   struct dump_list_entry * new_request;
4588
4589   new_request = (struct dump_list_entry *)
4590       malloc (sizeof (struct dump_list_entry));
4591   if (!new_request)
4592     error (_("Out of memory allocating dump request table.\n"));
4593
4594   new_request->name = strdup (section);
4595   if (!new_request->name)
4596     error (_("Out of memory allocating dump request table.\n"));
4597
4598   new_request->type = type;
4599
4600   new_request->next = dump_sects_byname;
4601   dump_sects_byname = new_request;
4602 }
4603
4604 static inline void
4605 request_dump (Filedata * filedata, dump_type type)
4606 {
4607   int section;
4608   char * cp;
4609
4610   do_dump++;
4611   section = strtoul (optarg, & cp, 0);
4612
4613   if (! *cp && section >= 0)
4614     request_dump_bynumber (filedata, section, type);
4615   else
4616     request_dump_byname (optarg, type);
4617 }
4618
4619 static void
4620 parse_args (Filedata * filedata, int argc, char ** argv)
4621 {
4622   int c;
4623
4624   if (argc < 2)
4625     usage (stderr);
4626
4627   while ((c = getopt_long
4628           (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4629     {
4630       switch (c)
4631         {
4632         case 0:
4633           /* Long options.  */
4634           break;
4635         case 'H':
4636           usage (stdout);
4637           break;
4638
4639         case 'a':
4640           do_syms = TRUE;
4641           do_reloc = TRUE;
4642           do_unwind = TRUE;
4643           do_dynamic = TRUE;
4644           do_header = TRUE;
4645           do_sections = TRUE;
4646           do_section_groups = TRUE;
4647           do_segments = TRUE;
4648           do_version = TRUE;
4649           do_histogram = TRUE;
4650           do_arch = TRUE;
4651           do_notes = TRUE;
4652           break;
4653         case 'g':
4654           do_section_groups = TRUE;
4655           break;
4656         case 't':
4657         case 'N':
4658           do_sections = TRUE;
4659           do_section_details = TRUE;
4660           break;
4661         case 'e':
4662           do_header = TRUE;
4663           do_sections = TRUE;
4664           do_segments = TRUE;
4665           break;
4666         case 'A':
4667           do_arch = TRUE;
4668           break;
4669         case 'D':
4670           do_using_dynamic = TRUE;
4671           break;
4672         case 'r':
4673           do_reloc = TRUE;
4674           break;
4675         case 'u':
4676           do_unwind = TRUE;
4677           break;
4678         case 'h':
4679           do_header = TRUE;
4680           break;
4681         case 'l':
4682           do_segments = TRUE;
4683           break;
4684         case 's':
4685           do_syms = TRUE;
4686           break;
4687         case 'S':
4688           do_sections = TRUE;
4689           break;
4690         case 'd':
4691           do_dynamic = TRUE;
4692           break;
4693         case 'I':
4694           do_histogram = TRUE;
4695           break;
4696         case 'n':
4697           do_notes = TRUE;
4698           break;
4699         case 'c':
4700           do_archive_index = TRUE;
4701           break;
4702         case 'x':
4703           request_dump (filedata, HEX_DUMP);
4704           break;
4705         case 'p':
4706           request_dump (filedata, STRING_DUMP);
4707           break;
4708         case 'R':
4709           request_dump (filedata, RELOC_DUMP);
4710           break;
4711         case 'z':
4712           decompress_dumps = TRUE;
4713           break;
4714         case 'w':
4715           do_dump = TRUE;
4716           if (optarg == 0)
4717             {
4718               do_debugging = TRUE;
4719               dwarf_select_sections_all ();
4720             }
4721           else
4722             {
4723               do_debugging = FALSE;
4724               dwarf_select_sections_by_letters (optarg);
4725             }
4726           break;
4727         case OPTION_DEBUG_DUMP:
4728           do_dump = TRUE;
4729           if (optarg == 0)
4730             do_debugging = TRUE;
4731           else
4732             {
4733               do_debugging = FALSE;
4734               dwarf_select_sections_by_names (optarg);
4735             }
4736           break;
4737         case OPTION_DWARF_DEPTH:
4738           {
4739             char *cp;
4740
4741             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4742           }
4743           break;
4744         case OPTION_DWARF_START:
4745           {
4746             char *cp;
4747
4748             dwarf_start_die = strtoul (optarg, & cp, 0);
4749           }
4750           break;
4751         case OPTION_DWARF_CHECK:
4752           dwarf_check = TRUE;
4753           break;
4754         case OPTION_CTF_DUMP:
4755           do_ctf = TRUE;
4756           request_dump (filedata, CTF_DUMP);
4757           break;
4758         case OPTION_CTF_SYMBOLS:
4759           dump_ctf_symtab_name = strdup (optarg);
4760           break;
4761         case OPTION_CTF_STRINGS:
4762           dump_ctf_strtab_name = strdup (optarg);
4763           break;
4764         case OPTION_CTF_PARENT:
4765           dump_ctf_parent_name = strdup (optarg);
4766           break;
4767         case OPTION_DYN_SYMS:
4768           do_dyn_syms = TRUE;
4769           break;
4770 #ifdef SUPPORT_DISASSEMBLY
4771         case 'i':
4772           request_dump (filedata, DISASS_DUMP);
4773           break;
4774 #endif
4775         case 'v':
4776           print_version (program_name);
4777           break;
4778         case 'V':
4779           do_version = TRUE;
4780           break;
4781         case 'W':
4782           do_wide = TRUE;
4783           break;
4784         default:
4785           /* xgettext:c-format */
4786           error (_("Invalid option '-%c'\n"), c);
4787           /* Fall through.  */
4788         case '?':
4789           usage (stderr);
4790         }
4791     }
4792
4793   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4794       && !do_segments && !do_header && !do_dump && !do_version
4795       && !do_histogram && !do_debugging && !do_arch && !do_notes
4796       && !do_section_groups && !do_archive_index
4797       && !do_dyn_syms)
4798     usage (stderr);
4799 }
4800
4801 static const char *
4802 get_elf_class (unsigned int elf_class)
4803 {
4804   static char buff[32];
4805
4806   switch (elf_class)
4807     {
4808     case ELFCLASSNONE: return _("none");
4809     case ELFCLASS32:   return "ELF32";
4810     case ELFCLASS64:   return "ELF64";
4811     default:
4812       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4813       return buff;
4814     }
4815 }
4816
4817 static const char *
4818 get_data_encoding (unsigned int encoding)
4819 {
4820   static char buff[32];
4821
4822   switch (encoding)
4823     {
4824     case ELFDATANONE: return _("none");
4825     case ELFDATA2LSB: return _("2's complement, little endian");
4826     case ELFDATA2MSB: return _("2's complement, big endian");
4827     default:
4828       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4829       return buff;
4830     }
4831 }
4832
4833 /* Decode the data held in 'filedata->file_header'.  */
4834
4835 static bfd_boolean
4836 process_file_header (Filedata * filedata)
4837 {
4838   Elf_Internal_Ehdr * header = & filedata->file_header;
4839
4840   if (   header->e_ident[EI_MAG0] != ELFMAG0
4841       || header->e_ident[EI_MAG1] != ELFMAG1
4842       || header->e_ident[EI_MAG2] != ELFMAG2
4843       || header->e_ident[EI_MAG3] != ELFMAG3)
4844     {
4845       error
4846         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4847       return FALSE;
4848     }
4849
4850   init_dwarf_regnames (header->e_machine);
4851
4852   if (do_header)
4853     {
4854       unsigned i;
4855
4856       printf (_("ELF Header:\n"));
4857       printf (_("  Magic:   "));
4858       for (i = 0; i < EI_NIDENT; i++)
4859         printf ("%2.2x ", header->e_ident[i]);
4860       printf ("\n");
4861       printf (_("  Class:                             %s\n"),
4862               get_elf_class (header->e_ident[EI_CLASS]));
4863       printf (_("  Data:                              %s\n"),
4864               get_data_encoding (header->e_ident[EI_DATA]));
4865       printf (_("  Version:                           %d%s\n"),
4866               header->e_ident[EI_VERSION],
4867               (header->e_ident[EI_VERSION] == EV_CURRENT
4868                ? _(" (current)")
4869                : (header->e_ident[EI_VERSION] != EV_NONE
4870                   ? _(" <unknown>")
4871                   : "")));
4872       printf (_("  OS/ABI:                            %s\n"),
4873               get_osabi_name (filedata, header->e_ident[EI_OSABI]));
4874       printf (_("  ABI Version:                       %d\n"),
4875               header->e_ident[EI_ABIVERSION]);
4876       printf (_("  Type:                              %s\n"),
4877               get_file_type (header->e_type));
4878       printf (_("  Machine:                           %s\n"),
4879               get_machine_name (header->e_machine));
4880       printf (_("  Version:                           0x%lx\n"),
4881               header->e_version);
4882
4883       printf (_("  Entry point address:               "));
4884       print_vma (header->e_entry, PREFIX_HEX);
4885       printf (_("\n  Start of program headers:          "));
4886       print_vma (header->e_phoff, DEC);
4887       printf (_(" (bytes into file)\n  Start of section headers:          "));
4888       print_vma (header->e_shoff, DEC);
4889       printf (_(" (bytes into file)\n"));
4890
4891       printf (_("  Flags:                             0x%lx%s\n"),
4892               header->e_flags,
4893               get_machine_flags (filedata, header->e_flags, header->e_machine));
4894       printf (_("  Size of this header:               %u (bytes)\n"),
4895               header->e_ehsize);
4896       printf (_("  Size of program headers:           %u (bytes)\n"),
4897               header->e_phentsize);
4898       printf (_("  Number of program headers:         %u"),
4899               header->e_phnum);
4900       if (filedata->section_headers != NULL
4901           && header->e_phnum == PN_XNUM
4902           && filedata->section_headers[0].sh_info != 0)
4903         {
4904           header->e_phnum = filedata->section_headers[0].sh_info;
4905           printf (" (%u)", header->e_phnum);
4906         }
4907       putc ('\n', stdout);
4908       printf (_("  Size of section headers:           %u (bytes)\n"),
4909               header->e_shentsize);
4910       printf (_("  Number of section headers:         %u"),
4911               header->e_shnum);
4912       if (filedata->section_headers != NULL && header->e_shnum == SHN_UNDEF)
4913         {
4914           header->e_shnum = filedata->section_headers[0].sh_size;
4915           printf (" (%u)", header->e_shnum);
4916         }
4917       putc ('\n', stdout);
4918       printf (_("  Section header string table index: %u"),
4919               header->e_shstrndx);
4920       if (filedata->section_headers != NULL
4921           && header->e_shstrndx == (SHN_XINDEX & 0xffff))
4922         {
4923           header->e_shstrndx = filedata->section_headers[0].sh_link;
4924           printf (" (%u)", header->e_shstrndx);
4925         }
4926       if (header->e_shstrndx != SHN_UNDEF
4927           && header->e_shstrndx >= header->e_shnum)
4928         {
4929           header->e_shstrndx = SHN_UNDEF;
4930           printf (_(" <corrupt: out of range>"));
4931         }
4932       putc ('\n', stdout);
4933     }
4934
4935   if (filedata->section_headers != NULL)
4936     {
4937       if (header->e_phnum == PN_XNUM
4938           && filedata->section_headers[0].sh_info != 0)
4939         header->e_phnum = filedata->section_headers[0].sh_info;
4940       if (header->e_shnum == SHN_UNDEF)
4941         header->e_shnum = filedata->section_headers[0].sh_size;
4942       if (header->e_shstrndx == (SHN_XINDEX & 0xffff))
4943         header->e_shstrndx = filedata->section_headers[0].sh_link;
4944       if (header->e_shstrndx >= header->e_shnum)
4945         header->e_shstrndx = SHN_UNDEF;
4946       free (filedata->section_headers);
4947       filedata->section_headers = NULL;
4948     }
4949
4950   return TRUE;
4951 }
4952
4953 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4954    Returns TRUE upon success, FALSE otherwise.  Loads 32-bit headers.  */
4955
4956 static bfd_boolean
4957 get_32bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4958 {
4959   Elf32_External_Phdr * phdrs;
4960   Elf32_External_Phdr * external;
4961   Elf_Internal_Phdr *   internal;
4962   unsigned int i;
4963   unsigned int size = filedata->file_header.e_phentsize;
4964   unsigned int num  = filedata->file_header.e_phnum;
4965
4966   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4967   if (size == 0 || num == 0)
4968     return FALSE;
4969   if (size < sizeof * phdrs)
4970     {
4971       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4972       return FALSE;
4973     }
4974   if (size > sizeof * phdrs)
4975     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4976
4977   phdrs = (Elf32_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4978                                             size, num, _("program headers"));
4979   if (phdrs == NULL)
4980     return FALSE;
4981
4982   for (i = 0, internal = pheaders, external = phdrs;
4983        i < filedata->file_header.e_phnum;
4984        i++, internal++, external++)
4985     {
4986       internal->p_type   = BYTE_GET (external->p_type);
4987       internal->p_offset = BYTE_GET (external->p_offset);
4988       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4989       internal->p_paddr  = BYTE_GET (external->p_paddr);
4990       internal->p_filesz = BYTE_GET (external->p_filesz);
4991       internal->p_memsz  = BYTE_GET (external->p_memsz);
4992       internal->p_flags  = BYTE_GET (external->p_flags);
4993       internal->p_align  = BYTE_GET (external->p_align);
4994     }
4995
4996   free (phdrs);
4997   return TRUE;
4998 }
4999
5000 /* Read in the program headers from FILEDATA and store them in PHEADERS.
5001    Returns TRUE upon success, FALSE otherwise.  Loads 64-bit headers.  */
5002
5003 static bfd_boolean
5004 get_64bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
5005 {
5006   Elf64_External_Phdr * phdrs;
5007   Elf64_External_Phdr * external;
5008   Elf_Internal_Phdr *   internal;
5009   unsigned int i;
5010   unsigned int size = filedata->file_header.e_phentsize;
5011   unsigned int num  = filedata->file_header.e_phnum;
5012
5013   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5014   if (size == 0 || num == 0)
5015     return FALSE;
5016   if (size < sizeof * phdrs)
5017     {
5018       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
5019       return FALSE;
5020     }
5021   if (size > sizeof * phdrs)
5022     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
5023
5024   phdrs = (Elf64_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
5025                                             size, num, _("program headers"));
5026   if (!phdrs)
5027     return FALSE;
5028
5029   for (i = 0, internal = pheaders, external = phdrs;
5030        i < filedata->file_header.e_phnum;
5031        i++, internal++, external++)
5032     {
5033       internal->p_type   = BYTE_GET (external->p_type);
5034       internal->p_flags  = BYTE_GET (external->p_flags);
5035       internal->p_offset = BYTE_GET (external->p_offset);
5036       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
5037       internal->p_paddr  = BYTE_GET (external->p_paddr);
5038       internal->p_filesz = BYTE_GET (external->p_filesz);
5039       internal->p_memsz  = BYTE_GET (external->p_memsz);
5040       internal->p_align  = BYTE_GET (external->p_align);
5041     }
5042
5043   free (phdrs);
5044   return TRUE;
5045 }
5046
5047 /* Returns TRUE if the program headers were read into `program_headers'.  */
5048
5049 static bfd_boolean
5050 get_program_headers (Filedata * filedata)
5051 {
5052   Elf_Internal_Phdr * phdrs;
5053
5054   /* Check cache of prior read.  */
5055   if (filedata->program_headers != NULL)
5056     return TRUE;
5057
5058   /* Be kind to memory checkers by looking for
5059      e_phnum values which we know must be invalid.  */
5060   if (filedata->file_header.e_phnum
5061       * (is_32bit_elf ? sizeof (Elf32_External_Phdr) : sizeof (Elf64_External_Phdr))
5062       >= filedata->file_size)
5063     {
5064       error (_("Too many program headers - %#x - the file is not that big\n"),
5065              filedata->file_header.e_phnum);
5066       return FALSE;
5067     }
5068
5069   phdrs = (Elf_Internal_Phdr *) cmalloc (filedata->file_header.e_phnum,
5070                                          sizeof (Elf_Internal_Phdr));
5071   if (phdrs == NULL)
5072     {
5073       error (_("Out of memory reading %u program headers\n"),
5074              filedata->file_header.e_phnum);
5075       return FALSE;
5076     }
5077
5078   if (is_32bit_elf
5079       ? get_32bit_program_headers (filedata, phdrs)
5080       : get_64bit_program_headers (filedata, phdrs))
5081     {
5082       filedata->program_headers = phdrs;
5083       return TRUE;
5084     }
5085
5086   free (phdrs);
5087   return FALSE;
5088 }
5089
5090 /* Returns TRUE if the program headers were loaded.  */
5091
5092 static bfd_boolean
5093 process_program_headers (Filedata * filedata)
5094 {
5095   Elf_Internal_Phdr * segment;
5096   unsigned int i;
5097   Elf_Internal_Phdr * previous_load = NULL;
5098
5099   if (filedata->file_header.e_phnum == 0)
5100     {
5101       /* PR binutils/12467.  */
5102       if (filedata->file_header.e_phoff != 0)
5103         {
5104           warn (_("possibly corrupt ELF header - it has a non-zero program"
5105                   " header offset, but no program headers\n"));
5106           return FALSE;
5107         }
5108       else if (do_segments)
5109         printf (_("\nThere are no program headers in this file.\n"));
5110       return TRUE;
5111     }
5112
5113   if (do_segments && !do_header)
5114     {
5115       printf (_("\nElf file type is %s\n"), get_file_type (filedata->file_header.e_type));
5116       printf (_("Entry point 0x%s\n"), bfd_vmatoa ("x", filedata->file_header.e_entry));
5117       printf (ngettext ("There is %d program header, starting at offset %s\n",
5118                         "There are %d program headers, starting at offset %s\n",
5119                         filedata->file_header.e_phnum),
5120               filedata->file_header.e_phnum,
5121               bfd_vmatoa ("u", filedata->file_header.e_phoff));
5122     }
5123
5124   if (! get_program_headers (filedata))
5125     return TRUE;
5126
5127   if (do_segments)
5128     {
5129       if (filedata->file_header.e_phnum > 1)
5130         printf (_("\nProgram Headers:\n"));
5131       else
5132         printf (_("\nProgram Headers:\n"));
5133
5134       if (is_32bit_elf)
5135         printf
5136           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
5137       else if (do_wide)
5138         printf
5139           (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
5140       else
5141         {
5142           printf
5143             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
5144           printf
5145             (_("                 FileSiz            MemSiz              Flags  Align\n"));
5146         }
5147     }
5148
5149   dynamic_addr = 0;
5150   dynamic_size = 0;
5151
5152   for (i = 0, segment = filedata->program_headers;
5153        i < filedata->file_header.e_phnum;
5154        i++, segment++)
5155     {
5156       if (do_segments)
5157         {
5158           printf ("  %-14.14s ", get_segment_type (filedata, segment->p_type));
5159
5160           if (is_32bit_elf)
5161             {
5162               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5163               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
5164               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
5165               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
5166               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
5167               printf ("%c%c%c ",
5168                       (segment->p_flags & PF_R ? 'R' : ' '),
5169                       (segment->p_flags & PF_W ? 'W' : ' '),
5170                       (segment->p_flags & PF_X ? 'E' : ' '));
5171               printf ("%#lx", (unsigned long) segment->p_align);
5172             }
5173           else if (do_wide)
5174             {
5175               if ((unsigned long) segment->p_offset == segment->p_offset)
5176                 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5177               else
5178                 {
5179                   print_vma (segment->p_offset, FULL_HEX);
5180                   putchar (' ');
5181                 }
5182
5183               print_vma (segment->p_vaddr, FULL_HEX);
5184               putchar (' ');
5185               print_vma (segment->p_paddr, FULL_HEX);
5186               putchar (' ');
5187
5188               if ((unsigned long) segment->p_filesz == segment->p_filesz)
5189                 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
5190               else
5191                 {
5192                   print_vma (segment->p_filesz, FULL_HEX);
5193                   putchar (' ');
5194                 }
5195
5196               if ((unsigned long) segment->p_memsz == segment->p_memsz)
5197                 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
5198               else
5199                 {
5200                   print_vma (segment->p_memsz, FULL_HEX);
5201                 }
5202
5203               printf (" %c%c%c ",
5204                       (segment->p_flags & PF_R ? 'R' : ' '),
5205                       (segment->p_flags & PF_W ? 'W' : ' '),
5206                       (segment->p_flags & PF_X ? 'E' : ' '));
5207
5208               if ((unsigned long) segment->p_align == segment->p_align)
5209                 printf ("%#lx", (unsigned long) segment->p_align);
5210               else
5211                 {
5212                   print_vma (segment->p_align, PREFIX_HEX);
5213                 }
5214             }
5215           else
5216             {
5217               print_vma (segment->p_offset, FULL_HEX);
5218               putchar (' ');
5219               print_vma (segment->p_vaddr, FULL_HEX);
5220               putchar (' ');
5221               print_vma (segment->p_paddr, FULL_HEX);
5222               printf ("\n                 ");
5223               print_vma (segment->p_filesz, FULL_HEX);
5224               putchar (' ');
5225               print_vma (segment->p_memsz, FULL_HEX);
5226               printf ("  %c%c%c    ",
5227                       (segment->p_flags & PF_R ? 'R' : ' '),
5228                       (segment->p_flags & PF_W ? 'W' : ' '),
5229                       (segment->p_flags & PF_X ? 'E' : ' '));
5230               print_vma (segment->p_align, PREFIX_HEX);
5231             }
5232
5233           putc ('\n', stdout);
5234         }
5235
5236       switch (segment->p_type)
5237         {
5238         case PT_LOAD:
5239 #if 0 /* Do not warn about out of order PT_LOAD segments.  Although officially
5240          required by the ELF standard, several programs, including the Linux
5241          kernel, make use of non-ordered segments.  */
5242           if (previous_load
5243               && previous_load->p_vaddr > segment->p_vaddr)
5244             error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
5245 #endif
5246           if (segment->p_memsz < segment->p_filesz)
5247             error (_("the segment's file size is larger than its memory size\n"));
5248           previous_load = segment;
5249           break;
5250
5251         case PT_PHDR:
5252           /* PR 20815 - Verify that the program header is loaded into memory.  */
5253           if (i > 0 && previous_load != NULL)
5254             error (_("the PHDR segment must occur before any LOAD segment\n"));
5255           if (filedata->file_header.e_machine != EM_PARISC)
5256             {
5257               unsigned int j;
5258
5259               for (j = 1; j < filedata->file_header.e_phnum; j++)
5260                 if (filedata->program_headers[j].p_vaddr <= segment->p_vaddr
5261                     && (filedata->program_headers[j].p_vaddr
5262                         + filedata->program_headers[j].p_memsz)
5263                     >= (segment->p_vaddr + segment->p_filesz))
5264                   break;
5265               if (j == filedata->file_header.e_phnum)
5266                 error (_("the PHDR segment is not covered by a LOAD segment\n"));
5267             }
5268           break;
5269
5270         case PT_DYNAMIC:
5271           if (dynamic_addr)
5272             error (_("more than one dynamic segment\n"));
5273
5274           /* By default, assume that the .dynamic section is the first
5275              section in the DYNAMIC segment.  */
5276           dynamic_addr = segment->p_offset;
5277           dynamic_size = segment->p_filesz;
5278
5279           /* Try to locate the .dynamic section. If there is
5280              a section header table, we can easily locate it.  */
5281           if (filedata->section_headers != NULL)
5282             {
5283               Elf_Internal_Shdr * sec;
5284
5285               sec = find_section (filedata, ".dynamic");
5286               if (sec == NULL || sec->sh_size == 0)
5287                 {
5288                   /* A corresponding .dynamic section is expected, but on
5289                      IA-64/OpenVMS it is OK for it to be missing.  */
5290                   if (!is_ia64_vms (filedata))
5291                     error (_("no .dynamic section in the dynamic segment\n"));
5292                   break;
5293                 }
5294
5295               if (sec->sh_type == SHT_NOBITS)
5296                 {
5297                   dynamic_size = 0;
5298                   break;
5299                 }
5300
5301               dynamic_addr = sec->sh_offset;
5302               dynamic_size = sec->sh_size;
5303
5304               if (dynamic_addr < segment->p_offset
5305                   || dynamic_addr > segment->p_offset + segment->p_filesz)
5306                 warn (_("the .dynamic section is not contained"
5307                         " within the dynamic segment\n"));
5308               else if (dynamic_addr > segment->p_offset)
5309                 warn (_("the .dynamic section is not the first section"
5310                         " in the dynamic segment.\n"));
5311             }
5312
5313           /* PR binutils/17512: Avoid corrupt dynamic section info in the
5314              segment.  Check this after matching against the section headers
5315              so we don't warn on debuginfo file (which have NOBITS .dynamic
5316              sections).  */
5317           if (dynamic_addr > filedata->file_size
5318               || dynamic_size > filedata->file_size - dynamic_addr)
5319             {
5320               error (_("the dynamic segment offset + size exceeds the size of the file\n"));
5321               dynamic_addr = dynamic_size = 0;
5322             }
5323           break;
5324
5325         case PT_INTERP:
5326           if (fseek (filedata->handle, archive_file_offset + (long) segment->p_offset,
5327                      SEEK_SET))
5328             error (_("Unable to find program interpreter name\n"));
5329           else
5330             {
5331               char fmt [32];
5332               int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
5333
5334               if (ret >= (int) sizeof (fmt) || ret < 0)
5335                 error (_("Internal error: failed to create format string to display program interpreter\n"));
5336
5337               program_interpreter[0] = 0;
5338               if (fscanf (filedata->handle, fmt, program_interpreter) <= 0)
5339                 error (_("Unable to read program interpreter name\n"));
5340
5341               if (do_segments)
5342                 printf (_("      [Requesting program interpreter: %s]\n"),
5343                     program_interpreter);
5344             }
5345           break;
5346         }
5347     }
5348
5349   if (do_segments
5350       && filedata->section_headers != NULL
5351       && filedata->string_table != NULL)
5352     {
5353       printf (_("\n Section to Segment mapping:\n"));
5354       printf (_("  Segment Sections...\n"));
5355
5356       for (i = 0; i < filedata->file_header.e_phnum; i++)
5357         {
5358           unsigned int j;
5359           Elf_Internal_Shdr * section;
5360
5361           segment = filedata->program_headers + i;
5362           section = filedata->section_headers + 1;
5363
5364           printf ("   %2.2d     ", i);
5365
5366           for (j = 1; j < filedata->file_header.e_shnum; j++, section++)
5367             {
5368               if (!ELF_TBSS_SPECIAL (section, segment)
5369                   && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
5370                 printf ("%s ", printable_section_name (filedata, section));
5371             }
5372
5373           putc ('\n',stdout);
5374         }
5375     }
5376
5377   return TRUE;
5378 }
5379
5380
5381 /* Find the file offset corresponding to VMA by using the program headers.  */
5382
5383 static long
5384 offset_from_vma (Filedata * filedata, bfd_vma vma, bfd_size_type size)
5385 {
5386   Elf_Internal_Phdr * seg;
5387
5388   if (! get_program_headers (filedata))
5389     {
5390       warn (_("Cannot interpret virtual addresses without program headers.\n"));
5391       return (long) vma;
5392     }
5393
5394   for (seg = filedata->program_headers;
5395        seg < filedata->program_headers + filedata->file_header.e_phnum;
5396        ++seg)
5397     {
5398       if (seg->p_type != PT_LOAD)
5399         continue;
5400
5401       if (vma >= (seg->p_vaddr & -seg->p_align)
5402           && vma + size <= seg->p_vaddr + seg->p_filesz)
5403         return vma - seg->p_vaddr + seg->p_offset;
5404     }
5405
5406   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
5407         (unsigned long) vma);
5408   return (long) vma;
5409 }
5410
5411
5412 /* Allocate memory and load the sections headers into FILEDATA->filedata->section_headers.
5413    If PROBE is true, this is just a probe and we do not generate any error
5414    messages if the load fails.  */
5415
5416 static bfd_boolean
5417 get_32bit_section_headers (Filedata * filedata, bfd_boolean probe)
5418 {
5419   Elf32_External_Shdr * shdrs;
5420   Elf_Internal_Shdr *   internal;
5421   unsigned int          i;
5422   unsigned int          size = filedata->file_header.e_shentsize;
5423   unsigned int          num = probe ? 1 : filedata->file_header.e_shnum;
5424
5425   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5426   if (size == 0 || num == 0)
5427     return FALSE;
5428   if (size < sizeof * shdrs)
5429     {
5430       if (! probe)
5431         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5432       return FALSE;
5433     }
5434   if (!probe && size > sizeof * shdrs)
5435     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5436
5437   shdrs = (Elf32_External_Shdr *) get_data (NULL, filedata, filedata->file_header.e_shoff,
5438                                             size, num,
5439                                             probe ? NULL : _("section headers"));
5440   if (shdrs == NULL)
5441     return FALSE;
5442
5443   free (filedata->section_headers);
5444   filedata->section_headers = (Elf_Internal_Shdr *)
5445     cmalloc (num, sizeof (Elf_Internal_Shdr));
5446   if (filedata->section_headers == NULL)
5447     {
5448       if (!probe)
5449         error (_("Out of memory reading %u section headers\n"), num);
5450       free (shdrs);
5451       return FALSE;
5452     }
5453
5454   for (i = 0, internal = filedata->section_headers;
5455        i < num;
5456        i++, internal++)
5457     {
5458       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5459       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5460       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5461       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5462       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5463       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5464       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5465       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5466       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5467       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5468       if (!probe && internal->sh_link > num)
5469         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5470       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5471         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5472     }
5473
5474   free (shdrs);
5475   return TRUE;
5476 }
5477
5478 /* Like get_32bit_section_headers, except that it fetches 64-bit headers.  */
5479
5480 static bfd_boolean
5481 get_64bit_section_headers (Filedata * filedata, bfd_boolean probe)
5482 {
5483   Elf64_External_Shdr *  shdrs;
5484   Elf_Internal_Shdr *    internal;
5485   unsigned int           i;
5486   unsigned int           size = filedata->file_header.e_shentsize;
5487   unsigned int           num = probe ? 1 : filedata->file_header.e_shnum;
5488
5489   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5490   if (size == 0 || num == 0)
5491     return FALSE;
5492
5493   if (size < sizeof * shdrs)
5494     {
5495       if (! probe)
5496         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5497       return FALSE;
5498     }
5499
5500   if (! probe && size > sizeof * shdrs)
5501     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5502
5503   shdrs = (Elf64_External_Shdr *) get_data (NULL, filedata,
5504                                             filedata->file_header.e_shoff,
5505                                             size, num,
5506                                             probe ? NULL : _("section headers"));
5507   if (shdrs == NULL)
5508     return FALSE;
5509
5510   free (filedata->section_headers);
5511   filedata->section_headers = (Elf_Internal_Shdr *)
5512     cmalloc (num, sizeof (Elf_Internal_Shdr));
5513   if (filedata->section_headers == NULL)
5514     {
5515       if (! probe)
5516         error (_("Out of memory reading %u section headers\n"), num);
5517       free (shdrs);
5518       return FALSE;
5519     }
5520
5521   for (i = 0, internal = filedata->section_headers;
5522        i < num;
5523        i++, internal++)
5524     {
5525       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5526       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5527       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5528       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5529       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5530       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5531       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5532       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5533       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5534       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5535       if (!probe && internal->sh_link > num)
5536         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5537       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5538         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5539     }
5540
5541   free (shdrs);
5542   return TRUE;
5543 }
5544
5545 static Elf_Internal_Sym *
5546 get_32bit_elf_symbols (Filedata *           filedata,
5547                        Elf_Internal_Shdr *  section,
5548                        unsigned long *      num_syms_return)
5549 {
5550   unsigned long number = 0;
5551   Elf32_External_Sym * esyms = NULL;
5552   Elf_External_Sym_Shndx * shndx = NULL;
5553   Elf_Internal_Sym * isyms = NULL;
5554   Elf_Internal_Sym * psym;
5555   unsigned int j;
5556   elf_section_list * entry;
5557
5558   if (section->sh_size == 0)
5559     {
5560       if (num_syms_return != NULL)
5561         * num_syms_return = 0;
5562       return NULL;
5563     }
5564
5565   /* Run some sanity checks first.  */
5566   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5567     {
5568       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5569              printable_section_name (filedata, section),
5570              (unsigned long) section->sh_entsize);
5571       goto exit_point;
5572     }
5573
5574   if (section->sh_size > filedata->file_size)
5575     {
5576       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5577              printable_section_name (filedata, section),
5578              (unsigned long) section->sh_size);
5579       goto exit_point;
5580     }
5581
5582   number = section->sh_size / section->sh_entsize;
5583
5584   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5585     {
5586       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5587              (unsigned long) section->sh_size,
5588              printable_section_name (filedata, section),
5589              (unsigned long) section->sh_entsize);
5590       goto exit_point;
5591     }
5592
5593   esyms = (Elf32_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5594                                            section->sh_size, _("symbols"));
5595   if (esyms == NULL)
5596     goto exit_point;
5597
5598   shndx = NULL;
5599   for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5600     {
5601       if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5602         continue;
5603
5604       if (shndx != NULL)
5605         {
5606           error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5607           free (shndx);
5608         }
5609
5610       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5611                                                    entry->hdr->sh_offset,
5612                                                    1, entry->hdr->sh_size,
5613                                                    _("symbol table section indices"));
5614       if (shndx == NULL)
5615         goto exit_point;
5616
5617       /* PR17531: file: heap-buffer-overflow */
5618       if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5619         {
5620           error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5621                  printable_section_name (filedata, entry->hdr),
5622                  (unsigned long) entry->hdr->sh_size,
5623                  (unsigned long) section->sh_size);
5624           goto exit_point;
5625         }
5626     }
5627
5628   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5629
5630   if (isyms == NULL)
5631     {
5632       error (_("Out of memory reading %lu symbols\n"),
5633              (unsigned long) number);
5634       goto exit_point;
5635     }
5636
5637   for (j = 0, psym = isyms; j < number; j++, psym++)
5638     {
5639       psym->st_name  = BYTE_GET (esyms[j].st_name);
5640       psym->st_value = BYTE_GET (esyms[j].st_value);
5641       psym->st_size  = BYTE_GET (esyms[j].st_size);
5642       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5643       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5644         psym->st_shndx
5645           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5646       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5647         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5648       psym->st_info  = BYTE_GET (esyms[j].st_info);
5649       psym->st_other = BYTE_GET (esyms[j].st_other);
5650     }
5651
5652  exit_point:
5653   free (shndx);
5654   free (esyms);
5655
5656   if (num_syms_return != NULL)
5657     * num_syms_return = isyms == NULL ? 0 : number;
5658
5659   return isyms;
5660 }
5661
5662 static Elf_Internal_Sym *
5663 get_64bit_elf_symbols (Filedata *           filedata,
5664                        Elf_Internal_Shdr *  section,
5665                        unsigned long *      num_syms_return)
5666 {
5667   unsigned long number = 0;
5668   Elf64_External_Sym * esyms = NULL;
5669   Elf_External_Sym_Shndx * shndx = NULL;
5670   Elf_Internal_Sym * isyms = NULL;
5671   Elf_Internal_Sym * psym;
5672   unsigned int j;
5673   elf_section_list * entry;
5674
5675   if (section->sh_size == 0)
5676     {
5677       if (num_syms_return != NULL)
5678         * num_syms_return = 0;
5679       return NULL;
5680     }
5681
5682   /* Run some sanity checks first.  */
5683   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5684     {
5685       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5686              printable_section_name (filedata, section),
5687              (unsigned long) section->sh_entsize);
5688       goto exit_point;
5689     }
5690
5691   if (section->sh_size > filedata->file_size)
5692     {
5693       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5694              printable_section_name (filedata, section),
5695              (unsigned long) section->sh_size);
5696       goto exit_point;
5697     }
5698
5699   number = section->sh_size / section->sh_entsize;
5700
5701   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5702     {
5703       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5704              (unsigned long) section->sh_size,
5705              printable_section_name (filedata, section),
5706              (unsigned long) section->sh_entsize);
5707       goto exit_point;
5708     }
5709
5710   esyms = (Elf64_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5711                                            section->sh_size, _("symbols"));
5712   if (!esyms)
5713     goto exit_point;
5714
5715   shndx = NULL;
5716   for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5717     {
5718       if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5719         continue;
5720
5721       if (shndx != NULL)
5722         {
5723           error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5724           free (shndx);
5725         }
5726
5727       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5728                                                    entry->hdr->sh_offset,
5729                                                    1, entry->hdr->sh_size,
5730                                                    _("symbol table section indices"));
5731       if (shndx == NULL)
5732         goto exit_point;
5733
5734       /* PR17531: file: heap-buffer-overflow */
5735       if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5736         {
5737           error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5738                  printable_section_name (filedata, entry->hdr),
5739                  (unsigned long) entry->hdr->sh_size,
5740                  (unsigned long) section->sh_size);
5741           goto exit_point;
5742         }
5743     }
5744
5745   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5746
5747   if (isyms == NULL)
5748     {
5749       error (_("Out of memory reading %lu symbols\n"),
5750              (unsigned long) number);
5751       goto exit_point;
5752     }
5753
5754   for (j = 0, psym = isyms; j < number; j++, psym++)
5755     {
5756       psym->st_name  = BYTE_GET (esyms[j].st_name);
5757       psym->st_info  = BYTE_GET (esyms[j].st_info);
5758       psym->st_other = BYTE_GET (esyms[j].st_other);
5759       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5760
5761       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5762         psym->st_shndx
5763           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5764       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5765         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5766
5767       psym->st_value = BYTE_GET (esyms[j].st_value);
5768       psym->st_size  = BYTE_GET (esyms[j].st_size);
5769     }
5770
5771  exit_point:
5772   free (shndx);
5773   free (esyms);
5774
5775   if (num_syms_return != NULL)
5776     * num_syms_return = isyms == NULL ? 0 : number;
5777
5778   return isyms;
5779 }
5780
5781 static const char *
5782 get_elf_section_flags (Filedata * filedata, bfd_vma sh_flags)
5783 {
5784   static char buff[1024];
5785   char * p = buff;
5786   unsigned int field_size = is_32bit_elf ? 8 : 16;
5787   signed int sindex;
5788   unsigned int size = sizeof (buff) - (field_size + 4 + 1);
5789   bfd_vma os_flags = 0;
5790   bfd_vma proc_flags = 0;
5791   bfd_vma unknown_flags = 0;
5792   static const struct
5793     {
5794       const char * str;
5795       unsigned int len;
5796     }
5797   flags [] =
5798     {
5799       /*  0 */ { STRING_COMMA_LEN ("WRITE") },
5800       /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
5801       /*  2 */ { STRING_COMMA_LEN ("EXEC") },
5802       /*  3 */ { STRING_COMMA_LEN ("MERGE") },
5803       /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
5804       /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
5805       /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5806       /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5807       /*  8 */ { STRING_COMMA_LEN ("GROUP") },
5808       /*  9 */ { STRING_COMMA_LEN ("TLS") },
5809       /* IA-64 specific.  */
5810       /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5811       /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5812       /* IA-64 OpenVMS specific.  */
5813       /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5814       /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5815       /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5816       /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5817       /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5818       /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5819       /* Generic.  */
5820       /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5821       /* SPARC specific.  */
5822       /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5823       /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5824       /* ARM specific.  */
5825       /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5826       /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5827       /* 23 */ { STRING_COMMA_LEN ("COMDEF") },
5828       /* GNU specific.  */
5829       /* 24 */ { STRING_COMMA_LEN ("GNU_MBIND") },
5830       /* VLE specific.  */
5831       /* 25 */ { STRING_COMMA_LEN ("VLE") },
5832     };
5833
5834   if (do_section_details)
5835     {
5836       sprintf (buff, "[%*.*lx]: ",
5837                field_size, field_size, (unsigned long) sh_flags);
5838       p += field_size + 4;
5839     }
5840
5841   while (sh_flags)
5842     {
5843       bfd_vma flag;
5844
5845       flag = sh_flags & - sh_flags;
5846       sh_flags &= ~ flag;
5847
5848       if (do_section_details)
5849         {
5850           switch (flag)
5851             {
5852             case SHF_WRITE:             sindex = 0; break;
5853             case SHF_ALLOC:             sindex = 1; break;
5854             case SHF_EXECINSTR:         sindex = 2; break;
5855             case SHF_MERGE:             sindex = 3; break;
5856             case SHF_STRINGS:           sindex = 4; break;
5857             case SHF_INFO_LINK:         sindex = 5; break;
5858             case SHF_LINK_ORDER:        sindex = 6; break;
5859             case SHF_OS_NONCONFORMING:  sindex = 7; break;
5860             case SHF_GROUP:             sindex = 8; break;
5861             case SHF_TLS:               sindex = 9; break;
5862             case SHF_EXCLUDE:           sindex = 18; break;
5863             case SHF_COMPRESSED:        sindex = 20; break;
5864             case SHF_GNU_MBIND:         sindex = 24; break;
5865
5866             default:
5867               sindex = -1;
5868               switch (filedata->file_header.e_machine)
5869                 {
5870                 case EM_IA_64:
5871                   if (flag == SHF_IA_64_SHORT)
5872                     sindex = 10;
5873                   else if (flag == SHF_IA_64_NORECOV)
5874                     sindex = 11;
5875 #ifdef BFD64
5876                   else if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5877                     switch (flag)
5878                       {
5879                       case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
5880                       case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
5881                       case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
5882                       case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
5883                       case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5884                       case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
5885                       default:                        break;
5886                       }
5887 #endif
5888                   break;
5889
5890                 case EM_386:
5891                 case EM_IAMCU:
5892                 case EM_X86_64:
5893                 case EM_L1OM:
5894                 case EM_K1OM:
5895                 case EM_OLD_SPARCV9:
5896                 case EM_SPARC32PLUS:
5897                 case EM_SPARCV9:
5898                 case EM_SPARC:
5899                   if (flag == SHF_ORDERED)
5900                     sindex = 19;
5901                   break;
5902
5903                 case EM_ARM:
5904                   switch (flag)
5905                     {
5906                     case SHF_ENTRYSECT: sindex = 21; break;
5907                     case SHF_ARM_PURECODE: sindex = 22; break;
5908                     case SHF_COMDEF: sindex = 23; break;
5909                     default: break;
5910                     }
5911                   break;
5912                 case EM_PPC:
5913                   if (flag == SHF_PPC_VLE)
5914                     sindex = 25;
5915                   break;
5916
5917                 default:
5918                   break;
5919                 }
5920             }
5921
5922           if (sindex != -1)
5923             {
5924               if (p != buff + field_size + 4)
5925                 {
5926                   if (size < (10 + 2))
5927                     {
5928                       warn (_("Internal error: not enough buffer room for section flag info"));
5929                       return _("<unknown>");
5930                     }
5931                   size -= 2;
5932                   *p++ = ',';
5933                   *p++ = ' ';
5934                 }
5935
5936               size -= flags [sindex].len;
5937               p = stpcpy (p, flags [sindex].str);
5938             }
5939           else if (flag & SHF_MASKOS)
5940             os_flags |= flag;
5941           else if (flag & SHF_MASKPROC)
5942             proc_flags |= flag;
5943           else
5944             unknown_flags |= flag;
5945         }
5946       else
5947         {
5948           switch (flag)
5949             {
5950             case SHF_WRITE:             *p = 'W'; break;
5951             case SHF_ALLOC:             *p = 'A'; break;
5952             case SHF_EXECINSTR:         *p = 'X'; break;
5953             case SHF_MERGE:             *p = 'M'; break;
5954             case SHF_STRINGS:           *p = 'S'; break;
5955             case SHF_INFO_LINK:         *p = 'I'; break;
5956             case SHF_LINK_ORDER:        *p = 'L'; break;
5957             case SHF_OS_NONCONFORMING:  *p = 'O'; break;
5958             case SHF_GROUP:             *p = 'G'; break;
5959             case SHF_TLS:               *p = 'T'; break;
5960             case SHF_EXCLUDE:           *p = 'E'; break;
5961             case SHF_COMPRESSED:        *p = 'C'; break;
5962             case SHF_GNU_MBIND:         *p = 'D'; break;
5963
5964             default:
5965               if ((filedata->file_header.e_machine == EM_X86_64
5966                    || filedata->file_header.e_machine == EM_L1OM
5967                    || filedata->file_header.e_machine == EM_K1OM)
5968                   && flag == SHF_X86_64_LARGE)
5969                 *p = 'l';
5970               else if (filedata->file_header.e_machine == EM_ARM
5971                        && flag == SHF_ARM_PURECODE)
5972                   *p = 'y';
5973               else if (filedata->file_header.e_machine == EM_PPC
5974                        && flag == SHF_PPC_VLE)
5975                   *p = 'v';
5976               else if (flag & SHF_MASKOS)
5977                 {
5978                   *p = 'o';
5979                   sh_flags &= ~ SHF_MASKOS;
5980                 }
5981               else if (flag & SHF_MASKPROC)
5982                 {
5983                   *p = 'p';
5984                   sh_flags &= ~ SHF_MASKPROC;
5985                 }
5986               else
5987                 *p = 'x';
5988               break;
5989             }
5990           p++;
5991         }
5992     }
5993
5994   if (do_section_details)
5995     {
5996       if (os_flags)
5997         {
5998           size -= 5 + field_size;
5999           if (p != buff + field_size + 4)
6000             {
6001               if (size < (2 + 1))
6002                 {
6003                   warn (_("Internal error: not enough buffer room for section flag info"));
6004                   return _("<unknown>");
6005                 }
6006               size -= 2;
6007               *p++ = ',';
6008               *p++ = ' ';
6009             }
6010           sprintf (p, "OS (%*.*lx)", field_size, field_size,
6011                    (unsigned long) os_flags);
6012           p += 5 + field_size;
6013         }
6014       if (proc_flags)
6015         {
6016           size -= 7 + field_size;
6017           if (p != buff + field_size + 4)
6018             {
6019               if (size < (2 + 1))
6020                 {
6021                   warn (_("Internal error: not enough buffer room for section flag info"));
6022                   return _("<unknown>");
6023                 }
6024               size -= 2;
6025               *p++ = ',';
6026               *p++ = ' ';
6027             }
6028           sprintf (p, "PROC (%*.*lx)", field_size, field_size,
6029                    (unsigned long) proc_flags);
6030           p += 7 + field_size;
6031         }
6032       if (unknown_flags)
6033         {
6034           size -= 10 + field_size;
6035           if (p != buff + field_size + 4)
6036             {
6037               if (size < (2 + 1))
6038                 {
6039                   warn (_("Internal error: not enough buffer room for section flag info"));
6040                   return _("<unknown>");
6041                 }
6042               size -= 2;
6043               *p++ = ',';
6044               *p++ = ' ';
6045             }
6046           sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
6047                    (unsigned long) unknown_flags);
6048           p += 10 + field_size;
6049         }
6050     }
6051
6052   *p = '\0';
6053   return buff;
6054 }
6055
6056 static unsigned int
6057 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf, bfd_size_type size)
6058 {
6059   if (is_32bit_elf)
6060     {
6061       Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
6062
6063       if (size < sizeof (* echdr))
6064         {
6065           error (_("Compressed section is too small even for a compression header\n"));
6066           return 0;
6067         }
6068
6069       chdr->ch_type = BYTE_GET (echdr->ch_type);
6070       chdr->ch_size = BYTE_GET (echdr->ch_size);
6071       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
6072       return sizeof (*echdr);
6073     }
6074   else
6075     {
6076       Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
6077
6078       if (size < sizeof (* echdr))
6079         {
6080           error (_("Compressed section is too small even for a compression header\n"));
6081           return 0;
6082         }
6083
6084       chdr->ch_type = BYTE_GET (echdr->ch_type);
6085       chdr->ch_size = BYTE_GET (echdr->ch_size);
6086       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
6087       return sizeof (*echdr);
6088     }
6089 }
6090
6091 static bfd_boolean
6092 process_section_headers (Filedata * filedata)
6093 {
6094   Elf_Internal_Shdr * section;
6095   unsigned int i;
6096
6097   filedata->section_headers = NULL;
6098
6099   if (filedata->file_header.e_shnum == 0)
6100     {
6101       /* PR binutils/12467.  */
6102       if (filedata->file_header.e_shoff != 0)
6103         {
6104           warn (_("possibly corrupt ELF file header - it has a non-zero"
6105                   " section header offset, but no section headers\n"));
6106           return FALSE;
6107         }
6108       else if (do_sections)
6109         printf (_("\nThere are no sections in this file.\n"));
6110
6111       return TRUE;
6112     }
6113
6114   if (do_sections && !do_header)
6115     printf (ngettext ("There is %d section header, "
6116                       "starting at offset 0x%lx:\n",
6117                       "There are %d section headers, "
6118                       "starting at offset 0x%lx:\n",
6119                       filedata->file_header.e_shnum),
6120             filedata->file_header.e_shnum,
6121             (unsigned long) filedata->file_header.e_shoff);
6122
6123   if (is_32bit_elf)
6124     {
6125       if (! get_32bit_section_headers (filedata, FALSE))
6126         return FALSE;
6127     }
6128   else
6129     {
6130       if (! get_64bit_section_headers (filedata, FALSE))
6131         return FALSE;
6132     }
6133
6134   /* Read in the string table, so that we have names to display.  */
6135   if (filedata->file_header.e_shstrndx != SHN_UNDEF
6136        && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
6137     {
6138       section = filedata->section_headers + filedata->file_header.e_shstrndx;
6139
6140       if (section->sh_size != 0)
6141         {
6142           filedata->string_table = (char *) get_data (NULL, filedata, section->sh_offset,
6143                                                       1, section->sh_size,
6144                                                       _("string table"));
6145
6146           filedata->string_table_length = filedata->string_table != NULL ? section->sh_size : 0;
6147         }
6148     }
6149
6150   /* Scan the sections for the dynamic symbol table
6151      and dynamic string table and debug sections.  */
6152   dynamic_symbols = NULL;
6153   dynamic_strings = NULL;
6154   dynamic_syminfo = NULL;
6155   symtab_shndx_list = NULL;
6156
6157   eh_addr_size = is_32bit_elf ? 4 : 8;
6158   switch (filedata->file_header.e_machine)
6159     {
6160     case EM_MIPS:
6161     case EM_MIPS_RS3_LE:
6162       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
6163          FDE addresses.  However, the ABI also has a semi-official ILP32
6164          variant for which the normal FDE address size rules apply.
6165
6166          GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
6167          section, where XX is the size of longs in bits.  Unfortunately,
6168          earlier compilers provided no way of distinguishing ILP32 objects
6169          from LP64 objects, so if there's any doubt, we should assume that
6170          the official LP64 form is being used.  */
6171       if ((filedata->file_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
6172           && find_section (filedata, ".gcc_compiled_long32") == NULL)
6173         eh_addr_size = 8;
6174       break;
6175
6176     case EM_H8_300:
6177     case EM_H8_300H:
6178       switch (filedata->file_header.e_flags & EF_H8_MACH)
6179         {
6180         case E_H8_MACH_H8300:
6181         case E_H8_MACH_H8300HN:
6182         case E_H8_MACH_H8300SN:
6183         case E_H8_MACH_H8300SXN:
6184           eh_addr_size = 2;
6185           break;
6186         case E_H8_MACH_H8300H:
6187         case E_H8_MACH_H8300S:
6188         case E_H8_MACH_H8300SX:
6189           eh_addr_size = 4;
6190           break;
6191         }
6192       break;
6193
6194     case EM_M32C_OLD:
6195     case EM_M32C:
6196       switch (filedata->file_header.e_flags & EF_M32C_CPU_MASK)
6197         {
6198         case EF_M32C_CPU_M16C:
6199           eh_addr_size = 2;
6200           break;
6201         }
6202       break;
6203     }
6204
6205 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64)                \
6206   do                                                                    \
6207     {                                                                   \
6208       bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64;  \
6209       if (section->sh_entsize != expected_entsize)                      \
6210         {                                                               \
6211           char buf[40];                                                 \
6212           sprintf_vma (buf, section->sh_entsize);                       \
6213           /* Note: coded this way so that there is a single string for  \
6214              translation.  */ \
6215           error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
6216           error (_("(Using the expected size of %u for the rest of this dump)\n"), \
6217                    (unsigned) expected_entsize);                        \
6218           section->sh_entsize = expected_entsize;                       \
6219         }                                                               \
6220     }                                                                   \
6221   while (0)
6222
6223 #define CHECK_ENTSIZE(section, i, type)                                 \
6224   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),         \
6225                         sizeof (Elf64_External_##type))
6226
6227   for (i = 0, section = filedata->section_headers;
6228        i < filedata->file_header.e_shnum;
6229        i++, section++)
6230     {
6231       char * name = SECTION_NAME (section);
6232
6233       if (section->sh_type == SHT_DYNSYM)
6234         {
6235           if (dynamic_symbols != NULL)
6236             {
6237               error (_("File contains multiple dynamic symbol tables\n"));
6238               continue;
6239             }
6240
6241           CHECK_ENTSIZE (section, i, Sym);
6242           dynamic_symbols = GET_ELF_SYMBOLS (filedata, section, & num_dynamic_syms);
6243         }
6244       else if (section->sh_type == SHT_STRTAB
6245                && streq (name, ".dynstr"))
6246         {
6247           if (dynamic_strings != NULL)
6248             {
6249               error (_("File contains multiple dynamic string tables\n"));
6250               continue;
6251             }
6252
6253           dynamic_strings = (char *) get_data (NULL, filedata, section->sh_offset,
6254                                                1, section->sh_size,
6255                                                _("dynamic strings"));
6256           dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
6257         }
6258       else if (section->sh_type == SHT_SYMTAB_SHNDX)
6259         {
6260           elf_section_list * entry = xmalloc (sizeof * entry);
6261
6262           entry->hdr = section;
6263           entry->next = symtab_shndx_list;
6264           symtab_shndx_list = entry;
6265         }
6266       else if (section->sh_type == SHT_SYMTAB)
6267         CHECK_ENTSIZE (section, i, Sym);
6268       else if (section->sh_type == SHT_GROUP)
6269         CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
6270       else if (section->sh_type == SHT_REL)
6271         CHECK_ENTSIZE (section, i, Rel);
6272       else if (section->sh_type == SHT_RELA)
6273         CHECK_ENTSIZE (section, i, Rela);
6274       else if ((do_debugging || do_debug_info || do_debug_abbrevs
6275                 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
6276                 || do_debug_aranges || do_debug_frames || do_debug_macinfo
6277                 || do_debug_str || do_debug_loc || do_debug_ranges
6278                 || do_debug_addr || do_debug_cu_index || do_debug_links)
6279                && (const_strneq (name, ".debug_")
6280                    || const_strneq (name, ".zdebug_")))
6281         {
6282           if (name[1] == 'z')
6283             name += sizeof (".zdebug_") - 1;
6284           else
6285             name += sizeof (".debug_") - 1;
6286
6287           if (do_debugging
6288               || (do_debug_info     && const_strneq (name, "info"))
6289               || (do_debug_info     && const_strneq (name, "types"))
6290               || (do_debug_abbrevs  && const_strneq (name, "abbrev"))
6291               || (do_debug_lines    && strcmp (name, "line") == 0)
6292               || (do_debug_lines    && const_strneq (name, "line."))
6293               || (do_debug_pubnames && const_strneq (name, "pubnames"))
6294               || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
6295               || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
6296               || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
6297               || (do_debug_aranges  && const_strneq (name, "aranges"))
6298               || (do_debug_ranges   && const_strneq (name, "ranges"))
6299               || (do_debug_ranges   && const_strneq (name, "rnglists"))
6300               || (do_debug_frames   && const_strneq (name, "frame"))
6301               || (do_debug_macinfo  && const_strneq (name, "macinfo"))
6302               || (do_debug_macinfo  && const_strneq (name, "macro"))
6303               || (do_debug_str      && const_strneq (name, "str"))
6304               || (do_debug_loc      && const_strneq (name, "loc"))
6305               || (do_debug_loc      && const_strneq (name, "loclists"))
6306               || (do_debug_addr     && const_strneq (name, "addr"))
6307               || (do_debug_cu_index && const_strneq (name, "cu_index"))
6308               || (do_debug_cu_index && const_strneq (name, "tu_index"))
6309               )
6310             request_dump_bynumber (filedata, i, DEBUG_DUMP);
6311         }
6312       /* Linkonce section to be combined with .debug_info at link time.  */
6313       else if ((do_debugging || do_debug_info)
6314                && const_strneq (name, ".gnu.linkonce.wi."))
6315         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6316       else if (do_debug_frames && streq (name, ".eh_frame"))
6317         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6318       else if (do_gdb_index && (streq (name, ".gdb_index")
6319                                 || streq (name, ".debug_names")))
6320         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6321       /* Trace sections for Itanium VMS.  */
6322       else if ((do_debugging || do_trace_info || do_trace_abbrevs
6323                 || do_trace_aranges)
6324                && const_strneq (name, ".trace_"))
6325         {
6326           name += sizeof (".trace_") - 1;
6327
6328           if (do_debugging
6329               || (do_trace_info     && streq (name, "info"))
6330               || (do_trace_abbrevs  && streq (name, "abbrev"))
6331               || (do_trace_aranges  && streq (name, "aranges"))
6332               )
6333             request_dump_bynumber (filedata, i, DEBUG_DUMP);
6334         }
6335       else if ((do_debugging || do_debug_links)
6336                && (const_strneq (name, ".gnu_debuglink")
6337                    || const_strneq (name, ".gnu_debugaltlink")))
6338         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6339     }
6340
6341   if (! do_sections)
6342     return TRUE;
6343
6344   if (filedata->file_header.e_shnum > 1)
6345     printf (_("\nSection Headers:\n"));
6346   else
6347     printf (_("\nSection Header:\n"));
6348
6349   if (is_32bit_elf)
6350     {
6351       if (do_section_details)
6352         {
6353           printf (_("  [Nr] Name\n"));
6354           printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
6355         }
6356       else
6357         printf
6358           (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
6359     }
6360   else if (do_wide)
6361     {
6362       if (do_section_details)
6363         {
6364           printf (_("  [Nr] Name\n"));
6365           printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
6366         }
6367       else
6368         printf
6369           (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
6370     }
6371   else
6372     {
6373       if (do_section_details)
6374         {
6375           printf (_("  [Nr] Name\n"));
6376           printf (_("       Type              Address          Offset            Link\n"));
6377           printf (_("       Size              EntSize          Info              Align\n"));
6378         }
6379       else
6380         {
6381           printf (_("  [Nr] Name              Type             Address           Offset\n"));
6382           printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
6383         }
6384     }
6385
6386   if (do_section_details)
6387     printf (_("       Flags\n"));
6388
6389   for (i = 0, section = filedata->section_headers;
6390        i < filedata->file_header.e_shnum;
6391        i++, section++)
6392     {
6393       /* Run some sanity checks on the section header.  */
6394
6395       /* Check the sh_link field.  */
6396       switch (section->sh_type)
6397         {
6398         case SHT_REL:
6399         case SHT_RELA:
6400           if (section->sh_link == 0
6401               && (filedata->file_header.e_type == ET_EXEC
6402                   || filedata->file_header.e_type == ET_DYN))
6403             /* A dynamic relocation section where all entries use a
6404                zero symbol index need not specify a symtab section.  */
6405             break;
6406           /* Fall through.  */
6407         case SHT_SYMTAB_SHNDX:
6408         case SHT_GROUP:
6409         case SHT_HASH:
6410         case SHT_GNU_HASH:
6411         case SHT_GNU_versym:
6412           if (section->sh_link == 0
6413               || section->sh_link >= filedata->file_header.e_shnum
6414               || (filedata->section_headers[section->sh_link].sh_type != SHT_SYMTAB
6415                   && filedata->section_headers[section->sh_link].sh_type != SHT_DYNSYM))
6416             warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6417                   i, section->sh_link);
6418           break;
6419
6420         case SHT_DYNAMIC:
6421         case SHT_SYMTAB:
6422         case SHT_DYNSYM:
6423         case SHT_GNU_verneed:
6424         case SHT_GNU_verdef:
6425         case SHT_GNU_LIBLIST:
6426           if (section->sh_link == 0
6427               || section->sh_link >= filedata->file_header.e_shnum
6428               || filedata->section_headers[section->sh_link].sh_type != SHT_STRTAB)
6429             warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6430                   i, section->sh_link);
6431           break;
6432
6433         case SHT_INIT_ARRAY:
6434         case SHT_FINI_ARRAY:
6435         case SHT_PREINIT_ARRAY:
6436           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6437             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6438                   i, section->sh_link);
6439           break;
6440
6441         default:
6442           /* FIXME: Add support for target specific section types.  */
6443 #if 0     /* Currently we do not check other section types as there are too
6444              many special cases.  Stab sections for example have a type
6445              of SHT_PROGBITS but an sh_link field that links to the .stabstr
6446              section.  */
6447           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6448             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6449                   i, section->sh_link);
6450 #endif
6451           break;
6452         }
6453
6454       /* Check the sh_info field.  */
6455       switch (section->sh_type)
6456         {
6457         case SHT_REL:
6458         case SHT_RELA:
6459           if (section->sh_info == 0
6460               && (filedata->file_header.e_type == ET_EXEC
6461                   || filedata->file_header.e_type == ET_DYN))
6462             /* Dynamic relocations apply to segments, so they do not
6463                need to specify the section they relocate.  */
6464             break;
6465           if (section->sh_info == 0
6466               || section->sh_info >= filedata->file_header.e_shnum
6467               || (filedata->section_headers[section->sh_info].sh_type != SHT_PROGBITS
6468                   && filedata->section_headers[section->sh_info].sh_type != SHT_NOBITS
6469                   && filedata->section_headers[section->sh_info].sh_type != SHT_NOTE
6470                   && filedata->section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
6471                   && filedata->section_headers[section->sh_info].sh_type != SHT_FINI_ARRAY
6472                   && filedata->section_headers[section->sh_info].sh_type != SHT_PREINIT_ARRAY
6473                   /* FIXME: Are other section types valid ?  */
6474                   && filedata->section_headers[section->sh_info].sh_type < SHT_LOOS))
6475             warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6476                   i, section->sh_info);
6477           break;
6478
6479         case SHT_DYNAMIC:
6480         case SHT_HASH:
6481         case SHT_SYMTAB_SHNDX:
6482         case SHT_INIT_ARRAY:
6483         case SHT_FINI_ARRAY:
6484         case SHT_PREINIT_ARRAY:
6485           if (section->sh_info != 0)
6486             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6487                   i, section->sh_info);
6488           break;
6489
6490         case SHT_GROUP:
6491         case SHT_SYMTAB:
6492         case SHT_DYNSYM:
6493           /* A symbol index - we assume that it is valid.  */
6494           break;
6495
6496         default:
6497           /* FIXME: Add support for target specific section types.  */
6498           if (section->sh_type == SHT_NOBITS)
6499             /* NOBITS section headers with non-zero sh_info fields can be
6500                created when a binary is stripped of everything but its debug
6501                information.  The stripped sections have their headers
6502                preserved but their types set to SHT_NOBITS.  So do not check
6503                this type of section.  */
6504             ;
6505           else if (section->sh_flags & SHF_INFO_LINK)
6506             {
6507               if (section->sh_info < 1 || section->sh_info >= filedata->file_header.e_shnum)
6508                 warn (_("[%2u]: Expected link to another section in info field"), i);
6509             }
6510           else if (section->sh_type < SHT_LOOS
6511                    && (section->sh_flags & SHF_GNU_MBIND) == 0
6512                    && section->sh_info != 0)
6513             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6514                   i, section->sh_info);
6515           break;
6516         }
6517
6518       /* Check the sh_size field.  */
6519       if (section->sh_size > filedata->file_size
6520           && section->sh_type != SHT_NOBITS
6521           && section->sh_type != SHT_NULL
6522           && section->sh_type < SHT_LOOS)
6523         warn (_("Size of section %u is larger than the entire file!\n"), i);
6524
6525       printf ("  [%2u] ", i);
6526       if (do_section_details)
6527         printf ("%s\n      ", printable_section_name (filedata, section));
6528       else
6529         print_symbol (-17, SECTION_NAME (section));
6530
6531       printf (do_wide ? " %-15s " : " %-15.15s ",
6532               get_section_type_name (filedata, section->sh_type));
6533
6534       if (is_32bit_elf)
6535         {
6536           const char * link_too_big = NULL;
6537
6538           print_vma (section->sh_addr, LONG_HEX);
6539
6540           printf ( " %6.6lx %6.6lx %2.2lx",
6541                    (unsigned long) section->sh_offset,
6542                    (unsigned long) section->sh_size,
6543                    (unsigned long) section->sh_entsize);
6544
6545           if (do_section_details)
6546             fputs ("  ", stdout);
6547           else
6548             printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6549
6550           if (section->sh_link >= filedata->file_header.e_shnum)
6551             {
6552               link_too_big = "";
6553               /* The sh_link value is out of range.  Normally this indicates
6554                  an error but it can have special values in Solaris binaries.  */
6555               switch (filedata->file_header.e_machine)
6556                 {
6557                 case EM_386:
6558                 case EM_IAMCU:
6559                 case EM_X86_64:
6560                 case EM_L1OM:
6561                 case EM_K1OM:
6562                 case EM_OLD_SPARCV9:
6563                 case EM_SPARC32PLUS:
6564                 case EM_SPARCV9:
6565                 case EM_SPARC:
6566                   if (section->sh_link == (SHN_BEFORE & 0xffff))
6567                     link_too_big = "BEFORE";
6568                   else if (section->sh_link == (SHN_AFTER & 0xffff))
6569                     link_too_big = "AFTER";
6570                   break;
6571                 default:
6572                   break;
6573                 }
6574             }
6575
6576           if (do_section_details)
6577             {
6578               if (link_too_big != NULL && * link_too_big)
6579                 printf ("<%s> ", link_too_big);
6580               else
6581                 printf ("%2u ", section->sh_link);
6582               printf ("%3u %2lu\n", section->sh_info,
6583                       (unsigned long) section->sh_addralign);
6584             }
6585           else
6586             printf ("%2u %3u %2lu\n",
6587                     section->sh_link,
6588                     section->sh_info,
6589                     (unsigned long) section->sh_addralign);
6590
6591           if (link_too_big && ! * link_too_big)
6592             warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6593                   i, section->sh_link);
6594         }
6595       else if (do_wide)
6596         {
6597           print_vma (section->sh_addr, LONG_HEX);
6598
6599           if ((long) section->sh_offset == section->sh_offset)
6600             printf (" %6.6lx", (unsigned long) section->sh_offset);
6601           else
6602             {
6603               putchar (' ');
6604               print_vma (section->sh_offset, LONG_HEX);
6605             }
6606
6607           if ((unsigned long) section->sh_size == section->sh_size)
6608             printf (" %6.6lx", (unsigned long) section->sh_size);
6609           else
6610             {
6611               putchar (' ');
6612               print_vma (section->sh_size, LONG_HEX);
6613             }
6614
6615           if ((unsigned long) section->sh_entsize == section->sh_entsize)
6616             printf (" %2.2lx", (unsigned long) section->sh_entsize);
6617           else
6618             {
6619               putchar (' ');
6620               print_vma (section->sh_entsize, LONG_HEX);
6621             }
6622
6623           if (do_section_details)
6624             fputs ("  ", stdout);
6625           else
6626             printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6627
6628           printf ("%2u %3u ", section->sh_link, section->sh_info);
6629
6630           if ((unsigned long) section->sh_addralign == section->sh_addralign)
6631             printf ("%2lu\n", (unsigned long) section->sh_addralign);
6632           else
6633             {
6634               print_vma (section->sh_addralign, DEC);
6635               putchar ('\n');
6636             }
6637         }
6638       else if (do_section_details)
6639         {
6640           putchar (' ');
6641           print_vma (section->sh_addr, LONG_HEX);
6642           if ((long) section->sh_offset == section->sh_offset)
6643             printf ("  %16.16lx", (unsigned long) section->sh_offset);
6644           else
6645             {
6646               printf ("  ");
6647               print_vma (section->sh_offset, LONG_HEX);
6648             }
6649           printf ("  %u\n       ", section->sh_link);
6650           print_vma (section->sh_size, LONG_HEX);
6651           putchar (' ');
6652           print_vma (section->sh_entsize, LONG_HEX);
6653
6654           printf ("  %-16u  %lu\n",
6655                   section->sh_info,
6656                   (unsigned long) section->sh_addralign);
6657         }
6658       else
6659         {
6660           putchar (' ');
6661           print_vma (section->sh_addr, LONG_HEX);
6662           if ((long) section->sh_offset == section->sh_offset)
6663             printf ("  %8.8lx", (unsigned long) section->sh_offset);
6664           else
6665             {
6666               printf ("  ");
6667               print_vma (section->sh_offset, LONG_HEX);
6668             }
6669           printf ("\n       ");
6670           print_vma (section->sh_size, LONG_HEX);
6671           printf ("  ");
6672           print_vma (section->sh_entsize, LONG_HEX);
6673
6674           printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6675
6676           printf ("     %2u   %3u     %lu\n",
6677                   section->sh_link,
6678                   section->sh_info,
6679                   (unsigned long) section->sh_addralign);
6680         }
6681
6682       if (do_section_details)
6683         {
6684           printf ("       %s\n", get_elf_section_flags (filedata, section->sh_flags));
6685           if ((section->sh_flags & SHF_COMPRESSED) != 0)
6686             {
6687               /* Minimum section size is 12 bytes for 32-bit compression
6688                  header + 12 bytes for compressed data header.  */
6689               unsigned char buf[24];
6690
6691               assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6692               if (get_data (&buf, filedata, section->sh_offset, 1,
6693                             sizeof (buf), _("compression header")))
6694                 {
6695                   Elf_Internal_Chdr chdr;
6696
6697                   (void) get_compression_header (&chdr, buf, sizeof (buf));
6698
6699                   if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6700                     printf ("       ZLIB, ");
6701                   else
6702                     printf (_("       [<unknown>: 0x%x], "),
6703                             chdr.ch_type);
6704                   print_vma (chdr.ch_size, LONG_HEX);
6705                   printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6706                 }
6707             }
6708         }
6709     }
6710
6711   if (!do_section_details)
6712     {
6713       /* The ordering of the letters shown here matches the ordering of the
6714          corresponding SHF_xxx values, and hence the order in which these
6715          letters will be displayed to the user.  */
6716       printf (_("Key to Flags:\n\
6717   W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6718   L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6719   C (compressed), x (unknown), o (OS specific), E (exclude),\n  "));
6720       if (filedata->file_header.e_machine == EM_X86_64
6721           || filedata->file_header.e_machine == EM_L1OM
6722           || filedata->file_header.e_machine == EM_K1OM)
6723         printf (_("l (large), "));
6724       else if (filedata->file_header.e_machine == EM_ARM)
6725         printf (_("y (purecode), "));
6726       else if (filedata->file_header.e_machine == EM_PPC)
6727         printf (_("v (VLE), "));
6728       printf ("p (processor specific)\n");
6729     }
6730
6731   return TRUE;
6732 }
6733
6734 static const char *
6735 get_group_flags (unsigned int flags)
6736 {
6737   static char buff[128];
6738
6739   if (flags == 0)
6740     return "";
6741   else if (flags == GRP_COMDAT)
6742     return "COMDAT ";
6743
6744   snprintf (buff, 14, _("[0x%x: "), flags);
6745
6746   flags &= ~ GRP_COMDAT;
6747   if (flags & GRP_MASKOS)
6748     {
6749       strcat (buff, "<OS specific>");
6750       flags &= ~ GRP_MASKOS;
6751     }
6752
6753   if (flags & GRP_MASKPROC)
6754     {
6755       strcat (buff, "<PROC specific>");
6756       flags &= ~ GRP_MASKPROC;
6757     }
6758
6759   if (flags)
6760     strcat (buff, "<unknown>");
6761
6762   strcat (buff, "]");
6763   return buff;
6764 }
6765
6766 static bfd_boolean
6767 process_section_groups (Filedata * filedata)
6768 {
6769   Elf_Internal_Shdr * section;
6770   unsigned int i;
6771   struct group * group;
6772   Elf_Internal_Shdr * symtab_sec;
6773   Elf_Internal_Shdr * strtab_sec;
6774   Elf_Internal_Sym * symtab;
6775   unsigned long num_syms;
6776   char * strtab;
6777   size_t strtab_size;
6778
6779   /* Don't process section groups unless needed.  */
6780   if (!do_unwind && !do_section_groups)
6781     return TRUE;
6782
6783   if (filedata->file_header.e_shnum == 0)
6784     {
6785       if (do_section_groups)
6786         printf (_("\nThere are no sections to group in this file.\n"));
6787
6788       return TRUE;
6789     }
6790
6791   if (filedata->section_headers == NULL)
6792     {
6793       error (_("Section headers are not available!\n"));
6794       /* PR 13622: This can happen with a corrupt ELF header.  */
6795       return FALSE;
6796     }
6797
6798   section_headers_groups = (struct group **) calloc (filedata->file_header.e_shnum,
6799                                                      sizeof (struct group *));
6800
6801   if (section_headers_groups == NULL)
6802     {
6803       error (_("Out of memory reading %u section group headers\n"),
6804              filedata->file_header.e_shnum);
6805       return FALSE;
6806     }
6807
6808   /* Scan the sections for the group section.  */
6809   group_count = 0;
6810   for (i = 0, section = filedata->section_headers;
6811        i < filedata->file_header.e_shnum;
6812        i++, section++)
6813     if (section->sh_type == SHT_GROUP)
6814       group_count++;
6815
6816   if (group_count == 0)
6817     {
6818       if (do_section_groups)
6819         printf (_("\nThere are no section groups in this file.\n"));
6820
6821       return TRUE;
6822     }
6823
6824   section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6825
6826   if (section_groups == NULL)
6827     {
6828       error (_("Out of memory reading %lu groups\n"),
6829              (unsigned long) group_count);
6830       return FALSE;
6831     }
6832
6833   symtab_sec = NULL;
6834   strtab_sec = NULL;
6835   symtab = NULL;
6836   num_syms = 0;
6837   strtab = NULL;
6838   strtab_size = 0;
6839   for (i = 0, section = filedata->section_headers, group = section_groups;
6840        i < filedata->file_header.e_shnum;
6841        i++, section++)
6842     {
6843       if (section->sh_type == SHT_GROUP)
6844         {
6845           const char * name = printable_section_name (filedata, section);
6846           const char * group_name;
6847           unsigned char * start;
6848           unsigned char * indices;
6849           unsigned int entry, j, size;
6850           Elf_Internal_Shdr * sec;
6851           Elf_Internal_Sym * sym;
6852
6853           /* Get the symbol table.  */
6854           if (section->sh_link >= filedata->file_header.e_shnum
6855               || ((sec = filedata->section_headers + section->sh_link)->sh_type
6856                   != SHT_SYMTAB))
6857             {
6858               error (_("Bad sh_link in group section `%s'\n"), name);
6859               continue;
6860             }
6861
6862           if (symtab_sec != sec)
6863             {
6864               symtab_sec = sec;
6865               if (symtab)
6866                 free (symtab);
6867               symtab = GET_ELF_SYMBOLS (filedata, symtab_sec, & num_syms);
6868             }
6869
6870           if (symtab == NULL)
6871             {
6872               error (_("Corrupt header in group section `%s'\n"), name);
6873               continue;
6874             }
6875
6876           if (section->sh_info >= num_syms)
6877             {
6878               error (_("Bad sh_info in group section `%s'\n"), name);
6879               continue;
6880             }
6881
6882           sym = symtab + section->sh_info;
6883
6884           if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6885             {
6886               if (sym->st_shndx == 0
6887                   || sym->st_shndx >= filedata->file_header.e_shnum)
6888                 {
6889                   error (_("Bad sh_info in group section `%s'\n"), name);
6890                   continue;
6891                 }
6892
6893               group_name = SECTION_NAME (filedata->section_headers + sym->st_shndx);
6894               strtab_sec = NULL;
6895               if (strtab)
6896                 free (strtab);
6897               strtab = NULL;
6898               strtab_size = 0;
6899             }
6900           else
6901             {
6902               /* Get the string table.  */
6903               if (symtab_sec->sh_link >= filedata->file_header.e_shnum)
6904                 {
6905                   strtab_sec = NULL;
6906                   if (strtab)
6907                     free (strtab);
6908                   strtab = NULL;
6909                   strtab_size = 0;
6910                 }
6911               else if (strtab_sec
6912                        != (sec = filedata->section_headers + symtab_sec->sh_link))
6913                 {
6914                   strtab_sec = sec;
6915                   if (strtab)
6916                     free (strtab);
6917
6918                   strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
6919                                               1, strtab_sec->sh_size,
6920                                               _("string table"));
6921                   strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6922                 }
6923               group_name = sym->st_name < strtab_size
6924                 ? strtab + sym->st_name : _("<corrupt>");
6925             }
6926
6927           /* PR 17531: file: loop.  */
6928           if (section->sh_entsize > section->sh_size)
6929             {
6930               error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6931                      printable_section_name (filedata, section),
6932                      (unsigned long) section->sh_entsize,
6933                      (unsigned long) section->sh_size);
6934               continue;
6935             }
6936
6937           start = (unsigned char *) get_data (NULL, filedata, section->sh_offset,
6938                                               1, section->sh_size,
6939                                               _("section data"));
6940           if (start == NULL)
6941             continue;
6942
6943           indices = start;
6944           size = (section->sh_size / section->sh_entsize) - 1;
6945           entry = byte_get (indices, 4);
6946           indices += 4;
6947
6948           if (do_section_groups)
6949             {
6950               printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6951                       get_group_flags (entry), i, name, group_name, size);
6952
6953               printf (_("   [Index]    Name\n"));
6954             }
6955
6956           group->group_index = i;
6957
6958           for (j = 0; j < size; j++)
6959             {
6960               struct group_list * g;
6961
6962               entry = byte_get (indices, 4);
6963               indices += 4;
6964
6965               if (entry >= filedata->file_header.e_shnum)
6966                 {
6967                   static unsigned num_group_errors = 0;
6968
6969                   if (num_group_errors ++ < 10)
6970                     {
6971                       error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6972                              entry, i, filedata->file_header.e_shnum - 1);
6973                       if (num_group_errors == 10)
6974                         warn (_("Further error messages about overlarge group section indices suppressed\n"));
6975                     }
6976                   continue;
6977                 }
6978
6979               if (section_headers_groups [entry] != NULL)
6980                 {
6981                   if (entry)
6982                     {
6983                       static unsigned num_errs = 0;
6984
6985                       if (num_errs ++ < 10)
6986                         {
6987                           error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6988                                  entry, i,
6989                                  section_headers_groups [entry]->group_index);
6990                           if (num_errs == 10)
6991                             warn (_("Further error messages about already contained group sections suppressed\n"));
6992                         }
6993                       continue;
6994                     }
6995                   else
6996                     {
6997                       /* Intel C/C++ compiler may put section 0 in a
6998                          section group.  We just warn it the first time
6999                          and ignore it afterwards.  */
7000                       static bfd_boolean warned = FALSE;
7001                       if (!warned)
7002                         {
7003                           error (_("section 0 in group section [%5u]\n"),
7004                                  section_headers_groups [entry]->group_index);
7005                           warned = TRUE;
7006                         }
7007                     }
7008                 }
7009
7010               section_headers_groups [entry] = group;
7011
7012               if (do_section_groups)
7013                 {
7014                   sec = filedata->section_headers + entry;
7015                   printf ("   [%5u]   %s\n", entry, printable_section_name (filedata, sec));
7016                 }
7017
7018               g = (struct group_list *) xmalloc (sizeof (struct group_list));
7019               g->section_index = entry;
7020               g->next = group->root;
7021               group->root = g;
7022             }
7023
7024           if (start)
7025             free (start);
7026
7027           group++;
7028         }
7029     }
7030
7031   if (symtab)
7032     free (symtab);
7033   if (strtab)
7034     free (strtab);
7035   return TRUE;
7036 }
7037
7038 /* Data used to display dynamic fixups.  */
7039
7040 struct ia64_vms_dynfixup
7041 {
7042   bfd_vma needed_ident;         /* Library ident number.  */
7043   bfd_vma needed;               /* Index in the dstrtab of the library name.  */
7044   bfd_vma fixup_needed;         /* Index of the library.  */
7045   bfd_vma fixup_rela_cnt;       /* Number of fixups.  */
7046   bfd_vma fixup_rela_off;       /* Fixups offset in the dynamic segment.  */
7047 };
7048
7049 /* Data used to display dynamic relocations.  */
7050
7051 struct ia64_vms_dynimgrela
7052 {
7053   bfd_vma img_rela_cnt;         /* Number of relocations.  */
7054   bfd_vma img_rela_off;         /* Reloc offset in the dynamic segment.  */
7055 };
7056
7057 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
7058    library).  */
7059
7060 static bfd_boolean
7061 dump_ia64_vms_dynamic_fixups (Filedata *                  filedata,
7062                               struct ia64_vms_dynfixup *  fixup,
7063                               const char *                strtab,
7064                               unsigned int                strtab_sz)
7065 {
7066   Elf64_External_VMS_IMAGE_FIXUP * imfs;
7067   long i;
7068   const char * lib_name;
7069
7070   imfs = get_data (NULL, filedata, dynamic_addr + fixup->fixup_rela_off,
7071                    1, fixup->fixup_rela_cnt * sizeof (*imfs),
7072                    _("dynamic section image fixups"));
7073   if (!imfs)
7074     return FALSE;
7075
7076   if (fixup->needed < strtab_sz)
7077     lib_name = strtab + fixup->needed;
7078   else
7079     {
7080       warn (_("corrupt library name index of 0x%lx found in dynamic entry"),
7081             (unsigned long) fixup->needed);
7082       lib_name = "???";
7083     }
7084   printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
7085           (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
7086   printf
7087     (_("Seg Offset           Type                             SymVec DataType\n"));
7088
7089   for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
7090     {
7091       unsigned int type;
7092       const char *rtype;
7093
7094       printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
7095       printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
7096       type = BYTE_GET (imfs [i].type);
7097       rtype = elf_ia64_reloc_type (type);
7098       if (rtype == NULL)
7099         printf (" 0x%08x                       ", type);
7100       else
7101         printf (" %-32s ", rtype);
7102       printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
7103       printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
7104     }
7105
7106   free (imfs);
7107   return TRUE;
7108 }
7109
7110 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
7111
7112 static bfd_boolean
7113 dump_ia64_vms_dynamic_relocs (Filedata * filedata, struct ia64_vms_dynimgrela *imgrela)
7114 {
7115   Elf64_External_VMS_IMAGE_RELA *imrs;
7116   long i;
7117
7118   imrs = get_data (NULL, filedata, dynamic_addr + imgrela->img_rela_off,
7119                    1, imgrela->img_rela_cnt * sizeof (*imrs),
7120                    _("dynamic section image relocations"));
7121   if (!imrs)
7122     return FALSE;
7123
7124   printf (_("\nImage relocs\n"));
7125   printf
7126     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
7127
7128   for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
7129     {
7130       unsigned int type;
7131       const char *rtype;
7132
7133       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
7134       printf ("%08" BFD_VMA_FMT "x ",
7135               (bfd_vma) BYTE_GET (imrs [i].rela_offset));
7136       type = BYTE_GET (imrs [i].type);
7137       rtype = elf_ia64_reloc_type (type);
7138       if (rtype == NULL)
7139         printf ("0x%08x                      ", type);
7140       else
7141         printf ("%-31s ", rtype);
7142       print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
7143       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
7144       printf ("%08" BFD_VMA_FMT "x\n",
7145               (bfd_vma) BYTE_GET (imrs [i].sym_offset));
7146     }
7147
7148   free (imrs);
7149   return TRUE;
7150 }
7151
7152 /* Display IA-64 OpenVMS dynamic relocations and fixups.  */
7153
7154 static bfd_boolean
7155 process_ia64_vms_dynamic_relocs (Filedata * filedata)
7156 {
7157   struct ia64_vms_dynfixup fixup;
7158   struct ia64_vms_dynimgrela imgrela;
7159   Elf_Internal_Dyn *entry;
7160   bfd_vma strtab_off = 0;
7161   bfd_vma strtab_sz = 0;
7162   char *strtab = NULL;
7163   bfd_boolean res = TRUE;
7164
7165   memset (&fixup, 0, sizeof (fixup));
7166   memset (&imgrela, 0, sizeof (imgrela));
7167
7168   /* Note: the order of the entries is specified by the OpenVMS specs.  */
7169   for (entry = dynamic_section;
7170        entry < dynamic_section + dynamic_nent;
7171        entry++)
7172     {
7173       switch (entry->d_tag)
7174         {
7175         case DT_IA_64_VMS_STRTAB_OFFSET:
7176           strtab_off = entry->d_un.d_val;
7177           break;
7178         case DT_STRSZ:
7179           strtab_sz = entry->d_un.d_val;
7180           if (strtab == NULL)
7181             strtab = get_data (NULL, filedata, dynamic_addr + strtab_off,
7182                                1, strtab_sz, _("dynamic string section"));
7183           break;
7184
7185         case DT_IA_64_VMS_NEEDED_IDENT:
7186           fixup.needed_ident = entry->d_un.d_val;
7187           break;
7188         case DT_NEEDED:
7189           fixup.needed = entry->d_un.d_val;
7190           break;
7191         case DT_IA_64_VMS_FIXUP_NEEDED:
7192           fixup.fixup_needed = entry->d_un.d_val;
7193           break;
7194         case DT_IA_64_VMS_FIXUP_RELA_CNT:
7195           fixup.fixup_rela_cnt = entry->d_un.d_val;
7196           break;
7197         case DT_IA_64_VMS_FIXUP_RELA_OFF:
7198           fixup.fixup_rela_off = entry->d_un.d_val;
7199           if (! dump_ia64_vms_dynamic_fixups (filedata, &fixup, strtab, strtab_sz))
7200             res = FALSE;
7201           break;
7202         case DT_IA_64_VMS_IMG_RELA_CNT:
7203           imgrela.img_rela_cnt = entry->d_un.d_val;
7204           break;
7205         case DT_IA_64_VMS_IMG_RELA_OFF:
7206           imgrela.img_rela_off = entry->d_un.d_val;
7207           if (! dump_ia64_vms_dynamic_relocs (filedata, &imgrela))
7208             res = FALSE;
7209           break;
7210
7211         default:
7212           break;
7213         }
7214     }
7215
7216   if (strtab != NULL)
7217     free (strtab);
7218
7219   return res;
7220 }
7221
7222 static struct
7223 {
7224   const char * name;
7225   int reloc;
7226   int size;
7227   int rela;
7228 }
7229   dynamic_relocations [] =
7230 {
7231   { "REL", DT_REL, DT_RELSZ, FALSE },
7232   { "RELA", DT_RELA, DT_RELASZ, TRUE },
7233   { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
7234 };
7235
7236 /* Process the reloc section.  */
7237
7238 static bfd_boolean
7239 process_relocs (Filedata * filedata)
7240 {
7241   unsigned long rel_size;
7242   unsigned long rel_offset;
7243
7244   if (!do_reloc)
7245     return TRUE;
7246
7247   if (do_using_dynamic)
7248     {
7249       int          is_rela;
7250       const char * name;
7251       bfd_boolean  has_dynamic_reloc;
7252       unsigned int i;
7253
7254       has_dynamic_reloc = FALSE;
7255
7256       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7257         {
7258           is_rela = dynamic_relocations [i].rela;
7259           name = dynamic_relocations [i].name;
7260           rel_size = dynamic_info [dynamic_relocations [i].size];
7261           rel_offset = dynamic_info [dynamic_relocations [i].reloc];
7262
7263           if (rel_size)
7264             has_dynamic_reloc = TRUE;
7265
7266           if (is_rela == UNKNOWN)
7267             {
7268               if (dynamic_relocations [i].reloc == DT_JMPREL)
7269                 switch (dynamic_info[DT_PLTREL])
7270                   {
7271                   case DT_REL:
7272                     is_rela = FALSE;
7273                     break;
7274                   case DT_RELA:
7275                     is_rela = TRUE;
7276                     break;
7277                   }
7278             }
7279
7280           if (rel_size)
7281             {
7282               printf
7283                 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
7284                  name, rel_offset, rel_size);
7285
7286               dump_relocations (filedata,
7287                                 offset_from_vma (filedata, rel_offset, rel_size),
7288                                 rel_size,
7289                                 dynamic_symbols, num_dynamic_syms,
7290                                 dynamic_strings, dynamic_strings_length,
7291                                 is_rela, TRUE /* is_dynamic */);
7292             }
7293         }
7294
7295       if (is_ia64_vms (filedata))
7296         if (process_ia64_vms_dynamic_relocs (filedata))
7297           has_dynamic_reloc = TRUE;
7298
7299       if (! has_dynamic_reloc)
7300         printf (_("\nThere are no dynamic relocations in this file.\n"));
7301     }
7302   else
7303     {
7304       Elf_Internal_Shdr * section;
7305       unsigned long i;
7306       bfd_boolean found = FALSE;
7307
7308       for (i = 0, section = filedata->section_headers;
7309            i < filedata->file_header.e_shnum;
7310            i++, section++)
7311         {
7312           if (   section->sh_type != SHT_RELA
7313               && section->sh_type != SHT_REL)
7314             continue;
7315
7316           rel_offset = section->sh_offset;
7317           rel_size   = section->sh_size;
7318
7319           if (rel_size)
7320             {
7321               Elf_Internal_Shdr * strsec;
7322               int is_rela;
7323               unsigned long num_rela;
7324
7325               printf (_("\nRelocation section "));
7326
7327               if (filedata->string_table == NULL)
7328                 printf ("%d", section->sh_name);
7329               else
7330                 printf ("'%s'", printable_section_name (filedata, section));
7331
7332               num_rela = rel_size / section->sh_entsize;
7333               printf (ngettext (" at offset 0x%lx contains %lu entry:\n",
7334                                 " at offset 0x%lx contains %lu entries:\n",
7335                                 num_rela),
7336                       rel_offset, num_rela);
7337
7338               is_rela = section->sh_type == SHT_RELA;
7339
7340               if (section->sh_link != 0
7341                   && section->sh_link < filedata->file_header.e_shnum)
7342                 {
7343                   Elf_Internal_Shdr * symsec;
7344                   Elf_Internal_Sym *  symtab;
7345                   unsigned long nsyms;
7346                   unsigned long strtablen = 0;
7347                   char * strtab = NULL;
7348
7349                   symsec = filedata->section_headers + section->sh_link;
7350                   if (symsec->sh_type != SHT_SYMTAB
7351                       && symsec->sh_type != SHT_DYNSYM)
7352                     continue;
7353
7354                   symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
7355
7356                   if (symtab == NULL)
7357                     continue;
7358
7359                   if (symsec->sh_link != 0
7360                       && symsec->sh_link < filedata->file_header.e_shnum)
7361                     {
7362                       strsec = filedata->section_headers + symsec->sh_link;
7363
7364                       strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7365                                                   1, strsec->sh_size,
7366                                                   _("string table"));
7367                       strtablen = strtab == NULL ? 0 : strsec->sh_size;
7368                     }
7369
7370                   dump_relocations (filedata, rel_offset, rel_size,
7371                                     symtab, nsyms, strtab, strtablen,
7372                                     is_rela,
7373                                     symsec->sh_type == SHT_DYNSYM);
7374                   if (strtab)
7375                     free (strtab);
7376                   free (symtab);
7377                 }
7378               else
7379                 dump_relocations (filedata, rel_offset, rel_size,
7380                                   NULL, 0, NULL, 0, is_rela,
7381                                   FALSE /* is_dynamic */);
7382
7383               found = TRUE;
7384             }
7385         }
7386
7387       if (! found)
7388         {
7389           /* Users sometimes forget the -D option, so try to be helpful.  */
7390           for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7391             {
7392               if (dynamic_info [dynamic_relocations [i].size])
7393                 {
7394                   printf (_("\nThere are no static relocations in this file."));
7395                   printf (_("\nTo see the dynamic relocations add --use-dynamic to the command line.\n"));
7396
7397                   break;
7398                 }
7399             }
7400           if (i == ARRAY_SIZE (dynamic_relocations))
7401             printf (_("\nThere are no relocations in this file.\n"));
7402         }
7403     }
7404
7405   return TRUE;
7406 }
7407
7408 /* An absolute address consists of a section and an offset.  If the
7409    section is NULL, the offset itself is the address, otherwise, the
7410    address equals to LOAD_ADDRESS(section) + offset.  */
7411
7412 struct absaddr
7413 {
7414   unsigned short section;
7415   bfd_vma offset;
7416 };
7417
7418 /* Find the nearest symbol at or below ADDR.  Returns the symbol
7419    name, if found, and the offset from the symbol to ADDR.  */
7420
7421 static void
7422 find_symbol_for_address (Filedata *          filedata,
7423                          Elf_Internal_Sym *  symtab,
7424                          unsigned long       nsyms,
7425                          const char *        strtab,
7426                          unsigned long       strtab_size,
7427                          struct absaddr      addr,
7428                          const char **       symname,
7429                          bfd_vma *           offset)
7430 {
7431   bfd_vma dist = 0x100000;
7432   Elf_Internal_Sym * sym;
7433   Elf_Internal_Sym * beg;
7434   Elf_Internal_Sym * end;
7435   Elf_Internal_Sym * best = NULL;
7436
7437   REMOVE_ARCH_BITS (addr.offset);
7438   beg = symtab;
7439   end = symtab + nsyms;
7440
7441   while (beg < end)
7442     {
7443       bfd_vma value;
7444
7445       sym = beg + (end - beg) / 2;
7446
7447       value = sym->st_value;
7448       REMOVE_ARCH_BITS (value);
7449
7450       if (sym->st_name != 0
7451           && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
7452           && addr.offset >= value
7453           && addr.offset - value < dist)
7454         {
7455           best = sym;
7456           dist = addr.offset - value;
7457           if (!dist)
7458             break;
7459         }
7460
7461       if (addr.offset < value)
7462         end = sym;
7463       else
7464         beg = sym + 1;
7465     }
7466
7467   if (best)
7468     {
7469       *symname = (best->st_name >= strtab_size
7470                   ? _("<corrupt>") : strtab + best->st_name);
7471       *offset = dist;
7472       return;
7473     }
7474
7475   *symname = NULL;
7476   *offset = addr.offset;
7477 }
7478
7479 static /* signed */ int
7480 symcmp (const void *p, const void *q)
7481 {
7482   Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7483   Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7484
7485   return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7486 }
7487
7488 /* Process the unwind section.  */
7489
7490 #include "unwind-ia64.h"
7491
7492 struct ia64_unw_table_entry
7493 {
7494   struct absaddr start;
7495   struct absaddr end;
7496   struct absaddr info;
7497 };
7498
7499 struct ia64_unw_aux_info
7500 {
7501   struct ia64_unw_table_entry * table;          /* Unwind table.  */
7502   unsigned long                 table_len;      /* Length of unwind table.  */
7503   unsigned char *               info;           /* Unwind info.  */
7504   unsigned long                 info_size;      /* Size of unwind info.  */
7505   bfd_vma                       info_addr;      /* Starting address of unwind info.  */
7506   bfd_vma                       seg_base;       /* Starting address of segment.  */
7507   Elf_Internal_Sym *            symtab;         /* The symbol table.  */
7508   unsigned long                 nsyms;          /* Number of symbols.  */
7509   Elf_Internal_Sym *            funtab;         /* Sorted table of STT_FUNC symbols.  */
7510   unsigned long                 nfuns;          /* Number of entries in funtab.  */
7511   char *                        strtab;         /* The string table.  */
7512   unsigned long                 strtab_size;    /* Size of string table.  */
7513 };
7514
7515 static bfd_boolean
7516 dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
7517 {
7518   struct ia64_unw_table_entry * tp;
7519   unsigned long j, nfuns;
7520   int in_body;
7521   bfd_boolean res = TRUE;
7522
7523   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7524   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7525     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7526       aux->funtab[nfuns++] = aux->symtab[j];
7527   aux->nfuns = nfuns;
7528   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7529
7530   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7531     {
7532       bfd_vma stamp;
7533       bfd_vma offset;
7534       const unsigned char * dp;
7535       const unsigned char * head;
7536       const unsigned char * end;
7537       const char * procname;
7538
7539       find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7540                                aux->strtab_size, tp->start, &procname, &offset);
7541
7542       fputs ("\n<", stdout);
7543
7544       if (procname)
7545         {
7546           fputs (procname, stdout);
7547
7548           if (offset)
7549             printf ("+%lx", (unsigned long) offset);
7550         }
7551
7552       fputs (">: [", stdout);
7553       print_vma (tp->start.offset, PREFIX_HEX);
7554       fputc ('-', stdout);
7555       print_vma (tp->end.offset, PREFIX_HEX);
7556       printf ("], info at +0x%lx\n",
7557               (unsigned long) (tp->info.offset - aux->seg_base));
7558
7559       /* PR 17531: file: 86232b32.  */
7560       if (aux->info == NULL)
7561         continue;
7562
7563       offset = tp->info.offset;
7564       if (tp->info.section)
7565         {
7566           if (tp->info.section >= filedata->file_header.e_shnum)
7567             {
7568               warn (_("Invalid section %u in table entry %ld\n"),
7569                     tp->info.section, (long) (tp - aux->table));
7570               res = FALSE;
7571               continue;
7572             }
7573           offset += filedata->section_headers[tp->info.section].sh_addr;
7574         }
7575       offset -= aux->info_addr;
7576       /* PR 17531: file: 0997b4d1.  */
7577       if (offset >= aux->info_size)
7578         {
7579           warn (_("Invalid offset %lx in table entry %ld\n"),
7580                 (long) tp->info.offset, (long) (tp - aux->table));
7581           res = FALSE;
7582           continue;
7583         }
7584
7585       head = aux->info + offset;
7586       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7587
7588       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7589               (unsigned) UNW_VER (stamp),
7590               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7591               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7592               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7593               (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7594
7595       if (UNW_VER (stamp) != 1)
7596         {
7597           printf (_("\tUnknown version.\n"));
7598           continue;
7599         }
7600
7601       in_body = 0;
7602       end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7603       /* PR 17531: file: 16ceda89.  */
7604       if (end > aux->info + aux->info_size)
7605         end = aux->info + aux->info_size;
7606       for (dp = head + 8; dp < end;)
7607         dp = unw_decode (dp, in_body, & in_body, end);
7608     }
7609
7610   free (aux->funtab);
7611
7612   return res;
7613 }
7614
7615 static bfd_boolean
7616 slurp_ia64_unwind_table (Filedata *                  filedata,
7617                          struct ia64_unw_aux_info *  aux,
7618                          Elf_Internal_Shdr *         sec)
7619 {
7620   unsigned long size, nrelas, i;
7621   Elf_Internal_Phdr * seg;
7622   struct ia64_unw_table_entry * tep;
7623   Elf_Internal_Shdr * relsec;
7624   Elf_Internal_Rela * rela;
7625   Elf_Internal_Rela * rp;
7626   unsigned char * table;
7627   unsigned char * tp;
7628   Elf_Internal_Sym * sym;
7629   const char * relname;
7630
7631   aux->table_len = 0;
7632
7633   /* First, find the starting address of the segment that includes
7634      this section: */
7635
7636   if (filedata->file_header.e_phnum)
7637     {
7638       if (! get_program_headers (filedata))
7639           return FALSE;
7640
7641       for (seg = filedata->program_headers;
7642            seg < filedata->program_headers + filedata->file_header.e_phnum;
7643            ++seg)
7644         {
7645           if (seg->p_type != PT_LOAD)
7646             continue;
7647
7648           if (sec->sh_addr >= seg->p_vaddr
7649               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7650             {
7651               aux->seg_base = seg->p_vaddr;
7652               break;
7653             }
7654         }
7655     }
7656
7657   /* Second, build the unwind table from the contents of the unwind section:  */
7658   size = sec->sh_size;
7659   table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7660                                       _("unwind table"));
7661   if (!table)
7662     return FALSE;
7663
7664   aux->table_len = size / (3 * eh_addr_size);
7665   aux->table = (struct ia64_unw_table_entry *)
7666     xcmalloc (aux->table_len, sizeof (aux->table[0]));
7667   tep = aux->table;
7668
7669   for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7670     {
7671       tep->start.section = SHN_UNDEF;
7672       tep->end.section   = SHN_UNDEF;
7673       tep->info.section  = SHN_UNDEF;
7674       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7675       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7676       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7677       tep->start.offset += aux->seg_base;
7678       tep->end.offset   += aux->seg_base;
7679       tep->info.offset  += aux->seg_base;
7680     }
7681   free (table);
7682
7683   /* Third, apply any relocations to the unwind table:  */
7684   for (relsec = filedata->section_headers;
7685        relsec < filedata->section_headers + filedata->file_header.e_shnum;
7686        ++relsec)
7687     {
7688       if (relsec->sh_type != SHT_RELA
7689           || relsec->sh_info >= filedata->file_header.e_shnum
7690           || filedata->section_headers + relsec->sh_info != sec)
7691         continue;
7692
7693       if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
7694                               & rela, & nrelas))
7695         {
7696           free (aux->table);
7697           aux->table = NULL;
7698           aux->table_len = 0;
7699           return FALSE;
7700         }
7701
7702       for (rp = rela; rp < rela + nrelas; ++rp)
7703         {
7704           unsigned int sym_ndx;
7705           unsigned int r_type = get_reloc_type (filedata, rp->r_info);
7706           relname = elf_ia64_reloc_type (r_type);
7707
7708           /* PR 17531: file: 9fa67536.  */
7709           if (relname == NULL)
7710             {
7711               warn (_("Skipping unknown relocation type: %u\n"), r_type);
7712               continue;
7713             }
7714
7715           if (! const_strneq (relname, "R_IA64_SEGREL"))
7716             {
7717               warn (_("Skipping unexpected relocation type: %s\n"), relname);
7718               continue;
7719             }
7720
7721           i = rp->r_offset / (3 * eh_addr_size);
7722
7723           /* PR 17531: file: 5bc8d9bf.  */
7724           if (i >= aux->table_len)
7725             {
7726               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7727               continue;
7728             }
7729
7730           sym_ndx = get_reloc_symindex (rp->r_info);
7731           if (sym_ndx >= aux->nsyms)
7732             {
7733               warn (_("Skipping reloc with invalid symbol index: %u\n"),
7734                     sym_ndx);
7735               continue;
7736             }
7737           sym = aux->symtab + sym_ndx;
7738
7739           switch (rp->r_offset / eh_addr_size % 3)
7740             {
7741             case 0:
7742               aux->table[i].start.section = sym->st_shndx;
7743               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
7744               break;
7745             case 1:
7746               aux->table[i].end.section   = sym->st_shndx;
7747               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
7748               break;
7749             case 2:
7750               aux->table[i].info.section  = sym->st_shndx;
7751               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
7752               break;
7753             default:
7754               break;
7755             }
7756         }
7757
7758       free (rela);
7759     }
7760
7761   return TRUE;
7762 }
7763
7764 static bfd_boolean
7765 ia64_process_unwind (Filedata * filedata)
7766 {
7767   Elf_Internal_Shdr * sec;
7768   Elf_Internal_Shdr * unwsec = NULL;
7769   Elf_Internal_Shdr * strsec;
7770   unsigned long i, unwcount = 0, unwstart = 0;
7771   struct ia64_unw_aux_info aux;
7772   bfd_boolean res = TRUE;
7773
7774   memset (& aux, 0, sizeof (aux));
7775
7776   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
7777     {
7778       if (sec->sh_type == SHT_SYMTAB
7779           && sec->sh_link < filedata->file_header.e_shnum)
7780         {
7781           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
7782
7783           strsec = filedata->section_headers + sec->sh_link;
7784           if (aux.strtab != NULL)
7785             {
7786               error (_("Multiple auxillary string tables encountered\n"));
7787               free (aux.strtab);
7788               res = FALSE;
7789             }
7790           aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7791                                           1, strsec->sh_size,
7792                                           _("string table"));
7793           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7794         }
7795       else if (sec->sh_type == SHT_IA_64_UNWIND)
7796         unwcount++;
7797     }
7798
7799   if (!unwcount)
7800     printf (_("\nThere are no unwind sections in this file.\n"));
7801
7802   while (unwcount-- > 0)
7803     {
7804       char * suffix;
7805       size_t len, len2;
7806
7807       for (i = unwstart, sec = filedata->section_headers + unwstart, unwsec = NULL;
7808            i < filedata->file_header.e_shnum; ++i, ++sec)
7809         if (sec->sh_type == SHT_IA_64_UNWIND)
7810           {
7811             unwsec = sec;
7812             break;
7813           }
7814       /* We have already counted the number of SHT_IA64_UNWIND
7815          sections so the loop above should never fail.  */
7816       assert (unwsec != NULL);
7817
7818       unwstart = i + 1;
7819       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7820
7821       if ((unwsec->sh_flags & SHF_GROUP) != 0)
7822         {
7823           /* We need to find which section group it is in.  */
7824           struct group_list * g;
7825
7826           if (section_headers_groups == NULL
7827               || section_headers_groups [i] == NULL)
7828             i = filedata->file_header.e_shnum;
7829           else
7830             {
7831               g = section_headers_groups [i]->root;
7832
7833               for (; g != NULL; g = g->next)
7834                 {
7835                   sec = filedata->section_headers + g->section_index;
7836
7837                   if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7838                     break;
7839                 }
7840
7841               if (g == NULL)
7842                 i = filedata->file_header.e_shnum;
7843             }
7844         }
7845       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7846         {
7847           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
7848           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7849           suffix = SECTION_NAME (unwsec) + len;
7850           for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7851                ++i, ++sec)
7852             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7853                 && streq (SECTION_NAME (sec) + len2, suffix))
7854               break;
7855         }
7856       else
7857         {
7858           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7859              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
7860           len = sizeof (ELF_STRING_ia64_unwind) - 1;
7861           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7862           suffix = "";
7863           if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7864             suffix = SECTION_NAME (unwsec) + len;
7865           for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7866                ++i, ++sec)
7867             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7868                 && streq (SECTION_NAME (sec) + len2, suffix))
7869               break;
7870         }
7871
7872       if (i == filedata->file_header.e_shnum)
7873         {
7874           printf (_("\nCould not find unwind info section for "));
7875
7876           if (filedata->string_table == NULL)
7877             printf ("%d", unwsec->sh_name);
7878           else
7879             printf ("'%s'", printable_section_name (filedata, unwsec));
7880         }
7881       else
7882         {
7883           aux.info_addr = sec->sh_addr;
7884           aux.info = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1,
7885                                                  sec->sh_size,
7886                                                  _("unwind info"));
7887           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7888
7889           printf (_("\nUnwind section "));
7890
7891           if (filedata->string_table == NULL)
7892             printf ("%d", unwsec->sh_name);
7893           else
7894             printf ("'%s'", printable_section_name (filedata, unwsec));
7895
7896           printf (_(" at offset 0x%lx contains %lu entries:\n"),
7897                   (unsigned long) unwsec->sh_offset,
7898                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7899
7900           if (slurp_ia64_unwind_table (filedata, & aux, unwsec)
7901               && aux.table_len > 0)
7902             dump_ia64_unwind (filedata, & aux);
7903
7904           if (aux.table)
7905             free ((char *) aux.table);
7906           if (aux.info)
7907             free ((char *) aux.info);
7908           aux.table = NULL;
7909           aux.info = NULL;
7910         }
7911     }
7912
7913   if (aux.symtab)
7914     free (aux.symtab);
7915   if (aux.strtab)
7916     free ((char *) aux.strtab);
7917
7918   return res;
7919 }
7920
7921 struct hppa_unw_table_entry
7922 {
7923   struct absaddr start;
7924   struct absaddr end;
7925   unsigned int Cannot_unwind:1;                 /* 0 */
7926   unsigned int Millicode:1;                     /* 1 */
7927   unsigned int Millicode_save_sr0:1;            /* 2 */
7928   unsigned int Region_description:2;            /* 3..4 */
7929   unsigned int reserved1:1;                     /* 5 */
7930   unsigned int Entry_SR:1;                      /* 6 */
7931   unsigned int Entry_FR:4;     /* Number saved     7..10 */
7932   unsigned int Entry_GR:5;     /* Number saved     11..15 */
7933   unsigned int Args_stored:1;                   /* 16 */
7934   unsigned int Variable_Frame:1;                /* 17 */
7935   unsigned int Separate_Package_Body:1;         /* 18 */
7936   unsigned int Frame_Extension_Millicode:1;     /* 19 */
7937   unsigned int Stack_Overflow_Check:1;          /* 20 */
7938   unsigned int Two_Instruction_SP_Increment:1;  /* 21 */
7939   unsigned int Ada_Region:1;                    /* 22 */
7940   unsigned int cxx_info:1;                      /* 23 */
7941   unsigned int cxx_try_catch:1;                 /* 24 */
7942   unsigned int sched_entry_seq:1;               /* 25 */
7943   unsigned int reserved2:1;                     /* 26 */
7944   unsigned int Save_SP:1;                       /* 27 */
7945   unsigned int Save_RP:1;                       /* 28 */
7946   unsigned int Save_MRP_in_frame:1;             /* 29 */
7947   unsigned int extn_ptr_defined:1;              /* 30 */
7948   unsigned int Cleanup_defined:1;               /* 31 */
7949
7950   unsigned int MPE_XL_interrupt_marker:1;       /* 0 */
7951   unsigned int HP_UX_interrupt_marker:1;        /* 1 */
7952   unsigned int Large_frame:1;                   /* 2 */
7953   unsigned int Pseudo_SP_Set:1;                 /* 3 */
7954   unsigned int reserved4:1;                     /* 4 */
7955   unsigned int Total_frame_size:27;             /* 5..31 */
7956 };
7957
7958 struct hppa_unw_aux_info
7959 {
7960   struct hppa_unw_table_entry *  table;         /* Unwind table.  */
7961   unsigned long                  table_len;     /* Length of unwind table.  */
7962   bfd_vma                        seg_base;      /* Starting address of segment.  */
7963   Elf_Internal_Sym *             symtab;        /* The symbol table.  */
7964   unsigned long                  nsyms;         /* Number of symbols.  */
7965   Elf_Internal_Sym *             funtab;        /* Sorted table of STT_FUNC symbols.  */
7966   unsigned long                  nfuns;         /* Number of entries in funtab.  */
7967   char *                         strtab;        /* The string table.  */
7968   unsigned long                  strtab_size;   /* Size of string table.  */
7969 };
7970
7971 static bfd_boolean
7972 dump_hppa_unwind (Filedata * filedata, struct hppa_unw_aux_info * aux)
7973 {
7974   struct hppa_unw_table_entry * tp;
7975   unsigned long j, nfuns;
7976   bfd_boolean res = TRUE;
7977
7978   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7979   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7980     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7981       aux->funtab[nfuns++] = aux->symtab[j];
7982   aux->nfuns = nfuns;
7983   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7984
7985   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7986     {
7987       bfd_vma offset;
7988       const char * procname;
7989
7990       find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7991                                aux->strtab_size, tp->start, &procname,
7992                                &offset);
7993
7994       fputs ("\n<", stdout);
7995
7996       if (procname)
7997         {
7998           fputs (procname, stdout);
7999
8000           if (offset)
8001             printf ("+%lx", (unsigned long) offset);
8002         }
8003
8004       fputs (">: [", stdout);
8005       print_vma (tp->start.offset, PREFIX_HEX);
8006       fputc ('-', stdout);
8007       print_vma (tp->end.offset, PREFIX_HEX);
8008       printf ("]\n\t");
8009
8010 #define PF(_m) if (tp->_m) printf (#_m " ");
8011 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
8012       PF(Cannot_unwind);
8013       PF(Millicode);
8014       PF(Millicode_save_sr0);
8015       /* PV(Region_description);  */
8016       PF(Entry_SR);
8017       PV(Entry_FR);
8018       PV(Entry_GR);
8019       PF(Args_stored);
8020       PF(Variable_Frame);
8021       PF(Separate_Package_Body);
8022       PF(Frame_Extension_Millicode);
8023       PF(Stack_Overflow_Check);
8024       PF(Two_Instruction_SP_Increment);
8025       PF(Ada_Region);
8026       PF(cxx_info);
8027       PF(cxx_try_catch);
8028       PF(sched_entry_seq);
8029       PF(Save_SP);
8030       PF(Save_RP);
8031       PF(Save_MRP_in_frame);
8032       PF(extn_ptr_defined);
8033       PF(Cleanup_defined);
8034       PF(MPE_XL_interrupt_marker);
8035       PF(HP_UX_interrupt_marker);
8036       PF(Large_frame);
8037       PF(Pseudo_SP_Set);
8038       PV(Total_frame_size);
8039 #undef PF
8040 #undef PV
8041     }
8042
8043   printf ("\n");
8044
8045   free (aux->funtab);
8046
8047   return res;
8048 }
8049
8050 static bfd_boolean
8051 slurp_hppa_unwind_table (Filedata *                  filedata,
8052                          struct hppa_unw_aux_info *  aux,
8053                          Elf_Internal_Shdr *         sec)
8054 {
8055   unsigned long size, unw_ent_size, nentries, nrelas, i;
8056   Elf_Internal_Phdr * seg;
8057   struct hppa_unw_table_entry * tep;
8058   Elf_Internal_Shdr * relsec;
8059   Elf_Internal_Rela * rela;
8060   Elf_Internal_Rela * rp;
8061   unsigned char * table;
8062   unsigned char * tp;
8063   Elf_Internal_Sym * sym;
8064   const char * relname;
8065
8066   /* First, find the starting address of the segment that includes
8067      this section.  */
8068   if (filedata->file_header.e_phnum)
8069     {
8070       if (! get_program_headers (filedata))
8071         return FALSE;
8072
8073       for (seg = filedata->program_headers;
8074            seg < filedata->program_headers + filedata->file_header.e_phnum;
8075            ++seg)
8076         {
8077           if (seg->p_type != PT_LOAD)
8078             continue;
8079
8080           if (sec->sh_addr >= seg->p_vaddr
8081               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
8082             {
8083               aux->seg_base = seg->p_vaddr;
8084               break;
8085             }
8086         }
8087     }
8088
8089   /* Second, build the unwind table from the contents of the unwind
8090      section.  */
8091   size = sec->sh_size;
8092   table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
8093                                       _("unwind table"));
8094   if (!table)
8095     return FALSE;
8096
8097   unw_ent_size = 16;
8098   nentries = size / unw_ent_size;
8099   size = unw_ent_size * nentries;
8100
8101   tep = aux->table = (struct hppa_unw_table_entry *)
8102       xcmalloc (nentries, sizeof (aux->table[0]));
8103
8104   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
8105     {
8106       unsigned int tmp1, tmp2;
8107
8108       tep->start.section = SHN_UNDEF;
8109       tep->end.section   = SHN_UNDEF;
8110
8111       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
8112       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
8113       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
8114       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
8115
8116       tep->start.offset += aux->seg_base;
8117       tep->end.offset   += aux->seg_base;
8118
8119       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
8120       tep->Millicode = (tmp1 >> 30) & 0x1;
8121       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
8122       tep->Region_description = (tmp1 >> 27) & 0x3;
8123       tep->reserved1 = (tmp1 >> 26) & 0x1;
8124       tep->Entry_SR = (tmp1 >> 25) & 0x1;
8125       tep->Entry_FR = (tmp1 >> 21) & 0xf;
8126       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
8127       tep->Args_stored = (tmp1 >> 15) & 0x1;
8128       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
8129       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
8130       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
8131       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
8132       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
8133       tep->Ada_Region = (tmp1 >> 9) & 0x1;
8134       tep->cxx_info = (tmp1 >> 8) & 0x1;
8135       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
8136       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
8137       tep->reserved2 = (tmp1 >> 5) & 0x1;
8138       tep->Save_SP = (tmp1 >> 4) & 0x1;
8139       tep->Save_RP = (tmp1 >> 3) & 0x1;
8140       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
8141       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
8142       tep->Cleanup_defined = tmp1 & 0x1;
8143
8144       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
8145       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
8146       tep->Large_frame = (tmp2 >> 29) & 0x1;
8147       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
8148       tep->reserved4 = (tmp2 >> 27) & 0x1;
8149       tep->Total_frame_size = tmp2 & 0x7ffffff;
8150     }
8151   free (table);
8152
8153   /* Third, apply any relocations to the unwind table.  */
8154   for (relsec = filedata->section_headers;
8155        relsec < filedata->section_headers + filedata->file_header.e_shnum;
8156        ++relsec)
8157     {
8158       if (relsec->sh_type != SHT_RELA
8159           || relsec->sh_info >= filedata->file_header.e_shnum
8160           || filedata->section_headers + relsec->sh_info != sec)
8161         continue;
8162
8163       if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
8164                               & rela, & nrelas))
8165         return FALSE;
8166
8167       for (rp = rela; rp < rela + nrelas; ++rp)
8168         {
8169           unsigned int sym_ndx;
8170           unsigned int r_type = get_reloc_type (filedata, rp->r_info);
8171           relname = elf_hppa_reloc_type (r_type);
8172
8173           if (relname == NULL)
8174             {
8175               warn (_("Skipping unknown relocation type: %u\n"), r_type);
8176               continue;
8177             }
8178
8179           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
8180           if (! const_strneq (relname, "R_PARISC_SEGREL"))
8181             {
8182               warn (_("Skipping unexpected relocation type: %s\n"), relname);
8183               continue;
8184             }
8185
8186           i = rp->r_offset / unw_ent_size;
8187           if (i >= aux->table_len)
8188             {
8189               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
8190               continue;
8191             }
8192
8193           sym_ndx = get_reloc_symindex (rp->r_info);
8194           if (sym_ndx >= aux->nsyms)
8195             {
8196               warn (_("Skipping reloc with invalid symbol index: %u\n"),
8197                     sym_ndx);
8198               continue;
8199             }
8200           sym = aux->symtab + sym_ndx;
8201
8202           switch ((rp->r_offset % unw_ent_size) / 4)
8203             {
8204             case 0:
8205               aux->table[i].start.section = sym->st_shndx;
8206               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
8207               break;
8208             case 1:
8209               aux->table[i].end.section   = sym->st_shndx;
8210               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
8211               break;
8212             default:
8213               break;
8214             }
8215         }
8216
8217       free (rela);
8218     }
8219
8220   aux->table_len = nentries;
8221
8222   return TRUE;
8223 }
8224
8225 static bfd_boolean
8226 hppa_process_unwind (Filedata * filedata)
8227 {
8228   struct hppa_unw_aux_info aux;
8229   Elf_Internal_Shdr * unwsec = NULL;
8230   Elf_Internal_Shdr * strsec;
8231   Elf_Internal_Shdr * sec;
8232   unsigned long i;
8233   bfd_boolean res = TRUE;
8234
8235   if (filedata->string_table == NULL)
8236     return FALSE;
8237
8238   memset (& aux, 0, sizeof (aux));
8239
8240   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8241     {
8242       if (sec->sh_type == SHT_SYMTAB
8243           && sec->sh_link < filedata->file_header.e_shnum)
8244         {
8245           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
8246
8247           strsec = filedata->section_headers + sec->sh_link;
8248           if (aux.strtab != NULL)
8249             {
8250               error (_("Multiple auxillary string tables encountered\n"));
8251               free (aux.strtab);
8252               res = FALSE;
8253             }
8254           aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
8255                                           1, strsec->sh_size,
8256                                           _("string table"));
8257           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8258         }
8259       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8260         unwsec = sec;
8261     }
8262
8263   if (!unwsec)
8264     printf (_("\nThere are no unwind sections in this file.\n"));
8265
8266   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8267     {
8268       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8269         {
8270           unsigned long num_unwind = sec->sh_size / 16;
8271
8272           printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
8273                             "contains %lu entry:\n",
8274                             "\nUnwind section '%s' at offset 0x%lx "
8275                             "contains %lu entries:\n",
8276                             num_unwind),
8277                   printable_section_name (filedata, sec),
8278                   (unsigned long) sec->sh_offset,
8279                   num_unwind);
8280
8281           if (! slurp_hppa_unwind_table (filedata, &aux, sec))
8282             res = FALSE;
8283
8284           if (res && aux.table_len > 0)
8285             {
8286               if (! dump_hppa_unwind (filedata, &aux))
8287                 res = FALSE;
8288             }
8289
8290           if (aux.table)
8291             free ((char *) aux.table);
8292           aux.table = NULL;
8293         }
8294     }
8295
8296   if (aux.symtab)
8297     free (aux.symtab);
8298   if (aux.strtab)
8299     free ((char *) aux.strtab);
8300
8301   return res;
8302 }
8303
8304 struct arm_section
8305 {
8306   unsigned char *      data;            /* The unwind data.  */
8307   Elf_Internal_Shdr *  sec;             /* The cached unwind section header.  */
8308   Elf_Internal_Rela *  rela;            /* The cached relocations for this section.  */
8309   unsigned long        nrelas;          /* The number of relocations.  */
8310   unsigned int         rel_type;        /* REL or RELA ?  */
8311   Elf_Internal_Rela *  next_rela;       /* Cyclic pointer to the next reloc to process.  */
8312 };
8313
8314 struct arm_unw_aux_info
8315 {
8316   Filedata *          filedata;         /* The file containing the unwind sections.  */
8317   Elf_Internal_Sym *  symtab;           /* The file's symbol table.  */
8318   unsigned long       nsyms;            /* Number of symbols.  */
8319   Elf_Internal_Sym *  funtab;           /* Sorted table of STT_FUNC symbols.  */
8320   unsigned long       nfuns;            /* Number of these symbols.  */
8321   char *              strtab;           /* The file's string table.  */
8322   unsigned long       strtab_size;      /* Size of string table.  */
8323 };
8324
8325 static const char *
8326 arm_print_vma_and_name (Filedata *                 filedata,
8327                         struct arm_unw_aux_info *  aux,
8328                         bfd_vma                    fn,
8329                         struct absaddr             addr)
8330 {
8331   const char *procname;
8332   bfd_vma sym_offset;
8333
8334   if (addr.section == SHN_UNDEF)
8335     addr.offset = fn;
8336
8337   find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
8338                            aux->strtab_size, addr, &procname,
8339                            &sym_offset);
8340
8341   print_vma (fn, PREFIX_HEX);
8342
8343   if (procname)
8344     {
8345       fputs (" <", stdout);
8346       fputs (procname, stdout);
8347
8348       if (sym_offset)
8349         printf ("+0x%lx", (unsigned long) sym_offset);
8350       fputc ('>', stdout);
8351     }
8352
8353   return procname;
8354 }
8355
8356 static void
8357 arm_free_section (struct arm_section *arm_sec)
8358 {
8359   if (arm_sec->data != NULL)
8360     free (arm_sec->data);
8361
8362   if (arm_sec->rela != NULL)
8363     free (arm_sec->rela);
8364 }
8365
8366 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
8367       cached section and install SEC instead.
8368    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
8369       and return its valued in * WORDP, relocating if necessary.
8370    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
8371       relocation's offset in ADDR.
8372    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
8373       into the string table of the symbol associated with the reloc.  If no
8374       reloc was applied store -1 there.
8375    5) Return TRUE upon success, FALSE otherwise.  */
8376
8377 static bfd_boolean
8378 get_unwind_section_word (Filedata *                 filedata,
8379                          struct arm_unw_aux_info *  aux,
8380                          struct arm_section *       arm_sec,
8381                          Elf_Internal_Shdr *        sec,
8382                          bfd_vma                    word_offset,
8383                          unsigned int *             wordp,
8384                          struct absaddr *           addr,
8385                          bfd_vma *                  sym_name)
8386 {
8387   Elf_Internal_Rela *rp;
8388   Elf_Internal_Sym *sym;
8389   const char * relname;
8390   unsigned int word;
8391   bfd_boolean wrapped;
8392
8393   if (sec == NULL || arm_sec == NULL)
8394     return FALSE;
8395
8396   addr->section = SHN_UNDEF;
8397   addr->offset = 0;
8398
8399   if (sym_name != NULL)
8400     *sym_name = (bfd_vma) -1;
8401
8402   /* If necessary, update the section cache.  */
8403   if (sec != arm_sec->sec)
8404     {
8405       Elf_Internal_Shdr *relsec;
8406
8407       arm_free_section (arm_sec);
8408
8409       arm_sec->sec = sec;
8410       arm_sec->data = get_data (NULL, aux->filedata, sec->sh_offset, 1,
8411                                 sec->sh_size, _("unwind data"));
8412       arm_sec->rela = NULL;
8413       arm_sec->nrelas = 0;
8414
8415       for (relsec = filedata->section_headers;
8416            relsec < filedata->section_headers + filedata->file_header.e_shnum;
8417            ++relsec)
8418         {
8419           if (relsec->sh_info >= filedata->file_header.e_shnum
8420               || filedata->section_headers + relsec->sh_info != sec
8421               /* PR 15745: Check the section type as well.  */
8422               || (relsec->sh_type != SHT_REL
8423                   && relsec->sh_type != SHT_RELA))
8424             continue;
8425
8426           arm_sec->rel_type = relsec->sh_type;
8427           if (relsec->sh_type == SHT_REL)
8428             {
8429               if (!slurp_rel_relocs (aux->filedata, relsec->sh_offset,
8430                                      relsec->sh_size,
8431                                      & arm_sec->rela, & arm_sec->nrelas))
8432                 return FALSE;
8433             }
8434           else /* relsec->sh_type == SHT_RELA */
8435             {
8436               if (!slurp_rela_relocs (aux->filedata, relsec->sh_offset,
8437                                       relsec->sh_size,
8438                                       & arm_sec->rela, & arm_sec->nrelas))
8439                 return FALSE;
8440             }
8441           break;
8442         }
8443
8444       arm_sec->next_rela = arm_sec->rela;
8445     }
8446
8447   /* If there is no unwind data we can do nothing.  */
8448   if (arm_sec->data == NULL)
8449     return FALSE;
8450
8451   /* If the offset is invalid then fail.  */
8452   if (/* PR 21343 *//* PR 18879 */
8453       sec->sh_size < 4
8454       || word_offset > (sec->sh_size - 4)
8455       || ((bfd_signed_vma) word_offset) < 0)
8456     return FALSE;
8457
8458   /* Get the word at the required offset.  */
8459   word = byte_get (arm_sec->data + word_offset, 4);
8460
8461   /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128.  */
8462   if (arm_sec->rela == NULL)
8463     {
8464       * wordp = word;
8465       return TRUE;
8466     }
8467
8468   /* Look through the relocs to find the one that applies to the provided offset.  */
8469   wrapped = FALSE;
8470   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
8471     {
8472       bfd_vma prelval, offset;
8473
8474       if (rp->r_offset > word_offset && !wrapped)
8475         {
8476           rp = arm_sec->rela;
8477           wrapped = TRUE;
8478         }
8479       if (rp->r_offset > word_offset)
8480         break;
8481
8482       if (rp->r_offset & 3)
8483         {
8484           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8485                 (unsigned long) rp->r_offset);
8486           continue;
8487         }
8488
8489       if (rp->r_offset < word_offset)
8490         continue;
8491
8492       /* PR 17531: file: 027-161405-0.004  */
8493       if (aux->symtab == NULL)
8494         continue;
8495
8496       if (arm_sec->rel_type == SHT_REL)
8497         {
8498           offset = word & 0x7fffffff;
8499           if (offset & 0x40000000)
8500             offset |= ~ (bfd_vma) 0x7fffffff;
8501         }
8502       else if (arm_sec->rel_type == SHT_RELA)
8503         offset = rp->r_addend;
8504       else
8505         {
8506           error (_("Unknown section relocation type %d encountered\n"),
8507                  arm_sec->rel_type);
8508           break;
8509         }
8510
8511       /* PR 17531 file: 027-1241568-0.004.  */
8512       if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8513         {
8514           error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8515                  (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8516           break;
8517         }
8518
8519       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
8520       offset += sym->st_value;
8521       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8522
8523       /* Check that we are processing the expected reloc type.  */
8524       if (filedata->file_header.e_machine == EM_ARM)
8525         {
8526           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
8527           if (relname == NULL)
8528             {
8529               warn (_("Skipping unknown ARM relocation type: %d\n"),
8530                     (int) ELF32_R_TYPE (rp->r_info));
8531               continue;
8532             }
8533
8534           if (streq (relname, "R_ARM_NONE"))
8535               continue;
8536
8537           if (! streq (relname, "R_ARM_PREL31"))
8538             {
8539               warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
8540               continue;
8541             }
8542         }
8543       else if (filedata->file_header.e_machine == EM_TI_C6000)
8544         {
8545           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
8546           if (relname == NULL)
8547             {
8548               warn (_("Skipping unknown C6000 relocation type: %d\n"),
8549                     (int) ELF32_R_TYPE (rp->r_info));
8550               continue;
8551             }
8552
8553           if (streq (relname, "R_C6000_NONE"))
8554             continue;
8555
8556           if (! streq (relname, "R_C6000_PREL31"))
8557             {
8558               warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
8559               continue;
8560             }
8561
8562           prelval >>= 1;
8563         }
8564       else
8565         {
8566           /* This function currently only supports ARM and TI unwinders.  */
8567           warn (_("Only TI and ARM unwinders are currently supported\n"));
8568           break;
8569         }
8570
8571       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8572       addr->section = sym->st_shndx;
8573       addr->offset = offset;
8574
8575       if (sym_name)
8576         * sym_name = sym->st_name;
8577       break;
8578     }
8579
8580   *wordp = word;
8581   arm_sec->next_rela = rp;
8582
8583   return TRUE;
8584 }
8585
8586 static const char *tic6x_unwind_regnames[16] =
8587 {
8588   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8589   "A14", "A13", "A12", "A11", "A10",
8590   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8591 };
8592
8593 static void
8594 decode_tic6x_unwind_regmask (unsigned int mask)
8595 {
8596   int i;
8597
8598   for (i = 12; mask; mask >>= 1, i--)
8599     {
8600       if (mask & 1)
8601         {
8602           fputs (tic6x_unwind_regnames[i], stdout);
8603           if (mask > 1)
8604             fputs (", ", stdout);
8605         }
8606     }
8607 }
8608
8609 #define ADVANCE                                                 \
8610   if (remaining == 0 && more_words)                             \
8611     {                                                           \
8612       data_offset += 4;                                         \
8613       if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec,     \
8614                                      data_offset, & word, & addr, NULL))        \
8615         return FALSE;                                           \
8616       remaining = 4;                                            \
8617       more_words--;                                             \
8618     }                                                           \
8619
8620 #define GET_OP(OP)                      \
8621   ADVANCE;                              \
8622   if (remaining)                        \
8623     {                                   \
8624       remaining--;                      \
8625       (OP) = word >> 24;                \
8626       word <<= 8;                       \
8627     }                                   \
8628   else                                  \
8629     {                                   \
8630       printf (_("[Truncated opcode]\n"));       \
8631       return FALSE;                     \
8632     }                                   \
8633   printf ("0x%02x ", OP)
8634
8635 static bfd_boolean
8636 decode_arm_unwind_bytecode (Filedata *                 filedata,
8637                             struct arm_unw_aux_info *  aux,
8638                             unsigned int               word,
8639                             unsigned int               remaining,
8640                             unsigned int               more_words,
8641                             bfd_vma                    data_offset,
8642                             Elf_Internal_Shdr *        data_sec,
8643                             struct arm_section *       data_arm_sec)
8644 {
8645   struct absaddr addr;
8646   bfd_boolean res = TRUE;
8647
8648   /* Decode the unwinding instructions.  */
8649   while (1)
8650     {
8651       unsigned int op, op2;
8652
8653       ADVANCE;
8654       if (remaining == 0)
8655         break;
8656       remaining--;
8657       op = word >> 24;
8658       word <<= 8;
8659
8660       printf ("  0x%02x ", op);
8661
8662       if ((op & 0xc0) == 0x00)
8663         {
8664           int offset = ((op & 0x3f) << 2) + 4;
8665
8666           printf ("     vsp = vsp + %d", offset);
8667         }
8668       else if ((op & 0xc0) == 0x40)
8669         {
8670           int offset = ((op & 0x3f) << 2) + 4;
8671
8672           printf ("     vsp = vsp - %d", offset);
8673         }
8674       else if ((op & 0xf0) == 0x80)
8675         {
8676           GET_OP (op2);
8677           if (op == 0x80 && op2 == 0)
8678             printf (_("Refuse to unwind"));
8679           else
8680             {
8681               unsigned int mask = ((op & 0x0f) << 8) | op2;
8682               bfd_boolean first = TRUE;
8683               int i;
8684
8685               printf ("pop {");
8686               for (i = 0; i < 12; i++)
8687                 if (mask & (1 << i))
8688                   {
8689                     if (first)
8690                       first = FALSE;
8691                     else
8692                       printf (", ");
8693                     printf ("r%d", 4 + i);
8694                   }
8695               printf ("}");
8696             }
8697         }
8698       else if ((op & 0xf0) == 0x90)
8699         {
8700           if (op == 0x9d || op == 0x9f)
8701             printf (_("     [Reserved]"));
8702           else
8703             printf ("     vsp = r%d", op & 0x0f);
8704         }
8705       else if ((op & 0xf0) == 0xa0)
8706         {
8707           int end = 4 + (op & 0x07);
8708           bfd_boolean first = TRUE;
8709           int i;
8710
8711           printf ("     pop {");
8712           for (i = 4; i <= end; i++)
8713             {
8714               if (first)
8715                 first = FALSE;
8716               else
8717                 printf (", ");
8718               printf ("r%d", i);
8719             }
8720           if (op & 0x08)
8721             {
8722               if (!first)
8723                 printf (", ");
8724               printf ("r14");
8725             }
8726           printf ("}");
8727         }
8728       else if (op == 0xb0)
8729         printf (_("     finish"));
8730       else if (op == 0xb1)
8731         {
8732           GET_OP (op2);
8733           if (op2 == 0 || (op2 & 0xf0) != 0)
8734             printf (_("[Spare]"));
8735           else
8736             {
8737               unsigned int mask = op2 & 0x0f;
8738               bfd_boolean first = TRUE;
8739               int i;
8740
8741               printf ("pop {");
8742               for (i = 0; i < 12; i++)
8743                 if (mask & (1 << i))
8744                   {
8745                     if (first)
8746                       first = FALSE;
8747                     else
8748                       printf (", ");
8749                     printf ("r%d", i);
8750                   }
8751               printf ("}");
8752             }
8753         }
8754       else if (op == 0xb2)
8755         {
8756           unsigned char buf[9];
8757           unsigned int i, len;
8758           unsigned long offset;
8759
8760           for (i = 0; i < sizeof (buf); i++)
8761             {
8762               GET_OP (buf[i]);
8763               if ((buf[i] & 0x80) == 0)
8764                 break;
8765             }
8766           if (i == sizeof (buf))
8767             {
8768               error (_("corrupt change to vsp"));
8769               res = FALSE;
8770             }
8771           else
8772             {
8773               offset = read_uleb128 (buf, &len, buf + i + 1);
8774               assert (len == i + 1);
8775               offset = offset * 4 + 0x204;
8776               printf ("vsp = vsp + %ld", offset);
8777             }
8778         }
8779       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8780         {
8781           unsigned int first, last;
8782
8783           GET_OP (op2);
8784           first = op2 >> 4;
8785           last = op2 & 0x0f;
8786           if (op == 0xc8)
8787             first = first + 16;
8788           printf ("pop {D%d", first);
8789           if (last)
8790             printf ("-D%d", first + last);
8791           printf ("}");
8792         }
8793       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8794         {
8795           unsigned int count = op & 0x07;
8796
8797           printf ("pop {D8");
8798           if (count)
8799             printf ("-D%d", 8 + count);
8800           printf ("}");
8801         }
8802       else if (op >= 0xc0 && op <= 0xc5)
8803         {
8804           unsigned int count = op & 0x07;
8805
8806           printf ("     pop {wR10");
8807           if (count)
8808             printf ("-wR%d", 10 + count);
8809           printf ("}");
8810         }
8811       else if (op == 0xc6)
8812         {
8813           unsigned int first, last;
8814
8815           GET_OP (op2);
8816           first = op2 >> 4;
8817           last = op2 & 0x0f;
8818           printf ("pop {wR%d", first);
8819           if (last)
8820             printf ("-wR%d", first + last);
8821           printf ("}");
8822         }
8823       else if (op == 0xc7)
8824         {
8825           GET_OP (op2);
8826           if (op2 == 0 || (op2 & 0xf0) != 0)
8827             printf (_("[Spare]"));
8828           else
8829             {
8830               unsigned int mask = op2 & 0x0f;
8831               bfd_boolean first = TRUE;
8832               int i;
8833
8834               printf ("pop {");
8835               for (i = 0; i < 4; i++)
8836                 if (mask & (1 << i))
8837                   {
8838                     if (first)
8839                       first = FALSE;
8840                     else
8841                       printf (", ");
8842                     printf ("wCGR%d", i);
8843                   }
8844               printf ("}");
8845             }
8846         }
8847       else
8848         {
8849           printf (_("     [unsupported opcode]"));
8850           res = FALSE;
8851         }
8852
8853       printf ("\n");
8854     }
8855
8856   return res;
8857 }
8858
8859 static bfd_boolean
8860 decode_tic6x_unwind_bytecode (Filedata *                 filedata,
8861                               struct arm_unw_aux_info *  aux,
8862                               unsigned int               word,
8863                               unsigned int               remaining,
8864                               unsigned int               more_words,
8865                               bfd_vma                    data_offset,
8866                               Elf_Internal_Shdr *        data_sec,
8867                               struct arm_section *       data_arm_sec)
8868 {
8869   struct absaddr addr;
8870
8871   /* Decode the unwinding instructions.  */
8872   while (1)
8873     {
8874       unsigned int op, op2;
8875
8876       ADVANCE;
8877       if (remaining == 0)
8878         break;
8879       remaining--;
8880       op = word >> 24;
8881       word <<= 8;
8882
8883       printf ("  0x%02x ", op);
8884
8885       if ((op & 0xc0) == 0x00)
8886         {
8887           int offset = ((op & 0x3f) << 3) + 8;
8888           printf ("     sp = sp + %d", offset);
8889         }
8890       else if ((op & 0xc0) == 0x80)
8891         {
8892           GET_OP (op2);
8893           if (op == 0x80 && op2 == 0)
8894             printf (_("Refuse to unwind"));
8895           else
8896             {
8897               unsigned int mask = ((op & 0x1f) << 8) | op2;
8898               if (op & 0x20)
8899                 printf ("pop compact {");
8900               else
8901                 printf ("pop {");
8902
8903               decode_tic6x_unwind_regmask (mask);
8904               printf("}");
8905             }
8906         }
8907       else if ((op & 0xf0) == 0xc0)
8908         {
8909           unsigned int reg;
8910           unsigned int nregs;
8911           unsigned int i;
8912           const char *name;
8913           struct
8914           {
8915             unsigned int offset;
8916             unsigned int reg;
8917           } regpos[16];
8918
8919           /* Scan entire instruction first so that GET_OP output is not
8920              interleaved with disassembly.  */
8921           nregs = 0;
8922           for (i = 0; nregs < (op & 0xf); i++)
8923             {
8924               GET_OP (op2);
8925               reg = op2 >> 4;
8926               if (reg != 0xf)
8927                 {
8928                   regpos[nregs].offset = i * 2;
8929                   regpos[nregs].reg = reg;
8930                   nregs++;
8931                 }
8932
8933               reg = op2 & 0xf;
8934               if (reg != 0xf)
8935                 {
8936                   regpos[nregs].offset = i * 2 + 1;
8937                   regpos[nregs].reg = reg;
8938                   nregs++;
8939                 }
8940             }
8941
8942           printf (_("pop frame {"));
8943           if (nregs == 0)
8944             {
8945               printf (_("*corrupt* - no registers specified"));
8946             }
8947           else
8948             {
8949               reg = nregs - 1;
8950               for (i = i * 2; i > 0; i--)
8951                 {
8952                   if (regpos[reg].offset == i - 1)
8953                     {
8954                       name = tic6x_unwind_regnames[regpos[reg].reg];
8955                       if (reg > 0)
8956                         reg--;
8957                     }
8958                   else
8959                     name = _("[pad]");
8960
8961                   fputs (name, stdout);
8962                   if (i > 1)
8963                     printf (", ");
8964                 }
8965             }
8966
8967           printf ("}");
8968         }
8969       else if (op == 0xd0)
8970         printf ("     MOV FP, SP");
8971       else if (op == 0xd1)
8972         printf ("     __c6xabi_pop_rts");
8973       else if (op == 0xd2)
8974         {
8975           unsigned char buf[9];
8976           unsigned int i, len;
8977           unsigned long offset;
8978
8979           for (i = 0; i < sizeof (buf); i++)
8980             {
8981               GET_OP (buf[i]);
8982               if ((buf[i] & 0x80) == 0)
8983                 break;
8984             }
8985           /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2.  */
8986           if (i == sizeof (buf))
8987             {
8988               warn (_("Corrupt stack pointer adjustment detected\n"));
8989               return FALSE;
8990             }
8991
8992           offset = read_uleb128 (buf, &len, buf + i + 1);
8993           assert (len == i + 1);
8994           offset = offset * 8 + 0x408;
8995           printf (_("sp = sp + %ld"), offset);
8996         }
8997       else if ((op & 0xf0) == 0xe0)
8998         {
8999           if ((op & 0x0f) == 7)
9000             printf ("     RETURN");
9001           else
9002             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
9003         }
9004       else
9005         {
9006           printf (_("     [unsupported opcode]"));
9007         }
9008       putchar ('\n');
9009     }
9010
9011   return TRUE;
9012 }
9013
9014 static bfd_vma
9015 arm_expand_prel31 (Filedata * filedata, bfd_vma word, bfd_vma where)
9016 {
9017   bfd_vma offset;
9018
9019   offset = word & 0x7fffffff;
9020   if (offset & 0x40000000)
9021     offset |= ~ (bfd_vma) 0x7fffffff;
9022
9023   if (filedata->file_header.e_machine == EM_TI_C6000)
9024     offset <<= 1;
9025
9026   return offset + where;
9027 }
9028
9029 static bfd_boolean
9030 decode_arm_unwind (Filedata *                 filedata,
9031                    struct arm_unw_aux_info *  aux,
9032                    unsigned int               word,
9033                    unsigned int               remaining,
9034                    bfd_vma                    data_offset,
9035                    Elf_Internal_Shdr *        data_sec,
9036                    struct arm_section *       data_arm_sec)
9037 {
9038   int per_index;
9039   unsigned int more_words = 0;
9040   struct absaddr addr;
9041   bfd_vma sym_name = (bfd_vma) -1;
9042   bfd_boolean res = TRUE;
9043
9044   if (remaining == 0)
9045     {
9046       /* Fetch the first word.
9047          Note - when decoding an object file the address extracted
9048          here will always be 0.  So we also pass in the sym_name
9049          parameter so that we can find the symbol associated with
9050          the personality routine.  */
9051       if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, data_offset,
9052                                      & word, & addr, & sym_name))
9053         return FALSE;
9054
9055       remaining = 4;
9056     }
9057   else
9058     {
9059       addr.section = SHN_UNDEF;
9060       addr.offset = 0;
9061     }
9062
9063   if ((word & 0x80000000) == 0)
9064     {
9065       /* Expand prel31 for personality routine.  */
9066       bfd_vma fn;
9067       const char *procname;
9068
9069       fn = arm_expand_prel31 (filedata, word, data_sec->sh_addr + data_offset);
9070       printf (_("  Personality routine: "));
9071       if (fn == 0
9072           && addr.section == SHN_UNDEF && addr.offset == 0
9073           && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
9074         {
9075           procname = aux->strtab + sym_name;
9076           print_vma (fn, PREFIX_HEX);
9077           if (procname)
9078             {
9079               fputs (" <", stdout);
9080               fputs (procname, stdout);
9081               fputc ('>', stdout);
9082             }
9083         }
9084       else
9085         procname = arm_print_vma_and_name (filedata, aux, fn, addr);
9086       fputc ('\n', stdout);
9087
9088       /* The GCC personality routines use the standard compact
9089          encoding, starting with one byte giving the number of
9090          words.  */
9091       if (procname != NULL
9092           && (const_strneq (procname, "__gcc_personality_v0")
9093               || const_strneq (procname, "__gxx_personality_v0")
9094               || const_strneq (procname, "__gcj_personality_v0")
9095               || const_strneq (procname, "__gnu_objc_personality_v0")))
9096         {
9097           remaining = 0;
9098           more_words = 1;
9099           ADVANCE;
9100           if (!remaining)
9101             {
9102               printf (_("  [Truncated data]\n"));
9103               return FALSE;
9104             }
9105           more_words = word >> 24;
9106           word <<= 8;
9107           remaining--;
9108           per_index = -1;
9109         }
9110       else
9111         return TRUE;
9112     }
9113   else
9114     {
9115       /* ARM EHABI Section 6.3:
9116
9117          An exception-handling table entry for the compact model looks like:
9118
9119            31 30-28 27-24 23-0
9120            -- ----- ----- ----
9121             1   0   index Data for personalityRoutine[index]    */
9122
9123       if (filedata->file_header.e_machine == EM_ARM
9124           && (word & 0x70000000))
9125         {
9126           warn (_("Corrupt ARM compact model table entry: %x \n"), word);
9127           res = FALSE;
9128         }
9129
9130       per_index = (word >> 24) & 0x7f;
9131       printf (_("  Compact model index: %d\n"), per_index);
9132       if (per_index == 0)
9133         {
9134           more_words = 0;
9135           word <<= 8;
9136           remaining--;
9137         }
9138       else if (per_index < 3)
9139         {
9140           more_words = (word >> 16) & 0xff;
9141           word <<= 16;
9142           remaining -= 2;
9143         }
9144     }
9145
9146   switch (filedata->file_header.e_machine)
9147     {
9148     case EM_ARM:
9149       if (per_index < 3)
9150         {
9151           if (! decode_arm_unwind_bytecode (filedata, aux, word, remaining, more_words,
9152                                             data_offset, data_sec, data_arm_sec))
9153             res = FALSE;
9154         }
9155       else
9156         {
9157           warn (_("Unknown ARM compact model index encountered\n"));
9158           printf (_("  [reserved]\n"));
9159           res = FALSE;
9160         }
9161       break;
9162
9163     case EM_TI_C6000:
9164       if (per_index < 3)
9165         {
9166           if (! decode_tic6x_unwind_bytecode (filedata, aux, word, remaining, more_words,
9167                                               data_offset, data_sec, data_arm_sec))
9168             res = FALSE;
9169         }
9170       else if (per_index < 5)
9171         {
9172           if (((word >> 17) & 0x7f) == 0x7f)
9173             printf (_("  Restore stack from frame pointer\n"));
9174           else
9175             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
9176           printf (_("  Registers restored: "));
9177           if (per_index == 4)
9178             printf (" (compact) ");
9179           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
9180           putchar ('\n');
9181           printf (_("  Return register: %s\n"),
9182                   tic6x_unwind_regnames[word & 0xf]);
9183         }
9184       else
9185         printf (_("  [reserved (%d)]\n"), per_index);
9186       break;
9187
9188     default:
9189       error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
9190              filedata->file_header.e_machine);
9191       res = FALSE;
9192     }
9193
9194   /* Decode the descriptors.  Not implemented.  */
9195
9196   return res;
9197 }
9198
9199 static bfd_boolean
9200 dump_arm_unwind (Filedata *                 filedata,
9201                  struct arm_unw_aux_info *  aux,
9202                  Elf_Internal_Shdr *        exidx_sec)
9203 {
9204   struct arm_section exidx_arm_sec, extab_arm_sec;
9205   unsigned int i, exidx_len;
9206   unsigned long j, nfuns;
9207   bfd_boolean res = TRUE;
9208
9209   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
9210   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
9211   exidx_len = exidx_sec->sh_size / 8;
9212
9213   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
9214   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
9215     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
9216       aux->funtab[nfuns++] = aux->symtab[j];
9217   aux->nfuns = nfuns;
9218   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
9219
9220   for (i = 0; i < exidx_len; i++)
9221     {
9222       unsigned int exidx_fn, exidx_entry;
9223       struct absaddr fn_addr, entry_addr;
9224       bfd_vma fn;
9225
9226       fputc ('\n', stdout);
9227
9228       if (! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9229                                      8 * i, & exidx_fn, & fn_addr, NULL)
9230           || ! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9231                                         8 * i + 4, & exidx_entry, & entry_addr, NULL))
9232         {
9233           free (aux->funtab);
9234           arm_free_section (& exidx_arm_sec);
9235           arm_free_section (& extab_arm_sec);
9236           return FALSE;
9237         }
9238
9239       /* ARM EHABI, Section 5:
9240          An index table entry consists of 2 words.
9241          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
9242       if (exidx_fn & 0x80000000)
9243         {
9244           warn (_("corrupt index table entry: %x\n"), exidx_fn);
9245           res = FALSE;
9246         }
9247
9248       fn = arm_expand_prel31 (filedata, exidx_fn, exidx_sec->sh_addr + 8 * i);
9249
9250       arm_print_vma_and_name (filedata, aux, fn, fn_addr);
9251       fputs (": ", stdout);
9252
9253       if (exidx_entry == 1)
9254         {
9255           print_vma (exidx_entry, PREFIX_HEX);
9256           fputs (" [cantunwind]\n", stdout);
9257         }
9258       else if (exidx_entry & 0x80000000)
9259         {
9260           print_vma (exidx_entry, PREFIX_HEX);
9261           fputc ('\n', stdout);
9262           decode_arm_unwind (filedata, aux, exidx_entry, 4, 0, NULL, NULL);
9263         }
9264       else
9265         {
9266           bfd_vma table, table_offset = 0;
9267           Elf_Internal_Shdr *table_sec;
9268
9269           fputs ("@", stdout);
9270           table = arm_expand_prel31 (filedata, exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
9271           print_vma (table, PREFIX_HEX);
9272           printf ("\n");
9273
9274           /* Locate the matching .ARM.extab.  */
9275           if (entry_addr.section != SHN_UNDEF
9276               && entry_addr.section < filedata->file_header.e_shnum)
9277             {
9278               table_sec = filedata->section_headers + entry_addr.section;
9279               table_offset = entry_addr.offset;
9280               /* PR 18879 */
9281               if (table_offset > table_sec->sh_size
9282                   || ((bfd_signed_vma) table_offset) < 0)
9283                 {
9284                   warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
9285                         (unsigned long) table_offset,
9286                         printable_section_name (filedata, table_sec));
9287                   res = FALSE;
9288                   continue;
9289                 }
9290             }
9291           else
9292             {
9293               table_sec = find_section_by_address (filedata, table);
9294               if (table_sec != NULL)
9295                 table_offset = table - table_sec->sh_addr;
9296             }
9297
9298           if (table_sec == NULL)
9299             {
9300               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
9301                     (unsigned long) table);
9302               res = FALSE;
9303               continue;
9304             }
9305
9306           if (! decode_arm_unwind (filedata, aux, 0, 0, table_offset, table_sec,
9307                                    &extab_arm_sec))
9308             res = FALSE;
9309         }
9310     }
9311
9312   printf ("\n");
9313
9314   free (aux->funtab);
9315   arm_free_section (&exidx_arm_sec);
9316   arm_free_section (&extab_arm_sec);
9317
9318   return res;
9319 }
9320
9321 /* Used for both ARM and C6X unwinding tables.  */
9322
9323 static bfd_boolean
9324 arm_process_unwind (Filedata * filedata)
9325 {
9326   struct arm_unw_aux_info aux;
9327   Elf_Internal_Shdr *unwsec = NULL;
9328   Elf_Internal_Shdr *strsec;
9329   Elf_Internal_Shdr *sec;
9330   unsigned long i;
9331   unsigned int sec_type;
9332   bfd_boolean res = TRUE;
9333
9334   switch (filedata->file_header.e_machine)
9335     {
9336     case EM_ARM:
9337       sec_type = SHT_ARM_EXIDX;
9338       break;
9339
9340     case EM_TI_C6000:
9341       sec_type = SHT_C6000_UNWIND;
9342       break;
9343
9344     default:
9345       error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
9346              filedata->file_header.e_machine);
9347       return FALSE;
9348     }
9349
9350   if (filedata->string_table == NULL)
9351     return FALSE;
9352
9353   memset (& aux, 0, sizeof (aux));
9354   aux.filedata = filedata;
9355
9356   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9357     {
9358       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < filedata->file_header.e_shnum)
9359         {
9360           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
9361
9362           strsec = filedata->section_headers + sec->sh_link;
9363
9364           /* PR binutils/17531 file: 011-12666-0.004.  */
9365           if (aux.strtab != NULL)
9366             {
9367               error (_("Multiple string tables found in file.\n"));
9368               free (aux.strtab);
9369               res = FALSE;
9370             }
9371           aux.strtab = get_data (NULL, filedata, strsec->sh_offset,
9372                                  1, strsec->sh_size, _("string table"));
9373           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
9374         }
9375       else if (sec->sh_type == sec_type)
9376         unwsec = sec;
9377     }
9378
9379   if (unwsec == NULL)
9380     printf (_("\nThere are no unwind sections in this file.\n"));
9381   else
9382     for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9383       {
9384         if (sec->sh_type == sec_type)
9385           {
9386             unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size);
9387             printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
9388                               "contains %lu entry:\n",
9389                               "\nUnwind section '%s' at offset 0x%lx "
9390                               "contains %lu entries:\n",
9391                               num_unwind),
9392                     printable_section_name (filedata, sec),
9393                     (unsigned long) sec->sh_offset,
9394                     num_unwind);
9395
9396             if (! dump_arm_unwind (filedata, &aux, sec))
9397               res = FALSE;
9398           }
9399       }
9400
9401   if (aux.symtab)
9402     free (aux.symtab);
9403   if (aux.strtab)
9404     free ((char *) aux.strtab);
9405
9406   return res;
9407 }
9408
9409 static bfd_boolean
9410 process_unwind (Filedata * filedata)
9411 {
9412   struct unwind_handler
9413   {
9414     unsigned int machtype;
9415     bfd_boolean (* handler)(Filedata *);
9416   } handlers[] =
9417   {
9418     { EM_ARM, arm_process_unwind },
9419     { EM_IA_64, ia64_process_unwind },
9420     { EM_PARISC, hppa_process_unwind },
9421     { EM_TI_C6000, arm_process_unwind },
9422     { 0, NULL }
9423   };
9424   int i;
9425
9426   if (!do_unwind)
9427     return TRUE;
9428
9429   for (i = 0; handlers[i].handler != NULL; i++)
9430     if (filedata->file_header.e_machine == handlers[i].machtype)
9431       return handlers[i].handler (filedata);
9432
9433   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
9434           get_machine_name (filedata->file_header.e_machine));
9435   return TRUE;
9436 }
9437
9438 static void
9439 dynamic_section_aarch64_val (Elf_Internal_Dyn * entry)
9440 {
9441   switch (entry->d_tag)
9442     {
9443     case DT_AARCH64_BTI_PLT:
9444     case DT_AARCH64_PAC_PLT:
9445       break;
9446     default:
9447       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9448       break;
9449     }
9450   putchar ('\n');
9451 }
9452
9453 static void
9454 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
9455 {
9456   switch (entry->d_tag)
9457     {
9458     case DT_MIPS_FLAGS:
9459       if (entry->d_un.d_val == 0)
9460         printf (_("NONE"));
9461       else
9462         {
9463           static const char * opts[] =
9464           {
9465             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
9466             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
9467             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
9468             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
9469             "RLD_ORDER_SAFE"
9470           };
9471           unsigned int cnt;
9472           bfd_boolean first = TRUE;
9473
9474           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
9475             if (entry->d_un.d_val & (1 << cnt))
9476               {
9477                 printf ("%s%s", first ? "" : " ", opts[cnt]);
9478                 first = FALSE;
9479               }
9480         }
9481       break;
9482
9483     case DT_MIPS_IVERSION:
9484       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9485         printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
9486       else
9487         {
9488           char buf[40];
9489           sprintf_vma (buf, entry->d_un.d_ptr);
9490           /* Note: coded this way so that there is a single string for translation.  */
9491           printf (_("<corrupt: %s>"), buf);
9492         }
9493       break;
9494
9495     case DT_MIPS_TIME_STAMP:
9496       {
9497         char timebuf[128];
9498         struct tm * tmp;
9499         time_t atime = entry->d_un.d_val;
9500
9501         tmp = gmtime (&atime);
9502         /* PR 17531: file: 6accc532.  */
9503         if (tmp == NULL)
9504           snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
9505         else
9506           snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
9507                     tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9508                     tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9509         printf (_("Time Stamp: %s"), timebuf);
9510       }
9511       break;
9512
9513     case DT_MIPS_RLD_VERSION:
9514     case DT_MIPS_LOCAL_GOTNO:
9515     case DT_MIPS_CONFLICTNO:
9516     case DT_MIPS_LIBLISTNO:
9517     case DT_MIPS_SYMTABNO:
9518     case DT_MIPS_UNREFEXTNO:
9519     case DT_MIPS_HIPAGENO:
9520     case DT_MIPS_DELTA_CLASS_NO:
9521     case DT_MIPS_DELTA_INSTANCE_NO:
9522     case DT_MIPS_DELTA_RELOC_NO:
9523     case DT_MIPS_DELTA_SYM_NO:
9524     case DT_MIPS_DELTA_CLASSSYM_NO:
9525     case DT_MIPS_COMPACT_SIZE:
9526       print_vma (entry->d_un.d_val, DEC);
9527       break;
9528
9529     default:
9530       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9531     }
9532     putchar ('\n');
9533 }
9534
9535 static void
9536 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
9537 {
9538   switch (entry->d_tag)
9539     {
9540     case DT_HP_DLD_FLAGS:
9541       {
9542         static struct
9543         {
9544           long int bit;
9545           const char * str;
9546         }
9547         flags[] =
9548         {
9549           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
9550           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
9551           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
9552           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
9553           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
9554           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
9555           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9556           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9557           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9558           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
9559           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9560           { DT_HP_GST, "HP_GST" },
9561           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9562           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9563           { DT_HP_NODELETE, "HP_NODELETE" },
9564           { DT_HP_GROUP, "HP_GROUP" },
9565           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
9566         };
9567         bfd_boolean first = TRUE;
9568         size_t cnt;
9569         bfd_vma val = entry->d_un.d_val;
9570
9571         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
9572           if (val & flags[cnt].bit)
9573             {
9574               if (! first)
9575                 putchar (' ');
9576               fputs (flags[cnt].str, stdout);
9577               first = FALSE;
9578               val ^= flags[cnt].bit;
9579             }
9580
9581         if (val != 0 || first)
9582           {
9583             if (! first)
9584               putchar (' ');
9585             print_vma (val, HEX);
9586           }
9587       }
9588       break;
9589
9590     default:
9591       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9592       break;
9593     }
9594   putchar ('\n');
9595 }
9596
9597 #ifdef BFD64
9598
9599 /* VMS vs Unix time offset and factor.  */
9600
9601 #define VMS_EPOCH_OFFSET 35067168000000000LL
9602 #define VMS_GRANULARITY_FACTOR 10000000
9603
9604 /* Display a VMS time in a human readable format.  */
9605
9606 static void
9607 print_vms_time (bfd_int64_t vmstime)
9608 {
9609   struct tm *tm;
9610   time_t unxtime;
9611
9612   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9613   tm = gmtime (&unxtime);
9614   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9615           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9616           tm->tm_hour, tm->tm_min, tm->tm_sec);
9617 }
9618 #endif /* BFD64 */
9619
9620 static void
9621 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
9622 {
9623   switch (entry->d_tag)
9624     {
9625     case DT_IA_64_PLT_RESERVE:
9626       /* First 3 slots reserved.  */
9627       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9628       printf (" -- ");
9629       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
9630       break;
9631
9632     case DT_IA_64_VMS_LINKTIME:
9633 #ifdef BFD64
9634       print_vms_time (entry->d_un.d_val);
9635 #endif
9636       break;
9637
9638     case DT_IA_64_VMS_LNKFLAGS:
9639       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9640       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9641         printf (" CALL_DEBUG");
9642       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9643         printf (" NOP0BUFS");
9644       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9645         printf (" P0IMAGE");
9646       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9647         printf (" MKTHREADS");
9648       if (entry->d_un.d_val & VMS_LF_UPCALLS)
9649         printf (" UPCALLS");
9650       if (entry->d_un.d_val & VMS_LF_IMGSTA)
9651         printf (" IMGSTA");
9652       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9653         printf (" INITIALIZE");
9654       if (entry->d_un.d_val & VMS_LF_MAIN)
9655         printf (" MAIN");
9656       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9657         printf (" EXE_INIT");
9658       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9659         printf (" TBK_IN_IMG");
9660       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9661         printf (" DBG_IN_IMG");
9662       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9663         printf (" TBK_IN_DSF");
9664       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9665         printf (" DBG_IN_DSF");
9666       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9667         printf (" SIGNATURES");
9668       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9669         printf (" REL_SEG_OFF");
9670       break;
9671
9672     default:
9673       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9674       break;
9675     }
9676   putchar ('\n');
9677 }
9678
9679 static bfd_boolean
9680 get_32bit_dynamic_section (Filedata * filedata)
9681 {
9682   Elf32_External_Dyn * edyn;
9683   Elf32_External_Dyn * ext;
9684   Elf_Internal_Dyn * entry;
9685
9686   edyn = (Elf32_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9687                                           dynamic_size, _("dynamic section"));
9688   if (!edyn)
9689     return FALSE;
9690
9691   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9692      might not have the luxury of section headers.  Look for the DT_NULL
9693      terminator to determine the number of entries.  */
9694   for (ext = edyn, dynamic_nent = 0;
9695        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9696        ext++)
9697     {
9698       dynamic_nent++;
9699       if (BYTE_GET (ext->d_tag) == DT_NULL)
9700         break;
9701     }
9702
9703   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9704                                                   sizeof (* entry));
9705   if (dynamic_section == NULL)
9706     {
9707       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9708              (unsigned long) dynamic_nent);
9709       free (edyn);
9710       return FALSE;
9711     }
9712
9713   for (ext = edyn, entry = dynamic_section;
9714        entry < dynamic_section + dynamic_nent;
9715        ext++, entry++)
9716     {
9717       entry->d_tag      = BYTE_GET (ext->d_tag);
9718       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9719     }
9720
9721   free (edyn);
9722
9723   return TRUE;
9724 }
9725
9726 static bfd_boolean
9727 get_64bit_dynamic_section (Filedata * filedata)
9728 {
9729   Elf64_External_Dyn * edyn;
9730   Elf64_External_Dyn * ext;
9731   Elf_Internal_Dyn * entry;
9732
9733   /* Read in the data.  */
9734   edyn = (Elf64_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9735                                           dynamic_size, _("dynamic section"));
9736   if (!edyn)
9737     return FALSE;
9738
9739   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9740      might not have the luxury of section headers.  Look for the DT_NULL
9741      terminator to determine the number of entries.  */
9742   for (ext = edyn, dynamic_nent = 0;
9743        /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer.  */
9744        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9745        ext++)
9746     {
9747       dynamic_nent++;
9748       if (BYTE_GET (ext->d_tag) == DT_NULL)
9749         break;
9750     }
9751
9752   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9753                                                   sizeof (* entry));
9754   if (dynamic_section == NULL)
9755     {
9756       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9757              (unsigned long) dynamic_nent);
9758       free (edyn);
9759       return FALSE;
9760     }
9761
9762   /* Convert from external to internal formats.  */
9763   for (ext = edyn, entry = dynamic_section;
9764        entry < dynamic_section + dynamic_nent;
9765        ext++, entry++)
9766     {
9767       entry->d_tag      = BYTE_GET (ext->d_tag);
9768       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9769     }
9770
9771   free (edyn);
9772
9773   return TRUE;
9774 }
9775
9776 static void
9777 print_dynamic_flags (bfd_vma flags)
9778 {
9779   bfd_boolean first = TRUE;
9780
9781   while (flags)
9782     {
9783       bfd_vma flag;
9784
9785       flag = flags & - flags;
9786       flags &= ~ flag;
9787
9788       if (first)
9789         first = FALSE;
9790       else
9791         putc (' ', stdout);
9792
9793       switch (flag)
9794         {
9795         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
9796         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
9797         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
9798         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
9799         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
9800         default:                fputs (_("unknown"), stdout); break;
9801         }
9802     }
9803   puts ("");
9804 }
9805
9806 /* Parse and display the contents of the dynamic section.  */
9807
9808 static bfd_boolean
9809 process_dynamic_section (Filedata * filedata)
9810 {
9811   Elf_Internal_Dyn * entry;
9812
9813   if (dynamic_size == 0)
9814     {
9815       if (do_dynamic)
9816         printf (_("\nThere is no dynamic section in this file.\n"));
9817
9818       return TRUE;
9819     }
9820
9821   if (is_32bit_elf)
9822     {
9823       if (! get_32bit_dynamic_section (filedata))
9824         return FALSE;
9825     }
9826   else
9827     {
9828       if (! get_64bit_dynamic_section (filedata))
9829         return FALSE;
9830     }
9831
9832   /* Find the appropriate symbol table.  */
9833   if (dynamic_symbols == NULL)
9834     {
9835       for (entry = dynamic_section;
9836            entry < dynamic_section + dynamic_nent;
9837            ++entry)
9838         {
9839           Elf_Internal_Shdr section;
9840
9841           if (entry->d_tag != DT_SYMTAB)
9842             continue;
9843
9844           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9845
9846           /* Since we do not know how big the symbol table is,
9847              we default to reading in the entire file (!) and
9848              processing that.  This is overkill, I know, but it
9849              should work.  */
9850           section.sh_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9851           if ((bfd_size_type) section.sh_offset > filedata->file_size)
9852             {
9853               /* See PR 21379 for a reproducer.  */
9854               error (_("Invalid DT_SYMTAB entry: %lx"), (long) section.sh_offset);
9855               return FALSE;
9856             }
9857
9858           if (archive_file_offset != 0)
9859             section.sh_size = archive_file_size - section.sh_offset;
9860           else
9861             section.sh_size = filedata->file_size - section.sh_offset;
9862
9863           if (is_32bit_elf)
9864             section.sh_entsize = sizeof (Elf32_External_Sym);
9865           else
9866             section.sh_entsize = sizeof (Elf64_External_Sym);
9867           section.sh_name = filedata->string_table_length;
9868
9869           if (dynamic_symbols != NULL)
9870             {
9871               error (_("Multiple dynamic symbol table sections found\n"));
9872               free (dynamic_symbols);
9873             }
9874           dynamic_symbols = GET_ELF_SYMBOLS (filedata, &section, & num_dynamic_syms);
9875           if (num_dynamic_syms < 1)
9876             {
9877               error (_("Unable to determine the number of symbols to load\n"));
9878               continue;
9879             }
9880         }
9881     }
9882
9883   /* Similarly find a string table.  */
9884   if (dynamic_strings == NULL)
9885     {
9886       for (entry = dynamic_section;
9887            entry < dynamic_section + dynamic_nent;
9888            ++entry)
9889         {
9890           unsigned long offset;
9891           long str_tab_len;
9892
9893           if (entry->d_tag != DT_STRTAB)
9894             continue;
9895
9896           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9897
9898           /* Since we do not know how big the string table is,
9899              we default to reading in the entire file (!) and
9900              processing that.  This is overkill, I know, but it
9901              should work.  */
9902
9903           offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9904
9905           if (archive_file_offset != 0)
9906             str_tab_len = archive_file_size - offset;
9907           else
9908             str_tab_len = filedata->file_size - offset;
9909
9910           if (str_tab_len < 1)
9911             {
9912               error
9913                 (_("Unable to determine the length of the dynamic string table\n"));
9914               continue;
9915             }
9916
9917           if (dynamic_strings != NULL)
9918             {
9919               error (_("Multiple dynamic string tables found\n"));
9920               free (dynamic_strings);
9921             }
9922
9923           dynamic_strings = (char *) get_data (NULL, filedata, offset, 1,
9924                                                str_tab_len,
9925                                                _("dynamic string table"));
9926           dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9927         }
9928     }
9929
9930   /* And find the syminfo section if available.  */
9931   if (dynamic_syminfo == NULL)
9932     {
9933       unsigned long syminsz = 0;
9934
9935       for (entry = dynamic_section;
9936            entry < dynamic_section + dynamic_nent;
9937            ++entry)
9938         {
9939           if (entry->d_tag == DT_SYMINENT)
9940             {
9941               /* Note: these braces are necessary to avoid a syntax
9942                  error from the SunOS4 C compiler.  */
9943               /* PR binutils/17531: A corrupt file can trigger this test.
9944                  So do not use an assert, instead generate an error message.  */
9945               if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9946                 error (_("Bad value (%d) for SYMINENT entry\n"),
9947                        (int) entry->d_un.d_val);
9948             }
9949           else if (entry->d_tag == DT_SYMINSZ)
9950             syminsz = entry->d_un.d_val;
9951           else if (entry->d_tag == DT_SYMINFO)
9952             dynamic_syminfo_offset = offset_from_vma (filedata, entry->d_un.d_val,
9953                                                       syminsz);
9954         }
9955
9956       if (dynamic_syminfo_offset != 0 && syminsz != 0)
9957         {
9958           Elf_External_Syminfo * extsyminfo;
9959           Elf_External_Syminfo * extsym;
9960           Elf_Internal_Syminfo * syminfo;
9961
9962           /* There is a syminfo section.  Read the data.  */
9963           extsyminfo = (Elf_External_Syminfo *)
9964               get_data (NULL, filedata, dynamic_syminfo_offset, 1, syminsz,
9965                         _("symbol information"));
9966           if (!extsyminfo)
9967             return FALSE;
9968
9969           if (dynamic_syminfo != NULL)
9970             {
9971               error (_("Multiple dynamic symbol information sections found\n"));
9972               free (dynamic_syminfo);
9973             }
9974           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9975           if (dynamic_syminfo == NULL)
9976             {
9977               error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9978                      (unsigned long) syminsz);
9979               return FALSE;
9980             }
9981
9982           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9983           for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9984                syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9985                ++syminfo, ++extsym)
9986             {
9987               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9988               syminfo->si_flags = BYTE_GET (extsym->si_flags);
9989             }
9990
9991           free (extsyminfo);
9992         }
9993     }
9994
9995   if (do_dynamic && dynamic_addr)
9996     printf (ngettext ("\nDynamic section at offset 0x%lx "
9997                       "contains %lu entry:\n",
9998                       "\nDynamic section at offset 0x%lx "
9999                       "contains %lu entries:\n",
10000                       dynamic_nent),
10001             dynamic_addr, (unsigned long) dynamic_nent);
10002   if (do_dynamic)
10003     printf (_("  Tag        Type                         Name/Value\n"));
10004
10005   for (entry = dynamic_section;
10006        entry < dynamic_section + dynamic_nent;
10007        entry++)
10008     {
10009       if (do_dynamic)
10010         {
10011           const char * dtype;
10012
10013           putchar (' ');
10014           print_vma (entry->d_tag, FULL_HEX);
10015           dtype = get_dynamic_type (filedata, entry->d_tag);
10016           printf (" (%s)%*s", dtype,
10017                   ((is_32bit_elf ? 27 : 19) - (int) strlen (dtype)), " ");
10018         }
10019
10020       switch (entry->d_tag)
10021         {
10022         case DT_FLAGS:
10023           if (do_dynamic)
10024             print_dynamic_flags (entry->d_un.d_val);
10025           break;
10026
10027         case DT_AUXILIARY:
10028         case DT_FILTER:
10029         case DT_CONFIG:
10030         case DT_DEPAUDIT:
10031         case DT_AUDIT:
10032           if (do_dynamic)
10033             {
10034               switch (entry->d_tag)
10035                 {
10036                 case DT_AUXILIARY:
10037                   printf (_("Auxiliary library"));
10038                   break;
10039
10040                 case DT_FILTER:
10041                   printf (_("Filter library"));
10042                   break;
10043
10044                 case DT_CONFIG:
10045                   printf (_("Configuration file"));
10046                   break;
10047
10048                 case DT_DEPAUDIT:
10049                   printf (_("Dependency audit library"));
10050                   break;
10051
10052                 case DT_AUDIT:
10053                   printf (_("Audit library"));
10054                   break;
10055                 }
10056
10057               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
10058                 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
10059               else
10060                 {
10061                   printf (": ");
10062                   print_vma (entry->d_un.d_val, PREFIX_HEX);
10063                   putchar ('\n');
10064                 }
10065             }
10066           break;
10067
10068         case DT_FEATURE:
10069           if (do_dynamic)
10070             {
10071               printf (_("Flags:"));
10072
10073               if (entry->d_un.d_val == 0)
10074                 printf (_(" None\n"));
10075               else
10076                 {
10077                   unsigned long int val = entry->d_un.d_val;
10078
10079                   if (val & DTF_1_PARINIT)
10080                     {
10081                       printf (" PARINIT");
10082                       val ^= DTF_1_PARINIT;
10083                     }
10084                   if (val & DTF_1_CONFEXP)
10085                     {
10086                       printf (" CONFEXP");
10087                       val ^= DTF_1_CONFEXP;
10088                     }
10089                   if (val != 0)
10090                     printf (" %lx", val);
10091                   puts ("");
10092                 }
10093             }
10094           break;
10095
10096         case DT_POSFLAG_1:
10097           if (do_dynamic)
10098             {
10099               printf (_("Flags:"));
10100
10101               if (entry->d_un.d_val == 0)
10102                 printf (_(" None\n"));
10103               else
10104                 {
10105                   unsigned long int val = entry->d_un.d_val;
10106
10107                   if (val & DF_P1_LAZYLOAD)
10108                     {
10109                       printf (" LAZYLOAD");
10110                       val ^= DF_P1_LAZYLOAD;
10111                     }
10112                   if (val & DF_P1_GROUPPERM)
10113                     {
10114                       printf (" GROUPPERM");
10115                       val ^= DF_P1_GROUPPERM;
10116                     }
10117                   if (val != 0)
10118                     printf (" %lx", val);
10119                   puts ("");
10120                 }
10121             }
10122           break;
10123
10124         case DT_FLAGS_1:
10125           if (do_dynamic)
10126             {
10127               printf (_("Flags:"));
10128               if (entry->d_un.d_val == 0)
10129                 printf (_(" None\n"));
10130               else
10131                 {
10132                   unsigned long int val = entry->d_un.d_val;
10133
10134                   if (val & DF_1_NOW)
10135                     {
10136                       printf (" NOW");
10137                       val ^= DF_1_NOW;
10138                     }
10139                   if (val & DF_1_GLOBAL)
10140                     {
10141                       printf (" GLOBAL");
10142                       val ^= DF_1_GLOBAL;
10143                     }
10144                   if (val & DF_1_GROUP)
10145                     {
10146                       printf (" GROUP");
10147                       val ^= DF_1_GROUP;
10148                     }
10149                   if (val & DF_1_NODELETE)
10150                     {
10151                       printf (" NODELETE");
10152                       val ^= DF_1_NODELETE;
10153                     }
10154                   if (val & DF_1_LOADFLTR)
10155                     {
10156                       printf (" LOADFLTR");
10157                       val ^= DF_1_LOADFLTR;
10158                     }
10159                   if (val & DF_1_INITFIRST)
10160                     {
10161                       printf (" INITFIRST");
10162                       val ^= DF_1_INITFIRST;
10163                     }
10164                   if (val & DF_1_NOOPEN)
10165                     {
10166                       printf (" NOOPEN");
10167                       val ^= DF_1_NOOPEN;
10168                     }
10169                   if (val & DF_1_ORIGIN)
10170                     {
10171                       printf (" ORIGIN");
10172                       val ^= DF_1_ORIGIN;
10173                     }
10174                   if (val & DF_1_DIRECT)
10175                     {
10176                       printf (" DIRECT");
10177                       val ^= DF_1_DIRECT;
10178                     }
10179                   if (val & DF_1_TRANS)
10180                     {
10181                       printf (" TRANS");
10182                       val ^= DF_1_TRANS;
10183                     }
10184                   if (val & DF_1_INTERPOSE)
10185                     {
10186                       printf (" INTERPOSE");
10187                       val ^= DF_1_INTERPOSE;
10188                     }
10189                   if (val & DF_1_NODEFLIB)
10190                     {
10191                       printf (" NODEFLIB");
10192                       val ^= DF_1_NODEFLIB;
10193                     }
10194                   if (val & DF_1_NODUMP)
10195                     {
10196                       printf (" NODUMP");
10197                       val ^= DF_1_NODUMP;
10198                     }
10199                   if (val & DF_1_CONFALT)
10200                     {
10201                       printf (" CONFALT");
10202                       val ^= DF_1_CONFALT;
10203                     }
10204                   if (val & DF_1_ENDFILTEE)
10205                     {
10206                       printf (" ENDFILTEE");
10207                       val ^= DF_1_ENDFILTEE;
10208                     }
10209                   if (val & DF_1_DISPRELDNE)
10210                     {
10211                       printf (" DISPRELDNE");
10212                       val ^= DF_1_DISPRELDNE;
10213                     }
10214                   if (val & DF_1_DISPRELPND)
10215                     {
10216                       printf (" DISPRELPND");
10217                       val ^= DF_1_DISPRELPND;
10218                     }
10219                   if (val & DF_1_NODIRECT)
10220                     {
10221                       printf (" NODIRECT");
10222                       val ^= DF_1_NODIRECT;
10223                     }
10224                   if (val & DF_1_IGNMULDEF)
10225                     {
10226                       printf (" IGNMULDEF");
10227                       val ^= DF_1_IGNMULDEF;
10228                     }
10229                   if (val & DF_1_NOKSYMS)
10230                     {
10231                       printf (" NOKSYMS");
10232                       val ^= DF_1_NOKSYMS;
10233                     }
10234                   if (val & DF_1_NOHDR)
10235                     {
10236                       printf (" NOHDR");
10237                       val ^= DF_1_NOHDR;
10238                     }
10239                   if (val & DF_1_EDITED)
10240                     {
10241                       printf (" EDITED");
10242                       val ^= DF_1_EDITED;
10243                     }
10244                   if (val & DF_1_NORELOC)
10245                     {
10246                       printf (" NORELOC");
10247                       val ^= DF_1_NORELOC;
10248                     }
10249                   if (val & DF_1_SYMINTPOSE)
10250                     {
10251                       printf (" SYMINTPOSE");
10252                       val ^= DF_1_SYMINTPOSE;
10253                     }
10254                   if (val & DF_1_GLOBAUDIT)
10255                     {
10256                       printf (" GLOBAUDIT");
10257                       val ^= DF_1_GLOBAUDIT;
10258                     }
10259                   if (val & DF_1_SINGLETON)
10260                     {
10261                       printf (" SINGLETON");
10262                       val ^= DF_1_SINGLETON;
10263                     }
10264                   if (val & DF_1_STUB)
10265                     {
10266                       printf (" STUB");
10267                       val ^= DF_1_STUB;
10268                     }
10269                   if (val & DF_1_PIE)
10270                     {
10271                       printf (" PIE");
10272                       val ^= DF_1_PIE;
10273                     }
10274                   if (val & DF_1_KMOD)
10275                     {
10276                       printf (" KMOD");
10277                       val ^= DF_1_KMOD;
10278                     }
10279                   if (val & DF_1_WEAKFILTER)
10280                     {
10281                       printf (" WEAKFILTER");
10282                       val ^= DF_1_WEAKFILTER;
10283                     }
10284                   if (val & DF_1_NOCOMMON)
10285                     {
10286                       printf (" NOCOMMON");
10287                       val ^= DF_1_NOCOMMON;
10288                     }
10289                   if (val != 0)
10290                     printf (" %lx", val);
10291                   puts ("");
10292                 }
10293             }
10294           break;
10295
10296         case DT_PLTREL:
10297           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10298           if (do_dynamic)
10299             puts (get_dynamic_type (filedata, entry->d_un.d_val));
10300           break;
10301
10302         case DT_NULL    :
10303         case DT_NEEDED  :
10304         case DT_PLTGOT  :
10305         case DT_HASH    :
10306         case DT_STRTAB  :
10307         case DT_SYMTAB  :
10308         case DT_RELA    :
10309         case DT_INIT    :
10310         case DT_FINI    :
10311         case DT_SONAME  :
10312         case DT_RPATH   :
10313         case DT_SYMBOLIC:
10314         case DT_REL     :
10315         case DT_DEBUG   :
10316         case DT_TEXTREL :
10317         case DT_JMPREL  :
10318         case DT_RUNPATH :
10319           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10320
10321           if (do_dynamic)
10322             {
10323               char * name;
10324
10325               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
10326                 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10327               else
10328                 name = NULL;
10329
10330               if (name)
10331                 {
10332                   switch (entry->d_tag)
10333                     {
10334                     case DT_NEEDED:
10335                       printf (_("Shared library: [%s]"), name);
10336
10337                       if (streq (name, program_interpreter))
10338                         printf (_(" program interpreter"));
10339                       break;
10340
10341                     case DT_SONAME:
10342                       printf (_("Library soname: [%s]"), name);
10343                       break;
10344
10345                     case DT_RPATH:
10346                       printf (_("Library rpath: [%s]"), name);
10347                       break;
10348
10349                     case DT_RUNPATH:
10350                       printf (_("Library runpath: [%s]"), name);
10351                       break;
10352
10353                     default:
10354                       print_vma (entry->d_un.d_val, PREFIX_HEX);
10355                       break;
10356                     }
10357                 }
10358               else
10359                 print_vma (entry->d_un.d_val, PREFIX_HEX);
10360
10361               putchar ('\n');
10362             }
10363           break;
10364
10365         case DT_PLTRELSZ:
10366         case DT_RELASZ  :
10367         case DT_STRSZ   :
10368         case DT_RELSZ   :
10369         case DT_RELAENT :
10370         case DT_SYMENT  :
10371         case DT_RELENT  :
10372           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10373           /* Fall through.  */
10374         case DT_PLTPADSZ:
10375         case DT_MOVEENT :
10376         case DT_MOVESZ  :
10377         case DT_INIT_ARRAYSZ:
10378         case DT_FINI_ARRAYSZ:
10379         case DT_GNU_CONFLICTSZ:
10380         case DT_GNU_LIBLISTSZ:
10381           if (do_dynamic)
10382             {
10383               print_vma (entry->d_un.d_val, UNSIGNED);
10384               printf (_(" (bytes)\n"));
10385             }
10386           break;
10387
10388         case DT_VERDEFNUM:
10389         case DT_VERNEEDNUM:
10390         case DT_RELACOUNT:
10391         case DT_RELCOUNT:
10392           if (do_dynamic)
10393             {
10394               print_vma (entry->d_un.d_val, UNSIGNED);
10395               putchar ('\n');
10396             }
10397           break;
10398
10399         case DT_SYMINSZ:
10400         case DT_SYMINENT:
10401         case DT_SYMINFO:
10402         case DT_USED:
10403         case DT_INIT_ARRAY:
10404         case DT_FINI_ARRAY:
10405           if (do_dynamic)
10406             {
10407               if (entry->d_tag == DT_USED
10408                   && VALID_DYNAMIC_NAME (entry->d_un.d_val))
10409                 {
10410                   char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10411
10412                   if (*name)
10413                     {
10414                       printf (_("Not needed object: [%s]\n"), name);
10415                       break;
10416                     }
10417                 }
10418
10419               print_vma (entry->d_un.d_val, PREFIX_HEX);
10420               putchar ('\n');
10421             }
10422           break;
10423
10424         case DT_BIND_NOW:
10425           /* The value of this entry is ignored.  */
10426           if (do_dynamic)
10427             putchar ('\n');
10428           break;
10429
10430         case DT_GNU_PRELINKED:
10431           if (do_dynamic)
10432             {
10433               struct tm * tmp;
10434               time_t atime = entry->d_un.d_val;
10435
10436               tmp = gmtime (&atime);
10437               /* PR 17533 file: 041-1244816-0.004.  */
10438               if (tmp == NULL)
10439                 printf (_("<corrupt time val: %lx"),
10440                         (unsigned long) atime);
10441               else
10442                 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
10443                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
10444                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
10445
10446             }
10447           break;
10448
10449         case DT_GNU_HASH:
10450           dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
10451           if (do_dynamic)
10452             {
10453               print_vma (entry->d_un.d_val, PREFIX_HEX);
10454               putchar ('\n');
10455             }
10456           break;
10457
10458         default:
10459           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
10460             version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
10461               entry->d_un.d_val;
10462
10463           if (do_dynamic)
10464             {
10465               switch (filedata->file_header.e_machine)
10466                 {
10467                 case EM_AARCH64:
10468                   dynamic_section_aarch64_val (entry);
10469                   break;
10470                 case EM_MIPS:
10471                 case EM_MIPS_RS3_LE:
10472                   dynamic_section_mips_val (entry);
10473                   break;
10474                 case EM_PARISC:
10475                   dynamic_section_parisc_val (entry);
10476                   break;
10477                 case EM_IA_64:
10478                   dynamic_section_ia64_val (entry);
10479                   break;
10480                 default:
10481                   print_vma (entry->d_un.d_val, PREFIX_HEX);
10482                   putchar ('\n');
10483                 }
10484             }
10485           break;
10486         }
10487     }
10488
10489   return TRUE;
10490 }
10491
10492 static char *
10493 get_ver_flags (unsigned int flags)
10494 {
10495   static char buff[128];
10496
10497   buff[0] = 0;
10498
10499   if (flags == 0)
10500     return _("none");
10501
10502   if (flags & VER_FLG_BASE)
10503     strcat (buff, "BASE");
10504
10505   if (flags & VER_FLG_WEAK)
10506     {
10507       if (flags & VER_FLG_BASE)
10508         strcat (buff, " | ");
10509
10510       strcat (buff, "WEAK");
10511     }
10512
10513   if (flags & VER_FLG_INFO)
10514     {
10515       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
10516         strcat (buff, " | ");
10517
10518       strcat (buff, "INFO");
10519     }
10520
10521   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10522     {
10523       if (flags & (VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10524         strcat (buff, " | ");
10525
10526       strcat (buff, _("<unknown>"));
10527     }
10528
10529   return buff;
10530 }
10531
10532 /* Display the contents of the version sections.  */
10533
10534 static bfd_boolean
10535 process_version_sections (Filedata * filedata)
10536 {
10537   Elf_Internal_Shdr * section;
10538   unsigned i;
10539   bfd_boolean found = FALSE;
10540
10541   if (! do_version)
10542     return TRUE;
10543
10544   for (i = 0, section = filedata->section_headers;
10545        i < filedata->file_header.e_shnum;
10546        i++, section++)
10547     {
10548       switch (section->sh_type)
10549         {
10550         case SHT_GNU_verdef:
10551           {
10552             Elf_External_Verdef * edefs;
10553             unsigned long idx;
10554             unsigned long cnt;
10555             char * endbuf;
10556
10557             found = TRUE;
10558
10559             printf (ngettext ("\nVersion definition section '%s' "
10560                               "contains %u entry:\n",
10561                               "\nVersion definition section '%s' "
10562                               "contains %u entries:\n",
10563                               section->sh_info),
10564                     printable_section_name (filedata, section),
10565                     section->sh_info);
10566
10567             printf (_(" Addr: 0x"));
10568             printf_vma (section->sh_addr);
10569             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10570                     (unsigned long) section->sh_offset, section->sh_link,
10571                     printable_section_name_from_index (filedata, section->sh_link));
10572
10573             edefs = (Elf_External_Verdef *)
10574                 get_data (NULL, filedata, section->sh_offset, 1,section->sh_size,
10575                           _("version definition section"));
10576             if (!edefs)
10577               break;
10578             endbuf = (char *) edefs + section->sh_size;
10579
10580             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10581               {
10582                 char * vstart;
10583                 Elf_External_Verdef * edef;
10584                 Elf_Internal_Verdef ent;
10585                 Elf_External_Verdaux * eaux;
10586                 Elf_Internal_Verdaux aux;
10587                 unsigned long isum;
10588                 int j;
10589
10590                 vstart = ((char *) edefs) + idx;
10591                 if (vstart + sizeof (*edef) > endbuf)
10592                   break;
10593
10594                 edef = (Elf_External_Verdef *) vstart;
10595
10596                 ent.vd_version = BYTE_GET (edef->vd_version);
10597                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
10598                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
10599                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
10600                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
10601                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
10602                 ent.vd_next    = BYTE_GET (edef->vd_next);
10603
10604                 printf (_("  %#06lx: Rev: %d  Flags: %s"),
10605                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
10606
10607                 printf (_("  Index: %d  Cnt: %d  "),
10608                         ent.vd_ndx, ent.vd_cnt);
10609
10610                 /* Check for overflow.  */
10611                 if (ent.vd_aux > (size_t) (endbuf - vstart))
10612                   break;
10613
10614                 vstart += ent.vd_aux;
10615
10616                 if (vstart + sizeof (*eaux) > endbuf)
10617                   break;
10618                 eaux = (Elf_External_Verdaux *) vstart;
10619
10620                 aux.vda_name = BYTE_GET (eaux->vda_name);
10621                 aux.vda_next = BYTE_GET (eaux->vda_next);
10622
10623                 if (VALID_DYNAMIC_NAME (aux.vda_name))
10624                   printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
10625                 else
10626                   printf (_("Name index: %ld\n"), aux.vda_name);
10627
10628                 isum = idx + ent.vd_aux;
10629
10630                 for (j = 1; j < ent.vd_cnt; j++)
10631                   {
10632                     if (aux.vda_next < sizeof (*eaux)
10633                         && !(j == ent.vd_cnt - 1 && aux.vda_next == 0))
10634                       {
10635                         warn (_("Invalid vda_next field of %lx\n"),
10636                               aux.vda_next);
10637                         j = ent.vd_cnt;
10638                         break;
10639                       }
10640                     /* Check for overflow.  */
10641                     if (aux.vda_next > (size_t) (endbuf - vstart))
10642                       break;
10643
10644                     isum   += aux.vda_next;
10645                     vstart += aux.vda_next;
10646
10647                     if (vstart + sizeof (*eaux) > endbuf)
10648                       break;
10649                     eaux = (Elf_External_Verdaux *) vstart;
10650
10651                     aux.vda_name = BYTE_GET (eaux->vda_name);
10652                     aux.vda_next = BYTE_GET (eaux->vda_next);
10653
10654                     if (VALID_DYNAMIC_NAME (aux.vda_name))
10655                       printf (_("  %#06lx: Parent %d: %s\n"),
10656                               isum, j, GET_DYNAMIC_NAME (aux.vda_name));
10657                     else
10658                       printf (_("  %#06lx: Parent %d, name index: %ld\n"),
10659                               isum, j, aux.vda_name);
10660                   }
10661
10662                 if (j < ent.vd_cnt)
10663                   printf (_("  Version def aux past end of section\n"));
10664
10665                 /* PR 17531:
10666                    file: id:000001,src:000172+005151,op:splice,rep:2.  */
10667                 if (ent.vd_next < sizeof (*edef)
10668                     && !(cnt == section->sh_info - 1 && ent.vd_next == 0))
10669                   {
10670                     warn (_("Invalid vd_next field of %lx\n"), ent.vd_next);
10671                     cnt = section->sh_info;
10672                     break;
10673                   }
10674                 if (ent.vd_next > (size_t) (endbuf - ((char *) edefs + idx)))
10675                   break;
10676
10677                 idx += ent.vd_next;
10678               }
10679
10680             if (cnt < section->sh_info)
10681               printf (_("  Version definition past end of section\n"));
10682
10683             free (edefs);
10684           }
10685           break;
10686
10687         case SHT_GNU_verneed:
10688           {
10689             Elf_External_Verneed * eneed;
10690             unsigned long idx;
10691             unsigned long cnt;
10692             char * endbuf;
10693
10694             found = TRUE;
10695
10696             printf (ngettext ("\nVersion needs section '%s' "
10697                               "contains %u entry:\n",
10698                               "\nVersion needs section '%s' "
10699                               "contains %u entries:\n",
10700                               section->sh_info),
10701                     printable_section_name (filedata, section), section->sh_info);
10702
10703             printf (_(" Addr: 0x"));
10704             printf_vma (section->sh_addr);
10705             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10706                     (unsigned long) section->sh_offset, section->sh_link,
10707                     printable_section_name_from_index (filedata, section->sh_link));
10708
10709             eneed = (Elf_External_Verneed *) get_data (NULL, filedata,
10710                                                        section->sh_offset, 1,
10711                                                        section->sh_size,
10712                                                        _("Version Needs section"));
10713             if (!eneed)
10714               break;
10715             endbuf = (char *) eneed + section->sh_size;
10716
10717             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10718               {
10719                 Elf_External_Verneed * entry;
10720                 Elf_Internal_Verneed ent;
10721                 unsigned long isum;
10722                 int j;
10723                 char * vstart;
10724
10725                 vstart = ((char *) eneed) + idx;
10726                 if (vstart + sizeof (*entry) > endbuf)
10727                   break;
10728
10729                 entry = (Elf_External_Verneed *) vstart;
10730
10731                 ent.vn_version = BYTE_GET (entry->vn_version);
10732                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
10733                 ent.vn_file    = BYTE_GET (entry->vn_file);
10734                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
10735                 ent.vn_next    = BYTE_GET (entry->vn_next);
10736
10737                 printf (_("  %#06lx: Version: %d"), idx, ent.vn_version);
10738
10739                 if (VALID_DYNAMIC_NAME (ent.vn_file))
10740                   printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
10741                 else
10742                   printf (_("  File: %lx"), ent.vn_file);
10743
10744                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
10745
10746                 /* Check for overflow.  */
10747                 if (ent.vn_aux > (size_t) (endbuf - vstart))
10748                   break;
10749                 vstart += ent.vn_aux;
10750
10751                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10752                   {
10753                     Elf_External_Vernaux * eaux;
10754                     Elf_Internal_Vernaux aux;
10755
10756                     if (vstart + sizeof (*eaux) > endbuf)
10757                       break;
10758                     eaux = (Elf_External_Vernaux *) vstart;
10759
10760                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
10761                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
10762                     aux.vna_other = BYTE_GET (eaux->vna_other);
10763                     aux.vna_name  = BYTE_GET (eaux->vna_name);
10764                     aux.vna_next  = BYTE_GET (eaux->vna_next);
10765
10766                     if (VALID_DYNAMIC_NAME (aux.vna_name))
10767                       printf (_("  %#06lx:   Name: %s"),
10768                               isum, GET_DYNAMIC_NAME (aux.vna_name));
10769                     else
10770                       printf (_("  %#06lx:   Name index: %lx"),
10771                               isum, aux.vna_name);
10772
10773                     printf (_("  Flags: %s  Version: %d\n"),
10774                             get_ver_flags (aux.vna_flags), aux.vna_other);
10775
10776                     if (aux.vna_next < sizeof (*eaux)
10777                         && !(j == ent.vn_cnt - 1 && aux.vna_next == 0))
10778                       {
10779                         warn (_("Invalid vna_next field of %lx\n"),
10780                               aux.vna_next);
10781                         j = ent.vn_cnt;
10782                         break;
10783                       }
10784                     /* Check for overflow.  */
10785                     if (aux.vna_next > (size_t) (endbuf - vstart))
10786                       break;
10787                     isum   += aux.vna_next;
10788                     vstart += aux.vna_next;
10789                   }
10790
10791                 if (j < ent.vn_cnt)
10792                   warn (_("Missing Version Needs auxillary information\n"));
10793
10794                 if (ent.vn_next < sizeof (*entry)
10795                     && !(cnt == section->sh_info - 1 && ent.vn_next == 0))
10796                   {
10797                     warn (_("Invalid vn_next field of %lx\n"), ent.vn_next);
10798                     cnt = section->sh_info;
10799                     break;
10800                   }
10801                 if (ent.vn_next > (size_t) (endbuf - ((char *) eneed + idx)))
10802                   break;
10803                 idx += ent.vn_next;
10804               }
10805
10806             if (cnt < section->sh_info)
10807               warn (_("Missing Version Needs information\n"));
10808
10809             free (eneed);
10810           }
10811           break;
10812
10813         case SHT_GNU_versym:
10814           {
10815             Elf_Internal_Shdr * link_section;
10816             size_t total;
10817             unsigned int cnt;
10818             unsigned char * edata;
10819             unsigned short * data;
10820             char * strtab;
10821             Elf_Internal_Sym * symbols;
10822             Elf_Internal_Shdr * string_sec;
10823             unsigned long num_syms;
10824             long off;
10825
10826             if (section->sh_link >= filedata->file_header.e_shnum)
10827               break;
10828
10829             link_section = filedata->section_headers + section->sh_link;
10830             total = section->sh_size / sizeof (Elf_External_Versym);
10831
10832             if (link_section->sh_link >= filedata->file_header.e_shnum)
10833               break;
10834
10835             found = TRUE;
10836
10837             symbols = GET_ELF_SYMBOLS (filedata, link_section, & num_syms);
10838             if (symbols == NULL)
10839               break;
10840
10841             string_sec = filedata->section_headers + link_section->sh_link;
10842
10843             strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
10844                                         string_sec->sh_size,
10845                                         _("version string table"));
10846             if (!strtab)
10847               {
10848                 free (symbols);
10849                 break;
10850               }
10851
10852             printf (ngettext ("\nVersion symbols section '%s' "
10853                               "contains %lu entry:\n",
10854                               "\nVersion symbols section '%s' "
10855                               "contains %lu entries:\n",
10856                               total),
10857                     printable_section_name (filedata, section), (unsigned long) total);
10858
10859             printf (_(" Addr: 0x"));
10860             printf_vma (section->sh_addr);
10861             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10862                     (unsigned long) section->sh_offset, section->sh_link,
10863                     printable_section_name (filedata, link_section));
10864
10865             off = offset_from_vma (filedata,
10866                                    version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10867                                    total * sizeof (short));
10868             edata = (unsigned char *) get_data (NULL, filedata, off, total,
10869                                                 sizeof (short),
10870                                                 _("version symbol data"));
10871             if (!edata)
10872               {
10873                 free (strtab);
10874                 free (symbols);
10875                 break;
10876               }
10877
10878             data = (short unsigned int *) cmalloc (total, sizeof (short));
10879
10880             for (cnt = total; cnt --;)
10881               data[cnt] = byte_get (edata + cnt * sizeof (short),
10882                                     sizeof (short));
10883
10884             free (edata);
10885
10886             for (cnt = 0; cnt < total; cnt += 4)
10887               {
10888                 int j, nn;
10889                 char *name;
10890                 char *invalid = _("*invalid*");
10891
10892                 printf ("  %03x:", cnt);
10893
10894                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10895                   switch (data[cnt + j])
10896                     {
10897                     case 0:
10898                       fputs (_("   0 (*local*)    "), stdout);
10899                       break;
10900
10901                     case 1:
10902                       fputs (_("   1 (*global*)   "), stdout);
10903                       break;
10904
10905                     default:
10906                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10907                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10908
10909                       /* If this index value is greater than the size of the symbols
10910                          array, break to avoid an out-of-bounds read.  */
10911                       if ((unsigned long)(cnt + j) >= num_syms)
10912                         {
10913                           warn (_("invalid index into symbol array\n"));
10914                           break;
10915                         }
10916
10917                       name = NULL;
10918                       if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10919                         {
10920                           Elf_Internal_Verneed ivn;
10921                           unsigned long offset;
10922
10923                           offset = offset_from_vma
10924                             (filedata, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10925                              sizeof (Elf_External_Verneed));
10926
10927                           do
10928                             {
10929                               Elf_Internal_Vernaux ivna;
10930                               Elf_External_Verneed evn;
10931                               Elf_External_Vernaux evna;
10932                               unsigned long a_off;
10933
10934                               if (get_data (&evn, filedata, offset, sizeof (evn), 1,
10935                                             _("version need")) == NULL)
10936                                 break;
10937
10938                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10939                               ivn.vn_next = BYTE_GET (evn.vn_next);
10940
10941                               a_off = offset + ivn.vn_aux;
10942
10943                               do
10944                                 {
10945                                   if (get_data (&evna, filedata, a_off, sizeof (evna),
10946                                                 1, _("version need aux (2)")) == NULL)
10947                                     {
10948                                       ivna.vna_next  = 0;
10949                                       ivna.vna_other = 0;
10950                                     }
10951                                   else
10952                                     {
10953                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
10954                                       ivna.vna_other = BYTE_GET (evna.vna_other);
10955                                     }
10956
10957                                   a_off += ivna.vna_next;
10958                                 }
10959                               while (ivna.vna_other != data[cnt + j]
10960                                      && ivna.vna_next != 0);
10961
10962                               if (ivna.vna_other == data[cnt + j])
10963                                 {
10964                                   ivna.vna_name = BYTE_GET (evna.vna_name);
10965
10966                                   if (ivna.vna_name >= string_sec->sh_size)
10967                                     name = invalid;
10968                                   else
10969                                     name = strtab + ivna.vna_name;
10970                                   break;
10971                                 }
10972
10973                               offset += ivn.vn_next;
10974                             }
10975                           while (ivn.vn_next);
10976                         }
10977
10978                       if (data[cnt + j] != 0x8001
10979                           && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10980                         {
10981                           Elf_Internal_Verdef ivd;
10982                           Elf_External_Verdef evd;
10983                           unsigned long offset;
10984
10985                           offset = offset_from_vma
10986                             (filedata, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10987                              sizeof evd);
10988
10989                           do
10990                             {
10991                               if (get_data (&evd, filedata, offset, sizeof (evd), 1,
10992                                             _("version def")) == NULL)
10993                                 {
10994                                   ivd.vd_next = 0;
10995                                   /* PR 17531: file: 046-1082287-0.004.  */
10996                                   ivd.vd_ndx  = (data[cnt + j] & VERSYM_VERSION) + 1;
10997                                   break;
10998                                 }
10999                               else
11000                                 {
11001                                   ivd.vd_next = BYTE_GET (evd.vd_next);
11002                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
11003                                 }
11004
11005                               offset += ivd.vd_next;
11006                             }
11007                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
11008                                  && ivd.vd_next != 0);
11009
11010                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
11011                             {
11012                               Elf_External_Verdaux evda;
11013                               Elf_Internal_Verdaux ivda;
11014
11015                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
11016
11017                               if (get_data (&evda, filedata,
11018                                             offset - ivd.vd_next + ivd.vd_aux,
11019                                             sizeof (evda), 1,
11020                                             _("version def aux")) == NULL)
11021                                 break;
11022
11023                               ivda.vda_name = BYTE_GET (evda.vda_name);
11024
11025                               if (ivda.vda_name >= string_sec->sh_size)
11026                                 name = invalid;
11027                               else if (name != NULL && name != invalid)
11028                                 name = _("*both*");
11029                               else
11030                                 name = strtab + ivda.vda_name;
11031                             }
11032                         }
11033                       if (name != NULL)
11034                         nn += printf ("(%s%-*s",
11035                                       name,
11036                                       12 - (int) strlen (name),
11037                                       ")");
11038
11039                       if (nn < 18)
11040                         printf ("%*c", 18 - nn, ' ');
11041                     }
11042
11043                 putchar ('\n');
11044               }
11045
11046             free (data);
11047             free (strtab);
11048             free (symbols);
11049           }
11050           break;
11051
11052         default:
11053           break;
11054         }
11055     }
11056
11057   if (! found)
11058     printf (_("\nNo version information found in this file.\n"));
11059
11060   return TRUE;
11061 }
11062
11063 static const char *
11064 get_symbol_binding (Filedata * filedata, unsigned int binding)
11065 {
11066   static char buff[32];
11067
11068   switch (binding)
11069     {
11070     case STB_LOCAL:     return "LOCAL";
11071     case STB_GLOBAL:    return "GLOBAL";
11072     case STB_WEAK:      return "WEAK";
11073     default:
11074       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
11075         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
11076                   binding);
11077       else if (binding >= STB_LOOS && binding <= STB_HIOS)
11078         {
11079           if (binding == STB_GNU_UNIQUE
11080               && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU)
11081             return "UNIQUE";
11082           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
11083         }
11084       else
11085         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
11086       return buff;
11087     }
11088 }
11089
11090 static const char *
11091 get_symbol_type (Filedata * filedata, unsigned int type)
11092 {
11093   static char buff[32];
11094
11095   switch (type)
11096     {
11097     case STT_NOTYPE:    return "NOTYPE";
11098     case STT_OBJECT:    return "OBJECT";
11099     case STT_FUNC:      return "FUNC";
11100     case STT_SECTION:   return "SECTION";
11101     case STT_FILE:      return "FILE";
11102     case STT_COMMON:    return "COMMON";
11103     case STT_TLS:       return "TLS";
11104     case STT_RELC:      return "RELC";
11105     case STT_SRELC:     return "SRELC";
11106     default:
11107       if (type >= STT_LOPROC && type <= STT_HIPROC)
11108         {
11109           if (filedata->file_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
11110             return "THUMB_FUNC";
11111
11112           if (filedata->file_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
11113             return "REGISTER";
11114
11115           if (filedata->file_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
11116             return "PARISC_MILLI";
11117
11118           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
11119         }
11120       else if (type >= STT_LOOS && type <= STT_HIOS)
11121         {
11122           if (filedata->file_header.e_machine == EM_PARISC)
11123             {
11124               if (type == STT_HP_OPAQUE)
11125                 return "HP_OPAQUE";
11126               if (type == STT_HP_STUB)
11127                 return "HP_STUB";
11128             }
11129
11130           if (type == STT_GNU_IFUNC
11131               && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
11132                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD))
11133             return "IFUNC";
11134
11135           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
11136         }
11137       else
11138         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
11139       return buff;
11140     }
11141 }
11142
11143 static const char *
11144 get_symbol_visibility (unsigned int visibility)
11145 {
11146   switch (visibility)
11147     {
11148     case STV_DEFAULT:   return "DEFAULT";
11149     case STV_INTERNAL:  return "INTERNAL";
11150     case STV_HIDDEN:    return "HIDDEN";
11151     case STV_PROTECTED: return "PROTECTED";
11152     default:
11153       error (_("Unrecognized visibility value: %u"), visibility);
11154       return _("<unknown>");
11155     }
11156 }
11157
11158 static const char *
11159 get_alpha_symbol_other (unsigned int other)
11160 {
11161   switch (other)
11162     {
11163     case STO_ALPHA_NOPV:       return "NOPV";
11164     case STO_ALPHA_STD_GPLOAD: return "STD GPLOAD";
11165     default:
11166       error (_("Unrecognized alpah specific other value: %u"), other);
11167       return _("<unknown>");
11168     }
11169 }
11170
11171 static const char *
11172 get_solaris_symbol_visibility (unsigned int visibility)
11173 {
11174   switch (visibility)
11175     {
11176     case 4: return "EXPORTED";
11177     case 5: return "SINGLETON";
11178     case 6: return "ELIMINATE";
11179     default: return get_symbol_visibility (visibility);
11180     }
11181 }
11182
11183 static const char *
11184 get_aarch64_symbol_other (unsigned int other)
11185 {
11186   static char buf[32];
11187
11188   if (other & STO_AARCH64_VARIANT_PCS)
11189     {
11190       other &= ~STO_AARCH64_VARIANT_PCS;
11191       if (other == 0)
11192         return "VARIANT_PCS";
11193       snprintf (buf, sizeof buf, "VARIANT_PCS | %x", other);
11194       return buf;
11195     }
11196   return NULL;
11197 }
11198
11199 static const char *
11200 get_mips_symbol_other (unsigned int other)
11201 {
11202   switch (other)
11203     {
11204     case STO_OPTIONAL:      return "OPTIONAL";
11205     case STO_MIPS_PLT:      return "MIPS PLT";
11206     case STO_MIPS_PIC:      return "MIPS PIC";
11207     case STO_MICROMIPS:     return "MICROMIPS";
11208     case STO_MICROMIPS | STO_MIPS_PIC:      return "MICROMIPS, MIPS PIC";
11209     case STO_MIPS16:        return "MIPS16";
11210     default:                return NULL;
11211     }
11212 }
11213
11214 static const char *
11215 get_ia64_symbol_other (Filedata * filedata, unsigned int other)
11216 {
11217   if (is_ia64_vms (filedata))
11218     {
11219       static char res[32];
11220
11221       res[0] = 0;
11222
11223       /* Function types is for images and .STB files only.  */
11224       switch (filedata->file_header.e_type)
11225         {
11226         case ET_DYN:
11227         case ET_EXEC:
11228           switch (VMS_ST_FUNC_TYPE (other))
11229             {
11230             case VMS_SFT_CODE_ADDR:
11231               strcat (res, " CA");
11232               break;
11233             case VMS_SFT_SYMV_IDX:
11234               strcat (res, " VEC");
11235               break;
11236             case VMS_SFT_FD:
11237               strcat (res, " FD");
11238               break;
11239             case VMS_SFT_RESERVE:
11240               strcat (res, " RSV");
11241               break;
11242             default:
11243               warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
11244                     VMS_ST_FUNC_TYPE (other));
11245               strcat (res, " <unknown>");
11246               break;
11247             }
11248           break;
11249         default:
11250           break;
11251         }
11252       switch (VMS_ST_LINKAGE (other))
11253         {
11254         case VMS_STL_IGNORE:
11255           strcat (res, " IGN");
11256           break;
11257         case VMS_STL_RESERVE:
11258           strcat (res, " RSV");
11259           break;
11260         case VMS_STL_STD:
11261           strcat (res, " STD");
11262           break;
11263         case VMS_STL_LNK:
11264           strcat (res, " LNK");
11265           break;
11266         default:
11267           warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
11268                 VMS_ST_LINKAGE (other));
11269           strcat (res, " <unknown>");
11270           break;
11271         }
11272
11273       if (res[0] != 0)
11274         return res + 1;
11275       else
11276         return res;
11277     }
11278   return NULL;
11279 }
11280
11281 static const char *
11282 get_ppc64_symbol_other (unsigned int other)
11283 {
11284   if ((other & ~STO_PPC64_LOCAL_MASK) != 0)
11285     return NULL;
11286
11287   other >>= STO_PPC64_LOCAL_BIT;
11288   if (other <= 6)
11289     {
11290       static char buf[32];
11291       if (other >= 2)
11292         other = ppc64_decode_local_entry (other);
11293       snprintf (buf, sizeof buf, _("<localentry>: %d"), other);
11294       return buf;
11295     }
11296   return NULL;
11297 }
11298
11299 static const char *
11300 get_symbol_other (Filedata * filedata, unsigned int other)
11301 {
11302   const char * result = NULL;
11303   static char buff [32];
11304
11305   if (other == 0)
11306     return "";
11307
11308   switch (filedata->file_header.e_machine)
11309     {
11310     case EM_ALPHA:
11311       result = get_alpha_symbol_other (other);
11312       break;
11313     case EM_AARCH64:
11314       result = get_aarch64_symbol_other (other);
11315       break;
11316     case EM_MIPS:
11317       result = get_mips_symbol_other (other);
11318       break;
11319     case EM_IA_64:
11320       result = get_ia64_symbol_other (filedata, other);
11321       break;
11322     case EM_PPC64:
11323       result = get_ppc64_symbol_other (other);
11324       break;
11325     default:
11326       result = NULL;
11327       break;
11328     }
11329
11330   if (result)
11331     return result;
11332
11333   snprintf (buff, sizeof buff, _("<other>: %x"), other);
11334   return buff;
11335 }
11336
11337 static const char *
11338 get_symbol_index_type (Filedata * filedata, unsigned int type)
11339 {
11340   static char buff[32];
11341
11342   switch (type)
11343     {
11344     case SHN_UNDEF:     return "UND";
11345     case SHN_ABS:       return "ABS";
11346     case SHN_COMMON:    return "COM";
11347     default:
11348       if (type == SHN_IA_64_ANSI_COMMON
11349           && filedata->file_header.e_machine == EM_IA_64
11350           && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
11351         return "ANSI_COM";
11352       else if ((filedata->file_header.e_machine == EM_X86_64
11353                 || filedata->file_header.e_machine == EM_L1OM
11354                 || filedata->file_header.e_machine == EM_K1OM)
11355                && type == SHN_X86_64_LCOMMON)
11356         return "LARGE_COM";
11357       else if ((type == SHN_MIPS_SCOMMON
11358                 && filedata->file_header.e_machine == EM_MIPS)
11359                || (type == SHN_TIC6X_SCOMMON
11360                    && filedata->file_header.e_machine == EM_TI_C6000))
11361         return "SCOM";
11362       else if (type == SHN_MIPS_SUNDEFINED
11363                && filedata->file_header.e_machine == EM_MIPS)
11364         return "SUND";
11365       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
11366         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
11367       else if (type >= SHN_LOOS && type <= SHN_HIOS)
11368         sprintf (buff, "OS [0x%04x]", type & 0xffff);
11369       else if (type >= SHN_LORESERVE)
11370         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
11371       else if (type >= filedata->file_header.e_shnum)
11372         sprintf (buff, _("bad section index[%3d]"), type);
11373       else
11374         sprintf (buff, "%3d", type);
11375       break;
11376     }
11377
11378   return buff;
11379 }
11380
11381 static bfd_vma *
11382 get_dynamic_data (Filedata * filedata, bfd_size_type number, unsigned int ent_size)
11383 {
11384   unsigned char * e_data;
11385   bfd_vma * i_data;
11386
11387   /* If the size_t type is smaller than the bfd_size_type, eg because
11388      you are building a 32-bit tool on a 64-bit host, then make sure
11389      that when (number) is cast to (size_t) no information is lost.  */
11390   if (sizeof (size_t) < sizeof (bfd_size_type)
11391       && (bfd_size_type) ((size_t) number) != number)
11392     {
11393       error (_("Size truncation prevents reading %s elements of size %u\n"),
11394              bfd_vmatoa ("u", number), ent_size);
11395       return NULL;
11396     }
11397
11398   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
11399      attempting to allocate memory when the read is bound to fail.  */
11400   if (ent_size * number > filedata->file_size)
11401     {
11402       error (_("Invalid number of dynamic entries: %s\n"),
11403              bfd_vmatoa ("u", number));
11404       return NULL;
11405     }
11406
11407   e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
11408   if (e_data == NULL)
11409     {
11410       error (_("Out of memory reading %s dynamic entries\n"),
11411              bfd_vmatoa ("u", number));
11412       return NULL;
11413     }
11414
11415   if (fread (e_data, ent_size, (size_t) number, filedata->handle) != number)
11416     {
11417       error (_("Unable to read in %s bytes of dynamic data\n"),
11418              bfd_vmatoa ("u", number * ent_size));
11419       free (e_data);
11420       return NULL;
11421     }
11422
11423   i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
11424   if (i_data == NULL)
11425     {
11426       error (_("Out of memory allocating space for %s dynamic entries\n"),
11427              bfd_vmatoa ("u", number));
11428       free (e_data);
11429       return NULL;
11430     }
11431
11432   while (number--)
11433     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
11434
11435   free (e_data);
11436
11437   return i_data;
11438 }
11439
11440 static void
11441 print_dynamic_symbol (Filedata * filedata, bfd_vma si, unsigned long hn)
11442 {
11443   Elf_Internal_Sym * psym;
11444   int n;
11445
11446   n = print_vma (si, DEC_5);
11447   if (n < 5)
11448     fputs (&"     "[n], stdout);
11449   printf (" %3lu: ", hn);
11450
11451   if (dynamic_symbols == NULL || si >= num_dynamic_syms)
11452     {
11453       printf (_("<No info available for dynamic symbol number %lu>\n"),
11454               (unsigned long) si);
11455       return;
11456     }
11457
11458   psym = dynamic_symbols + si;
11459   print_vma (psym->st_value, LONG_HEX);
11460   putchar (' ');
11461   print_vma (psym->st_size, DEC_5);
11462
11463   printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11464   printf (" %-6s",  get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11465
11466   if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11467     printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11468   else
11469     {
11470       unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11471
11472       printf (" %-7s",  get_symbol_visibility (vis));
11473       /* Check to see if any other bits in the st_other field are set.
11474          Note - displaying this information disrupts the layout of the
11475          table being generated, but for the moment this case is very
11476          rare.  */
11477       if (psym->st_other ^ vis)
11478         printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11479     }
11480
11481   printf (" %3.3s ", get_symbol_index_type (filedata, psym->st_shndx));
11482   if (VALID_DYNAMIC_NAME (psym->st_name))
11483     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11484   else
11485     printf (_(" <corrupt: %14ld>"), psym->st_name);
11486   putchar ('\n');
11487 }
11488
11489 static const char *
11490 get_symbol_version_string (Filedata *                   filedata,
11491                            bfd_boolean                  is_dynsym,
11492                            const char *                 strtab,
11493                            unsigned long int            strtab_size,
11494                            unsigned int                 si,
11495                            Elf_Internal_Sym *           psym,
11496                            enum versioned_symbol_info * sym_info,
11497                            unsigned short *             vna_other)
11498 {
11499   unsigned char data[2];
11500   unsigned short vers_data;
11501   unsigned long offset;
11502   unsigned short max_vd_ndx;
11503
11504   if (!is_dynsym
11505       || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
11506     return NULL;
11507
11508   offset = offset_from_vma (filedata, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
11509                             sizeof data + si * sizeof (vers_data));
11510
11511   if (get_data (&data, filedata, offset + si * sizeof (vers_data),
11512                 sizeof (data), 1, _("version data")) == NULL)
11513     return NULL;
11514
11515   vers_data = byte_get (data, 2);
11516
11517   if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data == 0)
11518     return NULL;
11519
11520   max_vd_ndx = 0;
11521
11522   /* Usually we'd only see verdef for defined symbols, and verneed for
11523      undefined symbols.  However, symbols defined by the linker in
11524      .dynbss for variables copied from a shared library in order to
11525      avoid text relocations are defined yet have verneed.  We could
11526      use a heuristic to detect the special case, for example, check
11527      for verneed first on symbols defined in SHT_NOBITS sections, but
11528      it is simpler and more reliable to just look for both verdef and
11529      verneed.  .dynbss might not be mapped to a SHT_NOBITS section.  */
11530
11531   if (psym->st_shndx != SHN_UNDEF
11532       && vers_data != 0x8001
11533       && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
11534     {
11535       Elf_Internal_Verdef ivd;
11536       Elf_Internal_Verdaux ivda;
11537       Elf_External_Verdaux evda;
11538       unsigned long off;
11539
11540       off = offset_from_vma (filedata,
11541                              version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
11542                              sizeof (Elf_External_Verdef));
11543
11544       do
11545         {
11546           Elf_External_Verdef evd;
11547
11548           if (get_data (&evd, filedata, off, sizeof (evd), 1,
11549                         _("version def")) == NULL)
11550             {
11551               ivd.vd_ndx = 0;
11552               ivd.vd_aux = 0;
11553               ivd.vd_next = 0;
11554               ivd.vd_flags = 0;
11555             }
11556           else
11557             {
11558               ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
11559               ivd.vd_aux = BYTE_GET (evd.vd_aux);
11560               ivd.vd_next = BYTE_GET (evd.vd_next);
11561               ivd.vd_flags = BYTE_GET (evd.vd_flags);
11562             }
11563
11564           if ((ivd.vd_ndx & VERSYM_VERSION) > max_vd_ndx)
11565             max_vd_ndx = ivd.vd_ndx & VERSYM_VERSION;
11566
11567           off += ivd.vd_next;
11568         }
11569       while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
11570
11571       if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
11572         {
11573           if (ivd.vd_ndx == 1 && ivd.vd_flags == VER_FLG_BASE)
11574             return NULL;
11575
11576           off -= ivd.vd_next;
11577           off += ivd.vd_aux;
11578
11579           if (get_data (&evda, filedata, off, sizeof (evda), 1,
11580                         _("version def aux")) != NULL)
11581             {
11582               ivda.vda_name = BYTE_GET (evda.vda_name);
11583
11584               if (psym->st_name != ivda.vda_name)
11585                 {
11586                   *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
11587                                ? symbol_hidden : symbol_public);
11588                   return (ivda.vda_name < strtab_size
11589                           ? strtab + ivda.vda_name : _("<corrupt>"));
11590                 }
11591             }
11592         }
11593     }
11594
11595   if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
11596     {
11597       Elf_External_Verneed evn;
11598       Elf_Internal_Verneed ivn;
11599       Elf_Internal_Vernaux ivna;
11600
11601       offset = offset_from_vma (filedata,
11602                                 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
11603                                 sizeof evn);
11604       do
11605         {
11606           unsigned long vna_off;
11607
11608           if (get_data (&evn, filedata, offset, sizeof (evn), 1,
11609                         _("version need")) == NULL)
11610             {
11611               ivna.vna_next = 0;
11612               ivna.vna_other = 0;
11613               ivna.vna_name = 0;
11614               break;
11615             }
11616
11617           ivn.vn_aux  = BYTE_GET (evn.vn_aux);
11618           ivn.vn_next = BYTE_GET (evn.vn_next);
11619
11620           vna_off = offset + ivn.vn_aux;
11621
11622           do
11623             {
11624               Elf_External_Vernaux evna;
11625
11626               if (get_data (&evna, filedata, vna_off, sizeof (evna), 1,
11627                             _("version need aux (3)")) == NULL)
11628                 {
11629                   ivna.vna_next = 0;
11630                   ivna.vna_other = 0;
11631                   ivna.vna_name = 0;
11632                 }
11633               else
11634                 {
11635                   ivna.vna_other = BYTE_GET (evna.vna_other);
11636                   ivna.vna_next  = BYTE_GET (evna.vna_next);
11637                   ivna.vna_name  = BYTE_GET (evna.vna_name);
11638                 }
11639
11640               vna_off += ivna.vna_next;
11641             }
11642           while (ivna.vna_other != vers_data && ivna.vna_next != 0);
11643
11644           if (ivna.vna_other == vers_data)
11645             break;
11646
11647           offset += ivn.vn_next;
11648         }
11649       while (ivn.vn_next != 0);
11650
11651       if (ivna.vna_other == vers_data)
11652         {
11653           *sym_info = symbol_undefined;
11654           *vna_other = ivna.vna_other;
11655           return (ivna.vna_name < strtab_size
11656                   ? strtab + ivna.vna_name : _("<corrupt>"));
11657         }
11658       else if ((max_vd_ndx || (vers_data & VERSYM_VERSION) != 1)
11659                && (vers_data & VERSYM_VERSION) > max_vd_ndx)
11660         return _("<corrupt>");
11661     }
11662   return NULL;
11663 }
11664
11665 /* Dump the symbol table.  */
11666 static bfd_boolean
11667 process_symbol_table (Filedata * filedata)
11668 {
11669   Elf_Internal_Shdr * section;
11670   bfd_size_type nbuckets = 0;
11671   bfd_size_type nchains = 0;
11672   bfd_vma * buckets = NULL;
11673   bfd_vma * chains = NULL;
11674   bfd_vma ngnubuckets = 0;
11675   bfd_vma * gnubuckets = NULL;
11676   bfd_vma * gnuchains = NULL;
11677   bfd_vma gnusymidx = 0;
11678   bfd_size_type ngnuchains = 0;
11679
11680   if (!do_syms && !do_dyn_syms && !do_histogram)
11681     return TRUE;
11682
11683   if (dynamic_info[DT_HASH]
11684       && (do_histogram
11685           || (do_using_dynamic
11686               && !do_dyn_syms
11687               && dynamic_strings != NULL)))
11688     {
11689       unsigned char nb[8];
11690       unsigned char nc[8];
11691       unsigned int hash_ent_size = 4;
11692
11693       if ((filedata->file_header.e_machine == EM_ALPHA
11694            || filedata->file_header.e_machine == EM_S390
11695            || filedata->file_header.e_machine == EM_S390_OLD)
11696           && filedata->file_header.e_ident[EI_CLASS] == ELFCLASS64)
11697         hash_ent_size = 8;
11698
11699       if (fseek (filedata->handle,
11700                  (archive_file_offset
11701                   + offset_from_vma (filedata, dynamic_info[DT_HASH],
11702                                      sizeof nb + sizeof nc)),
11703                  SEEK_SET))
11704         {
11705           error (_("Unable to seek to start of dynamic information\n"));
11706           goto no_hash;
11707         }
11708
11709       if (fread (nb, hash_ent_size, 1, filedata->handle) != 1)
11710         {
11711           error (_("Failed to read in number of buckets\n"));
11712           goto no_hash;
11713         }
11714
11715       if (fread (nc, hash_ent_size, 1, filedata->handle) != 1)
11716         {
11717           error (_("Failed to read in number of chains\n"));
11718           goto no_hash;
11719         }
11720
11721       nbuckets = byte_get (nb, hash_ent_size);
11722       nchains  = byte_get (nc, hash_ent_size);
11723
11724       buckets = get_dynamic_data (filedata, nbuckets, hash_ent_size);
11725       chains  = get_dynamic_data (filedata, nchains, hash_ent_size);
11726
11727     no_hash:
11728       if (buckets == NULL || chains == NULL)
11729         {
11730           if (do_using_dynamic)
11731             return FALSE;
11732           free (buckets);
11733           free (chains);
11734           buckets = NULL;
11735           chains = NULL;
11736           nbuckets = 0;
11737           nchains = 0;
11738         }
11739     }
11740
11741   if (dynamic_info_DT_GNU_HASH
11742       && (do_histogram
11743           || (do_using_dynamic
11744               && !do_dyn_syms
11745               && dynamic_strings != NULL)))
11746     {
11747       unsigned char nb[16];
11748       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11749       bfd_vma buckets_vma;
11750
11751       if (fseek (filedata->handle,
11752                  (archive_file_offset
11753                   + offset_from_vma (filedata, dynamic_info_DT_GNU_HASH,
11754                                      sizeof nb)),
11755                  SEEK_SET))
11756         {
11757           error (_("Unable to seek to start of dynamic information\n"));
11758           goto no_gnu_hash;
11759         }
11760
11761       if (fread (nb, 16, 1, filedata->handle) != 1)
11762         {
11763           error (_("Failed to read in number of buckets\n"));
11764           goto no_gnu_hash;
11765         }
11766
11767       ngnubuckets = byte_get (nb, 4);
11768       gnusymidx = byte_get (nb + 4, 4);
11769       bitmaskwords = byte_get (nb + 8, 4);
11770       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
11771       if (is_32bit_elf)
11772         buckets_vma += bitmaskwords * 4;
11773       else
11774         buckets_vma += bitmaskwords * 8;
11775
11776       if (fseek (filedata->handle,
11777                  (archive_file_offset
11778                   + offset_from_vma (filedata, buckets_vma, 4)),
11779                  SEEK_SET))
11780         {
11781           error (_("Unable to seek to start of dynamic information\n"));
11782           goto no_gnu_hash;
11783         }
11784
11785       gnubuckets = get_dynamic_data (filedata, ngnubuckets, 4);
11786
11787       if (gnubuckets == NULL)
11788         goto no_gnu_hash;
11789
11790       for (i = 0; i < ngnubuckets; i++)
11791         if (gnubuckets[i] != 0)
11792           {
11793             if (gnubuckets[i] < gnusymidx)
11794               return FALSE;
11795
11796             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11797               maxchain = gnubuckets[i];
11798           }
11799
11800       if (maxchain == 0xffffffff)
11801         goto no_gnu_hash;
11802
11803       maxchain -= gnusymidx;
11804
11805       if (fseek (filedata->handle,
11806                  (archive_file_offset
11807                   + offset_from_vma (filedata, buckets_vma
11808                                            + 4 * (ngnubuckets + maxchain), 4)),
11809                  SEEK_SET))
11810         {
11811           error (_("Unable to seek to start of dynamic information\n"));
11812           goto no_gnu_hash;
11813         }
11814
11815       do
11816         {
11817           if (fread (nb, 4, 1, filedata->handle) != 1)
11818             {
11819               error (_("Failed to determine last chain length\n"));
11820               goto no_gnu_hash;
11821             }
11822
11823           if (maxchain + 1 == 0)
11824             goto no_gnu_hash;
11825
11826           ++maxchain;
11827         }
11828       while ((byte_get (nb, 4) & 1) == 0);
11829
11830       if (fseek (filedata->handle,
11831                  (archive_file_offset
11832                   + offset_from_vma (filedata, buckets_vma + 4 * ngnubuckets, 4)),
11833                  SEEK_SET))
11834         {
11835           error (_("Unable to seek to start of dynamic information\n"));
11836           goto no_gnu_hash;
11837         }
11838
11839       gnuchains = get_dynamic_data (filedata, maxchain, 4);
11840       ngnuchains = maxchain;
11841
11842     no_gnu_hash:
11843       if (gnuchains == NULL)
11844         {
11845           free (gnubuckets);
11846           gnubuckets = NULL;
11847           ngnubuckets = 0;
11848           if (do_using_dynamic)
11849             return FALSE;
11850         }
11851     }
11852
11853   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11854       && do_syms
11855       && do_using_dynamic
11856       && dynamic_strings != NULL
11857       && dynamic_symbols != NULL)
11858     {
11859       unsigned long hn;
11860
11861       if (dynamic_info[DT_HASH])
11862         {
11863           bfd_vma si;
11864           char *visited;
11865
11866           printf (_("\nSymbol table for image:\n"));
11867           if (is_32bit_elf)
11868             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11869           else
11870             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11871
11872           visited = xcmalloc (nchains, 1);
11873           memset (visited, 0, nchains);
11874           for (hn = 0; hn < nbuckets; hn++)
11875             {
11876               for (si = buckets[hn]; si > 0; si = chains[si])
11877                 {
11878                   print_dynamic_symbol (filedata, si, hn);
11879                   if (si >= nchains || visited[si])
11880                     {
11881                       error (_("histogram chain is corrupt\n"));
11882                       break;
11883                     }
11884                   visited[si] = 1;
11885                 }
11886             }
11887           free (visited);
11888         }
11889
11890       if (dynamic_info_DT_GNU_HASH)
11891         {
11892           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11893           if (is_32bit_elf)
11894             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11895           else
11896             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11897
11898           for (hn = 0; hn < ngnubuckets; ++hn)
11899             if (gnubuckets[hn] != 0)
11900               {
11901                 bfd_vma si = gnubuckets[hn];
11902                 bfd_vma off = si - gnusymidx;
11903
11904                 do
11905                   {
11906                     print_dynamic_symbol (filedata, si, hn);
11907                     si++;
11908                   }
11909                 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11910               }
11911         }
11912     }
11913   else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11914            && filedata->section_headers != NULL)
11915     {
11916       unsigned int i;
11917
11918       for (i = 0, section = filedata->section_headers;
11919            i < filedata->file_header.e_shnum;
11920            i++, section++)
11921         {
11922           unsigned int si;
11923           char * strtab = NULL;
11924           unsigned long int strtab_size = 0;
11925           Elf_Internal_Sym * symtab;
11926           Elf_Internal_Sym * psym;
11927           unsigned long num_syms;
11928
11929           if ((section->sh_type != SHT_SYMTAB
11930                && section->sh_type != SHT_DYNSYM)
11931               || (!do_syms
11932                   && section->sh_type == SHT_SYMTAB))
11933             continue;
11934
11935           if (section->sh_entsize == 0)
11936             {
11937               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11938                       printable_section_name (filedata, section));
11939               continue;
11940             }
11941
11942           num_syms = section->sh_size / section->sh_entsize;
11943           printf (ngettext ("\nSymbol table '%s' contains %lu entry:\n",
11944                             "\nSymbol table '%s' contains %lu entries:\n",
11945                             num_syms),
11946                   printable_section_name (filedata, section),
11947                   num_syms);
11948
11949           if (is_32bit_elf)
11950             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
11951           else
11952             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
11953
11954           symtab = GET_ELF_SYMBOLS (filedata, section, & num_syms);
11955           if (symtab == NULL)
11956             continue;
11957
11958           if (section->sh_link == filedata->file_header.e_shstrndx)
11959             {
11960               strtab = filedata->string_table;
11961               strtab_size = filedata->string_table_length;
11962             }
11963           else if (section->sh_link < filedata->file_header.e_shnum)
11964             {
11965               Elf_Internal_Shdr * string_sec;
11966
11967               string_sec = filedata->section_headers + section->sh_link;
11968
11969               strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset,
11970                                           1, string_sec->sh_size,
11971                                           _("string table"));
11972               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11973             }
11974
11975           for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11976             {
11977               const char *version_string;
11978               enum versioned_symbol_info sym_info;
11979               unsigned short vna_other;
11980
11981               printf ("%6d: ", si);
11982               print_vma (psym->st_value, LONG_HEX);
11983               putchar (' ');
11984               print_vma (psym->st_size, DEC_5);
11985               printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11986               printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11987               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11988                 printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11989               else
11990                 {
11991                   unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11992
11993                   printf (" %-7s", get_symbol_visibility (vis));
11994                   /* Check to see if any other bits in the st_other field are set.
11995                      Note - displaying this information disrupts the layout of the
11996                      table being generated, but for the moment this case is very rare.  */
11997                   if (psym->st_other ^ vis)
11998                     printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11999                 }
12000               printf (" %4s ", get_symbol_index_type (filedata, psym->st_shndx));
12001               print_symbol (25, psym->st_name < strtab_size
12002                             ? strtab + psym->st_name : _("<corrupt>"));
12003
12004               version_string
12005                 = get_symbol_version_string (filedata,
12006                                              section->sh_type == SHT_DYNSYM,
12007                                              strtab, strtab_size, si,
12008                                              psym, &sym_info, &vna_other);
12009               if (version_string)
12010                 {
12011                   if (sym_info == symbol_undefined)
12012                     printf ("@%s (%d)", version_string, vna_other);
12013                   else
12014                     printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
12015                             version_string);
12016                 }
12017
12018               putchar ('\n');
12019
12020               if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
12021                   && si >= section->sh_info
12022                   /* Irix 5 and 6 MIPS binaries are known to ignore this requirement.  */
12023                   && filedata->file_header.e_machine != EM_MIPS
12024                   /* Solaris binaries have been found to violate this requirement as
12025                      well.  Not sure if this is a bug or an ABI requirement.  */
12026                   && filedata->file_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
12027                 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
12028                       si, printable_section_name (filedata, section), section->sh_info);
12029             }
12030
12031           free (symtab);
12032           if (strtab != filedata->string_table)
12033             free (strtab);
12034         }
12035     }
12036   else if (do_syms)
12037     printf
12038       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
12039
12040   if (do_histogram && buckets != NULL)
12041     {
12042       unsigned long * lengths;
12043       unsigned long * counts;
12044       unsigned long hn;
12045       bfd_vma si;
12046       unsigned long maxlength = 0;
12047       unsigned long nzero_counts = 0;
12048       unsigned long nsyms = 0;
12049       char *visited;
12050
12051       printf (ngettext ("\nHistogram for bucket list length "
12052                         "(total of %lu bucket):\n",
12053                         "\nHistogram for bucket list length "
12054                         "(total of %lu buckets):\n",
12055                         (unsigned long) nbuckets),
12056               (unsigned long) nbuckets);
12057
12058       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
12059       if (lengths == NULL)
12060         {
12061           error (_("Out of memory allocating space for histogram buckets\n"));
12062           return FALSE;
12063         }
12064       visited = xcmalloc (nchains, 1);
12065       memset (visited, 0, nchains);
12066
12067       printf (_(" Length  Number     %% of total  Coverage\n"));
12068       for (hn = 0; hn < nbuckets; ++hn)
12069         {
12070           for (si = buckets[hn]; si > 0; si = chains[si])
12071             {
12072               ++nsyms;
12073               if (maxlength < ++lengths[hn])
12074                 ++maxlength;
12075               if (si >= nchains || visited[si])
12076                 {
12077                   error (_("histogram chain is corrupt\n"));
12078                   break;
12079                 }
12080               visited[si] = 1;
12081             }
12082         }
12083       free (visited);
12084
12085       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
12086       if (counts == NULL)
12087         {
12088           free (lengths);
12089           error (_("Out of memory allocating space for histogram counts\n"));
12090           return FALSE;
12091         }
12092
12093       for (hn = 0; hn < nbuckets; ++hn)
12094         ++counts[lengths[hn]];
12095
12096       if (nbuckets > 0)
12097         {
12098           unsigned long i;
12099           printf ("      0  %-10lu (%5.1f%%)\n",
12100                   counts[0], (counts[0] * 100.0) / nbuckets);
12101           for (i = 1; i <= maxlength; ++i)
12102             {
12103               nzero_counts += counts[i] * i;
12104               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
12105                       i, counts[i], (counts[i] * 100.0) / nbuckets,
12106                       (nzero_counts * 100.0) / nsyms);
12107             }
12108         }
12109
12110       free (counts);
12111       free (lengths);
12112     }
12113
12114   if (buckets != NULL)
12115     {
12116       free (buckets);
12117       free (chains);
12118     }
12119
12120   if (do_histogram && gnubuckets != NULL)
12121     {
12122       unsigned long * lengths;
12123       unsigned long * counts;
12124       unsigned long hn;
12125       unsigned long maxlength = 0;
12126       unsigned long nzero_counts = 0;
12127       unsigned long nsyms = 0;
12128
12129       printf (ngettext ("\nHistogram for `.gnu.hash' bucket list length "
12130                         "(total of %lu bucket):\n",
12131                         "\nHistogram for `.gnu.hash' bucket list length "
12132                         "(total of %lu buckets):\n",
12133                         (unsigned long) ngnubuckets),
12134               (unsigned long) ngnubuckets);
12135
12136       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
12137       if (lengths == NULL)
12138         {
12139           error (_("Out of memory allocating space for gnu histogram buckets\n"));
12140           return FALSE;
12141         }
12142
12143       printf (_(" Length  Number     %% of total  Coverage\n"));
12144
12145       for (hn = 0; hn < ngnubuckets; ++hn)
12146         if (gnubuckets[hn] != 0)
12147           {
12148             bfd_vma off, length = 1;
12149
12150             for (off = gnubuckets[hn] - gnusymidx;
12151                  /* PR 17531 file: 010-77222-0.004.  */
12152                  off < ngnuchains && (gnuchains[off] & 1) == 0;
12153                  ++off)
12154               ++length;
12155             lengths[hn] = length;
12156             if (length > maxlength)
12157               maxlength = length;
12158             nsyms += length;
12159           }
12160
12161       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
12162       if (counts == NULL)
12163         {
12164           free (lengths);
12165           error (_("Out of memory allocating space for gnu histogram counts\n"));
12166           return FALSE;
12167         }
12168
12169       for (hn = 0; hn < ngnubuckets; ++hn)
12170         ++counts[lengths[hn]];
12171
12172       if (ngnubuckets > 0)
12173         {
12174           unsigned long j;
12175           printf ("      0  %-10lu (%5.1f%%)\n",
12176                   counts[0], (counts[0] * 100.0) / ngnubuckets);
12177           for (j = 1; j <= maxlength; ++j)
12178             {
12179               nzero_counts += counts[j] * j;
12180               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
12181                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
12182                       (nzero_counts * 100.0) / nsyms);
12183             }
12184         }
12185
12186       free (counts);
12187       free (lengths);
12188       free (gnubuckets);
12189       free (gnuchains);
12190     }
12191
12192   return TRUE;
12193 }
12194
12195 static bfd_boolean
12196 process_syminfo (Filedata * filedata ATTRIBUTE_UNUSED)
12197 {
12198   unsigned int i;
12199
12200   if (dynamic_syminfo == NULL
12201       || !do_dynamic)
12202     /* No syminfo, this is ok.  */
12203     return TRUE;
12204
12205   /* There better should be a dynamic symbol section.  */
12206   if (dynamic_symbols == NULL || dynamic_strings == NULL)
12207     return FALSE;
12208
12209   if (dynamic_addr)
12210     printf (ngettext ("\nDynamic info segment at offset 0x%lx "
12211                       "contains %d entry:\n",
12212                       "\nDynamic info segment at offset 0x%lx "
12213                       "contains %d entries:\n",
12214                       dynamic_syminfo_nent),
12215             dynamic_syminfo_offset, dynamic_syminfo_nent);
12216
12217   printf (_(" Num: Name                           BoundTo     Flags\n"));
12218   for (i = 0; i < dynamic_syminfo_nent; ++i)
12219     {
12220       unsigned short int flags = dynamic_syminfo[i].si_flags;
12221
12222       printf ("%4d: ", i);
12223       if (i >= num_dynamic_syms)
12224         printf (_("<corrupt index>"));
12225       else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
12226         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
12227       else
12228         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
12229       putchar (' ');
12230
12231       switch (dynamic_syminfo[i].si_boundto)
12232         {
12233         case SYMINFO_BT_SELF:
12234           fputs ("SELF       ", stdout);
12235           break;
12236         case SYMINFO_BT_PARENT:
12237           fputs ("PARENT     ", stdout);
12238           break;
12239         default:
12240           if (dynamic_syminfo[i].si_boundto > 0
12241               && dynamic_syminfo[i].si_boundto < dynamic_nent
12242               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
12243             {
12244               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
12245               putchar (' ' );
12246             }
12247           else
12248             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
12249           break;
12250         }
12251
12252       if (flags & SYMINFO_FLG_DIRECT)
12253         printf (" DIRECT");
12254       if (flags & SYMINFO_FLG_PASSTHRU)
12255         printf (" PASSTHRU");
12256       if (flags & SYMINFO_FLG_COPY)
12257         printf (" COPY");
12258       if (flags & SYMINFO_FLG_LAZYLOAD)
12259         printf (" LAZYLOAD");
12260
12261       puts ("");
12262     }
12263
12264   return TRUE;
12265 }
12266
12267 #define IN_RANGE(START,END,ADDR,OFF)            \
12268   (((ADDR) >= (START)) && ((ADDR) + (OFF) < (END)))
12269
12270 /* Check to see if the given reloc needs to be handled in a target specific
12271    manner.  If so then process the reloc and return TRUE otherwise return
12272    FALSE.
12273
12274    If called with reloc == NULL, then this is a signal that reloc processing
12275    for the current section has finished, and any saved state should be
12276    discarded.  */
12277
12278 static bfd_boolean
12279 target_specific_reloc_handling (Filedata *           filedata,
12280                                 Elf_Internal_Rela *  reloc,
12281                                 unsigned char *      start,
12282                                 unsigned char *      end,
12283                                 Elf_Internal_Sym *   symtab,
12284                                 unsigned long        num_syms)
12285 {
12286   unsigned int reloc_type = 0;
12287   unsigned long sym_index = 0;
12288
12289   if (reloc)
12290     {
12291       reloc_type = get_reloc_type (filedata, reloc->r_info);
12292       sym_index = get_reloc_symindex (reloc->r_info);
12293     }
12294
12295   switch (filedata->file_header.e_machine)
12296     {
12297     case EM_MSP430:
12298     case EM_MSP430_OLD:
12299       {
12300         static Elf_Internal_Sym * saved_sym = NULL;
12301
12302         if (reloc == NULL)
12303           {
12304             saved_sym = NULL;
12305             return TRUE;
12306           }
12307
12308         switch (reloc_type)
12309           {
12310           case 10: /* R_MSP430_SYM_DIFF */
12311             if (uses_msp430x_relocs (filedata))
12312               break;
12313             /* Fall through.  */
12314           case 21: /* R_MSP430X_SYM_DIFF */
12315             /* PR 21139.  */
12316             if (sym_index >= num_syms)
12317               error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
12318                      sym_index);
12319             else
12320               saved_sym = symtab + sym_index;
12321             return TRUE;
12322
12323           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
12324           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
12325             goto handle_sym_diff;
12326
12327           case 5: /* R_MSP430_16_BYTE */
12328           case 9: /* R_MSP430_8 */
12329             if (uses_msp430x_relocs (filedata))
12330               break;
12331             goto handle_sym_diff;
12332
12333           case 2: /* R_MSP430_ABS16 */
12334           case 15: /* R_MSP430X_ABS16 */
12335             if (! uses_msp430x_relocs (filedata))
12336               break;
12337             goto handle_sym_diff;
12338
12339           handle_sym_diff:
12340             if (saved_sym != NULL)
12341               {
12342                 int reloc_size = reloc_type == 1 ? 4 : 2;
12343                 bfd_vma value;
12344
12345                 if (sym_index >= num_syms)
12346                   error (_("MSP430 reloc contains invalid symbol index %lu\n"),
12347                          sym_index);
12348                 else
12349                   {
12350                     value = reloc->r_addend + (symtab[sym_index].st_value
12351                                                - saved_sym->st_value);
12352
12353                     if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12354                       byte_put (start + reloc->r_offset, value, reloc_size);
12355                     else
12356                       /* PR 21137 */
12357                       error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
12358                              (long) reloc->r_offset);
12359                   }
12360
12361                 saved_sym = NULL;
12362                 return TRUE;
12363               }
12364             break;
12365
12366           default:
12367             if (saved_sym != NULL)
12368               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
12369             break;
12370           }
12371         break;
12372       }
12373
12374     case EM_MN10300:
12375     case EM_CYGNUS_MN10300:
12376       {
12377         static Elf_Internal_Sym * saved_sym = NULL;
12378
12379         if (reloc == NULL)
12380           {
12381             saved_sym = NULL;
12382             return TRUE;
12383           }
12384
12385         switch (reloc_type)
12386           {
12387           case 34: /* R_MN10300_ALIGN */
12388             return TRUE;
12389           case 33: /* R_MN10300_SYM_DIFF */
12390             if (sym_index >= num_syms)
12391               error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
12392                      sym_index);
12393             else
12394               saved_sym = symtab + sym_index;
12395             return TRUE;
12396
12397           case 1: /* R_MN10300_32 */
12398           case 2: /* R_MN10300_16 */
12399             if (saved_sym != NULL)
12400               {
12401                 int reloc_size = reloc_type == 1 ? 4 : 2;
12402                 bfd_vma value;
12403
12404                 if (sym_index >= num_syms)
12405                   error (_("MN10300 reloc contains invalid symbol index %lu\n"),
12406                          sym_index);
12407                 else
12408                   {
12409                     value = reloc->r_addend + (symtab[sym_index].st_value
12410                                                - saved_sym->st_value);
12411
12412                     if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12413                       byte_put (start + reloc->r_offset, value, reloc_size);
12414                     else
12415                       error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
12416                              (long) reloc->r_offset);
12417                   }
12418
12419                 saved_sym = NULL;
12420                 return TRUE;
12421               }
12422             break;
12423           default:
12424             if (saved_sym != NULL)
12425               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
12426             break;
12427           }
12428         break;
12429       }
12430
12431     case EM_RL78:
12432       {
12433         static bfd_vma saved_sym1 = 0;
12434         static bfd_vma saved_sym2 = 0;
12435         static bfd_vma value;
12436
12437         if (reloc == NULL)
12438           {
12439             saved_sym1 = saved_sym2 = 0;
12440             return TRUE;
12441           }
12442
12443         switch (reloc_type)
12444           {
12445           case 0x80: /* R_RL78_SYM.  */
12446             saved_sym1 = saved_sym2;
12447             if (sym_index >= num_syms)
12448               error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
12449                      sym_index);
12450             else
12451               {
12452                 saved_sym2 = symtab[sym_index].st_value;
12453                 saved_sym2 += reloc->r_addend;
12454               }
12455             return TRUE;
12456
12457           case 0x83: /* R_RL78_OPsub.  */
12458             value = saved_sym1 - saved_sym2;
12459             saved_sym2 = saved_sym1 = 0;
12460             return TRUE;
12461             break;
12462
12463           case 0x41: /* R_RL78_ABS32.  */
12464             if (IN_RANGE (start, end, start + reloc->r_offset, 4))
12465               byte_put (start + reloc->r_offset, value, 4);
12466             else
12467               error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12468                      (long) reloc->r_offset);
12469             value = 0;
12470             return TRUE;
12471
12472           case 0x43: /* R_RL78_ABS16.  */
12473             if (IN_RANGE (start, end, start + reloc->r_offset, 2))
12474               byte_put (start + reloc->r_offset, value, 2);
12475             else
12476               error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12477                      (long) reloc->r_offset);
12478             value = 0;
12479             return TRUE;
12480
12481           default:
12482             break;
12483           }
12484         break;
12485       }
12486     }
12487
12488   return FALSE;
12489 }
12490
12491 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
12492    DWARF debug sections.  This is a target specific test.  Note - we do not
12493    go through the whole including-target-headers-multiple-times route, (as
12494    we have already done with <elf/h8.h>) because this would become very
12495    messy and even then this function would have to contain target specific
12496    information (the names of the relocs instead of their numeric values).
12497    FIXME: This is not the correct way to solve this problem.  The proper way
12498    is to have target specific reloc sizing and typing functions created by
12499    the reloc-macros.h header, in the same way that it already creates the
12500    reloc naming functions.  */
12501
12502 static bfd_boolean
12503 is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12504 {
12505   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12506   switch (filedata->file_header.e_machine)
12507     {
12508     case EM_386:
12509     case EM_IAMCU:
12510       return reloc_type == 1; /* R_386_32.  */
12511     case EM_68K:
12512       return reloc_type == 1; /* R_68K_32.  */
12513     case EM_860:
12514       return reloc_type == 1; /* R_860_32.  */
12515     case EM_960:
12516       return reloc_type == 2; /* R_960_32.  */
12517     case EM_AARCH64:
12518       return (reloc_type == 258
12519               || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
12520     case EM_BPF:
12521       return reloc_type == 11; /* R_BPF_DATA_32 */
12522     case EM_ADAPTEVA_EPIPHANY:
12523       return reloc_type == 3;
12524     case EM_ALPHA:
12525       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
12526     case EM_ARC:
12527       return reloc_type == 1; /* R_ARC_32.  */
12528     case EM_ARC_COMPACT:
12529     case EM_ARC_COMPACT2:
12530       return reloc_type == 4; /* R_ARC_32.  */
12531     case EM_ARM:
12532       return reloc_type == 2; /* R_ARM_ABS32 */
12533     case EM_AVR_OLD:
12534     case EM_AVR:
12535       return reloc_type == 1;
12536     case EM_BLACKFIN:
12537       return reloc_type == 0x12; /* R_byte4_data.  */
12538     case EM_CRIS:
12539       return reloc_type == 3; /* R_CRIS_32.  */
12540     case EM_CR16:
12541       return reloc_type == 3; /* R_CR16_NUM32.  */
12542     case EM_CRX:
12543       return reloc_type == 15; /* R_CRX_NUM32.  */
12544     case EM_CSKY:
12545       return reloc_type == 1; /* R_CKCORE_ADDR32.  */
12546     case EM_CYGNUS_FRV:
12547       return reloc_type == 1;
12548     case EM_CYGNUS_D10V:
12549     case EM_D10V:
12550       return reloc_type == 6; /* R_D10V_32.  */
12551     case EM_CYGNUS_D30V:
12552     case EM_D30V:
12553       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
12554     case EM_DLX:
12555       return reloc_type == 3; /* R_DLX_RELOC_32.  */
12556     case EM_CYGNUS_FR30:
12557     case EM_FR30:
12558       return reloc_type == 3; /* R_FR30_32.  */
12559     case EM_FT32:
12560       return reloc_type == 1; /* R_FT32_32.  */
12561     case EM_H8S:
12562     case EM_H8_300:
12563     case EM_H8_300H:
12564       return reloc_type == 1; /* R_H8_DIR32.  */
12565     case EM_IA_64:
12566       return (reloc_type == 0x64    /* R_IA64_SECREL32MSB.  */
12567               || reloc_type == 0x65 /* R_IA64_SECREL32LSB.  */
12568               || reloc_type == 0x24 /* R_IA64_DIR32MSB.  */
12569               || reloc_type == 0x25 /* R_IA64_DIR32LSB.  */);
12570     case EM_IP2K_OLD:
12571     case EM_IP2K:
12572       return reloc_type == 2; /* R_IP2K_32.  */
12573     case EM_IQ2000:
12574       return reloc_type == 2; /* R_IQ2000_32.  */
12575     case EM_LATTICEMICO32:
12576       return reloc_type == 3; /* R_LM32_32.  */
12577     case EM_M32C_OLD:
12578     case EM_M32C:
12579       return reloc_type == 3; /* R_M32C_32.  */
12580     case EM_M32R:
12581       return reloc_type == 34; /* R_M32R_32_RELA.  */
12582     case EM_68HC11:
12583     case EM_68HC12:
12584       return reloc_type == 6; /* R_M68HC11_32.  */
12585     case EM_S12Z:
12586       return reloc_type == 7 || /* R_S12Z_EXT32 */
12587         reloc_type == 6;        /* R_S12Z_CW32.  */
12588     case EM_MCORE:
12589       return reloc_type == 1; /* R_MCORE_ADDR32.  */
12590     case EM_CYGNUS_MEP:
12591       return reloc_type == 4; /* R_MEP_32.  */
12592     case EM_METAG:
12593       return reloc_type == 2; /* R_METAG_ADDR32.  */
12594     case EM_MICROBLAZE:
12595       return reloc_type == 1; /* R_MICROBLAZE_32.  */
12596     case EM_MIPS:
12597       return reloc_type == 2; /* R_MIPS_32.  */
12598     case EM_MMIX:
12599       return reloc_type == 4; /* R_MMIX_32.  */
12600     case EM_CYGNUS_MN10200:
12601     case EM_MN10200:
12602       return reloc_type == 1; /* R_MN10200_32.  */
12603     case EM_CYGNUS_MN10300:
12604     case EM_MN10300:
12605       return reloc_type == 1; /* R_MN10300_32.  */
12606     case EM_MOXIE:
12607       return reloc_type == 1; /* R_MOXIE_32.  */
12608     case EM_MSP430_OLD:
12609     case EM_MSP430:
12610       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
12611     case EM_MT:
12612       return reloc_type == 2; /* R_MT_32.  */
12613     case EM_NDS32:
12614       return reloc_type == 20; /* R_NDS32_RELA.  */
12615     case EM_ALTERA_NIOS2:
12616       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
12617     case EM_NIOS32:
12618       return reloc_type == 1; /* R_NIOS_32.  */
12619     case EM_OR1K:
12620       return reloc_type == 1; /* R_OR1K_32.  */
12621     case EM_PARISC:
12622       return (reloc_type == 1 /* R_PARISC_DIR32.  */
12623               || reloc_type == 2 /* R_PARISC_DIR21L.  */
12624               || reloc_type == 41); /* R_PARISC_SECREL32.  */
12625     case EM_PJ:
12626     case EM_PJ_OLD:
12627       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
12628     case EM_PPC64:
12629       return reloc_type == 1; /* R_PPC64_ADDR32.  */
12630     case EM_PPC:
12631       return reloc_type == 1; /* R_PPC_ADDR32.  */
12632     case EM_TI_PRU:
12633       return reloc_type == 11; /* R_PRU_BFD_RELOC_32.  */
12634     case EM_RISCV:
12635       return reloc_type == 1; /* R_RISCV_32.  */
12636     case EM_RL78:
12637       return reloc_type == 1; /* R_RL78_DIR32.  */
12638     case EM_RX:
12639       return reloc_type == 1; /* R_RX_DIR32.  */
12640     case EM_S370:
12641       return reloc_type == 1; /* R_I370_ADDR31.  */
12642     case EM_S390_OLD:
12643     case EM_S390:
12644       return reloc_type == 4; /* R_S390_32.  */
12645     case EM_SCORE:
12646       return reloc_type == 8; /* R_SCORE_ABS32.  */
12647     case EM_SH:
12648       return reloc_type == 1; /* R_SH_DIR32.  */
12649     case EM_SPARC32PLUS:
12650     case EM_SPARCV9:
12651     case EM_SPARC:
12652       return reloc_type == 3 /* R_SPARC_32.  */
12653         || reloc_type == 23; /* R_SPARC_UA32.  */
12654     case EM_SPU:
12655       return reloc_type == 6; /* R_SPU_ADDR32 */
12656     case EM_TI_C6000:
12657       return reloc_type == 1; /* R_C6000_ABS32.  */
12658     case EM_TILEGX:
12659       return reloc_type == 2; /* R_TILEGX_32.  */
12660     case EM_TILEPRO:
12661       return reloc_type == 1; /* R_TILEPRO_32.  */
12662     case EM_CYGNUS_V850:
12663     case EM_V850:
12664       return reloc_type == 6; /* R_V850_ABS32.  */
12665     case EM_V800:
12666       return reloc_type == 0x33; /* R_V810_WORD.  */
12667     case EM_VAX:
12668       return reloc_type == 1; /* R_VAX_32.  */
12669     case EM_VISIUM:
12670       return reloc_type == 3;  /* R_VISIUM_32. */
12671     case EM_WEBASSEMBLY:
12672       return reloc_type == 1;  /* R_WASM32_32.  */
12673     case EM_X86_64:
12674     case EM_L1OM:
12675     case EM_K1OM:
12676       return reloc_type == 10; /* R_X86_64_32.  */
12677     case EM_XC16X:
12678     case EM_C166:
12679       return reloc_type == 3; /* R_XC16C_ABS_32.  */
12680     case EM_XGATE:
12681       return reloc_type == 4; /* R_XGATE_32.  */
12682     case EM_XSTORMY16:
12683       return reloc_type == 1; /* R_XSTROMY16_32.  */
12684     case EM_XTENSA_OLD:
12685     case EM_XTENSA:
12686       return reloc_type == 1; /* R_XTENSA_32.  */
12687     default:
12688       {
12689         static unsigned int prev_warn = 0;
12690
12691         /* Avoid repeating the same warning multiple times.  */
12692         if (prev_warn != filedata->file_header.e_machine)
12693           error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
12694                  filedata->file_header.e_machine);
12695         prev_warn = filedata->file_header.e_machine;
12696         return FALSE;
12697       }
12698     }
12699 }
12700
12701 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12702    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
12703
12704 static bfd_boolean
12705 is_32bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12706 {
12707   switch (filedata->file_header.e_machine)
12708   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12709     {
12710     case EM_386:
12711     case EM_IAMCU:
12712       return reloc_type == 2;  /* R_386_PC32.  */
12713     case EM_68K:
12714       return reloc_type == 4;  /* R_68K_PC32.  */
12715     case EM_AARCH64:
12716       return reloc_type == 261; /* R_AARCH64_PREL32 */
12717     case EM_ADAPTEVA_EPIPHANY:
12718       return reloc_type == 6;
12719     case EM_ALPHA:
12720       return reloc_type == 10; /* R_ALPHA_SREL32.  */
12721     case EM_ARC_COMPACT:
12722     case EM_ARC_COMPACT2:
12723       return reloc_type == 49; /* R_ARC_32_PCREL.  */
12724     case EM_ARM:
12725       return reloc_type == 3;  /* R_ARM_REL32 */
12726     case EM_AVR_OLD:
12727     case EM_AVR:
12728       return reloc_type == 36; /* R_AVR_32_PCREL.  */
12729     case EM_MICROBLAZE:
12730       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
12731     case EM_OR1K:
12732       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
12733     case EM_PARISC:
12734       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
12735     case EM_PPC:
12736       return reloc_type == 26; /* R_PPC_REL32.  */
12737     case EM_PPC64:
12738       return reloc_type == 26; /* R_PPC64_REL32.  */
12739     case EM_RISCV:
12740       return reloc_type == 57;  /* R_RISCV_32_PCREL.  */
12741     case EM_S390_OLD:
12742     case EM_S390:
12743       return reloc_type == 5;  /* R_390_PC32.  */
12744     case EM_SH:
12745       return reloc_type == 2;  /* R_SH_REL32.  */
12746     case EM_SPARC32PLUS:
12747     case EM_SPARCV9:
12748     case EM_SPARC:
12749       return reloc_type == 6;  /* R_SPARC_DISP32.  */
12750     case EM_SPU:
12751       return reloc_type == 13; /* R_SPU_REL32.  */
12752     case EM_TILEGX:
12753       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
12754     case EM_TILEPRO:
12755       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
12756     case EM_VISIUM:
12757       return reloc_type == 6;  /* R_VISIUM_32_PCREL */
12758     case EM_X86_64:
12759     case EM_L1OM:
12760     case EM_K1OM:
12761       return reloc_type == 2;  /* R_X86_64_PC32.  */
12762     case EM_VAX:
12763       return reloc_type == 4;  /* R_VAX_PCREL32.  */
12764     case EM_XTENSA_OLD:
12765     case EM_XTENSA:
12766       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
12767     default:
12768       /* Do not abort or issue an error message here.  Not all targets use
12769          pc-relative 32-bit relocs in their DWARF debug information and we
12770          have already tested for target coverage in is_32bit_abs_reloc.  A
12771          more helpful warning message will be generated by apply_relocations
12772          anyway, so just return.  */
12773       return FALSE;
12774     }
12775 }
12776
12777 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12778    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
12779
12780 static bfd_boolean
12781 is_64bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12782 {
12783   switch (filedata->file_header.e_machine)
12784     {
12785     case EM_AARCH64:
12786       return reloc_type == 257; /* R_AARCH64_ABS64.  */
12787     case EM_ALPHA:
12788       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
12789     case EM_IA_64:
12790       return (reloc_type == 0x26    /* R_IA64_DIR64MSB.  */
12791               || reloc_type == 0x27 /* R_IA64_DIR64LSB.  */);
12792     case EM_PARISC:
12793       return reloc_type == 80; /* R_PARISC_DIR64.  */
12794     case EM_PPC64:
12795       return reloc_type == 38; /* R_PPC64_ADDR64.  */
12796     case EM_RISCV:
12797       return reloc_type == 2; /* R_RISCV_64.  */
12798     case EM_SPARC32PLUS:
12799     case EM_SPARCV9:
12800     case EM_SPARC:
12801       return reloc_type == 32 /* R_SPARC_64.  */
12802         || reloc_type == 54; /* R_SPARC_UA64.  */
12803     case EM_X86_64:
12804     case EM_L1OM:
12805     case EM_K1OM:
12806       return reloc_type == 1; /* R_X86_64_64.  */
12807     case EM_S390_OLD:
12808     case EM_S390:
12809       return reloc_type == 22;  /* R_S390_64.  */
12810     case EM_TILEGX:
12811       return reloc_type == 1; /* R_TILEGX_64.  */
12812     case EM_MIPS:
12813       return reloc_type == 18;  /* R_MIPS_64.  */
12814     default:
12815       return FALSE;
12816     }
12817 }
12818
12819 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12820    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
12821
12822 static bfd_boolean
12823 is_64bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12824 {
12825   switch (filedata->file_header.e_machine)
12826     {
12827     case EM_AARCH64:
12828       return reloc_type == 260; /* R_AARCH64_PREL64.  */
12829     case EM_ALPHA:
12830       return reloc_type == 11; /* R_ALPHA_SREL64.  */
12831     case EM_IA_64:
12832       return (reloc_type == 0x4e    /* R_IA64_PCREL64MSB.  */
12833               || reloc_type == 0x4f /* R_IA64_PCREL64LSB.  */);
12834     case EM_PARISC:
12835       return reloc_type == 72; /* R_PARISC_PCREL64.  */
12836     case EM_PPC64:
12837       return reloc_type == 44; /* R_PPC64_REL64.  */
12838     case EM_SPARC32PLUS:
12839     case EM_SPARCV9:
12840     case EM_SPARC:
12841       return reloc_type == 46; /* R_SPARC_DISP64.  */
12842     case EM_X86_64:
12843     case EM_L1OM:
12844     case EM_K1OM:
12845       return reloc_type == 24; /* R_X86_64_PC64.  */
12846     case EM_S390_OLD:
12847     case EM_S390:
12848       return reloc_type == 23;  /* R_S390_PC64.  */
12849     case EM_TILEGX:
12850       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
12851     default:
12852       return FALSE;
12853     }
12854 }
12855
12856 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12857    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
12858
12859 static bfd_boolean
12860 is_24bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12861 {
12862   switch (filedata->file_header.e_machine)
12863     {
12864     case EM_CYGNUS_MN10200:
12865     case EM_MN10200:
12866       return reloc_type == 4; /* R_MN10200_24.  */
12867     case EM_FT32:
12868       return reloc_type == 5; /* R_FT32_20.  */
12869     default:
12870       return FALSE;
12871     }
12872 }
12873
12874 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12875    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
12876
12877 static bfd_boolean
12878 is_16bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12879 {
12880   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12881   switch (filedata->file_header.e_machine)
12882     {
12883     case EM_ARC:
12884     case EM_ARC_COMPACT:
12885     case EM_ARC_COMPACT2:
12886       return reloc_type == 2; /* R_ARC_16.  */
12887     case EM_ADAPTEVA_EPIPHANY:
12888       return reloc_type == 5;
12889     case EM_AVR_OLD:
12890     case EM_AVR:
12891       return reloc_type == 4; /* R_AVR_16.  */
12892     case EM_CYGNUS_D10V:
12893     case EM_D10V:
12894       return reloc_type == 3; /* R_D10V_16.  */
12895     case EM_FT32:
12896       return reloc_type == 2; /* R_FT32_16.  */
12897     case EM_H8S:
12898     case EM_H8_300:
12899     case EM_H8_300H:
12900       return reloc_type == R_H8_DIR16;
12901     case EM_IP2K_OLD:
12902     case EM_IP2K:
12903       return reloc_type == 1; /* R_IP2K_16.  */
12904     case EM_M32C_OLD:
12905     case EM_M32C:
12906       return reloc_type == 1; /* R_M32C_16 */
12907     case EM_CYGNUS_MN10200:
12908     case EM_MN10200:
12909       return reloc_type == 2; /* R_MN10200_16.  */
12910     case EM_CYGNUS_MN10300:
12911     case EM_MN10300:
12912       return reloc_type == 2; /* R_MN10300_16.  */
12913     case EM_MSP430:
12914       if (uses_msp430x_relocs (filedata))
12915         return reloc_type == 2; /* R_MSP430_ABS16.  */
12916       /* Fall through.  */
12917     case EM_MSP430_OLD:
12918       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
12919     case EM_NDS32:
12920       return reloc_type == 19; /* R_NDS32_RELA.  */
12921     case EM_ALTERA_NIOS2:
12922       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
12923     case EM_NIOS32:
12924       return reloc_type == 9; /* R_NIOS_16.  */
12925     case EM_OR1K:
12926       return reloc_type == 2; /* R_OR1K_16.  */
12927     case EM_RISCV:
12928       return reloc_type == 55; /* R_RISCV_SET16.  */
12929     case EM_TI_PRU:
12930       return reloc_type == 8; /* R_PRU_BFD_RELOC_16.  */
12931     case EM_TI_C6000:
12932       return reloc_type == 2; /* R_C6000_ABS16.  */
12933     case EM_VISIUM:
12934       return reloc_type == 2; /* R_VISIUM_16. */
12935     case EM_XC16X:
12936     case EM_C166:
12937       return reloc_type == 2; /* R_XC16C_ABS_16.  */
12938     case EM_XGATE:
12939       return reloc_type == 3; /* R_XGATE_16.  */
12940     default:
12941       return FALSE;
12942     }
12943 }
12944
12945 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12946    a 8-bit absolute RELA relocation used in DWARF debug sections.  */
12947
12948 static bfd_boolean
12949 is_8bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12950 {
12951   switch (filedata->file_header.e_machine)
12952     {
12953     case EM_RISCV:
12954       return reloc_type == 54; /* R_RISCV_SET8.  */
12955     default:
12956       return FALSE;
12957     }
12958 }
12959
12960 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12961    a 6-bit absolute RELA relocation used in DWARF debug sections.  */
12962
12963 static bfd_boolean
12964 is_6bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12965 {
12966   switch (filedata->file_header.e_machine)
12967     {
12968     case EM_RISCV:
12969       return reloc_type == 53; /* R_RISCV_SET6.  */
12970     default:
12971       return FALSE;
12972     }
12973 }
12974
12975 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12976    a 32-bit inplace add RELA relocation used in DWARF debug sections.  */
12977
12978 static bfd_boolean
12979 is_32bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12980 {
12981   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12982   switch (filedata->file_header.e_machine)
12983     {
12984     case EM_RISCV:
12985       return reloc_type == 35; /* R_RISCV_ADD32.  */
12986     default:
12987       return FALSE;
12988     }
12989 }
12990
12991 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12992    a 32-bit inplace sub RELA relocation used in DWARF debug sections.  */
12993
12994 static bfd_boolean
12995 is_32bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12996 {
12997   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12998   switch (filedata->file_header.e_machine)
12999     {
13000     case EM_RISCV:
13001       return reloc_type == 39; /* R_RISCV_SUB32.  */
13002     default:
13003       return FALSE;
13004     }
13005 }
13006
13007 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13008    a 64-bit inplace add RELA relocation used in DWARF debug sections.  */
13009
13010 static bfd_boolean
13011 is_64bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
13012 {
13013   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13014   switch (filedata->file_header.e_machine)
13015     {
13016     case EM_RISCV:
13017       return reloc_type == 36; /* R_RISCV_ADD64.  */
13018     default:
13019       return FALSE;
13020     }
13021 }
13022
13023 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13024    a 64-bit inplace sub RELA relocation used in DWARF debug sections.  */
13025
13026 static bfd_boolean
13027 is_64bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
13028 {
13029   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13030   switch (filedata->file_header.e_machine)
13031     {
13032     case EM_RISCV:
13033       return reloc_type == 40; /* R_RISCV_SUB64.  */
13034     default:
13035       return FALSE;
13036     }
13037 }
13038
13039 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13040    a 16-bit inplace add RELA relocation used in DWARF debug sections.  */
13041
13042 static bfd_boolean
13043 is_16bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
13044 {
13045   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13046   switch (filedata->file_header.e_machine)
13047     {
13048     case EM_RISCV:
13049       return reloc_type == 34; /* R_RISCV_ADD16.  */
13050     default:
13051       return FALSE;
13052     }
13053 }
13054
13055 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13056    a 16-bit inplace sub RELA relocation used in DWARF debug sections.  */
13057
13058 static bfd_boolean
13059 is_16bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
13060 {
13061   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13062   switch (filedata->file_header.e_machine)
13063     {
13064     case EM_RISCV:
13065       return reloc_type == 38; /* R_RISCV_SUB16.  */
13066     default:
13067       return FALSE;
13068     }
13069 }
13070
13071 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13072    a 8-bit inplace add RELA relocation used in DWARF debug sections.  */
13073
13074 static bfd_boolean
13075 is_8bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
13076 {
13077   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13078   switch (filedata->file_header.e_machine)
13079     {
13080     case EM_RISCV:
13081       return reloc_type == 33; /* R_RISCV_ADD8.  */
13082     default:
13083       return FALSE;
13084     }
13085 }
13086
13087 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13088    a 8-bit inplace sub RELA relocation used in DWARF debug sections.  */
13089
13090 static bfd_boolean
13091 is_8bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
13092 {
13093   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13094   switch (filedata->file_header.e_machine)
13095     {
13096     case EM_RISCV:
13097       return reloc_type == 37; /* R_RISCV_SUB8.  */
13098     default:
13099       return FALSE;
13100     }
13101 }
13102
13103 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13104    a 6-bit inplace sub RELA relocation used in DWARF debug sections.  */
13105
13106 static bfd_boolean
13107 is_6bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
13108 {
13109   switch (filedata->file_header.e_machine)
13110     {
13111     case EM_RISCV:
13112       return reloc_type == 52; /* R_RISCV_SUB6.  */
13113     default:
13114       return FALSE;
13115     }
13116 }
13117
13118 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
13119    relocation entries (possibly formerly used for SHT_GROUP sections).  */
13120
13121 static bfd_boolean
13122 is_none_reloc (Filedata * filedata, unsigned int reloc_type)
13123 {
13124   switch (filedata->file_header.e_machine)
13125     {
13126     case EM_386:     /* R_386_NONE.  */
13127     case EM_68K:     /* R_68K_NONE.  */
13128     case EM_ADAPTEVA_EPIPHANY:
13129     case EM_ALPHA:   /* R_ALPHA_NONE.  */
13130     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
13131     case EM_ARC:     /* R_ARC_NONE.  */
13132     case EM_ARC_COMPACT2: /* R_ARC_NONE.  */
13133     case EM_ARC_COMPACT: /* R_ARC_NONE.  */
13134     case EM_ARM:     /* R_ARM_NONE.  */
13135     case EM_C166:    /* R_XC16X_NONE.  */
13136     case EM_CRIS:    /* R_CRIS_NONE.  */
13137     case EM_FT32:    /* R_FT32_NONE.  */
13138     case EM_IA_64:   /* R_IA64_NONE.  */
13139     case EM_K1OM:    /* R_X86_64_NONE.  */
13140     case EM_L1OM:    /* R_X86_64_NONE.  */
13141     case EM_M32R:    /* R_M32R_NONE.  */
13142     case EM_MIPS:    /* R_MIPS_NONE.  */
13143     case EM_MN10300: /* R_MN10300_NONE.  */
13144     case EM_MOXIE:   /* R_MOXIE_NONE.  */
13145     case EM_NIOS32:  /* R_NIOS_NONE.  */
13146     case EM_OR1K:    /* R_OR1K_NONE. */
13147     case EM_PARISC:  /* R_PARISC_NONE.  */
13148     case EM_PPC64:   /* R_PPC64_NONE.  */
13149     case EM_PPC:     /* R_PPC_NONE.  */
13150     case EM_RISCV:   /* R_RISCV_NONE.  */
13151     case EM_S390:    /* R_390_NONE.  */
13152     case EM_S390_OLD:
13153     case EM_SH:      /* R_SH_NONE.  */
13154     case EM_SPARC32PLUS:
13155     case EM_SPARC:   /* R_SPARC_NONE.  */
13156     case EM_SPARCV9:
13157     case EM_TILEGX:  /* R_TILEGX_NONE.  */
13158     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
13159     case EM_TI_C6000:/* R_C6000_NONE.  */
13160     case EM_X86_64:  /* R_X86_64_NONE.  */
13161     case EM_XC16X:
13162     case EM_WEBASSEMBLY: /* R_WASM32_NONE.  */
13163       return reloc_type == 0;
13164
13165     case EM_AARCH64:
13166       return reloc_type == 0 || reloc_type == 256;
13167     case EM_AVR_OLD:
13168     case EM_AVR:
13169       return (reloc_type == 0 /* R_AVR_NONE.  */
13170               || reloc_type == 30 /* R_AVR_DIFF8.  */
13171               || reloc_type == 31 /* R_AVR_DIFF16.  */
13172               || reloc_type == 32 /* R_AVR_DIFF32.  */);
13173     case EM_METAG:
13174       return reloc_type == 3; /* R_METAG_NONE.  */
13175     case EM_NDS32:
13176       return (reloc_type == 0       /* R_XTENSA_NONE.  */
13177               || reloc_type == 204  /* R_NDS32_DIFF8.  */
13178               || reloc_type == 205  /* R_NDS32_DIFF16.  */
13179               || reloc_type == 206  /* R_NDS32_DIFF32.  */
13180               || reloc_type == 207  /* R_NDS32_ULEB128.  */);
13181     case EM_TI_PRU:
13182       return (reloc_type == 0       /* R_PRU_NONE.  */
13183               || reloc_type == 65   /* R_PRU_DIFF8.  */
13184               || reloc_type == 66   /* R_PRU_DIFF16.  */
13185               || reloc_type == 67   /* R_PRU_DIFF32.  */);
13186     case EM_XTENSA_OLD:
13187     case EM_XTENSA:
13188       return (reloc_type == 0      /* R_XTENSA_NONE.  */
13189               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
13190               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
13191               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
13192     }
13193   return FALSE;
13194 }
13195
13196 /* Returns TRUE if there is a relocation against
13197    section NAME at OFFSET bytes.  */
13198
13199 bfd_boolean
13200 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
13201 {
13202   Elf_Internal_Rela * relocs;
13203   Elf_Internal_Rela * rp;
13204
13205   if (dsec == NULL || dsec->reloc_info == NULL)
13206     return FALSE;
13207
13208   relocs = (Elf_Internal_Rela *) dsec->reloc_info;
13209
13210   for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
13211     if (rp->r_offset == offset)
13212       return TRUE;
13213
13214    return FALSE;
13215 }
13216
13217 /* Apply relocations to a section.
13218    Returns TRUE upon success, FALSE otherwise.
13219    If RELOCS_RETURN is non-NULL then it is set to point to the loaded relocs.
13220    It is then the caller's responsibility to free them.  NUM_RELOCS_RETURN
13221    will be set to the number of relocs loaded.
13222
13223    Note: So far support has been added only for those relocations
13224    which can be found in debug sections. FIXME: Add support for
13225    more relocations ?  */
13226
13227 static bfd_boolean
13228 apply_relocations (Filedata *                 filedata,
13229                    const Elf_Internal_Shdr *  section,
13230                    unsigned char *            start,
13231                    bfd_size_type              size,
13232                    void **                    relocs_return,
13233                    unsigned long *            num_relocs_return)
13234 {
13235   Elf_Internal_Shdr * relsec;
13236   unsigned char * end = start + size;
13237
13238   if (relocs_return != NULL)
13239     {
13240       * (Elf_Internal_Rela **) relocs_return = NULL;
13241       * num_relocs_return = 0;
13242     }
13243
13244   if (filedata->file_header.e_type != ET_REL)
13245     /* No relocs to apply.  */
13246     return TRUE;
13247
13248   /* Find the reloc section associated with the section.  */
13249   for (relsec = filedata->section_headers;
13250        relsec < filedata->section_headers + filedata->file_header.e_shnum;
13251        ++relsec)
13252     {
13253       bfd_boolean is_rela;
13254       unsigned long num_relocs;
13255       Elf_Internal_Rela * relocs;
13256       Elf_Internal_Rela * rp;
13257       Elf_Internal_Shdr * symsec;
13258       Elf_Internal_Sym * symtab;
13259       unsigned long num_syms;
13260       Elf_Internal_Sym * sym;
13261
13262       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13263           || relsec->sh_info >= filedata->file_header.e_shnum
13264           || filedata->section_headers + relsec->sh_info != section
13265           || relsec->sh_size == 0
13266           || relsec->sh_link >= filedata->file_header.e_shnum)
13267         continue;
13268
13269       is_rela = relsec->sh_type == SHT_RELA;
13270
13271       if (is_rela)
13272         {
13273           if (!slurp_rela_relocs (filedata, relsec->sh_offset,
13274                                   relsec->sh_size, & relocs, & num_relocs))
13275             return FALSE;
13276         }
13277       else
13278         {
13279           if (!slurp_rel_relocs (filedata, relsec->sh_offset,
13280                                  relsec->sh_size, & relocs, & num_relocs))
13281             return FALSE;
13282         }
13283
13284       /* SH uses RELA but uses in place value instead of the addend field.  */
13285       if (filedata->file_header.e_machine == EM_SH)
13286         is_rela = FALSE;
13287
13288       symsec = filedata->section_headers + relsec->sh_link;
13289       if (symsec->sh_type != SHT_SYMTAB
13290           && symsec->sh_type != SHT_DYNSYM)
13291         return FALSE;
13292       symtab = GET_ELF_SYMBOLS (filedata, symsec, & num_syms);
13293
13294       for (rp = relocs; rp < relocs + num_relocs; ++rp)
13295         {
13296           bfd_vma         addend;
13297           unsigned int    reloc_type;
13298           unsigned int    reloc_size;
13299           bfd_boolean     reloc_inplace = FALSE;
13300           bfd_boolean     reloc_subtract = FALSE;
13301           unsigned char * rloc;
13302           unsigned long   sym_index;
13303
13304           reloc_type = get_reloc_type (filedata, rp->r_info);
13305
13306           if (target_specific_reloc_handling (filedata, rp, start, end, symtab, num_syms))
13307             continue;
13308           else if (is_none_reloc (filedata, reloc_type))
13309             continue;
13310           else if (is_32bit_abs_reloc (filedata, reloc_type)
13311                    || is_32bit_pcrel_reloc (filedata, reloc_type))
13312             reloc_size = 4;
13313           else if (is_64bit_abs_reloc (filedata, reloc_type)
13314                    || is_64bit_pcrel_reloc (filedata, reloc_type))
13315             reloc_size = 8;
13316           else if (is_24bit_abs_reloc (filedata, reloc_type))
13317             reloc_size = 3;
13318           else if (is_16bit_abs_reloc (filedata, reloc_type))
13319             reloc_size = 2;
13320           else if (is_8bit_abs_reloc (filedata, reloc_type)
13321                    || is_6bit_abs_reloc (filedata, reloc_type))
13322             reloc_size = 1;
13323           else if ((reloc_subtract = is_32bit_inplace_sub_reloc (filedata,
13324                                                                  reloc_type))
13325                    || is_32bit_inplace_add_reloc (filedata, reloc_type))
13326             {
13327               reloc_size = 4;
13328               reloc_inplace = TRUE;
13329             }
13330           else if ((reloc_subtract = is_64bit_inplace_sub_reloc (filedata,
13331                                                                  reloc_type))
13332                    || is_64bit_inplace_add_reloc (filedata, reloc_type))
13333             {
13334               reloc_size = 8;
13335               reloc_inplace = TRUE;
13336             }
13337           else if ((reloc_subtract = is_16bit_inplace_sub_reloc (filedata,
13338                                                                  reloc_type))
13339                    || is_16bit_inplace_add_reloc (filedata, reloc_type))
13340             {
13341               reloc_size = 2;
13342               reloc_inplace = TRUE;
13343             }
13344           else if ((reloc_subtract = is_8bit_inplace_sub_reloc (filedata,
13345                                                                 reloc_type))
13346                    || is_8bit_inplace_add_reloc (filedata, reloc_type))
13347             {
13348               reloc_size = 1;
13349               reloc_inplace = TRUE;
13350             }
13351           else if ((reloc_subtract = is_6bit_inplace_sub_reloc (filedata,
13352                                                                 reloc_type)))
13353             {
13354               reloc_size = 1;
13355               reloc_inplace = TRUE;
13356             }
13357           else
13358             {
13359               static unsigned int prev_reloc = 0;
13360
13361               if (reloc_type != prev_reloc)
13362                 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
13363                       reloc_type, printable_section_name (filedata, section));
13364               prev_reloc = reloc_type;
13365               continue;
13366             }
13367
13368           rloc = start + rp->r_offset;
13369           if ((rloc + reloc_size) > end || (rloc < start))
13370             {
13371               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
13372                     (unsigned long) rp->r_offset,
13373                     printable_section_name (filedata, section));
13374               continue;
13375             }
13376
13377           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
13378           if (sym_index >= num_syms)
13379             {
13380               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
13381                     sym_index, printable_section_name (filedata, section));
13382               continue;
13383             }
13384           sym = symtab + sym_index;
13385
13386           /* If the reloc has a symbol associated with it,
13387              make sure that it is of an appropriate type.
13388
13389              Relocations against symbols without type can happen.
13390              Gcc -feliminate-dwarf2-dups may generate symbols
13391              without type for debug info.
13392
13393              Icc generates relocations against function symbols
13394              instead of local labels.
13395
13396              Relocations against object symbols can happen, eg when
13397              referencing a global array.  For an example of this see
13398              the _clz.o binary in libgcc.a.  */
13399           if (sym != symtab
13400               && ELF_ST_TYPE (sym->st_info) != STT_COMMON
13401               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
13402             {
13403               warn (_("skipping unexpected symbol type %s in section %s relocation %ld\n"),
13404                     get_symbol_type (filedata, ELF_ST_TYPE (sym->st_info)),
13405                     printable_section_name (filedata, relsec),
13406                     (long int)(rp - relocs));
13407               continue;
13408             }
13409
13410           addend = 0;
13411           if (is_rela)
13412             addend += rp->r_addend;
13413           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
13414              partial_inplace.  */
13415           if (!is_rela
13416               || (filedata->file_header.e_machine == EM_XTENSA
13417                   && reloc_type == 1)
13418               || ((filedata->file_header.e_machine == EM_PJ
13419                    || filedata->file_header.e_machine == EM_PJ_OLD)
13420                   && reloc_type == 1)
13421               || ((filedata->file_header.e_machine == EM_D30V
13422                    || filedata->file_header.e_machine == EM_CYGNUS_D30V)
13423                   && reloc_type == 12)
13424               || reloc_inplace)
13425             {
13426               if (is_6bit_inplace_sub_reloc (filedata, reloc_type))
13427                 addend += byte_get (rloc, reloc_size) & 0x3f;
13428               else
13429                 addend += byte_get (rloc, reloc_size);
13430             }
13431
13432           if (is_32bit_pcrel_reloc (filedata, reloc_type)
13433               || is_64bit_pcrel_reloc (filedata, reloc_type))
13434             {
13435               /* On HPPA, all pc-relative relocations are biased by 8.  */
13436               if (filedata->file_header.e_machine == EM_PARISC)
13437                 addend -= 8;
13438               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
13439                         reloc_size);
13440             }
13441           else if (is_6bit_abs_reloc (filedata, reloc_type)
13442                    || is_6bit_inplace_sub_reloc (filedata, reloc_type))
13443             {
13444               if (reloc_subtract)
13445                 addend -= sym->st_value;
13446               else
13447                 addend += sym->st_value;
13448               addend = (addend & 0x3f) | (byte_get (rloc, reloc_size) & 0xc0);
13449               byte_put (rloc, addend, reloc_size);
13450             }
13451           else if (reloc_subtract)
13452             byte_put (rloc, addend - sym->st_value, reloc_size);
13453           else
13454             byte_put (rloc, addend + sym->st_value, reloc_size);
13455         }
13456
13457       free (symtab);
13458       /* Let the target specific reloc processing code know that
13459          we have finished with these relocs.  */
13460       target_specific_reloc_handling (filedata, NULL, NULL, NULL, NULL, 0);
13461
13462       if (relocs_return)
13463         {
13464           * (Elf_Internal_Rela **) relocs_return = relocs;
13465           * num_relocs_return = num_relocs;
13466         }
13467       else
13468         free (relocs);
13469
13470       break;
13471     }
13472
13473   return TRUE;
13474 }
13475
13476 #ifdef SUPPORT_DISASSEMBLY
13477 static bfd_boolean
13478 disassemble_section (Elf_Internal_Shdr * section, Filedata * filedata)
13479 {
13480   printf (_("\nAssembly dump of section %s\n"), printable_section_name (filedata, section));
13481
13482   /* FIXME: XXX -- to be done --- XXX */
13483
13484   return TRUE;
13485 }
13486 #endif
13487
13488 /* Reads in the contents of SECTION from FILE, returning a pointer
13489    to a malloc'ed buffer or NULL if something went wrong.  */
13490
13491 static char *
13492 get_section_contents (Elf_Internal_Shdr * section, Filedata * filedata)
13493 {
13494   bfd_size_type num_bytes = section->sh_size;
13495
13496   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
13497     {
13498       printf (_("Section '%s' has no data to dump.\n"),
13499               printable_section_name (filedata, section));
13500       return NULL;
13501     }
13502
13503   return  (char *) get_data (NULL, filedata, section->sh_offset, 1, num_bytes,
13504                              _("section contents"));
13505 }
13506
13507 /* Uncompresses a section that was compressed using zlib, in place.  */
13508
13509 static bfd_boolean
13510 uncompress_section_contents (unsigned char **   buffer,
13511                              dwarf_size_type    uncompressed_size,
13512                              dwarf_size_type *  size)
13513 {
13514   dwarf_size_type compressed_size = *size;
13515   unsigned char * compressed_buffer = *buffer;
13516   unsigned char * uncompressed_buffer;
13517   z_stream strm;
13518   int rc;
13519
13520   /* It is possible the section consists of several compressed
13521      buffers concatenated together, so we uncompress in a loop.  */
13522   /* PR 18313: The state field in the z_stream structure is supposed
13523      to be invisible to the user (ie us), but some compilers will
13524      still complain about it being used without initialisation.  So
13525      we first zero the entire z_stream structure and then set the fields
13526      that we need.  */
13527   memset (& strm, 0, sizeof strm);
13528   strm.avail_in = compressed_size;
13529   strm.next_in = (Bytef *) compressed_buffer;
13530   strm.avail_out = uncompressed_size;
13531   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
13532
13533   rc = inflateInit (& strm);
13534   while (strm.avail_in > 0)
13535     {
13536       if (rc != Z_OK)
13537         goto fail;
13538       strm.next_out = ((Bytef *) uncompressed_buffer
13539                        + (uncompressed_size - strm.avail_out));
13540       rc = inflate (&strm, Z_FINISH);
13541       if (rc != Z_STREAM_END)
13542         goto fail;
13543       rc = inflateReset (& strm);
13544     }
13545   rc = inflateEnd (& strm);
13546   if (rc != Z_OK
13547       || strm.avail_out != 0)
13548     goto fail;
13549
13550   *buffer = uncompressed_buffer;
13551   *size = uncompressed_size;
13552   return TRUE;
13553
13554  fail:
13555   free (uncompressed_buffer);
13556   /* Indicate decompression failure.  */
13557   *buffer = NULL;
13558   return FALSE;
13559 }
13560
13561 static bfd_boolean
13562 dump_section_as_strings (Elf_Internal_Shdr * section, Filedata * filedata)
13563 {
13564   Elf_Internal_Shdr *  relsec;
13565   bfd_size_type        num_bytes;
13566   unsigned char *      data;
13567   unsigned char *      end;
13568   unsigned char *      real_start;
13569   unsigned char *      start;
13570   bfd_boolean          some_strings_shown;
13571
13572   real_start = start = (unsigned char *) get_section_contents (section, filedata);
13573   if (start == NULL)
13574     /* PR 21820: Do not fail if the section was empty.  */
13575     return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13576
13577   num_bytes = section->sh_size;
13578
13579   printf (_("\nString dump of section '%s':\n"), printable_section_name (filedata, section));
13580
13581   if (decompress_dumps)
13582     {
13583       dwarf_size_type new_size = num_bytes;
13584       dwarf_size_type uncompressed_size = 0;
13585
13586       if ((section->sh_flags & SHF_COMPRESSED) != 0)
13587         {
13588           Elf_Internal_Chdr chdr;
13589           unsigned int compression_header_size
13590             = get_compression_header (& chdr, (unsigned char *) start,
13591                                       num_bytes);
13592
13593           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13594             {
13595               warn (_("section '%s' has unsupported compress type: %d\n"),
13596                     printable_section_name (filedata, section), chdr.ch_type);
13597               return FALSE;
13598             }
13599           uncompressed_size = chdr.ch_size;
13600           start += compression_header_size;
13601           new_size -= compression_header_size;
13602         }
13603       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13604         {
13605           /* Read the zlib header.  In this case, it should be "ZLIB"
13606              followed by the uncompressed section size, 8 bytes in
13607              big-endian order.  */
13608           uncompressed_size = start[4]; uncompressed_size <<= 8;
13609           uncompressed_size += start[5]; uncompressed_size <<= 8;
13610           uncompressed_size += start[6]; uncompressed_size <<= 8;
13611           uncompressed_size += start[7]; uncompressed_size <<= 8;
13612           uncompressed_size += start[8]; uncompressed_size <<= 8;
13613           uncompressed_size += start[9]; uncompressed_size <<= 8;
13614           uncompressed_size += start[10]; uncompressed_size <<= 8;
13615           uncompressed_size += start[11];
13616           start += 12;
13617           new_size -= 12;
13618         }
13619
13620       if (uncompressed_size)
13621         {
13622           if (uncompress_section_contents (& start,
13623                                            uncompressed_size, & new_size))
13624             num_bytes = new_size;
13625           else
13626             {
13627               error (_("Unable to decompress section %s\n"),
13628                      printable_section_name (filedata, section));
13629               return FALSE;
13630             }
13631         }
13632       else
13633         start = real_start;
13634     }
13635
13636   /* If the section being dumped has relocations against it the user might
13637      be expecting these relocations to have been applied.  Check for this
13638      case and issue a warning message in order to avoid confusion.
13639      FIXME: Maybe we ought to have an option that dumps a section with
13640      relocs applied ?  */
13641   for (relsec = filedata->section_headers;
13642        relsec < filedata->section_headers + filedata->file_header.e_shnum;
13643        ++relsec)
13644     {
13645       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13646           || relsec->sh_info >= filedata->file_header.e_shnum
13647           || filedata->section_headers + relsec->sh_info != section
13648           || relsec->sh_size == 0
13649           || relsec->sh_link >= filedata->file_header.e_shnum)
13650         continue;
13651
13652       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13653       break;
13654     }
13655
13656   data = start;
13657   end  = start + num_bytes;
13658   some_strings_shown = FALSE;
13659
13660   while (data < end)
13661     {
13662       while (!ISPRINT (* data))
13663         if (++ data >= end)
13664           break;
13665
13666       if (data < end)
13667         {
13668           size_t maxlen = end - data;
13669
13670 #ifndef __MSVCRT__
13671           /* PR 11128: Use two separate invocations in order to work
13672              around bugs in the Solaris 8 implementation of printf.  */
13673           printf ("  [%6tx]  ", data - start);
13674 #else
13675           printf ("  [%6Ix]  ", (size_t) (data - start));
13676 #endif
13677           if (maxlen > 0)
13678             {
13679               print_symbol ((int) maxlen, (const char *) data);
13680               putchar ('\n');
13681               data += strnlen ((const char *) data, maxlen);
13682             }
13683           else
13684             {
13685               printf (_("<corrupt>\n"));
13686               data = end;
13687             }
13688           some_strings_shown = TRUE;
13689         }
13690     }
13691
13692   if (! some_strings_shown)
13693     printf (_("  No strings found in this section."));
13694
13695   free (real_start);
13696
13697   putchar ('\n');
13698   return TRUE;
13699 }
13700
13701 static bfd_boolean
13702 dump_section_as_bytes (Elf_Internal_Shdr *  section,
13703                        Filedata *           filedata,
13704                        bfd_boolean          relocate)
13705 {
13706   Elf_Internal_Shdr * relsec;
13707   bfd_size_type       bytes;
13708   bfd_size_type       section_size;
13709   bfd_vma             addr;
13710   unsigned char *     data;
13711   unsigned char *     real_start;
13712   unsigned char *     start;
13713
13714   real_start = start = (unsigned char *) get_section_contents (section, filedata);
13715   if (start == NULL)
13716     /* PR 21820: Do not fail if the section was empty.  */
13717     return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13718
13719   section_size = section->sh_size;
13720
13721   printf (_("\nHex dump of section '%s':\n"), printable_section_name (filedata, section));
13722
13723   if (decompress_dumps)
13724     {
13725       dwarf_size_type new_size = section_size;
13726       dwarf_size_type uncompressed_size = 0;
13727
13728       if ((section->sh_flags & SHF_COMPRESSED) != 0)
13729         {
13730           Elf_Internal_Chdr chdr;
13731           unsigned int compression_header_size
13732             = get_compression_header (& chdr, start, section_size);
13733
13734           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13735             {
13736               warn (_("section '%s' has unsupported compress type: %d\n"),
13737                     printable_section_name (filedata, section), chdr.ch_type);
13738               return FALSE;
13739             }
13740           uncompressed_size = chdr.ch_size;
13741           start += compression_header_size;
13742           new_size -= compression_header_size;
13743         }
13744       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13745         {
13746           /* Read the zlib header.  In this case, it should be "ZLIB"
13747              followed by the uncompressed section size, 8 bytes in
13748              big-endian order.  */
13749           uncompressed_size = start[4]; uncompressed_size <<= 8;
13750           uncompressed_size += start[5]; uncompressed_size <<= 8;
13751           uncompressed_size += start[6]; uncompressed_size <<= 8;
13752           uncompressed_size += start[7]; uncompressed_size <<= 8;
13753           uncompressed_size += start[8]; uncompressed_size <<= 8;
13754           uncompressed_size += start[9]; uncompressed_size <<= 8;
13755           uncompressed_size += start[10]; uncompressed_size <<= 8;
13756           uncompressed_size += start[11];
13757           start += 12;
13758           new_size -= 12;
13759         }
13760
13761       if (uncompressed_size)
13762         {
13763           if (uncompress_section_contents (& start, uncompressed_size,
13764                                            & new_size))
13765             {
13766               section_size = new_size;
13767             }
13768           else
13769             {
13770               error (_("Unable to decompress section %s\n"),
13771                      printable_section_name (filedata, section));
13772               /* FIXME: Print the section anyway ?  */
13773               return FALSE;
13774             }
13775         }
13776       else
13777         start = real_start;
13778     }
13779
13780   if (relocate)
13781     {
13782       if (! apply_relocations (filedata, section, start, section_size, NULL, NULL))
13783         return FALSE;
13784     }
13785   else
13786     {
13787       /* If the section being dumped has relocations against it the user might
13788          be expecting these relocations to have been applied.  Check for this
13789          case and issue a warning message in order to avoid confusion.
13790          FIXME: Maybe we ought to have an option that dumps a section with
13791          relocs applied ?  */
13792       for (relsec = filedata->section_headers;
13793            relsec < filedata->section_headers + filedata->file_header.e_shnum;
13794            ++relsec)
13795         {
13796           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13797               || relsec->sh_info >= filedata->file_header.e_shnum
13798               || filedata->section_headers + relsec->sh_info != section
13799               || relsec->sh_size == 0
13800               || relsec->sh_link >= filedata->file_header.e_shnum)
13801             continue;
13802
13803           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13804           break;
13805         }
13806     }
13807
13808   addr = section->sh_addr;
13809   bytes = section_size;
13810   data = start;
13811
13812   while (bytes)
13813     {
13814       int j;
13815       int k;
13816       int lbytes;
13817
13818       lbytes = (bytes > 16 ? 16 : bytes);
13819
13820       printf ("  0x%8.8lx ", (unsigned long) addr);
13821
13822       for (j = 0; j < 16; j++)
13823         {
13824           if (j < lbytes)
13825             printf ("%2.2x", data[j]);
13826           else
13827             printf ("  ");
13828
13829           if ((j & 3) == 3)
13830             printf (" ");
13831         }
13832
13833       for (j = 0; j < lbytes; j++)
13834         {
13835           k = data[j];
13836           if (k >= ' ' && k < 0x7f)
13837             printf ("%c", k);
13838           else
13839             printf (".");
13840         }
13841
13842       putchar ('\n');
13843
13844       data  += lbytes;
13845       addr  += lbytes;
13846       bytes -= lbytes;
13847     }
13848
13849   free (real_start);
13850
13851   putchar ('\n');
13852   return TRUE;
13853 }
13854
13855 static ctf_sect_t *
13856 shdr_to_ctf_sect (ctf_sect_t *buf, Elf_Internal_Shdr *shdr, Filedata *filedata)
13857 {
13858   buf->cts_name = SECTION_NAME (shdr);
13859   buf->cts_size = shdr->sh_size;
13860   buf->cts_entsize = shdr->sh_entsize;
13861
13862   return buf;
13863 }
13864
13865 /* Formatting callback function passed to ctf_dump.  Returns either the pointer
13866    it is passed, or a pointer to newly-allocated storage, in which case
13867    dump_ctf() will free it when it no longer needs it.  */
13868
13869 static char *dump_ctf_indent_lines (ctf_sect_names_t sect ATTRIBUTE_UNUSED,
13870                                     char *s, void *arg)
13871 {
13872   const char *blanks = arg;
13873   char *new_s;
13874
13875   if (asprintf (&new_s, "%s%s", blanks, s) < 0)
13876     return s;
13877   return new_s;
13878 }
13879
13880 static bfd_boolean
13881 dump_section_as_ctf (Elf_Internal_Shdr * section, Filedata * filedata)
13882 {
13883   Elf_Internal_Shdr *  parent_sec = NULL;
13884   Elf_Internal_Shdr *  symtab_sec = NULL;
13885   Elf_Internal_Shdr *  strtab_sec = NULL;
13886   void *               data = NULL;
13887   void *               symdata = NULL;
13888   void *               strdata = NULL;
13889   void *               parentdata = NULL;
13890   ctf_sect_t           ctfsect, symsect, strsect, parentsect;
13891   ctf_sect_t *         symsectp = NULL;
13892   ctf_sect_t *         strsectp = NULL;
13893   ctf_file_t *         ctf = NULL;
13894   ctf_file_t *         parent = NULL;
13895
13896   const char *things[] = {"Labels", "Data objects", "Function objects",
13897                           "Variables", "Types", "Strings", ""};
13898   const char **thing;
13899   int err;
13900   bfd_boolean ret = FALSE;
13901   size_t i;
13902
13903   shdr_to_ctf_sect (&ctfsect, section, filedata);
13904   data = get_section_contents (section, filedata);
13905   ctfsect.cts_data = data;
13906
13907   if (dump_ctf_symtab_name)
13908     {
13909       if ((symtab_sec = find_section (filedata, dump_ctf_symtab_name)) == NULL)
13910         {
13911           error (_("No symbol section named %s\n"), dump_ctf_symtab_name);
13912           goto fail;
13913         }
13914       if ((symdata = (void *) get_data (NULL, filedata,
13915                                         symtab_sec->sh_offset, 1,
13916                                         symtab_sec->sh_size,
13917                                         _("symbols"))) == NULL)
13918         goto fail;
13919       symsectp = shdr_to_ctf_sect (&symsect, symtab_sec, filedata);
13920       symsect.cts_data = symdata;
13921     }
13922   if (dump_ctf_strtab_name)
13923     {
13924       if ((strtab_sec = find_section (filedata, dump_ctf_strtab_name)) == NULL)
13925         {
13926           error (_("No string table section named %s\n"),
13927                  dump_ctf_strtab_name);
13928           goto fail;
13929         }
13930       if ((strdata = (void *) get_data (NULL, filedata,
13931                                         strtab_sec->sh_offset, 1,
13932                                         strtab_sec->sh_size,
13933                                         _("strings"))) == NULL)
13934         goto fail;
13935       strsectp = shdr_to_ctf_sect (&strsect, strtab_sec, filedata);
13936       strsect.cts_data = strdata;
13937     }
13938   if (dump_ctf_parent_name)
13939     {
13940       if ((parent_sec = find_section (filedata, dump_ctf_parent_name)) == NULL)
13941         {
13942           error (_("No CTF parent section named %s\n"), dump_ctf_parent_name);
13943           goto fail;
13944         }
13945       if ((parentdata = (void *) get_data (NULL, filedata,
13946                                            parent_sec->sh_offset, 1,
13947                                            parent_sec->sh_size,
13948                                            _("CTF parent"))) == NULL)
13949         goto fail;
13950       shdr_to_ctf_sect (&parentsect, parent_sec, filedata);
13951       parentsect.cts_data = parentdata;
13952     }
13953
13954   /* Load the CTF file and dump it.  */
13955
13956   if ((ctf = ctf_bufopen (&ctfsect, symsectp, strsectp, &err)) == NULL)
13957     {
13958       error (_("CTF open failure: %s\n"), ctf_errmsg (err));
13959       goto fail;
13960     }
13961
13962   if (parentdata)
13963     {
13964       if ((parent = ctf_bufopen (&parentsect, symsectp, strsectp, &err)) == NULL)
13965         {
13966           error (_("CTF open failure: %s\n"), ctf_errmsg (err));
13967           goto fail;
13968         }
13969
13970       ctf_import (ctf, parent);
13971     }
13972
13973   ret = TRUE;
13974
13975   printf (_("\nDump of CTF section '%s':\n"),
13976           printable_section_name (filedata, section));
13977
13978   for (i = 1, thing = things; *thing[0]; thing++, i++)
13979     {
13980       ctf_dump_state_t *s = NULL;
13981       char *item;
13982
13983       printf ("\n  %s:\n", *thing);
13984       while ((item = ctf_dump (ctf, &s, i, dump_ctf_indent_lines,
13985                                (void *) "    ")) != NULL)
13986         {
13987           printf ("%s\n", item);
13988           free (item);
13989         }
13990
13991       if (ctf_errno (ctf))
13992         {
13993           error (_("Iteration failed: %s, %s\n"), *thing,
13994                    ctf_errmsg (ctf_errno (ctf)));
13995           ret = FALSE;
13996         }
13997     }
13998
13999  fail:
14000   ctf_file_close (ctf);
14001   ctf_file_close (parent);
14002   free (parentdata);
14003   free (data);
14004   free (symdata);
14005   free (strdata);
14006   return ret;
14007 }
14008
14009 static bfd_boolean
14010 load_specific_debug_section (enum dwarf_section_display_enum  debug,
14011                              const Elf_Internal_Shdr *        sec,
14012                              void *                           data)
14013 {
14014   struct dwarf_section * section = &debug_displays [debug].section;
14015   char buf [64];
14016   Filedata * filedata = (Filedata *) data;
14017
14018   if (section->start != NULL)
14019     {
14020       /* If it is already loaded, do nothing.  */
14021       if (streq (section->filename, filedata->file_name))
14022         return TRUE;
14023       free (section->start);
14024     }
14025
14026   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
14027   section->address = sec->sh_addr;
14028   section->user_data = NULL;
14029   section->filename = filedata->file_name;
14030   section->start = (unsigned char *) get_data (NULL, filedata,
14031                                                sec->sh_offset, 1,
14032                                                sec->sh_size, buf);
14033   if (section->start == NULL)
14034     section->size = 0;
14035   else
14036     {
14037       unsigned char *start = section->start;
14038       dwarf_size_type size = sec->sh_size;
14039       dwarf_size_type uncompressed_size = 0;
14040
14041       if ((sec->sh_flags & SHF_COMPRESSED) != 0)
14042         {
14043           Elf_Internal_Chdr chdr;
14044           unsigned int compression_header_size;
14045
14046           if (size < (is_32bit_elf
14047                       ? sizeof (Elf32_External_Chdr)
14048                       : sizeof (Elf64_External_Chdr)))
14049             {
14050               warn (_("compressed section %s is too small to contain a compression header"),
14051                     section->name);
14052               return FALSE;
14053             }
14054
14055           compression_header_size = get_compression_header (&chdr, start, size);
14056
14057           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
14058             {
14059               warn (_("section '%s' has unsupported compress type: %d\n"),
14060                     section->name, chdr.ch_type);
14061               return FALSE;
14062             }
14063           uncompressed_size = chdr.ch_size;
14064           start += compression_header_size;
14065           size -= compression_header_size;
14066         }
14067       else if (size > 12 && streq ((char *) start, "ZLIB"))
14068         {
14069           /* Read the zlib header.  In this case, it should be "ZLIB"
14070              followed by the uncompressed section size, 8 bytes in
14071              big-endian order.  */
14072           uncompressed_size = start[4]; uncompressed_size <<= 8;
14073           uncompressed_size += start[5]; uncompressed_size <<= 8;
14074           uncompressed_size += start[6]; uncompressed_size <<= 8;
14075           uncompressed_size += start[7]; uncompressed_size <<= 8;
14076           uncompressed_size += start[8]; uncompressed_size <<= 8;
14077           uncompressed_size += start[9]; uncompressed_size <<= 8;
14078           uncompressed_size += start[10]; uncompressed_size <<= 8;
14079           uncompressed_size += start[11];
14080           start += 12;
14081           size -= 12;
14082         }
14083
14084       if (uncompressed_size)
14085         {
14086           if (uncompress_section_contents (&start, uncompressed_size,
14087                                            &size))
14088             {
14089               /* Free the compressed buffer, update the section buffer
14090                  and the section size if uncompress is successful.  */
14091               free (section->start);
14092               section->start = start;
14093             }
14094           else
14095             {
14096               error (_("Unable to decompress section %s\n"),
14097                      printable_section_name (filedata, sec));
14098               return FALSE;
14099             }
14100         }
14101
14102       section->size = size;
14103     }
14104
14105   if (section->start == NULL)
14106     return FALSE;
14107
14108   if (debug_displays [debug].relocate)
14109     {
14110       if (! apply_relocations (filedata, sec, section->start, section->size,
14111                                & section->reloc_info, & section->num_relocs))
14112         return FALSE;
14113     }
14114   else
14115     {
14116       section->reloc_info = NULL;
14117       section->num_relocs = 0;
14118     }
14119
14120   return TRUE;
14121 }
14122
14123 /* If this is not NULL, load_debug_section will only look for sections
14124    within the list of sections given here.  */
14125 static unsigned int * section_subset = NULL;
14126
14127 bfd_boolean
14128 load_debug_section (enum dwarf_section_display_enum debug, void * data)
14129 {
14130   struct dwarf_section * section = &debug_displays [debug].section;
14131   Elf_Internal_Shdr * sec;
14132   Filedata * filedata = (Filedata *) data;
14133
14134   /* Without section headers we cannot find any sections.  */
14135   if (filedata->section_headers == NULL)
14136     return FALSE;
14137
14138   if (filedata->string_table == NULL
14139       && filedata->file_header.e_shstrndx != SHN_UNDEF
14140       && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
14141     {
14142       Elf_Internal_Shdr * strs;
14143
14144       /* Read in the string table, so that we have section names to scan.  */
14145       strs = filedata->section_headers + filedata->file_header.e_shstrndx;
14146
14147       if (strs != NULL && strs->sh_size != 0)
14148         {
14149           filedata->string_table
14150             = (char *) get_data (NULL, filedata, strs->sh_offset,
14151                                  1, strs->sh_size, _("string table"));
14152
14153           filedata->string_table_length
14154             = filedata->string_table != NULL ? strs->sh_size : 0;
14155         }
14156     }
14157
14158   /* Locate the debug section.  */
14159   sec = find_section_in_set (filedata, section->uncompressed_name, section_subset);
14160   if (sec != NULL)
14161     section->name = section->uncompressed_name;
14162   else
14163     {
14164       sec = find_section_in_set (filedata, section->compressed_name, section_subset);
14165       if (sec != NULL)
14166         section->name = section->compressed_name;
14167     }
14168   if (sec == NULL)
14169     return FALSE;
14170
14171   /* If we're loading from a subset of sections, and we've loaded
14172      a section matching this name before, it's likely that it's a
14173      different one.  */
14174   if (section_subset != NULL)
14175     free_debug_section (debug);
14176
14177   return load_specific_debug_section (debug, sec, data);
14178 }
14179
14180 void
14181 free_debug_section (enum dwarf_section_display_enum debug)
14182 {
14183   struct dwarf_section * section = &debug_displays [debug].section;
14184
14185   if (section->start == NULL)
14186     return;
14187
14188   free ((char *) section->start);
14189   section->start = NULL;
14190   section->address = 0;
14191   section->size = 0;
14192 }
14193
14194 static bfd_boolean
14195 display_debug_section (int shndx, Elf_Internal_Shdr * section, Filedata * filedata)
14196 {
14197   char * name = SECTION_NAME (section);
14198   const char * print_name = printable_section_name (filedata, section);
14199   bfd_size_type length;
14200   bfd_boolean result = TRUE;
14201   int i;
14202
14203   length = section->sh_size;
14204   if (length == 0)
14205     {
14206       printf (_("\nSection '%s' has no debugging data.\n"), print_name);
14207       return TRUE;
14208     }
14209   if (section->sh_type == SHT_NOBITS)
14210     {
14211       /* There is no point in dumping the contents of a debugging section
14212          which has the NOBITS type - the bits in the file will be random.
14213          This can happen when a file containing a .eh_frame section is
14214          stripped with the --only-keep-debug command line option.  */
14215       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
14216               print_name);
14217       return FALSE;
14218     }
14219
14220   if (const_strneq (name, ".gnu.linkonce.wi."))
14221     name = ".debug_info";
14222
14223   /* See if we know how to display the contents of this section.  */
14224   for (i = 0; i < max; i++)
14225     {
14226       enum dwarf_section_display_enum  id = (enum dwarf_section_display_enum) i;
14227       struct dwarf_section_display *   display = debug_displays + i;
14228       struct dwarf_section *           sec = & display->section;
14229
14230       if (streq (sec->uncompressed_name, name)
14231           || (id == line && const_strneq (name, ".debug_line."))
14232           || streq (sec->compressed_name, name))
14233         {
14234           bfd_boolean secondary = (section != find_section (filedata, name));
14235
14236           if (secondary)
14237             free_debug_section (id);
14238
14239           if (i == line && const_strneq (name, ".debug_line."))
14240             sec->name = name;
14241           else if (streq (sec->uncompressed_name, name))
14242             sec->name = sec->uncompressed_name;
14243           else
14244             sec->name = sec->compressed_name;
14245
14246           if (load_specific_debug_section (id, section, filedata))
14247             {
14248               /* If this debug section is part of a CU/TU set in a .dwp file,
14249                  restrict load_debug_section to the sections in that set.  */
14250               section_subset = find_cu_tu_set (filedata, shndx);
14251
14252               result &= display->display (sec, filedata);
14253
14254               section_subset = NULL;
14255
14256               if (secondary || (id != info && id != abbrev))
14257                 free_debug_section (id);
14258             }
14259           break;
14260         }
14261     }
14262
14263   if (i == max)
14264     {
14265       printf (_("Unrecognized debug section: %s\n"), print_name);
14266       result = FALSE;
14267     }
14268
14269   return result;
14270 }
14271
14272 /* Set DUMP_SECTS for all sections where dumps were requested
14273    based on section name.  */
14274
14275 static void
14276 initialise_dumps_byname (Filedata * filedata)
14277 {
14278   struct dump_list_entry * cur;
14279
14280   for (cur = dump_sects_byname; cur; cur = cur->next)
14281     {
14282       unsigned int i;
14283       bfd_boolean any = FALSE;
14284
14285       for (i = 0; i < filedata->file_header.e_shnum; i++)
14286         if (streq (SECTION_NAME (filedata->section_headers + i), cur->name))
14287           {
14288             request_dump_bynumber (filedata, i, cur->type);
14289             any = TRUE;
14290           }
14291
14292       if (!any)
14293         warn (_("Section '%s' was not dumped because it does not exist!\n"),
14294               cur->name);
14295     }
14296 }
14297
14298 static bfd_boolean
14299 process_section_contents (Filedata * filedata)
14300 {
14301   Elf_Internal_Shdr * section;
14302   unsigned int i;
14303   bfd_boolean res = TRUE;
14304
14305   if (! do_dump)
14306     return TRUE;
14307
14308   initialise_dumps_byname (filedata);
14309
14310   for (i = 0, section = filedata->section_headers;
14311        i < filedata->file_header.e_shnum && i < filedata->num_dump_sects;
14312        i++, section++)
14313     {
14314       dump_type dump = filedata->dump_sects[i];
14315
14316 #ifdef SUPPORT_DISASSEMBLY
14317       if (dump & DISASS_DUMP)
14318         {
14319           if (! disassemble_section (section, filedata))
14320             res = FALSE;
14321         }
14322 #endif
14323       if (dump & HEX_DUMP)
14324         {
14325           if (! dump_section_as_bytes (section, filedata, FALSE))
14326             res = FALSE;
14327         }
14328
14329       if (dump & RELOC_DUMP)
14330         {
14331           if (! dump_section_as_bytes (section, filedata, TRUE))
14332             res = FALSE;
14333         }
14334
14335       if (dump & STRING_DUMP)
14336         {
14337           if (! dump_section_as_strings (section, filedata))
14338             res = FALSE;
14339         }
14340
14341       if (dump & DEBUG_DUMP)
14342         {
14343           if (! display_debug_section (i, section, filedata))
14344             res = FALSE;
14345         }
14346
14347       if (dump & CTF_DUMP)
14348         {
14349           if (! dump_section_as_ctf (section, filedata))
14350             res = FALSE;
14351         }
14352     }
14353
14354   /* Check to see if the user requested a
14355      dump of a section that does not exist.  */
14356   while (i < filedata->num_dump_sects)
14357     {
14358       if (filedata->dump_sects[i])
14359         {
14360           warn (_("Section %d was not dumped because it does not exist!\n"), i);
14361           res = FALSE;
14362         }
14363       i++;
14364     }
14365
14366   return res;
14367 }
14368
14369 static void
14370 process_mips_fpe_exception (int mask)
14371 {
14372   if (mask)
14373     {
14374       bfd_boolean first = TRUE;
14375
14376       if (mask & OEX_FPU_INEX)
14377         fputs ("INEX", stdout), first = FALSE;
14378       if (mask & OEX_FPU_UFLO)
14379         printf ("%sUFLO", first ? "" : "|"), first = FALSE;
14380       if (mask & OEX_FPU_OFLO)
14381         printf ("%sOFLO", first ? "" : "|"), first = FALSE;
14382       if (mask & OEX_FPU_DIV0)
14383         printf ("%sDIV0", first ? "" : "|"), first = FALSE;
14384       if (mask & OEX_FPU_INVAL)
14385         printf ("%sINVAL", first ? "" : "|");
14386     }
14387   else
14388     fputs ("0", stdout);
14389 }
14390
14391 /* Display's the value of TAG at location P.  If TAG is
14392    greater than 0 it is assumed to be an unknown tag, and
14393    a message is printed to this effect.  Otherwise it is
14394    assumed that a message has already been printed.
14395
14396    If the bottom bit of TAG is set it assumed to have a
14397    string value, otherwise it is assumed to have an integer
14398    value.
14399
14400    Returns an updated P pointing to the first unread byte
14401    beyond the end of TAG's value.
14402
14403    Reads at or beyond END will not be made.  */
14404
14405 static unsigned char *
14406 display_tag_value (signed int tag,
14407                    unsigned char * p,
14408                    const unsigned char * const end)
14409 {
14410   unsigned long val;
14411
14412   if (tag > 0)
14413     printf ("  Tag_unknown_%d: ", tag);
14414
14415   if (p >= end)
14416     {
14417       warn (_("<corrupt tag>\n"));
14418     }
14419   else if (tag & 1)
14420     {
14421       /* PR 17531 file: 027-19978-0.004.  */
14422       size_t maxlen = (end - p) - 1;
14423
14424       putchar ('"');
14425       if (maxlen > 0)
14426         {
14427           print_symbol ((int) maxlen, (const char *) p);
14428           p += strnlen ((char *) p, maxlen) + 1;
14429         }
14430       else
14431         {
14432           printf (_("<corrupt string tag>"));
14433           p = (unsigned char *) end;
14434         }
14435       printf ("\"\n");
14436     }
14437   else
14438     {
14439       unsigned int len;
14440
14441       val = read_uleb128 (p, &len, end);
14442       p += len;
14443       printf ("%ld (0x%lx)\n", val, val);
14444     }
14445
14446   assert (p <= end);
14447   return p;
14448 }
14449
14450 /* ARC ABI attributes section.  */
14451
14452 static unsigned char *
14453 display_arc_attribute (unsigned char * p,
14454                        const unsigned char * const end)
14455 {
14456   unsigned int tag;
14457   unsigned int len;
14458   unsigned int val;
14459
14460   tag = read_uleb128 (p, &len, end);
14461   p += len;
14462
14463   switch (tag)
14464     {
14465     case Tag_ARC_PCS_config:
14466       val = read_uleb128 (p, &len, end);
14467       p += len;
14468       printf ("  Tag_ARC_PCS_config: ");
14469       switch (val)
14470         {
14471         case 0:
14472           printf (_("Absent/Non standard\n"));
14473           break;
14474         case 1:
14475           printf (_("Bare metal/mwdt\n"));
14476           break;
14477         case 2:
14478           printf (_("Bare metal/newlib\n"));
14479           break;
14480         case 3:
14481           printf (_("Linux/uclibc\n"));
14482           break;
14483         case 4:
14484           printf (_("Linux/glibc\n"));
14485           break;
14486         default:
14487           printf (_("Unknown\n"));
14488           break;
14489         }
14490       break;
14491
14492     case Tag_ARC_CPU_base:
14493       val = read_uleb128 (p, &len, end);
14494       p += len;
14495       printf ("  Tag_ARC_CPU_base: ");
14496       switch (val)
14497         {
14498         default:
14499         case TAG_CPU_NONE:
14500           printf (_("Absent\n"));
14501           break;
14502         case TAG_CPU_ARC6xx:
14503           printf ("ARC6xx\n");
14504           break;
14505         case TAG_CPU_ARC7xx:
14506           printf ("ARC7xx\n");
14507           break;
14508         case TAG_CPU_ARCEM:
14509           printf ("ARCEM\n");
14510           break;
14511         case TAG_CPU_ARCHS:
14512           printf ("ARCHS\n");
14513           break;
14514         }
14515       break;
14516
14517     case Tag_ARC_CPU_variation:
14518       val = read_uleb128 (p, &len, end);
14519       p += len;
14520       printf ("  Tag_ARC_CPU_variation: ");
14521       switch (val)
14522         {
14523         default:
14524           if (val > 0 && val < 16)
14525               printf ("Core%d\n", val);
14526           else
14527               printf ("Unknown\n");
14528           break;
14529
14530         case 0:
14531           printf (_("Absent\n"));
14532           break;
14533         }
14534       break;
14535
14536     case Tag_ARC_CPU_name:
14537       printf ("  Tag_ARC_CPU_name: ");
14538       p = display_tag_value (-1, p, end);
14539       break;
14540
14541     case Tag_ARC_ABI_rf16:
14542       val = read_uleb128 (p, &len, end);
14543       p += len;
14544       printf ("  Tag_ARC_ABI_rf16: %s\n", val ? _("yes") : _("no"));
14545       break;
14546
14547     case Tag_ARC_ABI_osver:
14548       val = read_uleb128 (p, &len, end);
14549       p += len;
14550       printf ("  Tag_ARC_ABI_osver: v%d\n", val);
14551       break;
14552
14553     case Tag_ARC_ABI_pic:
14554     case Tag_ARC_ABI_sda:
14555       val = read_uleb128 (p, &len, end);
14556       p += len;
14557       printf (tag == Tag_ARC_ABI_sda ? "  Tag_ARC_ABI_sda: "
14558               : "  Tag_ARC_ABI_pic: ");
14559       switch (val)
14560         {
14561         case 0:
14562           printf (_("Absent\n"));
14563           break;
14564         case 1:
14565           printf ("MWDT\n");
14566           break;
14567         case 2:
14568           printf ("GNU\n");
14569           break;
14570         default:
14571           printf (_("Unknown\n"));
14572           break;
14573         }
14574       break;
14575
14576     case Tag_ARC_ABI_tls:
14577       val = read_uleb128 (p, &len, end);
14578       p += len;
14579       printf ("  Tag_ARC_ABI_tls: %s\n", val ? "r25": "none");
14580       break;
14581
14582     case Tag_ARC_ABI_enumsize:
14583       val = read_uleb128 (p, &len, end);
14584       p += len;
14585       printf ("  Tag_ARC_ABI_enumsize: %s\n", val ? _("default") :
14586               _("smallest"));
14587       break;
14588
14589     case Tag_ARC_ABI_exceptions:
14590       val = read_uleb128 (p, &len, end);
14591       p += len;
14592       printf ("  Tag_ARC_ABI_exceptions: %s\n", val ? _("OPTFP")
14593               : _("default"));
14594       break;
14595
14596     case Tag_ARC_ABI_double_size:
14597       val = read_uleb128 (p, &len, end);
14598       p += len;
14599       printf ("  Tag_ARC_ABI_double_size: %d\n", val);
14600       break;
14601
14602     case Tag_ARC_ISA_config:
14603       printf ("  Tag_ARC_ISA_config: ");
14604       p = display_tag_value (-1, p, end);
14605       break;
14606
14607     case Tag_ARC_ISA_apex:
14608       printf ("  Tag_ARC_ISA_apex: ");
14609       p = display_tag_value (-1, p, end);
14610       break;
14611
14612     case Tag_ARC_ISA_mpy_option:
14613       val = read_uleb128 (p, &len, end);
14614       p += len;
14615       printf ("  Tag_ARC_ISA_mpy_option: %d\n", val);
14616       break;
14617
14618     case Tag_ARC_ATR_version:
14619       val = read_uleb128 (p, &len, end);
14620       p += len;
14621       printf ("  Tag_ARC_ATR_version: %d\n", val);
14622       break;
14623
14624     default:
14625       return display_tag_value (tag & 1, p, end);
14626     }
14627
14628   return p;
14629 }
14630
14631 /* ARM EABI attributes section.  */
14632 typedef struct
14633 {
14634   unsigned int tag;
14635   const char * name;
14636   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
14637   unsigned int type;
14638   const char ** table;
14639 } arm_attr_public_tag;
14640
14641 static const char * arm_attr_tag_CPU_arch[] =
14642   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
14643    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "v8-R", "v8-M.baseline",
14644    "v8-M.mainline", "", "", "", "v8.1-M.mainline"};
14645 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
14646 static const char * arm_attr_tag_THUMB_ISA_use[] =
14647   {"No", "Thumb-1", "Thumb-2", "Yes"};
14648 static const char * arm_attr_tag_FP_arch[] =
14649   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
14650    "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
14651 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
14652 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
14653   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
14654    "NEON for ARMv8.1"};
14655 static const char * arm_attr_tag_PCS_config[] =
14656   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
14657    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
14658 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
14659   {"V6", "SB", "TLS", "Unused"};
14660 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
14661   {"Absolute", "PC-relative", "SB-relative", "None"};
14662 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
14663   {"Absolute", "PC-relative", "None"};
14664 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
14665   {"None", "direct", "GOT-indirect"};
14666 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
14667   {"None", "??? 1", "2", "??? 3", "4"};
14668 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
14669 static const char * arm_attr_tag_ABI_FP_denormal[] =
14670   {"Unused", "Needed", "Sign only"};
14671 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
14672 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
14673 static const char * arm_attr_tag_ABI_FP_number_model[] =
14674   {"Unused", "Finite", "RTABI", "IEEE 754"};
14675 static const char * arm_attr_tag_ABI_enum_size[] =
14676   {"Unused", "small", "int", "forced to int"};
14677 static const char * arm_attr_tag_ABI_HardFP_use[] =
14678   {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
14679 static const char * arm_attr_tag_ABI_VFP_args[] =
14680   {"AAPCS", "VFP registers", "custom", "compatible"};
14681 static const char * arm_attr_tag_ABI_WMMX_args[] =
14682   {"AAPCS", "WMMX registers", "custom"};
14683 static const char * arm_attr_tag_ABI_optimization_goals[] =
14684   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14685     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
14686 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
14687   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14688     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
14689 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
14690 static const char * arm_attr_tag_FP_HP_extension[] =
14691   {"Not Allowed", "Allowed"};
14692 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
14693   {"None", "IEEE 754", "Alternative Format"};
14694 static const char * arm_attr_tag_DSP_extension[] =
14695   {"Follow architecture", "Allowed"};
14696 static const char * arm_attr_tag_MPextension_use[] =
14697   {"Not Allowed", "Allowed"};
14698 static const char * arm_attr_tag_DIV_use[] =
14699   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
14700     "Allowed in v7-A with integer division extension"};
14701 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
14702 static const char * arm_attr_tag_Virtualization_use[] =
14703   {"Not Allowed", "TrustZone", "Virtualization Extensions",
14704     "TrustZone and Virtualization Extensions"};
14705 static const char * arm_attr_tag_MPextension_use_legacy[] =
14706   {"Not Allowed", "Allowed"};
14707
14708 static const char * arm_attr_tag_MVE_arch[] =
14709   {"No MVE", "MVE Integer only", "MVE Integer and FP"};
14710
14711 #define LOOKUP(id, name) \
14712   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
14713 static arm_attr_public_tag arm_attr_public_tags[] =
14714 {
14715   {4, "CPU_raw_name", 1, NULL},
14716   {5, "CPU_name", 1, NULL},
14717   LOOKUP(6, CPU_arch),
14718   {7, "CPU_arch_profile", 0, NULL},
14719   LOOKUP(8, ARM_ISA_use),
14720   LOOKUP(9, THUMB_ISA_use),
14721   LOOKUP(10, FP_arch),
14722   LOOKUP(11, WMMX_arch),
14723   LOOKUP(12, Advanced_SIMD_arch),
14724   LOOKUP(13, PCS_config),
14725   LOOKUP(14, ABI_PCS_R9_use),
14726   LOOKUP(15, ABI_PCS_RW_data),
14727   LOOKUP(16, ABI_PCS_RO_data),
14728   LOOKUP(17, ABI_PCS_GOT_use),
14729   LOOKUP(18, ABI_PCS_wchar_t),
14730   LOOKUP(19, ABI_FP_rounding),
14731   LOOKUP(20, ABI_FP_denormal),
14732   LOOKUP(21, ABI_FP_exceptions),
14733   LOOKUP(22, ABI_FP_user_exceptions),
14734   LOOKUP(23, ABI_FP_number_model),
14735   {24, "ABI_align_needed", 0, NULL},
14736   {25, "ABI_align_preserved", 0, NULL},
14737   LOOKUP(26, ABI_enum_size),
14738   LOOKUP(27, ABI_HardFP_use),
14739   LOOKUP(28, ABI_VFP_args),
14740   LOOKUP(29, ABI_WMMX_args),
14741   LOOKUP(30, ABI_optimization_goals),
14742   LOOKUP(31, ABI_FP_optimization_goals),
14743   {32, "compatibility", 0, NULL},
14744   LOOKUP(34, CPU_unaligned_access),
14745   LOOKUP(36, FP_HP_extension),
14746   LOOKUP(38, ABI_FP_16bit_format),
14747   LOOKUP(42, MPextension_use),
14748   LOOKUP(44, DIV_use),
14749   LOOKUP(46, DSP_extension),
14750   LOOKUP(48, MVE_arch),
14751   {64, "nodefaults", 0, NULL},
14752   {65, "also_compatible_with", 0, NULL},
14753   LOOKUP(66, T2EE_use),
14754   {67, "conformance", 1, NULL},
14755   LOOKUP(68, Virtualization_use),
14756   LOOKUP(70, MPextension_use_legacy)
14757 };
14758 #undef LOOKUP
14759
14760 static unsigned char *
14761 display_arm_attribute (unsigned char * p,
14762                        const unsigned char * const end)
14763 {
14764   unsigned int tag;
14765   unsigned int len;
14766   unsigned int val;
14767   arm_attr_public_tag * attr;
14768   unsigned i;
14769   unsigned int type;
14770
14771   tag = read_uleb128 (p, &len, end);
14772   p += len;
14773   attr = NULL;
14774   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
14775     {
14776       if (arm_attr_public_tags[i].tag == tag)
14777         {
14778           attr = &arm_attr_public_tags[i];
14779           break;
14780         }
14781     }
14782
14783   if (attr)
14784     {
14785       printf ("  Tag_%s: ", attr->name);
14786       switch (attr->type)
14787         {
14788         case 0:
14789           switch (tag)
14790             {
14791             case 7: /* Tag_CPU_arch_profile.  */
14792               val = read_uleb128 (p, &len, end);
14793               p += len;
14794               switch (val)
14795                 {
14796                 case 0: printf (_("None\n")); break;
14797                 case 'A': printf (_("Application\n")); break;
14798                 case 'R': printf (_("Realtime\n")); break;
14799                 case 'M': printf (_("Microcontroller\n")); break;
14800                 case 'S': printf (_("Application or Realtime\n")); break;
14801                 default: printf ("??? (%d)\n", val); break;
14802                 }
14803               break;
14804
14805             case 24: /* Tag_align_needed.  */
14806               val = read_uleb128 (p, &len, end);
14807               p += len;
14808               switch (val)
14809                 {
14810                 case 0: printf (_("None\n")); break;
14811                 case 1: printf (_("8-byte\n")); break;
14812                 case 2: printf (_("4-byte\n")); break;
14813                 case 3: printf ("??? 3\n"); break;
14814                 default:
14815                   if (val <= 12)
14816                     printf (_("8-byte and up to %d-byte extended\n"),
14817                             1 << val);
14818                   else
14819                     printf ("??? (%d)\n", val);
14820                   break;
14821                 }
14822               break;
14823
14824             case 25: /* Tag_align_preserved.  */
14825               val = read_uleb128 (p, &len, end);
14826               p += len;
14827               switch (val)
14828                 {
14829                 case 0: printf (_("None\n")); break;
14830                 case 1: printf (_("8-byte, except leaf SP\n")); break;
14831                 case 2: printf (_("8-byte\n")); break;
14832                 case 3: printf ("??? 3\n"); break;
14833                 default:
14834                   if (val <= 12)
14835                     printf (_("8-byte and up to %d-byte extended\n"),
14836                             1 << val);
14837                   else
14838                     printf ("??? (%d)\n", val);
14839                   break;
14840                 }
14841               break;
14842
14843             case 32: /* Tag_compatibility.  */
14844               {
14845                 val = read_uleb128 (p, &len, end);
14846                 p += len;
14847                 printf (_("flag = %d, vendor = "), val);
14848                 if (p < end - 1)
14849                   {
14850                     size_t maxlen = (end - p) - 1;
14851
14852                     print_symbol ((int) maxlen, (const char *) p);
14853                     p += strnlen ((char *) p, maxlen) + 1;
14854                   }
14855                 else
14856                   {
14857                     printf (_("<corrupt>"));
14858                     p = (unsigned char *) end;
14859                   }
14860                 putchar ('\n');
14861               }
14862               break;
14863
14864             case 64: /* Tag_nodefaults.  */
14865               /* PR 17531: file: 001-505008-0.01.  */
14866               if (p < end)
14867                 p++;
14868               printf (_("True\n"));
14869               break;
14870
14871             case 65: /* Tag_also_compatible_with.  */
14872               val = read_uleb128 (p, &len, end);
14873               p += len;
14874               if (val == 6 /* Tag_CPU_arch.  */)
14875                 {
14876                   val = read_uleb128 (p, &len, end);
14877                   p += len;
14878                   if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
14879                     printf ("??? (%d)\n", val);
14880                   else
14881                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
14882                 }
14883               else
14884                 printf ("???\n");
14885               while (p < end && *(p++) != '\0' /* NUL terminator.  */)
14886                 ;
14887               break;
14888
14889             default:
14890               printf (_("<unknown: %d>\n"), tag);
14891               break;
14892             }
14893           return p;
14894
14895         case 1:
14896           return display_tag_value (-1, p, end);
14897         case 2:
14898           return display_tag_value (0, p, end);
14899
14900         default:
14901           assert (attr->type & 0x80);
14902           val = read_uleb128 (p, &len, end);
14903           p += len;
14904           type = attr->type & 0x7f;
14905           if (val >= type)
14906             printf ("??? (%d)\n", val);
14907           else
14908             printf ("%s\n", attr->table[val]);
14909           return p;
14910         }
14911     }
14912
14913   return display_tag_value (tag, p, end);
14914 }
14915
14916 static unsigned char *
14917 display_gnu_attribute (unsigned char * p,
14918                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const),
14919                        const unsigned char * const end)
14920 {
14921   int tag;
14922   unsigned int len;
14923   unsigned int val;
14924
14925   tag = read_uleb128 (p, &len, end);
14926   p += len;
14927
14928   /* Tag_compatibility is the only generic GNU attribute defined at
14929      present.  */
14930   if (tag == 32)
14931     {
14932       val = read_uleb128 (p, &len, end);
14933       p += len;
14934
14935       printf (_("flag = %d, vendor = "), val);
14936       if (p == end)
14937         {
14938           printf (_("<corrupt>\n"));
14939           warn (_("corrupt vendor attribute\n"));
14940         }
14941       else
14942         {
14943           if (p < end - 1)
14944             {
14945               size_t maxlen = (end - p) - 1;
14946
14947               print_symbol ((int) maxlen, (const char *) p);
14948               p += strnlen ((char *) p, maxlen) + 1;
14949             }
14950           else
14951             {
14952               printf (_("<corrupt>"));
14953               p = (unsigned char *) end;
14954             }
14955           putchar ('\n');
14956         }
14957       return p;
14958     }
14959
14960   if ((tag & 2) == 0 && display_proc_gnu_attribute)
14961     return display_proc_gnu_attribute (p, tag, end);
14962
14963   return display_tag_value (tag, p, end);
14964 }
14965
14966 static unsigned char *
14967 display_power_gnu_attribute (unsigned char * p,
14968                              unsigned int tag,
14969                              const unsigned char * const end)
14970 {
14971   unsigned int len;
14972   unsigned int val;
14973
14974   if (tag == Tag_GNU_Power_ABI_FP)
14975     {
14976       val = read_uleb128 (p, &len, end);
14977       p += len;
14978       printf ("  Tag_GNU_Power_ABI_FP: ");
14979       if (len == 0)
14980         {
14981           printf (_("<corrupt>\n"));
14982           return p;
14983         }
14984
14985       if (val > 15)
14986         printf ("(%#x), ", val);
14987
14988       switch (val & 3)
14989         {
14990         case 0:
14991           printf (_("unspecified hard/soft float, "));
14992           break;
14993         case 1:
14994           printf (_("hard float, "));
14995           break;
14996         case 2:
14997           printf (_("soft float, "));
14998           break;
14999         case 3:
15000           printf (_("single-precision hard float, "));
15001           break;
15002         }
15003
15004       switch (val & 0xC)
15005         {
15006         case 0:
15007           printf (_("unspecified long double\n"));
15008           break;
15009         case 4:
15010           printf (_("128-bit IBM long double\n"));
15011           break;
15012         case 8:
15013           printf (_("64-bit long double\n"));
15014           break;
15015         case 12:
15016           printf (_("128-bit IEEE long double\n"));
15017           break;
15018         }
15019       return p;
15020     }
15021
15022   if (tag == Tag_GNU_Power_ABI_Vector)
15023     {
15024       val = read_uleb128 (p, &len, end);
15025       p += len;
15026       printf ("  Tag_GNU_Power_ABI_Vector: ");
15027       if (len == 0)
15028         {
15029           printf (_("<corrupt>\n"));
15030           return p;
15031         }
15032
15033       if (val > 3)
15034         printf ("(%#x), ", val);
15035
15036       switch (val & 3)
15037         {
15038         case 0:
15039           printf (_("unspecified\n"));
15040           break;
15041         case 1:
15042           printf (_("generic\n"));
15043           break;
15044         case 2:
15045           printf ("AltiVec\n");
15046           break;
15047         case 3:
15048           printf ("SPE\n");
15049           break;
15050         }
15051       return p;
15052     }
15053
15054   if (tag == Tag_GNU_Power_ABI_Struct_Return)
15055     {
15056       val = read_uleb128 (p, &len, end);
15057       p += len;
15058       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
15059       if (len == 0)
15060         {
15061           printf (_("<corrupt>\n"));
15062           return p;
15063         }
15064
15065       if (val > 2)
15066         printf ("(%#x), ", val);
15067
15068       switch (val & 3)
15069         {
15070         case 0:
15071           printf (_("unspecified\n"));
15072           break;
15073         case 1:
15074           printf ("r3/r4\n");
15075           break;
15076         case 2:
15077           printf (_("memory\n"));
15078           break;
15079         case 3:
15080           printf ("???\n");
15081           break;
15082         }
15083       return p;
15084     }
15085
15086   return display_tag_value (tag & 1, p, end);
15087 }
15088
15089 static unsigned char *
15090 display_s390_gnu_attribute (unsigned char * p,
15091                             unsigned int tag,
15092                             const unsigned char * const end)
15093 {
15094   unsigned int len;
15095   int val;
15096
15097   if (tag == Tag_GNU_S390_ABI_Vector)
15098     {
15099       val = read_uleb128 (p, &len, end);
15100       p += len;
15101       printf ("  Tag_GNU_S390_ABI_Vector: ");
15102
15103       switch (val)
15104         {
15105         case 0:
15106           printf (_("any\n"));
15107           break;
15108         case 1:
15109           printf (_("software\n"));
15110           break;
15111         case 2:
15112           printf (_("hardware\n"));
15113           break;
15114         default:
15115           printf ("??? (%d)\n", val);
15116           break;
15117         }
15118       return p;
15119    }
15120
15121   return display_tag_value (tag & 1, p, end);
15122 }
15123
15124 static void
15125 display_sparc_hwcaps (unsigned int mask)
15126 {
15127   if (mask)
15128     {
15129       bfd_boolean first = TRUE;
15130
15131       if (mask & ELF_SPARC_HWCAP_MUL32)
15132         fputs ("mul32", stdout), first = FALSE;
15133       if (mask & ELF_SPARC_HWCAP_DIV32)
15134         printf ("%sdiv32", first ? "" : "|"), first = FALSE;
15135       if (mask & ELF_SPARC_HWCAP_FSMULD)
15136         printf ("%sfsmuld", first ? "" : "|"), first = FALSE;
15137       if (mask & ELF_SPARC_HWCAP_V8PLUS)
15138         printf ("%sv8plus", first ? "" : "|"), first = FALSE;
15139       if (mask & ELF_SPARC_HWCAP_POPC)
15140         printf ("%spopc", first ? "" : "|"), first = FALSE;
15141       if (mask & ELF_SPARC_HWCAP_VIS)
15142         printf ("%svis", first ? "" : "|"), first = FALSE;
15143       if (mask & ELF_SPARC_HWCAP_VIS2)
15144         printf ("%svis2", first ? "" : "|"), first = FALSE;
15145       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
15146         printf ("%sASIBlkInit", first ? "" : "|"), first = FALSE;
15147       if (mask & ELF_SPARC_HWCAP_FMAF)
15148         printf ("%sfmaf", first ? "" : "|"), first = FALSE;
15149       if (mask & ELF_SPARC_HWCAP_VIS3)
15150         printf ("%svis3", first ? "" : "|"), first = FALSE;
15151       if (mask & ELF_SPARC_HWCAP_HPC)
15152         printf ("%shpc", first ? "" : "|"), first = FALSE;
15153       if (mask & ELF_SPARC_HWCAP_RANDOM)
15154         printf ("%srandom", first ? "" : "|"), first = FALSE;
15155       if (mask & ELF_SPARC_HWCAP_TRANS)
15156         printf ("%strans", first ? "" : "|"), first = FALSE;
15157       if (mask & ELF_SPARC_HWCAP_FJFMAU)
15158         printf ("%sfjfmau", first ? "" : "|"), first = FALSE;
15159       if (mask & ELF_SPARC_HWCAP_IMA)
15160         printf ("%sima", first ? "" : "|"), first = FALSE;
15161       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
15162         printf ("%scspare", first ? "" : "|"), first = FALSE;
15163     }
15164   else
15165     fputc ('0', stdout);
15166   fputc ('\n', stdout);
15167 }
15168
15169 static void
15170 display_sparc_hwcaps2 (unsigned int mask)
15171 {
15172   if (mask)
15173     {
15174       bfd_boolean first = TRUE;
15175
15176       if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
15177         fputs ("fjathplus", stdout), first = FALSE;
15178       if (mask & ELF_SPARC_HWCAP2_VIS3B)
15179         printf ("%svis3b", first ? "" : "|"), first = FALSE;
15180       if (mask & ELF_SPARC_HWCAP2_ADP)
15181         printf ("%sadp", first ? "" : "|"), first = FALSE;
15182       if (mask & ELF_SPARC_HWCAP2_SPARC5)
15183         printf ("%ssparc5", first ? "" : "|"), first = FALSE;
15184       if (mask & ELF_SPARC_HWCAP2_MWAIT)
15185         printf ("%smwait", first ? "" : "|"), first = FALSE;
15186       if (mask & ELF_SPARC_HWCAP2_XMPMUL)
15187         printf ("%sxmpmul", first ? "" : "|"), first = FALSE;
15188       if (mask & ELF_SPARC_HWCAP2_XMONT)
15189         printf ("%sxmont2", first ? "" : "|"), first = FALSE;
15190       if (mask & ELF_SPARC_HWCAP2_NSEC)
15191         printf ("%snsec", first ? "" : "|"), first = FALSE;
15192       if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
15193         printf ("%sfjathhpc", first ? "" : "|"), first = FALSE;
15194       if (mask & ELF_SPARC_HWCAP2_FJDES)
15195         printf ("%sfjdes", first ? "" : "|"), first = FALSE;
15196       if (mask & ELF_SPARC_HWCAP2_FJAES)
15197         printf ("%sfjaes", first ? "" : "|"), first = FALSE;
15198     }
15199   else
15200     fputc ('0', stdout);
15201   fputc ('\n', stdout);
15202 }
15203
15204 static unsigned char *
15205 display_sparc_gnu_attribute (unsigned char * p,
15206                              unsigned int tag,
15207                              const unsigned char * const end)
15208 {
15209   unsigned int len;
15210   int val;
15211
15212   if (tag == Tag_GNU_Sparc_HWCAPS)
15213     {
15214       val = read_uleb128 (p, &len, end);
15215       p += len;
15216       printf ("  Tag_GNU_Sparc_HWCAPS: ");
15217       display_sparc_hwcaps (val);
15218       return p;
15219     }
15220   if (tag == Tag_GNU_Sparc_HWCAPS2)
15221     {
15222       val = read_uleb128 (p, &len, end);
15223       p += len;
15224       printf ("  Tag_GNU_Sparc_HWCAPS2: ");
15225       display_sparc_hwcaps2 (val);
15226       return p;
15227     }
15228
15229   return display_tag_value (tag, p, end);
15230 }
15231
15232 static void
15233 print_mips_fp_abi_value (unsigned int val)
15234 {
15235   switch (val)
15236     {
15237     case Val_GNU_MIPS_ABI_FP_ANY:
15238       printf (_("Hard or soft float\n"));
15239       break;
15240     case Val_GNU_MIPS_ABI_FP_DOUBLE:
15241       printf (_("Hard float (double precision)\n"));
15242       break;
15243     case Val_GNU_MIPS_ABI_FP_SINGLE:
15244       printf (_("Hard float (single precision)\n"));
15245       break;
15246     case Val_GNU_MIPS_ABI_FP_SOFT:
15247       printf (_("Soft float\n"));
15248       break;
15249     case Val_GNU_MIPS_ABI_FP_OLD_64:
15250       printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
15251       break;
15252     case Val_GNU_MIPS_ABI_FP_XX:
15253       printf (_("Hard float (32-bit CPU, Any FPU)\n"));
15254       break;
15255     case Val_GNU_MIPS_ABI_FP_64:
15256       printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
15257       break;
15258     case Val_GNU_MIPS_ABI_FP_64A:
15259       printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
15260       break;
15261     case Val_GNU_MIPS_ABI_FP_NAN2008:
15262       printf (_("NaN 2008 compatibility\n"));
15263       break;
15264     default:
15265       printf ("??? (%d)\n", val);
15266       break;
15267     }
15268 }
15269
15270 static unsigned char *
15271 display_mips_gnu_attribute (unsigned char * p,
15272                             unsigned int tag,
15273                             const unsigned char * const end)
15274 {
15275   if (tag == Tag_GNU_MIPS_ABI_FP)
15276     {
15277       unsigned int len;
15278       unsigned int val;
15279
15280       val = read_uleb128 (p, &len, end);
15281       p += len;
15282       printf ("  Tag_GNU_MIPS_ABI_FP: ");
15283
15284       print_mips_fp_abi_value (val);
15285
15286       return p;
15287    }
15288
15289   if (tag == Tag_GNU_MIPS_ABI_MSA)
15290     {
15291       unsigned int len;
15292       unsigned int val;
15293
15294       val = read_uleb128 (p, &len, end);
15295       p += len;
15296       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
15297
15298       switch (val)
15299         {
15300         case Val_GNU_MIPS_ABI_MSA_ANY:
15301           printf (_("Any MSA or not\n"));
15302           break;
15303         case Val_GNU_MIPS_ABI_MSA_128:
15304           printf (_("128-bit MSA\n"));
15305           break;
15306         default:
15307           printf ("??? (%d)\n", val);
15308           break;
15309         }
15310       return p;
15311     }
15312
15313   return display_tag_value (tag & 1, p, end);
15314 }
15315
15316 static unsigned char *
15317 display_tic6x_attribute (unsigned char * p,
15318                          const unsigned char * const end)
15319 {
15320   unsigned int tag;
15321   unsigned int len;
15322   int val;
15323
15324   tag = read_uleb128 (p, &len, end);
15325   p += len;
15326
15327   switch (tag)
15328     {
15329     case Tag_ISA:
15330       val = read_uleb128 (p, &len, end);
15331       p += len;
15332       printf ("  Tag_ISA: ");
15333
15334       switch (val)
15335         {
15336         case C6XABI_Tag_ISA_none:
15337           printf (_("None\n"));
15338           break;
15339         case C6XABI_Tag_ISA_C62X:
15340           printf ("C62x\n");
15341           break;
15342         case C6XABI_Tag_ISA_C67X:
15343           printf ("C67x\n");
15344           break;
15345         case C6XABI_Tag_ISA_C67XP:
15346           printf ("C67x+\n");
15347           break;
15348         case C6XABI_Tag_ISA_C64X:
15349           printf ("C64x\n");
15350           break;
15351         case C6XABI_Tag_ISA_C64XP:
15352           printf ("C64x+\n");
15353           break;
15354         case C6XABI_Tag_ISA_C674X:
15355           printf ("C674x\n");
15356           break;
15357         default:
15358           printf ("??? (%d)\n", val);
15359           break;
15360         }
15361       return p;
15362
15363     case Tag_ABI_wchar_t:
15364       val = read_uleb128 (p, &len, end);
15365       p += len;
15366       printf ("  Tag_ABI_wchar_t: ");
15367       switch (val)
15368         {
15369         case 0:
15370           printf (_("Not used\n"));
15371           break;
15372         case 1:
15373           printf (_("2 bytes\n"));
15374           break;
15375         case 2:
15376           printf (_("4 bytes\n"));
15377           break;
15378         default:
15379           printf ("??? (%d)\n", val);
15380           break;
15381         }
15382       return p;
15383
15384     case Tag_ABI_stack_align_needed:
15385       val = read_uleb128 (p, &len, end);
15386       p += len;
15387       printf ("  Tag_ABI_stack_align_needed: ");
15388       switch (val)
15389         {
15390         case 0:
15391           printf (_("8-byte\n"));
15392           break;
15393         case 1:
15394           printf (_("16-byte\n"));
15395           break;
15396         default:
15397           printf ("??? (%d)\n", val);
15398           break;
15399         }
15400       return p;
15401
15402     case Tag_ABI_stack_align_preserved:
15403       val = read_uleb128 (p, &len, end);
15404       p += len;
15405       printf ("  Tag_ABI_stack_align_preserved: ");
15406       switch (val)
15407         {
15408         case 0:
15409           printf (_("8-byte\n"));
15410           break;
15411         case 1:
15412           printf (_("16-byte\n"));
15413           break;
15414         default:
15415           printf ("??? (%d)\n", val);
15416           break;
15417         }
15418       return p;
15419
15420     case Tag_ABI_DSBT:
15421       val = read_uleb128 (p, &len, end);
15422       p += len;
15423       printf ("  Tag_ABI_DSBT: ");
15424       switch (val)
15425         {
15426         case 0:
15427           printf (_("DSBT addressing not used\n"));
15428           break;
15429         case 1:
15430           printf (_("DSBT addressing used\n"));
15431           break;
15432         default:
15433           printf ("??? (%d)\n", val);
15434           break;
15435         }
15436       return p;
15437
15438     case Tag_ABI_PID:
15439       val = read_uleb128 (p, &len, end);
15440       p += len;
15441       printf ("  Tag_ABI_PID: ");
15442       switch (val)
15443         {
15444         case 0:
15445           printf (_("Data addressing position-dependent\n"));
15446           break;
15447         case 1:
15448           printf (_("Data addressing position-independent, GOT near DP\n"));
15449           break;
15450         case 2:
15451           printf (_("Data addressing position-independent, GOT far from DP\n"));
15452           break;
15453         default:
15454           printf ("??? (%d)\n", val);
15455           break;
15456         }
15457       return p;
15458
15459     case Tag_ABI_PIC:
15460       val = read_uleb128 (p, &len, end);
15461       p += len;
15462       printf ("  Tag_ABI_PIC: ");
15463       switch (val)
15464         {
15465         case 0:
15466           printf (_("Code addressing position-dependent\n"));
15467           break;
15468         case 1:
15469           printf (_("Code addressing position-independent\n"));
15470           break;
15471         default:
15472           printf ("??? (%d)\n", val);
15473           break;
15474         }
15475       return p;
15476
15477     case Tag_ABI_array_object_alignment:
15478       val = read_uleb128 (p, &len, end);
15479       p += len;
15480       printf ("  Tag_ABI_array_object_alignment: ");
15481       switch (val)
15482         {
15483         case 0:
15484           printf (_("8-byte\n"));
15485           break;
15486         case 1:
15487           printf (_("4-byte\n"));
15488           break;
15489         case 2:
15490           printf (_("16-byte\n"));
15491           break;
15492         default:
15493           printf ("??? (%d)\n", val);
15494           break;
15495         }
15496       return p;
15497
15498     case Tag_ABI_array_object_align_expected:
15499       val = read_uleb128 (p, &len, end);
15500       p += len;
15501       printf ("  Tag_ABI_array_object_align_expected: ");
15502       switch (val)
15503         {
15504         case 0:
15505           printf (_("8-byte\n"));
15506           break;
15507         case 1:
15508           printf (_("4-byte\n"));
15509           break;
15510         case 2:
15511           printf (_("16-byte\n"));
15512           break;
15513         default:
15514           printf ("??? (%d)\n", val);
15515           break;
15516         }
15517       return p;
15518
15519     case Tag_ABI_compatibility:
15520       {
15521         val = read_uleb128 (p, &len, end);
15522         p += len;
15523         printf ("  Tag_ABI_compatibility: ");
15524         printf (_("flag = %d, vendor = "), val);
15525         if (p < end - 1)
15526           {
15527             size_t maxlen = (end - p) - 1;
15528
15529             print_symbol ((int) maxlen, (const char *) p);
15530             p += strnlen ((char *) p, maxlen) + 1;
15531           }
15532         else
15533           {
15534             printf (_("<corrupt>"));
15535             p = (unsigned char *) end;
15536           }
15537         putchar ('\n');
15538         return p;
15539       }
15540
15541     case Tag_ABI_conformance:
15542       {
15543         printf ("  Tag_ABI_conformance: \"");
15544         if (p < end - 1)
15545           {
15546             size_t maxlen = (end - p) - 1;
15547
15548             print_symbol ((int) maxlen, (const char *) p);
15549             p += strnlen ((char *) p, maxlen) + 1;
15550           }
15551         else
15552           {
15553             printf (_("<corrupt>"));
15554             p = (unsigned char *) end;
15555           }
15556         printf ("\"\n");
15557         return p;
15558       }
15559     }
15560
15561   return display_tag_value (tag, p, end);
15562 }
15563
15564 static void
15565 display_raw_attribute (unsigned char * p, unsigned char const * const end)
15566 {
15567   unsigned long addr = 0;
15568   size_t bytes = end - p;
15569
15570   assert (end >= p);
15571   while (bytes)
15572     {
15573       int j;
15574       int k;
15575       int lbytes = (bytes > 16 ? 16 : bytes);
15576
15577       printf ("  0x%8.8lx ", addr);
15578
15579       for (j = 0; j < 16; j++)
15580         {
15581           if (j < lbytes)
15582             printf ("%2.2x", p[j]);
15583           else
15584             printf ("  ");
15585
15586           if ((j & 3) == 3)
15587             printf (" ");
15588         }
15589
15590       for (j = 0; j < lbytes; j++)
15591         {
15592           k = p[j];
15593           if (k >= ' ' && k < 0x7f)
15594             printf ("%c", k);
15595           else
15596             printf (".");
15597         }
15598
15599       putchar ('\n');
15600
15601       p  += lbytes;
15602       bytes -= lbytes;
15603       addr += lbytes;
15604     }
15605
15606   putchar ('\n');
15607 }
15608
15609 static unsigned char *
15610 display_msp430x_attribute (unsigned char * p,
15611                            const unsigned char * const end)
15612 {
15613   unsigned int len;
15614   unsigned int val;
15615   unsigned int tag;
15616
15617   tag = read_uleb128 (p, & len, end);
15618   p += len;
15619
15620   switch (tag)
15621     {
15622     case OFBA_MSPABI_Tag_ISA:
15623       val = read_uleb128 (p, &len, end);
15624       p += len;
15625       printf ("  Tag_ISA: ");
15626       switch (val)
15627         {
15628         case 0: printf (_("None\n")); break;
15629         case 1: printf (_("MSP430\n")); break;
15630         case 2: printf (_("MSP430X\n")); break;
15631         default: printf ("??? (%d)\n", val); break;
15632         }
15633       break;
15634
15635     case OFBA_MSPABI_Tag_Code_Model:
15636       val = read_uleb128 (p, &len, end);
15637       p += len;
15638       printf ("  Tag_Code_Model: ");
15639       switch (val)
15640         {
15641         case 0: printf (_("None\n")); break;
15642         case 1: printf (_("Small\n")); break;
15643         case 2: printf (_("Large\n")); break;
15644         default: printf ("??? (%d)\n", val); break;
15645         }
15646       break;
15647
15648     case OFBA_MSPABI_Tag_Data_Model:
15649       val = read_uleb128 (p, &len, end);
15650       p += len;
15651       printf ("  Tag_Data_Model: ");
15652       switch (val)
15653         {
15654         case 0: printf (_("None\n")); break;
15655         case 1: printf (_("Small\n")); break;
15656         case 2: printf (_("Large\n")); break;
15657         case 3: printf (_("Restricted Large\n")); break;
15658         default: printf ("??? (%d)\n", val); break;
15659         }
15660       break;
15661
15662     default:
15663       printf (_("  <unknown tag %d>: "), tag);
15664
15665       if (tag & 1)
15666         {
15667           putchar ('"');
15668           if (p < end - 1)
15669             {
15670               size_t maxlen = (end - p) - 1;
15671
15672               print_symbol ((int) maxlen, (const char *) p);
15673               p += strnlen ((char *) p, maxlen) + 1;
15674             }
15675           else
15676             {
15677               printf (_("<corrupt>"));
15678               p = (unsigned char *) end;
15679             }
15680           printf ("\"\n");
15681         }
15682       else
15683         {
15684           val = read_uleb128 (p, &len, end);
15685           p += len;
15686           printf ("%d (0x%x)\n", val, val);
15687         }
15688       break;
15689    }
15690
15691   assert (p <= end);
15692   return p;
15693 }
15694
15695 struct riscv_attr_tag_t {
15696   const char *name;
15697   int tag;
15698 };
15699
15700 static struct riscv_attr_tag_t riscv_attr_tag[] =
15701 {
15702 #define T(tag) {"Tag_RISCV_" #tag, Tag_RISCV_##tag}
15703   T(arch),
15704   T(priv_spec),
15705   T(priv_spec_minor),
15706   T(priv_spec_revision),
15707   T(unaligned_access),
15708   T(stack_align),
15709 #undef T
15710 };
15711
15712 static unsigned char *
15713 display_riscv_attribute (unsigned char *p,
15714                          const unsigned char * const end)
15715 {
15716   unsigned int len;
15717   int val;
15718   int tag;
15719   struct riscv_attr_tag_t *attr = NULL;
15720   unsigned i;
15721
15722   tag = read_uleb128 (p, &len, end);
15723   p += len;
15724
15725   /* Find the name of attribute. */
15726   for (i = 0; i < ARRAY_SIZE (riscv_attr_tag); i++)
15727     {
15728       if (riscv_attr_tag[i].tag == tag)
15729         {
15730           attr = &riscv_attr_tag[i];
15731           break;
15732         }
15733     }
15734
15735   if (attr)
15736     printf ("  %s: ", attr->name);
15737   else
15738     return display_tag_value (tag, p, end);
15739
15740   switch (tag)
15741     {
15742     case Tag_RISCV_priv_spec:
15743     case Tag_RISCV_priv_spec_minor:
15744     case Tag_RISCV_priv_spec_revision:
15745       val = read_uleb128 (p, &len, end);
15746       p += len;
15747       printf (_("%d\n"), val);
15748       break;
15749     case Tag_RISCV_unaligned_access:
15750       val = read_uleb128 (p, &len, end);
15751       p += len;
15752       switch (val)
15753         {
15754         case 0:
15755           printf (_("No unaligned access\n"));
15756           break;
15757         case 1:
15758           printf (_("Unaligned access\n"));
15759           break;
15760         }
15761       break;
15762     case Tag_RISCV_stack_align:
15763       val = read_uleb128 (p, &len, end);
15764       p += len;
15765       printf (_("%d-bytes\n"), val);
15766       break;
15767     case Tag_RISCV_arch:
15768       p = display_tag_value (-1, p, end);
15769       break;
15770     default:
15771       return display_tag_value (tag, p, end);
15772     }
15773
15774   return p;
15775 }
15776
15777 static bfd_boolean
15778 process_attributes (Filedata * filedata,
15779                     const char * public_name,
15780                     unsigned int proc_type,
15781                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
15782                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const))
15783 {
15784   Elf_Internal_Shdr * sect;
15785   unsigned i;
15786   bfd_boolean res = TRUE;
15787
15788   /* Find the section header so that we get the size.  */
15789   for (i = 0, sect = filedata->section_headers;
15790        i < filedata->file_header.e_shnum;
15791        i++, sect++)
15792     {
15793       unsigned char * contents;
15794       unsigned char * p;
15795
15796       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
15797         continue;
15798
15799       contents = (unsigned char *) get_data (NULL, filedata, sect->sh_offset, 1,
15800                                              sect->sh_size, _("attributes"));
15801       if (contents == NULL)
15802         {
15803           res = FALSE;
15804           continue;
15805         }
15806
15807       p = contents;
15808       /* The first character is the version of the attributes.
15809          Currently only version 1, (aka 'A') is recognised here.  */
15810       if (*p != 'A')
15811         {
15812           printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p);
15813           res = FALSE;
15814         }
15815       else
15816         {
15817           bfd_vma section_len;
15818
15819           section_len = sect->sh_size - 1;
15820           p++;
15821
15822           while (section_len > 0)
15823             {
15824               bfd_vma attr_len;
15825               unsigned int namelen;
15826               bfd_boolean public_section;
15827               bfd_boolean gnu_section;
15828
15829               if (section_len <= 4)
15830                 {
15831                   error (_("Tag section ends prematurely\n"));
15832                   res = FALSE;
15833                   break;
15834                 }
15835               attr_len = byte_get (p, 4);
15836               p += 4;
15837
15838               if (attr_len > section_len)
15839                 {
15840                   error (_("Bad attribute length (%u > %u)\n"),
15841                           (unsigned) attr_len, (unsigned) section_len);
15842                   attr_len = section_len;
15843                   res = FALSE;
15844                 }
15845               /* PR 17531: file: 001-101425-0.004  */
15846               else if (attr_len < 5)
15847                 {
15848                   error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
15849                   res = FALSE;
15850                   break;
15851                 }
15852
15853               section_len -= attr_len;
15854               attr_len -= 4;
15855
15856               namelen = strnlen ((char *) p, attr_len) + 1;
15857               if (namelen == 0 || namelen >= attr_len)
15858                 {
15859                   error (_("Corrupt attribute section name\n"));
15860                   res = FALSE;
15861                   break;
15862                 }
15863
15864               printf (_("Attribute Section: "));
15865               print_symbol (INT_MAX, (const char *) p);
15866               putchar ('\n');
15867
15868               if (public_name && streq ((char *) p, public_name))
15869                 public_section = TRUE;
15870               else
15871                 public_section = FALSE;
15872
15873               if (streq ((char *) p, "gnu"))
15874                 gnu_section = TRUE;
15875               else
15876                 gnu_section = FALSE;
15877
15878               p += namelen;
15879               attr_len -= namelen;
15880
15881               while (attr_len > 0 && p < contents + sect->sh_size)
15882                 {
15883                   int tag;
15884                   int val;
15885                   bfd_vma size;
15886                   unsigned char * end;
15887
15888                   /* PR binutils/17531: Safe handling of corrupt files.  */
15889                   if (attr_len < 6)
15890                     {
15891                       error (_("Unused bytes at end of section\n"));
15892                       res = FALSE;
15893                       section_len = 0;
15894                       break;
15895                     }
15896
15897                   tag = *(p++);
15898                   size = byte_get (p, 4);
15899                   if (size > attr_len)
15900                     {
15901                       error (_("Bad subsection length (%u > %u)\n"),
15902                               (unsigned) size, (unsigned) attr_len);
15903                       res = FALSE;
15904                       size = attr_len;
15905                     }
15906                   /* PR binutils/17531: Safe handling of corrupt files.  */
15907                   if (size < 6)
15908                     {
15909                       error (_("Bad subsection length (%u < 6)\n"),
15910                               (unsigned) size);
15911                       res = FALSE;
15912                       section_len = 0;
15913                       break;
15914                     }
15915
15916                   attr_len -= size;
15917                   end = p + size - 1;
15918                   assert (end <= contents + sect->sh_size);
15919                   p += 4;
15920
15921                   switch (tag)
15922                     {
15923                     case 1:
15924                       printf (_("File Attributes\n"));
15925                       break;
15926                     case 2:
15927                       printf (_("Section Attributes:"));
15928                       goto do_numlist;
15929                     case 3:
15930                       printf (_("Symbol Attributes:"));
15931                       /* Fall through.  */
15932                     do_numlist:
15933                       for (;;)
15934                         {
15935                           unsigned int j;
15936
15937                           val = read_uleb128 (p, &j, end);
15938                           p += j;
15939                           if (val == 0)
15940                             break;
15941                           printf (" %d", val);
15942                         }
15943                       printf ("\n");
15944                       break;
15945                     default:
15946                       printf (_("Unknown tag: %d\n"), tag);
15947                       public_section = FALSE;
15948                       break;
15949                     }
15950
15951                   if (public_section && display_pub_attribute != NULL)
15952                     {
15953                       while (p < end)
15954                         p = display_pub_attribute (p, end);
15955                       assert (p == end);
15956                     }
15957                   else if (gnu_section && display_proc_gnu_attribute != NULL)
15958                     {
15959                       while (p < end)
15960                         p = display_gnu_attribute (p,
15961                                                    display_proc_gnu_attribute,
15962                                                    end);
15963                       assert (p == end);
15964                     }
15965                   else if (p < end)
15966                     {
15967                       printf (_("  Unknown attribute:\n"));
15968                       display_raw_attribute (p, end);
15969                       p = end;
15970                     }
15971                   else
15972                     attr_len = 0;
15973                 }
15974             }
15975         }
15976
15977       free (contents);
15978     }
15979
15980   return res;
15981 }
15982
15983 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
15984    Print the Address, Access and Initial fields of an entry at VMA ADDR
15985    and return the VMA of the next entry, or -1 if there was a problem.
15986    Does not read from DATA_END or beyond.  */
15987
15988 static bfd_vma
15989 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
15990                       unsigned char * data_end)
15991 {
15992   printf ("  ");
15993   print_vma (addr, LONG_HEX);
15994   printf (" ");
15995   if (addr < pltgot + 0xfff0)
15996     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
15997   else
15998     printf ("%10s", "");
15999   printf (" ");
16000   if (data == NULL)
16001     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
16002   else
16003     {
16004       bfd_vma entry;
16005       unsigned char * from = data + addr - pltgot;
16006
16007       if (from + (is_32bit_elf ? 4 : 8) > data_end)
16008         {
16009           warn (_("MIPS GOT entry extends beyond the end of available data\n"));
16010           printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
16011           return (bfd_vma) -1;
16012         }
16013       else
16014         {
16015           entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
16016           print_vma (entry, LONG_HEX);
16017         }
16018     }
16019   return addr + (is_32bit_elf ? 4 : 8);
16020 }
16021
16022 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
16023    PLTGOT.  Print the Address and Initial fields of an entry at VMA
16024    ADDR and return the VMA of the next entry.  */
16025
16026 static bfd_vma
16027 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
16028 {
16029   printf ("  ");
16030   print_vma (addr, LONG_HEX);
16031   printf (" ");
16032   if (data == NULL)
16033     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
16034   else
16035     {
16036       bfd_vma entry;
16037
16038       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
16039       print_vma (entry, LONG_HEX);
16040     }
16041   return addr + (is_32bit_elf ? 4 : 8);
16042 }
16043
16044 static void
16045 print_mips_ases (unsigned int mask)
16046 {
16047   if (mask & AFL_ASE_DSP)
16048     fputs ("\n\tDSP ASE", stdout);
16049   if (mask & AFL_ASE_DSPR2)
16050     fputs ("\n\tDSP R2 ASE", stdout);
16051   if (mask & AFL_ASE_DSPR3)
16052     fputs ("\n\tDSP R3 ASE", stdout);
16053   if (mask & AFL_ASE_EVA)
16054     fputs ("\n\tEnhanced VA Scheme", stdout);
16055   if (mask & AFL_ASE_MCU)
16056     fputs ("\n\tMCU (MicroController) ASE", stdout);
16057   if (mask & AFL_ASE_MDMX)
16058     fputs ("\n\tMDMX ASE", stdout);
16059   if (mask & AFL_ASE_MIPS3D)
16060     fputs ("\n\tMIPS-3D ASE", stdout);
16061   if (mask & AFL_ASE_MT)
16062     fputs ("\n\tMT ASE", stdout);
16063   if (mask & AFL_ASE_SMARTMIPS)
16064     fputs ("\n\tSmartMIPS ASE", stdout);
16065   if (mask & AFL_ASE_VIRT)
16066     fputs ("\n\tVZ ASE", stdout);
16067   if (mask & AFL_ASE_MSA)
16068     fputs ("\n\tMSA ASE", stdout);
16069   if (mask & AFL_ASE_MIPS16)
16070     fputs ("\n\tMIPS16 ASE", stdout);
16071   if (mask & AFL_ASE_MICROMIPS)
16072     fputs ("\n\tMICROMIPS ASE", stdout);
16073   if (mask & AFL_ASE_XPA)
16074     fputs ("\n\tXPA ASE", stdout);
16075   if (mask & AFL_ASE_MIPS16E2)
16076     fputs ("\n\tMIPS16e2 ASE", stdout);
16077   if (mask & AFL_ASE_CRC)
16078     fputs ("\n\tCRC ASE", stdout);
16079   if (mask & AFL_ASE_GINV)
16080     fputs ("\n\tGINV ASE", stdout);
16081   if (mask & AFL_ASE_LOONGSON_MMI)
16082     fputs ("\n\tLoongson MMI ASE", stdout);
16083   if (mask & AFL_ASE_LOONGSON_CAM)
16084     fputs ("\n\tLoongson CAM ASE", stdout);
16085   if (mask & AFL_ASE_LOONGSON_EXT)
16086     fputs ("\n\tLoongson EXT ASE", stdout);
16087   if (mask & AFL_ASE_LOONGSON_EXT2)
16088     fputs ("\n\tLoongson EXT2 ASE", stdout);
16089   if (mask == 0)
16090     fprintf (stdout, "\n\t%s", _("None"));
16091   else if ((mask & ~AFL_ASE_MASK) != 0)
16092     fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
16093 }
16094
16095 static void
16096 print_mips_isa_ext (unsigned int isa_ext)
16097 {
16098   switch (isa_ext)
16099     {
16100     case 0:
16101       fputs (_("None"), stdout);
16102       break;
16103     case AFL_EXT_XLR:
16104       fputs ("RMI XLR", stdout);
16105       break;
16106     case AFL_EXT_OCTEON3:
16107       fputs ("Cavium Networks Octeon3", stdout);
16108       break;
16109     case AFL_EXT_OCTEON2:
16110       fputs ("Cavium Networks Octeon2", stdout);
16111       break;
16112     case AFL_EXT_OCTEONP:
16113       fputs ("Cavium Networks OcteonP", stdout);
16114       break;
16115     case AFL_EXT_OCTEON:
16116       fputs ("Cavium Networks Octeon", stdout);
16117       break;
16118     case AFL_EXT_5900:
16119       fputs ("Toshiba R5900", stdout);
16120       break;
16121     case AFL_EXT_4650:
16122       fputs ("MIPS R4650", stdout);
16123       break;
16124     case AFL_EXT_4010:
16125       fputs ("LSI R4010", stdout);
16126       break;
16127     case AFL_EXT_4100:
16128       fputs ("NEC VR4100", stdout);
16129       break;
16130     case AFL_EXT_3900:
16131       fputs ("Toshiba R3900", stdout);
16132       break;
16133     case AFL_EXT_10000:
16134       fputs ("MIPS R10000", stdout);
16135       break;
16136     case AFL_EXT_SB1:
16137       fputs ("Broadcom SB-1", stdout);
16138       break;
16139     case AFL_EXT_4111:
16140       fputs ("NEC VR4111/VR4181", stdout);
16141       break;
16142     case AFL_EXT_4120:
16143       fputs ("NEC VR4120", stdout);
16144       break;
16145     case AFL_EXT_5400:
16146       fputs ("NEC VR5400", stdout);
16147       break;
16148     case AFL_EXT_5500:
16149       fputs ("NEC VR5500", stdout);
16150       break;
16151     case AFL_EXT_LOONGSON_2E:
16152       fputs ("ST Microelectronics Loongson 2E", stdout);
16153       break;
16154     case AFL_EXT_LOONGSON_2F:
16155       fputs ("ST Microelectronics Loongson 2F", stdout);
16156       break;
16157     case AFL_EXT_INTERAPTIV_MR2:
16158       fputs ("Imagination interAptiv MR2", stdout);
16159       break;
16160     default:
16161       fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
16162     }
16163 }
16164
16165 static signed int
16166 get_mips_reg_size (int reg_size)
16167 {
16168   return (reg_size == AFL_REG_NONE) ? 0
16169          : (reg_size == AFL_REG_32) ? 32
16170          : (reg_size == AFL_REG_64) ? 64
16171          : (reg_size == AFL_REG_128) ? 128
16172          : -1;
16173 }
16174
16175 static bfd_boolean
16176 process_mips_specific (Filedata * filedata)
16177 {
16178   Elf_Internal_Dyn * entry;
16179   Elf_Internal_Shdr *sect = NULL;
16180   size_t liblist_offset = 0;
16181   size_t liblistno = 0;
16182   size_t conflictsno = 0;
16183   size_t options_offset = 0;
16184   size_t conflicts_offset = 0;
16185   size_t pltrelsz = 0;
16186   size_t pltrel = 0;
16187   bfd_vma pltgot = 0;
16188   bfd_vma mips_pltgot = 0;
16189   bfd_vma jmprel = 0;
16190   bfd_vma local_gotno = 0;
16191   bfd_vma gotsym = 0;
16192   bfd_vma symtabno = 0;
16193   bfd_boolean res = TRUE;
16194
16195   if (! process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
16196                             display_mips_gnu_attribute))
16197     res = FALSE;
16198
16199   sect = find_section (filedata, ".MIPS.abiflags");
16200
16201   if (sect != NULL)
16202     {
16203       Elf_External_ABIFlags_v0 *abiflags_ext;
16204       Elf_Internal_ABIFlags_v0 abiflags_in;
16205
16206       if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
16207         {
16208           error (_("Corrupt MIPS ABI Flags section.\n"));
16209           res = FALSE;
16210         }
16211       else
16212         {
16213           abiflags_ext = get_data (NULL, filedata, sect->sh_offset, 1,
16214                                    sect->sh_size, _("MIPS ABI Flags section"));
16215           if (abiflags_ext)
16216             {
16217               abiflags_in.version = BYTE_GET (abiflags_ext->version);
16218               abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
16219               abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
16220               abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
16221               abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
16222               abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
16223               abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
16224               abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
16225               abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
16226               abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
16227               abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
16228
16229               printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
16230               printf ("\nISA: MIPS%d", abiflags_in.isa_level);
16231               if (abiflags_in.isa_rev > 1)
16232                 printf ("r%d", abiflags_in.isa_rev);
16233               printf ("\nGPR size: %d",
16234                       get_mips_reg_size (abiflags_in.gpr_size));
16235               printf ("\nCPR1 size: %d",
16236                       get_mips_reg_size (abiflags_in.cpr1_size));
16237               printf ("\nCPR2 size: %d",
16238                       get_mips_reg_size (abiflags_in.cpr2_size));
16239               fputs ("\nFP ABI: ", stdout);
16240               print_mips_fp_abi_value (abiflags_in.fp_abi);
16241               fputs ("ISA Extension: ", stdout);
16242               print_mips_isa_ext (abiflags_in.isa_ext);
16243               fputs ("\nASEs:", stdout);
16244               print_mips_ases (abiflags_in.ases);
16245               printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
16246               printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
16247               fputc ('\n', stdout);
16248               free (abiflags_ext);
16249             }
16250         }
16251     }
16252
16253   /* We have a lot of special sections.  Thanks SGI!  */
16254   if (dynamic_section == NULL)
16255     {
16256       /* No dynamic information available.  See if there is static GOT.  */
16257       sect = find_section (filedata, ".got");
16258       if (sect != NULL)
16259         {
16260           unsigned char *data_end;
16261           unsigned char *data;
16262           bfd_vma ent, end;
16263           int addr_size;
16264
16265           pltgot = sect->sh_addr;
16266
16267           ent = pltgot;
16268           addr_size = (is_32bit_elf ? 4 : 8);
16269           end = pltgot + sect->sh_size;
16270
16271           data = (unsigned char *) get_data (NULL, filedata, sect->sh_offset,
16272                                              end - pltgot, 1,
16273                                              _("Global Offset Table data"));
16274           /* PR 12855: Null data is handled gracefully throughout.  */
16275           data_end = data + (end - pltgot);
16276
16277           printf (_("\nStatic GOT:\n"));
16278           printf (_(" Canonical gp value: "));
16279           print_vma (ent + 0x7ff0, LONG_HEX);
16280           printf ("\n\n");
16281
16282           /* In a dynamic binary GOT[0] is reserved for the dynamic
16283              loader to store the lazy resolver pointer, however in
16284              a static binary it may well have been omitted and GOT
16285              reduced to a table of addresses.
16286              PR 21344: Check for the entry being fully available
16287              before fetching it.  */
16288           if (data
16289               && data + ent - pltgot + addr_size <= data_end
16290               && byte_get (data + ent - pltgot, addr_size) == 0)
16291             {
16292               printf (_(" Reserved entries:\n"));
16293               printf (_("  %*s %10s %*s\n"),
16294                       addr_size * 2, _("Address"), _("Access"),
16295                       addr_size * 2, _("Value"));
16296               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16297               printf ("\n");
16298               if (ent == (bfd_vma) -1)
16299                 goto sgot_print_fail;
16300
16301               /* Check for the MSB of GOT[1] being set, identifying a
16302                  GNU object.  This entry will be used by some runtime
16303                  loaders, to store the module pointer.  Otherwise this
16304                  is an ordinary local entry.
16305                  PR 21344: Check for the entry being fully available
16306                  before fetching it.  */
16307               if (data
16308                   && data + ent - pltgot + addr_size <= data_end
16309                   && (byte_get (data + ent - pltgot, addr_size)
16310                       >> (addr_size * 8 - 1)) != 0)
16311                 {
16312                   ent = print_mips_got_entry (data, pltgot, ent, data_end);
16313                   printf ("\n");
16314                   if (ent == (bfd_vma) -1)
16315                     goto sgot_print_fail;
16316                 }
16317               printf ("\n");
16318             }
16319
16320           if (data != NULL && ent < end)
16321             {
16322               printf (_(" Local entries:\n"));
16323               printf ("  %*s %10s %*s\n",
16324                       addr_size * 2, _("Address"), _("Access"),
16325                       addr_size * 2, _("Value"));
16326               while (ent < end)
16327                 {
16328                   ent = print_mips_got_entry (data, pltgot, ent, data_end);
16329                   printf ("\n");
16330                   if (ent == (bfd_vma) -1)
16331                     goto sgot_print_fail;
16332                 }
16333               printf ("\n");
16334             }
16335
16336         sgot_print_fail:
16337           if (data)
16338             free (data);
16339         }
16340       return res;
16341     }
16342
16343   for (entry = dynamic_section;
16344        /* PR 17531 file: 012-50589-0.004.  */
16345        entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
16346        ++entry)
16347     switch (entry->d_tag)
16348       {
16349       case DT_MIPS_LIBLIST:
16350         liblist_offset
16351           = offset_from_vma (filedata, entry->d_un.d_val,
16352                              liblistno * sizeof (Elf32_External_Lib));
16353         break;
16354       case DT_MIPS_LIBLISTNO:
16355         liblistno = entry->d_un.d_val;
16356         break;
16357       case DT_MIPS_OPTIONS:
16358         options_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
16359         break;
16360       case DT_MIPS_CONFLICT:
16361         conflicts_offset
16362           = offset_from_vma (filedata, entry->d_un.d_val,
16363                              conflictsno * sizeof (Elf32_External_Conflict));
16364         break;
16365       case DT_MIPS_CONFLICTNO:
16366         conflictsno = entry->d_un.d_val;
16367         break;
16368       case DT_PLTGOT:
16369         pltgot = entry->d_un.d_ptr;
16370         break;
16371       case DT_MIPS_LOCAL_GOTNO:
16372         local_gotno = entry->d_un.d_val;
16373         break;
16374       case DT_MIPS_GOTSYM:
16375         gotsym = entry->d_un.d_val;
16376         break;
16377       case DT_MIPS_SYMTABNO:
16378         symtabno = entry->d_un.d_val;
16379         break;
16380       case DT_MIPS_PLTGOT:
16381         mips_pltgot = entry->d_un.d_ptr;
16382         break;
16383       case DT_PLTREL:
16384         pltrel = entry->d_un.d_val;
16385         break;
16386       case DT_PLTRELSZ:
16387         pltrelsz = entry->d_un.d_val;
16388         break;
16389       case DT_JMPREL:
16390         jmprel = entry->d_un.d_ptr;
16391         break;
16392       default:
16393         break;
16394       }
16395
16396   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
16397     {
16398       Elf32_External_Lib * elib;
16399       size_t cnt;
16400
16401       elib = (Elf32_External_Lib *) get_data (NULL, filedata, liblist_offset,
16402                                               liblistno,
16403                                               sizeof (Elf32_External_Lib),
16404                                               _("liblist section data"));
16405       if (elib)
16406         {
16407           printf (ngettext ("\nSection '.liblist' contains %lu entry:\n",
16408                             "\nSection '.liblist' contains %lu entries:\n",
16409                             (unsigned long) liblistno),
16410                   (unsigned long) liblistno);
16411           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
16412                  stdout);
16413
16414           for (cnt = 0; cnt < liblistno; ++cnt)
16415             {
16416               Elf32_Lib liblist;
16417               time_t atime;
16418               char timebuf[128];
16419               struct tm * tmp;
16420
16421               liblist.l_name = BYTE_GET (elib[cnt].l_name);
16422               atime = BYTE_GET (elib[cnt].l_time_stamp);
16423               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16424               liblist.l_version = BYTE_GET (elib[cnt].l_version);
16425               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16426
16427               tmp = gmtime (&atime);
16428               snprintf (timebuf, sizeof (timebuf),
16429                         "%04u-%02u-%02uT%02u:%02u:%02u",
16430                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16431                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16432
16433               printf ("%3lu: ", (unsigned long) cnt);
16434               if (VALID_DYNAMIC_NAME (liblist.l_name))
16435                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
16436               else
16437                 printf (_("<corrupt: %9ld>"), liblist.l_name);
16438               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
16439                       liblist.l_version);
16440
16441               if (liblist.l_flags == 0)
16442                 puts (_(" NONE"));
16443               else
16444                 {
16445                   static const struct
16446                   {
16447                     const char * name;
16448                     int bit;
16449                   }
16450                   l_flags_vals[] =
16451                   {
16452                     { " EXACT_MATCH", LL_EXACT_MATCH },
16453                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
16454                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
16455                     { " EXPORTS", LL_EXPORTS },
16456                     { " DELAY_LOAD", LL_DELAY_LOAD },
16457                     { " DELTA", LL_DELTA }
16458                   };
16459                   int flags = liblist.l_flags;
16460                   size_t fcnt;
16461
16462                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
16463                     if ((flags & l_flags_vals[fcnt].bit) != 0)
16464                       {
16465                         fputs (l_flags_vals[fcnt].name, stdout);
16466                         flags ^= l_flags_vals[fcnt].bit;
16467                       }
16468                   if (flags != 0)
16469                     printf (" %#x", (unsigned int) flags);
16470
16471                   puts ("");
16472                 }
16473             }
16474
16475           free (elib);
16476         }
16477       else
16478         res = FALSE;
16479     }
16480
16481   if (options_offset != 0)
16482     {
16483       Elf_External_Options * eopt;
16484       size_t offset;
16485       int cnt;
16486       sect = filedata->section_headers;
16487
16488       /* Find the section header so that we get the size.  */
16489       sect = find_section_by_type (filedata, SHT_MIPS_OPTIONS);
16490       /* PR 17533 file: 012-277276-0.004.  */
16491       if (sect == NULL)
16492         {
16493           error (_("No MIPS_OPTIONS header found\n"));
16494           return FALSE;
16495         }
16496       /* PR 24243  */
16497       if (sect->sh_size < sizeof (* eopt))
16498         {
16499           error (_("The MIPS options section is too small.\n"));
16500           return FALSE;
16501         }
16502
16503       eopt = (Elf_External_Options *) get_data (NULL, filedata, options_offset, 1,
16504                                                 sect->sh_size, _("options"));
16505       if (eopt)
16506         {
16507           Elf_Internal_Options * iopt;
16508           Elf_Internal_Options * option;
16509           Elf_Internal_Options * iopt_end;
16510
16511           iopt = (Elf_Internal_Options *)
16512               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
16513           if (iopt == NULL)
16514             {
16515               error (_("Out of memory allocating space for MIPS options\n"));
16516               return FALSE;
16517             }
16518
16519           offset = cnt = 0;
16520           option = iopt;
16521           iopt_end = iopt + (sect->sh_size / sizeof (eopt));
16522           
16523           while (offset <= sect->sh_size - sizeof (* eopt))
16524             {
16525               Elf_External_Options * eoption;
16526
16527               eoption = (Elf_External_Options *) ((char *) eopt + offset);
16528
16529               option->kind = BYTE_GET (eoption->kind);
16530               option->size = BYTE_GET (eoption->size);
16531               option->section = BYTE_GET (eoption->section);
16532               option->info = BYTE_GET (eoption->info);
16533
16534               /* PR 17531: file: ffa0fa3b.  */
16535               if (option->size < sizeof (* eopt)
16536                   || offset + option->size > sect->sh_size)
16537                 {
16538                   error (_("Invalid size (%u) for MIPS option\n"), option->size);
16539                   return FALSE;
16540                 }
16541               offset += option->size;
16542
16543               ++option;
16544               ++cnt;
16545             }
16546
16547           printf (ngettext ("\nSection '%s' contains %d entry:\n",
16548                             "\nSection '%s' contains %d entries:\n",
16549                             cnt),
16550                   printable_section_name (filedata, sect), cnt);
16551
16552           option = iopt;
16553           offset = 0;
16554
16555           while (cnt-- > 0)
16556             {
16557               size_t len;
16558
16559               switch (option->kind)
16560                 {
16561                 case ODK_NULL:
16562                   /* This shouldn't happen.  */
16563                   printf (" NULL       %d %lx", option->section, option->info);
16564                   break;
16565
16566                 case ODK_REGINFO:
16567                   printf (" REGINFO    ");
16568                   if (filedata->file_header.e_machine == EM_MIPS)
16569                     {
16570                       Elf32_External_RegInfo * ereg;
16571                       Elf32_RegInfo reginfo;
16572
16573                       /* 32bit form.  */
16574                       if (option + 2 > iopt_end)
16575                         {
16576                           printf (_("<corrupt>\n"));
16577                           error (_("Truncated MIPS REGINFO option\n"));
16578                           cnt = 0;
16579                           break;
16580                         }
16581
16582                       ereg = (Elf32_External_RegInfo *) (option + 1);
16583
16584                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
16585                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16586                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16587                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16588                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16589                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
16590
16591                       printf ("GPR %08lx  GP 0x%lx\n",
16592                               reginfo.ri_gprmask,
16593                               (unsigned long) reginfo.ri_gp_value);
16594                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
16595                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16596                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16597                     }
16598                   else
16599                     {
16600                       /* 64 bit form.  */
16601                       Elf64_External_RegInfo * ereg;
16602                       Elf64_Internal_RegInfo reginfo;
16603
16604                       if (option + 2 > iopt_end)
16605                         {
16606                           printf (_("<corrupt>\n"));
16607                           error (_("Truncated MIPS REGINFO option\n"));
16608                           cnt = 0;
16609                           break;
16610                         }
16611
16612                       ereg = (Elf64_External_RegInfo *) (option + 1);
16613                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
16614                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16615                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16616                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16617                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16618                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
16619
16620                       printf ("GPR %08lx  GP 0x",
16621                               reginfo.ri_gprmask);
16622                       printf_vma (reginfo.ri_gp_value);
16623                       printf ("\n");
16624
16625                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
16626                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16627                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16628                     }
16629                   ++option;
16630                   continue;
16631
16632                 case ODK_EXCEPTIONS:
16633                   fputs (" EXCEPTIONS fpe_min(", stdout);
16634                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
16635                   fputs (") fpe_max(", stdout);
16636                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
16637                   fputs (")", stdout);
16638
16639                   if (option->info & OEX_PAGE0)
16640                     fputs (" PAGE0", stdout);
16641                   if (option->info & OEX_SMM)
16642                     fputs (" SMM", stdout);
16643                   if (option->info & OEX_FPDBUG)
16644                     fputs (" FPDBUG", stdout);
16645                   if (option->info & OEX_DISMISS)
16646                     fputs (" DISMISS", stdout);
16647                   break;
16648
16649                 case ODK_PAD:
16650                   fputs (" PAD       ", stdout);
16651                   if (option->info & OPAD_PREFIX)
16652                     fputs (" PREFIX", stdout);
16653                   if (option->info & OPAD_POSTFIX)
16654                     fputs (" POSTFIX", stdout);
16655                   if (option->info & OPAD_SYMBOL)
16656                     fputs (" SYMBOL", stdout);
16657                   break;
16658
16659                 case ODK_HWPATCH:
16660                   fputs (" HWPATCH   ", stdout);
16661                   if (option->info & OHW_R4KEOP)
16662                     fputs (" R4KEOP", stdout);
16663                   if (option->info & OHW_R8KPFETCH)
16664                     fputs (" R8KPFETCH", stdout);
16665                   if (option->info & OHW_R5KEOP)
16666                     fputs (" R5KEOP", stdout);
16667                   if (option->info & OHW_R5KCVTL)
16668                     fputs (" R5KCVTL", stdout);
16669                   break;
16670
16671                 case ODK_FILL:
16672                   fputs (" FILL       ", stdout);
16673                   /* XXX Print content of info word?  */
16674                   break;
16675
16676                 case ODK_TAGS:
16677                   fputs (" TAGS       ", stdout);
16678                   /* XXX Print content of info word?  */
16679                   break;
16680
16681                 case ODK_HWAND:
16682                   fputs (" HWAND     ", stdout);
16683                   if (option->info & OHWA0_R4KEOP_CHECKED)
16684                     fputs (" R4KEOP_CHECKED", stdout);
16685                   if (option->info & OHWA0_R4KEOP_CLEAN)
16686                     fputs (" R4KEOP_CLEAN", stdout);
16687                   break;
16688
16689                 case ODK_HWOR:
16690                   fputs (" HWOR      ", stdout);
16691                   if (option->info & OHWA0_R4KEOP_CHECKED)
16692                     fputs (" R4KEOP_CHECKED", stdout);
16693                   if (option->info & OHWA0_R4KEOP_CLEAN)
16694                     fputs (" R4KEOP_CLEAN", stdout);
16695                   break;
16696
16697                 case ODK_GP_GROUP:
16698                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
16699                           option->info & OGP_GROUP,
16700                           (option->info & OGP_SELF) >> 16);
16701                   break;
16702
16703                 case ODK_IDENT:
16704                   printf (" IDENT     %#06lx  self-contained %#06lx",
16705                           option->info & OGP_GROUP,
16706                           (option->info & OGP_SELF) >> 16);
16707                   break;
16708
16709                 default:
16710                   /* This shouldn't happen.  */
16711                   printf (" %3d ???     %d %lx",
16712                           option->kind, option->section, option->info);
16713                   break;
16714                 }
16715
16716               len = sizeof (* eopt);
16717               while (len < option->size)
16718                 {
16719                   unsigned char datum = * ((unsigned char *) eopt + offset + len);
16720
16721                   if (ISPRINT (datum))
16722                     printf ("%c", datum);
16723                   else
16724                     printf ("\\%03o", datum);
16725                   len ++;
16726                 }
16727               fputs ("\n", stdout);
16728
16729               offset += option->size;
16730               ++option;
16731             }
16732
16733           free (eopt);
16734         }
16735       else
16736         res = FALSE;
16737     }
16738
16739   if (conflicts_offset != 0 && conflictsno != 0)
16740     {
16741       Elf32_Conflict * iconf;
16742       size_t cnt;
16743
16744       if (dynamic_symbols == NULL)
16745         {
16746           error (_("conflict list found without a dynamic symbol table\n"));
16747           return FALSE;
16748         }
16749
16750       /* PR 21345 - print a slightly more helpful error message
16751          if we are sure that the cmalloc will fail.  */
16752       if (conflictsno * sizeof (* iconf) > filedata->file_size)
16753         {
16754           error (_("Overlarge number of conflicts detected: %lx\n"),
16755                  (long) conflictsno);
16756           return FALSE;
16757         }
16758
16759       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
16760       if (iconf == NULL)
16761         {
16762           error (_("Out of memory allocating space for dynamic conflicts\n"));
16763           return FALSE;
16764         }
16765
16766       if (is_32bit_elf)
16767         {
16768           Elf32_External_Conflict * econf32;
16769
16770           econf32 = (Elf32_External_Conflict *)
16771               get_data (NULL, filedata, conflicts_offset, conflictsno,
16772                         sizeof (* econf32), _("conflict"));
16773           if (!econf32)
16774             return FALSE;
16775
16776           for (cnt = 0; cnt < conflictsno; ++cnt)
16777             iconf[cnt] = BYTE_GET (econf32[cnt]);
16778
16779           free (econf32);
16780         }
16781       else
16782         {
16783           Elf64_External_Conflict * econf64;
16784
16785           econf64 = (Elf64_External_Conflict *)
16786               get_data (NULL, filedata, conflicts_offset, conflictsno,
16787                         sizeof (* econf64), _("conflict"));
16788           if (!econf64)
16789             return FALSE;
16790
16791           for (cnt = 0; cnt < conflictsno; ++cnt)
16792             iconf[cnt] = BYTE_GET (econf64[cnt]);
16793
16794           free (econf64);
16795         }
16796
16797       printf (ngettext ("\nSection '.conflict' contains %lu entry:\n",
16798                         "\nSection '.conflict' contains %lu entries:\n",
16799                         (unsigned long) conflictsno),
16800               (unsigned long) conflictsno);
16801       puts (_("  Num:    Index       Value  Name"));
16802
16803       for (cnt = 0; cnt < conflictsno; ++cnt)
16804         {
16805           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
16806
16807           if (iconf[cnt] >= num_dynamic_syms)
16808             printf (_("<corrupt symbol index>"));
16809           else
16810             {
16811               Elf_Internal_Sym * psym;
16812
16813               psym = & dynamic_symbols[iconf[cnt]];
16814               print_vma (psym->st_value, FULL_HEX);
16815               putchar (' ');
16816               if (VALID_DYNAMIC_NAME (psym->st_name))
16817                 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
16818               else
16819                 printf (_("<corrupt: %14ld>"), psym->st_name);
16820             }
16821           putchar ('\n');
16822         }
16823
16824       free (iconf);
16825     }
16826
16827   if (pltgot != 0 && local_gotno != 0)
16828     {
16829       bfd_vma ent, local_end, global_end;
16830       size_t i, offset;
16831       unsigned char * data;
16832       unsigned char * data_end;
16833       int addr_size;
16834
16835       ent = pltgot;
16836       addr_size = (is_32bit_elf ? 4 : 8);
16837       local_end = pltgot + local_gotno * addr_size;
16838
16839       /* PR binutils/17533 file: 012-111227-0.004  */
16840       if (symtabno < gotsym)
16841         {
16842           error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
16843                  (unsigned long) gotsym, (unsigned long) symtabno);
16844           return FALSE;
16845         }
16846
16847       global_end = local_end + (symtabno - gotsym) * addr_size;
16848       /* PR 17531: file: 54c91a34.  */
16849       if (global_end < local_end)
16850         {
16851           error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
16852           return FALSE;
16853         }
16854
16855       offset = offset_from_vma (filedata, pltgot, global_end - pltgot);
16856       data = (unsigned char *) get_data (NULL, filedata, offset,
16857                                          global_end - pltgot, 1,
16858                                          _("Global Offset Table data"));
16859       /* PR 12855: Null data is handled gracefully throughout.  */
16860       data_end = data + (global_end - pltgot);
16861
16862       printf (_("\nPrimary GOT:\n"));
16863       printf (_(" Canonical gp value: "));
16864       print_vma (pltgot + 0x7ff0, LONG_HEX);
16865       printf ("\n\n");
16866
16867       printf (_(" Reserved entries:\n"));
16868       printf (_("  %*s %10s %*s Purpose\n"),
16869               addr_size * 2, _("Address"), _("Access"),
16870               addr_size * 2, _("Initial"));
16871       ent = print_mips_got_entry (data, pltgot, ent, data_end);
16872       printf (_(" Lazy resolver\n"));
16873       if (ent == (bfd_vma) -1)
16874         goto got_print_fail;
16875
16876       /* Check for the MSB of GOT[1] being set, denoting a GNU object.
16877          This entry will be used by some runtime loaders, to store the
16878          module pointer.  Otherwise this is an ordinary local entry.
16879          PR 21344: Check for the entry being fully available before
16880          fetching it.  */
16881       if (data
16882           && data + ent - pltgot + addr_size <= data_end
16883           && (byte_get (data + ent - pltgot, addr_size)
16884               >> (addr_size * 8 - 1)) != 0)
16885         {
16886           ent = print_mips_got_entry (data, pltgot, ent, data_end);
16887           printf (_(" Module pointer (GNU extension)\n"));
16888           if (ent == (bfd_vma) -1)
16889             goto got_print_fail;
16890         }
16891       printf ("\n");
16892
16893       if (data != NULL && ent < local_end)
16894         {
16895           printf (_(" Local entries:\n"));
16896           printf ("  %*s %10s %*s\n",
16897                   addr_size * 2, _("Address"), _("Access"),
16898                   addr_size * 2, _("Initial"));
16899           while (ent < local_end)
16900             {
16901               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16902               printf ("\n");
16903               if (ent == (bfd_vma) -1)
16904                 goto got_print_fail;
16905             }
16906           printf ("\n");
16907         }
16908
16909       if (data != NULL && gotsym < symtabno)
16910         {
16911           int sym_width;
16912
16913           printf (_(" Global entries:\n"));
16914           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
16915                   addr_size * 2, _("Address"),
16916                   _("Access"),
16917                   addr_size * 2, _("Initial"),
16918                   addr_size * 2, _("Sym.Val."),
16919                   _("Type"),
16920                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
16921                   _("Ndx"), _("Name"));
16922
16923           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
16924
16925           for (i = gotsym; i < symtabno; i++)
16926             {
16927               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16928               printf (" ");
16929
16930               if (dynamic_symbols == NULL)
16931                 printf (_("<no dynamic symbols>"));
16932               else if (i < num_dynamic_syms)
16933                 {
16934                   Elf_Internal_Sym * psym = dynamic_symbols + i;
16935
16936                   print_vma (psym->st_value, LONG_HEX);
16937                   printf (" %-7s %3s ",
16938                           get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16939                           get_symbol_index_type (filedata, psym->st_shndx));
16940
16941                   if (VALID_DYNAMIC_NAME (psym->st_name))
16942                     print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16943                   else
16944                     printf (_("<corrupt: %14ld>"), psym->st_name);
16945                 }
16946               else
16947                 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
16948                         (unsigned long) i);
16949
16950               printf ("\n");
16951               if (ent == (bfd_vma) -1)
16952                 break;
16953             }
16954           printf ("\n");
16955         }
16956
16957     got_print_fail:
16958       if (data)
16959         free (data);
16960     }
16961
16962   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
16963     {
16964       bfd_vma ent, end;
16965       size_t offset, rel_offset;
16966       unsigned long count, i;
16967       unsigned char * data;
16968       int addr_size, sym_width;
16969       Elf_Internal_Rela * rels;
16970
16971       rel_offset = offset_from_vma (filedata, jmprel, pltrelsz);
16972       if (pltrel == DT_RELA)
16973         {
16974           if (!slurp_rela_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16975             return FALSE;
16976         }
16977       else
16978         {
16979           if (!slurp_rel_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16980             return FALSE;
16981         }
16982
16983       ent = mips_pltgot;
16984       addr_size = (is_32bit_elf ? 4 : 8);
16985       end = mips_pltgot + (2 + count) * addr_size;
16986
16987       offset = offset_from_vma (filedata, mips_pltgot, end - mips_pltgot);
16988       data = (unsigned char *) get_data (NULL, filedata, offset, end - mips_pltgot,
16989                                          1, _("Procedure Linkage Table data"));
16990       if (data == NULL)
16991         return FALSE;
16992
16993       printf ("\nPLT GOT:\n\n");
16994       printf (_(" Reserved entries:\n"));
16995       printf (_("  %*s %*s Purpose\n"),
16996               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
16997       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16998       printf (_(" PLT lazy resolver\n"));
16999       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
17000       printf (_(" Module pointer\n"));
17001       printf ("\n");
17002
17003       printf (_(" Entries:\n"));
17004       printf ("  %*s %*s %*s %-7s %3s %s\n",
17005               addr_size * 2, _("Address"),
17006               addr_size * 2, _("Initial"),
17007               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
17008       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
17009       for (i = 0; i < count; i++)
17010         {
17011           unsigned long idx = get_reloc_symindex (rels[i].r_info);
17012
17013           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
17014           printf (" ");
17015
17016           if (idx >= num_dynamic_syms)
17017             printf (_("<corrupt symbol index: %lu>"), idx);
17018           else
17019             {
17020               Elf_Internal_Sym * psym = dynamic_symbols + idx;
17021
17022               print_vma (psym->st_value, LONG_HEX);
17023               printf (" %-7s %3s ",
17024                       get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
17025                       get_symbol_index_type (filedata, psym->st_shndx));
17026               if (VALID_DYNAMIC_NAME (psym->st_name))
17027                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
17028               else
17029                 printf (_("<corrupt: %14ld>"), psym->st_name);
17030             }
17031           printf ("\n");
17032         }
17033       printf ("\n");
17034
17035       if (data)
17036         free (data);
17037       free (rels);
17038     }
17039
17040   return res;
17041 }
17042
17043 static bfd_boolean
17044 process_nds32_specific (Filedata * filedata)
17045 {
17046   Elf_Internal_Shdr *sect = NULL;
17047
17048   sect = find_section (filedata, ".nds32_e_flags");
17049   if (sect != NULL)
17050     {
17051       unsigned int *flag;
17052
17053       printf ("\nNDS32 elf flags section:\n");
17054       flag = get_data (NULL, filedata, sect->sh_offset, 1,
17055                        sect->sh_size, _("NDS32 elf flags section"));
17056
17057       if (! flag)
17058         return FALSE;
17059
17060       switch ((*flag) & 0x3)
17061         {
17062         case 0:
17063           printf ("(VEC_SIZE):\tNo entry.\n");
17064           break;
17065         case 1:
17066           printf ("(VEC_SIZE):\t4 bytes\n");
17067           break;
17068         case 2:
17069           printf ("(VEC_SIZE):\t16 bytes\n");
17070           break;
17071         case 3:
17072           printf ("(VEC_SIZE):\treserved\n");
17073           break;
17074         }
17075     }
17076
17077   return TRUE;
17078 }
17079
17080 static bfd_boolean
17081 process_gnu_liblist (Filedata * filedata)
17082 {
17083   Elf_Internal_Shdr * section;
17084   Elf_Internal_Shdr * string_sec;
17085   Elf32_External_Lib * elib;
17086   char * strtab;
17087   size_t strtab_size;
17088   size_t cnt;
17089   unsigned long num_liblist;
17090   unsigned i;
17091   bfd_boolean res = TRUE;
17092
17093   if (! do_arch)
17094     return TRUE;
17095
17096   for (i = 0, section = filedata->section_headers;
17097        i < filedata->file_header.e_shnum;
17098        i++, section++)
17099     {
17100       switch (section->sh_type)
17101         {
17102         case SHT_GNU_LIBLIST:
17103           if (section->sh_link >= filedata->file_header.e_shnum)
17104             break;
17105
17106           elib = (Elf32_External_Lib *)
17107               get_data (NULL, filedata, section->sh_offset, 1, section->sh_size,
17108                         _("liblist section data"));
17109
17110           if (elib == NULL)
17111             {
17112               res = FALSE;
17113               break;
17114             }
17115
17116           string_sec = filedata->section_headers + section->sh_link;
17117           strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
17118                                       string_sec->sh_size,
17119                                       _("liblist string table"));
17120           if (strtab == NULL
17121               || section->sh_entsize != sizeof (Elf32_External_Lib))
17122             {
17123               free (elib);
17124               free (strtab);
17125               res = FALSE;
17126               break;
17127             }
17128           strtab_size = string_sec->sh_size;
17129
17130           num_liblist = section->sh_size / sizeof (Elf32_External_Lib);
17131           printf (ngettext ("\nLibrary list section '%s' contains %lu entries:\n",
17132                             "\nLibrary list section '%s' contains %lu entries:\n",
17133                             num_liblist),
17134                   printable_section_name (filedata, section),
17135                   num_liblist);
17136
17137           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
17138
17139           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
17140                ++cnt)
17141             {
17142               Elf32_Lib liblist;
17143               time_t atime;
17144               char timebuf[128];
17145               struct tm * tmp;
17146
17147               liblist.l_name = BYTE_GET (elib[cnt].l_name);
17148               atime = BYTE_GET (elib[cnt].l_time_stamp);
17149               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
17150               liblist.l_version = BYTE_GET (elib[cnt].l_version);
17151               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
17152
17153               tmp = gmtime (&atime);
17154               snprintf (timebuf, sizeof (timebuf),
17155                         "%04u-%02u-%02uT%02u:%02u:%02u",
17156                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
17157                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
17158
17159               printf ("%3lu: ", (unsigned long) cnt);
17160               if (do_wide)
17161                 printf ("%-20s", liblist.l_name < strtab_size
17162                         ? strtab + liblist.l_name : _("<corrupt>"));
17163               else
17164                 printf ("%-20.20s", liblist.l_name < strtab_size
17165                         ? strtab + liblist.l_name : _("<corrupt>"));
17166               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
17167                       liblist.l_version, liblist.l_flags);
17168             }
17169
17170           free (elib);
17171           free (strtab);
17172         }
17173     }
17174
17175   return res;
17176 }
17177
17178 static const char *
17179 get_note_type (Filedata * filedata, unsigned e_type)
17180 {
17181   static char buff[64];
17182
17183   if (filedata->file_header.e_type == ET_CORE)
17184     switch (e_type)
17185       {
17186       case NT_AUXV:
17187         return _("NT_AUXV (auxiliary vector)");
17188       case NT_PRSTATUS:
17189         return _("NT_PRSTATUS (prstatus structure)");
17190       case NT_FPREGSET:
17191         return _("NT_FPREGSET (floating point registers)");
17192       case NT_PRPSINFO:
17193         return _("NT_PRPSINFO (prpsinfo structure)");
17194       case NT_TASKSTRUCT:
17195         return _("NT_TASKSTRUCT (task structure)");
17196       case NT_PRXFPREG:
17197         return _("NT_PRXFPREG (user_xfpregs structure)");
17198       case NT_PPC_VMX:
17199         return _("NT_PPC_VMX (ppc Altivec registers)");
17200       case NT_PPC_VSX:
17201         return _("NT_PPC_VSX (ppc VSX registers)");
17202       case NT_PPC_TAR:
17203         return _("NT_PPC_TAR (ppc TAR register)");
17204       case NT_PPC_PPR:
17205         return _("NT_PPC_PPR (ppc PPR register)");
17206       case NT_PPC_DSCR:
17207         return _("NT_PPC_DSCR (ppc DSCR register)");
17208       case NT_PPC_EBB:
17209         return _("NT_PPC_EBB (ppc EBB registers)");
17210       case NT_PPC_PMU:
17211         return _("NT_PPC_PMU (ppc PMU registers)");
17212       case NT_PPC_TM_CGPR:
17213         return _("NT_PPC_TM_CGPR (ppc checkpointed GPR registers)");
17214       case NT_PPC_TM_CFPR:
17215         return _("NT_PPC_TM_CFPR (ppc checkpointed floating point registers)");
17216       case NT_PPC_TM_CVMX:
17217         return _("NT_PPC_TM_CVMX (ppc checkpointed Altivec registers)");
17218       case NT_PPC_TM_CVSX:
17219         return _("NT_PPC_TM_CVSX (ppc checkpointed VSX registers)");
17220       case NT_PPC_TM_SPR:
17221         return _("NT_PPC_TM_SPR (ppc TM special purpose registers)");
17222       case NT_PPC_TM_CTAR:
17223         return _("NT_PPC_TM_CTAR (ppc checkpointed TAR register)");
17224       case NT_PPC_TM_CPPR:
17225         return _("NT_PPC_TM_CPPR (ppc checkpointed PPR register)");
17226       case NT_PPC_TM_CDSCR:
17227         return _("NT_PPC_TM_CDSCR (ppc checkpointed DSCR register)");
17228       case NT_386_TLS:
17229         return _("NT_386_TLS (x86 TLS information)");
17230       case NT_386_IOPERM:
17231         return _("NT_386_IOPERM (x86 I/O permissions)");
17232       case NT_X86_XSTATE:
17233         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
17234       case NT_S390_HIGH_GPRS:
17235         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
17236       case NT_S390_TIMER:
17237         return _("NT_S390_TIMER (s390 timer register)");
17238       case NT_S390_TODCMP:
17239         return _("NT_S390_TODCMP (s390 TOD comparator register)");
17240       case NT_S390_TODPREG:
17241         return _("NT_S390_TODPREG (s390 TOD programmable register)");
17242       case NT_S390_CTRS:
17243         return _("NT_S390_CTRS (s390 control registers)");
17244       case NT_S390_PREFIX:
17245         return _("NT_S390_PREFIX (s390 prefix register)");
17246       case NT_S390_LAST_BREAK:
17247         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
17248       case NT_S390_SYSTEM_CALL:
17249         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
17250       case NT_S390_TDB:
17251         return _("NT_S390_TDB (s390 transaction diagnostic block)");
17252       case NT_S390_VXRS_LOW:
17253         return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
17254       case NT_S390_VXRS_HIGH:
17255         return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
17256       case NT_S390_GS_CB:
17257         return _("NT_S390_GS_CB (s390 guarded-storage registers)");
17258       case NT_S390_GS_BC:
17259         return _("NT_S390_GS_BC (s390 guarded-storage broadcast control)");
17260       case NT_ARM_VFP:
17261         return _("NT_ARM_VFP (arm VFP registers)");
17262       case NT_ARM_TLS:
17263         return _("NT_ARM_TLS (AArch TLS registers)");
17264       case NT_ARM_HW_BREAK:
17265         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
17266       case NT_ARM_HW_WATCH:
17267         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
17268       case NT_PSTATUS:
17269         return _("NT_PSTATUS (pstatus structure)");
17270       case NT_FPREGS:
17271         return _("NT_FPREGS (floating point registers)");
17272       case NT_PSINFO:
17273         return _("NT_PSINFO (psinfo structure)");
17274       case NT_LWPSTATUS:
17275         return _("NT_LWPSTATUS (lwpstatus_t structure)");
17276       case NT_LWPSINFO:
17277         return _("NT_LWPSINFO (lwpsinfo_t structure)");
17278       case NT_WIN32PSTATUS:
17279         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
17280       case NT_SIGINFO:
17281         return _("NT_SIGINFO (siginfo_t data)");
17282       case NT_FILE:
17283         return _("NT_FILE (mapped files)");
17284       default:
17285         break;
17286       }
17287   else
17288     switch (e_type)
17289       {
17290       case NT_VERSION:
17291         return _("NT_VERSION (version)");
17292       case NT_ARCH:
17293         return _("NT_ARCH (architecture)");
17294       case NT_GNU_BUILD_ATTRIBUTE_OPEN:
17295         return _("OPEN");
17296       case NT_GNU_BUILD_ATTRIBUTE_FUNC:
17297         return _("func");
17298       default:
17299         break;
17300       }
17301
17302   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17303   return buff;
17304 }
17305
17306 static bfd_boolean
17307 print_core_note (Elf_Internal_Note *pnote)
17308 {
17309   unsigned int addr_size = is_32bit_elf ? 4 : 8;
17310   bfd_vma count, page_size;
17311   unsigned char *descdata, *filenames, *descend;
17312
17313   if (pnote->type != NT_FILE)
17314     {
17315       if (do_wide)
17316         printf ("\n");
17317       return TRUE;
17318     }
17319
17320 #ifndef BFD64
17321   if (!is_32bit_elf)
17322     {
17323       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
17324       /* Still "successful".  */
17325       return TRUE;
17326     }
17327 #endif
17328
17329   if (pnote->descsz < 2 * addr_size)
17330     {
17331       error (_("    Malformed note - too short for header\n"));
17332       return FALSE;
17333     }
17334
17335   descdata = (unsigned char *) pnote->descdata;
17336   descend = descdata + pnote->descsz;
17337
17338   if (descdata[pnote->descsz - 1] != '\0')
17339     {
17340       error (_("    Malformed note - does not end with \\0\n"));
17341       return FALSE;
17342     }
17343
17344   count = byte_get (descdata, addr_size);
17345   descdata += addr_size;
17346
17347   page_size = byte_get (descdata, addr_size);
17348   descdata += addr_size;
17349
17350   if (count > ((bfd_vma) -1 - 2 * addr_size) / (3 * addr_size)
17351       || pnote->descsz < 2 * addr_size + count * 3 * addr_size)
17352     {
17353       error (_("    Malformed note - too short for supplied file count\n"));
17354       return FALSE;
17355     }
17356
17357   printf (_("    Page size: "));
17358   print_vma (page_size, DEC);
17359   printf ("\n");
17360
17361   printf (_("    %*s%*s%*s\n"),
17362           (int) (2 + 2 * addr_size), _("Start"),
17363           (int) (4 + 2 * addr_size), _("End"),
17364           (int) (4 + 2 * addr_size), _("Page Offset"));
17365   filenames = descdata + count * 3 * addr_size;
17366   while (count-- > 0)
17367     {
17368       bfd_vma start, end, file_ofs;
17369
17370       if (filenames == descend)
17371         {
17372           error (_("    Malformed note - filenames end too early\n"));
17373           return FALSE;
17374         }
17375
17376       start = byte_get (descdata, addr_size);
17377       descdata += addr_size;
17378       end = byte_get (descdata, addr_size);
17379       descdata += addr_size;
17380       file_ofs = byte_get (descdata, addr_size);
17381       descdata += addr_size;
17382
17383       printf ("    ");
17384       print_vma (start, FULL_HEX);
17385       printf ("  ");
17386       print_vma (end, FULL_HEX);
17387       printf ("  ");
17388       print_vma (file_ofs, FULL_HEX);
17389       printf ("\n        %s\n", filenames);
17390
17391       filenames += 1 + strlen ((char *) filenames);
17392     }
17393
17394   return TRUE;
17395 }
17396
17397 static const char *
17398 get_gnu_elf_note_type (unsigned e_type)
17399 {
17400   /* NB/ Keep this switch statement in sync with print_gnu_note ().  */
17401   switch (e_type)
17402     {
17403     case NT_GNU_ABI_TAG:
17404       return _("NT_GNU_ABI_TAG (ABI version tag)");
17405     case NT_GNU_HWCAP:
17406       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
17407     case NT_GNU_BUILD_ID:
17408       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
17409     case NT_GNU_GOLD_VERSION:
17410       return _("NT_GNU_GOLD_VERSION (gold version)");
17411     case NT_GNU_PROPERTY_TYPE_0:
17412       return _("NT_GNU_PROPERTY_TYPE_0");
17413     case NT_GNU_BUILD_ATTRIBUTE_OPEN:
17414       return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
17415     case NT_GNU_BUILD_ATTRIBUTE_FUNC:
17416       return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
17417     default:
17418       {
17419         static char buff[64];
17420
17421         snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17422         return buff;
17423       }
17424     }
17425 }
17426
17427 static void
17428 decode_x86_compat_isa (unsigned int bitmask)
17429 {
17430   while (bitmask)
17431     {
17432       unsigned int bit = bitmask & (- bitmask);
17433
17434       bitmask &= ~ bit;
17435       switch (bit)
17436         {
17437         case GNU_PROPERTY_X86_COMPAT_ISA_1_486:
17438           printf ("i486");
17439           break;
17440         case GNU_PROPERTY_X86_COMPAT_ISA_1_586:
17441           printf ("586");
17442           break;
17443         case GNU_PROPERTY_X86_COMPAT_ISA_1_686:
17444           printf ("686");
17445           break;
17446         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE:
17447           printf ("SSE");
17448           break;
17449         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE2:
17450           printf ("SSE2");
17451           break;
17452         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE3:
17453           printf ("SSE3");
17454           break;
17455         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSSE3:
17456           printf ("SSSE3");
17457           break;
17458         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_1:
17459           printf ("SSE4_1");
17460           break;
17461         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_2:
17462           printf ("SSE4_2");
17463           break;
17464         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX:
17465           printf ("AVX");
17466           break;
17467         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX2:
17468           printf ("AVX2");
17469           break;
17470         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512F:
17471           printf ("AVX512F");
17472           break;
17473         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512CD:
17474           printf ("AVX512CD");
17475           break;
17476         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512ER:
17477           printf ("AVX512ER");
17478           break;
17479         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512PF:
17480           printf ("AVX512PF");
17481           break;
17482         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512VL:
17483           printf ("AVX512VL");
17484           break;
17485         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512DQ:
17486           printf ("AVX512DQ");
17487           break;
17488         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512BW:
17489           printf ("AVX512BW");
17490           break;
17491         default:
17492           printf (_("<unknown: %x>"), bit);
17493           break;
17494         }
17495       if (bitmask)
17496         printf (", ");
17497     }
17498 }
17499
17500 static void
17501 decode_x86_isa (unsigned int bitmask)
17502 {
17503   if (!bitmask)
17504     {
17505       printf (_("<None>"));
17506       return;
17507     }
17508
17509   while (bitmask)
17510     {
17511       unsigned int bit = bitmask & (- bitmask);
17512
17513       bitmask &= ~ bit;
17514       switch (bit)
17515         {
17516         case GNU_PROPERTY_X86_ISA_1_CMOV:
17517           printf ("CMOV");
17518           break;
17519         case GNU_PROPERTY_X86_ISA_1_SSE:
17520           printf ("SSE");
17521           break;
17522         case GNU_PROPERTY_X86_ISA_1_SSE2:
17523           printf ("SSE2");
17524           break;
17525         case GNU_PROPERTY_X86_ISA_1_SSE3:
17526           printf ("SSE3");
17527           break;
17528         case GNU_PROPERTY_X86_ISA_1_SSSE3:
17529           printf ("SSSE3");
17530           break;
17531         case GNU_PROPERTY_X86_ISA_1_SSE4_1:
17532           printf ("SSE4_1");
17533           break;
17534         case GNU_PROPERTY_X86_ISA_1_SSE4_2:
17535           printf ("SSE4_2");
17536           break;
17537         case GNU_PROPERTY_X86_ISA_1_AVX:
17538           printf ("AVX");
17539           break;
17540         case GNU_PROPERTY_X86_ISA_1_AVX2:
17541           printf ("AVX2");
17542           break;
17543         case GNU_PROPERTY_X86_ISA_1_FMA:
17544           printf ("FMA");
17545           break;
17546         case GNU_PROPERTY_X86_ISA_1_AVX512F:
17547           printf ("AVX512F");
17548           break;
17549         case GNU_PROPERTY_X86_ISA_1_AVX512CD:
17550           printf ("AVX512CD");
17551           break;
17552         case GNU_PROPERTY_X86_ISA_1_AVX512ER:
17553           printf ("AVX512ER");
17554           break;
17555         case GNU_PROPERTY_X86_ISA_1_AVX512PF:
17556           printf ("AVX512PF");
17557           break;
17558         case GNU_PROPERTY_X86_ISA_1_AVX512VL:
17559           printf ("AVX512VL");
17560           break;
17561         case GNU_PROPERTY_X86_ISA_1_AVX512DQ:
17562           printf ("AVX512DQ");
17563           break;
17564         case GNU_PROPERTY_X86_ISA_1_AVX512BW:
17565           printf ("AVX512BW");
17566           break;
17567         case GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS:
17568           printf ("AVX512_4FMAPS");
17569           break;
17570         case GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW:
17571           printf ("AVX512_4VNNIW");
17572           break;
17573         case GNU_PROPERTY_X86_ISA_1_AVX512_BITALG:
17574           printf ("AVX512_BITALG");
17575           break;
17576         case GNU_PROPERTY_X86_ISA_1_AVX512_IFMA:
17577           printf ("AVX512_IFMA");
17578           break;
17579         case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI:
17580           printf ("AVX512_VBMI");
17581           break;
17582         case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2:
17583           printf ("AVX512_VBMI2");
17584           break;
17585         case GNU_PROPERTY_X86_ISA_1_AVX512_VNNI:
17586           printf ("AVX512_VNNI");
17587           break;
17588         case GNU_PROPERTY_X86_ISA_1_AVX512_BF16:
17589           printf ("AVX512_BF16");
17590           break;
17591         default:
17592           printf (_("<unknown: %x>"), bit);
17593           break;
17594         }
17595       if (bitmask)
17596         printf (", ");
17597     }
17598 }
17599
17600 static void
17601 decode_x86_feature_1 (unsigned int bitmask)
17602 {
17603   if (!bitmask)
17604     {
17605       printf (_("<None>"));
17606       return;
17607     }
17608
17609   while (bitmask)
17610     {
17611       unsigned int bit = bitmask & (- bitmask);
17612
17613       bitmask &= ~ bit;
17614       switch (bit)
17615         {
17616         case GNU_PROPERTY_X86_FEATURE_1_IBT:
17617           printf ("IBT");
17618           break;
17619         case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
17620           printf ("SHSTK");
17621           break;
17622         default:
17623           printf (_("<unknown: %x>"), bit);
17624           break;
17625         }
17626       if (bitmask)
17627         printf (", ");
17628     }
17629 }
17630
17631 static void
17632 decode_x86_feature_2 (unsigned int bitmask)
17633 {
17634   if (!bitmask)
17635     {
17636       printf (_("<None>"));
17637       return;
17638     }
17639
17640   while (bitmask)
17641     {
17642       unsigned int bit = bitmask & (- bitmask);
17643
17644       bitmask &= ~ bit;
17645       switch (bit)
17646         {
17647         case GNU_PROPERTY_X86_FEATURE_2_X86:
17648           printf ("x86");
17649           break;
17650         case GNU_PROPERTY_X86_FEATURE_2_X87:
17651           printf ("x87");
17652           break;
17653         case GNU_PROPERTY_X86_FEATURE_2_MMX:
17654           printf ("MMX");
17655           break;
17656         case GNU_PROPERTY_X86_FEATURE_2_XMM:
17657           printf ("XMM");
17658           break;
17659         case GNU_PROPERTY_X86_FEATURE_2_YMM:
17660           printf ("YMM");
17661           break;
17662         case GNU_PROPERTY_X86_FEATURE_2_ZMM:
17663           printf ("ZMM");
17664           break;
17665         case GNU_PROPERTY_X86_FEATURE_2_FXSR:
17666           printf ("FXSR");
17667           break;
17668         case GNU_PROPERTY_X86_FEATURE_2_XSAVE:
17669           printf ("XSAVE");
17670           break;
17671         case GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT:
17672           printf ("XSAVEOPT");
17673           break;
17674         case GNU_PROPERTY_X86_FEATURE_2_XSAVEC:
17675           printf ("XSAVEC");
17676           break;
17677         default:
17678           printf (_("<unknown: %x>"), bit);
17679           break;
17680         }
17681       if (bitmask)
17682         printf (", ");
17683     }
17684 }
17685
17686 static void
17687 decode_aarch64_feature_1_and (unsigned int bitmask)
17688 {
17689   while (bitmask)
17690     {
17691       unsigned int bit = bitmask & (- bitmask);
17692
17693       bitmask &= ~ bit;
17694       switch (bit)
17695         {
17696         case GNU_PROPERTY_AARCH64_FEATURE_1_BTI:
17697           printf ("BTI");
17698           break;
17699
17700         case GNU_PROPERTY_AARCH64_FEATURE_1_PAC:
17701           printf ("PAC");
17702           break;
17703
17704         default:
17705           printf (_("<unknown: %x>"), bit);
17706           break;
17707         }
17708       if (bitmask)
17709         printf (", ");
17710     }
17711 }
17712
17713 static void
17714 print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
17715 {
17716   unsigned char * ptr = (unsigned char *) pnote->descdata;
17717   unsigned char * ptr_end = ptr + pnote->descsz;
17718   unsigned int    size = is_32bit_elf ? 4 : 8;
17719
17720   printf (_("      Properties: "));
17721
17722   if (pnote->descsz < 8 || (pnote->descsz % size) != 0)
17723     {
17724       printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz);
17725       return;
17726     }
17727
17728   while (ptr < ptr_end)
17729     {
17730       unsigned int j;
17731       unsigned int type;
17732       unsigned int datasz;
17733
17734       if ((size_t) (ptr_end - ptr) < 8)
17735         {
17736           printf (_("<corrupt descsz: %#lx>\n"), pnote->descsz);
17737           break;
17738         }
17739
17740       type = byte_get (ptr, 4);
17741       datasz = byte_get (ptr + 4, 4);
17742
17743       ptr += 8;
17744
17745       if (datasz > (size_t) (ptr_end - ptr))
17746         {
17747           printf (_("<corrupt type (%#x) datasz: %#x>\n"),
17748                   type, datasz);
17749           break;
17750         }
17751
17752       if (type >= GNU_PROPERTY_LOPROC && type <= GNU_PROPERTY_HIPROC)
17753         {
17754           if (filedata->file_header.e_machine == EM_X86_64
17755               || filedata->file_header.e_machine == EM_IAMCU
17756               || filedata->file_header.e_machine == EM_386)
17757             {
17758               unsigned int bitmask;
17759
17760               if (datasz == 4)
17761                 bitmask = byte_get (ptr, 4);
17762               else
17763                 bitmask = 0;
17764
17765               switch (type)
17766                 {
17767                 case GNU_PROPERTY_X86_ISA_1_USED:
17768                   if (datasz != 4)
17769                     printf (_("x86 ISA used: <corrupt length: %#x> "),
17770                             datasz);
17771                   else
17772                     {
17773                       printf ("x86 ISA used: ");
17774                       decode_x86_isa (bitmask);
17775                     }
17776                   goto next;
17777
17778                 case GNU_PROPERTY_X86_ISA_1_NEEDED:
17779                   if (datasz != 4)
17780                     printf (_("x86 ISA needed: <corrupt length: %#x> "),
17781                             datasz);
17782                   else
17783                     {
17784                       printf ("x86 ISA needed: ");
17785                       decode_x86_isa (bitmask);
17786                     }
17787                   goto next;
17788
17789                 case GNU_PROPERTY_X86_FEATURE_1_AND:
17790                   if (datasz != 4)
17791                     printf (_("x86 feature: <corrupt length: %#x> "),
17792                             datasz);
17793                   else
17794                     {
17795                       printf ("x86 feature: ");
17796                       decode_x86_feature_1 (bitmask);
17797                     }
17798                   goto next;
17799
17800                 case GNU_PROPERTY_X86_FEATURE_2_USED:
17801                   if (datasz != 4)
17802                     printf (_("x86 feature used: <corrupt length: %#x> "),
17803                             datasz);
17804                   else
17805                     {
17806                       printf ("x86 feature used: ");
17807                       decode_x86_feature_2 (bitmask);
17808                     }
17809                   goto next;
17810
17811                 case GNU_PROPERTY_X86_FEATURE_2_NEEDED:
17812                   if (datasz != 4)
17813                     printf (_("x86 feature needed: <corrupt length: %#x> "), datasz);
17814                   else
17815                     {
17816                       printf ("x86 feature needed: ");
17817                       decode_x86_feature_2 (bitmask);
17818                     }
17819                   goto next;
17820
17821                 case GNU_PROPERTY_X86_COMPAT_ISA_1_USED:
17822                   if (datasz != 4)
17823                     printf (_("x86 ISA used: <corrupt length: %#x> "),
17824                             datasz);
17825                   else
17826                     {
17827                       printf ("x86 ISA used: ");
17828                       decode_x86_compat_isa (bitmask);
17829                     }
17830                   goto next;
17831
17832                 case GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED:
17833                   if (datasz != 4)
17834                     printf (_("x86 ISA needed: <corrupt length: %#x> "),
17835                             datasz);
17836                   else
17837                     {
17838                       printf ("x86 ISA needed: ");
17839                       decode_x86_compat_isa (bitmask);
17840                     }
17841                   goto next;
17842
17843                 default:
17844                   break;
17845                 }
17846             }
17847           else if (filedata->file_header.e_machine == EM_AARCH64)
17848             {
17849               if (type == GNU_PROPERTY_AARCH64_FEATURE_1_AND)
17850                 {
17851                   printf ("AArch64 feature: ");
17852                   if (datasz != 4)
17853                     printf (_("<corrupt length: %#x> "), datasz);
17854                   else
17855                     decode_aarch64_feature_1_and (byte_get (ptr, 4));
17856                   goto next;
17857                 }
17858             }
17859         }
17860       else
17861         {
17862           switch (type)
17863             {
17864             case GNU_PROPERTY_STACK_SIZE:
17865               printf (_("stack size: "));
17866               if (datasz != size)
17867                 printf (_("<corrupt length: %#x> "), datasz);
17868               else
17869                 printf ("%#lx", (unsigned long) byte_get (ptr, size));
17870               goto next;
17871
17872             case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
17873               printf ("no copy on protected ");
17874               if (datasz)
17875                 printf (_("<corrupt length: %#x> "), datasz);
17876               goto next;
17877
17878             default:
17879               break;
17880             }
17881         }
17882
17883       if (type < GNU_PROPERTY_LOPROC)
17884         printf (_("<unknown type %#x data: "), type);
17885       else if (type < GNU_PROPERTY_LOUSER)
17886         printf (_("<procesor-specific type %#x data: "), type);
17887       else
17888         printf (_("<application-specific type %#x data: "), type);
17889       for (j = 0; j < datasz; ++j)
17890         printf ("%02x ", ptr[j] & 0xff);
17891       printf (">");
17892
17893 next:
17894       ptr += ((datasz + (size - 1)) & ~ (size - 1));
17895       if (ptr == ptr_end)
17896         break;
17897
17898       if (do_wide)
17899         printf (", ");
17900       else
17901         printf ("\n\t");
17902     }
17903
17904   printf ("\n");
17905 }
17906
17907 static bfd_boolean
17908 print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
17909 {
17910   /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type ().  */
17911   switch (pnote->type)
17912     {
17913     case NT_GNU_BUILD_ID:
17914       {
17915         unsigned long i;
17916
17917         printf (_("    Build ID: "));
17918         for (i = 0; i < pnote->descsz; ++i)
17919           printf ("%02x", pnote->descdata[i] & 0xff);
17920         printf ("\n");
17921       }
17922       break;
17923
17924     case NT_GNU_ABI_TAG:
17925       {
17926         unsigned long os, major, minor, subminor;
17927         const char *osname;
17928
17929         /* PR 17531: file: 030-599401-0.004.  */
17930         if (pnote->descsz < 16)
17931           {
17932             printf (_("    <corrupt GNU_ABI_TAG>\n"));
17933             break;
17934           }
17935
17936         os = byte_get ((unsigned char *) pnote->descdata, 4);
17937         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17938         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
17939         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
17940
17941         switch (os)
17942           {
17943           case GNU_ABI_TAG_LINUX:
17944             osname = "Linux";
17945             break;
17946           case GNU_ABI_TAG_HURD:
17947             osname = "Hurd";
17948             break;
17949           case GNU_ABI_TAG_SOLARIS:
17950             osname = "Solaris";
17951             break;
17952           case GNU_ABI_TAG_FREEBSD:
17953             osname = "FreeBSD";
17954             break;
17955           case GNU_ABI_TAG_NETBSD:
17956             osname = "NetBSD";
17957             break;
17958           case GNU_ABI_TAG_SYLLABLE:
17959             osname = "Syllable";
17960             break;
17961           case GNU_ABI_TAG_NACL:
17962             osname = "NaCl";
17963             break;
17964           default:
17965             osname = "Unknown";
17966             break;
17967           }
17968
17969         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
17970                 major, minor, subminor);
17971       }
17972       break;
17973
17974     case NT_GNU_GOLD_VERSION:
17975       {
17976         unsigned long i;
17977
17978         printf (_("    Version: "));
17979         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
17980           printf ("%c", pnote->descdata[i]);
17981         printf ("\n");
17982       }
17983       break;
17984
17985     case NT_GNU_HWCAP:
17986       {
17987         unsigned long num_entries, mask;
17988
17989         /* Hardware capabilities information.  Word 0 is the number of entries.
17990            Word 1 is a bitmask of enabled entries.  The rest of the descriptor
17991            is a series of entries, where each entry is a single byte followed
17992            by a nul terminated string.  The byte gives the bit number to test
17993            if enabled in the bitmask.  */
17994         printf (_("      Hardware Capabilities: "));
17995         if (pnote->descsz < 8)
17996           {
17997             error (_("<corrupt GNU_HWCAP>\n"));
17998             return FALSE;
17999           }
18000         num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
18001         mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
18002         printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
18003         /* FIXME: Add code to display the entries... */
18004       }
18005       break;
18006
18007     case NT_GNU_PROPERTY_TYPE_0:
18008       print_gnu_property_note (filedata, pnote);
18009       break;
18010
18011     default:
18012       /* Handle unrecognised types.  An error message should have already been
18013          created by get_gnu_elf_note_type(), so all that we need to do is to
18014          display the data.  */
18015       {
18016         unsigned long i;
18017
18018         printf (_("    Description data: "));
18019         for (i = 0; i < pnote->descsz; ++i)
18020           printf ("%02x ", pnote->descdata[i] & 0xff);
18021         printf ("\n");
18022       }
18023       break;
18024     }
18025
18026   return TRUE;
18027 }
18028
18029 static const char *
18030 get_v850_elf_note_type (enum v850_notes n_type)
18031 {
18032   static char buff[64];
18033
18034   switch (n_type)
18035     {
18036     case V850_NOTE_ALIGNMENT:  return _("Alignment of 8-byte objects");
18037     case V850_NOTE_DATA_SIZE:  return _("Sizeof double and long double");
18038     case V850_NOTE_FPU_INFO:   return _("Type of FPU support needed");
18039     case V850_NOTE_SIMD_INFO:  return _("Use of SIMD instructions");
18040     case V850_NOTE_CACHE_INFO: return _("Use of cache");
18041     case V850_NOTE_MMU_INFO:   return _("Use of MMU");
18042     default:
18043       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
18044       return buff;
18045     }
18046 }
18047
18048 static bfd_boolean
18049 print_v850_note (Elf_Internal_Note * pnote)
18050 {
18051   unsigned int val;
18052
18053   if (pnote->descsz != 4)
18054     return FALSE;
18055
18056   val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
18057
18058   if (val == 0)
18059     {
18060       printf (_("not set\n"));
18061       return TRUE;
18062     }
18063
18064   switch (pnote->type)
18065     {
18066     case V850_NOTE_ALIGNMENT:
18067       switch (val)
18068         {
18069         case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return TRUE;
18070         case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return TRUE;
18071         }
18072       break;
18073
18074     case V850_NOTE_DATA_SIZE:
18075       switch (val)
18076         {
18077         case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return TRUE;
18078         case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return TRUE;
18079         }
18080       break;
18081
18082     case V850_NOTE_FPU_INFO:
18083       switch (val)
18084         {
18085         case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return TRUE;
18086         case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return TRUE;
18087         }
18088       break;
18089
18090     case V850_NOTE_MMU_INFO:
18091     case V850_NOTE_CACHE_INFO:
18092     case V850_NOTE_SIMD_INFO:
18093       if (val == EF_RH850_SIMD)
18094         {
18095           printf (_("yes\n"));
18096           return TRUE;
18097         }
18098       break;
18099
18100     default:
18101       /* An 'unknown note type' message will already have been displayed.  */
18102       break;
18103     }
18104
18105   printf (_("unknown value: %x\n"), val);
18106   return FALSE;
18107 }
18108
18109 static bfd_boolean
18110 process_netbsd_elf_note (Elf_Internal_Note * pnote)
18111 {
18112   unsigned int version;
18113
18114   switch (pnote->type)
18115     {
18116     case NT_NETBSD_IDENT:
18117       version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
18118       if ((version / 10000) % 100)
18119         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
18120                 version, version / 100000000, (version / 1000000) % 100,
18121                 (version / 10000) % 100 > 26 ? "Z" : "",
18122                 'A' + (version / 10000) % 26);
18123       else
18124         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
18125                 version, version / 100000000, (version / 1000000) % 100,
18126                 (version / 100) % 100);
18127       return TRUE;
18128
18129     case NT_NETBSD_MARCH:
18130       printf ("  NetBSD\t\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
18131               pnote->descdata);
18132       return TRUE;
18133
18134 #ifdef   NT_NETBSD_PAX
18135     case NT_NETBSD_PAX:
18136       version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
18137       printf ("  NetBSD\t\t0x%08lx\tPaX <%s%s%s%s%s%s>\n", pnote->descsz,
18138               ((version & NT_NETBSD_PAX_MPROTECT) ? "+mprotect" : ""),
18139               ((version & NT_NETBSD_PAX_NOMPROTECT) ? "-mprotect" : ""),
18140               ((version & NT_NETBSD_PAX_GUARD) ? "+guard" : ""),
18141               ((version & NT_NETBSD_PAX_NOGUARD) ? "-guard" : ""),
18142               ((version & NT_NETBSD_PAX_ASLR) ? "+ASLR" : ""),
18143               ((version & NT_NETBSD_PAX_NOASLR) ? "-ASLR" : ""));
18144       return TRUE;
18145 #endif
18146
18147     default:
18148       printf ("  NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
18149               pnote->type);
18150       return FALSE;
18151     }
18152 }
18153
18154 static const char *
18155 get_freebsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
18156 {
18157   switch (e_type)
18158     {
18159     case NT_FREEBSD_THRMISC:
18160       return _("NT_THRMISC (thrmisc structure)");
18161     case NT_FREEBSD_PROCSTAT_PROC:
18162       return _("NT_PROCSTAT_PROC (proc data)");
18163     case NT_FREEBSD_PROCSTAT_FILES:
18164       return _("NT_PROCSTAT_FILES (files data)");
18165     case NT_FREEBSD_PROCSTAT_VMMAP:
18166       return _("NT_PROCSTAT_VMMAP (vmmap data)");
18167     case NT_FREEBSD_PROCSTAT_GROUPS:
18168       return _("NT_PROCSTAT_GROUPS (groups data)");
18169     case NT_FREEBSD_PROCSTAT_UMASK:
18170       return _("NT_PROCSTAT_UMASK (umask data)");
18171     case NT_FREEBSD_PROCSTAT_RLIMIT:
18172       return _("NT_PROCSTAT_RLIMIT (rlimit data)");
18173     case NT_FREEBSD_PROCSTAT_OSREL:
18174       return _("NT_PROCSTAT_OSREL (osreldate data)");
18175     case NT_FREEBSD_PROCSTAT_PSSTRINGS:
18176       return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
18177     case NT_FREEBSD_PROCSTAT_AUXV:
18178       return _("NT_PROCSTAT_AUXV (auxv data)");
18179     case NT_FREEBSD_PTLWPINFO:
18180       return _("NT_PTLWPINFO (ptrace_lwpinfo structure)");
18181     }
18182   return get_note_type (filedata, e_type);
18183 }
18184
18185 static const char *
18186 get_netbsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
18187 {
18188   static char buff[64];
18189
18190   switch (e_type)
18191     {
18192     case NT_NETBSDCORE_PROCINFO:
18193       /* NetBSD core "procinfo" structure.  */
18194       return _("NetBSD procinfo structure");
18195
18196 #ifdef NT_NETBSDCORE_AUXV
18197     case NT_NETBSDCORE_AUXV:
18198       return _("NetBSD ELF auxiliary vector data");
18199 #endif
18200
18201     default:
18202       /* As of Jan 2002 there are no other machine-independent notes
18203          defined for NetBSD core files.  If the note type is less
18204          than the start of the machine-dependent note types, we don't
18205          understand it.  */
18206
18207       if (e_type < NT_NETBSDCORE_FIRSTMACH)
18208         {
18209           snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
18210           return buff;
18211         }
18212       break;
18213     }
18214
18215   switch (filedata->file_header.e_machine)
18216     {
18217     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
18218        and PT_GETFPREGS == mach+2.  */
18219
18220     case EM_OLD_ALPHA:
18221     case EM_ALPHA:
18222     case EM_SPARC:
18223     case EM_SPARC32PLUS:
18224     case EM_SPARCV9:
18225       switch (e_type)
18226         {
18227         case NT_NETBSDCORE_FIRSTMACH + 0:
18228           return _("PT_GETREGS (reg structure)");
18229         case NT_NETBSDCORE_FIRSTMACH + 2:
18230           return _("PT_GETFPREGS (fpreg structure)");
18231         default:
18232           break;
18233         }
18234       break;
18235
18236     /* On SuperH, PT_GETREGS == mach+3 and PT_GETFPREGS == mach+5.
18237        There's also old PT___GETREGS40 == mach + 1 for old reg
18238        structure which lacks GBR.  */
18239     case EM_SH:
18240       switch (e_type)
18241         {
18242         case NT_NETBSDCORE_FIRSTMACH + 1:
18243           return _("PT___GETREGS40 (old reg structure)");
18244         case NT_NETBSDCORE_FIRSTMACH + 3:
18245           return _("PT_GETREGS (reg structure)");
18246         case NT_NETBSDCORE_FIRSTMACH + 5:
18247           return _("PT_GETFPREGS (fpreg structure)");
18248         default:
18249           break;
18250         }
18251       break;
18252
18253     /* On all other arch's, PT_GETREGS == mach+1 and
18254        PT_GETFPREGS == mach+3.  */
18255     default:
18256       switch (e_type)
18257         {
18258         case NT_NETBSDCORE_FIRSTMACH + 1:
18259           return _("PT_GETREGS (reg structure)");
18260         case NT_NETBSDCORE_FIRSTMACH + 3:
18261           return _("PT_GETFPREGS (fpreg structure)");
18262         default:
18263           break;
18264         }
18265     }
18266
18267   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
18268             e_type - NT_NETBSDCORE_FIRSTMACH);
18269   return buff;
18270 }
18271
18272 static const char *
18273 get_stapsdt_note_type (unsigned e_type)
18274 {
18275   static char buff[64];
18276
18277   switch (e_type)
18278     {
18279     case NT_STAPSDT:
18280       return _("NT_STAPSDT (SystemTap probe descriptors)");
18281
18282     default:
18283       break;
18284     }
18285
18286   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
18287   return buff;
18288 }
18289
18290 static bfd_boolean
18291 print_stapsdt_note (Elf_Internal_Note *pnote)
18292 {
18293   size_t len, maxlen;
18294   unsigned long addr_size = is_32bit_elf ? 4 : 8;
18295   char *data = pnote->descdata;
18296   char *data_end = pnote->descdata + pnote->descsz;
18297   bfd_vma pc, base_addr, semaphore;
18298   char *provider, *probe, *arg_fmt;
18299
18300   if (pnote->descsz < (addr_size * 3))
18301     goto stapdt_note_too_small;
18302
18303   pc = byte_get ((unsigned char *) data, addr_size);
18304   data += addr_size;
18305
18306   base_addr = byte_get ((unsigned char *) data, addr_size);
18307   data += addr_size;
18308
18309   semaphore = byte_get ((unsigned char *) data, addr_size);
18310   data += addr_size;
18311
18312   if (data >= data_end)
18313     goto stapdt_note_too_small;
18314   maxlen = data_end - data;
18315   len = strnlen (data, maxlen);
18316   if (len < maxlen)
18317     {
18318       provider = data;
18319       data += len + 1;
18320     }
18321   else
18322     goto stapdt_note_too_small;
18323
18324   if (data >= data_end)
18325     goto stapdt_note_too_small;
18326   maxlen = data_end - data;
18327   len = strnlen (data, maxlen);
18328   if (len < maxlen)
18329     {
18330       probe = data;
18331       data += len + 1;
18332     }
18333   else
18334     goto stapdt_note_too_small;
18335
18336   if (data >= data_end)
18337     goto stapdt_note_too_small;
18338   maxlen = data_end - data;
18339   len = strnlen (data, maxlen);
18340   if (len < maxlen)
18341     {
18342       arg_fmt = data;
18343       data += len + 1;
18344     }
18345   else
18346     goto stapdt_note_too_small;
18347
18348   printf (_("    Provider: %s\n"), provider);
18349   printf (_("    Name: %s\n"), probe);
18350   printf (_("    Location: "));
18351   print_vma (pc, FULL_HEX);
18352   printf (_(", Base: "));
18353   print_vma (base_addr, FULL_HEX);
18354   printf (_(", Semaphore: "));
18355   print_vma (semaphore, FULL_HEX);
18356   printf ("\n");
18357   printf (_("    Arguments: %s\n"), arg_fmt);
18358
18359   return data == data_end;
18360
18361  stapdt_note_too_small:
18362   printf (_("  <corrupt - note is too small>\n"));
18363   error (_("corrupt stapdt note - the data size is too small\n"));
18364   return FALSE;
18365 }
18366
18367 static const char *
18368 get_ia64_vms_note_type (unsigned e_type)
18369 {
18370   static char buff[64];
18371
18372   switch (e_type)
18373     {
18374     case NT_VMS_MHD:
18375       return _("NT_VMS_MHD (module header)");
18376     case NT_VMS_LNM:
18377       return _("NT_VMS_LNM (language name)");
18378     case NT_VMS_SRC:
18379       return _("NT_VMS_SRC (source files)");
18380     case NT_VMS_TITLE:
18381       return "NT_VMS_TITLE";
18382     case NT_VMS_EIDC:
18383       return _("NT_VMS_EIDC (consistency check)");
18384     case NT_VMS_FPMODE:
18385       return _("NT_VMS_FPMODE (FP mode)");
18386     case NT_VMS_LINKTIME:
18387       return "NT_VMS_LINKTIME";
18388     case NT_VMS_IMGNAM:
18389       return _("NT_VMS_IMGNAM (image name)");
18390     case NT_VMS_IMGID:
18391       return _("NT_VMS_IMGID (image id)");
18392     case NT_VMS_LINKID:
18393       return _("NT_VMS_LINKID (link id)");
18394     case NT_VMS_IMGBID:
18395       return _("NT_VMS_IMGBID (build id)");
18396     case NT_VMS_GSTNAM:
18397       return _("NT_VMS_GSTNAM (sym table name)");
18398     case NT_VMS_ORIG_DYN:
18399       return "NT_VMS_ORIG_DYN";
18400     case NT_VMS_PATCHTIME:
18401       return "NT_VMS_PATCHTIME";
18402     default:
18403       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
18404       return buff;
18405     }
18406 }
18407
18408 static bfd_boolean
18409 print_ia64_vms_note (Elf_Internal_Note * pnote)
18410 {
18411   int maxlen = pnote->descsz;
18412
18413   if (maxlen < 2 || (unsigned long) maxlen != pnote->descsz)
18414     goto desc_size_fail;
18415
18416   switch (pnote->type)
18417     {
18418     case NT_VMS_MHD:
18419       if (maxlen <= 36)
18420         goto desc_size_fail;
18421
18422       int l = (int) strnlen (pnote->descdata + 34, maxlen - 34);
18423
18424       printf (_("    Creation date  : %.17s\n"), pnote->descdata);
18425       printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
18426       if (l + 34 < maxlen)
18427         {
18428           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
18429           if (l + 35 < maxlen)
18430             printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
18431           else
18432             printf (_("    Module version : <missing>\n"));
18433         }
18434       else
18435         {
18436           printf (_("    Module name    : <missing>\n"));
18437           printf (_("    Module version : <missing>\n"));
18438         }
18439       break;
18440
18441     case NT_VMS_LNM:
18442       printf (_("   Language: %.*s\n"), maxlen, pnote->descdata);
18443       break;
18444
18445 #ifdef BFD64
18446     case NT_VMS_FPMODE:
18447       printf (_("   Floating Point mode: "));
18448       if (maxlen < 8)
18449         goto desc_size_fail;
18450       /* FIXME: Generate an error if descsz > 8 ?  */
18451
18452       printf ("0x%016" BFD_VMA_FMT "x\n",
18453               (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
18454       break;
18455
18456     case NT_VMS_LINKTIME:
18457       printf (_("   Link time: "));
18458       if (maxlen < 8)
18459         goto desc_size_fail;
18460       /* FIXME: Generate an error if descsz > 8 ?  */
18461
18462       print_vms_time
18463         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
18464       printf ("\n");
18465       break;
18466
18467     case NT_VMS_PATCHTIME:
18468       printf (_("   Patch time: "));
18469       if (maxlen < 8)
18470         goto desc_size_fail;
18471       /* FIXME: Generate an error if descsz > 8 ?  */
18472
18473       print_vms_time
18474         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
18475       printf ("\n");
18476       break;
18477
18478     case NT_VMS_ORIG_DYN:
18479       if (maxlen < 34)
18480         goto desc_size_fail;
18481
18482       printf (_("   Major id: %u,  minor id: %u\n"),
18483               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
18484               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
18485       printf (_("   Last modified  : "));
18486       print_vms_time
18487         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
18488       printf (_("\n   Link flags  : "));
18489       printf ("0x%016" BFD_VMA_FMT "x\n",
18490               (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
18491       printf (_("   Header flags: 0x%08x\n"),
18492               (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
18493       printf (_("   Image id    : %.*s\n"), maxlen - 32, pnote->descdata + 32);
18494       break;
18495 #endif
18496
18497     case NT_VMS_IMGNAM:
18498       printf (_("    Image name: %.*s\n"), maxlen, pnote->descdata);
18499       break;
18500
18501     case NT_VMS_GSTNAM:
18502       printf (_("    Global symbol table name: %.*s\n"), maxlen, pnote->descdata);
18503       break;
18504
18505     case NT_VMS_IMGID:
18506       printf (_("    Image id: %.*s\n"), maxlen, pnote->descdata);
18507       break;
18508
18509     case NT_VMS_LINKID:
18510       printf (_("    Linker id: %.*s\n"), maxlen, pnote->descdata);
18511       break;
18512
18513     default:
18514       return FALSE;
18515     }
18516
18517   return TRUE;
18518
18519  desc_size_fail:
18520   printf (_("  <corrupt - data size is too small>\n"));
18521   error (_("corrupt IA64 note: data size is too small\n"));
18522   return FALSE;
18523 }
18524
18525 /* Find the symbol associated with a build attribute that is attached
18526    to address OFFSET.  If PNAME is non-NULL then store the name of
18527    the symbol (if found) in the provided pointer,  Returns NULL if a
18528    symbol could not be found.  */
18529
18530 static Elf_Internal_Sym *
18531 get_symbol_for_build_attribute (Filedata *       filedata,
18532                                 unsigned long    offset,
18533                                 bfd_boolean      is_open_attr,
18534                                 const char **    pname)
18535 {
18536   static Filedata *         saved_filedata = NULL;
18537   static char *             strtab;
18538   static unsigned long      strtablen;
18539   static Elf_Internal_Sym * symtab;
18540   static unsigned long      nsyms;
18541   Elf_Internal_Sym *        saved_sym = NULL;
18542   Elf_Internal_Sym *        sym;
18543
18544   if (filedata->section_headers != NULL
18545       && (saved_filedata == NULL || filedata != saved_filedata))
18546     {
18547       Elf_Internal_Shdr * symsec;
18548
18549       /* Load the symbol and string sections.  */
18550       for (symsec = filedata->section_headers;
18551            symsec < filedata->section_headers + filedata->file_header.e_shnum;
18552            symsec ++)
18553         {
18554           if (symsec->sh_type == SHT_SYMTAB)
18555             {
18556               symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
18557
18558               if (symsec->sh_link < filedata->file_header.e_shnum)
18559                 {
18560                   Elf_Internal_Shdr * strtab_sec = filedata->section_headers + symsec->sh_link;
18561
18562                   strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
18563                                               1, strtab_sec->sh_size,
18564                                               _("string table"));
18565                   strtablen = strtab != NULL ? strtab_sec->sh_size : 0;
18566                 }
18567             }
18568         }
18569       saved_filedata = filedata;
18570     }
18571
18572   if (symtab == NULL || strtab == NULL)
18573     return NULL;
18574
18575   /* Find a symbol whose value matches offset.  */
18576   for (sym = symtab; sym < symtab + nsyms; sym ++)
18577     if (sym->st_value == offset)
18578       {
18579         if (sym->st_name >= strtablen)
18580           /* Huh ?  This should not happen.  */
18581           continue;
18582
18583         if (strtab[sym->st_name] == 0)
18584           continue;
18585
18586         /* The AArch64 and ARM architectures define mapping symbols
18587            (eg $d, $x, $t) which we want to ignore.  */
18588         if (strtab[sym->st_name] == '$'
18589             && strtab[sym->st_name + 1] != 0
18590             && strtab[sym->st_name + 2] == 0)
18591           continue;
18592
18593         if (is_open_attr)
18594           {
18595             /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
18596                and FILE or OBJECT symbols over NOTYPE symbols.  We skip
18597                FUNC symbols entirely.  */
18598             switch (ELF_ST_TYPE (sym->st_info))
18599               {
18600               case STT_OBJECT:
18601               case STT_FILE:
18602                 saved_sym = sym;
18603                 if (sym->st_size)
18604                   {
18605                     /* If the symbol has a size associated
18606                        with it then we can stop searching.  */
18607                     sym = symtab + nsyms;
18608                   }
18609                 continue;
18610
18611               case STT_FUNC:
18612                 /* Ignore function symbols.  */
18613                 continue;
18614
18615               default:
18616                 break;
18617               }
18618
18619             switch (ELF_ST_BIND (sym->st_info))
18620               {
18621               case STB_GLOBAL:
18622                 if (saved_sym == NULL
18623                     || ELF_ST_TYPE (saved_sym->st_info) != STT_OBJECT)
18624                   saved_sym = sym;
18625                 break;
18626
18627               case STB_LOCAL:
18628                 if (saved_sym == NULL)
18629                   saved_sym = sym;
18630                 break;
18631
18632               default:
18633                 break;
18634               }
18635           }
18636         else
18637           {
18638             if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
18639               continue;
18640
18641             saved_sym = sym;
18642             break;
18643           }
18644       }
18645
18646   if (saved_sym && pname)
18647     * pname = strtab + saved_sym->st_name;
18648
18649   return saved_sym;
18650 }
18651
18652 /* Returns true iff addr1 and addr2 are in the same section.  */
18653
18654 static bfd_boolean
18655 same_section (Filedata * filedata, unsigned long addr1, unsigned long addr2)
18656 {
18657   Elf_Internal_Shdr * a1;
18658   Elf_Internal_Shdr * a2;
18659
18660   a1 = find_section_by_address (filedata, addr1);
18661   a2 = find_section_by_address (filedata, addr2);
18662
18663   return a1 == a2 && a1 != NULL;
18664 }
18665
18666 static bfd_boolean
18667 print_gnu_build_attribute_description (Elf_Internal_Note *  pnote,
18668                                        Filedata *           filedata)
18669 {
18670   static unsigned long  global_offset = 0;
18671   static unsigned long  global_end = 0;
18672   static unsigned long  func_offset = 0;
18673   static unsigned long  func_end = 0;
18674
18675   Elf_Internal_Sym *    sym;
18676   const char *          name;
18677   unsigned long         start;
18678   unsigned long         end;
18679   bfd_boolean           is_open_attr = pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN;
18680
18681   switch (pnote->descsz)
18682     {
18683     case 0:
18684       /* A zero-length description means that the range of
18685          the previous note of the same type should be used.  */
18686       if (is_open_attr)
18687         {
18688           if (global_end > global_offset)
18689             printf (_("    Applies to region from %#lx to %#lx\n"),
18690                     global_offset, global_end);
18691           else
18692             printf (_("    Applies to region from %#lx\n"), global_offset);
18693         }
18694       else
18695         {
18696           if (func_end > func_offset)
18697             printf (_("    Applies to region from %#lx to %#lx\n"), func_offset, func_end);
18698           else
18699             printf (_("    Applies to region from %#lx\n"), func_offset);
18700         }
18701       return TRUE;
18702
18703     case 4:
18704       start = byte_get ((unsigned char *) pnote->descdata, 4);
18705       end = 0;
18706       break;
18707
18708     case 8:
18709       if (is_32bit_elf)
18710         {
18711           /* FIXME: We should check that version 3+ notes are being used here...  */
18712           start = byte_get ((unsigned char *) pnote->descdata, 4);
18713           end = byte_get ((unsigned char *) pnote->descdata + 4, 4);
18714         }
18715       else
18716         {
18717           start = byte_get ((unsigned char *) pnote->descdata, 8);
18718           end = 0;
18719         }
18720       break;
18721
18722     case 16:
18723       start = byte_get ((unsigned char *) pnote->descdata, 8);
18724       end = byte_get ((unsigned char *) pnote->descdata + 8, 8);
18725       break;
18726
18727     default:
18728       error (_("    <invalid description size: %lx>\n"), pnote->descsz);
18729       printf (_("    <invalid descsz>"));
18730       return FALSE;
18731     }
18732
18733   name = NULL;
18734   sym = get_symbol_for_build_attribute (filedata, start, is_open_attr, & name);
18735   /* As of version 5 of the annobin plugin, filename symbols are biased by 2
18736      in order to avoid them being confused with the start address of the
18737      first function in the file...  */
18738   if (sym == NULL && is_open_attr)
18739     sym = get_symbol_for_build_attribute (filedata, start + 2, is_open_attr,
18740                                           & name);
18741
18742   if (end == 0 && sym != NULL && sym->st_size > 0)
18743     end = start + sym->st_size;
18744
18745   if (is_open_attr)
18746     {
18747       /* FIXME: Need to properly allow for section alignment.
18748          16 is just the alignment used on x86_64.  */
18749       if (global_end > 0
18750           && start > BFD_ALIGN (global_end, 16)
18751           /* Build notes are not guaranteed to be organised in order of
18752              increasing address, but we should find the all of the notes
18753              for one section in the same place.  */
18754           && same_section (filedata, start, global_end))
18755         warn (_("Gap in build notes detected from %#lx to %#lx\n"),
18756               global_end + 1, start - 1);
18757
18758       printf (_("    Applies to region from %#lx"), start);
18759       global_offset = start;
18760
18761       if (end)
18762         {
18763           printf (_(" to %#lx"), end);
18764           global_end = end;
18765         }
18766     }
18767   else
18768     {
18769       printf (_("    Applies to region from %#lx"), start);
18770       func_offset = start;
18771
18772       if (end)
18773         {
18774           printf (_(" to %#lx"), end);
18775           func_end = end;
18776         }
18777     }
18778
18779   if (sym && name)
18780     printf (_(" (%s)"), name);
18781
18782   printf ("\n");
18783   return TRUE;
18784 }
18785
18786 static bfd_boolean
18787 print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
18788 {
18789   static const char string_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_STRING, 0 };
18790   static const char number_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC, 0 };
18791   static const char bool_expected [3] = { GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE, GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE, 0 };
18792   char         name_type;
18793   char         name_attribute;
18794   const char * expected_types;
18795   const char * name = pnote->namedata;
18796   const char * text;
18797   signed int   left;
18798
18799   if (name == NULL || pnote->namesz < 2)
18800     {
18801       error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
18802       print_symbol (-20, _("  <corrupt name>"));
18803       return FALSE;
18804     }
18805
18806   if (do_wide)
18807     left = 28;
18808   else
18809     left = 20;
18810
18811   /* Version 2 of the spec adds a "GA" prefix to the name field.  */
18812   if (name[0] == 'G' && name[1] == 'A')
18813     {
18814       if (pnote->namesz < 4)
18815         {
18816           error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
18817           print_symbol (-20, _("  <corrupt name>"));
18818           return FALSE;
18819         }
18820
18821       printf ("GA");
18822       name += 2;
18823       left -= 2;
18824     }
18825
18826   switch ((name_type = * name))
18827     {
18828     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18829     case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
18830     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
18831     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
18832       printf ("%c", * name);
18833       left --;
18834       break;
18835     default:
18836       error (_("unrecognised attribute type in name field: %d\n"), name_type);
18837       print_symbol (-20, _("<unknown name type>"));
18838       return FALSE;
18839     }
18840
18841   ++ name;
18842   text = NULL;
18843
18844   switch ((name_attribute = * name))
18845     {
18846     case GNU_BUILD_ATTRIBUTE_VERSION:
18847       text = _("<version>");
18848       expected_types = string_expected;
18849       ++ name;
18850       break;
18851     case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18852       text = _("<stack prot>");
18853       expected_types = "!+*";
18854       ++ name;
18855       break;
18856     case GNU_BUILD_ATTRIBUTE_RELRO:
18857       text = _("<relro>");
18858       expected_types = bool_expected;
18859       ++ name;
18860       break;
18861     case GNU_BUILD_ATTRIBUTE_STACK_SIZE:
18862       text = _("<stack size>");
18863       expected_types = number_expected;
18864       ++ name;
18865       break;
18866     case GNU_BUILD_ATTRIBUTE_TOOL:
18867       text = _("<tool>");
18868       expected_types = string_expected;
18869       ++ name;
18870       break;
18871     case GNU_BUILD_ATTRIBUTE_ABI:
18872       text = _("<ABI>");
18873       expected_types = "$*";
18874       ++ name;
18875       break;
18876     case GNU_BUILD_ATTRIBUTE_PIC:
18877       text = _("<PIC>");
18878       expected_types = number_expected;
18879       ++ name;
18880       break;
18881     case GNU_BUILD_ATTRIBUTE_SHORT_ENUM:
18882       text = _("<short enum>");
18883       expected_types = bool_expected;
18884       ++ name;
18885       break;
18886     default:
18887       if (ISPRINT (* name))
18888         {
18889           int len = strnlen (name, pnote->namesz - (name - pnote->namedata)) + 1;
18890
18891           if (len > left && ! do_wide)
18892             len = left;
18893           printf ("%.*s:", len, name);
18894           left -= len;
18895           name += len;
18896         }
18897       else
18898         {
18899           static char tmpbuf [128];
18900
18901           error (_("unrecognised byte in name field: %d\n"), * name);
18902           sprintf (tmpbuf, _("<unknown:_%d>"), * name);
18903           text = tmpbuf;
18904           name ++;
18905         }
18906       expected_types = "*$!+";
18907       break;
18908     }
18909
18910   if (text)
18911     left -= printf ("%s", text);
18912
18913   if (strchr (expected_types, name_type) == NULL)
18914     warn (_("attribute does not have an expected type (%c)\n"), name_type);
18915
18916   if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
18917     {
18918       error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
18919              (unsigned long) pnote->namesz,
18920              (long) (name - pnote->namedata));
18921       return FALSE;
18922     }
18923
18924   if (left < 1 && ! do_wide)
18925     return TRUE;
18926
18927   switch (name_type)
18928     {
18929     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18930       {
18931         unsigned int        bytes;
18932         unsigned long long  val = 0;
18933         unsigned int        shift = 0;
18934         char *              decoded = NULL;
18935
18936         bytes = pnote->namesz - (name - pnote->namedata);
18937         if (bytes > 0)
18938           /* The -1 is because the name field is always 0 terminated, and we
18939              want to be able to ensure that the shift in the while loop below
18940              will not overflow.  */
18941           -- bytes;
18942
18943         if (bytes > sizeof (val))
18944           {
18945             error (_("corrupt numeric name field: too many bytes in the value: %x\n"),
18946                    bytes);
18947             bytes = sizeof (val);
18948           }
18949         /* We do not bother to warn if bytes == 0 as this can
18950            happen with some early versions of the gcc plugin.  */
18951
18952         while (bytes --)
18953           {
18954             unsigned long byte = (* name ++) & 0xff;
18955
18956             val |= byte << shift;
18957             shift += 8;
18958           }
18959
18960         switch (name_attribute)
18961           {
18962           case GNU_BUILD_ATTRIBUTE_PIC:
18963             switch (val)
18964               {
18965               case 0: decoded = "static"; break;
18966               case 1: decoded = "pic"; break;
18967               case 2: decoded = "PIC"; break;
18968               case 3: decoded = "pie"; break;
18969               case 4: decoded = "PIE"; break;
18970               default: break;
18971               }
18972             break;
18973           case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18974             switch (val)
18975               {
18976                 /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c.  */
18977               case 0: decoded = "off"; break;
18978               case 1: decoded = "on"; break;
18979               case 2: decoded = "all"; break;
18980               case 3: decoded = "strong"; break;
18981               case 4: decoded = "explicit"; break;
18982               default: break;
18983               }
18984             break;
18985           default:
18986             break;
18987           }
18988
18989         if (decoded != NULL)
18990           {
18991             print_symbol (-left, decoded);
18992             left = 0;
18993           }
18994         else if (val == 0)
18995           {
18996             printf ("0x0");
18997             left -= 3;
18998           }
18999         else
19000           {
19001             if (do_wide)
19002               left -= printf ("0x%llx", val);
19003             else
19004               left -= printf ("0x%-.*llx", left, val);
19005           }
19006       }
19007       break;
19008     case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
19009       left -= print_symbol (- left, name);
19010       break;
19011     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
19012       left -= print_symbol (- left, "true");
19013       break;
19014     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
19015       left -= print_symbol (- left, "false");
19016       break;
19017     }
19018
19019   if (do_wide && left > 0)
19020     printf ("%-*s", left, " ");
19021
19022   return TRUE;
19023 }
19024
19025 /* Note that by the ELF standard, the name field is already null byte
19026    terminated, and namesz includes the terminating null byte.
19027    I.E. the value of namesz for the name "FSF" is 4.
19028
19029    If the value of namesz is zero, there is no name present.  */
19030
19031 static bfd_boolean
19032 process_note (Elf_Internal_Note *  pnote,
19033               Filedata *           filedata)
19034 {
19035   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
19036   const char * nt;
19037
19038   if (pnote->namesz == 0)
19039     /* If there is no note name, then use the default set of
19040        note type strings.  */
19041     nt = get_note_type (filedata, pnote->type);
19042
19043   else if (const_strneq (pnote->namedata, "GNU"))
19044     /* GNU-specific object file notes.  */
19045     nt = get_gnu_elf_note_type (pnote->type);
19046
19047   else if (const_strneq (pnote->namedata, "FreeBSD"))
19048     /* FreeBSD-specific core file notes.  */
19049     nt = get_freebsd_elfcore_note_type (filedata, pnote->type);
19050
19051   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
19052     /* NetBSD-specific core file notes.  */
19053     nt = get_netbsd_elfcore_note_type (filedata, pnote->type);
19054
19055   else if (const_strneq (pnote->namedata, "NetBSD"))
19056     /* NetBSD-specific core file notes.  */
19057     return process_netbsd_elf_note (pnote);
19058
19059   else if (const_strneq (pnote->namedata, "PaX"))
19060     /* NetBSD-specific core file notes.  */
19061     return process_netbsd_elf_note (pnote);
19062
19063   else if (strneq (pnote->namedata, "SPU/", 4))
19064     {
19065       /* SPU-specific core file notes.  */
19066       nt = pnote->namedata + 4;
19067       name = "SPU";
19068     }
19069
19070   else if (const_strneq (pnote->namedata, "IPF/VMS"))
19071     /* VMS/ia64-specific file notes.  */
19072     nt = get_ia64_vms_note_type (pnote->type);
19073
19074   else if (const_strneq (pnote->namedata, "stapsdt"))
19075     nt = get_stapsdt_note_type (pnote->type);
19076
19077   else
19078     /* Don't recognize this note name; just use the default set of
19079        note type strings.  */
19080     nt = get_note_type (filedata, pnote->type);
19081
19082   printf ("  ");
19083
19084   if (((const_strneq (pnote->namedata, "GA")
19085         && strchr ("*$!+", pnote->namedata[2]) != NULL)
19086        || strchr ("*$!+", pnote->namedata[0]) != NULL)
19087       && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
19088           || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
19089     print_gnu_build_attribute_name (pnote);
19090   else
19091     print_symbol (-20, name);
19092
19093   if (do_wide)
19094     printf (" 0x%08lx\t%s\t", pnote->descsz, nt);
19095   else
19096     printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
19097
19098   if (const_strneq (pnote->namedata, "IPF/VMS"))
19099     return print_ia64_vms_note (pnote);
19100   else if (const_strneq (pnote->namedata, "GNU"))
19101     return print_gnu_note (filedata, pnote);
19102   else if (const_strneq (pnote->namedata, "stapsdt"))
19103     return print_stapsdt_note (pnote);
19104   else if (const_strneq (pnote->namedata, "CORE"))
19105     return print_core_note (pnote);
19106   else if (((const_strneq (pnote->namedata, "GA")
19107              && strchr ("*$!+", pnote->namedata[2]) != NULL)
19108             || strchr ("*$!+", pnote->namedata[0]) != NULL)
19109            && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
19110                || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
19111     return print_gnu_build_attribute_description (pnote, filedata);
19112
19113   if (pnote->descsz)
19114     {
19115       unsigned long i;
19116
19117       printf (_("   description data: "));
19118       for (i = 0; i < pnote->descsz; i++)
19119         printf ("%02x ", pnote->descdata[i]);
19120       if (!do_wide)
19121         printf ("\n");
19122     }
19123
19124   if (do_wide)
19125     printf ("\n");
19126
19127   return TRUE;
19128 }
19129
19130 static bfd_boolean
19131 process_notes_at (Filedata *           filedata,
19132                   Elf_Internal_Shdr *  section,
19133                   bfd_vma              offset,
19134                   bfd_vma              length,
19135                   bfd_vma              align)
19136 {
19137   Elf_External_Note * pnotes;
19138   Elf_External_Note * external;
19139   char *              end;
19140   bfd_boolean         res = TRUE;
19141
19142   if (length <= 0)
19143     return FALSE;
19144
19145   if (section)
19146     {
19147       pnotes = (Elf_External_Note *) get_section_contents (section, filedata);
19148       if (pnotes)
19149         {
19150           if (! apply_relocations (filedata, section, (unsigned char *) pnotes, length, NULL, NULL))
19151             return FALSE;
19152         }
19153     }
19154   else
19155     pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
19156                                              _("notes"));
19157
19158   if (pnotes == NULL)
19159     return FALSE;
19160
19161   external = pnotes;
19162
19163   if (section)
19164     printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (filedata, section));
19165   else
19166     printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
19167             (unsigned long) offset, (unsigned long) length);
19168
19169   /* NB: Some note sections may have alignment value of 0 or 1.  gABI
19170      specifies that notes should be aligned to 4 bytes in 32-bit
19171      objects and to 8 bytes in 64-bit objects.  As a Linux extension,
19172      we also support 4 byte alignment in 64-bit objects.  If section
19173      alignment is less than 4, we treate alignment as 4 bytes.   */
19174   if (align < 4)
19175     align = 4;
19176   else if (align != 4 && align != 8)
19177     {
19178       warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
19179             (long) align);
19180       return FALSE;
19181     }
19182
19183   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
19184
19185   end = (char *) pnotes + length;
19186   while ((char *) external < end)
19187     {
19188       Elf_Internal_Note inote;
19189       size_t min_notesz;
19190       char * next;
19191       char * temp = NULL;
19192       size_t data_remaining = end - (char *) external;
19193
19194       if (!is_ia64_vms (filedata))
19195         {
19196           /* PR binutils/15191
19197              Make sure that there is enough data to read.  */
19198           min_notesz = offsetof (Elf_External_Note, name);
19199           if (data_remaining < min_notesz)
19200             {
19201               warn (ngettext ("Corrupt note: only %ld byte remains, "
19202                               "not enough for a full note\n",
19203                               "Corrupt note: only %ld bytes remain, "
19204                               "not enough for a full note\n",
19205                               data_remaining),
19206                     (long) data_remaining);
19207               break;
19208             }
19209           data_remaining -= min_notesz;
19210
19211           inote.type     = BYTE_GET (external->type);
19212           inote.namesz   = BYTE_GET (external->namesz);
19213           inote.namedata = external->name;
19214           inote.descsz   = BYTE_GET (external->descsz);
19215           inote.descdata = ((char *) external
19216                             + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
19217           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
19218           next = ((char *) external
19219                   + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
19220         }
19221       else
19222         {
19223           Elf64_External_VMS_Note *vms_external;
19224
19225           /* PR binutils/15191
19226              Make sure that there is enough data to read.  */
19227           min_notesz = offsetof (Elf64_External_VMS_Note, name);
19228           if (data_remaining < min_notesz)
19229             {
19230               warn (ngettext ("Corrupt note: only %ld byte remains, "
19231                               "not enough for a full note\n",
19232                               "Corrupt note: only %ld bytes remain, "
19233                               "not enough for a full note\n",
19234                               data_remaining),
19235                     (long) data_remaining);
19236               break;
19237             }
19238           data_remaining -= min_notesz;
19239
19240           vms_external = (Elf64_External_VMS_Note *) external;
19241           inote.type     = BYTE_GET (vms_external->type);
19242           inote.namesz   = BYTE_GET (vms_external->namesz);
19243           inote.namedata = vms_external->name;
19244           inote.descsz   = BYTE_GET (vms_external->descsz);
19245           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
19246           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
19247           next = inote.descdata + align_power (inote.descsz, 3);
19248         }
19249
19250       /* PR 17531: file: 3443835e.  */
19251       /* PR 17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4.  */
19252       if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
19253           || (size_t) (inote.descdata - inote.namedata) > data_remaining
19254           || (size_t) (next - inote.descdata) < inote.descsz
19255           || ((size_t) (next - inote.descdata)
19256               > data_remaining - (size_t) (inote.descdata - inote.namedata)))
19257         {
19258           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
19259                 (unsigned long) ((char *) external - (char *) pnotes));
19260           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
19261                 inote.type, inote.namesz, inote.descsz, (int) align);
19262           break;
19263         }
19264
19265       external = (Elf_External_Note *) next;
19266
19267       /* Verify that name is null terminated.  It appears that at least
19268          one version of Linux (RedHat 6.0) generates corefiles that don't
19269          comply with the ELF spec by failing to include the null byte in
19270          namesz.  */
19271       if (inote.namesz > 0 && inote.namedata[inote.namesz - 1] != '\0')
19272         {
19273           if ((size_t) (inote.descdata - inote.namedata) == inote.namesz)
19274             {
19275               temp = (char *) malloc (inote.namesz + 1);
19276               if (temp == NULL)
19277                 {
19278                   error (_("Out of memory allocating space for inote name\n"));
19279                   res = FALSE;
19280                   break;
19281                 }
19282
19283               memcpy (temp, inote.namedata, inote.namesz);
19284               inote.namedata = temp;
19285             }
19286           inote.namedata[inote.namesz] = 0;
19287         }
19288
19289       if (! process_note (& inote, filedata))
19290         res = FALSE;
19291
19292       if (temp != NULL)
19293         {
19294           free (temp);
19295           temp = NULL;
19296         }
19297     }
19298
19299   free (pnotes);
19300
19301   return res;
19302 }
19303
19304 static bfd_boolean
19305 process_corefile_note_segments (Filedata * filedata)
19306 {
19307   Elf_Internal_Phdr * segment;
19308   unsigned int i;
19309   bfd_boolean res = TRUE;
19310
19311   if (! get_program_headers (filedata))
19312     return TRUE;
19313
19314   for (i = 0, segment = filedata->program_headers;
19315        i < filedata->file_header.e_phnum;
19316        i++, segment++)
19317     {
19318       if (segment->p_type == PT_NOTE)
19319         if (! process_notes_at (filedata, NULL,
19320                                 (bfd_vma) segment->p_offset,
19321                                 (bfd_vma) segment->p_filesz,
19322                                 (bfd_vma) segment->p_align))
19323           res = FALSE;
19324     }
19325
19326   return res;
19327 }
19328
19329 static bfd_boolean
19330 process_v850_notes (Filedata * filedata, bfd_vma offset, bfd_vma length)
19331 {
19332   Elf_External_Note * pnotes;
19333   Elf_External_Note * external;
19334   char * end;
19335   bfd_boolean res = TRUE;
19336
19337   if (length <= 0)
19338     return FALSE;
19339
19340   pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
19341                                            _("v850 notes"));
19342   if (pnotes == NULL)
19343     return FALSE;
19344
19345   external = pnotes;
19346   end = (char*) pnotes + length;
19347
19348   printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
19349           (unsigned long) offset, (unsigned long) length);
19350
19351   while ((char *) external + sizeof (Elf_External_Note) < end)
19352     {
19353       Elf_External_Note * next;
19354       Elf_Internal_Note inote;
19355
19356       inote.type     = BYTE_GET (external->type);
19357       inote.namesz   = BYTE_GET (external->namesz);
19358       inote.namedata = external->name;
19359       inote.descsz   = BYTE_GET (external->descsz);
19360       inote.descdata = inote.namedata + align_power (inote.namesz, 2);
19361       inote.descpos  = offset + (inote.descdata - (char *) pnotes);
19362
19363       if (inote.descdata < (char *) pnotes || inote.descdata >= end)
19364         {
19365           warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
19366           inote.descdata = inote.namedata;
19367           inote.namesz   = 0;
19368         }
19369
19370       next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
19371
19372       if (   ((char *) next > end)
19373           || ((char *) next <  (char *) pnotes))
19374         {
19375           warn (_("corrupt descsz found in note at offset 0x%lx\n"),
19376                 (unsigned long) ((char *) external - (char *) pnotes));
19377           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
19378                 inote.type, inote.namesz, inote.descsz);
19379           break;
19380         }
19381
19382       external = next;
19383
19384       /* Prevent out-of-bounds indexing.  */
19385       if (   inote.namedata + inote.namesz > end
19386           || inote.namedata + inote.namesz < inote.namedata)
19387         {
19388           warn (_("corrupt namesz found in note at offset 0x%lx\n"),
19389                 (unsigned long) ((char *) external - (char *) pnotes));
19390           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
19391                 inote.type, inote.namesz, inote.descsz);
19392           break;
19393         }
19394
19395       printf ("  %s: ", get_v850_elf_note_type (inote.type));
19396
19397       if (! print_v850_note (& inote))
19398         {
19399           res = FALSE;
19400           printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
19401                   inote.namesz, inote.descsz);
19402         }
19403     }
19404
19405   free (pnotes);
19406
19407   return res;
19408 }
19409
19410 static bfd_boolean
19411 process_note_sections (Filedata * filedata)
19412 {
19413   Elf_Internal_Shdr * section;
19414   unsigned long i;
19415   unsigned int n = 0;
19416   bfd_boolean res = TRUE;
19417
19418   for (i = 0, section = filedata->section_headers;
19419        i < filedata->file_header.e_shnum && section != NULL;
19420        i++, section++)
19421     {
19422       if (section->sh_type == SHT_NOTE)
19423         {
19424           if (! process_notes_at (filedata, section,
19425                                   (bfd_vma) section->sh_offset,
19426                                   (bfd_vma) section->sh_size,
19427                                   (bfd_vma) section->sh_addralign))
19428             res = FALSE;
19429           n++;
19430         }
19431
19432       if ((   filedata->file_header.e_machine == EM_V800
19433            || filedata->file_header.e_machine == EM_V850
19434            || filedata->file_header.e_machine == EM_CYGNUS_V850)
19435           && section->sh_type == SHT_RENESAS_INFO)
19436         {
19437           if (! process_v850_notes (filedata,
19438                                     (bfd_vma) section->sh_offset,
19439                                     (bfd_vma) section->sh_size))
19440             res = FALSE;
19441           n++;
19442         }
19443     }
19444
19445   if (n == 0)
19446     /* Try processing NOTE segments instead.  */
19447     return process_corefile_note_segments (filedata);
19448
19449   return res;
19450 }
19451
19452 static bfd_boolean
19453 process_notes (Filedata * filedata)
19454 {
19455   /* If we have not been asked to display the notes then do nothing.  */
19456   if (! do_notes)
19457     return TRUE;
19458
19459   if (filedata->file_header.e_type != ET_CORE)
19460     return process_note_sections (filedata);
19461
19462   /* No program headers means no NOTE segment.  */
19463   if (filedata->file_header.e_phnum > 0)
19464     return process_corefile_note_segments (filedata);
19465
19466   printf (_("No note segments present in the core file.\n"));
19467   return TRUE;
19468 }
19469
19470 static unsigned char *
19471 display_public_gnu_attributes (unsigned char * start,
19472                                const unsigned char * const end)
19473 {
19474   printf (_("  Unknown GNU attribute: %s\n"), start);
19475
19476   start += strnlen ((char *) start, end - start);
19477   display_raw_attribute (start, end);
19478
19479   return (unsigned char *) end;
19480 }
19481
19482 static unsigned char *
19483 display_generic_attribute (unsigned char * start,
19484                            unsigned int tag,
19485                            const unsigned char * const end)
19486 {
19487   if (tag == 0)
19488     return (unsigned char *) end;
19489
19490   return display_tag_value (tag, start, end);
19491 }
19492
19493 static bfd_boolean
19494 process_arch_specific (Filedata * filedata)
19495 {
19496   if (! do_arch)
19497     return TRUE;
19498
19499   switch (filedata->file_header.e_machine)
19500     {
19501     case EM_ARC:
19502     case EM_ARC_COMPACT:
19503     case EM_ARC_COMPACT2:
19504       return process_attributes (filedata, "ARC", SHT_ARC_ATTRIBUTES,
19505                                  display_arc_attribute,
19506                                  display_generic_attribute);
19507     case EM_ARM:
19508       return process_attributes (filedata, "aeabi", SHT_ARM_ATTRIBUTES,
19509                                  display_arm_attribute,
19510                                  display_generic_attribute);
19511
19512     case EM_MIPS:
19513     case EM_MIPS_RS3_LE:
19514       return process_mips_specific (filedata);
19515
19516     case EM_MSP430:
19517      return process_attributes (filedata, "mspabi", SHT_MSP430_ATTRIBUTES,
19518                                 display_msp430x_attribute,
19519                                 display_generic_attribute);
19520
19521     case EM_RISCV:
19522      return process_attributes (filedata, "riscv", SHT_RISCV_ATTRIBUTES,
19523                                 display_riscv_attribute,
19524                                 display_generic_attribute);
19525
19526     case EM_NDS32:
19527       return process_nds32_specific (filedata);
19528
19529     case EM_PPC:
19530     case EM_PPC64:
19531       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19532                                  display_power_gnu_attribute);
19533
19534     case EM_S390:
19535     case EM_S390_OLD:
19536       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19537                                  display_s390_gnu_attribute);
19538
19539     case EM_SPARC:
19540     case EM_SPARC32PLUS:
19541     case EM_SPARCV9:
19542       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19543                                  display_sparc_gnu_attribute);
19544
19545     case EM_TI_C6000:
19546       return process_attributes (filedata, "c6xabi", SHT_C6000_ATTRIBUTES,
19547                                  display_tic6x_attribute,
19548                                  display_generic_attribute);
19549
19550     default:
19551       return process_attributes (filedata, "gnu", SHT_GNU_ATTRIBUTES,
19552                                  display_public_gnu_attributes,
19553                                  display_generic_attribute);
19554     }
19555 }
19556
19557 static bfd_boolean
19558 get_file_header (Filedata * filedata)
19559 {
19560   /* Read in the identity array.  */
19561   if (fread (filedata->file_header.e_ident, EI_NIDENT, 1, filedata->handle) != 1)
19562     return FALSE;
19563
19564   /* Determine how to read the rest of the header.  */
19565   switch (filedata->file_header.e_ident[EI_DATA])
19566     {
19567     default:
19568     case ELFDATANONE:
19569     case ELFDATA2LSB:
19570       byte_get = byte_get_little_endian;
19571       byte_put = byte_put_little_endian;
19572       break;
19573     case ELFDATA2MSB:
19574       byte_get = byte_get_big_endian;
19575       byte_put = byte_put_big_endian;
19576       break;
19577     }
19578
19579   /* For now we only support 32 bit and 64 bit ELF files.  */
19580   is_32bit_elf = (filedata->file_header.e_ident[EI_CLASS] != ELFCLASS64);
19581
19582   /* Read in the rest of the header.  */
19583   if (is_32bit_elf)
19584     {
19585       Elf32_External_Ehdr ehdr32;
19586
19587       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, filedata->handle) != 1)
19588         return FALSE;
19589
19590       filedata->file_header.e_type      = BYTE_GET (ehdr32.e_type);
19591       filedata->file_header.e_machine   = BYTE_GET (ehdr32.e_machine);
19592       filedata->file_header.e_version   = BYTE_GET (ehdr32.e_version);
19593       filedata->file_header.e_entry     = BYTE_GET (ehdr32.e_entry);
19594       filedata->file_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
19595       filedata->file_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
19596       filedata->file_header.e_flags     = BYTE_GET (ehdr32.e_flags);
19597       filedata->file_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
19598       filedata->file_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
19599       filedata->file_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
19600       filedata->file_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
19601       filedata->file_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
19602       filedata->file_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
19603     }
19604   else
19605     {
19606       Elf64_External_Ehdr ehdr64;
19607
19608       /* If we have been compiled with sizeof (bfd_vma) == 4, then
19609          we will not be able to cope with the 64bit data found in
19610          64 ELF files.  Detect this now and abort before we start
19611          overwriting things.  */
19612       if (sizeof (bfd_vma) < 8)
19613         {
19614           error (_("This instance of readelf has been built without support for a\n\
19615 64 bit data type and so it cannot read 64 bit ELF files.\n"));
19616           return FALSE;
19617         }
19618
19619       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, filedata->handle) != 1)
19620         return FALSE;
19621
19622       filedata->file_header.e_type      = BYTE_GET (ehdr64.e_type);
19623       filedata->file_header.e_machine   = BYTE_GET (ehdr64.e_machine);
19624       filedata->file_header.e_version   = BYTE_GET (ehdr64.e_version);
19625       filedata->file_header.e_entry     = BYTE_GET (ehdr64.e_entry);
19626       filedata->file_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
19627       filedata->file_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
19628       filedata->file_header.e_flags     = BYTE_GET (ehdr64.e_flags);
19629       filedata->file_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
19630       filedata->file_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
19631       filedata->file_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
19632       filedata->file_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
19633       filedata->file_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
19634       filedata->file_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
19635     }
19636
19637   if (filedata->file_header.e_shoff)
19638     {
19639       /* There may be some extensions in the first section header.  Don't
19640          bomb if we can't read it.  */
19641       if (is_32bit_elf)
19642         get_32bit_section_headers (filedata, TRUE);
19643       else
19644         get_64bit_section_headers (filedata, TRUE);
19645     }
19646
19647   return TRUE;
19648 }
19649
19650 static void
19651 close_file (Filedata * filedata)
19652 {
19653   if (filedata)
19654     {
19655       if (filedata->handle)
19656         fclose (filedata->handle);
19657       free (filedata);
19658     }
19659 }
19660
19661 void
19662 close_debug_file (void * data)
19663 {
19664   close_file ((Filedata *) data);
19665 }
19666
19667 static Filedata *
19668 open_file (const char * pathname)
19669 {
19670   struct stat  statbuf;
19671   Filedata *   filedata = NULL;
19672
19673   if (stat (pathname, & statbuf) < 0
19674       || ! S_ISREG (statbuf.st_mode))
19675     goto fail;
19676
19677   filedata = calloc (1, sizeof * filedata);
19678   if (filedata == NULL)
19679     goto fail;
19680
19681   filedata->handle = fopen (pathname, "rb");
19682   if (filedata->handle == NULL)
19683     goto fail;
19684
19685   filedata->file_size = (bfd_size_type) statbuf.st_size;
19686   filedata->file_name = pathname;
19687
19688   if (! get_file_header (filedata))
19689     goto fail;
19690
19691   if (filedata->file_header.e_shoff)
19692     {
19693       bfd_boolean res;
19694
19695       /* Read the section headers again, this time for real.  */
19696       if (is_32bit_elf)
19697         res = get_32bit_section_headers (filedata, FALSE);
19698       else
19699         res = get_64bit_section_headers (filedata, FALSE);
19700
19701       if (!res)
19702         goto fail;
19703     }
19704
19705   return filedata;
19706
19707  fail:
19708   if (filedata)
19709     {
19710       if (filedata->handle)
19711         fclose (filedata->handle);
19712       free (filedata);
19713     }
19714   return NULL;
19715 }
19716
19717 void *
19718 open_debug_file (const char * pathname)
19719 {
19720   return open_file (pathname);
19721 }
19722
19723 /* Process one ELF object file according to the command line options.
19724    This file may actually be stored in an archive.  The file is
19725    positioned at the start of the ELF object.  Returns TRUE if no
19726    problems were encountered, FALSE otherwise.  */
19727
19728 static bfd_boolean
19729 process_object (Filedata * filedata)
19730 {
19731   bfd_boolean  have_separate_files;
19732   unsigned int i;
19733   bfd_boolean res = TRUE;
19734
19735   if (! get_file_header (filedata))
19736     {
19737       error (_("%s: Failed to read file header\n"), filedata->file_name);
19738       return FALSE;
19739     }
19740
19741   /* Initialise per file variables.  */
19742   for (i = ARRAY_SIZE (version_info); i--;)
19743     version_info[i] = 0;
19744
19745   for (i = ARRAY_SIZE (dynamic_info); i--;)
19746     dynamic_info[i] = 0;
19747   dynamic_info_DT_GNU_HASH = 0;
19748
19749   /* Process the file.  */
19750   if (show_name)
19751     printf (_("\nFile: %s\n"), filedata->file_name);
19752
19753   /* Initialise the dump_sects array from the cmdline_dump_sects array.
19754      Note we do this even if cmdline_dump_sects is empty because we
19755      must make sure that the dump_sets array is zeroed out before each
19756      object file is processed.  */
19757   if (filedata->num_dump_sects > cmdline.num_dump_sects)
19758     memset (filedata->dump_sects, 0, filedata->num_dump_sects * sizeof (* filedata->dump_sects));
19759
19760   if (cmdline.num_dump_sects > 0)
19761     {
19762       if (filedata->num_dump_sects == 0)
19763         /* A sneaky way of allocating the dump_sects array.  */
19764         request_dump_bynumber (filedata, cmdline.num_dump_sects, 0);
19765
19766       assert (filedata->num_dump_sects >= cmdline.num_dump_sects);
19767       memcpy (filedata->dump_sects, cmdline.dump_sects,
19768               cmdline.num_dump_sects * sizeof (* filedata->dump_sects));
19769     }
19770
19771   if (! process_file_header (filedata))
19772     return FALSE;
19773
19774   if (! process_section_headers (filedata))
19775     {
19776       /* Without loaded section headers we cannot process lots of things.  */
19777       do_unwind = do_version = do_dump = do_arch = FALSE;
19778
19779       if (! do_using_dynamic)
19780         do_syms = do_dyn_syms = do_reloc = FALSE;
19781     }
19782
19783   if (! process_section_groups (filedata))
19784     /* Without loaded section groups we cannot process unwind.  */
19785     do_unwind = FALSE;
19786
19787   if (process_program_headers (filedata))
19788     process_dynamic_section (filedata);
19789   else
19790     res = FALSE;
19791
19792   if (! process_relocs (filedata))
19793     res = FALSE;
19794
19795   if (! process_unwind (filedata))
19796     res = FALSE;
19797
19798   if (! process_symbol_table (filedata))
19799     res = FALSE;
19800
19801   if (! process_syminfo (filedata))
19802     res = FALSE;
19803
19804   if (! process_version_sections (filedata))
19805     res = FALSE;
19806
19807   if (filedata->file_header.e_shstrndx != SHN_UNDEF)
19808     have_separate_files = load_separate_debug_files (filedata, filedata->file_name);
19809   else
19810     have_separate_files = FALSE;
19811
19812   if (! process_section_contents (filedata))
19813     res = FALSE;
19814
19815   if (have_separate_files)
19816     {
19817       separate_info * d;
19818
19819       for (d = first_separate_info; d != NULL; d = d->next)
19820         {
19821           if (! process_section_headers (d->handle))
19822             res = FALSE;
19823           else if (! process_section_contents (d->handle))
19824             res = FALSE;
19825         }
19826
19827       /* The file handles are closed by the call to free_debug_memory() below.  */
19828     }
19829
19830   if (! process_notes (filedata))
19831     res = FALSE;
19832
19833   if (! process_gnu_liblist (filedata))
19834     res = FALSE;
19835
19836   if (! process_arch_specific (filedata))
19837     res = FALSE;
19838
19839   free (filedata->program_headers);
19840   filedata->program_headers = NULL;
19841
19842   free (filedata->section_headers);
19843   filedata->section_headers = NULL;
19844
19845   free (filedata->string_table);
19846   filedata->string_table = NULL;
19847   filedata->string_table_length = 0;
19848
19849   if (dynamic_strings)
19850     {
19851       free (dynamic_strings);
19852       dynamic_strings = NULL;
19853       dynamic_strings_length = 0;
19854     }
19855
19856   if (dynamic_symbols)
19857     {
19858       free (dynamic_symbols);
19859       dynamic_symbols = NULL;
19860       num_dynamic_syms = 0;
19861     }
19862
19863   if (dynamic_syminfo)
19864     {
19865       free (dynamic_syminfo);
19866       dynamic_syminfo = NULL;
19867     }
19868
19869   if (dynamic_section)
19870     {
19871       free (dynamic_section);
19872       dynamic_section = NULL;
19873     }
19874
19875   if (section_headers_groups)
19876     {
19877       free (section_headers_groups);
19878       section_headers_groups = NULL;
19879     }
19880
19881   if (section_groups)
19882     {
19883       struct group_list * g;
19884       struct group_list * next;
19885
19886       for (i = 0; i < group_count; i++)
19887         {
19888           for (g = section_groups [i].root; g != NULL; g = next)
19889             {
19890               next = g->next;
19891               free (g);
19892             }
19893         }
19894
19895       free (section_groups);
19896       section_groups = NULL;
19897     }
19898
19899   free_debug_memory ();
19900
19901   return res;
19902 }
19903
19904 /* Process an ELF archive.
19905    On entry the file is positioned just after the ARMAG string.
19906    Returns TRUE upon success, FALSE otherwise.  */
19907
19908 static bfd_boolean
19909 process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
19910 {
19911   struct archive_info arch;
19912   struct archive_info nested_arch;
19913   size_t got;
19914   bfd_boolean ret = TRUE;
19915
19916   show_name = TRUE;
19917
19918   /* The ARCH structure is used to hold information about this archive.  */
19919   arch.file_name = NULL;
19920   arch.file = NULL;
19921   arch.index_array = NULL;
19922   arch.sym_table = NULL;
19923   arch.longnames = NULL;
19924
19925   /* The NESTED_ARCH structure is used as a single-item cache of information
19926      about a nested archive (when members of a thin archive reside within
19927      another regular archive file).  */
19928   nested_arch.file_name = NULL;
19929   nested_arch.file = NULL;
19930   nested_arch.index_array = NULL;
19931   nested_arch.sym_table = NULL;
19932   nested_arch.longnames = NULL;
19933
19934   if (setup_archive (&arch, filedata->file_name, filedata->handle,
19935                      is_thin_archive, do_archive_index) != 0)
19936     {
19937       ret = FALSE;
19938       goto out;
19939     }
19940
19941   if (do_archive_index)
19942     {
19943       if (arch.sym_table == NULL)
19944         error (_("%s: unable to dump the index as none was found\n"), filedata->file_name);
19945       else
19946         {
19947           unsigned long i, l;
19948           unsigned long current_pos;
19949
19950           printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
19951                   filedata->file_name, (unsigned long) arch.index_num, arch.sym_size);
19952
19953           current_pos = ftell (filedata->handle);
19954
19955           for (i = l = 0; i < arch.index_num; i++)
19956             {
19957               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
19958                 {
19959                   char * member_name;
19960
19961                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
19962
19963                   if (member_name != NULL)
19964                     {
19965                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
19966
19967                       if (qualified_name != NULL)
19968                         {
19969                           printf (_("Contents of binary %s at offset "), qualified_name);
19970                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
19971                           putchar ('\n');
19972                           free (qualified_name);
19973                         }
19974                     }
19975                 }
19976
19977               if (l >= arch.sym_size)
19978                 {
19979                   error (_("%s: end of the symbol table reached before the end of the index\n"),
19980                          filedata->file_name);
19981                   ret = FALSE;
19982                   break;
19983                 }
19984               /* PR 17531: file: 0b6630b2.  */
19985               printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
19986               l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
19987             }
19988
19989           if (arch.uses_64bit_indices)
19990             l = (l + 7) & ~ 7;
19991           else
19992             l += l & 1;
19993
19994           if (l < arch.sym_size)
19995             {
19996               error (ngettext ("%s: %ld byte remains in the symbol table, "
19997                                "but without corresponding entries in "
19998                                "the index table\n",
19999                                "%s: %ld bytes remain in the symbol table, "
20000                                "but without corresponding entries in "
20001                                "the index table\n",
20002                                arch.sym_size - l),
20003                      filedata->file_name, arch.sym_size - l);
20004               ret = FALSE;
20005             }
20006
20007           if (fseek (filedata->handle, current_pos, SEEK_SET) != 0)
20008             {
20009               error (_("%s: failed to seek back to start of object files in the archive\n"),
20010                      filedata->file_name);
20011               ret = FALSE;
20012               goto out;
20013             }
20014         }
20015
20016       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
20017           && !do_segments && !do_header && !do_dump && !do_version
20018           && !do_histogram && !do_debugging && !do_arch && !do_notes
20019           && !do_section_groups && !do_dyn_syms)
20020         {
20021           ret = TRUE; /* Archive index only.  */
20022           goto out;
20023         }
20024     }
20025
20026   while (1)
20027     {
20028       char * name;
20029       size_t namelen;
20030       char * qualified_name;
20031
20032       /* Read the next archive header.  */
20033       if (fseek (filedata->handle, arch.next_arhdr_offset, SEEK_SET) != 0)
20034         {
20035           error (_("%s: failed to seek to next archive header\n"), arch.file_name);
20036           return FALSE;
20037         }
20038       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, filedata->handle);
20039       if (got != sizeof arch.arhdr)
20040         {
20041           if (got == 0)
20042             break;
20043           /* PR 24049 - we cannot use filedata->file_name as this will
20044              have already been freed.  */
20045           error (_("%s: failed to read archive header\n"), arch.file_name);
20046
20047           ret = FALSE;
20048           break;
20049         }
20050       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
20051         {
20052           error (_("%s: did not find a valid archive header\n"), arch.file_name);
20053           ret = FALSE;
20054           break;
20055         }
20056
20057       arch.next_arhdr_offset += sizeof arch.arhdr;
20058
20059       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
20060       if (archive_file_size & 01)
20061         ++archive_file_size;
20062
20063       name = get_archive_member_name (&arch, &nested_arch);
20064       if (name == NULL)
20065         {
20066           error (_("%s: bad archive file name\n"), arch.file_name);
20067           ret = FALSE;
20068           break;
20069         }
20070       namelen = strlen (name);
20071
20072       qualified_name = make_qualified_name (&arch, &nested_arch, name);
20073       if (qualified_name == NULL)
20074         {
20075           error (_("%s: bad archive file name\n"), arch.file_name);
20076           ret = FALSE;
20077           break;
20078         }
20079
20080       if (is_thin_archive && arch.nested_member_origin == 0)
20081         {
20082           /* This is a proxy for an external member of a thin archive.  */
20083           Filedata * member_filedata;
20084           char * member_file_name = adjust_relative_path
20085             (filedata->file_name, name, namelen);
20086
20087           if (member_file_name == NULL)
20088             {
20089               ret = FALSE;
20090               break;
20091             }
20092
20093           member_filedata = open_file (member_file_name);
20094           if (member_filedata == NULL)
20095             {
20096               error (_("Input file '%s' is not readable.\n"), member_file_name);
20097               free (member_file_name);
20098               ret = FALSE;
20099               break;
20100             }
20101
20102           archive_file_offset = arch.nested_member_origin;
20103           member_filedata->file_name = qualified_name;
20104
20105           if (! process_object (member_filedata))
20106             ret = FALSE;
20107
20108           close_file (member_filedata);
20109           free (member_file_name);
20110         }
20111       else if (is_thin_archive)
20112         {
20113           Filedata thin_filedata;
20114
20115           memset (&thin_filedata, 0, sizeof (thin_filedata));
20116
20117           /* PR 15140: Allow for corrupt thin archives.  */
20118           if (nested_arch.file == NULL)
20119             {
20120               error (_("%s: contains corrupt thin archive: %s\n"),
20121                      qualified_name, name);
20122               ret = FALSE;
20123               break;
20124             }
20125
20126           /* This is a proxy for a member of a nested archive.  */
20127           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
20128
20129           /* The nested archive file will have been opened and setup by
20130              get_archive_member_name.  */
20131           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
20132             {
20133               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
20134               ret = FALSE;
20135               break;
20136             }
20137
20138           thin_filedata.handle = nested_arch.file;
20139           thin_filedata.file_name = qualified_name;
20140
20141           if (! process_object (& thin_filedata))
20142             ret = FALSE;
20143         }
20144       else
20145         {
20146           archive_file_offset = arch.next_arhdr_offset;
20147           arch.next_arhdr_offset += archive_file_size;
20148
20149           filedata->file_name = qualified_name;
20150           if (! process_object (filedata))
20151             ret = FALSE;
20152         }
20153
20154       if (filedata->dump_sects != NULL)
20155         {
20156           free (filedata->dump_sects);
20157           filedata->dump_sects = NULL;
20158           filedata->num_dump_sects = 0;
20159         }
20160
20161       free (qualified_name);
20162     }
20163
20164  out:
20165   if (nested_arch.file != NULL)
20166     fclose (nested_arch.file);
20167   release_archive (&nested_arch);
20168   release_archive (&arch);
20169
20170   return ret;
20171 }
20172
20173 static bfd_boolean
20174 process_file (char * file_name)
20175 {
20176   Filedata * filedata = NULL;
20177   struct stat statbuf;
20178   char armag[SARMAG];
20179   bfd_boolean ret = TRUE;
20180
20181   if (stat (file_name, &statbuf) < 0)
20182     {
20183       if (errno == ENOENT)
20184         error (_("'%s': No such file\n"), file_name);
20185       else
20186         error (_("Could not locate '%s'.  System error message: %s\n"),
20187                file_name, strerror (errno));
20188       return FALSE;
20189     }
20190
20191   if (! S_ISREG (statbuf.st_mode))
20192     {
20193       error (_("'%s' is not an ordinary file\n"), file_name);
20194       return FALSE;
20195     }
20196
20197   filedata = calloc (1, sizeof * filedata);
20198   if (filedata == NULL)
20199     {
20200       error (_("Out of memory allocating file data structure\n"));
20201       return FALSE;
20202     }
20203
20204   filedata->file_name = file_name;
20205   filedata->handle = fopen (file_name, "rb");
20206   if (filedata->handle == NULL)
20207     {
20208       error (_("Input file '%s' is not readable.\n"), file_name);
20209       free (filedata);
20210       return FALSE;
20211     }
20212
20213   if (fread (armag, SARMAG, 1, filedata->handle) != 1)
20214     {
20215       error (_("%s: Failed to read file's magic number\n"), file_name);
20216       fclose (filedata->handle);
20217       free (filedata);
20218       return FALSE;
20219     }
20220
20221   filedata->file_size = (bfd_size_type) statbuf.st_size;
20222
20223   if (memcmp (armag, ARMAG, SARMAG) == 0)
20224     {
20225       if (! process_archive (filedata, FALSE))
20226         ret = FALSE;
20227     }
20228   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
20229     {
20230       if ( ! process_archive (filedata, TRUE))
20231         ret = FALSE;
20232     }
20233   else
20234     {
20235       if (do_archive_index)
20236         error (_("File %s is not an archive so its index cannot be displayed.\n"),
20237                file_name);
20238
20239       rewind (filedata->handle);
20240       archive_file_size = archive_file_offset = 0;
20241
20242       if (! process_object (filedata))
20243         ret = FALSE;
20244     }
20245
20246   fclose (filedata->handle);
20247   free (filedata);
20248
20249   return ret;
20250 }
20251
20252 #ifdef SUPPORT_DISASSEMBLY
20253 /* Needed by the i386 disassembler.  For extra credit, someone could
20254    fix this so that we insert symbolic addresses here, esp for GOT/PLT
20255    symbols.  */
20256
20257 void
20258 print_address (unsigned int addr, FILE * outfile)
20259 {
20260   fprintf (outfile,"0x%8.8x", addr);
20261 }
20262
20263 /* Needed by the i386 disassembler.  */
20264
20265 void
20266 db_task_printsym (unsigned int addr)
20267 {
20268   print_address (addr, stderr);
20269 }
20270 #endif
20271
20272 int
20273 main (int argc, char ** argv)
20274 {
20275   int err;
20276
20277 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
20278   setlocale (LC_MESSAGES, "");
20279 #endif
20280 #if defined (HAVE_SETLOCALE)
20281   setlocale (LC_CTYPE, "");
20282 #endif
20283   bindtextdomain (PACKAGE, LOCALEDIR);
20284   textdomain (PACKAGE);
20285
20286   expandargv (&argc, &argv);
20287
20288   cmdline.file_name = "<cmdline>";
20289   parse_args (& cmdline, argc, argv);
20290
20291   if (optind < (argc - 1))
20292     show_name = TRUE;
20293   else if (optind >= argc)
20294     {
20295       warn (_("Nothing to do.\n"));
20296       usage (stderr);
20297     }
20298
20299   err = FALSE;
20300   while (optind < argc)
20301     if (! process_file (argv[optind++]))
20302       err = TRUE;
20303
20304   if (cmdline.dump_sects != NULL)
20305     free (cmdline.dump_sects);
20306
20307   free (dump_ctf_symtab_name);
20308   free (dump_ctf_strtab_name);
20309   free (dump_ctf_parent_name);
20310
20311   return err ? EXIT_FAILURE : EXIT_SUCCESS;
20312 }