5e18734f10b9455e9bac3dd6b875fbd820730e39
[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           || aux->info_size - offset < 8)
7579         {
7580           warn (_("Invalid offset %lx in table entry %ld\n"),
7581                 (long) tp->info.offset, (long) (tp - aux->table));
7582           res = FALSE;
7583           continue;
7584         }
7585
7586       head = aux->info + offset;
7587       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7588
7589       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7590               (unsigned) UNW_VER (stamp),
7591               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7592               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7593               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7594               (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7595
7596       if (UNW_VER (stamp) != 1)
7597         {
7598           printf (_("\tUnknown version.\n"));
7599           continue;
7600         }
7601
7602       in_body = 0;
7603       end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7604       /* PR 17531: file: 16ceda89.  */
7605       if (end > aux->info + aux->info_size)
7606         end = aux->info + aux->info_size;
7607       for (dp = head + 8; dp < end;)
7608         dp = unw_decode (dp, in_body, & in_body, end);
7609     }
7610
7611   free (aux->funtab);
7612
7613   return res;
7614 }
7615
7616 static bfd_boolean
7617 slurp_ia64_unwind_table (Filedata *                  filedata,
7618                          struct ia64_unw_aux_info *  aux,
7619                          Elf_Internal_Shdr *         sec)
7620 {
7621   unsigned long size, nrelas, i;
7622   Elf_Internal_Phdr * seg;
7623   struct ia64_unw_table_entry * tep;
7624   Elf_Internal_Shdr * relsec;
7625   Elf_Internal_Rela * rela;
7626   Elf_Internal_Rela * rp;
7627   unsigned char * table;
7628   unsigned char * tp;
7629   Elf_Internal_Sym * sym;
7630   const char * relname;
7631
7632   aux->table_len = 0;
7633
7634   /* First, find the starting address of the segment that includes
7635      this section: */
7636
7637   if (filedata->file_header.e_phnum)
7638     {
7639       if (! get_program_headers (filedata))
7640           return FALSE;
7641
7642       for (seg = filedata->program_headers;
7643            seg < filedata->program_headers + filedata->file_header.e_phnum;
7644            ++seg)
7645         {
7646           if (seg->p_type != PT_LOAD)
7647             continue;
7648
7649           if (sec->sh_addr >= seg->p_vaddr
7650               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7651             {
7652               aux->seg_base = seg->p_vaddr;
7653               break;
7654             }
7655         }
7656     }
7657
7658   /* Second, build the unwind table from the contents of the unwind section:  */
7659   size = sec->sh_size;
7660   table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7661                                       _("unwind table"));
7662   if (!table)
7663     return FALSE;
7664
7665   aux->table_len = size / (3 * eh_addr_size);
7666   aux->table = (struct ia64_unw_table_entry *)
7667     xcmalloc (aux->table_len, sizeof (aux->table[0]));
7668   tep = aux->table;
7669
7670   for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7671     {
7672       tep->start.section = SHN_UNDEF;
7673       tep->end.section   = SHN_UNDEF;
7674       tep->info.section  = SHN_UNDEF;
7675       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7676       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7677       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7678       tep->start.offset += aux->seg_base;
7679       tep->end.offset   += aux->seg_base;
7680       tep->info.offset  += aux->seg_base;
7681     }
7682   free (table);
7683
7684   /* Third, apply any relocations to the unwind table:  */
7685   for (relsec = filedata->section_headers;
7686        relsec < filedata->section_headers + filedata->file_header.e_shnum;
7687        ++relsec)
7688     {
7689       if (relsec->sh_type != SHT_RELA
7690           || relsec->sh_info >= filedata->file_header.e_shnum
7691           || filedata->section_headers + relsec->sh_info != sec)
7692         continue;
7693
7694       if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
7695                               & rela, & nrelas))
7696         {
7697           free (aux->table);
7698           aux->table = NULL;
7699           aux->table_len = 0;
7700           return FALSE;
7701         }
7702
7703       for (rp = rela; rp < rela + nrelas; ++rp)
7704         {
7705           unsigned int sym_ndx;
7706           unsigned int r_type = get_reloc_type (filedata, rp->r_info);
7707           relname = elf_ia64_reloc_type (r_type);
7708
7709           /* PR 17531: file: 9fa67536.  */
7710           if (relname == NULL)
7711             {
7712               warn (_("Skipping unknown relocation type: %u\n"), r_type);
7713               continue;
7714             }
7715
7716           if (! const_strneq (relname, "R_IA64_SEGREL"))
7717             {
7718               warn (_("Skipping unexpected relocation type: %s\n"), relname);
7719               continue;
7720             }
7721
7722           i = rp->r_offset / (3 * eh_addr_size);
7723
7724           /* PR 17531: file: 5bc8d9bf.  */
7725           if (i >= aux->table_len)
7726             {
7727               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7728               continue;
7729             }
7730
7731           sym_ndx = get_reloc_symindex (rp->r_info);
7732           if (sym_ndx >= aux->nsyms)
7733             {
7734               warn (_("Skipping reloc with invalid symbol index: %u\n"),
7735                     sym_ndx);
7736               continue;
7737             }
7738           sym = aux->symtab + sym_ndx;
7739
7740           switch (rp->r_offset / eh_addr_size % 3)
7741             {
7742             case 0:
7743               aux->table[i].start.section = sym->st_shndx;
7744               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
7745               break;
7746             case 1:
7747               aux->table[i].end.section   = sym->st_shndx;
7748               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
7749               break;
7750             case 2:
7751               aux->table[i].info.section  = sym->st_shndx;
7752               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
7753               break;
7754             default:
7755               break;
7756             }
7757         }
7758
7759       free (rela);
7760     }
7761
7762   return TRUE;
7763 }
7764
7765 static bfd_boolean
7766 ia64_process_unwind (Filedata * filedata)
7767 {
7768   Elf_Internal_Shdr * sec;
7769   Elf_Internal_Shdr * unwsec = NULL;
7770   Elf_Internal_Shdr * strsec;
7771   unsigned long i, unwcount = 0, unwstart = 0;
7772   struct ia64_unw_aux_info aux;
7773   bfd_boolean res = TRUE;
7774
7775   memset (& aux, 0, sizeof (aux));
7776
7777   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
7778     {
7779       if (sec->sh_type == SHT_SYMTAB
7780           && sec->sh_link < filedata->file_header.e_shnum)
7781         {
7782           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
7783
7784           strsec = filedata->section_headers + sec->sh_link;
7785           if (aux.strtab != NULL)
7786             {
7787               error (_("Multiple auxillary string tables encountered\n"));
7788               free (aux.strtab);
7789               res = FALSE;
7790             }
7791           aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7792                                           1, strsec->sh_size,
7793                                           _("string table"));
7794           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7795         }
7796       else if (sec->sh_type == SHT_IA_64_UNWIND)
7797         unwcount++;
7798     }
7799
7800   if (!unwcount)
7801     printf (_("\nThere are no unwind sections in this file.\n"));
7802
7803   while (unwcount-- > 0)
7804     {
7805       char * suffix;
7806       size_t len, len2;
7807
7808       for (i = unwstart, sec = filedata->section_headers + unwstart, unwsec = NULL;
7809            i < filedata->file_header.e_shnum; ++i, ++sec)
7810         if (sec->sh_type == SHT_IA_64_UNWIND)
7811           {
7812             unwsec = sec;
7813             break;
7814           }
7815       /* We have already counted the number of SHT_IA64_UNWIND
7816          sections so the loop above should never fail.  */
7817       assert (unwsec != NULL);
7818
7819       unwstart = i + 1;
7820       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7821
7822       if ((unwsec->sh_flags & SHF_GROUP) != 0)
7823         {
7824           /* We need to find which section group it is in.  */
7825           struct group_list * g;
7826
7827           if (section_headers_groups == NULL
7828               || section_headers_groups [i] == NULL)
7829             i = filedata->file_header.e_shnum;
7830           else
7831             {
7832               g = section_headers_groups [i]->root;
7833
7834               for (; g != NULL; g = g->next)
7835                 {
7836                   sec = filedata->section_headers + g->section_index;
7837
7838                   if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7839                     break;
7840                 }
7841
7842               if (g == NULL)
7843                 i = filedata->file_header.e_shnum;
7844             }
7845         }
7846       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7847         {
7848           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
7849           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7850           suffix = SECTION_NAME (unwsec) + len;
7851           for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7852                ++i, ++sec)
7853             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7854                 && streq (SECTION_NAME (sec) + len2, suffix))
7855               break;
7856         }
7857       else
7858         {
7859           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7860              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
7861           len = sizeof (ELF_STRING_ia64_unwind) - 1;
7862           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7863           suffix = "";
7864           if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7865             suffix = SECTION_NAME (unwsec) + len;
7866           for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7867                ++i, ++sec)
7868             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7869                 && streq (SECTION_NAME (sec) + len2, suffix))
7870               break;
7871         }
7872
7873       if (i == filedata->file_header.e_shnum)
7874         {
7875           printf (_("\nCould not find unwind info section for "));
7876
7877           if (filedata->string_table == NULL)
7878             printf ("%d", unwsec->sh_name);
7879           else
7880             printf ("'%s'", printable_section_name (filedata, unwsec));
7881         }
7882       else
7883         {
7884           aux.info_addr = sec->sh_addr;
7885           aux.info = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1,
7886                                                  sec->sh_size,
7887                                                  _("unwind info"));
7888           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7889
7890           printf (_("\nUnwind section "));
7891
7892           if (filedata->string_table == NULL)
7893             printf ("%d", unwsec->sh_name);
7894           else
7895             printf ("'%s'", printable_section_name (filedata, unwsec));
7896
7897           printf (_(" at offset 0x%lx contains %lu entries:\n"),
7898                   (unsigned long) unwsec->sh_offset,
7899                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7900
7901           if (slurp_ia64_unwind_table (filedata, & aux, unwsec)
7902               && aux.table_len > 0)
7903             dump_ia64_unwind (filedata, & aux);
7904
7905           if (aux.table)
7906             free ((char *) aux.table);
7907           if (aux.info)
7908             free ((char *) aux.info);
7909           aux.table = NULL;
7910           aux.info = NULL;
7911         }
7912     }
7913
7914   if (aux.symtab)
7915     free (aux.symtab);
7916   if (aux.strtab)
7917     free ((char *) aux.strtab);
7918
7919   return res;
7920 }
7921
7922 struct hppa_unw_table_entry
7923 {
7924   struct absaddr start;
7925   struct absaddr end;
7926   unsigned int Cannot_unwind:1;                 /* 0 */
7927   unsigned int Millicode:1;                     /* 1 */
7928   unsigned int Millicode_save_sr0:1;            /* 2 */
7929   unsigned int Region_description:2;            /* 3..4 */
7930   unsigned int reserved1:1;                     /* 5 */
7931   unsigned int Entry_SR:1;                      /* 6 */
7932   unsigned int Entry_FR:4;     /* Number saved     7..10 */
7933   unsigned int Entry_GR:5;     /* Number saved     11..15 */
7934   unsigned int Args_stored:1;                   /* 16 */
7935   unsigned int Variable_Frame:1;                /* 17 */
7936   unsigned int Separate_Package_Body:1;         /* 18 */
7937   unsigned int Frame_Extension_Millicode:1;     /* 19 */
7938   unsigned int Stack_Overflow_Check:1;          /* 20 */
7939   unsigned int Two_Instruction_SP_Increment:1;  /* 21 */
7940   unsigned int Ada_Region:1;                    /* 22 */
7941   unsigned int cxx_info:1;                      /* 23 */
7942   unsigned int cxx_try_catch:1;                 /* 24 */
7943   unsigned int sched_entry_seq:1;               /* 25 */
7944   unsigned int reserved2:1;                     /* 26 */
7945   unsigned int Save_SP:1;                       /* 27 */
7946   unsigned int Save_RP:1;                       /* 28 */
7947   unsigned int Save_MRP_in_frame:1;             /* 29 */
7948   unsigned int extn_ptr_defined:1;              /* 30 */
7949   unsigned int Cleanup_defined:1;               /* 31 */
7950
7951   unsigned int MPE_XL_interrupt_marker:1;       /* 0 */
7952   unsigned int HP_UX_interrupt_marker:1;        /* 1 */
7953   unsigned int Large_frame:1;                   /* 2 */
7954   unsigned int Pseudo_SP_Set:1;                 /* 3 */
7955   unsigned int reserved4:1;                     /* 4 */
7956   unsigned int Total_frame_size:27;             /* 5..31 */
7957 };
7958
7959 struct hppa_unw_aux_info
7960 {
7961   struct hppa_unw_table_entry *  table;         /* Unwind table.  */
7962   unsigned long                  table_len;     /* Length of unwind table.  */
7963   bfd_vma                        seg_base;      /* Starting address of segment.  */
7964   Elf_Internal_Sym *             symtab;        /* The symbol table.  */
7965   unsigned long                  nsyms;         /* Number of symbols.  */
7966   Elf_Internal_Sym *             funtab;        /* Sorted table of STT_FUNC symbols.  */
7967   unsigned long                  nfuns;         /* Number of entries in funtab.  */
7968   char *                         strtab;        /* The string table.  */
7969   unsigned long                  strtab_size;   /* Size of string table.  */
7970 };
7971
7972 static bfd_boolean
7973 dump_hppa_unwind (Filedata * filedata, struct hppa_unw_aux_info * aux)
7974 {
7975   struct hppa_unw_table_entry * tp;
7976   unsigned long j, nfuns;
7977   bfd_boolean res = TRUE;
7978
7979   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7980   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7981     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7982       aux->funtab[nfuns++] = aux->symtab[j];
7983   aux->nfuns = nfuns;
7984   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7985
7986   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7987     {
7988       bfd_vma offset;
7989       const char * procname;
7990
7991       find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7992                                aux->strtab_size, tp->start, &procname,
7993                                &offset);
7994
7995       fputs ("\n<", stdout);
7996
7997       if (procname)
7998         {
7999           fputs (procname, stdout);
8000
8001           if (offset)
8002             printf ("+%lx", (unsigned long) offset);
8003         }
8004
8005       fputs (">: [", stdout);
8006       print_vma (tp->start.offset, PREFIX_HEX);
8007       fputc ('-', stdout);
8008       print_vma (tp->end.offset, PREFIX_HEX);
8009       printf ("]\n\t");
8010
8011 #define PF(_m) if (tp->_m) printf (#_m " ");
8012 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
8013       PF(Cannot_unwind);
8014       PF(Millicode);
8015       PF(Millicode_save_sr0);
8016       /* PV(Region_description);  */
8017       PF(Entry_SR);
8018       PV(Entry_FR);
8019       PV(Entry_GR);
8020       PF(Args_stored);
8021       PF(Variable_Frame);
8022       PF(Separate_Package_Body);
8023       PF(Frame_Extension_Millicode);
8024       PF(Stack_Overflow_Check);
8025       PF(Two_Instruction_SP_Increment);
8026       PF(Ada_Region);
8027       PF(cxx_info);
8028       PF(cxx_try_catch);
8029       PF(sched_entry_seq);
8030       PF(Save_SP);
8031       PF(Save_RP);
8032       PF(Save_MRP_in_frame);
8033       PF(extn_ptr_defined);
8034       PF(Cleanup_defined);
8035       PF(MPE_XL_interrupt_marker);
8036       PF(HP_UX_interrupt_marker);
8037       PF(Large_frame);
8038       PF(Pseudo_SP_Set);
8039       PV(Total_frame_size);
8040 #undef PF
8041 #undef PV
8042     }
8043
8044   printf ("\n");
8045
8046   free (aux->funtab);
8047
8048   return res;
8049 }
8050
8051 static bfd_boolean
8052 slurp_hppa_unwind_table (Filedata *                  filedata,
8053                          struct hppa_unw_aux_info *  aux,
8054                          Elf_Internal_Shdr *         sec)
8055 {
8056   unsigned long size, unw_ent_size, nentries, nrelas, i;
8057   Elf_Internal_Phdr * seg;
8058   struct hppa_unw_table_entry * tep;
8059   Elf_Internal_Shdr * relsec;
8060   Elf_Internal_Rela * rela;
8061   Elf_Internal_Rela * rp;
8062   unsigned char * table;
8063   unsigned char * tp;
8064   Elf_Internal_Sym * sym;
8065   const char * relname;
8066
8067   /* First, find the starting address of the segment that includes
8068      this section.  */
8069   if (filedata->file_header.e_phnum)
8070     {
8071       if (! get_program_headers (filedata))
8072         return FALSE;
8073
8074       for (seg = filedata->program_headers;
8075            seg < filedata->program_headers + filedata->file_header.e_phnum;
8076            ++seg)
8077         {
8078           if (seg->p_type != PT_LOAD)
8079             continue;
8080
8081           if (sec->sh_addr >= seg->p_vaddr
8082               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
8083             {
8084               aux->seg_base = seg->p_vaddr;
8085               break;
8086             }
8087         }
8088     }
8089
8090   /* Second, build the unwind table from the contents of the unwind
8091      section.  */
8092   size = sec->sh_size;
8093   table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
8094                                       _("unwind table"));
8095   if (!table)
8096     return FALSE;
8097
8098   unw_ent_size = 16;
8099   nentries = size / unw_ent_size;
8100   size = unw_ent_size * nentries;
8101
8102   tep = aux->table = (struct hppa_unw_table_entry *)
8103       xcmalloc (nentries, sizeof (aux->table[0]));
8104
8105   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
8106     {
8107       unsigned int tmp1, tmp2;
8108
8109       tep->start.section = SHN_UNDEF;
8110       tep->end.section   = SHN_UNDEF;
8111
8112       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
8113       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
8114       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
8115       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
8116
8117       tep->start.offset += aux->seg_base;
8118       tep->end.offset   += aux->seg_base;
8119
8120       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
8121       tep->Millicode = (tmp1 >> 30) & 0x1;
8122       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
8123       tep->Region_description = (tmp1 >> 27) & 0x3;
8124       tep->reserved1 = (tmp1 >> 26) & 0x1;
8125       tep->Entry_SR = (tmp1 >> 25) & 0x1;
8126       tep->Entry_FR = (tmp1 >> 21) & 0xf;
8127       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
8128       tep->Args_stored = (tmp1 >> 15) & 0x1;
8129       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
8130       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
8131       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
8132       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
8133       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
8134       tep->Ada_Region = (tmp1 >> 9) & 0x1;
8135       tep->cxx_info = (tmp1 >> 8) & 0x1;
8136       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
8137       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
8138       tep->reserved2 = (tmp1 >> 5) & 0x1;
8139       tep->Save_SP = (tmp1 >> 4) & 0x1;
8140       tep->Save_RP = (tmp1 >> 3) & 0x1;
8141       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
8142       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
8143       tep->Cleanup_defined = tmp1 & 0x1;
8144
8145       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
8146       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
8147       tep->Large_frame = (tmp2 >> 29) & 0x1;
8148       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
8149       tep->reserved4 = (tmp2 >> 27) & 0x1;
8150       tep->Total_frame_size = tmp2 & 0x7ffffff;
8151     }
8152   free (table);
8153
8154   /* Third, apply any relocations to the unwind table.  */
8155   for (relsec = filedata->section_headers;
8156        relsec < filedata->section_headers + filedata->file_header.e_shnum;
8157        ++relsec)
8158     {
8159       if (relsec->sh_type != SHT_RELA
8160           || relsec->sh_info >= filedata->file_header.e_shnum
8161           || filedata->section_headers + relsec->sh_info != sec)
8162         continue;
8163
8164       if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
8165                               & rela, & nrelas))
8166         return FALSE;
8167
8168       for (rp = rela; rp < rela + nrelas; ++rp)
8169         {
8170           unsigned int sym_ndx;
8171           unsigned int r_type = get_reloc_type (filedata, rp->r_info);
8172           relname = elf_hppa_reloc_type (r_type);
8173
8174           if (relname == NULL)
8175             {
8176               warn (_("Skipping unknown relocation type: %u\n"), r_type);
8177               continue;
8178             }
8179
8180           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
8181           if (! const_strneq (relname, "R_PARISC_SEGREL"))
8182             {
8183               warn (_("Skipping unexpected relocation type: %s\n"), relname);
8184               continue;
8185             }
8186
8187           i = rp->r_offset / unw_ent_size;
8188           if (i >= aux->table_len)
8189             {
8190               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
8191               continue;
8192             }
8193
8194           sym_ndx = get_reloc_symindex (rp->r_info);
8195           if (sym_ndx >= aux->nsyms)
8196             {
8197               warn (_("Skipping reloc with invalid symbol index: %u\n"),
8198                     sym_ndx);
8199               continue;
8200             }
8201           sym = aux->symtab + sym_ndx;
8202
8203           switch ((rp->r_offset % unw_ent_size) / 4)
8204             {
8205             case 0:
8206               aux->table[i].start.section = sym->st_shndx;
8207               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
8208               break;
8209             case 1:
8210               aux->table[i].end.section   = sym->st_shndx;
8211               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
8212               break;
8213             default:
8214               break;
8215             }
8216         }
8217
8218       free (rela);
8219     }
8220
8221   aux->table_len = nentries;
8222
8223   return TRUE;
8224 }
8225
8226 static bfd_boolean
8227 hppa_process_unwind (Filedata * filedata)
8228 {
8229   struct hppa_unw_aux_info aux;
8230   Elf_Internal_Shdr * unwsec = NULL;
8231   Elf_Internal_Shdr * strsec;
8232   Elf_Internal_Shdr * sec;
8233   unsigned long i;
8234   bfd_boolean res = TRUE;
8235
8236   if (filedata->string_table == NULL)
8237     return FALSE;
8238
8239   memset (& aux, 0, sizeof (aux));
8240
8241   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8242     {
8243       if (sec->sh_type == SHT_SYMTAB
8244           && sec->sh_link < filedata->file_header.e_shnum)
8245         {
8246           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
8247
8248           strsec = filedata->section_headers + sec->sh_link;
8249           if (aux.strtab != NULL)
8250             {
8251               error (_("Multiple auxillary string tables encountered\n"));
8252               free (aux.strtab);
8253               res = FALSE;
8254             }
8255           aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
8256                                           1, strsec->sh_size,
8257                                           _("string table"));
8258           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8259         }
8260       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8261         unwsec = sec;
8262     }
8263
8264   if (!unwsec)
8265     printf (_("\nThere are no unwind sections in this file.\n"));
8266
8267   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8268     {
8269       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8270         {
8271           unsigned long num_unwind = sec->sh_size / 16;
8272
8273           printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
8274                             "contains %lu entry:\n",
8275                             "\nUnwind section '%s' at offset 0x%lx "
8276                             "contains %lu entries:\n",
8277                             num_unwind),
8278                   printable_section_name (filedata, sec),
8279                   (unsigned long) sec->sh_offset,
8280                   num_unwind);
8281
8282           if (! slurp_hppa_unwind_table (filedata, &aux, sec))
8283             res = FALSE;
8284
8285           if (res && aux.table_len > 0)
8286             {
8287               if (! dump_hppa_unwind (filedata, &aux))
8288                 res = FALSE;
8289             }
8290
8291           if (aux.table)
8292             free ((char *) aux.table);
8293           aux.table = NULL;
8294         }
8295     }
8296
8297   if (aux.symtab)
8298     free (aux.symtab);
8299   if (aux.strtab)
8300     free ((char *) aux.strtab);
8301
8302   return res;
8303 }
8304
8305 struct arm_section
8306 {
8307   unsigned char *      data;            /* The unwind data.  */
8308   Elf_Internal_Shdr *  sec;             /* The cached unwind section header.  */
8309   Elf_Internal_Rela *  rela;            /* The cached relocations for this section.  */
8310   unsigned long        nrelas;          /* The number of relocations.  */
8311   unsigned int         rel_type;        /* REL or RELA ?  */
8312   Elf_Internal_Rela *  next_rela;       /* Cyclic pointer to the next reloc to process.  */
8313 };
8314
8315 struct arm_unw_aux_info
8316 {
8317   Filedata *          filedata;         /* The file containing the unwind sections.  */
8318   Elf_Internal_Sym *  symtab;           /* The file's symbol table.  */
8319   unsigned long       nsyms;            /* Number of symbols.  */
8320   Elf_Internal_Sym *  funtab;           /* Sorted table of STT_FUNC symbols.  */
8321   unsigned long       nfuns;            /* Number of these symbols.  */
8322   char *              strtab;           /* The file's string table.  */
8323   unsigned long       strtab_size;      /* Size of string table.  */
8324 };
8325
8326 static const char *
8327 arm_print_vma_and_name (Filedata *                 filedata,
8328                         struct arm_unw_aux_info *  aux,
8329                         bfd_vma                    fn,
8330                         struct absaddr             addr)
8331 {
8332   const char *procname;
8333   bfd_vma sym_offset;
8334
8335   if (addr.section == SHN_UNDEF)
8336     addr.offset = fn;
8337
8338   find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
8339                            aux->strtab_size, addr, &procname,
8340                            &sym_offset);
8341
8342   print_vma (fn, PREFIX_HEX);
8343
8344   if (procname)
8345     {
8346       fputs (" <", stdout);
8347       fputs (procname, stdout);
8348
8349       if (sym_offset)
8350         printf ("+0x%lx", (unsigned long) sym_offset);
8351       fputc ('>', stdout);
8352     }
8353
8354   return procname;
8355 }
8356
8357 static void
8358 arm_free_section (struct arm_section *arm_sec)
8359 {
8360   if (arm_sec->data != NULL)
8361     free (arm_sec->data);
8362
8363   if (arm_sec->rela != NULL)
8364     free (arm_sec->rela);
8365 }
8366
8367 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
8368       cached section and install SEC instead.
8369    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
8370       and return its valued in * WORDP, relocating if necessary.
8371    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
8372       relocation's offset in ADDR.
8373    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
8374       into the string table of the symbol associated with the reloc.  If no
8375       reloc was applied store -1 there.
8376    5) Return TRUE upon success, FALSE otherwise.  */
8377
8378 static bfd_boolean
8379 get_unwind_section_word (Filedata *                 filedata,
8380                          struct arm_unw_aux_info *  aux,
8381                          struct arm_section *       arm_sec,
8382                          Elf_Internal_Shdr *        sec,
8383                          bfd_vma                    word_offset,
8384                          unsigned int *             wordp,
8385                          struct absaddr *           addr,
8386                          bfd_vma *                  sym_name)
8387 {
8388   Elf_Internal_Rela *rp;
8389   Elf_Internal_Sym *sym;
8390   const char * relname;
8391   unsigned int word;
8392   bfd_boolean wrapped;
8393
8394   if (sec == NULL || arm_sec == NULL)
8395     return FALSE;
8396
8397   addr->section = SHN_UNDEF;
8398   addr->offset = 0;
8399
8400   if (sym_name != NULL)
8401     *sym_name = (bfd_vma) -1;
8402
8403   /* If necessary, update the section cache.  */
8404   if (sec != arm_sec->sec)
8405     {
8406       Elf_Internal_Shdr *relsec;
8407
8408       arm_free_section (arm_sec);
8409
8410       arm_sec->sec = sec;
8411       arm_sec->data = get_data (NULL, aux->filedata, sec->sh_offset, 1,
8412                                 sec->sh_size, _("unwind data"));
8413       arm_sec->rela = NULL;
8414       arm_sec->nrelas = 0;
8415
8416       for (relsec = filedata->section_headers;
8417            relsec < filedata->section_headers + filedata->file_header.e_shnum;
8418            ++relsec)
8419         {
8420           if (relsec->sh_info >= filedata->file_header.e_shnum
8421               || filedata->section_headers + relsec->sh_info != sec
8422               /* PR 15745: Check the section type as well.  */
8423               || (relsec->sh_type != SHT_REL
8424                   && relsec->sh_type != SHT_RELA))
8425             continue;
8426
8427           arm_sec->rel_type = relsec->sh_type;
8428           if (relsec->sh_type == SHT_REL)
8429             {
8430               if (!slurp_rel_relocs (aux->filedata, relsec->sh_offset,
8431                                      relsec->sh_size,
8432                                      & arm_sec->rela, & arm_sec->nrelas))
8433                 return FALSE;
8434             }
8435           else /* relsec->sh_type == SHT_RELA */
8436             {
8437               if (!slurp_rela_relocs (aux->filedata, relsec->sh_offset,
8438                                       relsec->sh_size,
8439                                       & arm_sec->rela, & arm_sec->nrelas))
8440                 return FALSE;
8441             }
8442           break;
8443         }
8444
8445       arm_sec->next_rela = arm_sec->rela;
8446     }
8447
8448   /* If there is no unwind data we can do nothing.  */
8449   if (arm_sec->data == NULL)
8450     return FALSE;
8451
8452   /* If the offset is invalid then fail.  */
8453   if (/* PR 21343 *//* PR 18879 */
8454       sec->sh_size < 4
8455       || word_offset > (sec->sh_size - 4)
8456       || ((bfd_signed_vma) word_offset) < 0)
8457     return FALSE;
8458
8459   /* Get the word at the required offset.  */
8460   word = byte_get (arm_sec->data + word_offset, 4);
8461
8462   /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128.  */
8463   if (arm_sec->rela == NULL)
8464     {
8465       * wordp = word;
8466       return TRUE;
8467     }
8468
8469   /* Look through the relocs to find the one that applies to the provided offset.  */
8470   wrapped = FALSE;
8471   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
8472     {
8473       bfd_vma prelval, offset;
8474
8475       if (rp->r_offset > word_offset && !wrapped)
8476         {
8477           rp = arm_sec->rela;
8478           wrapped = TRUE;
8479         }
8480       if (rp->r_offset > word_offset)
8481         break;
8482
8483       if (rp->r_offset & 3)
8484         {
8485           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8486                 (unsigned long) rp->r_offset);
8487           continue;
8488         }
8489
8490       if (rp->r_offset < word_offset)
8491         continue;
8492
8493       /* PR 17531: file: 027-161405-0.004  */
8494       if (aux->symtab == NULL)
8495         continue;
8496
8497       if (arm_sec->rel_type == SHT_REL)
8498         {
8499           offset = word & 0x7fffffff;
8500           if (offset & 0x40000000)
8501             offset |= ~ (bfd_vma) 0x7fffffff;
8502         }
8503       else if (arm_sec->rel_type == SHT_RELA)
8504         offset = rp->r_addend;
8505       else
8506         {
8507           error (_("Unknown section relocation type %d encountered\n"),
8508                  arm_sec->rel_type);
8509           break;
8510         }
8511
8512       /* PR 17531 file: 027-1241568-0.004.  */
8513       if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8514         {
8515           error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8516                  (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8517           break;
8518         }
8519
8520       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
8521       offset += sym->st_value;
8522       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8523
8524       /* Check that we are processing the expected reloc type.  */
8525       if (filedata->file_header.e_machine == EM_ARM)
8526         {
8527           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
8528           if (relname == NULL)
8529             {
8530               warn (_("Skipping unknown ARM relocation type: %d\n"),
8531                     (int) ELF32_R_TYPE (rp->r_info));
8532               continue;
8533             }
8534
8535           if (streq (relname, "R_ARM_NONE"))
8536               continue;
8537
8538           if (! streq (relname, "R_ARM_PREL31"))
8539             {
8540               warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
8541               continue;
8542             }
8543         }
8544       else if (filedata->file_header.e_machine == EM_TI_C6000)
8545         {
8546           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
8547           if (relname == NULL)
8548             {
8549               warn (_("Skipping unknown C6000 relocation type: %d\n"),
8550                     (int) ELF32_R_TYPE (rp->r_info));
8551               continue;
8552             }
8553
8554           if (streq (relname, "R_C6000_NONE"))
8555             continue;
8556
8557           if (! streq (relname, "R_C6000_PREL31"))
8558             {
8559               warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
8560               continue;
8561             }
8562
8563           prelval >>= 1;
8564         }
8565       else
8566         {
8567           /* This function currently only supports ARM and TI unwinders.  */
8568           warn (_("Only TI and ARM unwinders are currently supported\n"));
8569           break;
8570         }
8571
8572       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8573       addr->section = sym->st_shndx;
8574       addr->offset = offset;
8575
8576       if (sym_name)
8577         * sym_name = sym->st_name;
8578       break;
8579     }
8580
8581   *wordp = word;
8582   arm_sec->next_rela = rp;
8583
8584   return TRUE;
8585 }
8586
8587 static const char *tic6x_unwind_regnames[16] =
8588 {
8589   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8590   "A14", "A13", "A12", "A11", "A10",
8591   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8592 };
8593
8594 static void
8595 decode_tic6x_unwind_regmask (unsigned int mask)
8596 {
8597   int i;
8598
8599   for (i = 12; mask; mask >>= 1, i--)
8600     {
8601       if (mask & 1)
8602         {
8603           fputs (tic6x_unwind_regnames[i], stdout);
8604           if (mask > 1)
8605             fputs (", ", stdout);
8606         }
8607     }
8608 }
8609
8610 #define ADVANCE                                                 \
8611   if (remaining == 0 && more_words)                             \
8612     {                                                           \
8613       data_offset += 4;                                         \
8614       if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec,     \
8615                                      data_offset, & word, & addr, NULL))        \
8616         return FALSE;                                           \
8617       remaining = 4;                                            \
8618       more_words--;                                             \
8619     }                                                           \
8620
8621 #define GET_OP(OP)                      \
8622   ADVANCE;                              \
8623   if (remaining)                        \
8624     {                                   \
8625       remaining--;                      \
8626       (OP) = word >> 24;                \
8627       word <<= 8;                       \
8628     }                                   \
8629   else                                  \
8630     {                                   \
8631       printf (_("[Truncated opcode]\n"));       \
8632       return FALSE;                     \
8633     }                                   \
8634   printf ("0x%02x ", OP)
8635
8636 static bfd_boolean
8637 decode_arm_unwind_bytecode (Filedata *                 filedata,
8638                             struct arm_unw_aux_info *  aux,
8639                             unsigned int               word,
8640                             unsigned int               remaining,
8641                             unsigned int               more_words,
8642                             bfd_vma                    data_offset,
8643                             Elf_Internal_Shdr *        data_sec,
8644                             struct arm_section *       data_arm_sec)
8645 {
8646   struct absaddr addr;
8647   bfd_boolean res = TRUE;
8648
8649   /* Decode the unwinding instructions.  */
8650   while (1)
8651     {
8652       unsigned int op, op2;
8653
8654       ADVANCE;
8655       if (remaining == 0)
8656         break;
8657       remaining--;
8658       op = word >> 24;
8659       word <<= 8;
8660
8661       printf ("  0x%02x ", op);
8662
8663       if ((op & 0xc0) == 0x00)
8664         {
8665           int offset = ((op & 0x3f) << 2) + 4;
8666
8667           printf ("     vsp = vsp + %d", offset);
8668         }
8669       else if ((op & 0xc0) == 0x40)
8670         {
8671           int offset = ((op & 0x3f) << 2) + 4;
8672
8673           printf ("     vsp = vsp - %d", offset);
8674         }
8675       else if ((op & 0xf0) == 0x80)
8676         {
8677           GET_OP (op2);
8678           if (op == 0x80 && op2 == 0)
8679             printf (_("Refuse to unwind"));
8680           else
8681             {
8682               unsigned int mask = ((op & 0x0f) << 8) | op2;
8683               bfd_boolean first = TRUE;
8684               int i;
8685
8686               printf ("pop {");
8687               for (i = 0; i < 12; i++)
8688                 if (mask & (1 << i))
8689                   {
8690                     if (first)
8691                       first = FALSE;
8692                     else
8693                       printf (", ");
8694                     printf ("r%d", 4 + i);
8695                   }
8696               printf ("}");
8697             }
8698         }
8699       else if ((op & 0xf0) == 0x90)
8700         {
8701           if (op == 0x9d || op == 0x9f)
8702             printf (_("     [Reserved]"));
8703           else
8704             printf ("     vsp = r%d", op & 0x0f);
8705         }
8706       else if ((op & 0xf0) == 0xa0)
8707         {
8708           int end = 4 + (op & 0x07);
8709           bfd_boolean first = TRUE;
8710           int i;
8711
8712           printf ("     pop {");
8713           for (i = 4; i <= end; i++)
8714             {
8715               if (first)
8716                 first = FALSE;
8717               else
8718                 printf (", ");
8719               printf ("r%d", i);
8720             }
8721           if (op & 0x08)
8722             {
8723               if (!first)
8724                 printf (", ");
8725               printf ("r14");
8726             }
8727           printf ("}");
8728         }
8729       else if (op == 0xb0)
8730         printf (_("     finish"));
8731       else if (op == 0xb1)
8732         {
8733           GET_OP (op2);
8734           if (op2 == 0 || (op2 & 0xf0) != 0)
8735             printf (_("[Spare]"));
8736           else
8737             {
8738               unsigned int mask = op2 & 0x0f;
8739               bfd_boolean first = TRUE;
8740               int i;
8741
8742               printf ("pop {");
8743               for (i = 0; i < 12; i++)
8744                 if (mask & (1 << i))
8745                   {
8746                     if (first)
8747                       first = FALSE;
8748                     else
8749                       printf (", ");
8750                     printf ("r%d", i);
8751                   }
8752               printf ("}");
8753             }
8754         }
8755       else if (op == 0xb2)
8756         {
8757           unsigned char buf[9];
8758           unsigned int i, len;
8759           unsigned long offset;
8760
8761           for (i = 0; i < sizeof (buf); i++)
8762             {
8763               GET_OP (buf[i]);
8764               if ((buf[i] & 0x80) == 0)
8765                 break;
8766             }
8767           if (i == sizeof (buf))
8768             {
8769               error (_("corrupt change to vsp"));
8770               res = FALSE;
8771             }
8772           else
8773             {
8774               offset = read_uleb128 (buf, &len, buf + i + 1);
8775               assert (len == i + 1);
8776               offset = offset * 4 + 0x204;
8777               printf ("vsp = vsp + %ld", offset);
8778             }
8779         }
8780       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8781         {
8782           unsigned int first, last;
8783
8784           GET_OP (op2);
8785           first = op2 >> 4;
8786           last = op2 & 0x0f;
8787           if (op == 0xc8)
8788             first = first + 16;
8789           printf ("pop {D%d", first);
8790           if (last)
8791             printf ("-D%d", first + last);
8792           printf ("}");
8793         }
8794       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8795         {
8796           unsigned int count = op & 0x07;
8797
8798           printf ("pop {D8");
8799           if (count)
8800             printf ("-D%d", 8 + count);
8801           printf ("}");
8802         }
8803       else if (op >= 0xc0 && op <= 0xc5)
8804         {
8805           unsigned int count = op & 0x07;
8806
8807           printf ("     pop {wR10");
8808           if (count)
8809             printf ("-wR%d", 10 + count);
8810           printf ("}");
8811         }
8812       else if (op == 0xc6)
8813         {
8814           unsigned int first, last;
8815
8816           GET_OP (op2);
8817           first = op2 >> 4;
8818           last = op2 & 0x0f;
8819           printf ("pop {wR%d", first);
8820           if (last)
8821             printf ("-wR%d", first + last);
8822           printf ("}");
8823         }
8824       else if (op == 0xc7)
8825         {
8826           GET_OP (op2);
8827           if (op2 == 0 || (op2 & 0xf0) != 0)
8828             printf (_("[Spare]"));
8829           else
8830             {
8831               unsigned int mask = op2 & 0x0f;
8832               bfd_boolean first = TRUE;
8833               int i;
8834
8835               printf ("pop {");
8836               for (i = 0; i < 4; i++)
8837                 if (mask & (1 << i))
8838                   {
8839                     if (first)
8840                       first = FALSE;
8841                     else
8842                       printf (", ");
8843                     printf ("wCGR%d", i);
8844                   }
8845               printf ("}");
8846             }
8847         }
8848       else
8849         {
8850           printf (_("     [unsupported opcode]"));
8851           res = FALSE;
8852         }
8853
8854       printf ("\n");
8855     }
8856
8857   return res;
8858 }
8859
8860 static bfd_boolean
8861 decode_tic6x_unwind_bytecode (Filedata *                 filedata,
8862                               struct arm_unw_aux_info *  aux,
8863                               unsigned int               word,
8864                               unsigned int               remaining,
8865                               unsigned int               more_words,
8866                               bfd_vma                    data_offset,
8867                               Elf_Internal_Shdr *        data_sec,
8868                               struct arm_section *       data_arm_sec)
8869 {
8870   struct absaddr addr;
8871
8872   /* Decode the unwinding instructions.  */
8873   while (1)
8874     {
8875       unsigned int op, op2;
8876
8877       ADVANCE;
8878       if (remaining == 0)
8879         break;
8880       remaining--;
8881       op = word >> 24;
8882       word <<= 8;
8883
8884       printf ("  0x%02x ", op);
8885
8886       if ((op & 0xc0) == 0x00)
8887         {
8888           int offset = ((op & 0x3f) << 3) + 8;
8889           printf ("     sp = sp + %d", offset);
8890         }
8891       else if ((op & 0xc0) == 0x80)
8892         {
8893           GET_OP (op2);
8894           if (op == 0x80 && op2 == 0)
8895             printf (_("Refuse to unwind"));
8896           else
8897             {
8898               unsigned int mask = ((op & 0x1f) << 8) | op2;
8899               if (op & 0x20)
8900                 printf ("pop compact {");
8901               else
8902                 printf ("pop {");
8903
8904               decode_tic6x_unwind_regmask (mask);
8905               printf("}");
8906             }
8907         }
8908       else if ((op & 0xf0) == 0xc0)
8909         {
8910           unsigned int reg;
8911           unsigned int nregs;
8912           unsigned int i;
8913           const char *name;
8914           struct
8915           {
8916             unsigned int offset;
8917             unsigned int reg;
8918           } regpos[16];
8919
8920           /* Scan entire instruction first so that GET_OP output is not
8921              interleaved with disassembly.  */
8922           nregs = 0;
8923           for (i = 0; nregs < (op & 0xf); i++)
8924             {
8925               GET_OP (op2);
8926               reg = op2 >> 4;
8927               if (reg != 0xf)
8928                 {
8929                   regpos[nregs].offset = i * 2;
8930                   regpos[nregs].reg = reg;
8931                   nregs++;
8932                 }
8933
8934               reg = op2 & 0xf;
8935               if (reg != 0xf)
8936                 {
8937                   regpos[nregs].offset = i * 2 + 1;
8938                   regpos[nregs].reg = reg;
8939                   nregs++;
8940                 }
8941             }
8942
8943           printf (_("pop frame {"));
8944           if (nregs == 0)
8945             {
8946               printf (_("*corrupt* - no registers specified"));
8947             }
8948           else
8949             {
8950               reg = nregs - 1;
8951               for (i = i * 2; i > 0; i--)
8952                 {
8953                   if (regpos[reg].offset == i - 1)
8954                     {
8955                       name = tic6x_unwind_regnames[regpos[reg].reg];
8956                       if (reg > 0)
8957                         reg--;
8958                     }
8959                   else
8960                     name = _("[pad]");
8961
8962                   fputs (name, stdout);
8963                   if (i > 1)
8964                     printf (", ");
8965                 }
8966             }
8967
8968           printf ("}");
8969         }
8970       else if (op == 0xd0)
8971         printf ("     MOV FP, SP");
8972       else if (op == 0xd1)
8973         printf ("     __c6xabi_pop_rts");
8974       else if (op == 0xd2)
8975         {
8976           unsigned char buf[9];
8977           unsigned int i, len;
8978           unsigned long offset;
8979
8980           for (i = 0; i < sizeof (buf); i++)
8981             {
8982               GET_OP (buf[i]);
8983               if ((buf[i] & 0x80) == 0)
8984                 break;
8985             }
8986           /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2.  */
8987           if (i == sizeof (buf))
8988             {
8989               warn (_("Corrupt stack pointer adjustment detected\n"));
8990               return FALSE;
8991             }
8992
8993           offset = read_uleb128 (buf, &len, buf + i + 1);
8994           assert (len == i + 1);
8995           offset = offset * 8 + 0x408;
8996           printf (_("sp = sp + %ld"), offset);
8997         }
8998       else if ((op & 0xf0) == 0xe0)
8999         {
9000           if ((op & 0x0f) == 7)
9001             printf ("     RETURN");
9002           else
9003             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
9004         }
9005       else
9006         {
9007           printf (_("     [unsupported opcode]"));
9008         }
9009       putchar ('\n');
9010     }
9011
9012   return TRUE;
9013 }
9014
9015 static bfd_vma
9016 arm_expand_prel31 (Filedata * filedata, bfd_vma word, bfd_vma where)
9017 {
9018   bfd_vma offset;
9019
9020   offset = word & 0x7fffffff;
9021   if (offset & 0x40000000)
9022     offset |= ~ (bfd_vma) 0x7fffffff;
9023
9024   if (filedata->file_header.e_machine == EM_TI_C6000)
9025     offset <<= 1;
9026
9027   return offset + where;
9028 }
9029
9030 static bfd_boolean
9031 decode_arm_unwind (Filedata *                 filedata,
9032                    struct arm_unw_aux_info *  aux,
9033                    unsigned int               word,
9034                    unsigned int               remaining,
9035                    bfd_vma                    data_offset,
9036                    Elf_Internal_Shdr *        data_sec,
9037                    struct arm_section *       data_arm_sec)
9038 {
9039   int per_index;
9040   unsigned int more_words = 0;
9041   struct absaddr addr;
9042   bfd_vma sym_name = (bfd_vma) -1;
9043   bfd_boolean res = TRUE;
9044
9045   if (remaining == 0)
9046     {
9047       /* Fetch the first word.
9048          Note - when decoding an object file the address extracted
9049          here will always be 0.  So we also pass in the sym_name
9050          parameter so that we can find the symbol associated with
9051          the personality routine.  */
9052       if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, data_offset,
9053                                      & word, & addr, & sym_name))
9054         return FALSE;
9055
9056       remaining = 4;
9057     }
9058   else
9059     {
9060       addr.section = SHN_UNDEF;
9061       addr.offset = 0;
9062     }
9063
9064   if ((word & 0x80000000) == 0)
9065     {
9066       /* Expand prel31 for personality routine.  */
9067       bfd_vma fn;
9068       const char *procname;
9069
9070       fn = arm_expand_prel31 (filedata, word, data_sec->sh_addr + data_offset);
9071       printf (_("  Personality routine: "));
9072       if (fn == 0
9073           && addr.section == SHN_UNDEF && addr.offset == 0
9074           && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
9075         {
9076           procname = aux->strtab + sym_name;
9077           print_vma (fn, PREFIX_HEX);
9078           if (procname)
9079             {
9080               fputs (" <", stdout);
9081               fputs (procname, stdout);
9082               fputc ('>', stdout);
9083             }
9084         }
9085       else
9086         procname = arm_print_vma_and_name (filedata, aux, fn, addr);
9087       fputc ('\n', stdout);
9088
9089       /* The GCC personality routines use the standard compact
9090          encoding, starting with one byte giving the number of
9091          words.  */
9092       if (procname != NULL
9093           && (const_strneq (procname, "__gcc_personality_v0")
9094               || const_strneq (procname, "__gxx_personality_v0")
9095               || const_strneq (procname, "__gcj_personality_v0")
9096               || const_strneq (procname, "__gnu_objc_personality_v0")))
9097         {
9098           remaining = 0;
9099           more_words = 1;
9100           ADVANCE;
9101           if (!remaining)
9102             {
9103               printf (_("  [Truncated data]\n"));
9104               return FALSE;
9105             }
9106           more_words = word >> 24;
9107           word <<= 8;
9108           remaining--;
9109           per_index = -1;
9110         }
9111       else
9112         return TRUE;
9113     }
9114   else
9115     {
9116       /* ARM EHABI Section 6.3:
9117
9118          An exception-handling table entry for the compact model looks like:
9119
9120            31 30-28 27-24 23-0
9121            -- ----- ----- ----
9122             1   0   index Data for personalityRoutine[index]    */
9123
9124       if (filedata->file_header.e_machine == EM_ARM
9125           && (word & 0x70000000))
9126         {
9127           warn (_("Corrupt ARM compact model table entry: %x \n"), word);
9128           res = FALSE;
9129         }
9130
9131       per_index = (word >> 24) & 0x7f;
9132       printf (_("  Compact model index: %d\n"), per_index);
9133       if (per_index == 0)
9134         {
9135           more_words = 0;
9136           word <<= 8;
9137           remaining--;
9138         }
9139       else if (per_index < 3)
9140         {
9141           more_words = (word >> 16) & 0xff;
9142           word <<= 16;
9143           remaining -= 2;
9144         }
9145     }
9146
9147   switch (filedata->file_header.e_machine)
9148     {
9149     case EM_ARM:
9150       if (per_index < 3)
9151         {
9152           if (! decode_arm_unwind_bytecode (filedata, aux, word, remaining, more_words,
9153                                             data_offset, data_sec, data_arm_sec))
9154             res = FALSE;
9155         }
9156       else
9157         {
9158           warn (_("Unknown ARM compact model index encountered\n"));
9159           printf (_("  [reserved]\n"));
9160           res = FALSE;
9161         }
9162       break;
9163
9164     case EM_TI_C6000:
9165       if (per_index < 3)
9166         {
9167           if (! decode_tic6x_unwind_bytecode (filedata, aux, word, remaining, more_words,
9168                                               data_offset, data_sec, data_arm_sec))
9169             res = FALSE;
9170         }
9171       else if (per_index < 5)
9172         {
9173           if (((word >> 17) & 0x7f) == 0x7f)
9174             printf (_("  Restore stack from frame pointer\n"));
9175           else
9176             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
9177           printf (_("  Registers restored: "));
9178           if (per_index == 4)
9179             printf (" (compact) ");
9180           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
9181           putchar ('\n');
9182           printf (_("  Return register: %s\n"),
9183                   tic6x_unwind_regnames[word & 0xf]);
9184         }
9185       else
9186         printf (_("  [reserved (%d)]\n"), per_index);
9187       break;
9188
9189     default:
9190       error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
9191              filedata->file_header.e_machine);
9192       res = FALSE;
9193     }
9194
9195   /* Decode the descriptors.  Not implemented.  */
9196
9197   return res;
9198 }
9199
9200 static bfd_boolean
9201 dump_arm_unwind (Filedata *                 filedata,
9202                  struct arm_unw_aux_info *  aux,
9203                  Elf_Internal_Shdr *        exidx_sec)
9204 {
9205   struct arm_section exidx_arm_sec, extab_arm_sec;
9206   unsigned int i, exidx_len;
9207   unsigned long j, nfuns;
9208   bfd_boolean res = TRUE;
9209
9210   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
9211   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
9212   exidx_len = exidx_sec->sh_size / 8;
9213
9214   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
9215   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
9216     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
9217       aux->funtab[nfuns++] = aux->symtab[j];
9218   aux->nfuns = nfuns;
9219   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
9220
9221   for (i = 0; i < exidx_len; i++)
9222     {
9223       unsigned int exidx_fn, exidx_entry;
9224       struct absaddr fn_addr, entry_addr;
9225       bfd_vma fn;
9226
9227       fputc ('\n', stdout);
9228
9229       if (! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9230                                      8 * i, & exidx_fn, & fn_addr, NULL)
9231           || ! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9232                                         8 * i + 4, & exidx_entry, & entry_addr, NULL))
9233         {
9234           free (aux->funtab);
9235           arm_free_section (& exidx_arm_sec);
9236           arm_free_section (& extab_arm_sec);
9237           return FALSE;
9238         }
9239
9240       /* ARM EHABI, Section 5:
9241          An index table entry consists of 2 words.
9242          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
9243       if (exidx_fn & 0x80000000)
9244         {
9245           warn (_("corrupt index table entry: %x\n"), exidx_fn);
9246           res = FALSE;
9247         }
9248
9249       fn = arm_expand_prel31 (filedata, exidx_fn, exidx_sec->sh_addr + 8 * i);
9250
9251       arm_print_vma_and_name (filedata, aux, fn, fn_addr);
9252       fputs (": ", stdout);
9253
9254       if (exidx_entry == 1)
9255         {
9256           print_vma (exidx_entry, PREFIX_HEX);
9257           fputs (" [cantunwind]\n", stdout);
9258         }
9259       else if (exidx_entry & 0x80000000)
9260         {
9261           print_vma (exidx_entry, PREFIX_HEX);
9262           fputc ('\n', stdout);
9263           decode_arm_unwind (filedata, aux, exidx_entry, 4, 0, NULL, NULL);
9264         }
9265       else
9266         {
9267           bfd_vma table, table_offset = 0;
9268           Elf_Internal_Shdr *table_sec;
9269
9270           fputs ("@", stdout);
9271           table = arm_expand_prel31 (filedata, exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
9272           print_vma (table, PREFIX_HEX);
9273           printf ("\n");
9274
9275           /* Locate the matching .ARM.extab.  */
9276           if (entry_addr.section != SHN_UNDEF
9277               && entry_addr.section < filedata->file_header.e_shnum)
9278             {
9279               table_sec = filedata->section_headers + entry_addr.section;
9280               table_offset = entry_addr.offset;
9281               /* PR 18879 */
9282               if (table_offset > table_sec->sh_size
9283                   || ((bfd_signed_vma) table_offset) < 0)
9284                 {
9285                   warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
9286                         (unsigned long) table_offset,
9287                         printable_section_name (filedata, table_sec));
9288                   res = FALSE;
9289                   continue;
9290                 }
9291             }
9292           else
9293             {
9294               table_sec = find_section_by_address (filedata, table);
9295               if (table_sec != NULL)
9296                 table_offset = table - table_sec->sh_addr;
9297             }
9298
9299           if (table_sec == NULL)
9300             {
9301               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
9302                     (unsigned long) table);
9303               res = FALSE;
9304               continue;
9305             }
9306
9307           if (! decode_arm_unwind (filedata, aux, 0, 0, table_offset, table_sec,
9308                                    &extab_arm_sec))
9309             res = FALSE;
9310         }
9311     }
9312
9313   printf ("\n");
9314
9315   free (aux->funtab);
9316   arm_free_section (&exidx_arm_sec);
9317   arm_free_section (&extab_arm_sec);
9318
9319   return res;
9320 }
9321
9322 /* Used for both ARM and C6X unwinding tables.  */
9323
9324 static bfd_boolean
9325 arm_process_unwind (Filedata * filedata)
9326 {
9327   struct arm_unw_aux_info aux;
9328   Elf_Internal_Shdr *unwsec = NULL;
9329   Elf_Internal_Shdr *strsec;
9330   Elf_Internal_Shdr *sec;
9331   unsigned long i;
9332   unsigned int sec_type;
9333   bfd_boolean res = TRUE;
9334
9335   switch (filedata->file_header.e_machine)
9336     {
9337     case EM_ARM:
9338       sec_type = SHT_ARM_EXIDX;
9339       break;
9340
9341     case EM_TI_C6000:
9342       sec_type = SHT_C6000_UNWIND;
9343       break;
9344
9345     default:
9346       error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
9347              filedata->file_header.e_machine);
9348       return FALSE;
9349     }
9350
9351   if (filedata->string_table == NULL)
9352     return FALSE;
9353
9354   memset (& aux, 0, sizeof (aux));
9355   aux.filedata = filedata;
9356
9357   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9358     {
9359       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < filedata->file_header.e_shnum)
9360         {
9361           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
9362
9363           strsec = filedata->section_headers + sec->sh_link;
9364
9365           /* PR binutils/17531 file: 011-12666-0.004.  */
9366           if (aux.strtab != NULL)
9367             {
9368               error (_("Multiple string tables found in file.\n"));
9369               free (aux.strtab);
9370               res = FALSE;
9371             }
9372           aux.strtab = get_data (NULL, filedata, strsec->sh_offset,
9373                                  1, strsec->sh_size, _("string table"));
9374           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
9375         }
9376       else if (sec->sh_type == sec_type)
9377         unwsec = sec;
9378     }
9379
9380   if (unwsec == NULL)
9381     printf (_("\nThere are no unwind sections in this file.\n"));
9382   else
9383     for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9384       {
9385         if (sec->sh_type == sec_type)
9386           {
9387             unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size);
9388             printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
9389                               "contains %lu entry:\n",
9390                               "\nUnwind section '%s' at offset 0x%lx "
9391                               "contains %lu entries:\n",
9392                               num_unwind),
9393                     printable_section_name (filedata, sec),
9394                     (unsigned long) sec->sh_offset,
9395                     num_unwind);
9396
9397             if (! dump_arm_unwind (filedata, &aux, sec))
9398               res = FALSE;
9399           }
9400       }
9401
9402   if (aux.symtab)
9403     free (aux.symtab);
9404   if (aux.strtab)
9405     free ((char *) aux.strtab);
9406
9407   return res;
9408 }
9409
9410 static bfd_boolean
9411 process_unwind (Filedata * filedata)
9412 {
9413   struct unwind_handler
9414   {
9415     unsigned int machtype;
9416     bfd_boolean (* handler)(Filedata *);
9417   } handlers[] =
9418   {
9419     { EM_ARM, arm_process_unwind },
9420     { EM_IA_64, ia64_process_unwind },
9421     { EM_PARISC, hppa_process_unwind },
9422     { EM_TI_C6000, arm_process_unwind },
9423     { 0, NULL }
9424   };
9425   int i;
9426
9427   if (!do_unwind)
9428     return TRUE;
9429
9430   for (i = 0; handlers[i].handler != NULL; i++)
9431     if (filedata->file_header.e_machine == handlers[i].machtype)
9432       return handlers[i].handler (filedata);
9433
9434   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
9435           get_machine_name (filedata->file_header.e_machine));
9436   return TRUE;
9437 }
9438
9439 static void
9440 dynamic_section_aarch64_val (Elf_Internal_Dyn * entry)
9441 {
9442   switch (entry->d_tag)
9443     {
9444     case DT_AARCH64_BTI_PLT:
9445     case DT_AARCH64_PAC_PLT:
9446       break;
9447     default:
9448       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9449       break;
9450     }
9451   putchar ('\n');
9452 }
9453
9454 static void
9455 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
9456 {
9457   switch (entry->d_tag)
9458     {
9459     case DT_MIPS_FLAGS:
9460       if (entry->d_un.d_val == 0)
9461         printf (_("NONE"));
9462       else
9463         {
9464           static const char * opts[] =
9465           {
9466             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
9467             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
9468             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
9469             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
9470             "RLD_ORDER_SAFE"
9471           };
9472           unsigned int cnt;
9473           bfd_boolean first = TRUE;
9474
9475           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
9476             if (entry->d_un.d_val & (1 << cnt))
9477               {
9478                 printf ("%s%s", first ? "" : " ", opts[cnt]);
9479                 first = FALSE;
9480               }
9481         }
9482       break;
9483
9484     case DT_MIPS_IVERSION:
9485       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9486         printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
9487       else
9488         {
9489           char buf[40];
9490           sprintf_vma (buf, entry->d_un.d_ptr);
9491           /* Note: coded this way so that there is a single string for translation.  */
9492           printf (_("<corrupt: %s>"), buf);
9493         }
9494       break;
9495
9496     case DT_MIPS_TIME_STAMP:
9497       {
9498         char timebuf[128];
9499         struct tm * tmp;
9500         time_t atime = entry->d_un.d_val;
9501
9502         tmp = gmtime (&atime);
9503         /* PR 17531: file: 6accc532.  */
9504         if (tmp == NULL)
9505           snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
9506         else
9507           snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
9508                     tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9509                     tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9510         printf (_("Time Stamp: %s"), timebuf);
9511       }
9512       break;
9513
9514     case DT_MIPS_RLD_VERSION:
9515     case DT_MIPS_LOCAL_GOTNO:
9516     case DT_MIPS_CONFLICTNO:
9517     case DT_MIPS_LIBLISTNO:
9518     case DT_MIPS_SYMTABNO:
9519     case DT_MIPS_UNREFEXTNO:
9520     case DT_MIPS_HIPAGENO:
9521     case DT_MIPS_DELTA_CLASS_NO:
9522     case DT_MIPS_DELTA_INSTANCE_NO:
9523     case DT_MIPS_DELTA_RELOC_NO:
9524     case DT_MIPS_DELTA_SYM_NO:
9525     case DT_MIPS_DELTA_CLASSSYM_NO:
9526     case DT_MIPS_COMPACT_SIZE:
9527       print_vma (entry->d_un.d_val, DEC);
9528       break;
9529
9530     default:
9531       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9532     }
9533     putchar ('\n');
9534 }
9535
9536 static void
9537 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
9538 {
9539   switch (entry->d_tag)
9540     {
9541     case DT_HP_DLD_FLAGS:
9542       {
9543         static struct
9544         {
9545           long int bit;
9546           const char * str;
9547         }
9548         flags[] =
9549         {
9550           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
9551           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
9552           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
9553           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
9554           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
9555           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
9556           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9557           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9558           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9559           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
9560           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9561           { DT_HP_GST, "HP_GST" },
9562           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9563           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9564           { DT_HP_NODELETE, "HP_NODELETE" },
9565           { DT_HP_GROUP, "HP_GROUP" },
9566           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
9567         };
9568         bfd_boolean first = TRUE;
9569         size_t cnt;
9570         bfd_vma val = entry->d_un.d_val;
9571
9572         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
9573           if (val & flags[cnt].bit)
9574             {
9575               if (! first)
9576                 putchar (' ');
9577               fputs (flags[cnt].str, stdout);
9578               first = FALSE;
9579               val ^= flags[cnt].bit;
9580             }
9581
9582         if (val != 0 || first)
9583           {
9584             if (! first)
9585               putchar (' ');
9586             print_vma (val, HEX);
9587           }
9588       }
9589       break;
9590
9591     default:
9592       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9593       break;
9594     }
9595   putchar ('\n');
9596 }
9597
9598 #ifdef BFD64
9599
9600 /* VMS vs Unix time offset and factor.  */
9601
9602 #define VMS_EPOCH_OFFSET 35067168000000000LL
9603 #define VMS_GRANULARITY_FACTOR 10000000
9604
9605 /* Display a VMS time in a human readable format.  */
9606
9607 static void
9608 print_vms_time (bfd_int64_t vmstime)
9609 {
9610   struct tm *tm;
9611   time_t unxtime;
9612
9613   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9614   tm = gmtime (&unxtime);
9615   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9616           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9617           tm->tm_hour, tm->tm_min, tm->tm_sec);
9618 }
9619 #endif /* BFD64 */
9620
9621 static void
9622 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
9623 {
9624   switch (entry->d_tag)
9625     {
9626     case DT_IA_64_PLT_RESERVE:
9627       /* First 3 slots reserved.  */
9628       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9629       printf (" -- ");
9630       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
9631       break;
9632
9633     case DT_IA_64_VMS_LINKTIME:
9634 #ifdef BFD64
9635       print_vms_time (entry->d_un.d_val);
9636 #endif
9637       break;
9638
9639     case DT_IA_64_VMS_LNKFLAGS:
9640       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9641       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9642         printf (" CALL_DEBUG");
9643       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9644         printf (" NOP0BUFS");
9645       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9646         printf (" P0IMAGE");
9647       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9648         printf (" MKTHREADS");
9649       if (entry->d_un.d_val & VMS_LF_UPCALLS)
9650         printf (" UPCALLS");
9651       if (entry->d_un.d_val & VMS_LF_IMGSTA)
9652         printf (" IMGSTA");
9653       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9654         printf (" INITIALIZE");
9655       if (entry->d_un.d_val & VMS_LF_MAIN)
9656         printf (" MAIN");
9657       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9658         printf (" EXE_INIT");
9659       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9660         printf (" TBK_IN_IMG");
9661       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9662         printf (" DBG_IN_IMG");
9663       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9664         printf (" TBK_IN_DSF");
9665       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9666         printf (" DBG_IN_DSF");
9667       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9668         printf (" SIGNATURES");
9669       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9670         printf (" REL_SEG_OFF");
9671       break;
9672
9673     default:
9674       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9675       break;
9676     }
9677   putchar ('\n');
9678 }
9679
9680 static bfd_boolean
9681 get_32bit_dynamic_section (Filedata * filedata)
9682 {
9683   Elf32_External_Dyn * edyn;
9684   Elf32_External_Dyn * ext;
9685   Elf_Internal_Dyn * entry;
9686
9687   edyn = (Elf32_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9688                                           dynamic_size, _("dynamic section"));
9689   if (!edyn)
9690     return FALSE;
9691
9692   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9693      might not have the luxury of section headers.  Look for the DT_NULL
9694      terminator to determine the number of entries.  */
9695   for (ext = edyn, dynamic_nent = 0;
9696        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9697        ext++)
9698     {
9699       dynamic_nent++;
9700       if (BYTE_GET (ext->d_tag) == DT_NULL)
9701         break;
9702     }
9703
9704   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9705                                                   sizeof (* entry));
9706   if (dynamic_section == NULL)
9707     {
9708       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9709              (unsigned long) dynamic_nent);
9710       free (edyn);
9711       return FALSE;
9712     }
9713
9714   for (ext = edyn, entry = dynamic_section;
9715        entry < dynamic_section + dynamic_nent;
9716        ext++, entry++)
9717     {
9718       entry->d_tag      = BYTE_GET (ext->d_tag);
9719       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9720     }
9721
9722   free (edyn);
9723
9724   return TRUE;
9725 }
9726
9727 static bfd_boolean
9728 get_64bit_dynamic_section (Filedata * filedata)
9729 {
9730   Elf64_External_Dyn * edyn;
9731   Elf64_External_Dyn * ext;
9732   Elf_Internal_Dyn * entry;
9733
9734   /* Read in the data.  */
9735   edyn = (Elf64_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9736                                           dynamic_size, _("dynamic section"));
9737   if (!edyn)
9738     return FALSE;
9739
9740   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9741      might not have the luxury of section headers.  Look for the DT_NULL
9742      terminator to determine the number of entries.  */
9743   for (ext = edyn, dynamic_nent = 0;
9744        /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer.  */
9745        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9746        ext++)
9747     {
9748       dynamic_nent++;
9749       if (BYTE_GET (ext->d_tag) == DT_NULL)
9750         break;
9751     }
9752
9753   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9754                                                   sizeof (* entry));
9755   if (dynamic_section == NULL)
9756     {
9757       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9758              (unsigned long) dynamic_nent);
9759       free (edyn);
9760       return FALSE;
9761     }
9762
9763   /* Convert from external to internal formats.  */
9764   for (ext = edyn, entry = dynamic_section;
9765        entry < dynamic_section + dynamic_nent;
9766        ext++, entry++)
9767     {
9768       entry->d_tag      = BYTE_GET (ext->d_tag);
9769       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9770     }
9771
9772   free (edyn);
9773
9774   return TRUE;
9775 }
9776
9777 static void
9778 print_dynamic_flags (bfd_vma flags)
9779 {
9780   bfd_boolean first = TRUE;
9781
9782   while (flags)
9783     {
9784       bfd_vma flag;
9785
9786       flag = flags & - flags;
9787       flags &= ~ flag;
9788
9789       if (first)
9790         first = FALSE;
9791       else
9792         putc (' ', stdout);
9793
9794       switch (flag)
9795         {
9796         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
9797         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
9798         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
9799         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
9800         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
9801         default:                fputs (_("unknown"), stdout); break;
9802         }
9803     }
9804   puts ("");
9805 }
9806
9807 /* Parse and display the contents of the dynamic section.  */
9808
9809 static bfd_boolean
9810 process_dynamic_section (Filedata * filedata)
9811 {
9812   Elf_Internal_Dyn * entry;
9813
9814   if (dynamic_size == 0)
9815     {
9816       if (do_dynamic)
9817         printf (_("\nThere is no dynamic section in this file.\n"));
9818
9819       return TRUE;
9820     }
9821
9822   if (is_32bit_elf)
9823     {
9824       if (! get_32bit_dynamic_section (filedata))
9825         return FALSE;
9826     }
9827   else
9828     {
9829       if (! get_64bit_dynamic_section (filedata))
9830         return FALSE;
9831     }
9832
9833   /* Find the appropriate symbol table.  */
9834   if (dynamic_symbols == NULL)
9835     {
9836       for (entry = dynamic_section;
9837            entry < dynamic_section + dynamic_nent;
9838            ++entry)
9839         {
9840           Elf_Internal_Shdr section;
9841
9842           if (entry->d_tag != DT_SYMTAB)
9843             continue;
9844
9845           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9846
9847           /* Since we do not know how big the symbol table is,
9848              we default to reading in the entire file (!) and
9849              processing that.  This is overkill, I know, but it
9850              should work.  */
9851           section.sh_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9852           if ((bfd_size_type) section.sh_offset > filedata->file_size)
9853             {
9854               /* See PR 21379 for a reproducer.  */
9855               error (_("Invalid DT_SYMTAB entry: %lx"), (long) section.sh_offset);
9856               return FALSE;
9857             }
9858
9859           if (archive_file_offset != 0)
9860             section.sh_size = archive_file_size - section.sh_offset;
9861           else
9862             section.sh_size = filedata->file_size - section.sh_offset;
9863
9864           if (is_32bit_elf)
9865             section.sh_entsize = sizeof (Elf32_External_Sym);
9866           else
9867             section.sh_entsize = sizeof (Elf64_External_Sym);
9868           section.sh_name = filedata->string_table_length;
9869
9870           if (dynamic_symbols != NULL)
9871             {
9872               error (_("Multiple dynamic symbol table sections found\n"));
9873               free (dynamic_symbols);
9874             }
9875           dynamic_symbols = GET_ELF_SYMBOLS (filedata, &section, & num_dynamic_syms);
9876           if (num_dynamic_syms < 1)
9877             {
9878               error (_("Unable to determine the number of symbols to load\n"));
9879               continue;
9880             }
9881         }
9882     }
9883
9884   /* Similarly find a string table.  */
9885   if (dynamic_strings == NULL)
9886     {
9887       for (entry = dynamic_section;
9888            entry < dynamic_section + dynamic_nent;
9889            ++entry)
9890         {
9891           unsigned long offset;
9892           long str_tab_len;
9893
9894           if (entry->d_tag != DT_STRTAB)
9895             continue;
9896
9897           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9898
9899           /* Since we do not know how big the string table is,
9900              we default to reading in the entire file (!) and
9901              processing that.  This is overkill, I know, but it
9902              should work.  */
9903
9904           offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9905
9906           if (archive_file_offset != 0)
9907             str_tab_len = archive_file_size - offset;
9908           else
9909             str_tab_len = filedata->file_size - offset;
9910
9911           if (str_tab_len < 1)
9912             {
9913               error
9914                 (_("Unable to determine the length of the dynamic string table\n"));
9915               continue;
9916             }
9917
9918           if (dynamic_strings != NULL)
9919             {
9920               error (_("Multiple dynamic string tables found\n"));
9921               free (dynamic_strings);
9922             }
9923
9924           dynamic_strings = (char *) get_data (NULL, filedata, offset, 1,
9925                                                str_tab_len,
9926                                                _("dynamic string table"));
9927           dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9928         }
9929     }
9930
9931   /* And find the syminfo section if available.  */
9932   if (dynamic_syminfo == NULL)
9933     {
9934       unsigned long syminsz = 0;
9935
9936       for (entry = dynamic_section;
9937            entry < dynamic_section + dynamic_nent;
9938            ++entry)
9939         {
9940           if (entry->d_tag == DT_SYMINENT)
9941             {
9942               /* Note: these braces are necessary to avoid a syntax
9943                  error from the SunOS4 C compiler.  */
9944               /* PR binutils/17531: A corrupt file can trigger this test.
9945                  So do not use an assert, instead generate an error message.  */
9946               if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9947                 error (_("Bad value (%d) for SYMINENT entry\n"),
9948                        (int) entry->d_un.d_val);
9949             }
9950           else if (entry->d_tag == DT_SYMINSZ)
9951             syminsz = entry->d_un.d_val;
9952           else if (entry->d_tag == DT_SYMINFO)
9953             dynamic_syminfo_offset = offset_from_vma (filedata, entry->d_un.d_val,
9954                                                       syminsz);
9955         }
9956
9957       if (dynamic_syminfo_offset != 0 && syminsz != 0)
9958         {
9959           Elf_External_Syminfo * extsyminfo;
9960           Elf_External_Syminfo * extsym;
9961           Elf_Internal_Syminfo * syminfo;
9962
9963           /* There is a syminfo section.  Read the data.  */
9964           extsyminfo = (Elf_External_Syminfo *)
9965               get_data (NULL, filedata, dynamic_syminfo_offset, 1, syminsz,
9966                         _("symbol information"));
9967           if (!extsyminfo)
9968             return FALSE;
9969
9970           if (dynamic_syminfo != NULL)
9971             {
9972               error (_("Multiple dynamic symbol information sections found\n"));
9973               free (dynamic_syminfo);
9974             }
9975           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9976           if (dynamic_syminfo == NULL)
9977             {
9978               error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9979                      (unsigned long) syminsz);
9980               return FALSE;
9981             }
9982
9983           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9984           for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9985                syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9986                ++syminfo, ++extsym)
9987             {
9988               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9989               syminfo->si_flags = BYTE_GET (extsym->si_flags);
9990             }
9991
9992           free (extsyminfo);
9993         }
9994     }
9995
9996   if (do_dynamic && dynamic_addr)
9997     printf (ngettext ("\nDynamic section at offset 0x%lx "
9998                       "contains %lu entry:\n",
9999                       "\nDynamic section at offset 0x%lx "
10000                       "contains %lu entries:\n",
10001                       dynamic_nent),
10002             dynamic_addr, (unsigned long) dynamic_nent);
10003   if (do_dynamic)
10004     printf (_("  Tag        Type                         Name/Value\n"));
10005
10006   for (entry = dynamic_section;
10007        entry < dynamic_section + dynamic_nent;
10008        entry++)
10009     {
10010       if (do_dynamic)
10011         {
10012           const char * dtype;
10013
10014           putchar (' ');
10015           print_vma (entry->d_tag, FULL_HEX);
10016           dtype = get_dynamic_type (filedata, entry->d_tag);
10017           printf (" (%s)%*s", dtype,
10018                   ((is_32bit_elf ? 27 : 19) - (int) strlen (dtype)), " ");
10019         }
10020
10021       switch (entry->d_tag)
10022         {
10023         case DT_FLAGS:
10024           if (do_dynamic)
10025             print_dynamic_flags (entry->d_un.d_val);
10026           break;
10027
10028         case DT_AUXILIARY:
10029         case DT_FILTER:
10030         case DT_CONFIG:
10031         case DT_DEPAUDIT:
10032         case DT_AUDIT:
10033           if (do_dynamic)
10034             {
10035               switch (entry->d_tag)
10036                 {
10037                 case DT_AUXILIARY:
10038                   printf (_("Auxiliary library"));
10039                   break;
10040
10041                 case DT_FILTER:
10042                   printf (_("Filter library"));
10043                   break;
10044
10045                 case DT_CONFIG:
10046                   printf (_("Configuration file"));
10047                   break;
10048
10049                 case DT_DEPAUDIT:
10050                   printf (_("Dependency audit library"));
10051                   break;
10052
10053                 case DT_AUDIT:
10054                   printf (_("Audit library"));
10055                   break;
10056                 }
10057
10058               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
10059                 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
10060               else
10061                 {
10062                   printf (": ");
10063                   print_vma (entry->d_un.d_val, PREFIX_HEX);
10064                   putchar ('\n');
10065                 }
10066             }
10067           break;
10068
10069         case DT_FEATURE:
10070           if (do_dynamic)
10071             {
10072               printf (_("Flags:"));
10073
10074               if (entry->d_un.d_val == 0)
10075                 printf (_(" None\n"));
10076               else
10077                 {
10078                   unsigned long int val = entry->d_un.d_val;
10079
10080                   if (val & DTF_1_PARINIT)
10081                     {
10082                       printf (" PARINIT");
10083                       val ^= DTF_1_PARINIT;
10084                     }
10085                   if (val & DTF_1_CONFEXP)
10086                     {
10087                       printf (" CONFEXP");
10088                       val ^= DTF_1_CONFEXP;
10089                     }
10090                   if (val != 0)
10091                     printf (" %lx", val);
10092                   puts ("");
10093                 }
10094             }
10095           break;
10096
10097         case DT_POSFLAG_1:
10098           if (do_dynamic)
10099             {
10100               printf (_("Flags:"));
10101
10102               if (entry->d_un.d_val == 0)
10103                 printf (_(" None\n"));
10104               else
10105                 {
10106                   unsigned long int val = entry->d_un.d_val;
10107
10108                   if (val & DF_P1_LAZYLOAD)
10109                     {
10110                       printf (" LAZYLOAD");
10111                       val ^= DF_P1_LAZYLOAD;
10112                     }
10113                   if (val & DF_P1_GROUPPERM)
10114                     {
10115                       printf (" GROUPPERM");
10116                       val ^= DF_P1_GROUPPERM;
10117                     }
10118                   if (val != 0)
10119                     printf (" %lx", val);
10120                   puts ("");
10121                 }
10122             }
10123           break;
10124
10125         case DT_FLAGS_1:
10126           if (do_dynamic)
10127             {
10128               printf (_("Flags:"));
10129               if (entry->d_un.d_val == 0)
10130                 printf (_(" None\n"));
10131               else
10132                 {
10133                   unsigned long int val = entry->d_un.d_val;
10134
10135                   if (val & DF_1_NOW)
10136                     {
10137                       printf (" NOW");
10138                       val ^= DF_1_NOW;
10139                     }
10140                   if (val & DF_1_GLOBAL)
10141                     {
10142                       printf (" GLOBAL");
10143                       val ^= DF_1_GLOBAL;
10144                     }
10145                   if (val & DF_1_GROUP)
10146                     {
10147                       printf (" GROUP");
10148                       val ^= DF_1_GROUP;
10149                     }
10150                   if (val & DF_1_NODELETE)
10151                     {
10152                       printf (" NODELETE");
10153                       val ^= DF_1_NODELETE;
10154                     }
10155                   if (val & DF_1_LOADFLTR)
10156                     {
10157                       printf (" LOADFLTR");
10158                       val ^= DF_1_LOADFLTR;
10159                     }
10160                   if (val & DF_1_INITFIRST)
10161                     {
10162                       printf (" INITFIRST");
10163                       val ^= DF_1_INITFIRST;
10164                     }
10165                   if (val & DF_1_NOOPEN)
10166                     {
10167                       printf (" NOOPEN");
10168                       val ^= DF_1_NOOPEN;
10169                     }
10170                   if (val & DF_1_ORIGIN)
10171                     {
10172                       printf (" ORIGIN");
10173                       val ^= DF_1_ORIGIN;
10174                     }
10175                   if (val & DF_1_DIRECT)
10176                     {
10177                       printf (" DIRECT");
10178                       val ^= DF_1_DIRECT;
10179                     }
10180                   if (val & DF_1_TRANS)
10181                     {
10182                       printf (" TRANS");
10183                       val ^= DF_1_TRANS;
10184                     }
10185                   if (val & DF_1_INTERPOSE)
10186                     {
10187                       printf (" INTERPOSE");
10188                       val ^= DF_1_INTERPOSE;
10189                     }
10190                   if (val & DF_1_NODEFLIB)
10191                     {
10192                       printf (" NODEFLIB");
10193                       val ^= DF_1_NODEFLIB;
10194                     }
10195                   if (val & DF_1_NODUMP)
10196                     {
10197                       printf (" NODUMP");
10198                       val ^= DF_1_NODUMP;
10199                     }
10200                   if (val & DF_1_CONFALT)
10201                     {
10202                       printf (" CONFALT");
10203                       val ^= DF_1_CONFALT;
10204                     }
10205                   if (val & DF_1_ENDFILTEE)
10206                     {
10207                       printf (" ENDFILTEE");
10208                       val ^= DF_1_ENDFILTEE;
10209                     }
10210                   if (val & DF_1_DISPRELDNE)
10211                     {
10212                       printf (" DISPRELDNE");
10213                       val ^= DF_1_DISPRELDNE;
10214                     }
10215                   if (val & DF_1_DISPRELPND)
10216                     {
10217                       printf (" DISPRELPND");
10218                       val ^= DF_1_DISPRELPND;
10219                     }
10220                   if (val & DF_1_NODIRECT)
10221                     {
10222                       printf (" NODIRECT");
10223                       val ^= DF_1_NODIRECT;
10224                     }
10225                   if (val & DF_1_IGNMULDEF)
10226                     {
10227                       printf (" IGNMULDEF");
10228                       val ^= DF_1_IGNMULDEF;
10229                     }
10230                   if (val & DF_1_NOKSYMS)
10231                     {
10232                       printf (" NOKSYMS");
10233                       val ^= DF_1_NOKSYMS;
10234                     }
10235                   if (val & DF_1_NOHDR)
10236                     {
10237                       printf (" NOHDR");
10238                       val ^= DF_1_NOHDR;
10239                     }
10240                   if (val & DF_1_EDITED)
10241                     {
10242                       printf (" EDITED");
10243                       val ^= DF_1_EDITED;
10244                     }
10245                   if (val & DF_1_NORELOC)
10246                     {
10247                       printf (" NORELOC");
10248                       val ^= DF_1_NORELOC;
10249                     }
10250                   if (val & DF_1_SYMINTPOSE)
10251                     {
10252                       printf (" SYMINTPOSE");
10253                       val ^= DF_1_SYMINTPOSE;
10254                     }
10255                   if (val & DF_1_GLOBAUDIT)
10256                     {
10257                       printf (" GLOBAUDIT");
10258                       val ^= DF_1_GLOBAUDIT;
10259                     }
10260                   if (val & DF_1_SINGLETON)
10261                     {
10262                       printf (" SINGLETON");
10263                       val ^= DF_1_SINGLETON;
10264                     }
10265                   if (val & DF_1_STUB)
10266                     {
10267                       printf (" STUB");
10268                       val ^= DF_1_STUB;
10269                     }
10270                   if (val & DF_1_PIE)
10271                     {
10272                       printf (" PIE");
10273                       val ^= DF_1_PIE;
10274                     }
10275                   if (val & DF_1_KMOD)
10276                     {
10277                       printf (" KMOD");
10278                       val ^= DF_1_KMOD;
10279                     }
10280                   if (val & DF_1_WEAKFILTER)
10281                     {
10282                       printf (" WEAKFILTER");
10283                       val ^= DF_1_WEAKFILTER;
10284                     }
10285                   if (val & DF_1_NOCOMMON)
10286                     {
10287                       printf (" NOCOMMON");
10288                       val ^= DF_1_NOCOMMON;
10289                     }
10290                   if (val != 0)
10291                     printf (" %lx", val);
10292                   puts ("");
10293                 }
10294             }
10295           break;
10296
10297         case DT_PLTREL:
10298           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10299           if (do_dynamic)
10300             puts (get_dynamic_type (filedata, entry->d_un.d_val));
10301           break;
10302
10303         case DT_NULL    :
10304         case DT_NEEDED  :
10305         case DT_PLTGOT  :
10306         case DT_HASH    :
10307         case DT_STRTAB  :
10308         case DT_SYMTAB  :
10309         case DT_RELA    :
10310         case DT_INIT    :
10311         case DT_FINI    :
10312         case DT_SONAME  :
10313         case DT_RPATH   :
10314         case DT_SYMBOLIC:
10315         case DT_REL     :
10316         case DT_DEBUG   :
10317         case DT_TEXTREL :
10318         case DT_JMPREL  :
10319         case DT_RUNPATH :
10320           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10321
10322           if (do_dynamic)
10323             {
10324               char * name;
10325
10326               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
10327                 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10328               else
10329                 name = NULL;
10330
10331               if (name)
10332                 {
10333                   switch (entry->d_tag)
10334                     {
10335                     case DT_NEEDED:
10336                       printf (_("Shared library: [%s]"), name);
10337
10338                       if (streq (name, program_interpreter))
10339                         printf (_(" program interpreter"));
10340                       break;
10341
10342                     case DT_SONAME:
10343                       printf (_("Library soname: [%s]"), name);
10344                       break;
10345
10346                     case DT_RPATH:
10347                       printf (_("Library rpath: [%s]"), name);
10348                       break;
10349
10350                     case DT_RUNPATH:
10351                       printf (_("Library runpath: [%s]"), name);
10352                       break;
10353
10354                     default:
10355                       print_vma (entry->d_un.d_val, PREFIX_HEX);
10356                       break;
10357                     }
10358                 }
10359               else
10360                 print_vma (entry->d_un.d_val, PREFIX_HEX);
10361
10362               putchar ('\n');
10363             }
10364           break;
10365
10366         case DT_PLTRELSZ:
10367         case DT_RELASZ  :
10368         case DT_STRSZ   :
10369         case DT_RELSZ   :
10370         case DT_RELAENT :
10371         case DT_SYMENT  :
10372         case DT_RELENT  :
10373           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10374           /* Fall through.  */
10375         case DT_PLTPADSZ:
10376         case DT_MOVEENT :
10377         case DT_MOVESZ  :
10378         case DT_INIT_ARRAYSZ:
10379         case DT_FINI_ARRAYSZ:
10380         case DT_GNU_CONFLICTSZ:
10381         case DT_GNU_LIBLISTSZ:
10382           if (do_dynamic)
10383             {
10384               print_vma (entry->d_un.d_val, UNSIGNED);
10385               printf (_(" (bytes)\n"));
10386             }
10387           break;
10388
10389         case DT_VERDEFNUM:
10390         case DT_VERNEEDNUM:
10391         case DT_RELACOUNT:
10392         case DT_RELCOUNT:
10393           if (do_dynamic)
10394             {
10395               print_vma (entry->d_un.d_val, UNSIGNED);
10396               putchar ('\n');
10397             }
10398           break;
10399
10400         case DT_SYMINSZ:
10401         case DT_SYMINENT:
10402         case DT_SYMINFO:
10403         case DT_USED:
10404         case DT_INIT_ARRAY:
10405         case DT_FINI_ARRAY:
10406           if (do_dynamic)
10407             {
10408               if (entry->d_tag == DT_USED
10409                   && VALID_DYNAMIC_NAME (entry->d_un.d_val))
10410                 {
10411                   char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10412
10413                   if (*name)
10414                     {
10415                       printf (_("Not needed object: [%s]\n"), name);
10416                       break;
10417                     }
10418                 }
10419
10420               print_vma (entry->d_un.d_val, PREFIX_HEX);
10421               putchar ('\n');
10422             }
10423           break;
10424
10425         case DT_BIND_NOW:
10426           /* The value of this entry is ignored.  */
10427           if (do_dynamic)
10428             putchar ('\n');
10429           break;
10430
10431         case DT_GNU_PRELINKED:
10432           if (do_dynamic)
10433             {
10434               struct tm * tmp;
10435               time_t atime = entry->d_un.d_val;
10436
10437               tmp = gmtime (&atime);
10438               /* PR 17533 file: 041-1244816-0.004.  */
10439               if (tmp == NULL)
10440                 printf (_("<corrupt time val: %lx"),
10441                         (unsigned long) atime);
10442               else
10443                 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
10444                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
10445                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
10446
10447             }
10448           break;
10449
10450         case DT_GNU_HASH:
10451           dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
10452           if (do_dynamic)
10453             {
10454               print_vma (entry->d_un.d_val, PREFIX_HEX);
10455               putchar ('\n');
10456             }
10457           break;
10458
10459         default:
10460           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
10461             version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
10462               entry->d_un.d_val;
10463
10464           if (do_dynamic)
10465             {
10466               switch (filedata->file_header.e_machine)
10467                 {
10468                 case EM_AARCH64:
10469                   dynamic_section_aarch64_val (entry);
10470                   break;
10471                 case EM_MIPS:
10472                 case EM_MIPS_RS3_LE:
10473                   dynamic_section_mips_val (entry);
10474                   break;
10475                 case EM_PARISC:
10476                   dynamic_section_parisc_val (entry);
10477                   break;
10478                 case EM_IA_64:
10479                   dynamic_section_ia64_val (entry);
10480                   break;
10481                 default:
10482                   print_vma (entry->d_un.d_val, PREFIX_HEX);
10483                   putchar ('\n');
10484                 }
10485             }
10486           break;
10487         }
10488     }
10489
10490   return TRUE;
10491 }
10492
10493 static char *
10494 get_ver_flags (unsigned int flags)
10495 {
10496   static char buff[128];
10497
10498   buff[0] = 0;
10499
10500   if (flags == 0)
10501     return _("none");
10502
10503   if (flags & VER_FLG_BASE)
10504     strcat (buff, "BASE");
10505
10506   if (flags & VER_FLG_WEAK)
10507     {
10508       if (flags & VER_FLG_BASE)
10509         strcat (buff, " | ");
10510
10511       strcat (buff, "WEAK");
10512     }
10513
10514   if (flags & VER_FLG_INFO)
10515     {
10516       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
10517         strcat (buff, " | ");
10518
10519       strcat (buff, "INFO");
10520     }
10521
10522   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10523     {
10524       if (flags & (VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10525         strcat (buff, " | ");
10526
10527       strcat (buff, _("<unknown>"));
10528     }
10529
10530   return buff;
10531 }
10532
10533 /* Display the contents of the version sections.  */
10534
10535 static bfd_boolean
10536 process_version_sections (Filedata * filedata)
10537 {
10538   Elf_Internal_Shdr * section;
10539   unsigned i;
10540   bfd_boolean found = FALSE;
10541
10542   if (! do_version)
10543     return TRUE;
10544
10545   for (i = 0, section = filedata->section_headers;
10546        i < filedata->file_header.e_shnum;
10547        i++, section++)
10548     {
10549       switch (section->sh_type)
10550         {
10551         case SHT_GNU_verdef:
10552           {
10553             Elf_External_Verdef * edefs;
10554             unsigned long idx;
10555             unsigned long cnt;
10556             char * endbuf;
10557
10558             found = TRUE;
10559
10560             printf (ngettext ("\nVersion definition section '%s' "
10561                               "contains %u entry:\n",
10562                               "\nVersion definition section '%s' "
10563                               "contains %u entries:\n",
10564                               section->sh_info),
10565                     printable_section_name (filedata, section),
10566                     section->sh_info);
10567
10568             printf (_(" Addr: 0x"));
10569             printf_vma (section->sh_addr);
10570             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10571                     (unsigned long) section->sh_offset, section->sh_link,
10572                     printable_section_name_from_index (filedata, section->sh_link));
10573
10574             edefs = (Elf_External_Verdef *)
10575                 get_data (NULL, filedata, section->sh_offset, 1,section->sh_size,
10576                           _("version definition section"));
10577             if (!edefs)
10578               break;
10579             endbuf = (char *) edefs + section->sh_size;
10580
10581             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10582               {
10583                 char * vstart;
10584                 Elf_External_Verdef * edef;
10585                 Elf_Internal_Verdef ent;
10586                 Elf_External_Verdaux * eaux;
10587                 Elf_Internal_Verdaux aux;
10588                 unsigned long isum;
10589                 int j;
10590
10591                 vstart = ((char *) edefs) + idx;
10592                 if (vstart + sizeof (*edef) > endbuf)
10593                   break;
10594
10595                 edef = (Elf_External_Verdef *) vstart;
10596
10597                 ent.vd_version = BYTE_GET (edef->vd_version);
10598                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
10599                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
10600                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
10601                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
10602                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
10603                 ent.vd_next    = BYTE_GET (edef->vd_next);
10604
10605                 printf (_("  %#06lx: Rev: %d  Flags: %s"),
10606                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
10607
10608                 printf (_("  Index: %d  Cnt: %d  "),
10609                         ent.vd_ndx, ent.vd_cnt);
10610
10611                 /* Check for overflow.  */
10612                 if (ent.vd_aux > (size_t) (endbuf - vstart))
10613                   break;
10614
10615                 vstart += ent.vd_aux;
10616
10617                 if (vstart + sizeof (*eaux) > endbuf)
10618                   break;
10619                 eaux = (Elf_External_Verdaux *) vstart;
10620
10621                 aux.vda_name = BYTE_GET (eaux->vda_name);
10622                 aux.vda_next = BYTE_GET (eaux->vda_next);
10623
10624                 if (VALID_DYNAMIC_NAME (aux.vda_name))
10625                   printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
10626                 else
10627                   printf (_("Name index: %ld\n"), aux.vda_name);
10628
10629                 isum = idx + ent.vd_aux;
10630
10631                 for (j = 1; j < ent.vd_cnt; j++)
10632                   {
10633                     if (aux.vda_next < sizeof (*eaux)
10634                         && !(j == ent.vd_cnt - 1 && aux.vda_next == 0))
10635                       {
10636                         warn (_("Invalid vda_next field of %lx\n"),
10637                               aux.vda_next);
10638                         j = ent.vd_cnt;
10639                         break;
10640                       }
10641                     /* Check for overflow.  */
10642                     if (aux.vda_next > (size_t) (endbuf - vstart))
10643                       break;
10644
10645                     isum   += aux.vda_next;
10646                     vstart += aux.vda_next;
10647
10648                     if (vstart + sizeof (*eaux) > endbuf)
10649                       break;
10650                     eaux = (Elf_External_Verdaux *) vstart;
10651
10652                     aux.vda_name = BYTE_GET (eaux->vda_name);
10653                     aux.vda_next = BYTE_GET (eaux->vda_next);
10654
10655                     if (VALID_DYNAMIC_NAME (aux.vda_name))
10656                       printf (_("  %#06lx: Parent %d: %s\n"),
10657                               isum, j, GET_DYNAMIC_NAME (aux.vda_name));
10658                     else
10659                       printf (_("  %#06lx: Parent %d, name index: %ld\n"),
10660                               isum, j, aux.vda_name);
10661                   }
10662
10663                 if (j < ent.vd_cnt)
10664                   printf (_("  Version def aux past end of section\n"));
10665
10666                 /* PR 17531:
10667                    file: id:000001,src:000172+005151,op:splice,rep:2.  */
10668                 if (ent.vd_next < sizeof (*edef)
10669                     && !(cnt == section->sh_info - 1 && ent.vd_next == 0))
10670                   {
10671                     warn (_("Invalid vd_next field of %lx\n"), ent.vd_next);
10672                     cnt = section->sh_info;
10673                     break;
10674                   }
10675                 if (ent.vd_next > (size_t) (endbuf - ((char *) edefs + idx)))
10676                   break;
10677
10678                 idx += ent.vd_next;
10679               }
10680
10681             if (cnt < section->sh_info)
10682               printf (_("  Version definition past end of section\n"));
10683
10684             free (edefs);
10685           }
10686           break;
10687
10688         case SHT_GNU_verneed:
10689           {
10690             Elf_External_Verneed * eneed;
10691             unsigned long idx;
10692             unsigned long cnt;
10693             char * endbuf;
10694
10695             found = TRUE;
10696
10697             printf (ngettext ("\nVersion needs section '%s' "
10698                               "contains %u entry:\n",
10699                               "\nVersion needs section '%s' "
10700                               "contains %u entries:\n",
10701                               section->sh_info),
10702                     printable_section_name (filedata, section), section->sh_info);
10703
10704             printf (_(" Addr: 0x"));
10705             printf_vma (section->sh_addr);
10706             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10707                     (unsigned long) section->sh_offset, section->sh_link,
10708                     printable_section_name_from_index (filedata, section->sh_link));
10709
10710             eneed = (Elf_External_Verneed *) get_data (NULL, filedata,
10711                                                        section->sh_offset, 1,
10712                                                        section->sh_size,
10713                                                        _("Version Needs section"));
10714             if (!eneed)
10715               break;
10716             endbuf = (char *) eneed + section->sh_size;
10717
10718             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10719               {
10720                 Elf_External_Verneed * entry;
10721                 Elf_Internal_Verneed ent;
10722                 unsigned long isum;
10723                 int j;
10724                 char * vstart;
10725
10726                 vstart = ((char *) eneed) + idx;
10727                 if (vstart + sizeof (*entry) > endbuf)
10728                   break;
10729
10730                 entry = (Elf_External_Verneed *) vstart;
10731
10732                 ent.vn_version = BYTE_GET (entry->vn_version);
10733                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
10734                 ent.vn_file    = BYTE_GET (entry->vn_file);
10735                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
10736                 ent.vn_next    = BYTE_GET (entry->vn_next);
10737
10738                 printf (_("  %#06lx: Version: %d"), idx, ent.vn_version);
10739
10740                 if (VALID_DYNAMIC_NAME (ent.vn_file))
10741                   printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
10742                 else
10743                   printf (_("  File: %lx"), ent.vn_file);
10744
10745                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
10746
10747                 /* Check for overflow.  */
10748                 if (ent.vn_aux > (size_t) (endbuf - vstart))
10749                   break;
10750                 vstart += ent.vn_aux;
10751
10752                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10753                   {
10754                     Elf_External_Vernaux * eaux;
10755                     Elf_Internal_Vernaux aux;
10756
10757                     if (vstart + sizeof (*eaux) > endbuf)
10758                       break;
10759                     eaux = (Elf_External_Vernaux *) vstart;
10760
10761                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
10762                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
10763                     aux.vna_other = BYTE_GET (eaux->vna_other);
10764                     aux.vna_name  = BYTE_GET (eaux->vna_name);
10765                     aux.vna_next  = BYTE_GET (eaux->vna_next);
10766
10767                     if (VALID_DYNAMIC_NAME (aux.vna_name))
10768                       printf (_("  %#06lx:   Name: %s"),
10769                               isum, GET_DYNAMIC_NAME (aux.vna_name));
10770                     else
10771                       printf (_("  %#06lx:   Name index: %lx"),
10772                               isum, aux.vna_name);
10773
10774                     printf (_("  Flags: %s  Version: %d\n"),
10775                             get_ver_flags (aux.vna_flags), aux.vna_other);
10776
10777                     if (aux.vna_next < sizeof (*eaux)
10778                         && !(j == ent.vn_cnt - 1 && aux.vna_next == 0))
10779                       {
10780                         warn (_("Invalid vna_next field of %lx\n"),
10781                               aux.vna_next);
10782                         j = ent.vn_cnt;
10783                         break;
10784                       }
10785                     /* Check for overflow.  */
10786                     if (aux.vna_next > (size_t) (endbuf - vstart))
10787                       break;
10788                     isum   += aux.vna_next;
10789                     vstart += aux.vna_next;
10790                   }
10791
10792                 if (j < ent.vn_cnt)
10793                   warn (_("Missing Version Needs auxillary information\n"));
10794
10795                 if (ent.vn_next < sizeof (*entry)
10796                     && !(cnt == section->sh_info - 1 && ent.vn_next == 0))
10797                   {
10798                     warn (_("Invalid vn_next field of %lx\n"), ent.vn_next);
10799                     cnt = section->sh_info;
10800                     break;
10801                   }
10802                 if (ent.vn_next > (size_t) (endbuf - ((char *) eneed + idx)))
10803                   break;
10804                 idx += ent.vn_next;
10805               }
10806
10807             if (cnt < section->sh_info)
10808               warn (_("Missing Version Needs information\n"));
10809
10810             free (eneed);
10811           }
10812           break;
10813
10814         case SHT_GNU_versym:
10815           {
10816             Elf_Internal_Shdr * link_section;
10817             size_t total;
10818             unsigned int cnt;
10819             unsigned char * edata;
10820             unsigned short * data;
10821             char * strtab;
10822             Elf_Internal_Sym * symbols;
10823             Elf_Internal_Shdr * string_sec;
10824             unsigned long num_syms;
10825             long off;
10826
10827             if (section->sh_link >= filedata->file_header.e_shnum)
10828               break;
10829
10830             link_section = filedata->section_headers + section->sh_link;
10831             total = section->sh_size / sizeof (Elf_External_Versym);
10832
10833             if (link_section->sh_link >= filedata->file_header.e_shnum)
10834               break;
10835
10836             found = TRUE;
10837
10838             symbols = GET_ELF_SYMBOLS (filedata, link_section, & num_syms);
10839             if (symbols == NULL)
10840               break;
10841
10842             string_sec = filedata->section_headers + link_section->sh_link;
10843
10844             strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
10845                                         string_sec->sh_size,
10846                                         _("version string table"));
10847             if (!strtab)
10848               {
10849                 free (symbols);
10850                 break;
10851               }
10852
10853             printf (ngettext ("\nVersion symbols section '%s' "
10854                               "contains %lu entry:\n",
10855                               "\nVersion symbols section '%s' "
10856                               "contains %lu entries:\n",
10857                               total),
10858                     printable_section_name (filedata, section), (unsigned long) total);
10859
10860             printf (_(" Addr: 0x"));
10861             printf_vma (section->sh_addr);
10862             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10863                     (unsigned long) section->sh_offset, section->sh_link,
10864                     printable_section_name (filedata, link_section));
10865
10866             off = offset_from_vma (filedata,
10867                                    version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10868                                    total * sizeof (short));
10869             edata = (unsigned char *) get_data (NULL, filedata, off, total,
10870                                                 sizeof (short),
10871                                                 _("version symbol data"));
10872             if (!edata)
10873               {
10874                 free (strtab);
10875                 free (symbols);
10876                 break;
10877               }
10878
10879             data = (short unsigned int *) cmalloc (total, sizeof (short));
10880
10881             for (cnt = total; cnt --;)
10882               data[cnt] = byte_get (edata + cnt * sizeof (short),
10883                                     sizeof (short));
10884
10885             free (edata);
10886
10887             for (cnt = 0; cnt < total; cnt += 4)
10888               {
10889                 int j, nn;
10890                 char *name;
10891                 char *invalid = _("*invalid*");
10892
10893                 printf ("  %03x:", cnt);
10894
10895                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10896                   switch (data[cnt + j])
10897                     {
10898                     case 0:
10899                       fputs (_("   0 (*local*)    "), stdout);
10900                       break;
10901
10902                     case 1:
10903                       fputs (_("   1 (*global*)   "), stdout);
10904                       break;
10905
10906                     default:
10907                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10908                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10909
10910                       /* If this index value is greater than the size of the symbols
10911                          array, break to avoid an out-of-bounds read.  */
10912                       if ((unsigned long)(cnt + j) >= num_syms)
10913                         {
10914                           warn (_("invalid index into symbol array\n"));
10915                           break;
10916                         }
10917
10918                       name = NULL;
10919                       if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10920                         {
10921                           Elf_Internal_Verneed ivn;
10922                           unsigned long offset;
10923
10924                           offset = offset_from_vma
10925                             (filedata, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10926                              sizeof (Elf_External_Verneed));
10927
10928                           do
10929                             {
10930                               Elf_Internal_Vernaux ivna;
10931                               Elf_External_Verneed evn;
10932                               Elf_External_Vernaux evna;
10933                               unsigned long a_off;
10934
10935                               if (get_data (&evn, filedata, offset, sizeof (evn), 1,
10936                                             _("version need")) == NULL)
10937                                 break;
10938
10939                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10940                               ivn.vn_next = BYTE_GET (evn.vn_next);
10941
10942                               a_off = offset + ivn.vn_aux;
10943
10944                               do
10945                                 {
10946                                   if (get_data (&evna, filedata, a_off, sizeof (evna),
10947                                                 1, _("version need aux (2)")) == NULL)
10948                                     {
10949                                       ivna.vna_next  = 0;
10950                                       ivna.vna_other = 0;
10951                                     }
10952                                   else
10953                                     {
10954                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
10955                                       ivna.vna_other = BYTE_GET (evna.vna_other);
10956                                     }
10957
10958                                   a_off += ivna.vna_next;
10959                                 }
10960                               while (ivna.vna_other != data[cnt + j]
10961                                      && ivna.vna_next != 0);
10962
10963                               if (ivna.vna_other == data[cnt + j])
10964                                 {
10965                                   ivna.vna_name = BYTE_GET (evna.vna_name);
10966
10967                                   if (ivna.vna_name >= string_sec->sh_size)
10968                                     name = invalid;
10969                                   else
10970                                     name = strtab + ivna.vna_name;
10971                                   break;
10972                                 }
10973
10974                               offset += ivn.vn_next;
10975                             }
10976                           while (ivn.vn_next);
10977                         }
10978
10979                       if (data[cnt + j] != 0x8001
10980                           && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10981                         {
10982                           Elf_Internal_Verdef ivd;
10983                           Elf_External_Verdef evd;
10984                           unsigned long offset;
10985
10986                           offset = offset_from_vma
10987                             (filedata, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10988                              sizeof evd);
10989
10990                           do
10991                             {
10992                               if (get_data (&evd, filedata, offset, sizeof (evd), 1,
10993                                             _("version def")) == NULL)
10994                                 {
10995                                   ivd.vd_next = 0;
10996                                   /* PR 17531: file: 046-1082287-0.004.  */
10997                                   ivd.vd_ndx  = (data[cnt + j] & VERSYM_VERSION) + 1;
10998                                   break;
10999                                 }
11000                               else
11001                                 {
11002                                   ivd.vd_next = BYTE_GET (evd.vd_next);
11003                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
11004                                 }
11005
11006                               offset += ivd.vd_next;
11007                             }
11008                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
11009                                  && ivd.vd_next != 0);
11010
11011                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
11012                             {
11013                               Elf_External_Verdaux evda;
11014                               Elf_Internal_Verdaux ivda;
11015
11016                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
11017
11018                               if (get_data (&evda, filedata,
11019                                             offset - ivd.vd_next + ivd.vd_aux,
11020                                             sizeof (evda), 1,
11021                                             _("version def aux")) == NULL)
11022                                 break;
11023
11024                               ivda.vda_name = BYTE_GET (evda.vda_name);
11025
11026                               if (ivda.vda_name >= string_sec->sh_size)
11027                                 name = invalid;
11028                               else if (name != NULL && name != invalid)
11029                                 name = _("*both*");
11030                               else
11031                                 name = strtab + ivda.vda_name;
11032                             }
11033                         }
11034                       if (name != NULL)
11035                         nn += printf ("(%s%-*s",
11036                                       name,
11037                                       12 - (int) strlen (name),
11038                                       ")");
11039
11040                       if (nn < 18)
11041                         printf ("%*c", 18 - nn, ' ');
11042                     }
11043
11044                 putchar ('\n');
11045               }
11046
11047             free (data);
11048             free (strtab);
11049             free (symbols);
11050           }
11051           break;
11052
11053         default:
11054           break;
11055         }
11056     }
11057
11058   if (! found)
11059     printf (_("\nNo version information found in this file.\n"));
11060
11061   return TRUE;
11062 }
11063
11064 static const char *
11065 get_symbol_binding (Filedata * filedata, unsigned int binding)
11066 {
11067   static char buff[32];
11068
11069   switch (binding)
11070     {
11071     case STB_LOCAL:     return "LOCAL";
11072     case STB_GLOBAL:    return "GLOBAL";
11073     case STB_WEAK:      return "WEAK";
11074     default:
11075       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
11076         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
11077                   binding);
11078       else if (binding >= STB_LOOS && binding <= STB_HIOS)
11079         {
11080           if (binding == STB_GNU_UNIQUE
11081               && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU)
11082             return "UNIQUE";
11083           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
11084         }
11085       else
11086         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
11087       return buff;
11088     }
11089 }
11090
11091 static const char *
11092 get_symbol_type (Filedata * filedata, unsigned int type)
11093 {
11094   static char buff[32];
11095
11096   switch (type)
11097     {
11098     case STT_NOTYPE:    return "NOTYPE";
11099     case STT_OBJECT:    return "OBJECT";
11100     case STT_FUNC:      return "FUNC";
11101     case STT_SECTION:   return "SECTION";
11102     case STT_FILE:      return "FILE";
11103     case STT_COMMON:    return "COMMON";
11104     case STT_TLS:       return "TLS";
11105     case STT_RELC:      return "RELC";
11106     case STT_SRELC:     return "SRELC";
11107     default:
11108       if (type >= STT_LOPROC && type <= STT_HIPROC)
11109         {
11110           if (filedata->file_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
11111             return "THUMB_FUNC";
11112
11113           if (filedata->file_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
11114             return "REGISTER";
11115
11116           if (filedata->file_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
11117             return "PARISC_MILLI";
11118
11119           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
11120         }
11121       else if (type >= STT_LOOS && type <= STT_HIOS)
11122         {
11123           if (filedata->file_header.e_machine == EM_PARISC)
11124             {
11125               if (type == STT_HP_OPAQUE)
11126                 return "HP_OPAQUE";
11127               if (type == STT_HP_STUB)
11128                 return "HP_STUB";
11129             }
11130
11131           if (type == STT_GNU_IFUNC
11132               && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
11133                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD))
11134             return "IFUNC";
11135
11136           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
11137         }
11138       else
11139         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
11140       return buff;
11141     }
11142 }
11143
11144 static const char *
11145 get_symbol_visibility (unsigned int visibility)
11146 {
11147   switch (visibility)
11148     {
11149     case STV_DEFAULT:   return "DEFAULT";
11150     case STV_INTERNAL:  return "INTERNAL";
11151     case STV_HIDDEN:    return "HIDDEN";
11152     case STV_PROTECTED: return "PROTECTED";
11153     default:
11154       error (_("Unrecognized visibility value: %u"), visibility);
11155       return _("<unknown>");
11156     }
11157 }
11158
11159 static const char *
11160 get_alpha_symbol_other (unsigned int other)
11161 {
11162   switch (other)
11163     {
11164     case STO_ALPHA_NOPV:       return "NOPV";
11165     case STO_ALPHA_STD_GPLOAD: return "STD GPLOAD";
11166     default:
11167       error (_("Unrecognized alpah specific other value: %u"), other);
11168       return _("<unknown>");
11169     }
11170 }
11171
11172 static const char *
11173 get_solaris_symbol_visibility (unsigned int visibility)
11174 {
11175   switch (visibility)
11176     {
11177     case 4: return "EXPORTED";
11178     case 5: return "SINGLETON";
11179     case 6: return "ELIMINATE";
11180     default: return get_symbol_visibility (visibility);
11181     }
11182 }
11183
11184 static const char *
11185 get_aarch64_symbol_other (unsigned int other)
11186 {
11187   static char buf[32];
11188
11189   if (other & STO_AARCH64_VARIANT_PCS)
11190     {
11191       other &= ~STO_AARCH64_VARIANT_PCS;
11192       if (other == 0)
11193         return "VARIANT_PCS";
11194       snprintf (buf, sizeof buf, "VARIANT_PCS | %x", other);
11195       return buf;
11196     }
11197   return NULL;
11198 }
11199
11200 static const char *
11201 get_mips_symbol_other (unsigned int other)
11202 {
11203   switch (other)
11204     {
11205     case STO_OPTIONAL:      return "OPTIONAL";
11206     case STO_MIPS_PLT:      return "MIPS PLT";
11207     case STO_MIPS_PIC:      return "MIPS PIC";
11208     case STO_MICROMIPS:     return "MICROMIPS";
11209     case STO_MICROMIPS | STO_MIPS_PIC:      return "MICROMIPS, MIPS PIC";
11210     case STO_MIPS16:        return "MIPS16";
11211     default:                return NULL;
11212     }
11213 }
11214
11215 static const char *
11216 get_ia64_symbol_other (Filedata * filedata, unsigned int other)
11217 {
11218   if (is_ia64_vms (filedata))
11219     {
11220       static char res[32];
11221
11222       res[0] = 0;
11223
11224       /* Function types is for images and .STB files only.  */
11225       switch (filedata->file_header.e_type)
11226         {
11227         case ET_DYN:
11228         case ET_EXEC:
11229           switch (VMS_ST_FUNC_TYPE (other))
11230             {
11231             case VMS_SFT_CODE_ADDR:
11232               strcat (res, " CA");
11233               break;
11234             case VMS_SFT_SYMV_IDX:
11235               strcat (res, " VEC");
11236               break;
11237             case VMS_SFT_FD:
11238               strcat (res, " FD");
11239               break;
11240             case VMS_SFT_RESERVE:
11241               strcat (res, " RSV");
11242               break;
11243             default:
11244               warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
11245                     VMS_ST_FUNC_TYPE (other));
11246               strcat (res, " <unknown>");
11247               break;
11248             }
11249           break;
11250         default:
11251           break;
11252         }
11253       switch (VMS_ST_LINKAGE (other))
11254         {
11255         case VMS_STL_IGNORE:
11256           strcat (res, " IGN");
11257           break;
11258         case VMS_STL_RESERVE:
11259           strcat (res, " RSV");
11260           break;
11261         case VMS_STL_STD:
11262           strcat (res, " STD");
11263           break;
11264         case VMS_STL_LNK:
11265           strcat (res, " LNK");
11266           break;
11267         default:
11268           warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
11269                 VMS_ST_LINKAGE (other));
11270           strcat (res, " <unknown>");
11271           break;
11272         }
11273
11274       if (res[0] != 0)
11275         return res + 1;
11276       else
11277         return res;
11278     }
11279   return NULL;
11280 }
11281
11282 static const char *
11283 get_ppc64_symbol_other (unsigned int other)
11284 {
11285   if ((other & ~STO_PPC64_LOCAL_MASK) != 0)
11286     return NULL;
11287
11288   other >>= STO_PPC64_LOCAL_BIT;
11289   if (other <= 6)
11290     {
11291       static char buf[32];
11292       if (other >= 2)
11293         other = ppc64_decode_local_entry (other);
11294       snprintf (buf, sizeof buf, _("<localentry>: %d"), other);
11295       return buf;
11296     }
11297   return NULL;
11298 }
11299
11300 static const char *
11301 get_symbol_other (Filedata * filedata, unsigned int other)
11302 {
11303   const char * result = NULL;
11304   static char buff [32];
11305
11306   if (other == 0)
11307     return "";
11308
11309   switch (filedata->file_header.e_machine)
11310     {
11311     case EM_ALPHA:
11312       result = get_alpha_symbol_other (other);
11313       break;
11314     case EM_AARCH64:
11315       result = get_aarch64_symbol_other (other);
11316       break;
11317     case EM_MIPS:
11318       result = get_mips_symbol_other (other);
11319       break;
11320     case EM_IA_64:
11321       result = get_ia64_symbol_other (filedata, other);
11322       break;
11323     case EM_PPC64:
11324       result = get_ppc64_symbol_other (other);
11325       break;
11326     default:
11327       result = NULL;
11328       break;
11329     }
11330
11331   if (result)
11332     return result;
11333
11334   snprintf (buff, sizeof buff, _("<other>: %x"), other);
11335   return buff;
11336 }
11337
11338 static const char *
11339 get_symbol_index_type (Filedata * filedata, unsigned int type)
11340 {
11341   static char buff[32];
11342
11343   switch (type)
11344     {
11345     case SHN_UNDEF:     return "UND";
11346     case SHN_ABS:       return "ABS";
11347     case SHN_COMMON:    return "COM";
11348     default:
11349       if (type == SHN_IA_64_ANSI_COMMON
11350           && filedata->file_header.e_machine == EM_IA_64
11351           && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
11352         return "ANSI_COM";
11353       else if ((filedata->file_header.e_machine == EM_X86_64
11354                 || filedata->file_header.e_machine == EM_L1OM
11355                 || filedata->file_header.e_machine == EM_K1OM)
11356                && type == SHN_X86_64_LCOMMON)
11357         return "LARGE_COM";
11358       else if ((type == SHN_MIPS_SCOMMON
11359                 && filedata->file_header.e_machine == EM_MIPS)
11360                || (type == SHN_TIC6X_SCOMMON
11361                    && filedata->file_header.e_machine == EM_TI_C6000))
11362         return "SCOM";
11363       else if (type == SHN_MIPS_SUNDEFINED
11364                && filedata->file_header.e_machine == EM_MIPS)
11365         return "SUND";
11366       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
11367         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
11368       else if (type >= SHN_LOOS && type <= SHN_HIOS)
11369         sprintf (buff, "OS [0x%04x]", type & 0xffff);
11370       else if (type >= SHN_LORESERVE)
11371         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
11372       else if (type >= filedata->file_header.e_shnum)
11373         sprintf (buff, _("bad section index[%3d]"), type);
11374       else
11375         sprintf (buff, "%3d", type);
11376       break;
11377     }
11378
11379   return buff;
11380 }
11381
11382 static bfd_vma *
11383 get_dynamic_data (Filedata * filedata, bfd_size_type number, unsigned int ent_size)
11384 {
11385   unsigned char * e_data;
11386   bfd_vma * i_data;
11387
11388   /* If the size_t type is smaller than the bfd_size_type, eg because
11389      you are building a 32-bit tool on a 64-bit host, then make sure
11390      that when (number) is cast to (size_t) no information is lost.  */
11391   if (sizeof (size_t) < sizeof (bfd_size_type)
11392       && (bfd_size_type) ((size_t) number) != number)
11393     {
11394       error (_("Size truncation prevents reading %s elements of size %u\n"),
11395              bfd_vmatoa ("u", number), ent_size);
11396       return NULL;
11397     }
11398
11399   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
11400      attempting to allocate memory when the read is bound to fail.  */
11401   if (ent_size * number > filedata->file_size)
11402     {
11403       error (_("Invalid number of dynamic entries: %s\n"),
11404              bfd_vmatoa ("u", number));
11405       return NULL;
11406     }
11407
11408   e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
11409   if (e_data == NULL)
11410     {
11411       error (_("Out of memory reading %s dynamic entries\n"),
11412              bfd_vmatoa ("u", number));
11413       return NULL;
11414     }
11415
11416   if (fread (e_data, ent_size, (size_t) number, filedata->handle) != number)
11417     {
11418       error (_("Unable to read in %s bytes of dynamic data\n"),
11419              bfd_vmatoa ("u", number * ent_size));
11420       free (e_data);
11421       return NULL;
11422     }
11423
11424   i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
11425   if (i_data == NULL)
11426     {
11427       error (_("Out of memory allocating space for %s dynamic entries\n"),
11428              bfd_vmatoa ("u", number));
11429       free (e_data);
11430       return NULL;
11431     }
11432
11433   while (number--)
11434     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
11435
11436   free (e_data);
11437
11438   return i_data;
11439 }
11440
11441 static void
11442 print_dynamic_symbol (Filedata * filedata, bfd_vma si, unsigned long hn)
11443 {
11444   Elf_Internal_Sym * psym;
11445   int n;
11446
11447   n = print_vma (si, DEC_5);
11448   if (n < 5)
11449     fputs (&"     "[n], stdout);
11450   printf (" %3lu: ", hn);
11451
11452   if (dynamic_symbols == NULL || si >= num_dynamic_syms)
11453     {
11454       printf (_("<No info available for dynamic symbol number %lu>\n"),
11455               (unsigned long) si);
11456       return;
11457     }
11458
11459   psym = dynamic_symbols + si;
11460   print_vma (psym->st_value, LONG_HEX);
11461   putchar (' ');
11462   print_vma (psym->st_size, DEC_5);
11463
11464   printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11465   printf (" %-6s",  get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11466
11467   if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11468     printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11469   else
11470     {
11471       unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11472
11473       printf (" %-7s",  get_symbol_visibility (vis));
11474       /* Check to see if any other bits in the st_other field are set.
11475          Note - displaying this information disrupts the layout of the
11476          table being generated, but for the moment this case is very
11477          rare.  */
11478       if (psym->st_other ^ vis)
11479         printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11480     }
11481
11482   printf (" %3.3s ", get_symbol_index_type (filedata, psym->st_shndx));
11483   if (VALID_DYNAMIC_NAME (psym->st_name))
11484     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11485   else
11486     printf (_(" <corrupt: %14ld>"), psym->st_name);
11487   putchar ('\n');
11488 }
11489
11490 static const char *
11491 get_symbol_version_string (Filedata *                   filedata,
11492                            bfd_boolean                  is_dynsym,
11493                            const char *                 strtab,
11494                            unsigned long int            strtab_size,
11495                            unsigned int                 si,
11496                            Elf_Internal_Sym *           psym,
11497                            enum versioned_symbol_info * sym_info,
11498                            unsigned short *             vna_other)
11499 {
11500   unsigned char data[2];
11501   unsigned short vers_data;
11502   unsigned long offset;
11503   unsigned short max_vd_ndx;
11504
11505   if (!is_dynsym
11506       || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
11507     return NULL;
11508
11509   offset = offset_from_vma (filedata, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
11510                             sizeof data + si * sizeof (vers_data));
11511
11512   if (get_data (&data, filedata, offset + si * sizeof (vers_data),
11513                 sizeof (data), 1, _("version data")) == NULL)
11514     return NULL;
11515
11516   vers_data = byte_get (data, 2);
11517
11518   if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data == 0)
11519     return NULL;
11520
11521   max_vd_ndx = 0;
11522
11523   /* Usually we'd only see verdef for defined symbols, and verneed for
11524      undefined symbols.  However, symbols defined by the linker in
11525      .dynbss for variables copied from a shared library in order to
11526      avoid text relocations are defined yet have verneed.  We could
11527      use a heuristic to detect the special case, for example, check
11528      for verneed first on symbols defined in SHT_NOBITS sections, but
11529      it is simpler and more reliable to just look for both verdef and
11530      verneed.  .dynbss might not be mapped to a SHT_NOBITS section.  */
11531
11532   if (psym->st_shndx != SHN_UNDEF
11533       && vers_data != 0x8001
11534       && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
11535     {
11536       Elf_Internal_Verdef ivd;
11537       Elf_Internal_Verdaux ivda;
11538       Elf_External_Verdaux evda;
11539       unsigned long off;
11540
11541       off = offset_from_vma (filedata,
11542                              version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
11543                              sizeof (Elf_External_Verdef));
11544
11545       do
11546         {
11547           Elf_External_Verdef evd;
11548
11549           if (get_data (&evd, filedata, off, sizeof (evd), 1,
11550                         _("version def")) == NULL)
11551             {
11552               ivd.vd_ndx = 0;
11553               ivd.vd_aux = 0;
11554               ivd.vd_next = 0;
11555               ivd.vd_flags = 0;
11556             }
11557           else
11558             {
11559               ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
11560               ivd.vd_aux = BYTE_GET (evd.vd_aux);
11561               ivd.vd_next = BYTE_GET (evd.vd_next);
11562               ivd.vd_flags = BYTE_GET (evd.vd_flags);
11563             }
11564
11565           if ((ivd.vd_ndx & VERSYM_VERSION) > max_vd_ndx)
11566             max_vd_ndx = ivd.vd_ndx & VERSYM_VERSION;
11567
11568           off += ivd.vd_next;
11569         }
11570       while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
11571
11572       if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
11573         {
11574           if (ivd.vd_ndx == 1 && ivd.vd_flags == VER_FLG_BASE)
11575             return NULL;
11576
11577           off -= ivd.vd_next;
11578           off += ivd.vd_aux;
11579
11580           if (get_data (&evda, filedata, off, sizeof (evda), 1,
11581                         _("version def aux")) != NULL)
11582             {
11583               ivda.vda_name = BYTE_GET (evda.vda_name);
11584
11585               if (psym->st_name != ivda.vda_name)
11586                 {
11587                   *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
11588                                ? symbol_hidden : symbol_public);
11589                   return (ivda.vda_name < strtab_size
11590                           ? strtab + ivda.vda_name : _("<corrupt>"));
11591                 }
11592             }
11593         }
11594     }
11595
11596   if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
11597     {
11598       Elf_External_Verneed evn;
11599       Elf_Internal_Verneed ivn;
11600       Elf_Internal_Vernaux ivna;
11601
11602       offset = offset_from_vma (filedata,
11603                                 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
11604                                 sizeof evn);
11605       do
11606         {
11607           unsigned long vna_off;
11608
11609           if (get_data (&evn, filedata, offset, sizeof (evn), 1,
11610                         _("version need")) == NULL)
11611             {
11612               ivna.vna_next = 0;
11613               ivna.vna_other = 0;
11614               ivna.vna_name = 0;
11615               break;
11616             }
11617
11618           ivn.vn_aux  = BYTE_GET (evn.vn_aux);
11619           ivn.vn_next = BYTE_GET (evn.vn_next);
11620
11621           vna_off = offset + ivn.vn_aux;
11622
11623           do
11624             {
11625               Elf_External_Vernaux evna;
11626
11627               if (get_data (&evna, filedata, vna_off, sizeof (evna), 1,
11628                             _("version need aux (3)")) == NULL)
11629                 {
11630                   ivna.vna_next = 0;
11631                   ivna.vna_other = 0;
11632                   ivna.vna_name = 0;
11633                 }
11634               else
11635                 {
11636                   ivna.vna_other = BYTE_GET (evna.vna_other);
11637                   ivna.vna_next  = BYTE_GET (evna.vna_next);
11638                   ivna.vna_name  = BYTE_GET (evna.vna_name);
11639                 }
11640
11641               vna_off += ivna.vna_next;
11642             }
11643           while (ivna.vna_other != vers_data && ivna.vna_next != 0);
11644
11645           if (ivna.vna_other == vers_data)
11646             break;
11647
11648           offset += ivn.vn_next;
11649         }
11650       while (ivn.vn_next != 0);
11651
11652       if (ivna.vna_other == vers_data)
11653         {
11654           *sym_info = symbol_undefined;
11655           *vna_other = ivna.vna_other;
11656           return (ivna.vna_name < strtab_size
11657                   ? strtab + ivna.vna_name : _("<corrupt>"));
11658         }
11659       else if ((max_vd_ndx || (vers_data & VERSYM_VERSION) != 1)
11660                && (vers_data & VERSYM_VERSION) > max_vd_ndx)
11661         return _("<corrupt>");
11662     }
11663   return NULL;
11664 }
11665
11666 /* Dump the symbol table.  */
11667 static bfd_boolean
11668 process_symbol_table (Filedata * filedata)
11669 {
11670   Elf_Internal_Shdr * section;
11671   bfd_size_type nbuckets = 0;
11672   bfd_size_type nchains = 0;
11673   bfd_vma * buckets = NULL;
11674   bfd_vma * chains = NULL;
11675   bfd_vma ngnubuckets = 0;
11676   bfd_vma * gnubuckets = NULL;
11677   bfd_vma * gnuchains = NULL;
11678   bfd_vma gnusymidx = 0;
11679   bfd_size_type ngnuchains = 0;
11680
11681   if (!do_syms && !do_dyn_syms && !do_histogram)
11682     return TRUE;
11683
11684   if (dynamic_info[DT_HASH]
11685       && (do_histogram
11686           || (do_using_dynamic
11687               && !do_dyn_syms
11688               && dynamic_strings != NULL)))
11689     {
11690       unsigned char nb[8];
11691       unsigned char nc[8];
11692       unsigned int hash_ent_size = 4;
11693
11694       if ((filedata->file_header.e_machine == EM_ALPHA
11695            || filedata->file_header.e_machine == EM_S390
11696            || filedata->file_header.e_machine == EM_S390_OLD)
11697           && filedata->file_header.e_ident[EI_CLASS] == ELFCLASS64)
11698         hash_ent_size = 8;
11699
11700       if (fseek (filedata->handle,
11701                  (archive_file_offset
11702                   + offset_from_vma (filedata, dynamic_info[DT_HASH],
11703                                      sizeof nb + sizeof nc)),
11704                  SEEK_SET))
11705         {
11706           error (_("Unable to seek to start of dynamic information\n"));
11707           goto no_hash;
11708         }
11709
11710       if (fread (nb, hash_ent_size, 1, filedata->handle) != 1)
11711         {
11712           error (_("Failed to read in number of buckets\n"));
11713           goto no_hash;
11714         }
11715
11716       if (fread (nc, hash_ent_size, 1, filedata->handle) != 1)
11717         {
11718           error (_("Failed to read in number of chains\n"));
11719           goto no_hash;
11720         }
11721
11722       nbuckets = byte_get (nb, hash_ent_size);
11723       nchains  = byte_get (nc, hash_ent_size);
11724
11725       buckets = get_dynamic_data (filedata, nbuckets, hash_ent_size);
11726       chains  = get_dynamic_data (filedata, nchains, hash_ent_size);
11727
11728     no_hash:
11729       if (buckets == NULL || chains == NULL)
11730         {
11731           if (do_using_dynamic)
11732             return FALSE;
11733           free (buckets);
11734           free (chains);
11735           buckets = NULL;
11736           chains = NULL;
11737           nbuckets = 0;
11738           nchains = 0;
11739         }
11740     }
11741
11742   if (dynamic_info_DT_GNU_HASH
11743       && (do_histogram
11744           || (do_using_dynamic
11745               && !do_dyn_syms
11746               && dynamic_strings != NULL)))
11747     {
11748       unsigned char nb[16];
11749       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11750       bfd_vma buckets_vma;
11751
11752       if (fseek (filedata->handle,
11753                  (archive_file_offset
11754                   + offset_from_vma (filedata, dynamic_info_DT_GNU_HASH,
11755                                      sizeof nb)),
11756                  SEEK_SET))
11757         {
11758           error (_("Unable to seek to start of dynamic information\n"));
11759           goto no_gnu_hash;
11760         }
11761
11762       if (fread (nb, 16, 1, filedata->handle) != 1)
11763         {
11764           error (_("Failed to read in number of buckets\n"));
11765           goto no_gnu_hash;
11766         }
11767
11768       ngnubuckets = byte_get (nb, 4);
11769       gnusymidx = byte_get (nb + 4, 4);
11770       bitmaskwords = byte_get (nb + 8, 4);
11771       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
11772       if (is_32bit_elf)
11773         buckets_vma += bitmaskwords * 4;
11774       else
11775         buckets_vma += bitmaskwords * 8;
11776
11777       if (fseek (filedata->handle,
11778                  (archive_file_offset
11779                   + offset_from_vma (filedata, buckets_vma, 4)),
11780                  SEEK_SET))
11781         {
11782           error (_("Unable to seek to start of dynamic information\n"));
11783           goto no_gnu_hash;
11784         }
11785
11786       gnubuckets = get_dynamic_data (filedata, ngnubuckets, 4);
11787
11788       if (gnubuckets == NULL)
11789         goto no_gnu_hash;
11790
11791       for (i = 0; i < ngnubuckets; i++)
11792         if (gnubuckets[i] != 0)
11793           {
11794             if (gnubuckets[i] < gnusymidx)
11795               return FALSE;
11796
11797             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11798               maxchain = gnubuckets[i];
11799           }
11800
11801       if (maxchain == 0xffffffff)
11802         goto no_gnu_hash;
11803
11804       maxchain -= gnusymidx;
11805
11806       if (fseek (filedata->handle,
11807                  (archive_file_offset
11808                   + offset_from_vma (filedata, buckets_vma
11809                                            + 4 * (ngnubuckets + maxchain), 4)),
11810                  SEEK_SET))
11811         {
11812           error (_("Unable to seek to start of dynamic information\n"));
11813           goto no_gnu_hash;
11814         }
11815
11816       do
11817         {
11818           if (fread (nb, 4, 1, filedata->handle) != 1)
11819             {
11820               error (_("Failed to determine last chain length\n"));
11821               goto no_gnu_hash;
11822             }
11823
11824           if (maxchain + 1 == 0)
11825             goto no_gnu_hash;
11826
11827           ++maxchain;
11828         }
11829       while ((byte_get (nb, 4) & 1) == 0);
11830
11831       if (fseek (filedata->handle,
11832                  (archive_file_offset
11833                   + offset_from_vma (filedata, buckets_vma + 4 * ngnubuckets, 4)),
11834                  SEEK_SET))
11835         {
11836           error (_("Unable to seek to start of dynamic information\n"));
11837           goto no_gnu_hash;
11838         }
11839
11840       gnuchains = get_dynamic_data (filedata, maxchain, 4);
11841       ngnuchains = maxchain;
11842
11843     no_gnu_hash:
11844       if (gnuchains == NULL)
11845         {
11846           free (gnubuckets);
11847           gnubuckets = NULL;
11848           ngnubuckets = 0;
11849           if (do_using_dynamic)
11850             return FALSE;
11851         }
11852     }
11853
11854   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11855       && do_syms
11856       && do_using_dynamic
11857       && dynamic_strings != NULL
11858       && dynamic_symbols != NULL)
11859     {
11860       unsigned long hn;
11861
11862       if (dynamic_info[DT_HASH])
11863         {
11864           bfd_vma si;
11865           char *visited;
11866
11867           printf (_("\nSymbol table for image:\n"));
11868           if (is_32bit_elf)
11869             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11870           else
11871             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11872
11873           visited = xcmalloc (nchains, 1);
11874           memset (visited, 0, nchains);
11875           for (hn = 0; hn < nbuckets; hn++)
11876             {
11877               for (si = buckets[hn]; si > 0; si = chains[si])
11878                 {
11879                   print_dynamic_symbol (filedata, si, hn);
11880                   if (si >= nchains || visited[si])
11881                     {
11882                       error (_("histogram chain is corrupt\n"));
11883                       break;
11884                     }
11885                   visited[si] = 1;
11886                 }
11887             }
11888           free (visited);
11889         }
11890
11891       if (dynamic_info_DT_GNU_HASH)
11892         {
11893           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11894           if (is_32bit_elf)
11895             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11896           else
11897             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11898
11899           for (hn = 0; hn < ngnubuckets; ++hn)
11900             if (gnubuckets[hn] != 0)
11901               {
11902                 bfd_vma si = gnubuckets[hn];
11903                 bfd_vma off = si - gnusymidx;
11904
11905                 do
11906                   {
11907                     print_dynamic_symbol (filedata, si, hn);
11908                     si++;
11909                   }
11910                 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11911               }
11912         }
11913     }
11914   else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11915            && filedata->section_headers != NULL)
11916     {
11917       unsigned int i;
11918
11919       for (i = 0, section = filedata->section_headers;
11920            i < filedata->file_header.e_shnum;
11921            i++, section++)
11922         {
11923           unsigned int si;
11924           char * strtab = NULL;
11925           unsigned long int strtab_size = 0;
11926           Elf_Internal_Sym * symtab;
11927           Elf_Internal_Sym * psym;
11928           unsigned long num_syms;
11929
11930           if ((section->sh_type != SHT_SYMTAB
11931                && section->sh_type != SHT_DYNSYM)
11932               || (!do_syms
11933                   && section->sh_type == SHT_SYMTAB))
11934             continue;
11935
11936           if (section->sh_entsize == 0)
11937             {
11938               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11939                       printable_section_name (filedata, section));
11940               continue;
11941             }
11942
11943           num_syms = section->sh_size / section->sh_entsize;
11944           printf (ngettext ("\nSymbol table '%s' contains %lu entry:\n",
11945                             "\nSymbol table '%s' contains %lu entries:\n",
11946                             num_syms),
11947                   printable_section_name (filedata, section),
11948                   num_syms);
11949
11950           if (is_32bit_elf)
11951             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
11952           else
11953             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
11954
11955           symtab = GET_ELF_SYMBOLS (filedata, section, & num_syms);
11956           if (symtab == NULL)
11957             continue;
11958
11959           if (section->sh_link == filedata->file_header.e_shstrndx)
11960             {
11961               strtab = filedata->string_table;
11962               strtab_size = filedata->string_table_length;
11963             }
11964           else if (section->sh_link < filedata->file_header.e_shnum)
11965             {
11966               Elf_Internal_Shdr * string_sec;
11967
11968               string_sec = filedata->section_headers + section->sh_link;
11969
11970               strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset,
11971                                           1, string_sec->sh_size,
11972                                           _("string table"));
11973               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11974             }
11975
11976           for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11977             {
11978               const char *version_string;
11979               enum versioned_symbol_info sym_info;
11980               unsigned short vna_other;
11981
11982               printf ("%6d: ", si);
11983               print_vma (psym->st_value, LONG_HEX);
11984               putchar (' ');
11985               print_vma (psym->st_size, DEC_5);
11986               printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11987               printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11988               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11989                 printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11990               else
11991                 {
11992                   unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11993
11994                   printf (" %-7s", get_symbol_visibility (vis));
11995                   /* Check to see if any other bits in the st_other field are set.
11996                      Note - displaying this information disrupts the layout of the
11997                      table being generated, but for the moment this case is very rare.  */
11998                   if (psym->st_other ^ vis)
11999                     printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
12000                 }
12001               printf (" %4s ", get_symbol_index_type (filedata, psym->st_shndx));
12002               print_symbol (25, psym->st_name < strtab_size
12003                             ? strtab + psym->st_name : _("<corrupt>"));
12004
12005               version_string
12006                 = get_symbol_version_string (filedata,
12007                                              section->sh_type == SHT_DYNSYM,
12008                                              strtab, strtab_size, si,
12009                                              psym, &sym_info, &vna_other);
12010               if (version_string)
12011                 {
12012                   if (sym_info == symbol_undefined)
12013                     printf ("@%s (%d)", version_string, vna_other);
12014                   else
12015                     printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
12016                             version_string);
12017                 }
12018
12019               putchar ('\n');
12020
12021               if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
12022                   && si >= section->sh_info
12023                   /* Irix 5 and 6 MIPS binaries are known to ignore this requirement.  */
12024                   && filedata->file_header.e_machine != EM_MIPS
12025                   /* Solaris binaries have been found to violate this requirement as
12026                      well.  Not sure if this is a bug or an ABI requirement.  */
12027                   && filedata->file_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
12028                 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
12029                       si, printable_section_name (filedata, section), section->sh_info);
12030             }
12031
12032           free (symtab);
12033           if (strtab != filedata->string_table)
12034             free (strtab);
12035         }
12036     }
12037   else if (do_syms)
12038     printf
12039       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
12040
12041   if (do_histogram && buckets != NULL)
12042     {
12043       unsigned long * lengths;
12044       unsigned long * counts;
12045       unsigned long hn;
12046       bfd_vma si;
12047       unsigned long maxlength = 0;
12048       unsigned long nzero_counts = 0;
12049       unsigned long nsyms = 0;
12050       char *visited;
12051
12052       printf (ngettext ("\nHistogram for bucket list length "
12053                         "(total of %lu bucket):\n",
12054                         "\nHistogram for bucket list length "
12055                         "(total of %lu buckets):\n",
12056                         (unsigned long) nbuckets),
12057               (unsigned long) nbuckets);
12058
12059       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
12060       if (lengths == NULL)
12061         {
12062           error (_("Out of memory allocating space for histogram buckets\n"));
12063           return FALSE;
12064         }
12065       visited = xcmalloc (nchains, 1);
12066       memset (visited, 0, nchains);
12067
12068       printf (_(" Length  Number     %% of total  Coverage\n"));
12069       for (hn = 0; hn < nbuckets; ++hn)
12070         {
12071           for (si = buckets[hn]; si > 0; si = chains[si])
12072             {
12073               ++nsyms;
12074               if (maxlength < ++lengths[hn])
12075                 ++maxlength;
12076               if (si >= nchains || visited[si])
12077                 {
12078                   error (_("histogram chain is corrupt\n"));
12079                   break;
12080                 }
12081               visited[si] = 1;
12082             }
12083         }
12084       free (visited);
12085
12086       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
12087       if (counts == NULL)
12088         {
12089           free (lengths);
12090           error (_("Out of memory allocating space for histogram counts\n"));
12091           return FALSE;
12092         }
12093
12094       for (hn = 0; hn < nbuckets; ++hn)
12095         ++counts[lengths[hn]];
12096
12097       if (nbuckets > 0)
12098         {
12099           unsigned long i;
12100           printf ("      0  %-10lu (%5.1f%%)\n",
12101                   counts[0], (counts[0] * 100.0) / nbuckets);
12102           for (i = 1; i <= maxlength; ++i)
12103             {
12104               nzero_counts += counts[i] * i;
12105               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
12106                       i, counts[i], (counts[i] * 100.0) / nbuckets,
12107                       (nzero_counts * 100.0) / nsyms);
12108             }
12109         }
12110
12111       free (counts);
12112       free (lengths);
12113     }
12114
12115   if (buckets != NULL)
12116     {
12117       free (buckets);
12118       free (chains);
12119     }
12120
12121   if (do_histogram && gnubuckets != NULL)
12122     {
12123       unsigned long * lengths;
12124       unsigned long * counts;
12125       unsigned long hn;
12126       unsigned long maxlength = 0;
12127       unsigned long nzero_counts = 0;
12128       unsigned long nsyms = 0;
12129
12130       printf (ngettext ("\nHistogram for `.gnu.hash' bucket list length "
12131                         "(total of %lu bucket):\n",
12132                         "\nHistogram for `.gnu.hash' bucket list length "
12133                         "(total of %lu buckets):\n",
12134                         (unsigned long) ngnubuckets),
12135               (unsigned long) ngnubuckets);
12136
12137       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
12138       if (lengths == NULL)
12139         {
12140           error (_("Out of memory allocating space for gnu histogram buckets\n"));
12141           return FALSE;
12142         }
12143
12144       printf (_(" Length  Number     %% of total  Coverage\n"));
12145
12146       for (hn = 0; hn < ngnubuckets; ++hn)
12147         if (gnubuckets[hn] != 0)
12148           {
12149             bfd_vma off, length = 1;
12150
12151             for (off = gnubuckets[hn] - gnusymidx;
12152                  /* PR 17531 file: 010-77222-0.004.  */
12153                  off < ngnuchains && (gnuchains[off] & 1) == 0;
12154                  ++off)
12155               ++length;
12156             lengths[hn] = length;
12157             if (length > maxlength)
12158               maxlength = length;
12159             nsyms += length;
12160           }
12161
12162       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
12163       if (counts == NULL)
12164         {
12165           free (lengths);
12166           error (_("Out of memory allocating space for gnu histogram counts\n"));
12167           return FALSE;
12168         }
12169
12170       for (hn = 0; hn < ngnubuckets; ++hn)
12171         ++counts[lengths[hn]];
12172
12173       if (ngnubuckets > 0)
12174         {
12175           unsigned long j;
12176           printf ("      0  %-10lu (%5.1f%%)\n",
12177                   counts[0], (counts[0] * 100.0) / ngnubuckets);
12178           for (j = 1; j <= maxlength; ++j)
12179             {
12180               nzero_counts += counts[j] * j;
12181               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
12182                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
12183                       (nzero_counts * 100.0) / nsyms);
12184             }
12185         }
12186
12187       free (counts);
12188       free (lengths);
12189       free (gnubuckets);
12190       free (gnuchains);
12191     }
12192
12193   return TRUE;
12194 }
12195
12196 static bfd_boolean
12197 process_syminfo (Filedata * filedata ATTRIBUTE_UNUSED)
12198 {
12199   unsigned int i;
12200
12201   if (dynamic_syminfo == NULL
12202       || !do_dynamic)
12203     /* No syminfo, this is ok.  */
12204     return TRUE;
12205
12206   /* There better should be a dynamic symbol section.  */
12207   if (dynamic_symbols == NULL || dynamic_strings == NULL)
12208     return FALSE;
12209
12210   if (dynamic_addr)
12211     printf (ngettext ("\nDynamic info segment at offset 0x%lx "
12212                       "contains %d entry:\n",
12213                       "\nDynamic info segment at offset 0x%lx "
12214                       "contains %d entries:\n",
12215                       dynamic_syminfo_nent),
12216             dynamic_syminfo_offset, dynamic_syminfo_nent);
12217
12218   printf (_(" Num: Name                           BoundTo     Flags\n"));
12219   for (i = 0; i < dynamic_syminfo_nent; ++i)
12220     {
12221       unsigned short int flags = dynamic_syminfo[i].si_flags;
12222
12223       printf ("%4d: ", i);
12224       if (i >= num_dynamic_syms)
12225         printf (_("<corrupt index>"));
12226       else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
12227         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
12228       else
12229         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
12230       putchar (' ');
12231
12232       switch (dynamic_syminfo[i].si_boundto)
12233         {
12234         case SYMINFO_BT_SELF:
12235           fputs ("SELF       ", stdout);
12236           break;
12237         case SYMINFO_BT_PARENT:
12238           fputs ("PARENT     ", stdout);
12239           break;
12240         default:
12241           if (dynamic_syminfo[i].si_boundto > 0
12242               && dynamic_syminfo[i].si_boundto < dynamic_nent
12243               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
12244             {
12245               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
12246               putchar (' ' );
12247             }
12248           else
12249             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
12250           break;
12251         }
12252
12253       if (flags & SYMINFO_FLG_DIRECT)
12254         printf (" DIRECT");
12255       if (flags & SYMINFO_FLG_PASSTHRU)
12256         printf (" PASSTHRU");
12257       if (flags & SYMINFO_FLG_COPY)
12258         printf (" COPY");
12259       if (flags & SYMINFO_FLG_LAZYLOAD)
12260         printf (" LAZYLOAD");
12261
12262       puts ("");
12263     }
12264
12265   return TRUE;
12266 }
12267
12268 #define IN_RANGE(START,END,ADDR,OFF)            \
12269   (((ADDR) >= (START)) && ((ADDR) + (OFF) < (END)))
12270
12271 /* Check to see if the given reloc needs to be handled in a target specific
12272    manner.  If so then process the reloc and return TRUE otherwise return
12273    FALSE.
12274
12275    If called with reloc == NULL, then this is a signal that reloc processing
12276    for the current section has finished, and any saved state should be
12277    discarded.  */
12278
12279 static bfd_boolean
12280 target_specific_reloc_handling (Filedata *           filedata,
12281                                 Elf_Internal_Rela *  reloc,
12282                                 unsigned char *      start,
12283                                 unsigned char *      end,
12284                                 Elf_Internal_Sym *   symtab,
12285                                 unsigned long        num_syms)
12286 {
12287   unsigned int reloc_type = 0;
12288   unsigned long sym_index = 0;
12289
12290   if (reloc)
12291     {
12292       reloc_type = get_reloc_type (filedata, reloc->r_info);
12293       sym_index = get_reloc_symindex (reloc->r_info);
12294     }
12295
12296   switch (filedata->file_header.e_machine)
12297     {
12298     case EM_MSP430:
12299     case EM_MSP430_OLD:
12300       {
12301         static Elf_Internal_Sym * saved_sym = NULL;
12302
12303         if (reloc == NULL)
12304           {
12305             saved_sym = NULL;
12306             return TRUE;
12307           }
12308
12309         switch (reloc_type)
12310           {
12311           case 10: /* R_MSP430_SYM_DIFF */
12312             if (uses_msp430x_relocs (filedata))
12313               break;
12314             /* Fall through.  */
12315           case 21: /* R_MSP430X_SYM_DIFF */
12316             /* PR 21139.  */
12317             if (sym_index >= num_syms)
12318               error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
12319                      sym_index);
12320             else
12321               saved_sym = symtab + sym_index;
12322             return TRUE;
12323
12324           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
12325           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
12326             goto handle_sym_diff;
12327
12328           case 5: /* R_MSP430_16_BYTE */
12329           case 9: /* R_MSP430_8 */
12330             if (uses_msp430x_relocs (filedata))
12331               break;
12332             goto handle_sym_diff;
12333
12334           case 2: /* R_MSP430_ABS16 */
12335           case 15: /* R_MSP430X_ABS16 */
12336             if (! uses_msp430x_relocs (filedata))
12337               break;
12338             goto handle_sym_diff;
12339
12340           handle_sym_diff:
12341             if (saved_sym != NULL)
12342               {
12343                 int reloc_size = reloc_type == 1 ? 4 : 2;
12344                 bfd_vma value;
12345
12346                 if (sym_index >= num_syms)
12347                   error (_("MSP430 reloc contains invalid symbol index %lu\n"),
12348                          sym_index);
12349                 else
12350                   {
12351                     value = reloc->r_addend + (symtab[sym_index].st_value
12352                                                - saved_sym->st_value);
12353
12354                     if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12355                       byte_put (start + reloc->r_offset, value, reloc_size);
12356                     else
12357                       /* PR 21137 */
12358                       error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
12359                              (long) reloc->r_offset);
12360                   }
12361
12362                 saved_sym = NULL;
12363                 return TRUE;
12364               }
12365             break;
12366
12367           default:
12368             if (saved_sym != NULL)
12369               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
12370             break;
12371           }
12372         break;
12373       }
12374
12375     case EM_MN10300:
12376     case EM_CYGNUS_MN10300:
12377       {
12378         static Elf_Internal_Sym * saved_sym = NULL;
12379
12380         if (reloc == NULL)
12381           {
12382             saved_sym = NULL;
12383             return TRUE;
12384           }
12385
12386         switch (reloc_type)
12387           {
12388           case 34: /* R_MN10300_ALIGN */
12389             return TRUE;
12390           case 33: /* R_MN10300_SYM_DIFF */
12391             if (sym_index >= num_syms)
12392               error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
12393                      sym_index);
12394             else
12395               saved_sym = symtab + sym_index;
12396             return TRUE;
12397
12398           case 1: /* R_MN10300_32 */
12399           case 2: /* R_MN10300_16 */
12400             if (saved_sym != NULL)
12401               {
12402                 int reloc_size = reloc_type == 1 ? 4 : 2;
12403                 bfd_vma value;
12404
12405                 if (sym_index >= num_syms)
12406                   error (_("MN10300 reloc contains invalid symbol index %lu\n"),
12407                          sym_index);
12408                 else
12409                   {
12410                     value = reloc->r_addend + (symtab[sym_index].st_value
12411                                                - saved_sym->st_value);
12412
12413                     if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12414                       byte_put (start + reloc->r_offset, value, reloc_size);
12415                     else
12416                       error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
12417                              (long) reloc->r_offset);
12418                   }
12419
12420                 saved_sym = NULL;
12421                 return TRUE;
12422               }
12423             break;
12424           default:
12425             if (saved_sym != NULL)
12426               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
12427             break;
12428           }
12429         break;
12430       }
12431
12432     case EM_RL78:
12433       {
12434         static bfd_vma saved_sym1 = 0;
12435         static bfd_vma saved_sym2 = 0;
12436         static bfd_vma value;
12437
12438         if (reloc == NULL)
12439           {
12440             saved_sym1 = saved_sym2 = 0;
12441             return TRUE;
12442           }
12443
12444         switch (reloc_type)
12445           {
12446           case 0x80: /* R_RL78_SYM.  */
12447             saved_sym1 = saved_sym2;
12448             if (sym_index >= num_syms)
12449               error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
12450                      sym_index);
12451             else
12452               {
12453                 saved_sym2 = symtab[sym_index].st_value;
12454                 saved_sym2 += reloc->r_addend;
12455               }
12456             return TRUE;
12457
12458           case 0x83: /* R_RL78_OPsub.  */
12459             value = saved_sym1 - saved_sym2;
12460             saved_sym2 = saved_sym1 = 0;
12461             return TRUE;
12462             break;
12463
12464           case 0x41: /* R_RL78_ABS32.  */
12465             if (IN_RANGE (start, end, start + reloc->r_offset, 4))
12466               byte_put (start + reloc->r_offset, value, 4);
12467             else
12468               error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12469                      (long) reloc->r_offset);
12470             value = 0;
12471             return TRUE;
12472
12473           case 0x43: /* R_RL78_ABS16.  */
12474             if (IN_RANGE (start, end, start + reloc->r_offset, 2))
12475               byte_put (start + reloc->r_offset, value, 2);
12476             else
12477               error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12478                      (long) reloc->r_offset);
12479             value = 0;
12480             return TRUE;
12481
12482           default:
12483             break;
12484           }
12485         break;
12486       }
12487     }
12488
12489   return FALSE;
12490 }
12491
12492 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
12493    DWARF debug sections.  This is a target specific test.  Note - we do not
12494    go through the whole including-target-headers-multiple-times route, (as
12495    we have already done with <elf/h8.h>) because this would become very
12496    messy and even then this function would have to contain target specific
12497    information (the names of the relocs instead of their numeric values).
12498    FIXME: This is not the correct way to solve this problem.  The proper way
12499    is to have target specific reloc sizing and typing functions created by
12500    the reloc-macros.h header, in the same way that it already creates the
12501    reloc naming functions.  */
12502
12503 static bfd_boolean
12504 is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12505 {
12506   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12507   switch (filedata->file_header.e_machine)
12508     {
12509     case EM_386:
12510     case EM_IAMCU:
12511       return reloc_type == 1; /* R_386_32.  */
12512     case EM_68K:
12513       return reloc_type == 1; /* R_68K_32.  */
12514     case EM_860:
12515       return reloc_type == 1; /* R_860_32.  */
12516     case EM_960:
12517       return reloc_type == 2; /* R_960_32.  */
12518     case EM_AARCH64:
12519       return (reloc_type == 258
12520               || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
12521     case EM_BPF:
12522       return reloc_type == 11; /* R_BPF_DATA_32 */
12523     case EM_ADAPTEVA_EPIPHANY:
12524       return reloc_type == 3;
12525     case EM_ALPHA:
12526       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
12527     case EM_ARC:
12528       return reloc_type == 1; /* R_ARC_32.  */
12529     case EM_ARC_COMPACT:
12530     case EM_ARC_COMPACT2:
12531       return reloc_type == 4; /* R_ARC_32.  */
12532     case EM_ARM:
12533       return reloc_type == 2; /* R_ARM_ABS32 */
12534     case EM_AVR_OLD:
12535     case EM_AVR:
12536       return reloc_type == 1;
12537     case EM_BLACKFIN:
12538       return reloc_type == 0x12; /* R_byte4_data.  */
12539     case EM_CRIS:
12540       return reloc_type == 3; /* R_CRIS_32.  */
12541     case EM_CR16:
12542       return reloc_type == 3; /* R_CR16_NUM32.  */
12543     case EM_CRX:
12544       return reloc_type == 15; /* R_CRX_NUM32.  */
12545     case EM_CSKY:
12546       return reloc_type == 1; /* R_CKCORE_ADDR32.  */
12547     case EM_CYGNUS_FRV:
12548       return reloc_type == 1;
12549     case EM_CYGNUS_D10V:
12550     case EM_D10V:
12551       return reloc_type == 6; /* R_D10V_32.  */
12552     case EM_CYGNUS_D30V:
12553     case EM_D30V:
12554       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
12555     case EM_DLX:
12556       return reloc_type == 3; /* R_DLX_RELOC_32.  */
12557     case EM_CYGNUS_FR30:
12558     case EM_FR30:
12559       return reloc_type == 3; /* R_FR30_32.  */
12560     case EM_FT32:
12561       return reloc_type == 1; /* R_FT32_32.  */
12562     case EM_H8S:
12563     case EM_H8_300:
12564     case EM_H8_300H:
12565       return reloc_type == 1; /* R_H8_DIR32.  */
12566     case EM_IA_64:
12567       return (reloc_type == 0x64    /* R_IA64_SECREL32MSB.  */
12568               || reloc_type == 0x65 /* R_IA64_SECREL32LSB.  */
12569               || reloc_type == 0x24 /* R_IA64_DIR32MSB.  */
12570               || reloc_type == 0x25 /* R_IA64_DIR32LSB.  */);
12571     case EM_IP2K_OLD:
12572     case EM_IP2K:
12573       return reloc_type == 2; /* R_IP2K_32.  */
12574     case EM_IQ2000:
12575       return reloc_type == 2; /* R_IQ2000_32.  */
12576     case EM_LATTICEMICO32:
12577       return reloc_type == 3; /* R_LM32_32.  */
12578     case EM_M32C_OLD:
12579     case EM_M32C:
12580       return reloc_type == 3; /* R_M32C_32.  */
12581     case EM_M32R:
12582       return reloc_type == 34; /* R_M32R_32_RELA.  */
12583     case EM_68HC11:
12584     case EM_68HC12:
12585       return reloc_type == 6; /* R_M68HC11_32.  */
12586     case EM_S12Z:
12587       return reloc_type == 7 || /* R_S12Z_EXT32 */
12588         reloc_type == 6;        /* R_S12Z_CW32.  */
12589     case EM_MCORE:
12590       return reloc_type == 1; /* R_MCORE_ADDR32.  */
12591     case EM_CYGNUS_MEP:
12592       return reloc_type == 4; /* R_MEP_32.  */
12593     case EM_METAG:
12594       return reloc_type == 2; /* R_METAG_ADDR32.  */
12595     case EM_MICROBLAZE:
12596       return reloc_type == 1; /* R_MICROBLAZE_32.  */
12597     case EM_MIPS:
12598       return reloc_type == 2; /* R_MIPS_32.  */
12599     case EM_MMIX:
12600       return reloc_type == 4; /* R_MMIX_32.  */
12601     case EM_CYGNUS_MN10200:
12602     case EM_MN10200:
12603       return reloc_type == 1; /* R_MN10200_32.  */
12604     case EM_CYGNUS_MN10300:
12605     case EM_MN10300:
12606       return reloc_type == 1; /* R_MN10300_32.  */
12607     case EM_MOXIE:
12608       return reloc_type == 1; /* R_MOXIE_32.  */
12609     case EM_MSP430_OLD:
12610     case EM_MSP430:
12611       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
12612     case EM_MT:
12613       return reloc_type == 2; /* R_MT_32.  */
12614     case EM_NDS32:
12615       return reloc_type == 20; /* R_NDS32_RELA.  */
12616     case EM_ALTERA_NIOS2:
12617       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
12618     case EM_NIOS32:
12619       return reloc_type == 1; /* R_NIOS_32.  */
12620     case EM_OR1K:
12621       return reloc_type == 1; /* R_OR1K_32.  */
12622     case EM_PARISC:
12623       return (reloc_type == 1 /* R_PARISC_DIR32.  */
12624               || reloc_type == 2 /* R_PARISC_DIR21L.  */
12625               || reloc_type == 41); /* R_PARISC_SECREL32.  */
12626     case EM_PJ:
12627     case EM_PJ_OLD:
12628       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
12629     case EM_PPC64:
12630       return reloc_type == 1; /* R_PPC64_ADDR32.  */
12631     case EM_PPC:
12632       return reloc_type == 1; /* R_PPC_ADDR32.  */
12633     case EM_TI_PRU:
12634       return reloc_type == 11; /* R_PRU_BFD_RELOC_32.  */
12635     case EM_RISCV:
12636       return reloc_type == 1; /* R_RISCV_32.  */
12637     case EM_RL78:
12638       return reloc_type == 1; /* R_RL78_DIR32.  */
12639     case EM_RX:
12640       return reloc_type == 1; /* R_RX_DIR32.  */
12641     case EM_S370:
12642       return reloc_type == 1; /* R_I370_ADDR31.  */
12643     case EM_S390_OLD:
12644     case EM_S390:
12645       return reloc_type == 4; /* R_S390_32.  */
12646     case EM_SCORE:
12647       return reloc_type == 8; /* R_SCORE_ABS32.  */
12648     case EM_SH:
12649       return reloc_type == 1; /* R_SH_DIR32.  */
12650     case EM_SPARC32PLUS:
12651     case EM_SPARCV9:
12652     case EM_SPARC:
12653       return reloc_type == 3 /* R_SPARC_32.  */
12654         || reloc_type == 23; /* R_SPARC_UA32.  */
12655     case EM_SPU:
12656       return reloc_type == 6; /* R_SPU_ADDR32 */
12657     case EM_TI_C6000:
12658       return reloc_type == 1; /* R_C6000_ABS32.  */
12659     case EM_TILEGX:
12660       return reloc_type == 2; /* R_TILEGX_32.  */
12661     case EM_TILEPRO:
12662       return reloc_type == 1; /* R_TILEPRO_32.  */
12663     case EM_CYGNUS_V850:
12664     case EM_V850:
12665       return reloc_type == 6; /* R_V850_ABS32.  */
12666     case EM_V800:
12667       return reloc_type == 0x33; /* R_V810_WORD.  */
12668     case EM_VAX:
12669       return reloc_type == 1; /* R_VAX_32.  */
12670     case EM_VISIUM:
12671       return reloc_type == 3;  /* R_VISIUM_32. */
12672     case EM_WEBASSEMBLY:
12673       return reloc_type == 1;  /* R_WASM32_32.  */
12674     case EM_X86_64:
12675     case EM_L1OM:
12676     case EM_K1OM:
12677       return reloc_type == 10; /* R_X86_64_32.  */
12678     case EM_XC16X:
12679     case EM_C166:
12680       return reloc_type == 3; /* R_XC16C_ABS_32.  */
12681     case EM_XGATE:
12682       return reloc_type == 4; /* R_XGATE_32.  */
12683     case EM_XSTORMY16:
12684       return reloc_type == 1; /* R_XSTROMY16_32.  */
12685     case EM_XTENSA_OLD:
12686     case EM_XTENSA:
12687       return reloc_type == 1; /* R_XTENSA_32.  */
12688     default:
12689       {
12690         static unsigned int prev_warn = 0;
12691
12692         /* Avoid repeating the same warning multiple times.  */
12693         if (prev_warn != filedata->file_header.e_machine)
12694           error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
12695                  filedata->file_header.e_machine);
12696         prev_warn = filedata->file_header.e_machine;
12697         return FALSE;
12698       }
12699     }
12700 }
12701
12702 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12703    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
12704
12705 static bfd_boolean
12706 is_32bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12707 {
12708   switch (filedata->file_header.e_machine)
12709   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12710     {
12711     case EM_386:
12712     case EM_IAMCU:
12713       return reloc_type == 2;  /* R_386_PC32.  */
12714     case EM_68K:
12715       return reloc_type == 4;  /* R_68K_PC32.  */
12716     case EM_AARCH64:
12717       return reloc_type == 261; /* R_AARCH64_PREL32 */
12718     case EM_ADAPTEVA_EPIPHANY:
12719       return reloc_type == 6;
12720     case EM_ALPHA:
12721       return reloc_type == 10; /* R_ALPHA_SREL32.  */
12722     case EM_ARC_COMPACT:
12723     case EM_ARC_COMPACT2:
12724       return reloc_type == 49; /* R_ARC_32_PCREL.  */
12725     case EM_ARM:
12726       return reloc_type == 3;  /* R_ARM_REL32 */
12727     case EM_AVR_OLD:
12728     case EM_AVR:
12729       return reloc_type == 36; /* R_AVR_32_PCREL.  */
12730     case EM_MICROBLAZE:
12731       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
12732     case EM_OR1K:
12733       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
12734     case EM_PARISC:
12735       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
12736     case EM_PPC:
12737       return reloc_type == 26; /* R_PPC_REL32.  */
12738     case EM_PPC64:
12739       return reloc_type == 26; /* R_PPC64_REL32.  */
12740     case EM_RISCV:
12741       return reloc_type == 57;  /* R_RISCV_32_PCREL.  */
12742     case EM_S390_OLD:
12743     case EM_S390:
12744       return reloc_type == 5;  /* R_390_PC32.  */
12745     case EM_SH:
12746       return reloc_type == 2;  /* R_SH_REL32.  */
12747     case EM_SPARC32PLUS:
12748     case EM_SPARCV9:
12749     case EM_SPARC:
12750       return reloc_type == 6;  /* R_SPARC_DISP32.  */
12751     case EM_SPU:
12752       return reloc_type == 13; /* R_SPU_REL32.  */
12753     case EM_TILEGX:
12754       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
12755     case EM_TILEPRO:
12756       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
12757     case EM_VISIUM:
12758       return reloc_type == 6;  /* R_VISIUM_32_PCREL */
12759     case EM_X86_64:
12760     case EM_L1OM:
12761     case EM_K1OM:
12762       return reloc_type == 2;  /* R_X86_64_PC32.  */
12763     case EM_VAX:
12764       return reloc_type == 4;  /* R_VAX_PCREL32.  */
12765     case EM_XTENSA_OLD:
12766     case EM_XTENSA:
12767       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
12768     default:
12769       /* Do not abort or issue an error message here.  Not all targets use
12770          pc-relative 32-bit relocs in their DWARF debug information and we
12771          have already tested for target coverage in is_32bit_abs_reloc.  A
12772          more helpful warning message will be generated by apply_relocations
12773          anyway, so just return.  */
12774       return FALSE;
12775     }
12776 }
12777
12778 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12779    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
12780
12781 static bfd_boolean
12782 is_64bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12783 {
12784   switch (filedata->file_header.e_machine)
12785     {
12786     case EM_AARCH64:
12787       return reloc_type == 257; /* R_AARCH64_ABS64.  */
12788     case EM_ALPHA:
12789       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
12790     case EM_IA_64:
12791       return (reloc_type == 0x26    /* R_IA64_DIR64MSB.  */
12792               || reloc_type == 0x27 /* R_IA64_DIR64LSB.  */);
12793     case EM_PARISC:
12794       return reloc_type == 80; /* R_PARISC_DIR64.  */
12795     case EM_PPC64:
12796       return reloc_type == 38; /* R_PPC64_ADDR64.  */
12797     case EM_RISCV:
12798       return reloc_type == 2; /* R_RISCV_64.  */
12799     case EM_SPARC32PLUS:
12800     case EM_SPARCV9:
12801     case EM_SPARC:
12802       return reloc_type == 32 /* R_SPARC_64.  */
12803         || reloc_type == 54; /* R_SPARC_UA64.  */
12804     case EM_X86_64:
12805     case EM_L1OM:
12806     case EM_K1OM:
12807       return reloc_type == 1; /* R_X86_64_64.  */
12808     case EM_S390_OLD:
12809     case EM_S390:
12810       return reloc_type == 22;  /* R_S390_64.  */
12811     case EM_TILEGX:
12812       return reloc_type == 1; /* R_TILEGX_64.  */
12813     case EM_MIPS:
12814       return reloc_type == 18;  /* R_MIPS_64.  */
12815     default:
12816       return FALSE;
12817     }
12818 }
12819
12820 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12821    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
12822
12823 static bfd_boolean
12824 is_64bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12825 {
12826   switch (filedata->file_header.e_machine)
12827     {
12828     case EM_AARCH64:
12829       return reloc_type == 260; /* R_AARCH64_PREL64.  */
12830     case EM_ALPHA:
12831       return reloc_type == 11; /* R_ALPHA_SREL64.  */
12832     case EM_IA_64:
12833       return (reloc_type == 0x4e    /* R_IA64_PCREL64MSB.  */
12834               || reloc_type == 0x4f /* R_IA64_PCREL64LSB.  */);
12835     case EM_PARISC:
12836       return reloc_type == 72; /* R_PARISC_PCREL64.  */
12837     case EM_PPC64:
12838       return reloc_type == 44; /* R_PPC64_REL64.  */
12839     case EM_SPARC32PLUS:
12840     case EM_SPARCV9:
12841     case EM_SPARC:
12842       return reloc_type == 46; /* R_SPARC_DISP64.  */
12843     case EM_X86_64:
12844     case EM_L1OM:
12845     case EM_K1OM:
12846       return reloc_type == 24; /* R_X86_64_PC64.  */
12847     case EM_S390_OLD:
12848     case EM_S390:
12849       return reloc_type == 23;  /* R_S390_PC64.  */
12850     case EM_TILEGX:
12851       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
12852     default:
12853       return FALSE;
12854     }
12855 }
12856
12857 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12858    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
12859
12860 static bfd_boolean
12861 is_24bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12862 {
12863   switch (filedata->file_header.e_machine)
12864     {
12865     case EM_CYGNUS_MN10200:
12866     case EM_MN10200:
12867       return reloc_type == 4; /* R_MN10200_24.  */
12868     case EM_FT32:
12869       return reloc_type == 5; /* R_FT32_20.  */
12870     default:
12871       return FALSE;
12872     }
12873 }
12874
12875 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12876    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
12877
12878 static bfd_boolean
12879 is_16bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12880 {
12881   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12882   switch (filedata->file_header.e_machine)
12883     {
12884     case EM_ARC:
12885     case EM_ARC_COMPACT:
12886     case EM_ARC_COMPACT2:
12887       return reloc_type == 2; /* R_ARC_16.  */
12888     case EM_ADAPTEVA_EPIPHANY:
12889       return reloc_type == 5;
12890     case EM_AVR_OLD:
12891     case EM_AVR:
12892       return reloc_type == 4; /* R_AVR_16.  */
12893     case EM_CYGNUS_D10V:
12894     case EM_D10V:
12895       return reloc_type == 3; /* R_D10V_16.  */
12896     case EM_FT32:
12897       return reloc_type == 2; /* R_FT32_16.  */
12898     case EM_H8S:
12899     case EM_H8_300:
12900     case EM_H8_300H:
12901       return reloc_type == R_H8_DIR16;
12902     case EM_IP2K_OLD:
12903     case EM_IP2K:
12904       return reloc_type == 1; /* R_IP2K_16.  */
12905     case EM_M32C_OLD:
12906     case EM_M32C:
12907       return reloc_type == 1; /* R_M32C_16 */
12908     case EM_CYGNUS_MN10200:
12909     case EM_MN10200:
12910       return reloc_type == 2; /* R_MN10200_16.  */
12911     case EM_CYGNUS_MN10300:
12912     case EM_MN10300:
12913       return reloc_type == 2; /* R_MN10300_16.  */
12914     case EM_MSP430:
12915       if (uses_msp430x_relocs (filedata))
12916         return reloc_type == 2; /* R_MSP430_ABS16.  */
12917       /* Fall through.  */
12918     case EM_MSP430_OLD:
12919       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
12920     case EM_NDS32:
12921       return reloc_type == 19; /* R_NDS32_RELA.  */
12922     case EM_ALTERA_NIOS2:
12923       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
12924     case EM_NIOS32:
12925       return reloc_type == 9; /* R_NIOS_16.  */
12926     case EM_OR1K:
12927       return reloc_type == 2; /* R_OR1K_16.  */
12928     case EM_RISCV:
12929       return reloc_type == 55; /* R_RISCV_SET16.  */
12930     case EM_TI_PRU:
12931       return reloc_type == 8; /* R_PRU_BFD_RELOC_16.  */
12932     case EM_TI_C6000:
12933       return reloc_type == 2; /* R_C6000_ABS16.  */
12934     case EM_VISIUM:
12935       return reloc_type == 2; /* R_VISIUM_16. */
12936     case EM_XC16X:
12937     case EM_C166:
12938       return reloc_type == 2; /* R_XC16C_ABS_16.  */
12939     case EM_XGATE:
12940       return reloc_type == 3; /* R_XGATE_16.  */
12941     default:
12942       return FALSE;
12943     }
12944 }
12945
12946 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12947    a 8-bit absolute RELA relocation used in DWARF debug sections.  */
12948
12949 static bfd_boolean
12950 is_8bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12951 {
12952   switch (filedata->file_header.e_machine)
12953     {
12954     case EM_RISCV:
12955       return reloc_type == 54; /* R_RISCV_SET8.  */
12956     default:
12957       return FALSE;
12958     }
12959 }
12960
12961 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12962    a 6-bit absolute RELA relocation used in DWARF debug sections.  */
12963
12964 static bfd_boolean
12965 is_6bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12966 {
12967   switch (filedata->file_header.e_machine)
12968     {
12969     case EM_RISCV:
12970       return reloc_type == 53; /* R_RISCV_SET6.  */
12971     default:
12972       return FALSE;
12973     }
12974 }
12975
12976 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12977    a 32-bit inplace add RELA relocation used in DWARF debug sections.  */
12978
12979 static bfd_boolean
12980 is_32bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12981 {
12982   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12983   switch (filedata->file_header.e_machine)
12984     {
12985     case EM_RISCV:
12986       return reloc_type == 35; /* R_RISCV_ADD32.  */
12987     default:
12988       return FALSE;
12989     }
12990 }
12991
12992 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12993    a 32-bit inplace sub RELA relocation used in DWARF debug sections.  */
12994
12995 static bfd_boolean
12996 is_32bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12997 {
12998   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12999   switch (filedata->file_header.e_machine)
13000     {
13001     case EM_RISCV:
13002       return reloc_type == 39; /* R_RISCV_SUB32.  */
13003     default:
13004       return FALSE;
13005     }
13006 }
13007
13008 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13009    a 64-bit inplace add RELA relocation used in DWARF debug sections.  */
13010
13011 static bfd_boolean
13012 is_64bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
13013 {
13014   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13015   switch (filedata->file_header.e_machine)
13016     {
13017     case EM_RISCV:
13018       return reloc_type == 36; /* R_RISCV_ADD64.  */
13019     default:
13020       return FALSE;
13021     }
13022 }
13023
13024 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13025    a 64-bit inplace sub RELA relocation used in DWARF debug sections.  */
13026
13027 static bfd_boolean
13028 is_64bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
13029 {
13030   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13031   switch (filedata->file_header.e_machine)
13032     {
13033     case EM_RISCV:
13034       return reloc_type == 40; /* R_RISCV_SUB64.  */
13035     default:
13036       return FALSE;
13037     }
13038 }
13039
13040 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13041    a 16-bit inplace add RELA relocation used in DWARF debug sections.  */
13042
13043 static bfd_boolean
13044 is_16bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
13045 {
13046   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13047   switch (filedata->file_header.e_machine)
13048     {
13049     case EM_RISCV:
13050       return reloc_type == 34; /* R_RISCV_ADD16.  */
13051     default:
13052       return FALSE;
13053     }
13054 }
13055
13056 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13057    a 16-bit inplace sub RELA relocation used in DWARF debug sections.  */
13058
13059 static bfd_boolean
13060 is_16bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
13061 {
13062   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13063   switch (filedata->file_header.e_machine)
13064     {
13065     case EM_RISCV:
13066       return reloc_type == 38; /* R_RISCV_SUB16.  */
13067     default:
13068       return FALSE;
13069     }
13070 }
13071
13072 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13073    a 8-bit inplace add RELA relocation used in DWARF debug sections.  */
13074
13075 static bfd_boolean
13076 is_8bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
13077 {
13078   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13079   switch (filedata->file_header.e_machine)
13080     {
13081     case EM_RISCV:
13082       return reloc_type == 33; /* R_RISCV_ADD8.  */
13083     default:
13084       return FALSE;
13085     }
13086 }
13087
13088 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13089    a 8-bit inplace sub RELA relocation used in DWARF debug sections.  */
13090
13091 static bfd_boolean
13092 is_8bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
13093 {
13094   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13095   switch (filedata->file_header.e_machine)
13096     {
13097     case EM_RISCV:
13098       return reloc_type == 37; /* R_RISCV_SUB8.  */
13099     default:
13100       return FALSE;
13101     }
13102 }
13103
13104 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13105    a 6-bit inplace sub RELA relocation used in DWARF debug sections.  */
13106
13107 static bfd_boolean
13108 is_6bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
13109 {
13110   switch (filedata->file_header.e_machine)
13111     {
13112     case EM_RISCV:
13113       return reloc_type == 52; /* R_RISCV_SUB6.  */
13114     default:
13115       return FALSE;
13116     }
13117 }
13118
13119 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
13120    relocation entries (possibly formerly used for SHT_GROUP sections).  */
13121
13122 static bfd_boolean
13123 is_none_reloc (Filedata * filedata, unsigned int reloc_type)
13124 {
13125   switch (filedata->file_header.e_machine)
13126     {
13127     case EM_386:     /* R_386_NONE.  */
13128     case EM_68K:     /* R_68K_NONE.  */
13129     case EM_ADAPTEVA_EPIPHANY:
13130     case EM_ALPHA:   /* R_ALPHA_NONE.  */
13131     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
13132     case EM_ARC:     /* R_ARC_NONE.  */
13133     case EM_ARC_COMPACT2: /* R_ARC_NONE.  */
13134     case EM_ARC_COMPACT: /* R_ARC_NONE.  */
13135     case EM_ARM:     /* R_ARM_NONE.  */
13136     case EM_C166:    /* R_XC16X_NONE.  */
13137     case EM_CRIS:    /* R_CRIS_NONE.  */
13138     case EM_FT32:    /* R_FT32_NONE.  */
13139     case EM_IA_64:   /* R_IA64_NONE.  */
13140     case EM_K1OM:    /* R_X86_64_NONE.  */
13141     case EM_L1OM:    /* R_X86_64_NONE.  */
13142     case EM_M32R:    /* R_M32R_NONE.  */
13143     case EM_MIPS:    /* R_MIPS_NONE.  */
13144     case EM_MN10300: /* R_MN10300_NONE.  */
13145     case EM_MOXIE:   /* R_MOXIE_NONE.  */
13146     case EM_NIOS32:  /* R_NIOS_NONE.  */
13147     case EM_OR1K:    /* R_OR1K_NONE. */
13148     case EM_PARISC:  /* R_PARISC_NONE.  */
13149     case EM_PPC64:   /* R_PPC64_NONE.  */
13150     case EM_PPC:     /* R_PPC_NONE.  */
13151     case EM_RISCV:   /* R_RISCV_NONE.  */
13152     case EM_S390:    /* R_390_NONE.  */
13153     case EM_S390_OLD:
13154     case EM_SH:      /* R_SH_NONE.  */
13155     case EM_SPARC32PLUS:
13156     case EM_SPARC:   /* R_SPARC_NONE.  */
13157     case EM_SPARCV9:
13158     case EM_TILEGX:  /* R_TILEGX_NONE.  */
13159     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
13160     case EM_TI_C6000:/* R_C6000_NONE.  */
13161     case EM_X86_64:  /* R_X86_64_NONE.  */
13162     case EM_XC16X:
13163     case EM_WEBASSEMBLY: /* R_WASM32_NONE.  */
13164       return reloc_type == 0;
13165
13166     case EM_AARCH64:
13167       return reloc_type == 0 || reloc_type == 256;
13168     case EM_AVR_OLD:
13169     case EM_AVR:
13170       return (reloc_type == 0 /* R_AVR_NONE.  */
13171               || reloc_type == 30 /* R_AVR_DIFF8.  */
13172               || reloc_type == 31 /* R_AVR_DIFF16.  */
13173               || reloc_type == 32 /* R_AVR_DIFF32.  */);
13174     case EM_METAG:
13175       return reloc_type == 3; /* R_METAG_NONE.  */
13176     case EM_NDS32:
13177       return (reloc_type == 0       /* R_XTENSA_NONE.  */
13178               || reloc_type == 204  /* R_NDS32_DIFF8.  */
13179               || reloc_type == 205  /* R_NDS32_DIFF16.  */
13180               || reloc_type == 206  /* R_NDS32_DIFF32.  */
13181               || reloc_type == 207  /* R_NDS32_ULEB128.  */);
13182     case EM_TI_PRU:
13183       return (reloc_type == 0       /* R_PRU_NONE.  */
13184               || reloc_type == 65   /* R_PRU_DIFF8.  */
13185               || reloc_type == 66   /* R_PRU_DIFF16.  */
13186               || reloc_type == 67   /* R_PRU_DIFF32.  */);
13187     case EM_XTENSA_OLD:
13188     case EM_XTENSA:
13189       return (reloc_type == 0      /* R_XTENSA_NONE.  */
13190               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
13191               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
13192               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
13193     }
13194   return FALSE;
13195 }
13196
13197 /* Returns TRUE if there is a relocation against
13198    section NAME at OFFSET bytes.  */
13199
13200 bfd_boolean
13201 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
13202 {
13203   Elf_Internal_Rela * relocs;
13204   Elf_Internal_Rela * rp;
13205
13206   if (dsec == NULL || dsec->reloc_info == NULL)
13207     return FALSE;
13208
13209   relocs = (Elf_Internal_Rela *) dsec->reloc_info;
13210
13211   for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
13212     if (rp->r_offset == offset)
13213       return TRUE;
13214
13215    return FALSE;
13216 }
13217
13218 /* Apply relocations to a section.
13219    Returns TRUE upon success, FALSE otherwise.
13220    If RELOCS_RETURN is non-NULL then it is set to point to the loaded relocs.
13221    It is then the caller's responsibility to free them.  NUM_RELOCS_RETURN
13222    will be set to the number of relocs loaded.
13223
13224    Note: So far support has been added only for those relocations
13225    which can be found in debug sections. FIXME: Add support for
13226    more relocations ?  */
13227
13228 static bfd_boolean
13229 apply_relocations (Filedata *                 filedata,
13230                    const Elf_Internal_Shdr *  section,
13231                    unsigned char *            start,
13232                    bfd_size_type              size,
13233                    void **                    relocs_return,
13234                    unsigned long *            num_relocs_return)
13235 {
13236   Elf_Internal_Shdr * relsec;
13237   unsigned char * end = start + size;
13238
13239   if (relocs_return != NULL)
13240     {
13241       * (Elf_Internal_Rela **) relocs_return = NULL;
13242       * num_relocs_return = 0;
13243     }
13244
13245   if (filedata->file_header.e_type != ET_REL)
13246     /* No relocs to apply.  */
13247     return TRUE;
13248
13249   /* Find the reloc section associated with the section.  */
13250   for (relsec = filedata->section_headers;
13251        relsec < filedata->section_headers + filedata->file_header.e_shnum;
13252        ++relsec)
13253     {
13254       bfd_boolean is_rela;
13255       unsigned long num_relocs;
13256       Elf_Internal_Rela * relocs;
13257       Elf_Internal_Rela * rp;
13258       Elf_Internal_Shdr * symsec;
13259       Elf_Internal_Sym * symtab;
13260       unsigned long num_syms;
13261       Elf_Internal_Sym * sym;
13262
13263       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13264           || relsec->sh_info >= filedata->file_header.e_shnum
13265           || filedata->section_headers + relsec->sh_info != section
13266           || relsec->sh_size == 0
13267           || relsec->sh_link >= filedata->file_header.e_shnum)
13268         continue;
13269
13270       is_rela = relsec->sh_type == SHT_RELA;
13271
13272       if (is_rela)
13273         {
13274           if (!slurp_rela_relocs (filedata, relsec->sh_offset,
13275                                   relsec->sh_size, & relocs, & num_relocs))
13276             return FALSE;
13277         }
13278       else
13279         {
13280           if (!slurp_rel_relocs (filedata, relsec->sh_offset,
13281                                  relsec->sh_size, & relocs, & num_relocs))
13282             return FALSE;
13283         }
13284
13285       /* SH uses RELA but uses in place value instead of the addend field.  */
13286       if (filedata->file_header.e_machine == EM_SH)
13287         is_rela = FALSE;
13288
13289       symsec = filedata->section_headers + relsec->sh_link;
13290       if (symsec->sh_type != SHT_SYMTAB
13291           && symsec->sh_type != SHT_DYNSYM)
13292         return FALSE;
13293       symtab = GET_ELF_SYMBOLS (filedata, symsec, & num_syms);
13294
13295       for (rp = relocs; rp < relocs + num_relocs; ++rp)
13296         {
13297           bfd_vma         addend;
13298           unsigned int    reloc_type;
13299           unsigned int    reloc_size;
13300           bfd_boolean     reloc_inplace = FALSE;
13301           bfd_boolean     reloc_subtract = FALSE;
13302           unsigned char * rloc;
13303           unsigned long   sym_index;
13304
13305           reloc_type = get_reloc_type (filedata, rp->r_info);
13306
13307           if (target_specific_reloc_handling (filedata, rp, start, end, symtab, num_syms))
13308             continue;
13309           else if (is_none_reloc (filedata, reloc_type))
13310             continue;
13311           else if (is_32bit_abs_reloc (filedata, reloc_type)
13312                    || is_32bit_pcrel_reloc (filedata, reloc_type))
13313             reloc_size = 4;
13314           else if (is_64bit_abs_reloc (filedata, reloc_type)
13315                    || is_64bit_pcrel_reloc (filedata, reloc_type))
13316             reloc_size = 8;
13317           else if (is_24bit_abs_reloc (filedata, reloc_type))
13318             reloc_size = 3;
13319           else if (is_16bit_abs_reloc (filedata, reloc_type))
13320             reloc_size = 2;
13321           else if (is_8bit_abs_reloc (filedata, reloc_type)
13322                    || is_6bit_abs_reloc (filedata, reloc_type))
13323             reloc_size = 1;
13324           else if ((reloc_subtract = is_32bit_inplace_sub_reloc (filedata,
13325                                                                  reloc_type))
13326                    || is_32bit_inplace_add_reloc (filedata, reloc_type))
13327             {
13328               reloc_size = 4;
13329               reloc_inplace = TRUE;
13330             }
13331           else if ((reloc_subtract = is_64bit_inplace_sub_reloc (filedata,
13332                                                                  reloc_type))
13333                    || is_64bit_inplace_add_reloc (filedata, reloc_type))
13334             {
13335               reloc_size = 8;
13336               reloc_inplace = TRUE;
13337             }
13338           else if ((reloc_subtract = is_16bit_inplace_sub_reloc (filedata,
13339                                                                  reloc_type))
13340                    || is_16bit_inplace_add_reloc (filedata, reloc_type))
13341             {
13342               reloc_size = 2;
13343               reloc_inplace = TRUE;
13344             }
13345           else if ((reloc_subtract = is_8bit_inplace_sub_reloc (filedata,
13346                                                                 reloc_type))
13347                    || is_8bit_inplace_add_reloc (filedata, reloc_type))
13348             {
13349               reloc_size = 1;
13350               reloc_inplace = TRUE;
13351             }
13352           else if ((reloc_subtract = is_6bit_inplace_sub_reloc (filedata,
13353                                                                 reloc_type)))
13354             {
13355               reloc_size = 1;
13356               reloc_inplace = TRUE;
13357             }
13358           else
13359             {
13360               static unsigned int prev_reloc = 0;
13361
13362               if (reloc_type != prev_reloc)
13363                 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
13364                       reloc_type, printable_section_name (filedata, section));
13365               prev_reloc = reloc_type;
13366               continue;
13367             }
13368
13369           rloc = start + rp->r_offset;
13370           if (rloc >= end || (rloc + reloc_size) > end || (rloc < start))
13371             {
13372               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
13373                     (unsigned long) rp->r_offset,
13374                     printable_section_name (filedata, section));
13375               continue;
13376             }
13377
13378           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
13379           if (sym_index >= num_syms)
13380             {
13381               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
13382                     sym_index, printable_section_name (filedata, section));
13383               continue;
13384             }
13385           sym = symtab + sym_index;
13386
13387           /* If the reloc has a symbol associated with it,
13388              make sure that it is of an appropriate type.
13389
13390              Relocations against symbols without type can happen.
13391              Gcc -feliminate-dwarf2-dups may generate symbols
13392              without type for debug info.
13393
13394              Icc generates relocations against function symbols
13395              instead of local labels.
13396
13397              Relocations against object symbols can happen, eg when
13398              referencing a global array.  For an example of this see
13399              the _clz.o binary in libgcc.a.  */
13400           if (sym != symtab
13401               && ELF_ST_TYPE (sym->st_info) != STT_COMMON
13402               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
13403             {
13404               warn (_("skipping unexpected symbol type %s in section %s relocation %ld\n"),
13405                     get_symbol_type (filedata, ELF_ST_TYPE (sym->st_info)),
13406                     printable_section_name (filedata, relsec),
13407                     (long int)(rp - relocs));
13408               continue;
13409             }
13410
13411           addend = 0;
13412           if (is_rela)
13413             addend += rp->r_addend;
13414           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
13415              partial_inplace.  */
13416           if (!is_rela
13417               || (filedata->file_header.e_machine == EM_XTENSA
13418                   && reloc_type == 1)
13419               || ((filedata->file_header.e_machine == EM_PJ
13420                    || filedata->file_header.e_machine == EM_PJ_OLD)
13421                   && reloc_type == 1)
13422               || ((filedata->file_header.e_machine == EM_D30V
13423                    || filedata->file_header.e_machine == EM_CYGNUS_D30V)
13424                   && reloc_type == 12)
13425               || reloc_inplace)
13426             {
13427               if (is_6bit_inplace_sub_reloc (filedata, reloc_type))
13428                 addend += byte_get (rloc, reloc_size) & 0x3f;
13429               else
13430                 addend += byte_get (rloc, reloc_size);
13431             }
13432
13433           if (is_32bit_pcrel_reloc (filedata, reloc_type)
13434               || is_64bit_pcrel_reloc (filedata, reloc_type))
13435             {
13436               /* On HPPA, all pc-relative relocations are biased by 8.  */
13437               if (filedata->file_header.e_machine == EM_PARISC)
13438                 addend -= 8;
13439               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
13440                         reloc_size);
13441             }
13442           else if (is_6bit_abs_reloc (filedata, reloc_type)
13443                    || is_6bit_inplace_sub_reloc (filedata, reloc_type))
13444             {
13445               if (reloc_subtract)
13446                 addend -= sym->st_value;
13447               else
13448                 addend += sym->st_value;
13449               addend = (addend & 0x3f) | (byte_get (rloc, reloc_size) & 0xc0);
13450               byte_put (rloc, addend, reloc_size);
13451             }
13452           else if (reloc_subtract)
13453             byte_put (rloc, addend - sym->st_value, reloc_size);
13454           else
13455             byte_put (rloc, addend + sym->st_value, reloc_size);
13456         }
13457
13458       free (symtab);
13459       /* Let the target specific reloc processing code know that
13460          we have finished with these relocs.  */
13461       target_specific_reloc_handling (filedata, NULL, NULL, NULL, NULL, 0);
13462
13463       if (relocs_return)
13464         {
13465           * (Elf_Internal_Rela **) relocs_return = relocs;
13466           * num_relocs_return = num_relocs;
13467         }
13468       else
13469         free (relocs);
13470
13471       break;
13472     }
13473
13474   return TRUE;
13475 }
13476
13477 #ifdef SUPPORT_DISASSEMBLY
13478 static bfd_boolean
13479 disassemble_section (Elf_Internal_Shdr * section, Filedata * filedata)
13480 {
13481   printf (_("\nAssembly dump of section %s\n"), printable_section_name (filedata, section));
13482
13483   /* FIXME: XXX -- to be done --- XXX */
13484
13485   return TRUE;
13486 }
13487 #endif
13488
13489 /* Reads in the contents of SECTION from FILE, returning a pointer
13490    to a malloc'ed buffer or NULL if something went wrong.  */
13491
13492 static char *
13493 get_section_contents (Elf_Internal_Shdr * section, Filedata * filedata)
13494 {
13495   bfd_size_type num_bytes = section->sh_size;
13496
13497   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
13498     {
13499       printf (_("Section '%s' has no data to dump.\n"),
13500               printable_section_name (filedata, section));
13501       return NULL;
13502     }
13503
13504   return  (char *) get_data (NULL, filedata, section->sh_offset, 1, num_bytes,
13505                              _("section contents"));
13506 }
13507
13508 /* Uncompresses a section that was compressed using zlib, in place.  */
13509
13510 static bfd_boolean
13511 uncompress_section_contents (unsigned char **   buffer,
13512                              dwarf_size_type    uncompressed_size,
13513                              dwarf_size_type *  size)
13514 {
13515   dwarf_size_type compressed_size = *size;
13516   unsigned char * compressed_buffer = *buffer;
13517   unsigned char * uncompressed_buffer;
13518   z_stream strm;
13519   int rc;
13520
13521   /* It is possible the section consists of several compressed
13522      buffers concatenated together, so we uncompress in a loop.  */
13523   /* PR 18313: The state field in the z_stream structure is supposed
13524      to be invisible to the user (ie us), but some compilers will
13525      still complain about it being used without initialisation.  So
13526      we first zero the entire z_stream structure and then set the fields
13527      that we need.  */
13528   memset (& strm, 0, sizeof strm);
13529   strm.avail_in = compressed_size;
13530   strm.next_in = (Bytef *) compressed_buffer;
13531   strm.avail_out = uncompressed_size;
13532   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
13533
13534   rc = inflateInit (& strm);
13535   while (strm.avail_in > 0)
13536     {
13537       if (rc != Z_OK)
13538         goto fail;
13539       strm.next_out = ((Bytef *) uncompressed_buffer
13540                        + (uncompressed_size - strm.avail_out));
13541       rc = inflate (&strm, Z_FINISH);
13542       if (rc != Z_STREAM_END)
13543         goto fail;
13544       rc = inflateReset (& strm);
13545     }
13546   rc = inflateEnd (& strm);
13547   if (rc != Z_OK
13548       || strm.avail_out != 0)
13549     goto fail;
13550
13551   *buffer = uncompressed_buffer;
13552   *size = uncompressed_size;
13553   return TRUE;
13554
13555  fail:
13556   free (uncompressed_buffer);
13557   /* Indicate decompression failure.  */
13558   *buffer = NULL;
13559   return FALSE;
13560 }
13561
13562 static bfd_boolean
13563 dump_section_as_strings (Elf_Internal_Shdr * section, Filedata * filedata)
13564 {
13565   Elf_Internal_Shdr *  relsec;
13566   bfd_size_type        num_bytes;
13567   unsigned char *      data;
13568   unsigned char *      end;
13569   unsigned char *      real_start;
13570   unsigned char *      start;
13571   bfd_boolean          some_strings_shown;
13572
13573   real_start = start = (unsigned char *) get_section_contents (section, filedata);
13574   if (start == NULL)
13575     /* PR 21820: Do not fail if the section was empty.  */
13576     return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13577
13578   num_bytes = section->sh_size;
13579
13580   printf (_("\nString dump of section '%s':\n"), printable_section_name (filedata, section));
13581
13582   if (decompress_dumps)
13583     {
13584       dwarf_size_type new_size = num_bytes;
13585       dwarf_size_type uncompressed_size = 0;
13586
13587       if ((section->sh_flags & SHF_COMPRESSED) != 0)
13588         {
13589           Elf_Internal_Chdr chdr;
13590           unsigned int compression_header_size
13591             = get_compression_header (& chdr, (unsigned char *) start,
13592                                       num_bytes);
13593
13594           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13595             {
13596               warn (_("section '%s' has unsupported compress type: %d\n"),
13597                     printable_section_name (filedata, section), chdr.ch_type);
13598               return FALSE;
13599             }
13600           uncompressed_size = chdr.ch_size;
13601           start += compression_header_size;
13602           new_size -= compression_header_size;
13603         }
13604       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13605         {
13606           /* Read the zlib header.  In this case, it should be "ZLIB"
13607              followed by the uncompressed section size, 8 bytes in
13608              big-endian order.  */
13609           uncompressed_size = start[4]; uncompressed_size <<= 8;
13610           uncompressed_size += start[5]; uncompressed_size <<= 8;
13611           uncompressed_size += start[6]; uncompressed_size <<= 8;
13612           uncompressed_size += start[7]; uncompressed_size <<= 8;
13613           uncompressed_size += start[8]; uncompressed_size <<= 8;
13614           uncompressed_size += start[9]; uncompressed_size <<= 8;
13615           uncompressed_size += start[10]; uncompressed_size <<= 8;
13616           uncompressed_size += start[11];
13617           start += 12;
13618           new_size -= 12;
13619         }
13620
13621       if (uncompressed_size)
13622         {
13623           if (uncompress_section_contents (& start,
13624                                            uncompressed_size, & new_size))
13625             num_bytes = new_size;
13626           else
13627             {
13628               error (_("Unable to decompress section %s\n"),
13629                      printable_section_name (filedata, section));
13630               return FALSE;
13631             }
13632         }
13633       else
13634         start = real_start;
13635     }
13636
13637   /* If the section being dumped has relocations against it the user might
13638      be expecting these relocations to have been applied.  Check for this
13639      case and issue a warning message in order to avoid confusion.
13640      FIXME: Maybe we ought to have an option that dumps a section with
13641      relocs applied ?  */
13642   for (relsec = filedata->section_headers;
13643        relsec < filedata->section_headers + filedata->file_header.e_shnum;
13644        ++relsec)
13645     {
13646       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13647           || relsec->sh_info >= filedata->file_header.e_shnum
13648           || filedata->section_headers + relsec->sh_info != section
13649           || relsec->sh_size == 0
13650           || relsec->sh_link >= filedata->file_header.e_shnum)
13651         continue;
13652
13653       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13654       break;
13655     }
13656
13657   data = start;
13658   end  = start + num_bytes;
13659   some_strings_shown = FALSE;
13660
13661   while (data < end)
13662     {
13663       while (!ISPRINT (* data))
13664         if (++ data >= end)
13665           break;
13666
13667       if (data < end)
13668         {
13669           size_t maxlen = end - data;
13670
13671 #ifndef __MSVCRT__
13672           /* PR 11128: Use two separate invocations in order to work
13673              around bugs in the Solaris 8 implementation of printf.  */
13674           printf ("  [%6tx]  ", data - start);
13675 #else
13676           printf ("  [%6Ix]  ", (size_t) (data - start));
13677 #endif
13678           if (maxlen > 0)
13679             {
13680               print_symbol ((int) maxlen, (const char *) data);
13681               putchar ('\n');
13682               data += strnlen ((const char *) data, maxlen);
13683             }
13684           else
13685             {
13686               printf (_("<corrupt>\n"));
13687               data = end;
13688             }
13689           some_strings_shown = TRUE;
13690         }
13691     }
13692
13693   if (! some_strings_shown)
13694     printf (_("  No strings found in this section."));
13695
13696   free (real_start);
13697
13698   putchar ('\n');
13699   return TRUE;
13700 }
13701
13702 static bfd_boolean
13703 dump_section_as_bytes (Elf_Internal_Shdr *  section,
13704                        Filedata *           filedata,
13705                        bfd_boolean          relocate)
13706 {
13707   Elf_Internal_Shdr * relsec;
13708   bfd_size_type       bytes;
13709   bfd_size_type       section_size;
13710   bfd_vma             addr;
13711   unsigned char *     data;
13712   unsigned char *     real_start;
13713   unsigned char *     start;
13714
13715   real_start = start = (unsigned char *) get_section_contents (section, filedata);
13716   if (start == NULL)
13717     /* PR 21820: Do not fail if the section was empty.  */
13718     return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13719
13720   section_size = section->sh_size;
13721
13722   printf (_("\nHex dump of section '%s':\n"), printable_section_name (filedata, section));
13723
13724   if (decompress_dumps)
13725     {
13726       dwarf_size_type new_size = section_size;
13727       dwarf_size_type uncompressed_size = 0;
13728
13729       if ((section->sh_flags & SHF_COMPRESSED) != 0)
13730         {
13731           Elf_Internal_Chdr chdr;
13732           unsigned int compression_header_size
13733             = get_compression_header (& chdr, start, section_size);
13734
13735           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13736             {
13737               warn (_("section '%s' has unsupported compress type: %d\n"),
13738                     printable_section_name (filedata, section), chdr.ch_type);
13739               return FALSE;
13740             }
13741           uncompressed_size = chdr.ch_size;
13742           start += compression_header_size;
13743           new_size -= compression_header_size;
13744         }
13745       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13746         {
13747           /* Read the zlib header.  In this case, it should be "ZLIB"
13748              followed by the uncompressed section size, 8 bytes in
13749              big-endian order.  */
13750           uncompressed_size = start[4]; uncompressed_size <<= 8;
13751           uncompressed_size += start[5]; uncompressed_size <<= 8;
13752           uncompressed_size += start[6]; uncompressed_size <<= 8;
13753           uncompressed_size += start[7]; uncompressed_size <<= 8;
13754           uncompressed_size += start[8]; uncompressed_size <<= 8;
13755           uncompressed_size += start[9]; uncompressed_size <<= 8;
13756           uncompressed_size += start[10]; uncompressed_size <<= 8;
13757           uncompressed_size += start[11];
13758           start += 12;
13759           new_size -= 12;
13760         }
13761
13762       if (uncompressed_size)
13763         {
13764           if (uncompress_section_contents (& start, uncompressed_size,
13765                                            & new_size))
13766             {
13767               section_size = new_size;
13768             }
13769           else
13770             {
13771               error (_("Unable to decompress section %s\n"),
13772                      printable_section_name (filedata, section));
13773               /* FIXME: Print the section anyway ?  */
13774               return FALSE;
13775             }
13776         }
13777       else
13778         start = real_start;
13779     }
13780
13781   if (relocate)
13782     {
13783       if (! apply_relocations (filedata, section, start, section_size, NULL, NULL))
13784         return FALSE;
13785     }
13786   else
13787     {
13788       /* If the section being dumped has relocations against it the user might
13789          be expecting these relocations to have been applied.  Check for this
13790          case and issue a warning message in order to avoid confusion.
13791          FIXME: Maybe we ought to have an option that dumps a section with
13792          relocs applied ?  */
13793       for (relsec = filedata->section_headers;
13794            relsec < filedata->section_headers + filedata->file_header.e_shnum;
13795            ++relsec)
13796         {
13797           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13798               || relsec->sh_info >= filedata->file_header.e_shnum
13799               || filedata->section_headers + relsec->sh_info != section
13800               || relsec->sh_size == 0
13801               || relsec->sh_link >= filedata->file_header.e_shnum)
13802             continue;
13803
13804           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13805           break;
13806         }
13807     }
13808
13809   addr = section->sh_addr;
13810   bytes = section_size;
13811   data = start;
13812
13813   while (bytes)
13814     {
13815       int j;
13816       int k;
13817       int lbytes;
13818
13819       lbytes = (bytes > 16 ? 16 : bytes);
13820
13821       printf ("  0x%8.8lx ", (unsigned long) addr);
13822
13823       for (j = 0; j < 16; j++)
13824         {
13825           if (j < lbytes)
13826             printf ("%2.2x", data[j]);
13827           else
13828             printf ("  ");
13829
13830           if ((j & 3) == 3)
13831             printf (" ");
13832         }
13833
13834       for (j = 0; j < lbytes; j++)
13835         {
13836           k = data[j];
13837           if (k >= ' ' && k < 0x7f)
13838             printf ("%c", k);
13839           else
13840             printf (".");
13841         }
13842
13843       putchar ('\n');
13844
13845       data  += lbytes;
13846       addr  += lbytes;
13847       bytes -= lbytes;
13848     }
13849
13850   free (real_start);
13851
13852   putchar ('\n');
13853   return TRUE;
13854 }
13855
13856 static ctf_sect_t *
13857 shdr_to_ctf_sect (ctf_sect_t *buf, Elf_Internal_Shdr *shdr, Filedata *filedata)
13858 {
13859   buf->cts_name = SECTION_NAME (shdr);
13860   buf->cts_size = shdr->sh_size;
13861   buf->cts_entsize = shdr->sh_entsize;
13862
13863   return buf;
13864 }
13865
13866 /* Formatting callback function passed to ctf_dump.  Returns either the pointer
13867    it is passed, or a pointer to newly-allocated storage, in which case
13868    dump_ctf() will free it when it no longer needs it.  */
13869
13870 static char *dump_ctf_indent_lines (ctf_sect_names_t sect ATTRIBUTE_UNUSED,
13871                                     char *s, void *arg)
13872 {
13873   const char *blanks = arg;
13874   char *new_s;
13875
13876   if (asprintf (&new_s, "%s%s", blanks, s) < 0)
13877     return s;
13878   return new_s;
13879 }
13880
13881 static bfd_boolean
13882 dump_section_as_ctf (Elf_Internal_Shdr * section, Filedata * filedata)
13883 {
13884   Elf_Internal_Shdr *  parent_sec = NULL;
13885   Elf_Internal_Shdr *  symtab_sec = NULL;
13886   Elf_Internal_Shdr *  strtab_sec = NULL;
13887   void *               data = NULL;
13888   void *               symdata = NULL;
13889   void *               strdata = NULL;
13890   void *               parentdata = NULL;
13891   ctf_sect_t           ctfsect, symsect, strsect, parentsect;
13892   ctf_sect_t *         symsectp = NULL;
13893   ctf_sect_t *         strsectp = NULL;
13894   ctf_file_t *         ctf = NULL;
13895   ctf_file_t *         parent = NULL;
13896
13897   const char *things[] = {"Labels", "Data objects", "Function objects",
13898                           "Variables", "Types", "Strings", ""};
13899   const char **thing;
13900   int err;
13901   bfd_boolean ret = FALSE;
13902   size_t i;
13903
13904   shdr_to_ctf_sect (&ctfsect, section, filedata);
13905   data = get_section_contents (section, filedata);
13906   ctfsect.cts_data = data;
13907
13908   if (dump_ctf_symtab_name)
13909     {
13910       if ((symtab_sec = find_section (filedata, dump_ctf_symtab_name)) == NULL)
13911         {
13912           error (_("No symbol section named %s\n"), dump_ctf_symtab_name);
13913           goto fail;
13914         }
13915       if ((symdata = (void *) get_data (NULL, filedata,
13916                                         symtab_sec->sh_offset, 1,
13917                                         symtab_sec->sh_size,
13918                                         _("symbols"))) == NULL)
13919         goto fail;
13920       symsectp = shdr_to_ctf_sect (&symsect, symtab_sec, filedata);
13921       symsect.cts_data = symdata;
13922     }
13923   if (dump_ctf_strtab_name)
13924     {
13925       if ((strtab_sec = find_section (filedata, dump_ctf_strtab_name)) == NULL)
13926         {
13927           error (_("No string table section named %s\n"),
13928                  dump_ctf_strtab_name);
13929           goto fail;
13930         }
13931       if ((strdata = (void *) get_data (NULL, filedata,
13932                                         strtab_sec->sh_offset, 1,
13933                                         strtab_sec->sh_size,
13934                                         _("strings"))) == NULL)
13935         goto fail;
13936       strsectp = shdr_to_ctf_sect (&strsect, strtab_sec, filedata);
13937       strsect.cts_data = strdata;
13938     }
13939   if (dump_ctf_parent_name)
13940     {
13941       if ((parent_sec = find_section (filedata, dump_ctf_parent_name)) == NULL)
13942         {
13943           error (_("No CTF parent section named %s\n"), dump_ctf_parent_name);
13944           goto fail;
13945         }
13946       if ((parentdata = (void *) get_data (NULL, filedata,
13947                                            parent_sec->sh_offset, 1,
13948                                            parent_sec->sh_size,
13949                                            _("CTF parent"))) == NULL)
13950         goto fail;
13951       shdr_to_ctf_sect (&parentsect, parent_sec, filedata);
13952       parentsect.cts_data = parentdata;
13953     }
13954
13955   /* Load the CTF file and dump it.  */
13956
13957   if ((ctf = ctf_bufopen (&ctfsect, symsectp, strsectp, &err)) == NULL)
13958     {
13959       error (_("CTF open failure: %s\n"), ctf_errmsg (err));
13960       goto fail;
13961     }
13962
13963   if (parentdata)
13964     {
13965       if ((parent = ctf_bufopen (&parentsect, symsectp, strsectp, &err)) == NULL)
13966         {
13967           error (_("CTF open failure: %s\n"), ctf_errmsg (err));
13968           goto fail;
13969         }
13970
13971       ctf_import (ctf, parent);
13972     }
13973
13974   ret = TRUE;
13975
13976   printf (_("\nDump of CTF section '%s':\n"),
13977           printable_section_name (filedata, section));
13978
13979   for (i = 1, thing = things; *thing[0]; thing++, i++)
13980     {
13981       ctf_dump_state_t *s = NULL;
13982       char *item;
13983
13984       printf ("\n  %s:\n", *thing);
13985       while ((item = ctf_dump (ctf, &s, i, dump_ctf_indent_lines,
13986                                (void *) "    ")) != NULL)
13987         {
13988           printf ("%s\n", item);
13989           free (item);
13990         }
13991
13992       if (ctf_errno (ctf))
13993         {
13994           error (_("Iteration failed: %s, %s\n"), *thing,
13995                    ctf_errmsg (ctf_errno (ctf)));
13996           ret = FALSE;
13997         }
13998     }
13999
14000  fail:
14001   ctf_file_close (ctf);
14002   ctf_file_close (parent);
14003   free (parentdata);
14004   free (data);
14005   free (symdata);
14006   free (strdata);
14007   return ret;
14008 }
14009
14010 static bfd_boolean
14011 load_specific_debug_section (enum dwarf_section_display_enum  debug,
14012                              const Elf_Internal_Shdr *        sec,
14013                              void *                           data)
14014 {
14015   struct dwarf_section * section = &debug_displays [debug].section;
14016   char buf [64];
14017   Filedata * filedata = (Filedata *) data;
14018
14019   if (section->start != NULL)
14020     {
14021       /* If it is already loaded, do nothing.  */
14022       if (streq (section->filename, filedata->file_name))
14023         return TRUE;
14024       free (section->start);
14025     }
14026
14027   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
14028   section->address = sec->sh_addr;
14029   section->user_data = NULL;
14030   section->filename = filedata->file_name;
14031   section->start = (unsigned char *) get_data (NULL, filedata,
14032                                                sec->sh_offset, 1,
14033                                                sec->sh_size, buf);
14034   if (section->start == NULL)
14035     section->size = 0;
14036   else
14037     {
14038       unsigned char *start = section->start;
14039       dwarf_size_type size = sec->sh_size;
14040       dwarf_size_type uncompressed_size = 0;
14041
14042       if ((sec->sh_flags & SHF_COMPRESSED) != 0)
14043         {
14044           Elf_Internal_Chdr chdr;
14045           unsigned int compression_header_size;
14046
14047           if (size < (is_32bit_elf
14048                       ? sizeof (Elf32_External_Chdr)
14049                       : sizeof (Elf64_External_Chdr)))
14050             {
14051               warn (_("compressed section %s is too small to contain a compression header"),
14052                     section->name);
14053               return FALSE;
14054             }
14055
14056           compression_header_size = get_compression_header (&chdr, start, size);
14057
14058           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
14059             {
14060               warn (_("section '%s' has unsupported compress type: %d\n"),
14061                     section->name, chdr.ch_type);
14062               return FALSE;
14063             }
14064           uncompressed_size = chdr.ch_size;
14065           start += compression_header_size;
14066           size -= compression_header_size;
14067         }
14068       else if (size > 12 && streq ((char *) start, "ZLIB"))
14069         {
14070           /* Read the zlib header.  In this case, it should be "ZLIB"
14071              followed by the uncompressed section size, 8 bytes in
14072              big-endian order.  */
14073           uncompressed_size = start[4]; uncompressed_size <<= 8;
14074           uncompressed_size += start[5]; uncompressed_size <<= 8;
14075           uncompressed_size += start[6]; uncompressed_size <<= 8;
14076           uncompressed_size += start[7]; uncompressed_size <<= 8;
14077           uncompressed_size += start[8]; uncompressed_size <<= 8;
14078           uncompressed_size += start[9]; uncompressed_size <<= 8;
14079           uncompressed_size += start[10]; uncompressed_size <<= 8;
14080           uncompressed_size += start[11];
14081           start += 12;
14082           size -= 12;
14083         }
14084
14085       if (uncompressed_size)
14086         {
14087           if (uncompress_section_contents (&start, uncompressed_size,
14088                                            &size))
14089             {
14090               /* Free the compressed buffer, update the section buffer
14091                  and the section size if uncompress is successful.  */
14092               free (section->start);
14093               section->start = start;
14094             }
14095           else
14096             {
14097               error (_("Unable to decompress section %s\n"),
14098                      printable_section_name (filedata, sec));
14099               return FALSE;
14100             }
14101         }
14102
14103       section->size = size;
14104     }
14105
14106   if (section->start == NULL)
14107     return FALSE;
14108
14109   if (debug_displays [debug].relocate)
14110     {
14111       if (! apply_relocations (filedata, sec, section->start, section->size,
14112                                & section->reloc_info, & section->num_relocs))
14113         return FALSE;
14114     }
14115   else
14116     {
14117       section->reloc_info = NULL;
14118       section->num_relocs = 0;
14119     }
14120
14121   return TRUE;
14122 }
14123
14124 /* If this is not NULL, load_debug_section will only look for sections
14125    within the list of sections given here.  */
14126 static unsigned int * section_subset = NULL;
14127
14128 bfd_boolean
14129 load_debug_section (enum dwarf_section_display_enum debug, void * data)
14130 {
14131   struct dwarf_section * section = &debug_displays [debug].section;
14132   Elf_Internal_Shdr * sec;
14133   Filedata * filedata = (Filedata *) data;
14134
14135   /* Without section headers we cannot find any sections.  */
14136   if (filedata->section_headers == NULL)
14137     return FALSE;
14138
14139   if (filedata->string_table == NULL
14140       && filedata->file_header.e_shstrndx != SHN_UNDEF
14141       && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
14142     {
14143       Elf_Internal_Shdr * strs;
14144
14145       /* Read in the string table, so that we have section names to scan.  */
14146       strs = filedata->section_headers + filedata->file_header.e_shstrndx;
14147
14148       if (strs != NULL && strs->sh_size != 0)
14149         {
14150           filedata->string_table
14151             = (char *) get_data (NULL, filedata, strs->sh_offset,
14152                                  1, strs->sh_size, _("string table"));
14153
14154           filedata->string_table_length
14155             = filedata->string_table != NULL ? strs->sh_size : 0;
14156         }
14157     }
14158
14159   /* Locate the debug section.  */
14160   sec = find_section_in_set (filedata, section->uncompressed_name, section_subset);
14161   if (sec != NULL)
14162     section->name = section->uncompressed_name;
14163   else
14164     {
14165       sec = find_section_in_set (filedata, section->compressed_name, section_subset);
14166       if (sec != NULL)
14167         section->name = section->compressed_name;
14168     }
14169   if (sec == NULL)
14170     return FALSE;
14171
14172   /* If we're loading from a subset of sections, and we've loaded
14173      a section matching this name before, it's likely that it's a
14174      different one.  */
14175   if (section_subset != NULL)
14176     free_debug_section (debug);
14177
14178   return load_specific_debug_section (debug, sec, data);
14179 }
14180
14181 void
14182 free_debug_section (enum dwarf_section_display_enum debug)
14183 {
14184   struct dwarf_section * section = &debug_displays [debug].section;
14185
14186   if (section->start == NULL)
14187     return;
14188
14189   free ((char *) section->start);
14190   section->start = NULL;
14191   section->address = 0;
14192   section->size = 0;
14193 }
14194
14195 static bfd_boolean
14196 display_debug_section (int shndx, Elf_Internal_Shdr * section, Filedata * filedata)
14197 {
14198   char * name = SECTION_NAME (section);
14199   const char * print_name = printable_section_name (filedata, section);
14200   bfd_size_type length;
14201   bfd_boolean result = TRUE;
14202   int i;
14203
14204   length = section->sh_size;
14205   if (length == 0)
14206     {
14207       printf (_("\nSection '%s' has no debugging data.\n"), print_name);
14208       return TRUE;
14209     }
14210   if (section->sh_type == SHT_NOBITS)
14211     {
14212       /* There is no point in dumping the contents of a debugging section
14213          which has the NOBITS type - the bits in the file will be random.
14214          This can happen when a file containing a .eh_frame section is
14215          stripped with the --only-keep-debug command line option.  */
14216       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
14217               print_name);
14218       return FALSE;
14219     }
14220
14221   if (const_strneq (name, ".gnu.linkonce.wi."))
14222     name = ".debug_info";
14223
14224   /* See if we know how to display the contents of this section.  */
14225   for (i = 0; i < max; i++)
14226     {
14227       enum dwarf_section_display_enum  id = (enum dwarf_section_display_enum) i;
14228       struct dwarf_section_display *   display = debug_displays + i;
14229       struct dwarf_section *           sec = & display->section;
14230
14231       if (streq (sec->uncompressed_name, name)
14232           || (id == line && const_strneq (name, ".debug_line."))
14233           || streq (sec->compressed_name, name))
14234         {
14235           bfd_boolean secondary = (section != find_section (filedata, name));
14236
14237           if (secondary)
14238             free_debug_section (id);
14239
14240           if (i == line && const_strneq (name, ".debug_line."))
14241             sec->name = name;
14242           else if (streq (sec->uncompressed_name, name))
14243             sec->name = sec->uncompressed_name;
14244           else
14245             sec->name = sec->compressed_name;
14246
14247           if (load_specific_debug_section (id, section, filedata))
14248             {
14249               /* If this debug section is part of a CU/TU set in a .dwp file,
14250                  restrict load_debug_section to the sections in that set.  */
14251               section_subset = find_cu_tu_set (filedata, shndx);
14252
14253               result &= display->display (sec, filedata);
14254
14255               section_subset = NULL;
14256
14257               if (secondary || (id != info && id != abbrev))
14258                 free_debug_section (id);
14259             }
14260           break;
14261         }
14262     }
14263
14264   if (i == max)
14265     {
14266       printf (_("Unrecognized debug section: %s\n"), print_name);
14267       result = FALSE;
14268     }
14269
14270   return result;
14271 }
14272
14273 /* Set DUMP_SECTS for all sections where dumps were requested
14274    based on section name.  */
14275
14276 static void
14277 initialise_dumps_byname (Filedata * filedata)
14278 {
14279   struct dump_list_entry * cur;
14280
14281   for (cur = dump_sects_byname; cur; cur = cur->next)
14282     {
14283       unsigned int i;
14284       bfd_boolean any = FALSE;
14285
14286       for (i = 0; i < filedata->file_header.e_shnum; i++)
14287         if (streq (SECTION_NAME (filedata->section_headers + i), cur->name))
14288           {
14289             request_dump_bynumber (filedata, i, cur->type);
14290             any = TRUE;
14291           }
14292
14293       if (!any)
14294         warn (_("Section '%s' was not dumped because it does not exist!\n"),
14295               cur->name);
14296     }
14297 }
14298
14299 static bfd_boolean
14300 process_section_contents (Filedata * filedata)
14301 {
14302   Elf_Internal_Shdr * section;
14303   unsigned int i;
14304   bfd_boolean res = TRUE;
14305
14306   if (! do_dump)
14307     return TRUE;
14308
14309   initialise_dumps_byname (filedata);
14310
14311   for (i = 0, section = filedata->section_headers;
14312        i < filedata->file_header.e_shnum && i < filedata->num_dump_sects;
14313        i++, section++)
14314     {
14315       dump_type dump = filedata->dump_sects[i];
14316
14317 #ifdef SUPPORT_DISASSEMBLY
14318       if (dump & DISASS_DUMP)
14319         {
14320           if (! disassemble_section (section, filedata))
14321             res = FALSE;
14322         }
14323 #endif
14324       if (dump & HEX_DUMP)
14325         {
14326           if (! dump_section_as_bytes (section, filedata, FALSE))
14327             res = FALSE;
14328         }
14329
14330       if (dump & RELOC_DUMP)
14331         {
14332           if (! dump_section_as_bytes (section, filedata, TRUE))
14333             res = FALSE;
14334         }
14335
14336       if (dump & STRING_DUMP)
14337         {
14338           if (! dump_section_as_strings (section, filedata))
14339             res = FALSE;
14340         }
14341
14342       if (dump & DEBUG_DUMP)
14343         {
14344           if (! display_debug_section (i, section, filedata))
14345             res = FALSE;
14346         }
14347
14348       if (dump & CTF_DUMP)
14349         {
14350           if (! dump_section_as_ctf (section, filedata))
14351             res = FALSE;
14352         }
14353     }
14354
14355   /* Check to see if the user requested a
14356      dump of a section that does not exist.  */
14357   while (i < filedata->num_dump_sects)
14358     {
14359       if (filedata->dump_sects[i])
14360         {
14361           warn (_("Section %d was not dumped because it does not exist!\n"), i);
14362           res = FALSE;
14363         }
14364       i++;
14365     }
14366
14367   return res;
14368 }
14369
14370 static void
14371 process_mips_fpe_exception (int mask)
14372 {
14373   if (mask)
14374     {
14375       bfd_boolean first = TRUE;
14376
14377       if (mask & OEX_FPU_INEX)
14378         fputs ("INEX", stdout), first = FALSE;
14379       if (mask & OEX_FPU_UFLO)
14380         printf ("%sUFLO", first ? "" : "|"), first = FALSE;
14381       if (mask & OEX_FPU_OFLO)
14382         printf ("%sOFLO", first ? "" : "|"), first = FALSE;
14383       if (mask & OEX_FPU_DIV0)
14384         printf ("%sDIV0", first ? "" : "|"), first = FALSE;
14385       if (mask & OEX_FPU_INVAL)
14386         printf ("%sINVAL", first ? "" : "|");
14387     }
14388   else
14389     fputs ("0", stdout);
14390 }
14391
14392 /* Display's the value of TAG at location P.  If TAG is
14393    greater than 0 it is assumed to be an unknown tag, and
14394    a message is printed to this effect.  Otherwise it is
14395    assumed that a message has already been printed.
14396
14397    If the bottom bit of TAG is set it assumed to have a
14398    string value, otherwise it is assumed to have an integer
14399    value.
14400
14401    Returns an updated P pointing to the first unread byte
14402    beyond the end of TAG's value.
14403
14404    Reads at or beyond END will not be made.  */
14405
14406 static unsigned char *
14407 display_tag_value (signed int tag,
14408                    unsigned char * p,
14409                    const unsigned char * const end)
14410 {
14411   unsigned long val;
14412
14413   if (tag > 0)
14414     printf ("  Tag_unknown_%d: ", tag);
14415
14416   if (p >= end)
14417     {
14418       warn (_("<corrupt tag>\n"));
14419     }
14420   else if (tag & 1)
14421     {
14422       /* PR 17531 file: 027-19978-0.004.  */
14423       size_t maxlen = (end - p) - 1;
14424
14425       putchar ('"');
14426       if (maxlen > 0)
14427         {
14428           print_symbol ((int) maxlen, (const char *) p);
14429           p += strnlen ((char *) p, maxlen) + 1;
14430         }
14431       else
14432         {
14433           printf (_("<corrupt string tag>"));
14434           p = (unsigned char *) end;
14435         }
14436       printf ("\"\n");
14437     }
14438   else
14439     {
14440       unsigned int len;
14441
14442       val = read_uleb128 (p, &len, end);
14443       p += len;
14444       printf ("%ld (0x%lx)\n", val, val);
14445     }
14446
14447   assert (p <= end);
14448   return p;
14449 }
14450
14451 /* ARC ABI attributes section.  */
14452
14453 static unsigned char *
14454 display_arc_attribute (unsigned char * p,
14455                        const unsigned char * const end)
14456 {
14457   unsigned int tag;
14458   unsigned int len;
14459   unsigned int val;
14460
14461   tag = read_uleb128 (p, &len, end);
14462   p += len;
14463
14464   switch (tag)
14465     {
14466     case Tag_ARC_PCS_config:
14467       val = read_uleb128 (p, &len, end);
14468       p += len;
14469       printf ("  Tag_ARC_PCS_config: ");
14470       switch (val)
14471         {
14472         case 0:
14473           printf (_("Absent/Non standard\n"));
14474           break;
14475         case 1:
14476           printf (_("Bare metal/mwdt\n"));
14477           break;
14478         case 2:
14479           printf (_("Bare metal/newlib\n"));
14480           break;
14481         case 3:
14482           printf (_("Linux/uclibc\n"));
14483           break;
14484         case 4:
14485           printf (_("Linux/glibc\n"));
14486           break;
14487         default:
14488           printf (_("Unknown\n"));
14489           break;
14490         }
14491       break;
14492
14493     case Tag_ARC_CPU_base:
14494       val = read_uleb128 (p, &len, end);
14495       p += len;
14496       printf ("  Tag_ARC_CPU_base: ");
14497       switch (val)
14498         {
14499         default:
14500         case TAG_CPU_NONE:
14501           printf (_("Absent\n"));
14502           break;
14503         case TAG_CPU_ARC6xx:
14504           printf ("ARC6xx\n");
14505           break;
14506         case TAG_CPU_ARC7xx:
14507           printf ("ARC7xx\n");
14508           break;
14509         case TAG_CPU_ARCEM:
14510           printf ("ARCEM\n");
14511           break;
14512         case TAG_CPU_ARCHS:
14513           printf ("ARCHS\n");
14514           break;
14515         }
14516       break;
14517
14518     case Tag_ARC_CPU_variation:
14519       val = read_uleb128 (p, &len, end);
14520       p += len;
14521       printf ("  Tag_ARC_CPU_variation: ");
14522       switch (val)
14523         {
14524         default:
14525           if (val > 0 && val < 16)
14526               printf ("Core%d\n", val);
14527           else
14528               printf ("Unknown\n");
14529           break;
14530
14531         case 0:
14532           printf (_("Absent\n"));
14533           break;
14534         }
14535       break;
14536
14537     case Tag_ARC_CPU_name:
14538       printf ("  Tag_ARC_CPU_name: ");
14539       p = display_tag_value (-1, p, end);
14540       break;
14541
14542     case Tag_ARC_ABI_rf16:
14543       val = read_uleb128 (p, &len, end);
14544       p += len;
14545       printf ("  Tag_ARC_ABI_rf16: %s\n", val ? _("yes") : _("no"));
14546       break;
14547
14548     case Tag_ARC_ABI_osver:
14549       val = read_uleb128 (p, &len, end);
14550       p += len;
14551       printf ("  Tag_ARC_ABI_osver: v%d\n", val);
14552       break;
14553
14554     case Tag_ARC_ABI_pic:
14555     case Tag_ARC_ABI_sda:
14556       val = read_uleb128 (p, &len, end);
14557       p += len;
14558       printf (tag == Tag_ARC_ABI_sda ? "  Tag_ARC_ABI_sda: "
14559               : "  Tag_ARC_ABI_pic: ");
14560       switch (val)
14561         {
14562         case 0:
14563           printf (_("Absent\n"));
14564           break;
14565         case 1:
14566           printf ("MWDT\n");
14567           break;
14568         case 2:
14569           printf ("GNU\n");
14570           break;
14571         default:
14572           printf (_("Unknown\n"));
14573           break;
14574         }
14575       break;
14576
14577     case Tag_ARC_ABI_tls:
14578       val = read_uleb128 (p, &len, end);
14579       p += len;
14580       printf ("  Tag_ARC_ABI_tls: %s\n", val ? "r25": "none");
14581       break;
14582
14583     case Tag_ARC_ABI_enumsize:
14584       val = read_uleb128 (p, &len, end);
14585       p += len;
14586       printf ("  Tag_ARC_ABI_enumsize: %s\n", val ? _("default") :
14587               _("smallest"));
14588       break;
14589
14590     case Tag_ARC_ABI_exceptions:
14591       val = read_uleb128 (p, &len, end);
14592       p += len;
14593       printf ("  Tag_ARC_ABI_exceptions: %s\n", val ? _("OPTFP")
14594               : _("default"));
14595       break;
14596
14597     case Tag_ARC_ABI_double_size:
14598       val = read_uleb128 (p, &len, end);
14599       p += len;
14600       printf ("  Tag_ARC_ABI_double_size: %d\n", val);
14601       break;
14602
14603     case Tag_ARC_ISA_config:
14604       printf ("  Tag_ARC_ISA_config: ");
14605       p = display_tag_value (-1, p, end);
14606       break;
14607
14608     case Tag_ARC_ISA_apex:
14609       printf ("  Tag_ARC_ISA_apex: ");
14610       p = display_tag_value (-1, p, end);
14611       break;
14612
14613     case Tag_ARC_ISA_mpy_option:
14614       val = read_uleb128 (p, &len, end);
14615       p += len;
14616       printf ("  Tag_ARC_ISA_mpy_option: %d\n", val);
14617       break;
14618
14619     case Tag_ARC_ATR_version:
14620       val = read_uleb128 (p, &len, end);
14621       p += len;
14622       printf ("  Tag_ARC_ATR_version: %d\n", val);
14623       break;
14624
14625     default:
14626       return display_tag_value (tag & 1, p, end);
14627     }
14628
14629   return p;
14630 }
14631
14632 /* ARM EABI attributes section.  */
14633 typedef struct
14634 {
14635   unsigned int tag;
14636   const char * name;
14637   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
14638   unsigned int type;
14639   const char ** table;
14640 } arm_attr_public_tag;
14641
14642 static const char * arm_attr_tag_CPU_arch[] =
14643   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
14644    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "v8-R", "v8-M.baseline",
14645    "v8-M.mainline", "", "", "", "v8.1-M.mainline"};
14646 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
14647 static const char * arm_attr_tag_THUMB_ISA_use[] =
14648   {"No", "Thumb-1", "Thumb-2", "Yes"};
14649 static const char * arm_attr_tag_FP_arch[] =
14650   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
14651    "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
14652 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
14653 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
14654   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
14655    "NEON for ARMv8.1"};
14656 static const char * arm_attr_tag_PCS_config[] =
14657   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
14658    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
14659 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
14660   {"V6", "SB", "TLS", "Unused"};
14661 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
14662   {"Absolute", "PC-relative", "SB-relative", "None"};
14663 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
14664   {"Absolute", "PC-relative", "None"};
14665 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
14666   {"None", "direct", "GOT-indirect"};
14667 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
14668   {"None", "??? 1", "2", "??? 3", "4"};
14669 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
14670 static const char * arm_attr_tag_ABI_FP_denormal[] =
14671   {"Unused", "Needed", "Sign only"};
14672 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
14673 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
14674 static const char * arm_attr_tag_ABI_FP_number_model[] =
14675   {"Unused", "Finite", "RTABI", "IEEE 754"};
14676 static const char * arm_attr_tag_ABI_enum_size[] =
14677   {"Unused", "small", "int", "forced to int"};
14678 static const char * arm_attr_tag_ABI_HardFP_use[] =
14679   {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
14680 static const char * arm_attr_tag_ABI_VFP_args[] =
14681   {"AAPCS", "VFP registers", "custom", "compatible"};
14682 static const char * arm_attr_tag_ABI_WMMX_args[] =
14683   {"AAPCS", "WMMX registers", "custom"};
14684 static const char * arm_attr_tag_ABI_optimization_goals[] =
14685   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14686     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
14687 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
14688   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14689     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
14690 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
14691 static const char * arm_attr_tag_FP_HP_extension[] =
14692   {"Not Allowed", "Allowed"};
14693 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
14694   {"None", "IEEE 754", "Alternative Format"};
14695 static const char * arm_attr_tag_DSP_extension[] =
14696   {"Follow architecture", "Allowed"};
14697 static const char * arm_attr_tag_MPextension_use[] =
14698   {"Not Allowed", "Allowed"};
14699 static const char * arm_attr_tag_DIV_use[] =
14700   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
14701     "Allowed in v7-A with integer division extension"};
14702 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
14703 static const char * arm_attr_tag_Virtualization_use[] =
14704   {"Not Allowed", "TrustZone", "Virtualization Extensions",
14705     "TrustZone and Virtualization Extensions"};
14706 static const char * arm_attr_tag_MPextension_use_legacy[] =
14707   {"Not Allowed", "Allowed"};
14708
14709 static const char * arm_attr_tag_MVE_arch[] =
14710   {"No MVE", "MVE Integer only", "MVE Integer and FP"};
14711
14712 #define LOOKUP(id, name) \
14713   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
14714 static arm_attr_public_tag arm_attr_public_tags[] =
14715 {
14716   {4, "CPU_raw_name", 1, NULL},
14717   {5, "CPU_name", 1, NULL},
14718   LOOKUP(6, CPU_arch),
14719   {7, "CPU_arch_profile", 0, NULL},
14720   LOOKUP(8, ARM_ISA_use),
14721   LOOKUP(9, THUMB_ISA_use),
14722   LOOKUP(10, FP_arch),
14723   LOOKUP(11, WMMX_arch),
14724   LOOKUP(12, Advanced_SIMD_arch),
14725   LOOKUP(13, PCS_config),
14726   LOOKUP(14, ABI_PCS_R9_use),
14727   LOOKUP(15, ABI_PCS_RW_data),
14728   LOOKUP(16, ABI_PCS_RO_data),
14729   LOOKUP(17, ABI_PCS_GOT_use),
14730   LOOKUP(18, ABI_PCS_wchar_t),
14731   LOOKUP(19, ABI_FP_rounding),
14732   LOOKUP(20, ABI_FP_denormal),
14733   LOOKUP(21, ABI_FP_exceptions),
14734   LOOKUP(22, ABI_FP_user_exceptions),
14735   LOOKUP(23, ABI_FP_number_model),
14736   {24, "ABI_align_needed", 0, NULL},
14737   {25, "ABI_align_preserved", 0, NULL},
14738   LOOKUP(26, ABI_enum_size),
14739   LOOKUP(27, ABI_HardFP_use),
14740   LOOKUP(28, ABI_VFP_args),
14741   LOOKUP(29, ABI_WMMX_args),
14742   LOOKUP(30, ABI_optimization_goals),
14743   LOOKUP(31, ABI_FP_optimization_goals),
14744   {32, "compatibility", 0, NULL},
14745   LOOKUP(34, CPU_unaligned_access),
14746   LOOKUP(36, FP_HP_extension),
14747   LOOKUP(38, ABI_FP_16bit_format),
14748   LOOKUP(42, MPextension_use),
14749   LOOKUP(44, DIV_use),
14750   LOOKUP(46, DSP_extension),
14751   LOOKUP(48, MVE_arch),
14752   {64, "nodefaults", 0, NULL},
14753   {65, "also_compatible_with", 0, NULL},
14754   LOOKUP(66, T2EE_use),
14755   {67, "conformance", 1, NULL},
14756   LOOKUP(68, Virtualization_use),
14757   LOOKUP(70, MPextension_use_legacy)
14758 };
14759 #undef LOOKUP
14760
14761 static unsigned char *
14762 display_arm_attribute (unsigned char * p,
14763                        const unsigned char * const end)
14764 {
14765   unsigned int tag;
14766   unsigned int len;
14767   unsigned int val;
14768   arm_attr_public_tag * attr;
14769   unsigned i;
14770   unsigned int type;
14771
14772   tag = read_uleb128 (p, &len, end);
14773   p += len;
14774   attr = NULL;
14775   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
14776     {
14777       if (arm_attr_public_tags[i].tag == tag)
14778         {
14779           attr = &arm_attr_public_tags[i];
14780           break;
14781         }
14782     }
14783
14784   if (attr)
14785     {
14786       printf ("  Tag_%s: ", attr->name);
14787       switch (attr->type)
14788         {
14789         case 0:
14790           switch (tag)
14791             {
14792             case 7: /* Tag_CPU_arch_profile.  */
14793               val = read_uleb128 (p, &len, end);
14794               p += len;
14795               switch (val)
14796                 {
14797                 case 0: printf (_("None\n")); break;
14798                 case 'A': printf (_("Application\n")); break;
14799                 case 'R': printf (_("Realtime\n")); break;
14800                 case 'M': printf (_("Microcontroller\n")); break;
14801                 case 'S': printf (_("Application or Realtime\n")); break;
14802                 default: printf ("??? (%d)\n", val); break;
14803                 }
14804               break;
14805
14806             case 24: /* Tag_align_needed.  */
14807               val = read_uleb128 (p, &len, end);
14808               p += len;
14809               switch (val)
14810                 {
14811                 case 0: printf (_("None\n")); break;
14812                 case 1: printf (_("8-byte\n")); break;
14813                 case 2: printf (_("4-byte\n")); break;
14814                 case 3: printf ("??? 3\n"); break;
14815                 default:
14816                   if (val <= 12)
14817                     printf (_("8-byte and up to %d-byte extended\n"),
14818                             1 << val);
14819                   else
14820                     printf ("??? (%d)\n", val);
14821                   break;
14822                 }
14823               break;
14824
14825             case 25: /* Tag_align_preserved.  */
14826               val = read_uleb128 (p, &len, end);
14827               p += len;
14828               switch (val)
14829                 {
14830                 case 0: printf (_("None\n")); break;
14831                 case 1: printf (_("8-byte, except leaf SP\n")); break;
14832                 case 2: printf (_("8-byte\n")); break;
14833                 case 3: printf ("??? 3\n"); break;
14834                 default:
14835                   if (val <= 12)
14836                     printf (_("8-byte and up to %d-byte extended\n"),
14837                             1 << val);
14838                   else
14839                     printf ("??? (%d)\n", val);
14840                   break;
14841                 }
14842               break;
14843
14844             case 32: /* Tag_compatibility.  */
14845               {
14846                 val = read_uleb128 (p, &len, end);
14847                 p += len;
14848                 printf (_("flag = %d, vendor = "), val);
14849                 if (p < end - 1)
14850                   {
14851                     size_t maxlen = (end - p) - 1;
14852
14853                     print_symbol ((int) maxlen, (const char *) p);
14854                     p += strnlen ((char *) p, maxlen) + 1;
14855                   }
14856                 else
14857                   {
14858                     printf (_("<corrupt>"));
14859                     p = (unsigned char *) end;
14860                   }
14861                 putchar ('\n');
14862               }
14863               break;
14864
14865             case 64: /* Tag_nodefaults.  */
14866               /* PR 17531: file: 001-505008-0.01.  */
14867               if (p < end)
14868                 p++;
14869               printf (_("True\n"));
14870               break;
14871
14872             case 65: /* Tag_also_compatible_with.  */
14873               val = read_uleb128 (p, &len, end);
14874               p += len;
14875               if (val == 6 /* Tag_CPU_arch.  */)
14876                 {
14877                   val = read_uleb128 (p, &len, end);
14878                   p += len;
14879                   if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
14880                     printf ("??? (%d)\n", val);
14881                   else
14882                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
14883                 }
14884               else
14885                 printf ("???\n");
14886               while (p < end && *(p++) != '\0' /* NUL terminator.  */)
14887                 ;
14888               break;
14889
14890             default:
14891               printf (_("<unknown: %d>\n"), tag);
14892               break;
14893             }
14894           return p;
14895
14896         case 1:
14897           return display_tag_value (-1, p, end);
14898         case 2:
14899           return display_tag_value (0, p, end);
14900
14901         default:
14902           assert (attr->type & 0x80);
14903           val = read_uleb128 (p, &len, end);
14904           p += len;
14905           type = attr->type & 0x7f;
14906           if (val >= type)
14907             printf ("??? (%d)\n", val);
14908           else
14909             printf ("%s\n", attr->table[val]);
14910           return p;
14911         }
14912     }
14913
14914   return display_tag_value (tag, p, end);
14915 }
14916
14917 static unsigned char *
14918 display_gnu_attribute (unsigned char * p,
14919                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const),
14920                        const unsigned char * const end)
14921 {
14922   int tag;
14923   unsigned int len;
14924   unsigned int val;
14925
14926   tag = read_uleb128 (p, &len, end);
14927   p += len;
14928
14929   /* Tag_compatibility is the only generic GNU attribute defined at
14930      present.  */
14931   if (tag == 32)
14932     {
14933       val = read_uleb128 (p, &len, end);
14934       p += len;
14935
14936       printf (_("flag = %d, vendor = "), val);
14937       if (p == end)
14938         {
14939           printf (_("<corrupt>\n"));
14940           warn (_("corrupt vendor attribute\n"));
14941         }
14942       else
14943         {
14944           if (p < end - 1)
14945             {
14946               size_t maxlen = (end - p) - 1;
14947
14948               print_symbol ((int) maxlen, (const char *) p);
14949               p += strnlen ((char *) p, maxlen) + 1;
14950             }
14951           else
14952             {
14953               printf (_("<corrupt>"));
14954               p = (unsigned char *) end;
14955             }
14956           putchar ('\n');
14957         }
14958       return p;
14959     }
14960
14961   if ((tag & 2) == 0 && display_proc_gnu_attribute)
14962     return display_proc_gnu_attribute (p, tag, end);
14963
14964   return display_tag_value (tag, p, end);
14965 }
14966
14967 static unsigned char *
14968 display_power_gnu_attribute (unsigned char * p,
14969                              unsigned int tag,
14970                              const unsigned char * const end)
14971 {
14972   unsigned int len;
14973   unsigned int val;
14974
14975   if (tag == Tag_GNU_Power_ABI_FP)
14976     {
14977       val = read_uleb128 (p, &len, end);
14978       p += len;
14979       printf ("  Tag_GNU_Power_ABI_FP: ");
14980       if (len == 0)
14981         {
14982           printf (_("<corrupt>\n"));
14983           return p;
14984         }
14985
14986       if (val > 15)
14987         printf ("(%#x), ", val);
14988
14989       switch (val & 3)
14990         {
14991         case 0:
14992           printf (_("unspecified hard/soft float, "));
14993           break;
14994         case 1:
14995           printf (_("hard float, "));
14996           break;
14997         case 2:
14998           printf (_("soft float, "));
14999           break;
15000         case 3:
15001           printf (_("single-precision hard float, "));
15002           break;
15003         }
15004
15005       switch (val & 0xC)
15006         {
15007         case 0:
15008           printf (_("unspecified long double\n"));
15009           break;
15010         case 4:
15011           printf (_("128-bit IBM long double\n"));
15012           break;
15013         case 8:
15014           printf (_("64-bit long double\n"));
15015           break;
15016         case 12:
15017           printf (_("128-bit IEEE long double\n"));
15018           break;
15019         }
15020       return p;
15021     }
15022
15023   if (tag == Tag_GNU_Power_ABI_Vector)
15024     {
15025       val = read_uleb128 (p, &len, end);
15026       p += len;
15027       printf ("  Tag_GNU_Power_ABI_Vector: ");
15028       if (len == 0)
15029         {
15030           printf (_("<corrupt>\n"));
15031           return p;
15032         }
15033
15034       if (val > 3)
15035         printf ("(%#x), ", val);
15036
15037       switch (val & 3)
15038         {
15039         case 0:
15040           printf (_("unspecified\n"));
15041           break;
15042         case 1:
15043           printf (_("generic\n"));
15044           break;
15045         case 2:
15046           printf ("AltiVec\n");
15047           break;
15048         case 3:
15049           printf ("SPE\n");
15050           break;
15051         }
15052       return p;
15053     }
15054
15055   if (tag == Tag_GNU_Power_ABI_Struct_Return)
15056     {
15057       val = read_uleb128 (p, &len, end);
15058       p += len;
15059       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
15060       if (len == 0)
15061         {
15062           printf (_("<corrupt>\n"));
15063           return p;
15064         }
15065
15066       if (val > 2)
15067         printf ("(%#x), ", val);
15068
15069       switch (val & 3)
15070         {
15071         case 0:
15072           printf (_("unspecified\n"));
15073           break;
15074         case 1:
15075           printf ("r3/r4\n");
15076           break;
15077         case 2:
15078           printf (_("memory\n"));
15079           break;
15080         case 3:
15081           printf ("???\n");
15082           break;
15083         }
15084       return p;
15085     }
15086
15087   return display_tag_value (tag & 1, p, end);
15088 }
15089
15090 static unsigned char *
15091 display_s390_gnu_attribute (unsigned char * p,
15092                             unsigned int tag,
15093                             const unsigned char * const end)
15094 {
15095   unsigned int len;
15096   int val;
15097
15098   if (tag == Tag_GNU_S390_ABI_Vector)
15099     {
15100       val = read_uleb128 (p, &len, end);
15101       p += len;
15102       printf ("  Tag_GNU_S390_ABI_Vector: ");
15103
15104       switch (val)
15105         {
15106         case 0:
15107           printf (_("any\n"));
15108           break;
15109         case 1:
15110           printf (_("software\n"));
15111           break;
15112         case 2:
15113           printf (_("hardware\n"));
15114           break;
15115         default:
15116           printf ("??? (%d)\n", val);
15117           break;
15118         }
15119       return p;
15120    }
15121
15122   return display_tag_value (tag & 1, p, end);
15123 }
15124
15125 static void
15126 display_sparc_hwcaps (unsigned int mask)
15127 {
15128   if (mask)
15129     {
15130       bfd_boolean first = TRUE;
15131
15132       if (mask & ELF_SPARC_HWCAP_MUL32)
15133         fputs ("mul32", stdout), first = FALSE;
15134       if (mask & ELF_SPARC_HWCAP_DIV32)
15135         printf ("%sdiv32", first ? "" : "|"), first = FALSE;
15136       if (mask & ELF_SPARC_HWCAP_FSMULD)
15137         printf ("%sfsmuld", first ? "" : "|"), first = FALSE;
15138       if (mask & ELF_SPARC_HWCAP_V8PLUS)
15139         printf ("%sv8plus", first ? "" : "|"), first = FALSE;
15140       if (mask & ELF_SPARC_HWCAP_POPC)
15141         printf ("%spopc", first ? "" : "|"), first = FALSE;
15142       if (mask & ELF_SPARC_HWCAP_VIS)
15143         printf ("%svis", first ? "" : "|"), first = FALSE;
15144       if (mask & ELF_SPARC_HWCAP_VIS2)
15145         printf ("%svis2", first ? "" : "|"), first = FALSE;
15146       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
15147         printf ("%sASIBlkInit", first ? "" : "|"), first = FALSE;
15148       if (mask & ELF_SPARC_HWCAP_FMAF)
15149         printf ("%sfmaf", first ? "" : "|"), first = FALSE;
15150       if (mask & ELF_SPARC_HWCAP_VIS3)
15151         printf ("%svis3", first ? "" : "|"), first = FALSE;
15152       if (mask & ELF_SPARC_HWCAP_HPC)
15153         printf ("%shpc", first ? "" : "|"), first = FALSE;
15154       if (mask & ELF_SPARC_HWCAP_RANDOM)
15155         printf ("%srandom", first ? "" : "|"), first = FALSE;
15156       if (mask & ELF_SPARC_HWCAP_TRANS)
15157         printf ("%strans", first ? "" : "|"), first = FALSE;
15158       if (mask & ELF_SPARC_HWCAP_FJFMAU)
15159         printf ("%sfjfmau", first ? "" : "|"), first = FALSE;
15160       if (mask & ELF_SPARC_HWCAP_IMA)
15161         printf ("%sima", first ? "" : "|"), first = FALSE;
15162       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
15163         printf ("%scspare", first ? "" : "|"), first = FALSE;
15164     }
15165   else
15166     fputc ('0', stdout);
15167   fputc ('\n', stdout);
15168 }
15169
15170 static void
15171 display_sparc_hwcaps2 (unsigned int mask)
15172 {
15173   if (mask)
15174     {
15175       bfd_boolean first = TRUE;
15176
15177       if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
15178         fputs ("fjathplus", stdout), first = FALSE;
15179       if (mask & ELF_SPARC_HWCAP2_VIS3B)
15180         printf ("%svis3b", first ? "" : "|"), first = FALSE;
15181       if (mask & ELF_SPARC_HWCAP2_ADP)
15182         printf ("%sadp", first ? "" : "|"), first = FALSE;
15183       if (mask & ELF_SPARC_HWCAP2_SPARC5)
15184         printf ("%ssparc5", first ? "" : "|"), first = FALSE;
15185       if (mask & ELF_SPARC_HWCAP2_MWAIT)
15186         printf ("%smwait", first ? "" : "|"), first = FALSE;
15187       if (mask & ELF_SPARC_HWCAP2_XMPMUL)
15188         printf ("%sxmpmul", first ? "" : "|"), first = FALSE;
15189       if (mask & ELF_SPARC_HWCAP2_XMONT)
15190         printf ("%sxmont2", first ? "" : "|"), first = FALSE;
15191       if (mask & ELF_SPARC_HWCAP2_NSEC)
15192         printf ("%snsec", first ? "" : "|"), first = FALSE;
15193       if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
15194         printf ("%sfjathhpc", first ? "" : "|"), first = FALSE;
15195       if (mask & ELF_SPARC_HWCAP2_FJDES)
15196         printf ("%sfjdes", first ? "" : "|"), first = FALSE;
15197       if (mask & ELF_SPARC_HWCAP2_FJAES)
15198         printf ("%sfjaes", first ? "" : "|"), first = FALSE;
15199     }
15200   else
15201     fputc ('0', stdout);
15202   fputc ('\n', stdout);
15203 }
15204
15205 static unsigned char *
15206 display_sparc_gnu_attribute (unsigned char * p,
15207                              unsigned int tag,
15208                              const unsigned char * const end)
15209 {
15210   unsigned int len;
15211   int val;
15212
15213   if (tag == Tag_GNU_Sparc_HWCAPS)
15214     {
15215       val = read_uleb128 (p, &len, end);
15216       p += len;
15217       printf ("  Tag_GNU_Sparc_HWCAPS: ");
15218       display_sparc_hwcaps (val);
15219       return p;
15220     }
15221   if (tag == Tag_GNU_Sparc_HWCAPS2)
15222     {
15223       val = read_uleb128 (p, &len, end);
15224       p += len;
15225       printf ("  Tag_GNU_Sparc_HWCAPS2: ");
15226       display_sparc_hwcaps2 (val);
15227       return p;
15228     }
15229
15230   return display_tag_value (tag, p, end);
15231 }
15232
15233 static void
15234 print_mips_fp_abi_value (unsigned int val)
15235 {
15236   switch (val)
15237     {
15238     case Val_GNU_MIPS_ABI_FP_ANY:
15239       printf (_("Hard or soft float\n"));
15240       break;
15241     case Val_GNU_MIPS_ABI_FP_DOUBLE:
15242       printf (_("Hard float (double precision)\n"));
15243       break;
15244     case Val_GNU_MIPS_ABI_FP_SINGLE:
15245       printf (_("Hard float (single precision)\n"));
15246       break;
15247     case Val_GNU_MIPS_ABI_FP_SOFT:
15248       printf (_("Soft float\n"));
15249       break;
15250     case Val_GNU_MIPS_ABI_FP_OLD_64:
15251       printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
15252       break;
15253     case Val_GNU_MIPS_ABI_FP_XX:
15254       printf (_("Hard float (32-bit CPU, Any FPU)\n"));
15255       break;
15256     case Val_GNU_MIPS_ABI_FP_64:
15257       printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
15258       break;
15259     case Val_GNU_MIPS_ABI_FP_64A:
15260       printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
15261       break;
15262     case Val_GNU_MIPS_ABI_FP_NAN2008:
15263       printf (_("NaN 2008 compatibility\n"));
15264       break;
15265     default:
15266       printf ("??? (%d)\n", val);
15267       break;
15268     }
15269 }
15270
15271 static unsigned char *
15272 display_mips_gnu_attribute (unsigned char * p,
15273                             unsigned int tag,
15274                             const unsigned char * const end)
15275 {
15276   if (tag == Tag_GNU_MIPS_ABI_FP)
15277     {
15278       unsigned int len;
15279       unsigned int val;
15280
15281       val = read_uleb128 (p, &len, end);
15282       p += len;
15283       printf ("  Tag_GNU_MIPS_ABI_FP: ");
15284
15285       print_mips_fp_abi_value (val);
15286
15287       return p;
15288    }
15289
15290   if (tag == Tag_GNU_MIPS_ABI_MSA)
15291     {
15292       unsigned int len;
15293       unsigned int val;
15294
15295       val = read_uleb128 (p, &len, end);
15296       p += len;
15297       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
15298
15299       switch (val)
15300         {
15301         case Val_GNU_MIPS_ABI_MSA_ANY:
15302           printf (_("Any MSA or not\n"));
15303           break;
15304         case Val_GNU_MIPS_ABI_MSA_128:
15305           printf (_("128-bit MSA\n"));
15306           break;
15307         default:
15308           printf ("??? (%d)\n", val);
15309           break;
15310         }
15311       return p;
15312     }
15313
15314   return display_tag_value (tag & 1, p, end);
15315 }
15316
15317 static unsigned char *
15318 display_tic6x_attribute (unsigned char * p,
15319                          const unsigned char * const end)
15320 {
15321   unsigned int tag;
15322   unsigned int len;
15323   int val;
15324
15325   tag = read_uleb128 (p, &len, end);
15326   p += len;
15327
15328   switch (tag)
15329     {
15330     case Tag_ISA:
15331       val = read_uleb128 (p, &len, end);
15332       p += len;
15333       printf ("  Tag_ISA: ");
15334
15335       switch (val)
15336         {
15337         case C6XABI_Tag_ISA_none:
15338           printf (_("None\n"));
15339           break;
15340         case C6XABI_Tag_ISA_C62X:
15341           printf ("C62x\n");
15342           break;
15343         case C6XABI_Tag_ISA_C67X:
15344           printf ("C67x\n");
15345           break;
15346         case C6XABI_Tag_ISA_C67XP:
15347           printf ("C67x+\n");
15348           break;
15349         case C6XABI_Tag_ISA_C64X:
15350           printf ("C64x\n");
15351           break;
15352         case C6XABI_Tag_ISA_C64XP:
15353           printf ("C64x+\n");
15354           break;
15355         case C6XABI_Tag_ISA_C674X:
15356           printf ("C674x\n");
15357           break;
15358         default:
15359           printf ("??? (%d)\n", val);
15360           break;
15361         }
15362       return p;
15363
15364     case Tag_ABI_wchar_t:
15365       val = read_uleb128 (p, &len, end);
15366       p += len;
15367       printf ("  Tag_ABI_wchar_t: ");
15368       switch (val)
15369         {
15370         case 0:
15371           printf (_("Not used\n"));
15372           break;
15373         case 1:
15374           printf (_("2 bytes\n"));
15375           break;
15376         case 2:
15377           printf (_("4 bytes\n"));
15378           break;
15379         default:
15380           printf ("??? (%d)\n", val);
15381           break;
15382         }
15383       return p;
15384
15385     case Tag_ABI_stack_align_needed:
15386       val = read_uleb128 (p, &len, end);
15387       p += len;
15388       printf ("  Tag_ABI_stack_align_needed: ");
15389       switch (val)
15390         {
15391         case 0:
15392           printf (_("8-byte\n"));
15393           break;
15394         case 1:
15395           printf (_("16-byte\n"));
15396           break;
15397         default:
15398           printf ("??? (%d)\n", val);
15399           break;
15400         }
15401       return p;
15402
15403     case Tag_ABI_stack_align_preserved:
15404       val = read_uleb128 (p, &len, end);
15405       p += len;
15406       printf ("  Tag_ABI_stack_align_preserved: ");
15407       switch (val)
15408         {
15409         case 0:
15410           printf (_("8-byte\n"));
15411           break;
15412         case 1:
15413           printf (_("16-byte\n"));
15414           break;
15415         default:
15416           printf ("??? (%d)\n", val);
15417           break;
15418         }
15419       return p;
15420
15421     case Tag_ABI_DSBT:
15422       val = read_uleb128 (p, &len, end);
15423       p += len;
15424       printf ("  Tag_ABI_DSBT: ");
15425       switch (val)
15426         {
15427         case 0:
15428           printf (_("DSBT addressing not used\n"));
15429           break;
15430         case 1:
15431           printf (_("DSBT addressing used\n"));
15432           break;
15433         default:
15434           printf ("??? (%d)\n", val);
15435           break;
15436         }
15437       return p;
15438
15439     case Tag_ABI_PID:
15440       val = read_uleb128 (p, &len, end);
15441       p += len;
15442       printf ("  Tag_ABI_PID: ");
15443       switch (val)
15444         {
15445         case 0:
15446           printf (_("Data addressing position-dependent\n"));
15447           break;
15448         case 1:
15449           printf (_("Data addressing position-independent, GOT near DP\n"));
15450           break;
15451         case 2:
15452           printf (_("Data addressing position-independent, GOT far from DP\n"));
15453           break;
15454         default:
15455           printf ("??? (%d)\n", val);
15456           break;
15457         }
15458       return p;
15459
15460     case Tag_ABI_PIC:
15461       val = read_uleb128 (p, &len, end);
15462       p += len;
15463       printf ("  Tag_ABI_PIC: ");
15464       switch (val)
15465         {
15466         case 0:
15467           printf (_("Code addressing position-dependent\n"));
15468           break;
15469         case 1:
15470           printf (_("Code addressing position-independent\n"));
15471           break;
15472         default:
15473           printf ("??? (%d)\n", val);
15474           break;
15475         }
15476       return p;
15477
15478     case Tag_ABI_array_object_alignment:
15479       val = read_uleb128 (p, &len, end);
15480       p += len;
15481       printf ("  Tag_ABI_array_object_alignment: ");
15482       switch (val)
15483         {
15484         case 0:
15485           printf (_("8-byte\n"));
15486           break;
15487         case 1:
15488           printf (_("4-byte\n"));
15489           break;
15490         case 2:
15491           printf (_("16-byte\n"));
15492           break;
15493         default:
15494           printf ("??? (%d)\n", val);
15495           break;
15496         }
15497       return p;
15498
15499     case Tag_ABI_array_object_align_expected:
15500       val = read_uleb128 (p, &len, end);
15501       p += len;
15502       printf ("  Tag_ABI_array_object_align_expected: ");
15503       switch (val)
15504         {
15505         case 0:
15506           printf (_("8-byte\n"));
15507           break;
15508         case 1:
15509           printf (_("4-byte\n"));
15510           break;
15511         case 2:
15512           printf (_("16-byte\n"));
15513           break;
15514         default:
15515           printf ("??? (%d)\n", val);
15516           break;
15517         }
15518       return p;
15519
15520     case Tag_ABI_compatibility:
15521       {
15522         val = read_uleb128 (p, &len, end);
15523         p += len;
15524         printf ("  Tag_ABI_compatibility: ");
15525         printf (_("flag = %d, vendor = "), val);
15526         if (p < end - 1)
15527           {
15528             size_t maxlen = (end - p) - 1;
15529
15530             print_symbol ((int) maxlen, (const char *) p);
15531             p += strnlen ((char *) p, maxlen) + 1;
15532           }
15533         else
15534           {
15535             printf (_("<corrupt>"));
15536             p = (unsigned char *) end;
15537           }
15538         putchar ('\n');
15539         return p;
15540       }
15541
15542     case Tag_ABI_conformance:
15543       {
15544         printf ("  Tag_ABI_conformance: \"");
15545         if (p < end - 1)
15546           {
15547             size_t maxlen = (end - p) - 1;
15548
15549             print_symbol ((int) maxlen, (const char *) p);
15550             p += strnlen ((char *) p, maxlen) + 1;
15551           }
15552         else
15553           {
15554             printf (_("<corrupt>"));
15555             p = (unsigned char *) end;
15556           }
15557         printf ("\"\n");
15558         return p;
15559       }
15560     }
15561
15562   return display_tag_value (tag, p, end);
15563 }
15564
15565 static void
15566 display_raw_attribute (unsigned char * p, unsigned char const * const end)
15567 {
15568   unsigned long addr = 0;
15569   size_t bytes = end - p;
15570
15571   assert (end >= p);
15572   while (bytes)
15573     {
15574       int j;
15575       int k;
15576       int lbytes = (bytes > 16 ? 16 : bytes);
15577
15578       printf ("  0x%8.8lx ", addr);
15579
15580       for (j = 0; j < 16; j++)
15581         {
15582           if (j < lbytes)
15583             printf ("%2.2x", p[j]);
15584           else
15585             printf ("  ");
15586
15587           if ((j & 3) == 3)
15588             printf (" ");
15589         }
15590
15591       for (j = 0; j < lbytes; j++)
15592         {
15593           k = p[j];
15594           if (k >= ' ' && k < 0x7f)
15595             printf ("%c", k);
15596           else
15597             printf (".");
15598         }
15599
15600       putchar ('\n');
15601
15602       p  += lbytes;
15603       bytes -= lbytes;
15604       addr += lbytes;
15605     }
15606
15607   putchar ('\n');
15608 }
15609
15610 static unsigned char *
15611 display_msp430x_attribute (unsigned char * p,
15612                            const unsigned char * const end)
15613 {
15614   unsigned int len;
15615   unsigned int val;
15616   unsigned int tag;
15617
15618   tag = read_uleb128 (p, & len, end);
15619   p += len;
15620
15621   switch (tag)
15622     {
15623     case OFBA_MSPABI_Tag_ISA:
15624       val = read_uleb128 (p, &len, end);
15625       p += len;
15626       printf ("  Tag_ISA: ");
15627       switch (val)
15628         {
15629         case 0: printf (_("None\n")); break;
15630         case 1: printf (_("MSP430\n")); break;
15631         case 2: printf (_("MSP430X\n")); break;
15632         default: printf ("??? (%d)\n", val); break;
15633         }
15634       break;
15635
15636     case OFBA_MSPABI_Tag_Code_Model:
15637       val = read_uleb128 (p, &len, end);
15638       p += len;
15639       printf ("  Tag_Code_Model: ");
15640       switch (val)
15641         {
15642         case 0: printf (_("None\n")); break;
15643         case 1: printf (_("Small\n")); break;
15644         case 2: printf (_("Large\n")); break;
15645         default: printf ("??? (%d)\n", val); break;
15646         }
15647       break;
15648
15649     case OFBA_MSPABI_Tag_Data_Model:
15650       val = read_uleb128 (p, &len, end);
15651       p += len;
15652       printf ("  Tag_Data_Model: ");
15653       switch (val)
15654         {
15655         case 0: printf (_("None\n")); break;
15656         case 1: printf (_("Small\n")); break;
15657         case 2: printf (_("Large\n")); break;
15658         case 3: printf (_("Restricted Large\n")); break;
15659         default: printf ("??? (%d)\n", val); break;
15660         }
15661       break;
15662
15663     default:
15664       printf (_("  <unknown tag %d>: "), tag);
15665
15666       if (tag & 1)
15667         {
15668           putchar ('"');
15669           if (p < end - 1)
15670             {
15671               size_t maxlen = (end - p) - 1;
15672
15673               print_symbol ((int) maxlen, (const char *) p);
15674               p += strnlen ((char *) p, maxlen) + 1;
15675             }
15676           else
15677             {
15678               printf (_("<corrupt>"));
15679               p = (unsigned char *) end;
15680             }
15681           printf ("\"\n");
15682         }
15683       else
15684         {
15685           val = read_uleb128 (p, &len, end);
15686           p += len;
15687           printf ("%d (0x%x)\n", val, val);
15688         }
15689       break;
15690    }
15691
15692   assert (p <= end);
15693   return p;
15694 }
15695
15696 struct riscv_attr_tag_t {
15697   const char *name;
15698   int tag;
15699 };
15700
15701 static struct riscv_attr_tag_t riscv_attr_tag[] =
15702 {
15703 #define T(tag) {"Tag_RISCV_" #tag, Tag_RISCV_##tag}
15704   T(arch),
15705   T(priv_spec),
15706   T(priv_spec_minor),
15707   T(priv_spec_revision),
15708   T(unaligned_access),
15709   T(stack_align),
15710 #undef T
15711 };
15712
15713 static unsigned char *
15714 display_riscv_attribute (unsigned char *p,
15715                          const unsigned char * const end)
15716 {
15717   unsigned int len;
15718   int val;
15719   int tag;
15720   struct riscv_attr_tag_t *attr = NULL;
15721   unsigned i;
15722
15723   tag = read_uleb128 (p, &len, end);
15724   p += len;
15725
15726   /* Find the name of attribute. */
15727   for (i = 0; i < ARRAY_SIZE (riscv_attr_tag); i++)
15728     {
15729       if (riscv_attr_tag[i].tag == tag)
15730         {
15731           attr = &riscv_attr_tag[i];
15732           break;
15733         }
15734     }
15735
15736   if (attr)
15737     printf ("  %s: ", attr->name);
15738   else
15739     return display_tag_value (tag, p, end);
15740
15741   switch (tag)
15742     {
15743     case Tag_RISCV_priv_spec:
15744     case Tag_RISCV_priv_spec_minor:
15745     case Tag_RISCV_priv_spec_revision:
15746       val = read_uleb128 (p, &len, end);
15747       p += len;
15748       printf (_("%d\n"), val);
15749       break;
15750     case Tag_RISCV_unaligned_access:
15751       val = read_uleb128 (p, &len, end);
15752       p += len;
15753       switch (val)
15754         {
15755         case 0:
15756           printf (_("No unaligned access\n"));
15757           break;
15758         case 1:
15759           printf (_("Unaligned access\n"));
15760           break;
15761         }
15762       break;
15763     case Tag_RISCV_stack_align:
15764       val = read_uleb128 (p, &len, end);
15765       p += len;
15766       printf (_("%d-bytes\n"), val);
15767       break;
15768     case Tag_RISCV_arch:
15769       p = display_tag_value (-1, p, end);
15770       break;
15771     default:
15772       return display_tag_value (tag, p, end);
15773     }
15774
15775   return p;
15776 }
15777
15778 static bfd_boolean
15779 process_attributes (Filedata * filedata,
15780                     const char * public_name,
15781                     unsigned int proc_type,
15782                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
15783                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const))
15784 {
15785   Elf_Internal_Shdr * sect;
15786   unsigned i;
15787   bfd_boolean res = TRUE;
15788
15789   /* Find the section header so that we get the size.  */
15790   for (i = 0, sect = filedata->section_headers;
15791        i < filedata->file_header.e_shnum;
15792        i++, sect++)
15793     {
15794       unsigned char * contents;
15795       unsigned char * p;
15796
15797       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
15798         continue;
15799
15800       contents = (unsigned char *) get_data (NULL, filedata, sect->sh_offset, 1,
15801                                              sect->sh_size, _("attributes"));
15802       if (contents == NULL)
15803         {
15804           res = FALSE;
15805           continue;
15806         }
15807
15808       p = contents;
15809       /* The first character is the version of the attributes.
15810          Currently only version 1, (aka 'A') is recognised here.  */
15811       if (*p != 'A')
15812         {
15813           printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p);
15814           res = FALSE;
15815         }
15816       else
15817         {
15818           bfd_vma section_len;
15819
15820           section_len = sect->sh_size - 1;
15821           p++;
15822
15823           while (section_len > 0)
15824             {
15825               bfd_vma attr_len;
15826               unsigned int namelen;
15827               bfd_boolean public_section;
15828               bfd_boolean gnu_section;
15829
15830               if (section_len <= 4)
15831                 {
15832                   error (_("Tag section ends prematurely\n"));
15833                   res = FALSE;
15834                   break;
15835                 }
15836               attr_len = byte_get (p, 4);
15837               p += 4;
15838
15839               if (attr_len > section_len)
15840                 {
15841                   error (_("Bad attribute length (%u > %u)\n"),
15842                           (unsigned) attr_len, (unsigned) section_len);
15843                   attr_len = section_len;
15844                   res = FALSE;
15845                 }
15846               /* PR 17531: file: 001-101425-0.004  */
15847               else if (attr_len < 5)
15848                 {
15849                   error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
15850                   res = FALSE;
15851                   break;
15852                 }
15853
15854               section_len -= attr_len;
15855               attr_len -= 4;
15856
15857               namelen = strnlen ((char *) p, attr_len) + 1;
15858               if (namelen == 0 || namelen >= attr_len)
15859                 {
15860                   error (_("Corrupt attribute section name\n"));
15861                   res = FALSE;
15862                   break;
15863                 }
15864
15865               printf (_("Attribute Section: "));
15866               print_symbol (INT_MAX, (const char *) p);
15867               putchar ('\n');
15868
15869               if (public_name && streq ((char *) p, public_name))
15870                 public_section = TRUE;
15871               else
15872                 public_section = FALSE;
15873
15874               if (streq ((char *) p, "gnu"))
15875                 gnu_section = TRUE;
15876               else
15877                 gnu_section = FALSE;
15878
15879               p += namelen;
15880               attr_len -= namelen;
15881
15882               while (attr_len > 0 && p < contents + sect->sh_size)
15883                 {
15884                   int tag;
15885                   int val;
15886                   bfd_vma size;
15887                   unsigned char * end;
15888
15889                   /* PR binutils/17531: Safe handling of corrupt files.  */
15890                   if (attr_len < 6)
15891                     {
15892                       error (_("Unused bytes at end of section\n"));
15893                       res = FALSE;
15894                       section_len = 0;
15895                       break;
15896                     }
15897
15898                   tag = *(p++);
15899                   size = byte_get (p, 4);
15900                   if (size > attr_len)
15901                     {
15902                       error (_("Bad subsection length (%u > %u)\n"),
15903                               (unsigned) size, (unsigned) attr_len);
15904                       res = FALSE;
15905                       size = attr_len;
15906                     }
15907                   /* PR binutils/17531: Safe handling of corrupt files.  */
15908                   if (size < 6)
15909                     {
15910                       error (_("Bad subsection length (%u < 6)\n"),
15911                               (unsigned) size);
15912                       res = FALSE;
15913                       section_len = 0;
15914                       break;
15915                     }
15916
15917                   attr_len -= size;
15918                   end = p + size - 1;
15919                   assert (end <= contents + sect->sh_size);
15920                   p += 4;
15921
15922                   switch (tag)
15923                     {
15924                     case 1:
15925                       printf (_("File Attributes\n"));
15926                       break;
15927                     case 2:
15928                       printf (_("Section Attributes:"));
15929                       goto do_numlist;
15930                     case 3:
15931                       printf (_("Symbol Attributes:"));
15932                       /* Fall through.  */
15933                     do_numlist:
15934                       for (;;)
15935                         {
15936                           unsigned int j;
15937
15938                           val = read_uleb128 (p, &j, end);
15939                           p += j;
15940                           if (val == 0)
15941                             break;
15942                           printf (" %d", val);
15943                         }
15944                       printf ("\n");
15945                       break;
15946                     default:
15947                       printf (_("Unknown tag: %d\n"), tag);
15948                       public_section = FALSE;
15949                       break;
15950                     }
15951
15952                   if (public_section && display_pub_attribute != NULL)
15953                     {
15954                       while (p < end)
15955                         p = display_pub_attribute (p, end);
15956                       assert (p == end);
15957                     }
15958                   else if (gnu_section && display_proc_gnu_attribute != NULL)
15959                     {
15960                       while (p < end)
15961                         p = display_gnu_attribute (p,
15962                                                    display_proc_gnu_attribute,
15963                                                    end);
15964                       assert (p == end);
15965                     }
15966                   else if (p < end)
15967                     {
15968                       printf (_("  Unknown attribute:\n"));
15969                       display_raw_attribute (p, end);
15970                       p = end;
15971                     }
15972                   else
15973                     attr_len = 0;
15974                 }
15975             }
15976         }
15977
15978       free (contents);
15979     }
15980
15981   return res;
15982 }
15983
15984 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
15985    Print the Address, Access and Initial fields of an entry at VMA ADDR
15986    and return the VMA of the next entry, or -1 if there was a problem.
15987    Does not read from DATA_END or beyond.  */
15988
15989 static bfd_vma
15990 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
15991                       unsigned char * data_end)
15992 {
15993   printf ("  ");
15994   print_vma (addr, LONG_HEX);
15995   printf (" ");
15996   if (addr < pltgot + 0xfff0)
15997     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
15998   else
15999     printf ("%10s", "");
16000   printf (" ");
16001   if (data == NULL)
16002     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
16003   else
16004     {
16005       bfd_vma entry;
16006       unsigned char * from = data + addr - pltgot;
16007
16008       if (from + (is_32bit_elf ? 4 : 8) > data_end)
16009         {
16010           warn (_("MIPS GOT entry extends beyond the end of available data\n"));
16011           printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
16012           return (bfd_vma) -1;
16013         }
16014       else
16015         {
16016           entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
16017           print_vma (entry, LONG_HEX);
16018         }
16019     }
16020   return addr + (is_32bit_elf ? 4 : 8);
16021 }
16022
16023 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
16024    PLTGOT.  Print the Address and Initial fields of an entry at VMA
16025    ADDR and return the VMA of the next entry.  */
16026
16027 static bfd_vma
16028 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
16029 {
16030   printf ("  ");
16031   print_vma (addr, LONG_HEX);
16032   printf (" ");
16033   if (data == NULL)
16034     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
16035   else
16036     {
16037       bfd_vma entry;
16038
16039       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
16040       print_vma (entry, LONG_HEX);
16041     }
16042   return addr + (is_32bit_elf ? 4 : 8);
16043 }
16044
16045 static void
16046 print_mips_ases (unsigned int mask)
16047 {
16048   if (mask & AFL_ASE_DSP)
16049     fputs ("\n\tDSP ASE", stdout);
16050   if (mask & AFL_ASE_DSPR2)
16051     fputs ("\n\tDSP R2 ASE", stdout);
16052   if (mask & AFL_ASE_DSPR3)
16053     fputs ("\n\tDSP R3 ASE", stdout);
16054   if (mask & AFL_ASE_EVA)
16055     fputs ("\n\tEnhanced VA Scheme", stdout);
16056   if (mask & AFL_ASE_MCU)
16057     fputs ("\n\tMCU (MicroController) ASE", stdout);
16058   if (mask & AFL_ASE_MDMX)
16059     fputs ("\n\tMDMX ASE", stdout);
16060   if (mask & AFL_ASE_MIPS3D)
16061     fputs ("\n\tMIPS-3D ASE", stdout);
16062   if (mask & AFL_ASE_MT)
16063     fputs ("\n\tMT ASE", stdout);
16064   if (mask & AFL_ASE_SMARTMIPS)
16065     fputs ("\n\tSmartMIPS ASE", stdout);
16066   if (mask & AFL_ASE_VIRT)
16067     fputs ("\n\tVZ ASE", stdout);
16068   if (mask & AFL_ASE_MSA)
16069     fputs ("\n\tMSA ASE", stdout);
16070   if (mask & AFL_ASE_MIPS16)
16071     fputs ("\n\tMIPS16 ASE", stdout);
16072   if (mask & AFL_ASE_MICROMIPS)
16073     fputs ("\n\tMICROMIPS ASE", stdout);
16074   if (mask & AFL_ASE_XPA)
16075     fputs ("\n\tXPA ASE", stdout);
16076   if (mask & AFL_ASE_MIPS16E2)
16077     fputs ("\n\tMIPS16e2 ASE", stdout);
16078   if (mask & AFL_ASE_CRC)
16079     fputs ("\n\tCRC ASE", stdout);
16080   if (mask & AFL_ASE_GINV)
16081     fputs ("\n\tGINV ASE", stdout);
16082   if (mask & AFL_ASE_LOONGSON_MMI)
16083     fputs ("\n\tLoongson MMI ASE", stdout);
16084   if (mask & AFL_ASE_LOONGSON_CAM)
16085     fputs ("\n\tLoongson CAM ASE", stdout);
16086   if (mask & AFL_ASE_LOONGSON_EXT)
16087     fputs ("\n\tLoongson EXT ASE", stdout);
16088   if (mask & AFL_ASE_LOONGSON_EXT2)
16089     fputs ("\n\tLoongson EXT2 ASE", stdout);
16090   if (mask == 0)
16091     fprintf (stdout, "\n\t%s", _("None"));
16092   else if ((mask & ~AFL_ASE_MASK) != 0)
16093     fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
16094 }
16095
16096 static void
16097 print_mips_isa_ext (unsigned int isa_ext)
16098 {
16099   switch (isa_ext)
16100     {
16101     case 0:
16102       fputs (_("None"), stdout);
16103       break;
16104     case AFL_EXT_XLR:
16105       fputs ("RMI XLR", stdout);
16106       break;
16107     case AFL_EXT_OCTEON3:
16108       fputs ("Cavium Networks Octeon3", stdout);
16109       break;
16110     case AFL_EXT_OCTEON2:
16111       fputs ("Cavium Networks Octeon2", stdout);
16112       break;
16113     case AFL_EXT_OCTEONP:
16114       fputs ("Cavium Networks OcteonP", stdout);
16115       break;
16116     case AFL_EXT_OCTEON:
16117       fputs ("Cavium Networks Octeon", stdout);
16118       break;
16119     case AFL_EXT_5900:
16120       fputs ("Toshiba R5900", stdout);
16121       break;
16122     case AFL_EXT_4650:
16123       fputs ("MIPS R4650", stdout);
16124       break;
16125     case AFL_EXT_4010:
16126       fputs ("LSI R4010", stdout);
16127       break;
16128     case AFL_EXT_4100:
16129       fputs ("NEC VR4100", stdout);
16130       break;
16131     case AFL_EXT_3900:
16132       fputs ("Toshiba R3900", stdout);
16133       break;
16134     case AFL_EXT_10000:
16135       fputs ("MIPS R10000", stdout);
16136       break;
16137     case AFL_EXT_SB1:
16138       fputs ("Broadcom SB-1", stdout);
16139       break;
16140     case AFL_EXT_4111:
16141       fputs ("NEC VR4111/VR4181", stdout);
16142       break;
16143     case AFL_EXT_4120:
16144       fputs ("NEC VR4120", stdout);
16145       break;
16146     case AFL_EXT_5400:
16147       fputs ("NEC VR5400", stdout);
16148       break;
16149     case AFL_EXT_5500:
16150       fputs ("NEC VR5500", stdout);
16151       break;
16152     case AFL_EXT_LOONGSON_2E:
16153       fputs ("ST Microelectronics Loongson 2E", stdout);
16154       break;
16155     case AFL_EXT_LOONGSON_2F:
16156       fputs ("ST Microelectronics Loongson 2F", stdout);
16157       break;
16158     case AFL_EXT_INTERAPTIV_MR2:
16159       fputs ("Imagination interAptiv MR2", stdout);
16160       break;
16161     default:
16162       fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
16163     }
16164 }
16165
16166 static signed int
16167 get_mips_reg_size (int reg_size)
16168 {
16169   return (reg_size == AFL_REG_NONE) ? 0
16170          : (reg_size == AFL_REG_32) ? 32
16171          : (reg_size == AFL_REG_64) ? 64
16172          : (reg_size == AFL_REG_128) ? 128
16173          : -1;
16174 }
16175
16176 static bfd_boolean
16177 process_mips_specific (Filedata * filedata)
16178 {
16179   Elf_Internal_Dyn * entry;
16180   Elf_Internal_Shdr *sect = NULL;
16181   size_t liblist_offset = 0;
16182   size_t liblistno = 0;
16183   size_t conflictsno = 0;
16184   size_t options_offset = 0;
16185   size_t conflicts_offset = 0;
16186   size_t pltrelsz = 0;
16187   size_t pltrel = 0;
16188   bfd_vma pltgot = 0;
16189   bfd_vma mips_pltgot = 0;
16190   bfd_vma jmprel = 0;
16191   bfd_vma local_gotno = 0;
16192   bfd_vma gotsym = 0;
16193   bfd_vma symtabno = 0;
16194   bfd_boolean res = TRUE;
16195
16196   if (! process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
16197                             display_mips_gnu_attribute))
16198     res = FALSE;
16199
16200   sect = find_section (filedata, ".MIPS.abiflags");
16201
16202   if (sect != NULL)
16203     {
16204       Elf_External_ABIFlags_v0 *abiflags_ext;
16205       Elf_Internal_ABIFlags_v0 abiflags_in;
16206
16207       if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
16208         {
16209           error (_("Corrupt MIPS ABI Flags section.\n"));
16210           res = FALSE;
16211         }
16212       else
16213         {
16214           abiflags_ext = get_data (NULL, filedata, sect->sh_offset, 1,
16215                                    sect->sh_size, _("MIPS ABI Flags section"));
16216           if (abiflags_ext)
16217             {
16218               abiflags_in.version = BYTE_GET (abiflags_ext->version);
16219               abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
16220               abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
16221               abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
16222               abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
16223               abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
16224               abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
16225               abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
16226               abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
16227               abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
16228               abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
16229
16230               printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
16231               printf ("\nISA: MIPS%d", abiflags_in.isa_level);
16232               if (abiflags_in.isa_rev > 1)
16233                 printf ("r%d", abiflags_in.isa_rev);
16234               printf ("\nGPR size: %d",
16235                       get_mips_reg_size (abiflags_in.gpr_size));
16236               printf ("\nCPR1 size: %d",
16237                       get_mips_reg_size (abiflags_in.cpr1_size));
16238               printf ("\nCPR2 size: %d",
16239                       get_mips_reg_size (abiflags_in.cpr2_size));
16240               fputs ("\nFP ABI: ", stdout);
16241               print_mips_fp_abi_value (abiflags_in.fp_abi);
16242               fputs ("ISA Extension: ", stdout);
16243               print_mips_isa_ext (abiflags_in.isa_ext);
16244               fputs ("\nASEs:", stdout);
16245               print_mips_ases (abiflags_in.ases);
16246               printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
16247               printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
16248               fputc ('\n', stdout);
16249               free (abiflags_ext);
16250             }
16251         }
16252     }
16253
16254   /* We have a lot of special sections.  Thanks SGI!  */
16255   if (dynamic_section == NULL)
16256     {
16257       /* No dynamic information available.  See if there is static GOT.  */
16258       sect = find_section (filedata, ".got");
16259       if (sect != NULL)
16260         {
16261           unsigned char *data_end;
16262           unsigned char *data;
16263           bfd_vma ent, end;
16264           int addr_size;
16265
16266           pltgot = sect->sh_addr;
16267
16268           ent = pltgot;
16269           addr_size = (is_32bit_elf ? 4 : 8);
16270           end = pltgot + sect->sh_size;
16271
16272           data = (unsigned char *) get_data (NULL, filedata, sect->sh_offset,
16273                                              end - pltgot, 1,
16274                                              _("Global Offset Table data"));
16275           /* PR 12855: Null data is handled gracefully throughout.  */
16276           data_end = data + (end - pltgot);
16277
16278           printf (_("\nStatic GOT:\n"));
16279           printf (_(" Canonical gp value: "));
16280           print_vma (ent + 0x7ff0, LONG_HEX);
16281           printf ("\n\n");
16282
16283           /* In a dynamic binary GOT[0] is reserved for the dynamic
16284              loader to store the lazy resolver pointer, however in
16285              a static binary it may well have been omitted and GOT
16286              reduced to a table of addresses.
16287              PR 21344: Check for the entry being fully available
16288              before fetching it.  */
16289           if (data
16290               && data + ent - pltgot + addr_size <= data_end
16291               && byte_get (data + ent - pltgot, addr_size) == 0)
16292             {
16293               printf (_(" Reserved entries:\n"));
16294               printf (_("  %*s %10s %*s\n"),
16295                       addr_size * 2, _("Address"), _("Access"),
16296                       addr_size * 2, _("Value"));
16297               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16298               printf ("\n");
16299               if (ent == (bfd_vma) -1)
16300                 goto sgot_print_fail;
16301
16302               /* Check for the MSB of GOT[1] being set, identifying a
16303                  GNU object.  This entry will be used by some runtime
16304                  loaders, to store the module pointer.  Otherwise this
16305                  is an ordinary local entry.
16306                  PR 21344: Check for the entry being fully available
16307                  before fetching it.  */
16308               if (data
16309                   && data + ent - pltgot + addr_size <= data_end
16310                   && (byte_get (data + ent - pltgot, addr_size)
16311                       >> (addr_size * 8 - 1)) != 0)
16312                 {
16313                   ent = print_mips_got_entry (data, pltgot, ent, data_end);
16314                   printf ("\n");
16315                   if (ent == (bfd_vma) -1)
16316                     goto sgot_print_fail;
16317                 }
16318               printf ("\n");
16319             }
16320
16321           if (data != NULL && ent < end)
16322             {
16323               printf (_(" Local entries:\n"));
16324               printf ("  %*s %10s %*s\n",
16325                       addr_size * 2, _("Address"), _("Access"),
16326                       addr_size * 2, _("Value"));
16327               while (ent < end)
16328                 {
16329                   ent = print_mips_got_entry (data, pltgot, ent, data_end);
16330                   printf ("\n");
16331                   if (ent == (bfd_vma) -1)
16332                     goto sgot_print_fail;
16333                 }
16334               printf ("\n");
16335             }
16336
16337         sgot_print_fail:
16338           if (data)
16339             free (data);
16340         }
16341       return res;
16342     }
16343
16344   for (entry = dynamic_section;
16345        /* PR 17531 file: 012-50589-0.004.  */
16346        entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
16347        ++entry)
16348     switch (entry->d_tag)
16349       {
16350       case DT_MIPS_LIBLIST:
16351         liblist_offset
16352           = offset_from_vma (filedata, entry->d_un.d_val,
16353                              liblistno * sizeof (Elf32_External_Lib));
16354         break;
16355       case DT_MIPS_LIBLISTNO:
16356         liblistno = entry->d_un.d_val;
16357         break;
16358       case DT_MIPS_OPTIONS:
16359         options_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
16360         break;
16361       case DT_MIPS_CONFLICT:
16362         conflicts_offset
16363           = offset_from_vma (filedata, entry->d_un.d_val,
16364                              conflictsno * sizeof (Elf32_External_Conflict));
16365         break;
16366       case DT_MIPS_CONFLICTNO:
16367         conflictsno = entry->d_un.d_val;
16368         break;
16369       case DT_PLTGOT:
16370         pltgot = entry->d_un.d_ptr;
16371         break;
16372       case DT_MIPS_LOCAL_GOTNO:
16373         local_gotno = entry->d_un.d_val;
16374         break;
16375       case DT_MIPS_GOTSYM:
16376         gotsym = entry->d_un.d_val;
16377         break;
16378       case DT_MIPS_SYMTABNO:
16379         symtabno = entry->d_un.d_val;
16380         break;
16381       case DT_MIPS_PLTGOT:
16382         mips_pltgot = entry->d_un.d_ptr;
16383         break;
16384       case DT_PLTREL:
16385         pltrel = entry->d_un.d_val;
16386         break;
16387       case DT_PLTRELSZ:
16388         pltrelsz = entry->d_un.d_val;
16389         break;
16390       case DT_JMPREL:
16391         jmprel = entry->d_un.d_ptr;
16392         break;
16393       default:
16394         break;
16395       }
16396
16397   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
16398     {
16399       Elf32_External_Lib * elib;
16400       size_t cnt;
16401
16402       elib = (Elf32_External_Lib *) get_data (NULL, filedata, liblist_offset,
16403                                               liblistno,
16404                                               sizeof (Elf32_External_Lib),
16405                                               _("liblist section data"));
16406       if (elib)
16407         {
16408           printf (ngettext ("\nSection '.liblist' contains %lu entry:\n",
16409                             "\nSection '.liblist' contains %lu entries:\n",
16410                             (unsigned long) liblistno),
16411                   (unsigned long) liblistno);
16412           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
16413                  stdout);
16414
16415           for (cnt = 0; cnt < liblistno; ++cnt)
16416             {
16417               Elf32_Lib liblist;
16418               time_t atime;
16419               char timebuf[128];
16420               struct tm * tmp;
16421
16422               liblist.l_name = BYTE_GET (elib[cnt].l_name);
16423               atime = BYTE_GET (elib[cnt].l_time_stamp);
16424               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16425               liblist.l_version = BYTE_GET (elib[cnt].l_version);
16426               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16427
16428               tmp = gmtime (&atime);
16429               snprintf (timebuf, sizeof (timebuf),
16430                         "%04u-%02u-%02uT%02u:%02u:%02u",
16431                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16432                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16433
16434               printf ("%3lu: ", (unsigned long) cnt);
16435               if (VALID_DYNAMIC_NAME (liblist.l_name))
16436                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
16437               else
16438                 printf (_("<corrupt: %9ld>"), liblist.l_name);
16439               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
16440                       liblist.l_version);
16441
16442               if (liblist.l_flags == 0)
16443                 puts (_(" NONE"));
16444               else
16445                 {
16446                   static const struct
16447                   {
16448                     const char * name;
16449                     int bit;
16450                   }
16451                   l_flags_vals[] =
16452                   {
16453                     { " EXACT_MATCH", LL_EXACT_MATCH },
16454                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
16455                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
16456                     { " EXPORTS", LL_EXPORTS },
16457                     { " DELAY_LOAD", LL_DELAY_LOAD },
16458                     { " DELTA", LL_DELTA }
16459                   };
16460                   int flags = liblist.l_flags;
16461                   size_t fcnt;
16462
16463                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
16464                     if ((flags & l_flags_vals[fcnt].bit) != 0)
16465                       {
16466                         fputs (l_flags_vals[fcnt].name, stdout);
16467                         flags ^= l_flags_vals[fcnt].bit;
16468                       }
16469                   if (flags != 0)
16470                     printf (" %#x", (unsigned int) flags);
16471
16472                   puts ("");
16473                 }
16474             }
16475
16476           free (elib);
16477         }
16478       else
16479         res = FALSE;
16480     }
16481
16482   if (options_offset != 0)
16483     {
16484       Elf_External_Options * eopt;
16485       size_t offset;
16486       int cnt;
16487       sect = filedata->section_headers;
16488
16489       /* Find the section header so that we get the size.  */
16490       sect = find_section_by_type (filedata, SHT_MIPS_OPTIONS);
16491       /* PR 17533 file: 012-277276-0.004.  */
16492       if (sect == NULL)
16493         {
16494           error (_("No MIPS_OPTIONS header found\n"));
16495           return FALSE;
16496         }
16497       /* PR 24243  */
16498       if (sect->sh_size < sizeof (* eopt))
16499         {
16500           error (_("The MIPS options section is too small.\n"));
16501           return FALSE;
16502         }
16503
16504       eopt = (Elf_External_Options *) get_data (NULL, filedata, options_offset, 1,
16505                                                 sect->sh_size, _("options"));
16506       if (eopt)
16507         {
16508           Elf_Internal_Options * iopt;
16509           Elf_Internal_Options * option;
16510           Elf_Internal_Options * iopt_end;
16511
16512           iopt = (Elf_Internal_Options *)
16513               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
16514           if (iopt == NULL)
16515             {
16516               error (_("Out of memory allocating space for MIPS options\n"));
16517               return FALSE;
16518             }
16519
16520           offset = cnt = 0;
16521           option = iopt;
16522           iopt_end = iopt + (sect->sh_size / sizeof (eopt));
16523           
16524           while (offset <= sect->sh_size - sizeof (* eopt))
16525             {
16526               Elf_External_Options * eoption;
16527
16528               eoption = (Elf_External_Options *) ((char *) eopt + offset);
16529
16530               option->kind = BYTE_GET (eoption->kind);
16531               option->size = BYTE_GET (eoption->size);
16532               option->section = BYTE_GET (eoption->section);
16533               option->info = BYTE_GET (eoption->info);
16534
16535               /* PR 17531: file: ffa0fa3b.  */
16536               if (option->size < sizeof (* eopt)
16537                   || offset + option->size > sect->sh_size)
16538                 {
16539                   error (_("Invalid size (%u) for MIPS option\n"), option->size);
16540                   return FALSE;
16541                 }
16542               offset += option->size;
16543
16544               ++option;
16545               ++cnt;
16546             }
16547
16548           printf (ngettext ("\nSection '%s' contains %d entry:\n",
16549                             "\nSection '%s' contains %d entries:\n",
16550                             cnt),
16551                   printable_section_name (filedata, sect), cnt);
16552
16553           option = iopt;
16554           offset = 0;
16555
16556           while (cnt-- > 0)
16557             {
16558               size_t len;
16559
16560               switch (option->kind)
16561                 {
16562                 case ODK_NULL:
16563                   /* This shouldn't happen.  */
16564                   printf (" NULL       %d %lx", option->section, option->info);
16565                   break;
16566
16567                 case ODK_REGINFO:
16568                   printf (" REGINFO    ");
16569                   if (filedata->file_header.e_machine == EM_MIPS)
16570                     {
16571                       Elf32_External_RegInfo * ereg;
16572                       Elf32_RegInfo reginfo;
16573
16574                       /* 32bit form.  */
16575                       if (option + 2 > iopt_end)
16576                         {
16577                           printf (_("<corrupt>\n"));
16578                           error (_("Truncated MIPS REGINFO option\n"));
16579                           cnt = 0;
16580                           break;
16581                         }
16582
16583                       ereg = (Elf32_External_RegInfo *) (option + 1);
16584
16585                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
16586                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16587                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16588                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16589                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16590                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
16591
16592                       printf ("GPR %08lx  GP 0x%lx\n",
16593                               reginfo.ri_gprmask,
16594                               (unsigned long) reginfo.ri_gp_value);
16595                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
16596                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16597                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16598                     }
16599                   else
16600                     {
16601                       /* 64 bit form.  */
16602                       Elf64_External_RegInfo * ereg;
16603                       Elf64_Internal_RegInfo reginfo;
16604
16605                       if (option + 2 > iopt_end)
16606                         {
16607                           printf (_("<corrupt>\n"));
16608                           error (_("Truncated MIPS REGINFO option\n"));
16609                           cnt = 0;
16610                           break;
16611                         }
16612
16613                       ereg = (Elf64_External_RegInfo *) (option + 1);
16614                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
16615                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16616                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16617                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16618                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16619                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
16620
16621                       printf ("GPR %08lx  GP 0x",
16622                               reginfo.ri_gprmask);
16623                       printf_vma (reginfo.ri_gp_value);
16624                       printf ("\n");
16625
16626                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
16627                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16628                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16629                     }
16630                   ++option;
16631                   continue;
16632
16633                 case ODK_EXCEPTIONS:
16634                   fputs (" EXCEPTIONS fpe_min(", stdout);
16635                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
16636                   fputs (") fpe_max(", stdout);
16637                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
16638                   fputs (")", stdout);
16639
16640                   if (option->info & OEX_PAGE0)
16641                     fputs (" PAGE0", stdout);
16642                   if (option->info & OEX_SMM)
16643                     fputs (" SMM", stdout);
16644                   if (option->info & OEX_FPDBUG)
16645                     fputs (" FPDBUG", stdout);
16646                   if (option->info & OEX_DISMISS)
16647                     fputs (" DISMISS", stdout);
16648                   break;
16649
16650                 case ODK_PAD:
16651                   fputs (" PAD       ", stdout);
16652                   if (option->info & OPAD_PREFIX)
16653                     fputs (" PREFIX", stdout);
16654                   if (option->info & OPAD_POSTFIX)
16655                     fputs (" POSTFIX", stdout);
16656                   if (option->info & OPAD_SYMBOL)
16657                     fputs (" SYMBOL", stdout);
16658                   break;
16659
16660                 case ODK_HWPATCH:
16661                   fputs (" HWPATCH   ", stdout);
16662                   if (option->info & OHW_R4KEOP)
16663                     fputs (" R4KEOP", stdout);
16664                   if (option->info & OHW_R8KPFETCH)
16665                     fputs (" R8KPFETCH", stdout);
16666                   if (option->info & OHW_R5KEOP)
16667                     fputs (" R5KEOP", stdout);
16668                   if (option->info & OHW_R5KCVTL)
16669                     fputs (" R5KCVTL", stdout);
16670                   break;
16671
16672                 case ODK_FILL:
16673                   fputs (" FILL       ", stdout);
16674                   /* XXX Print content of info word?  */
16675                   break;
16676
16677                 case ODK_TAGS:
16678                   fputs (" TAGS       ", stdout);
16679                   /* XXX Print content of info word?  */
16680                   break;
16681
16682                 case ODK_HWAND:
16683                   fputs (" HWAND     ", stdout);
16684                   if (option->info & OHWA0_R4KEOP_CHECKED)
16685                     fputs (" R4KEOP_CHECKED", stdout);
16686                   if (option->info & OHWA0_R4KEOP_CLEAN)
16687                     fputs (" R4KEOP_CLEAN", stdout);
16688                   break;
16689
16690                 case ODK_HWOR:
16691                   fputs (" HWOR      ", stdout);
16692                   if (option->info & OHWA0_R4KEOP_CHECKED)
16693                     fputs (" R4KEOP_CHECKED", stdout);
16694                   if (option->info & OHWA0_R4KEOP_CLEAN)
16695                     fputs (" R4KEOP_CLEAN", stdout);
16696                   break;
16697
16698                 case ODK_GP_GROUP:
16699                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
16700                           option->info & OGP_GROUP,
16701                           (option->info & OGP_SELF) >> 16);
16702                   break;
16703
16704                 case ODK_IDENT:
16705                   printf (" IDENT     %#06lx  self-contained %#06lx",
16706                           option->info & OGP_GROUP,
16707                           (option->info & OGP_SELF) >> 16);
16708                   break;
16709
16710                 default:
16711                   /* This shouldn't happen.  */
16712                   printf (" %3d ???     %d %lx",
16713                           option->kind, option->section, option->info);
16714                   break;
16715                 }
16716
16717               len = sizeof (* eopt);
16718               while (len < option->size)
16719                 {
16720                   unsigned char datum = * ((unsigned char *) eopt + offset + len);
16721
16722                   if (ISPRINT (datum))
16723                     printf ("%c", datum);
16724                   else
16725                     printf ("\\%03o", datum);
16726                   len ++;
16727                 }
16728               fputs ("\n", stdout);
16729
16730               offset += option->size;
16731               ++option;
16732             }
16733
16734           free (eopt);
16735         }
16736       else
16737         res = FALSE;
16738     }
16739
16740   if (conflicts_offset != 0 && conflictsno != 0)
16741     {
16742       Elf32_Conflict * iconf;
16743       size_t cnt;
16744
16745       if (dynamic_symbols == NULL)
16746         {
16747           error (_("conflict list found without a dynamic symbol table\n"));
16748           return FALSE;
16749         }
16750
16751       /* PR 21345 - print a slightly more helpful error message
16752          if we are sure that the cmalloc will fail.  */
16753       if (conflictsno * sizeof (* iconf) > filedata->file_size)
16754         {
16755           error (_("Overlarge number of conflicts detected: %lx\n"),
16756                  (long) conflictsno);
16757           return FALSE;
16758         }
16759
16760       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
16761       if (iconf == NULL)
16762         {
16763           error (_("Out of memory allocating space for dynamic conflicts\n"));
16764           return FALSE;
16765         }
16766
16767       if (is_32bit_elf)
16768         {
16769           Elf32_External_Conflict * econf32;
16770
16771           econf32 = (Elf32_External_Conflict *)
16772               get_data (NULL, filedata, conflicts_offset, conflictsno,
16773                         sizeof (* econf32), _("conflict"));
16774           if (!econf32)
16775             return FALSE;
16776
16777           for (cnt = 0; cnt < conflictsno; ++cnt)
16778             iconf[cnt] = BYTE_GET (econf32[cnt]);
16779
16780           free (econf32);
16781         }
16782       else
16783         {
16784           Elf64_External_Conflict * econf64;
16785
16786           econf64 = (Elf64_External_Conflict *)
16787               get_data (NULL, filedata, conflicts_offset, conflictsno,
16788                         sizeof (* econf64), _("conflict"));
16789           if (!econf64)
16790             return FALSE;
16791
16792           for (cnt = 0; cnt < conflictsno; ++cnt)
16793             iconf[cnt] = BYTE_GET (econf64[cnt]);
16794
16795           free (econf64);
16796         }
16797
16798       printf (ngettext ("\nSection '.conflict' contains %lu entry:\n",
16799                         "\nSection '.conflict' contains %lu entries:\n",
16800                         (unsigned long) conflictsno),
16801               (unsigned long) conflictsno);
16802       puts (_("  Num:    Index       Value  Name"));
16803
16804       for (cnt = 0; cnt < conflictsno; ++cnt)
16805         {
16806           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
16807
16808           if (iconf[cnt] >= num_dynamic_syms)
16809             printf (_("<corrupt symbol index>"));
16810           else
16811             {
16812               Elf_Internal_Sym * psym;
16813
16814               psym = & dynamic_symbols[iconf[cnt]];
16815               print_vma (psym->st_value, FULL_HEX);
16816               putchar (' ');
16817               if (VALID_DYNAMIC_NAME (psym->st_name))
16818                 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
16819               else
16820                 printf (_("<corrupt: %14ld>"), psym->st_name);
16821             }
16822           putchar ('\n');
16823         }
16824
16825       free (iconf);
16826     }
16827
16828   if (pltgot != 0 && local_gotno != 0)
16829     {
16830       bfd_vma ent, local_end, global_end;
16831       size_t i, offset;
16832       unsigned char * data;
16833       unsigned char * data_end;
16834       int addr_size;
16835
16836       ent = pltgot;
16837       addr_size = (is_32bit_elf ? 4 : 8);
16838       local_end = pltgot + local_gotno * addr_size;
16839
16840       /* PR binutils/17533 file: 012-111227-0.004  */
16841       if (symtabno < gotsym)
16842         {
16843           error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
16844                  (unsigned long) gotsym, (unsigned long) symtabno);
16845           return FALSE;
16846         }
16847
16848       global_end = local_end + (symtabno - gotsym) * addr_size;
16849       /* PR 17531: file: 54c91a34.  */
16850       if (global_end < local_end)
16851         {
16852           error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
16853           return FALSE;
16854         }
16855
16856       offset = offset_from_vma (filedata, pltgot, global_end - pltgot);
16857       data = (unsigned char *) get_data (NULL, filedata, offset,
16858                                          global_end - pltgot, 1,
16859                                          _("Global Offset Table data"));
16860       /* PR 12855: Null data is handled gracefully throughout.  */
16861       data_end = data + (global_end - pltgot);
16862
16863       printf (_("\nPrimary GOT:\n"));
16864       printf (_(" Canonical gp value: "));
16865       print_vma (pltgot + 0x7ff0, LONG_HEX);
16866       printf ("\n\n");
16867
16868       printf (_(" Reserved entries:\n"));
16869       printf (_("  %*s %10s %*s Purpose\n"),
16870               addr_size * 2, _("Address"), _("Access"),
16871               addr_size * 2, _("Initial"));
16872       ent = print_mips_got_entry (data, pltgot, ent, data_end);
16873       printf (_(" Lazy resolver\n"));
16874       if (ent == (bfd_vma) -1)
16875         goto got_print_fail;
16876
16877       /* Check for the MSB of GOT[1] being set, denoting a GNU object.
16878          This entry will be used by some runtime loaders, to store the
16879          module pointer.  Otherwise this is an ordinary local entry.
16880          PR 21344: Check for the entry being fully available before
16881          fetching it.  */
16882       if (data
16883           && data + ent - pltgot + addr_size <= data_end
16884           && (byte_get (data + ent - pltgot, addr_size)
16885               >> (addr_size * 8 - 1)) != 0)
16886         {
16887           ent = print_mips_got_entry (data, pltgot, ent, data_end);
16888           printf (_(" Module pointer (GNU extension)\n"));
16889           if (ent == (bfd_vma) -1)
16890             goto got_print_fail;
16891         }
16892       printf ("\n");
16893
16894       if (data != NULL && ent < local_end)
16895         {
16896           printf (_(" Local entries:\n"));
16897           printf ("  %*s %10s %*s\n",
16898                   addr_size * 2, _("Address"), _("Access"),
16899                   addr_size * 2, _("Initial"));
16900           while (ent < local_end)
16901             {
16902               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16903               printf ("\n");
16904               if (ent == (bfd_vma) -1)
16905                 goto got_print_fail;
16906             }
16907           printf ("\n");
16908         }
16909
16910       if (data != NULL && gotsym < symtabno)
16911         {
16912           int sym_width;
16913
16914           printf (_(" Global entries:\n"));
16915           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
16916                   addr_size * 2, _("Address"),
16917                   _("Access"),
16918                   addr_size * 2, _("Initial"),
16919                   addr_size * 2, _("Sym.Val."),
16920                   _("Type"),
16921                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
16922                   _("Ndx"), _("Name"));
16923
16924           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
16925
16926           for (i = gotsym; i < symtabno; i++)
16927             {
16928               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16929               printf (" ");
16930
16931               if (dynamic_symbols == NULL)
16932                 printf (_("<no dynamic symbols>"));
16933               else if (i < num_dynamic_syms)
16934                 {
16935                   Elf_Internal_Sym * psym = dynamic_symbols + i;
16936
16937                   print_vma (psym->st_value, LONG_HEX);
16938                   printf (" %-7s %3s ",
16939                           get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16940                           get_symbol_index_type (filedata, psym->st_shndx));
16941
16942                   if (VALID_DYNAMIC_NAME (psym->st_name))
16943                     print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16944                   else
16945                     printf (_("<corrupt: %14ld>"), psym->st_name);
16946                 }
16947               else
16948                 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
16949                         (unsigned long) i);
16950
16951               printf ("\n");
16952               if (ent == (bfd_vma) -1)
16953                 break;
16954             }
16955           printf ("\n");
16956         }
16957
16958     got_print_fail:
16959       if (data)
16960         free (data);
16961     }
16962
16963   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
16964     {
16965       bfd_vma ent, end;
16966       size_t offset, rel_offset;
16967       unsigned long count, i;
16968       unsigned char * data;
16969       int addr_size, sym_width;
16970       Elf_Internal_Rela * rels;
16971
16972       rel_offset = offset_from_vma (filedata, jmprel, pltrelsz);
16973       if (pltrel == DT_RELA)
16974         {
16975           if (!slurp_rela_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16976             return FALSE;
16977         }
16978       else
16979         {
16980           if (!slurp_rel_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16981             return FALSE;
16982         }
16983
16984       ent = mips_pltgot;
16985       addr_size = (is_32bit_elf ? 4 : 8);
16986       end = mips_pltgot + (2 + count) * addr_size;
16987
16988       offset = offset_from_vma (filedata, mips_pltgot, end - mips_pltgot);
16989       data = (unsigned char *) get_data (NULL, filedata, offset, end - mips_pltgot,
16990                                          1, _("Procedure Linkage Table data"));
16991       if (data == NULL)
16992         return FALSE;
16993
16994       printf ("\nPLT GOT:\n\n");
16995       printf (_(" Reserved entries:\n"));
16996       printf (_("  %*s %*s Purpose\n"),
16997               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
16998       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16999       printf (_(" PLT lazy resolver\n"));
17000       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
17001       printf (_(" Module pointer\n"));
17002       printf ("\n");
17003
17004       printf (_(" Entries:\n"));
17005       printf ("  %*s %*s %*s %-7s %3s %s\n",
17006               addr_size * 2, _("Address"),
17007               addr_size * 2, _("Initial"),
17008               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
17009       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
17010       for (i = 0; i < count; i++)
17011         {
17012           unsigned long idx = get_reloc_symindex (rels[i].r_info);
17013
17014           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
17015           printf (" ");
17016
17017           if (idx >= num_dynamic_syms)
17018             printf (_("<corrupt symbol index: %lu>"), idx);
17019           else
17020             {
17021               Elf_Internal_Sym * psym = dynamic_symbols + idx;
17022
17023               print_vma (psym->st_value, LONG_HEX);
17024               printf (" %-7s %3s ",
17025                       get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
17026                       get_symbol_index_type (filedata, psym->st_shndx));
17027               if (VALID_DYNAMIC_NAME (psym->st_name))
17028                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
17029               else
17030                 printf (_("<corrupt: %14ld>"), psym->st_name);
17031             }
17032           printf ("\n");
17033         }
17034       printf ("\n");
17035
17036       if (data)
17037         free (data);
17038       free (rels);
17039     }
17040
17041   return res;
17042 }
17043
17044 static bfd_boolean
17045 process_nds32_specific (Filedata * filedata)
17046 {
17047   Elf_Internal_Shdr *sect = NULL;
17048
17049   sect = find_section (filedata, ".nds32_e_flags");
17050   if (sect != NULL)
17051     {
17052       unsigned int *flag;
17053
17054       printf ("\nNDS32 elf flags section:\n");
17055       flag = get_data (NULL, filedata, sect->sh_offset, 1,
17056                        sect->sh_size, _("NDS32 elf flags section"));
17057
17058       if (! flag)
17059         return FALSE;
17060
17061       switch ((*flag) & 0x3)
17062         {
17063         case 0:
17064           printf ("(VEC_SIZE):\tNo entry.\n");
17065           break;
17066         case 1:
17067           printf ("(VEC_SIZE):\t4 bytes\n");
17068           break;
17069         case 2:
17070           printf ("(VEC_SIZE):\t16 bytes\n");
17071           break;
17072         case 3:
17073           printf ("(VEC_SIZE):\treserved\n");
17074           break;
17075         }
17076     }
17077
17078   return TRUE;
17079 }
17080
17081 static bfd_boolean
17082 process_gnu_liblist (Filedata * filedata)
17083 {
17084   Elf_Internal_Shdr * section;
17085   Elf_Internal_Shdr * string_sec;
17086   Elf32_External_Lib * elib;
17087   char * strtab;
17088   size_t strtab_size;
17089   size_t cnt;
17090   unsigned long num_liblist;
17091   unsigned i;
17092   bfd_boolean res = TRUE;
17093
17094   if (! do_arch)
17095     return TRUE;
17096
17097   for (i = 0, section = filedata->section_headers;
17098        i < filedata->file_header.e_shnum;
17099        i++, section++)
17100     {
17101       switch (section->sh_type)
17102         {
17103         case SHT_GNU_LIBLIST:
17104           if (section->sh_link >= filedata->file_header.e_shnum)
17105             break;
17106
17107           elib = (Elf32_External_Lib *)
17108               get_data (NULL, filedata, section->sh_offset, 1, section->sh_size,
17109                         _("liblist section data"));
17110
17111           if (elib == NULL)
17112             {
17113               res = FALSE;
17114               break;
17115             }
17116
17117           string_sec = filedata->section_headers + section->sh_link;
17118           strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
17119                                       string_sec->sh_size,
17120                                       _("liblist string table"));
17121           if (strtab == NULL
17122               || section->sh_entsize != sizeof (Elf32_External_Lib))
17123             {
17124               free (elib);
17125               free (strtab);
17126               res = FALSE;
17127               break;
17128             }
17129           strtab_size = string_sec->sh_size;
17130
17131           num_liblist = section->sh_size / sizeof (Elf32_External_Lib);
17132           printf (ngettext ("\nLibrary list section '%s' contains %lu entries:\n",
17133                             "\nLibrary list section '%s' contains %lu entries:\n",
17134                             num_liblist),
17135                   printable_section_name (filedata, section),
17136                   num_liblist);
17137
17138           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
17139
17140           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
17141                ++cnt)
17142             {
17143               Elf32_Lib liblist;
17144               time_t atime;
17145               char timebuf[128];
17146               struct tm * tmp;
17147
17148               liblist.l_name = BYTE_GET (elib[cnt].l_name);
17149               atime = BYTE_GET (elib[cnt].l_time_stamp);
17150               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
17151               liblist.l_version = BYTE_GET (elib[cnt].l_version);
17152               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
17153
17154               tmp = gmtime (&atime);
17155               snprintf (timebuf, sizeof (timebuf),
17156                         "%04u-%02u-%02uT%02u:%02u:%02u",
17157                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
17158                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
17159
17160               printf ("%3lu: ", (unsigned long) cnt);
17161               if (do_wide)
17162                 printf ("%-20s", liblist.l_name < strtab_size
17163                         ? strtab + liblist.l_name : _("<corrupt>"));
17164               else
17165                 printf ("%-20.20s", liblist.l_name < strtab_size
17166                         ? strtab + liblist.l_name : _("<corrupt>"));
17167               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
17168                       liblist.l_version, liblist.l_flags);
17169             }
17170
17171           free (elib);
17172           free (strtab);
17173         }
17174     }
17175
17176   return res;
17177 }
17178
17179 static const char *
17180 get_note_type (Filedata * filedata, unsigned e_type)
17181 {
17182   static char buff[64];
17183
17184   if (filedata->file_header.e_type == ET_CORE)
17185     switch (e_type)
17186       {
17187       case NT_AUXV:
17188         return _("NT_AUXV (auxiliary vector)");
17189       case NT_PRSTATUS:
17190         return _("NT_PRSTATUS (prstatus structure)");
17191       case NT_FPREGSET:
17192         return _("NT_FPREGSET (floating point registers)");
17193       case NT_PRPSINFO:
17194         return _("NT_PRPSINFO (prpsinfo structure)");
17195       case NT_TASKSTRUCT:
17196         return _("NT_TASKSTRUCT (task structure)");
17197       case NT_PRXFPREG:
17198         return _("NT_PRXFPREG (user_xfpregs structure)");
17199       case NT_PPC_VMX:
17200         return _("NT_PPC_VMX (ppc Altivec registers)");
17201       case NT_PPC_VSX:
17202         return _("NT_PPC_VSX (ppc VSX registers)");
17203       case NT_PPC_TAR:
17204         return _("NT_PPC_TAR (ppc TAR register)");
17205       case NT_PPC_PPR:
17206         return _("NT_PPC_PPR (ppc PPR register)");
17207       case NT_PPC_DSCR:
17208         return _("NT_PPC_DSCR (ppc DSCR register)");
17209       case NT_PPC_EBB:
17210         return _("NT_PPC_EBB (ppc EBB registers)");
17211       case NT_PPC_PMU:
17212         return _("NT_PPC_PMU (ppc PMU registers)");
17213       case NT_PPC_TM_CGPR:
17214         return _("NT_PPC_TM_CGPR (ppc checkpointed GPR registers)");
17215       case NT_PPC_TM_CFPR:
17216         return _("NT_PPC_TM_CFPR (ppc checkpointed floating point registers)");
17217       case NT_PPC_TM_CVMX:
17218         return _("NT_PPC_TM_CVMX (ppc checkpointed Altivec registers)");
17219       case NT_PPC_TM_CVSX:
17220         return _("NT_PPC_TM_CVSX (ppc checkpointed VSX registers)");
17221       case NT_PPC_TM_SPR:
17222         return _("NT_PPC_TM_SPR (ppc TM special purpose registers)");
17223       case NT_PPC_TM_CTAR:
17224         return _("NT_PPC_TM_CTAR (ppc checkpointed TAR register)");
17225       case NT_PPC_TM_CPPR:
17226         return _("NT_PPC_TM_CPPR (ppc checkpointed PPR register)");
17227       case NT_PPC_TM_CDSCR:
17228         return _("NT_PPC_TM_CDSCR (ppc checkpointed DSCR register)");
17229       case NT_386_TLS:
17230         return _("NT_386_TLS (x86 TLS information)");
17231       case NT_386_IOPERM:
17232         return _("NT_386_IOPERM (x86 I/O permissions)");
17233       case NT_X86_XSTATE:
17234         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
17235       case NT_S390_HIGH_GPRS:
17236         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
17237       case NT_S390_TIMER:
17238         return _("NT_S390_TIMER (s390 timer register)");
17239       case NT_S390_TODCMP:
17240         return _("NT_S390_TODCMP (s390 TOD comparator register)");
17241       case NT_S390_TODPREG:
17242         return _("NT_S390_TODPREG (s390 TOD programmable register)");
17243       case NT_S390_CTRS:
17244         return _("NT_S390_CTRS (s390 control registers)");
17245       case NT_S390_PREFIX:
17246         return _("NT_S390_PREFIX (s390 prefix register)");
17247       case NT_S390_LAST_BREAK:
17248         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
17249       case NT_S390_SYSTEM_CALL:
17250         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
17251       case NT_S390_TDB:
17252         return _("NT_S390_TDB (s390 transaction diagnostic block)");
17253       case NT_S390_VXRS_LOW:
17254         return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
17255       case NT_S390_VXRS_HIGH:
17256         return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
17257       case NT_S390_GS_CB:
17258         return _("NT_S390_GS_CB (s390 guarded-storage registers)");
17259       case NT_S390_GS_BC:
17260         return _("NT_S390_GS_BC (s390 guarded-storage broadcast control)");
17261       case NT_ARM_VFP:
17262         return _("NT_ARM_VFP (arm VFP registers)");
17263       case NT_ARM_TLS:
17264         return _("NT_ARM_TLS (AArch TLS registers)");
17265       case NT_ARM_HW_BREAK:
17266         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
17267       case NT_ARM_HW_WATCH:
17268         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
17269       case NT_PSTATUS:
17270         return _("NT_PSTATUS (pstatus structure)");
17271       case NT_FPREGS:
17272         return _("NT_FPREGS (floating point registers)");
17273       case NT_PSINFO:
17274         return _("NT_PSINFO (psinfo structure)");
17275       case NT_LWPSTATUS:
17276         return _("NT_LWPSTATUS (lwpstatus_t structure)");
17277       case NT_LWPSINFO:
17278         return _("NT_LWPSINFO (lwpsinfo_t structure)");
17279       case NT_WIN32PSTATUS:
17280         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
17281       case NT_SIGINFO:
17282         return _("NT_SIGINFO (siginfo_t data)");
17283       case NT_FILE:
17284         return _("NT_FILE (mapped files)");
17285       default:
17286         break;
17287       }
17288   else
17289     switch (e_type)
17290       {
17291       case NT_VERSION:
17292         return _("NT_VERSION (version)");
17293       case NT_ARCH:
17294         return _("NT_ARCH (architecture)");
17295       case NT_GNU_BUILD_ATTRIBUTE_OPEN:
17296         return _("OPEN");
17297       case NT_GNU_BUILD_ATTRIBUTE_FUNC:
17298         return _("func");
17299       default:
17300         break;
17301       }
17302
17303   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17304   return buff;
17305 }
17306
17307 static bfd_boolean
17308 print_core_note (Elf_Internal_Note *pnote)
17309 {
17310   unsigned int addr_size = is_32bit_elf ? 4 : 8;
17311   bfd_vma count, page_size;
17312   unsigned char *descdata, *filenames, *descend;
17313
17314   if (pnote->type != NT_FILE)
17315     {
17316       if (do_wide)
17317         printf ("\n");
17318       return TRUE;
17319     }
17320
17321 #ifndef BFD64
17322   if (!is_32bit_elf)
17323     {
17324       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
17325       /* Still "successful".  */
17326       return TRUE;
17327     }
17328 #endif
17329
17330   if (pnote->descsz < 2 * addr_size)
17331     {
17332       error (_("    Malformed note - too short for header\n"));
17333       return FALSE;
17334     }
17335
17336   descdata = (unsigned char *) pnote->descdata;
17337   descend = descdata + pnote->descsz;
17338
17339   if (descdata[pnote->descsz - 1] != '\0')
17340     {
17341       error (_("    Malformed note - does not end with \\0\n"));
17342       return FALSE;
17343     }
17344
17345   count = byte_get (descdata, addr_size);
17346   descdata += addr_size;
17347
17348   page_size = byte_get (descdata, addr_size);
17349   descdata += addr_size;
17350
17351   if (count > ((bfd_vma) -1 - 2 * addr_size) / (3 * addr_size)
17352       || pnote->descsz < 2 * addr_size + count * 3 * addr_size)
17353     {
17354       error (_("    Malformed note - too short for supplied file count\n"));
17355       return FALSE;
17356     }
17357
17358   printf (_("    Page size: "));
17359   print_vma (page_size, DEC);
17360   printf ("\n");
17361
17362   printf (_("    %*s%*s%*s\n"),
17363           (int) (2 + 2 * addr_size), _("Start"),
17364           (int) (4 + 2 * addr_size), _("End"),
17365           (int) (4 + 2 * addr_size), _("Page Offset"));
17366   filenames = descdata + count * 3 * addr_size;
17367   while (count-- > 0)
17368     {
17369       bfd_vma start, end, file_ofs;
17370
17371       if (filenames == descend)
17372         {
17373           error (_("    Malformed note - filenames end too early\n"));
17374           return FALSE;
17375         }
17376
17377       start = byte_get (descdata, addr_size);
17378       descdata += addr_size;
17379       end = byte_get (descdata, addr_size);
17380       descdata += addr_size;
17381       file_ofs = byte_get (descdata, addr_size);
17382       descdata += addr_size;
17383
17384       printf ("    ");
17385       print_vma (start, FULL_HEX);
17386       printf ("  ");
17387       print_vma (end, FULL_HEX);
17388       printf ("  ");
17389       print_vma (file_ofs, FULL_HEX);
17390       printf ("\n        %s\n", filenames);
17391
17392       filenames += 1 + strlen ((char *) filenames);
17393     }
17394
17395   return TRUE;
17396 }
17397
17398 static const char *
17399 get_gnu_elf_note_type (unsigned e_type)
17400 {
17401   /* NB/ Keep this switch statement in sync with print_gnu_note ().  */
17402   switch (e_type)
17403     {
17404     case NT_GNU_ABI_TAG:
17405       return _("NT_GNU_ABI_TAG (ABI version tag)");
17406     case NT_GNU_HWCAP:
17407       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
17408     case NT_GNU_BUILD_ID:
17409       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
17410     case NT_GNU_GOLD_VERSION:
17411       return _("NT_GNU_GOLD_VERSION (gold version)");
17412     case NT_GNU_PROPERTY_TYPE_0:
17413       return _("NT_GNU_PROPERTY_TYPE_0");
17414     case NT_GNU_BUILD_ATTRIBUTE_OPEN:
17415       return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
17416     case NT_GNU_BUILD_ATTRIBUTE_FUNC:
17417       return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
17418     default:
17419       {
17420         static char buff[64];
17421
17422         snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17423         return buff;
17424       }
17425     }
17426 }
17427
17428 static void
17429 decode_x86_compat_isa (unsigned int bitmask)
17430 {
17431   while (bitmask)
17432     {
17433       unsigned int bit = bitmask & (- bitmask);
17434
17435       bitmask &= ~ bit;
17436       switch (bit)
17437         {
17438         case GNU_PROPERTY_X86_COMPAT_ISA_1_486:
17439           printf ("i486");
17440           break;
17441         case GNU_PROPERTY_X86_COMPAT_ISA_1_586:
17442           printf ("586");
17443           break;
17444         case GNU_PROPERTY_X86_COMPAT_ISA_1_686:
17445           printf ("686");
17446           break;
17447         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE:
17448           printf ("SSE");
17449           break;
17450         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE2:
17451           printf ("SSE2");
17452           break;
17453         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE3:
17454           printf ("SSE3");
17455           break;
17456         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSSE3:
17457           printf ("SSSE3");
17458           break;
17459         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_1:
17460           printf ("SSE4_1");
17461           break;
17462         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_2:
17463           printf ("SSE4_2");
17464           break;
17465         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX:
17466           printf ("AVX");
17467           break;
17468         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX2:
17469           printf ("AVX2");
17470           break;
17471         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512F:
17472           printf ("AVX512F");
17473           break;
17474         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512CD:
17475           printf ("AVX512CD");
17476           break;
17477         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512ER:
17478           printf ("AVX512ER");
17479           break;
17480         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512PF:
17481           printf ("AVX512PF");
17482           break;
17483         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512VL:
17484           printf ("AVX512VL");
17485           break;
17486         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512DQ:
17487           printf ("AVX512DQ");
17488           break;
17489         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512BW:
17490           printf ("AVX512BW");
17491           break;
17492         default:
17493           printf (_("<unknown: %x>"), bit);
17494           break;
17495         }
17496       if (bitmask)
17497         printf (", ");
17498     }
17499 }
17500
17501 static void
17502 decode_x86_isa (unsigned int bitmask)
17503 {
17504   if (!bitmask)
17505     {
17506       printf (_("<None>"));
17507       return;
17508     }
17509
17510   while (bitmask)
17511     {
17512       unsigned int bit = bitmask & (- bitmask);
17513
17514       bitmask &= ~ bit;
17515       switch (bit)
17516         {
17517         case GNU_PROPERTY_X86_ISA_1_CMOV:
17518           printf ("CMOV");
17519           break;
17520         case GNU_PROPERTY_X86_ISA_1_SSE:
17521           printf ("SSE");
17522           break;
17523         case GNU_PROPERTY_X86_ISA_1_SSE2:
17524           printf ("SSE2");
17525           break;
17526         case GNU_PROPERTY_X86_ISA_1_SSE3:
17527           printf ("SSE3");
17528           break;
17529         case GNU_PROPERTY_X86_ISA_1_SSSE3:
17530           printf ("SSSE3");
17531           break;
17532         case GNU_PROPERTY_X86_ISA_1_SSE4_1:
17533           printf ("SSE4_1");
17534           break;
17535         case GNU_PROPERTY_X86_ISA_1_SSE4_2:
17536           printf ("SSE4_2");
17537           break;
17538         case GNU_PROPERTY_X86_ISA_1_AVX:
17539           printf ("AVX");
17540           break;
17541         case GNU_PROPERTY_X86_ISA_1_AVX2:
17542           printf ("AVX2");
17543           break;
17544         case GNU_PROPERTY_X86_ISA_1_FMA:
17545           printf ("FMA");
17546           break;
17547         case GNU_PROPERTY_X86_ISA_1_AVX512F:
17548           printf ("AVX512F");
17549           break;
17550         case GNU_PROPERTY_X86_ISA_1_AVX512CD:
17551           printf ("AVX512CD");
17552           break;
17553         case GNU_PROPERTY_X86_ISA_1_AVX512ER:
17554           printf ("AVX512ER");
17555           break;
17556         case GNU_PROPERTY_X86_ISA_1_AVX512PF:
17557           printf ("AVX512PF");
17558           break;
17559         case GNU_PROPERTY_X86_ISA_1_AVX512VL:
17560           printf ("AVX512VL");
17561           break;
17562         case GNU_PROPERTY_X86_ISA_1_AVX512DQ:
17563           printf ("AVX512DQ");
17564           break;
17565         case GNU_PROPERTY_X86_ISA_1_AVX512BW:
17566           printf ("AVX512BW");
17567           break;
17568         case GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS:
17569           printf ("AVX512_4FMAPS");
17570           break;
17571         case GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW:
17572           printf ("AVX512_4VNNIW");
17573           break;
17574         case GNU_PROPERTY_X86_ISA_1_AVX512_BITALG:
17575           printf ("AVX512_BITALG");
17576           break;
17577         case GNU_PROPERTY_X86_ISA_1_AVX512_IFMA:
17578           printf ("AVX512_IFMA");
17579           break;
17580         case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI:
17581           printf ("AVX512_VBMI");
17582           break;
17583         case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2:
17584           printf ("AVX512_VBMI2");
17585           break;
17586         case GNU_PROPERTY_X86_ISA_1_AVX512_VNNI:
17587           printf ("AVX512_VNNI");
17588           break;
17589         case GNU_PROPERTY_X86_ISA_1_AVX512_BF16:
17590           printf ("AVX512_BF16");
17591           break;
17592         default:
17593           printf (_("<unknown: %x>"), bit);
17594           break;
17595         }
17596       if (bitmask)
17597         printf (", ");
17598     }
17599 }
17600
17601 static void
17602 decode_x86_feature_1 (unsigned int bitmask)
17603 {
17604   if (!bitmask)
17605     {
17606       printf (_("<None>"));
17607       return;
17608     }
17609
17610   while (bitmask)
17611     {
17612       unsigned int bit = bitmask & (- bitmask);
17613
17614       bitmask &= ~ bit;
17615       switch (bit)
17616         {
17617         case GNU_PROPERTY_X86_FEATURE_1_IBT:
17618           printf ("IBT");
17619           break;
17620         case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
17621           printf ("SHSTK");
17622           break;
17623         default:
17624           printf (_("<unknown: %x>"), bit);
17625           break;
17626         }
17627       if (bitmask)
17628         printf (", ");
17629     }
17630 }
17631
17632 static void
17633 decode_x86_feature_2 (unsigned int bitmask)
17634 {
17635   if (!bitmask)
17636     {
17637       printf (_("<None>"));
17638       return;
17639     }
17640
17641   while (bitmask)
17642     {
17643       unsigned int bit = bitmask & (- bitmask);
17644
17645       bitmask &= ~ bit;
17646       switch (bit)
17647         {
17648         case GNU_PROPERTY_X86_FEATURE_2_X86:
17649           printf ("x86");
17650           break;
17651         case GNU_PROPERTY_X86_FEATURE_2_X87:
17652           printf ("x87");
17653           break;
17654         case GNU_PROPERTY_X86_FEATURE_2_MMX:
17655           printf ("MMX");
17656           break;
17657         case GNU_PROPERTY_X86_FEATURE_2_XMM:
17658           printf ("XMM");
17659           break;
17660         case GNU_PROPERTY_X86_FEATURE_2_YMM:
17661           printf ("YMM");
17662           break;
17663         case GNU_PROPERTY_X86_FEATURE_2_ZMM:
17664           printf ("ZMM");
17665           break;
17666         case GNU_PROPERTY_X86_FEATURE_2_FXSR:
17667           printf ("FXSR");
17668           break;
17669         case GNU_PROPERTY_X86_FEATURE_2_XSAVE:
17670           printf ("XSAVE");
17671           break;
17672         case GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT:
17673           printf ("XSAVEOPT");
17674           break;
17675         case GNU_PROPERTY_X86_FEATURE_2_XSAVEC:
17676           printf ("XSAVEC");
17677           break;
17678         default:
17679           printf (_("<unknown: %x>"), bit);
17680           break;
17681         }
17682       if (bitmask)
17683         printf (", ");
17684     }
17685 }
17686
17687 static void
17688 decode_aarch64_feature_1_and (unsigned int bitmask)
17689 {
17690   while (bitmask)
17691     {
17692       unsigned int bit = bitmask & (- bitmask);
17693
17694       bitmask &= ~ bit;
17695       switch (bit)
17696         {
17697         case GNU_PROPERTY_AARCH64_FEATURE_1_BTI:
17698           printf ("BTI");
17699           break;
17700
17701         case GNU_PROPERTY_AARCH64_FEATURE_1_PAC:
17702           printf ("PAC");
17703           break;
17704
17705         default:
17706           printf (_("<unknown: %x>"), bit);
17707           break;
17708         }
17709       if (bitmask)
17710         printf (", ");
17711     }
17712 }
17713
17714 static void
17715 print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
17716 {
17717   unsigned char * ptr = (unsigned char *) pnote->descdata;
17718   unsigned char * ptr_end = ptr + pnote->descsz;
17719   unsigned int    size = is_32bit_elf ? 4 : 8;
17720
17721   printf (_("      Properties: "));
17722
17723   if (pnote->descsz < 8 || (pnote->descsz % size) != 0)
17724     {
17725       printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz);
17726       return;
17727     }
17728
17729   while (ptr < ptr_end)
17730     {
17731       unsigned int j;
17732       unsigned int type;
17733       unsigned int datasz;
17734
17735       if ((size_t) (ptr_end - ptr) < 8)
17736         {
17737           printf (_("<corrupt descsz: %#lx>\n"), pnote->descsz);
17738           break;
17739         }
17740
17741       type = byte_get (ptr, 4);
17742       datasz = byte_get (ptr + 4, 4);
17743
17744       ptr += 8;
17745
17746       if (datasz > (size_t) (ptr_end - ptr))
17747         {
17748           printf (_("<corrupt type (%#x) datasz: %#x>\n"),
17749                   type, datasz);
17750           break;
17751         }
17752
17753       if (type >= GNU_PROPERTY_LOPROC && type <= GNU_PROPERTY_HIPROC)
17754         {
17755           if (filedata->file_header.e_machine == EM_X86_64
17756               || filedata->file_header.e_machine == EM_IAMCU
17757               || filedata->file_header.e_machine == EM_386)
17758             {
17759               unsigned int bitmask;
17760
17761               if (datasz == 4)
17762                 bitmask = byte_get (ptr, 4);
17763               else
17764                 bitmask = 0;
17765
17766               switch (type)
17767                 {
17768                 case GNU_PROPERTY_X86_ISA_1_USED:
17769                   if (datasz != 4)
17770                     printf (_("x86 ISA used: <corrupt length: %#x> "),
17771                             datasz);
17772                   else
17773                     {
17774                       printf ("x86 ISA used: ");
17775                       decode_x86_isa (bitmask);
17776                     }
17777                   goto next;
17778
17779                 case GNU_PROPERTY_X86_ISA_1_NEEDED:
17780                   if (datasz != 4)
17781                     printf (_("x86 ISA needed: <corrupt length: %#x> "),
17782                             datasz);
17783                   else
17784                     {
17785                       printf ("x86 ISA needed: ");
17786                       decode_x86_isa (bitmask);
17787                     }
17788                   goto next;
17789
17790                 case GNU_PROPERTY_X86_FEATURE_1_AND:
17791                   if (datasz != 4)
17792                     printf (_("x86 feature: <corrupt length: %#x> "),
17793                             datasz);
17794                   else
17795                     {
17796                       printf ("x86 feature: ");
17797                       decode_x86_feature_1 (bitmask);
17798                     }
17799                   goto next;
17800
17801                 case GNU_PROPERTY_X86_FEATURE_2_USED:
17802                   if (datasz != 4)
17803                     printf (_("x86 feature used: <corrupt length: %#x> "),
17804                             datasz);
17805                   else
17806                     {
17807                       printf ("x86 feature used: ");
17808                       decode_x86_feature_2 (bitmask);
17809                     }
17810                   goto next;
17811
17812                 case GNU_PROPERTY_X86_FEATURE_2_NEEDED:
17813                   if (datasz != 4)
17814                     printf (_("x86 feature needed: <corrupt length: %#x> "), datasz);
17815                   else
17816                     {
17817                       printf ("x86 feature needed: ");
17818                       decode_x86_feature_2 (bitmask);
17819                     }
17820                   goto next;
17821
17822                 case GNU_PROPERTY_X86_COMPAT_ISA_1_USED:
17823                   if (datasz != 4)
17824                     printf (_("x86 ISA used: <corrupt length: %#x> "),
17825                             datasz);
17826                   else
17827                     {
17828                       printf ("x86 ISA used: ");
17829                       decode_x86_compat_isa (bitmask);
17830                     }
17831                   goto next;
17832
17833                 case GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED:
17834                   if (datasz != 4)
17835                     printf (_("x86 ISA needed: <corrupt length: %#x> "),
17836                             datasz);
17837                   else
17838                     {
17839                       printf ("x86 ISA needed: ");
17840                       decode_x86_compat_isa (bitmask);
17841                     }
17842                   goto next;
17843
17844                 default:
17845                   break;
17846                 }
17847             }
17848           else if (filedata->file_header.e_machine == EM_AARCH64)
17849             {
17850               if (type == GNU_PROPERTY_AARCH64_FEATURE_1_AND)
17851                 {
17852                   printf ("AArch64 feature: ");
17853                   if (datasz != 4)
17854                     printf (_("<corrupt length: %#x> "), datasz);
17855                   else
17856                     decode_aarch64_feature_1_and (byte_get (ptr, 4));
17857                   goto next;
17858                 }
17859             }
17860         }
17861       else
17862         {
17863           switch (type)
17864             {
17865             case GNU_PROPERTY_STACK_SIZE:
17866               printf (_("stack size: "));
17867               if (datasz != size)
17868                 printf (_("<corrupt length: %#x> "), datasz);
17869               else
17870                 printf ("%#lx", (unsigned long) byte_get (ptr, size));
17871               goto next;
17872
17873             case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
17874               printf ("no copy on protected ");
17875               if (datasz)
17876                 printf (_("<corrupt length: %#x> "), datasz);
17877               goto next;
17878
17879             default:
17880               break;
17881             }
17882         }
17883
17884       if (type < GNU_PROPERTY_LOPROC)
17885         printf (_("<unknown type %#x data: "), type);
17886       else if (type < GNU_PROPERTY_LOUSER)
17887         printf (_("<procesor-specific type %#x data: "), type);
17888       else
17889         printf (_("<application-specific type %#x data: "), type);
17890       for (j = 0; j < datasz; ++j)
17891         printf ("%02x ", ptr[j] & 0xff);
17892       printf (">");
17893
17894 next:
17895       ptr += ((datasz + (size - 1)) & ~ (size - 1));
17896       if (ptr == ptr_end)
17897         break;
17898
17899       if (do_wide)
17900         printf (", ");
17901       else
17902         printf ("\n\t");
17903     }
17904
17905   printf ("\n");
17906 }
17907
17908 static bfd_boolean
17909 print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
17910 {
17911   /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type ().  */
17912   switch (pnote->type)
17913     {
17914     case NT_GNU_BUILD_ID:
17915       {
17916         unsigned long i;
17917
17918         printf (_("    Build ID: "));
17919         for (i = 0; i < pnote->descsz; ++i)
17920           printf ("%02x", pnote->descdata[i] & 0xff);
17921         printf ("\n");
17922       }
17923       break;
17924
17925     case NT_GNU_ABI_TAG:
17926       {
17927         unsigned long os, major, minor, subminor;
17928         const char *osname;
17929
17930         /* PR 17531: file: 030-599401-0.004.  */
17931         if (pnote->descsz < 16)
17932           {
17933             printf (_("    <corrupt GNU_ABI_TAG>\n"));
17934             break;
17935           }
17936
17937         os = byte_get ((unsigned char *) pnote->descdata, 4);
17938         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17939         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
17940         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
17941
17942         switch (os)
17943           {
17944           case GNU_ABI_TAG_LINUX:
17945             osname = "Linux";
17946             break;
17947           case GNU_ABI_TAG_HURD:
17948             osname = "Hurd";
17949             break;
17950           case GNU_ABI_TAG_SOLARIS:
17951             osname = "Solaris";
17952             break;
17953           case GNU_ABI_TAG_FREEBSD:
17954             osname = "FreeBSD";
17955             break;
17956           case GNU_ABI_TAG_NETBSD:
17957             osname = "NetBSD";
17958             break;
17959           case GNU_ABI_TAG_SYLLABLE:
17960             osname = "Syllable";
17961             break;
17962           case GNU_ABI_TAG_NACL:
17963             osname = "NaCl";
17964             break;
17965           default:
17966             osname = "Unknown";
17967             break;
17968           }
17969
17970         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
17971                 major, minor, subminor);
17972       }
17973       break;
17974
17975     case NT_GNU_GOLD_VERSION:
17976       {
17977         unsigned long i;
17978
17979         printf (_("    Version: "));
17980         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
17981           printf ("%c", pnote->descdata[i]);
17982         printf ("\n");
17983       }
17984       break;
17985
17986     case NT_GNU_HWCAP:
17987       {
17988         unsigned long num_entries, mask;
17989
17990         /* Hardware capabilities information.  Word 0 is the number of entries.
17991            Word 1 is a bitmask of enabled entries.  The rest of the descriptor
17992            is a series of entries, where each entry is a single byte followed
17993            by a nul terminated string.  The byte gives the bit number to test
17994            if enabled in the bitmask.  */
17995         printf (_("      Hardware Capabilities: "));
17996         if (pnote->descsz < 8)
17997           {
17998             error (_("<corrupt GNU_HWCAP>\n"));
17999             return FALSE;
18000           }
18001         num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
18002         mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
18003         printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
18004         /* FIXME: Add code to display the entries... */
18005       }
18006       break;
18007
18008     case NT_GNU_PROPERTY_TYPE_0:
18009       print_gnu_property_note (filedata, pnote);
18010       break;
18011
18012     default:
18013       /* Handle unrecognised types.  An error message should have already been
18014          created by get_gnu_elf_note_type(), so all that we need to do is to
18015          display the data.  */
18016       {
18017         unsigned long i;
18018
18019         printf (_("    Description data: "));
18020         for (i = 0; i < pnote->descsz; ++i)
18021           printf ("%02x ", pnote->descdata[i] & 0xff);
18022         printf ("\n");
18023       }
18024       break;
18025     }
18026
18027   return TRUE;
18028 }
18029
18030 static const char *
18031 get_v850_elf_note_type (enum v850_notes n_type)
18032 {
18033   static char buff[64];
18034
18035   switch (n_type)
18036     {
18037     case V850_NOTE_ALIGNMENT:  return _("Alignment of 8-byte objects");
18038     case V850_NOTE_DATA_SIZE:  return _("Sizeof double and long double");
18039     case V850_NOTE_FPU_INFO:   return _("Type of FPU support needed");
18040     case V850_NOTE_SIMD_INFO:  return _("Use of SIMD instructions");
18041     case V850_NOTE_CACHE_INFO: return _("Use of cache");
18042     case V850_NOTE_MMU_INFO:   return _("Use of MMU");
18043     default:
18044       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
18045       return buff;
18046     }
18047 }
18048
18049 static bfd_boolean
18050 print_v850_note (Elf_Internal_Note * pnote)
18051 {
18052   unsigned int val;
18053
18054   if (pnote->descsz != 4)
18055     return FALSE;
18056
18057   val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
18058
18059   if (val == 0)
18060     {
18061       printf (_("not set\n"));
18062       return TRUE;
18063     }
18064
18065   switch (pnote->type)
18066     {
18067     case V850_NOTE_ALIGNMENT:
18068       switch (val)
18069         {
18070         case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return TRUE;
18071         case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return TRUE;
18072         }
18073       break;
18074
18075     case V850_NOTE_DATA_SIZE:
18076       switch (val)
18077         {
18078         case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return TRUE;
18079         case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return TRUE;
18080         }
18081       break;
18082
18083     case V850_NOTE_FPU_INFO:
18084       switch (val)
18085         {
18086         case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return TRUE;
18087         case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return TRUE;
18088         }
18089       break;
18090
18091     case V850_NOTE_MMU_INFO:
18092     case V850_NOTE_CACHE_INFO:
18093     case V850_NOTE_SIMD_INFO:
18094       if (val == EF_RH850_SIMD)
18095         {
18096           printf (_("yes\n"));
18097           return TRUE;
18098         }
18099       break;
18100
18101     default:
18102       /* An 'unknown note type' message will already have been displayed.  */
18103       break;
18104     }
18105
18106   printf (_("unknown value: %x\n"), val);
18107   return FALSE;
18108 }
18109
18110 static bfd_boolean
18111 process_netbsd_elf_note (Elf_Internal_Note * pnote)
18112 {
18113   unsigned int version;
18114
18115   switch (pnote->type)
18116     {
18117     case NT_NETBSD_IDENT:
18118       version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
18119       if ((version / 10000) % 100)
18120         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
18121                 version, version / 100000000, (version / 1000000) % 100,
18122                 (version / 10000) % 100 > 26 ? "Z" : "",
18123                 'A' + (version / 10000) % 26);
18124       else
18125         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
18126                 version, version / 100000000, (version / 1000000) % 100,
18127                 (version / 100) % 100);
18128       return TRUE;
18129
18130     case NT_NETBSD_MARCH:
18131       printf ("  NetBSD\t\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
18132               pnote->descdata);
18133       return TRUE;
18134
18135 #ifdef   NT_NETBSD_PAX
18136     case NT_NETBSD_PAX:
18137       version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
18138       printf ("  NetBSD\t\t0x%08lx\tPaX <%s%s%s%s%s%s>\n", pnote->descsz,
18139               ((version & NT_NETBSD_PAX_MPROTECT) ? "+mprotect" : ""),
18140               ((version & NT_NETBSD_PAX_NOMPROTECT) ? "-mprotect" : ""),
18141               ((version & NT_NETBSD_PAX_GUARD) ? "+guard" : ""),
18142               ((version & NT_NETBSD_PAX_NOGUARD) ? "-guard" : ""),
18143               ((version & NT_NETBSD_PAX_ASLR) ? "+ASLR" : ""),
18144               ((version & NT_NETBSD_PAX_NOASLR) ? "-ASLR" : ""));
18145       return TRUE;
18146 #endif
18147
18148     default:
18149       printf ("  NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
18150               pnote->type);
18151       return FALSE;
18152     }
18153 }
18154
18155 static const char *
18156 get_freebsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
18157 {
18158   switch (e_type)
18159     {
18160     case NT_FREEBSD_THRMISC:
18161       return _("NT_THRMISC (thrmisc structure)");
18162     case NT_FREEBSD_PROCSTAT_PROC:
18163       return _("NT_PROCSTAT_PROC (proc data)");
18164     case NT_FREEBSD_PROCSTAT_FILES:
18165       return _("NT_PROCSTAT_FILES (files data)");
18166     case NT_FREEBSD_PROCSTAT_VMMAP:
18167       return _("NT_PROCSTAT_VMMAP (vmmap data)");
18168     case NT_FREEBSD_PROCSTAT_GROUPS:
18169       return _("NT_PROCSTAT_GROUPS (groups data)");
18170     case NT_FREEBSD_PROCSTAT_UMASK:
18171       return _("NT_PROCSTAT_UMASK (umask data)");
18172     case NT_FREEBSD_PROCSTAT_RLIMIT:
18173       return _("NT_PROCSTAT_RLIMIT (rlimit data)");
18174     case NT_FREEBSD_PROCSTAT_OSREL:
18175       return _("NT_PROCSTAT_OSREL (osreldate data)");
18176     case NT_FREEBSD_PROCSTAT_PSSTRINGS:
18177       return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
18178     case NT_FREEBSD_PROCSTAT_AUXV:
18179       return _("NT_PROCSTAT_AUXV (auxv data)");
18180     case NT_FREEBSD_PTLWPINFO:
18181       return _("NT_PTLWPINFO (ptrace_lwpinfo structure)");
18182     }
18183   return get_note_type (filedata, e_type);
18184 }
18185
18186 static const char *
18187 get_netbsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
18188 {
18189   static char buff[64];
18190
18191   switch (e_type)
18192     {
18193     case NT_NETBSDCORE_PROCINFO:
18194       /* NetBSD core "procinfo" structure.  */
18195       return _("NetBSD procinfo structure");
18196
18197 #ifdef NT_NETBSDCORE_AUXV
18198     case NT_NETBSDCORE_AUXV:
18199       return _("NetBSD ELF auxiliary vector data");
18200 #endif
18201
18202     default:
18203       /* As of Jan 2002 there are no other machine-independent notes
18204          defined for NetBSD core files.  If the note type is less
18205          than the start of the machine-dependent note types, we don't
18206          understand it.  */
18207
18208       if (e_type < NT_NETBSDCORE_FIRSTMACH)
18209         {
18210           snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
18211           return buff;
18212         }
18213       break;
18214     }
18215
18216   switch (filedata->file_header.e_machine)
18217     {
18218     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
18219        and PT_GETFPREGS == mach+2.  */
18220
18221     case EM_OLD_ALPHA:
18222     case EM_ALPHA:
18223     case EM_SPARC:
18224     case EM_SPARC32PLUS:
18225     case EM_SPARCV9:
18226       switch (e_type)
18227         {
18228         case NT_NETBSDCORE_FIRSTMACH + 0:
18229           return _("PT_GETREGS (reg structure)");
18230         case NT_NETBSDCORE_FIRSTMACH + 2:
18231           return _("PT_GETFPREGS (fpreg structure)");
18232         default:
18233           break;
18234         }
18235       break;
18236
18237     /* On SuperH, PT_GETREGS == mach+3 and PT_GETFPREGS == mach+5.
18238        There's also old PT___GETREGS40 == mach + 1 for old reg
18239        structure which lacks GBR.  */
18240     case EM_SH:
18241       switch (e_type)
18242         {
18243         case NT_NETBSDCORE_FIRSTMACH + 1:
18244           return _("PT___GETREGS40 (old reg structure)");
18245         case NT_NETBSDCORE_FIRSTMACH + 3:
18246           return _("PT_GETREGS (reg structure)");
18247         case NT_NETBSDCORE_FIRSTMACH + 5:
18248           return _("PT_GETFPREGS (fpreg structure)");
18249         default:
18250           break;
18251         }
18252       break;
18253
18254     /* On all other arch's, PT_GETREGS == mach+1 and
18255        PT_GETFPREGS == mach+3.  */
18256     default:
18257       switch (e_type)
18258         {
18259         case NT_NETBSDCORE_FIRSTMACH + 1:
18260           return _("PT_GETREGS (reg structure)");
18261         case NT_NETBSDCORE_FIRSTMACH + 3:
18262           return _("PT_GETFPREGS (fpreg structure)");
18263         default:
18264           break;
18265         }
18266     }
18267
18268   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
18269             e_type - NT_NETBSDCORE_FIRSTMACH);
18270   return buff;
18271 }
18272
18273 static const char *
18274 get_stapsdt_note_type (unsigned e_type)
18275 {
18276   static char buff[64];
18277
18278   switch (e_type)
18279     {
18280     case NT_STAPSDT:
18281       return _("NT_STAPSDT (SystemTap probe descriptors)");
18282
18283     default:
18284       break;
18285     }
18286
18287   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
18288   return buff;
18289 }
18290
18291 static bfd_boolean
18292 print_stapsdt_note (Elf_Internal_Note *pnote)
18293 {
18294   size_t len, maxlen;
18295   unsigned long addr_size = is_32bit_elf ? 4 : 8;
18296   char *data = pnote->descdata;
18297   char *data_end = pnote->descdata + pnote->descsz;
18298   bfd_vma pc, base_addr, semaphore;
18299   char *provider, *probe, *arg_fmt;
18300
18301   if (pnote->descsz < (addr_size * 3))
18302     goto stapdt_note_too_small;
18303
18304   pc = byte_get ((unsigned char *) data, addr_size);
18305   data += addr_size;
18306
18307   base_addr = byte_get ((unsigned char *) data, addr_size);
18308   data += addr_size;
18309
18310   semaphore = byte_get ((unsigned char *) data, addr_size);
18311   data += addr_size;
18312
18313   if (data >= data_end)
18314     goto stapdt_note_too_small;
18315   maxlen = data_end - data;
18316   len = strnlen (data, maxlen);
18317   if (len < maxlen)
18318     {
18319       provider = data;
18320       data += len + 1;
18321     }
18322   else
18323     goto stapdt_note_too_small;
18324
18325   if (data >= data_end)
18326     goto stapdt_note_too_small;
18327   maxlen = data_end - data;
18328   len = strnlen (data, maxlen);
18329   if (len < maxlen)
18330     {
18331       probe = data;
18332       data += len + 1;
18333     }
18334   else
18335     goto stapdt_note_too_small;
18336
18337   if (data >= data_end)
18338     goto stapdt_note_too_small;
18339   maxlen = data_end - data;
18340   len = strnlen (data, maxlen);
18341   if (len < maxlen)
18342     {
18343       arg_fmt = data;
18344       data += len + 1;
18345     }
18346   else
18347     goto stapdt_note_too_small;
18348
18349   printf (_("    Provider: %s\n"), provider);
18350   printf (_("    Name: %s\n"), probe);
18351   printf (_("    Location: "));
18352   print_vma (pc, FULL_HEX);
18353   printf (_(", Base: "));
18354   print_vma (base_addr, FULL_HEX);
18355   printf (_(", Semaphore: "));
18356   print_vma (semaphore, FULL_HEX);
18357   printf ("\n");
18358   printf (_("    Arguments: %s\n"), arg_fmt);
18359
18360   return data == data_end;
18361
18362  stapdt_note_too_small:
18363   printf (_("  <corrupt - note is too small>\n"));
18364   error (_("corrupt stapdt note - the data size is too small\n"));
18365   return FALSE;
18366 }
18367
18368 static const char *
18369 get_ia64_vms_note_type (unsigned e_type)
18370 {
18371   static char buff[64];
18372
18373   switch (e_type)
18374     {
18375     case NT_VMS_MHD:
18376       return _("NT_VMS_MHD (module header)");
18377     case NT_VMS_LNM:
18378       return _("NT_VMS_LNM (language name)");
18379     case NT_VMS_SRC:
18380       return _("NT_VMS_SRC (source files)");
18381     case NT_VMS_TITLE:
18382       return "NT_VMS_TITLE";
18383     case NT_VMS_EIDC:
18384       return _("NT_VMS_EIDC (consistency check)");
18385     case NT_VMS_FPMODE:
18386       return _("NT_VMS_FPMODE (FP mode)");
18387     case NT_VMS_LINKTIME:
18388       return "NT_VMS_LINKTIME";
18389     case NT_VMS_IMGNAM:
18390       return _("NT_VMS_IMGNAM (image name)");
18391     case NT_VMS_IMGID:
18392       return _("NT_VMS_IMGID (image id)");
18393     case NT_VMS_LINKID:
18394       return _("NT_VMS_LINKID (link id)");
18395     case NT_VMS_IMGBID:
18396       return _("NT_VMS_IMGBID (build id)");
18397     case NT_VMS_GSTNAM:
18398       return _("NT_VMS_GSTNAM (sym table name)");
18399     case NT_VMS_ORIG_DYN:
18400       return "NT_VMS_ORIG_DYN";
18401     case NT_VMS_PATCHTIME:
18402       return "NT_VMS_PATCHTIME";
18403     default:
18404       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
18405       return buff;
18406     }
18407 }
18408
18409 static bfd_boolean
18410 print_ia64_vms_note (Elf_Internal_Note * pnote)
18411 {
18412   int maxlen = pnote->descsz;
18413
18414   if (maxlen < 2 || (unsigned long) maxlen != pnote->descsz)
18415     goto desc_size_fail;
18416
18417   switch (pnote->type)
18418     {
18419     case NT_VMS_MHD:
18420       if (maxlen <= 36)
18421         goto desc_size_fail;
18422
18423       int l = (int) strnlen (pnote->descdata + 34, maxlen - 34);
18424
18425       printf (_("    Creation date  : %.17s\n"), pnote->descdata);
18426       printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
18427       if (l + 34 < maxlen)
18428         {
18429           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
18430           if (l + 35 < maxlen)
18431             printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
18432           else
18433             printf (_("    Module version : <missing>\n"));
18434         }
18435       else
18436         {
18437           printf (_("    Module name    : <missing>\n"));
18438           printf (_("    Module version : <missing>\n"));
18439         }
18440       break;
18441
18442     case NT_VMS_LNM:
18443       printf (_("   Language: %.*s\n"), maxlen, pnote->descdata);
18444       break;
18445
18446 #ifdef BFD64
18447     case NT_VMS_FPMODE:
18448       printf (_("   Floating Point mode: "));
18449       if (maxlen < 8)
18450         goto desc_size_fail;
18451       /* FIXME: Generate an error if descsz > 8 ?  */
18452
18453       printf ("0x%016" BFD_VMA_FMT "x\n",
18454               (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
18455       break;
18456
18457     case NT_VMS_LINKTIME:
18458       printf (_("   Link time: "));
18459       if (maxlen < 8)
18460         goto desc_size_fail;
18461       /* FIXME: Generate an error if descsz > 8 ?  */
18462
18463       print_vms_time
18464         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
18465       printf ("\n");
18466       break;
18467
18468     case NT_VMS_PATCHTIME:
18469       printf (_("   Patch time: "));
18470       if (maxlen < 8)
18471         goto desc_size_fail;
18472       /* FIXME: Generate an error if descsz > 8 ?  */
18473
18474       print_vms_time
18475         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
18476       printf ("\n");
18477       break;
18478
18479     case NT_VMS_ORIG_DYN:
18480       if (maxlen < 34)
18481         goto desc_size_fail;
18482
18483       printf (_("   Major id: %u,  minor id: %u\n"),
18484               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
18485               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
18486       printf (_("   Last modified  : "));
18487       print_vms_time
18488         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
18489       printf (_("\n   Link flags  : "));
18490       printf ("0x%016" BFD_VMA_FMT "x\n",
18491               (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
18492       printf (_("   Header flags: 0x%08x\n"),
18493               (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
18494       printf (_("   Image id    : %.*s\n"), maxlen - 32, pnote->descdata + 32);
18495       break;
18496 #endif
18497
18498     case NT_VMS_IMGNAM:
18499       printf (_("    Image name: %.*s\n"), maxlen, pnote->descdata);
18500       break;
18501
18502     case NT_VMS_GSTNAM:
18503       printf (_("    Global symbol table name: %.*s\n"), maxlen, pnote->descdata);
18504       break;
18505
18506     case NT_VMS_IMGID:
18507       printf (_("    Image id: %.*s\n"), maxlen, pnote->descdata);
18508       break;
18509
18510     case NT_VMS_LINKID:
18511       printf (_("    Linker id: %.*s\n"), maxlen, pnote->descdata);
18512       break;
18513
18514     default:
18515       return FALSE;
18516     }
18517
18518   return TRUE;
18519
18520  desc_size_fail:
18521   printf (_("  <corrupt - data size is too small>\n"));
18522   error (_("corrupt IA64 note: data size is too small\n"));
18523   return FALSE;
18524 }
18525
18526 /* Find the symbol associated with a build attribute that is attached
18527    to address OFFSET.  If PNAME is non-NULL then store the name of
18528    the symbol (if found) in the provided pointer,  Returns NULL if a
18529    symbol could not be found.  */
18530
18531 static Elf_Internal_Sym *
18532 get_symbol_for_build_attribute (Filedata *       filedata,
18533                                 unsigned long    offset,
18534                                 bfd_boolean      is_open_attr,
18535                                 const char **    pname)
18536 {
18537   static Filedata *         saved_filedata = NULL;
18538   static char *             strtab;
18539   static unsigned long      strtablen;
18540   static Elf_Internal_Sym * symtab;
18541   static unsigned long      nsyms;
18542   Elf_Internal_Sym *        saved_sym = NULL;
18543   Elf_Internal_Sym *        sym;
18544
18545   if (filedata->section_headers != NULL
18546       && (saved_filedata == NULL || filedata != saved_filedata))
18547     {
18548       Elf_Internal_Shdr * symsec;
18549
18550       /* Load the symbol and string sections.  */
18551       for (symsec = filedata->section_headers;
18552            symsec < filedata->section_headers + filedata->file_header.e_shnum;
18553            symsec ++)
18554         {
18555           if (symsec->sh_type == SHT_SYMTAB)
18556             {
18557               symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
18558
18559               if (symsec->sh_link < filedata->file_header.e_shnum)
18560                 {
18561                   Elf_Internal_Shdr * strtab_sec = filedata->section_headers + symsec->sh_link;
18562
18563                   strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
18564                                               1, strtab_sec->sh_size,
18565                                               _("string table"));
18566                   strtablen = strtab != NULL ? strtab_sec->sh_size : 0;
18567                 }
18568             }
18569         }
18570       saved_filedata = filedata;
18571     }
18572
18573   if (symtab == NULL || strtab == NULL)
18574     return NULL;
18575
18576   /* Find a symbol whose value matches offset.  */
18577   for (sym = symtab; sym < symtab + nsyms; sym ++)
18578     if (sym->st_value == offset)
18579       {
18580         if (sym->st_name >= strtablen)
18581           /* Huh ?  This should not happen.  */
18582           continue;
18583
18584         if (strtab[sym->st_name] == 0)
18585           continue;
18586
18587         /* The AArch64 and ARM architectures define mapping symbols
18588            (eg $d, $x, $t) which we want to ignore.  */
18589         if (strtab[sym->st_name] == '$'
18590             && strtab[sym->st_name + 1] != 0
18591             && strtab[sym->st_name + 2] == 0)
18592           continue;
18593
18594         if (is_open_attr)
18595           {
18596             /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
18597                and FILE or OBJECT symbols over NOTYPE symbols.  We skip
18598                FUNC symbols entirely.  */
18599             switch (ELF_ST_TYPE (sym->st_info))
18600               {
18601               case STT_OBJECT:
18602               case STT_FILE:
18603                 saved_sym = sym;
18604                 if (sym->st_size)
18605                   {
18606                     /* If the symbol has a size associated
18607                        with it then we can stop searching.  */
18608                     sym = symtab + nsyms;
18609                   }
18610                 continue;
18611
18612               case STT_FUNC:
18613                 /* Ignore function symbols.  */
18614                 continue;
18615
18616               default:
18617                 break;
18618               }
18619
18620             switch (ELF_ST_BIND (sym->st_info))
18621               {
18622               case STB_GLOBAL:
18623                 if (saved_sym == NULL
18624                     || ELF_ST_TYPE (saved_sym->st_info) != STT_OBJECT)
18625                   saved_sym = sym;
18626                 break;
18627
18628               case STB_LOCAL:
18629                 if (saved_sym == NULL)
18630                   saved_sym = sym;
18631                 break;
18632
18633               default:
18634                 break;
18635               }
18636           }
18637         else
18638           {
18639             if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
18640               continue;
18641
18642             saved_sym = sym;
18643             break;
18644           }
18645       }
18646
18647   if (saved_sym && pname)
18648     * pname = strtab + saved_sym->st_name;
18649
18650   return saved_sym;
18651 }
18652
18653 /* Returns true iff addr1 and addr2 are in the same section.  */
18654
18655 static bfd_boolean
18656 same_section (Filedata * filedata, unsigned long addr1, unsigned long addr2)
18657 {
18658   Elf_Internal_Shdr * a1;
18659   Elf_Internal_Shdr * a2;
18660
18661   a1 = find_section_by_address (filedata, addr1);
18662   a2 = find_section_by_address (filedata, addr2);
18663
18664   return a1 == a2 && a1 != NULL;
18665 }
18666
18667 static bfd_boolean
18668 print_gnu_build_attribute_description (Elf_Internal_Note *  pnote,
18669                                        Filedata *           filedata)
18670 {
18671   static unsigned long  global_offset = 0;
18672   static unsigned long  global_end = 0;
18673   static unsigned long  func_offset = 0;
18674   static unsigned long  func_end = 0;
18675
18676   Elf_Internal_Sym *    sym;
18677   const char *          name;
18678   unsigned long         start;
18679   unsigned long         end;
18680   bfd_boolean           is_open_attr = pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN;
18681
18682   switch (pnote->descsz)
18683     {
18684     case 0:
18685       /* A zero-length description means that the range of
18686          the previous note of the same type should be used.  */
18687       if (is_open_attr)
18688         {
18689           if (global_end > global_offset)
18690             printf (_("    Applies to region from %#lx to %#lx\n"),
18691                     global_offset, global_end);
18692           else
18693             printf (_("    Applies to region from %#lx\n"), global_offset);
18694         }
18695       else
18696         {
18697           if (func_end > func_offset)
18698             printf (_("    Applies to region from %#lx to %#lx\n"), func_offset, func_end);
18699           else
18700             printf (_("    Applies to region from %#lx\n"), func_offset);
18701         }
18702       return TRUE;
18703
18704     case 4:
18705       start = byte_get ((unsigned char *) pnote->descdata, 4);
18706       end = 0;
18707       break;
18708
18709     case 8:
18710       if (is_32bit_elf)
18711         {
18712           /* FIXME: We should check that version 3+ notes are being used here...  */
18713           start = byte_get ((unsigned char *) pnote->descdata, 4);
18714           end = byte_get ((unsigned char *) pnote->descdata + 4, 4);
18715         }
18716       else
18717         {
18718           start = byte_get ((unsigned char *) pnote->descdata, 8);
18719           end = 0;
18720         }
18721       break;
18722
18723     case 16:
18724       start = byte_get ((unsigned char *) pnote->descdata, 8);
18725       end = byte_get ((unsigned char *) pnote->descdata + 8, 8);
18726       break;
18727
18728     default:
18729       error (_("    <invalid description size: %lx>\n"), pnote->descsz);
18730       printf (_("    <invalid descsz>"));
18731       return FALSE;
18732     }
18733
18734   name = NULL;
18735   sym = get_symbol_for_build_attribute (filedata, start, is_open_attr, & name);
18736   /* As of version 5 of the annobin plugin, filename symbols are biased by 2
18737      in order to avoid them being confused with the start address of the
18738      first function in the file...  */
18739   if (sym == NULL && is_open_attr)
18740     sym = get_symbol_for_build_attribute (filedata, start + 2, is_open_attr,
18741                                           & name);
18742
18743   if (end == 0 && sym != NULL && sym->st_size > 0)
18744     end = start + sym->st_size;
18745
18746   if (is_open_attr)
18747     {
18748       /* FIXME: Need to properly allow for section alignment.
18749          16 is just the alignment used on x86_64.  */
18750       if (global_end > 0
18751           && start > BFD_ALIGN (global_end, 16)
18752           /* Build notes are not guaranteed to be organised in order of
18753              increasing address, but we should find the all of the notes
18754              for one section in the same place.  */
18755           && same_section (filedata, start, global_end))
18756         warn (_("Gap in build notes detected from %#lx to %#lx\n"),
18757               global_end + 1, start - 1);
18758
18759       printf (_("    Applies to region from %#lx"), start);
18760       global_offset = start;
18761
18762       if (end)
18763         {
18764           printf (_(" to %#lx"), end);
18765           global_end = end;
18766         }
18767     }
18768   else
18769     {
18770       printf (_("    Applies to region from %#lx"), start);
18771       func_offset = start;
18772
18773       if (end)
18774         {
18775           printf (_(" to %#lx"), end);
18776           func_end = end;
18777         }
18778     }
18779
18780   if (sym && name)
18781     printf (_(" (%s)"), name);
18782
18783   printf ("\n");
18784   return TRUE;
18785 }
18786
18787 static bfd_boolean
18788 print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
18789 {
18790   static const char string_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_STRING, 0 };
18791   static const char number_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC, 0 };
18792   static const char bool_expected [3] = { GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE, GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE, 0 };
18793   char         name_type;
18794   char         name_attribute;
18795   const char * expected_types;
18796   const char * name = pnote->namedata;
18797   const char * text;
18798   signed int   left;
18799
18800   if (name == NULL || pnote->namesz < 2)
18801     {
18802       error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
18803       print_symbol (-20, _("  <corrupt name>"));
18804       return FALSE;
18805     }
18806
18807   if (do_wide)
18808     left = 28;
18809   else
18810     left = 20;
18811
18812   /* Version 2 of the spec adds a "GA" prefix to the name field.  */
18813   if (name[0] == 'G' && name[1] == 'A')
18814     {
18815       if (pnote->namesz < 4)
18816         {
18817           error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
18818           print_symbol (-20, _("  <corrupt name>"));
18819           return FALSE;
18820         }
18821
18822       printf ("GA");
18823       name += 2;
18824       left -= 2;
18825     }
18826
18827   switch ((name_type = * name))
18828     {
18829     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18830     case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
18831     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
18832     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
18833       printf ("%c", * name);
18834       left --;
18835       break;
18836     default:
18837       error (_("unrecognised attribute type in name field: %d\n"), name_type);
18838       print_symbol (-20, _("<unknown name type>"));
18839       return FALSE;
18840     }
18841
18842   ++ name;
18843   text = NULL;
18844
18845   switch ((name_attribute = * name))
18846     {
18847     case GNU_BUILD_ATTRIBUTE_VERSION:
18848       text = _("<version>");
18849       expected_types = string_expected;
18850       ++ name;
18851       break;
18852     case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18853       text = _("<stack prot>");
18854       expected_types = "!+*";
18855       ++ name;
18856       break;
18857     case GNU_BUILD_ATTRIBUTE_RELRO:
18858       text = _("<relro>");
18859       expected_types = bool_expected;
18860       ++ name;
18861       break;
18862     case GNU_BUILD_ATTRIBUTE_STACK_SIZE:
18863       text = _("<stack size>");
18864       expected_types = number_expected;
18865       ++ name;
18866       break;
18867     case GNU_BUILD_ATTRIBUTE_TOOL:
18868       text = _("<tool>");
18869       expected_types = string_expected;
18870       ++ name;
18871       break;
18872     case GNU_BUILD_ATTRIBUTE_ABI:
18873       text = _("<ABI>");
18874       expected_types = "$*";
18875       ++ name;
18876       break;
18877     case GNU_BUILD_ATTRIBUTE_PIC:
18878       text = _("<PIC>");
18879       expected_types = number_expected;
18880       ++ name;
18881       break;
18882     case GNU_BUILD_ATTRIBUTE_SHORT_ENUM:
18883       text = _("<short enum>");
18884       expected_types = bool_expected;
18885       ++ name;
18886       break;
18887     default:
18888       if (ISPRINT (* name))
18889         {
18890           int len = strnlen (name, pnote->namesz - (name - pnote->namedata)) + 1;
18891
18892           if (len > left && ! do_wide)
18893             len = left;
18894           printf ("%.*s:", len, name);
18895           left -= len;
18896           name += len;
18897         }
18898       else
18899         {
18900           static char tmpbuf [128];
18901
18902           error (_("unrecognised byte in name field: %d\n"), * name);
18903           sprintf (tmpbuf, _("<unknown:_%d>"), * name);
18904           text = tmpbuf;
18905           name ++;
18906         }
18907       expected_types = "*$!+";
18908       break;
18909     }
18910
18911   if (text)
18912     left -= printf ("%s", text);
18913
18914   if (strchr (expected_types, name_type) == NULL)
18915     warn (_("attribute does not have an expected type (%c)\n"), name_type);
18916
18917   if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
18918     {
18919       error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
18920              (unsigned long) pnote->namesz,
18921              (long) (name - pnote->namedata));
18922       return FALSE;
18923     }
18924
18925   if (left < 1 && ! do_wide)
18926     return TRUE;
18927
18928   switch (name_type)
18929     {
18930     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18931       {
18932         unsigned int        bytes;
18933         unsigned long long  val = 0;
18934         unsigned int        shift = 0;
18935         char *              decoded = NULL;
18936
18937         bytes = pnote->namesz - (name - pnote->namedata);
18938         if (bytes > 0)
18939           /* The -1 is because the name field is always 0 terminated, and we
18940              want to be able to ensure that the shift in the while loop below
18941              will not overflow.  */
18942           -- bytes;
18943
18944         if (bytes > sizeof (val))
18945           {
18946             error (_("corrupt numeric name field: too many bytes in the value: %x\n"),
18947                    bytes);
18948             bytes = sizeof (val);
18949           }
18950         /* We do not bother to warn if bytes == 0 as this can
18951            happen with some early versions of the gcc plugin.  */
18952
18953         while (bytes --)
18954           {
18955             unsigned long byte = (* name ++) & 0xff;
18956
18957             val |= byte << shift;
18958             shift += 8;
18959           }
18960
18961         switch (name_attribute)
18962           {
18963           case GNU_BUILD_ATTRIBUTE_PIC:
18964             switch (val)
18965               {
18966               case 0: decoded = "static"; break;
18967               case 1: decoded = "pic"; break;
18968               case 2: decoded = "PIC"; break;
18969               case 3: decoded = "pie"; break;
18970               case 4: decoded = "PIE"; break;
18971               default: break;
18972               }
18973             break;
18974           case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18975             switch (val)
18976               {
18977                 /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c.  */
18978               case 0: decoded = "off"; break;
18979               case 1: decoded = "on"; break;
18980               case 2: decoded = "all"; break;
18981               case 3: decoded = "strong"; break;
18982               case 4: decoded = "explicit"; break;
18983               default: break;
18984               }
18985             break;
18986           default:
18987             break;
18988           }
18989
18990         if (decoded != NULL)
18991           {
18992             print_symbol (-left, decoded);
18993             left = 0;
18994           }
18995         else if (val == 0)
18996           {
18997             printf ("0x0");
18998             left -= 3;
18999           }
19000         else
19001           {
19002             if (do_wide)
19003               left -= printf ("0x%llx", val);
19004             else
19005               left -= printf ("0x%-.*llx", left, val);
19006           }
19007       }
19008       break;
19009     case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
19010       left -= print_symbol (- left, name);
19011       break;
19012     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
19013       left -= print_symbol (- left, "true");
19014       break;
19015     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
19016       left -= print_symbol (- left, "false");
19017       break;
19018     }
19019
19020   if (do_wide && left > 0)
19021     printf ("%-*s", left, " ");
19022
19023   return TRUE;
19024 }
19025
19026 /* Note that by the ELF standard, the name field is already null byte
19027    terminated, and namesz includes the terminating null byte.
19028    I.E. the value of namesz for the name "FSF" is 4.
19029
19030    If the value of namesz is zero, there is no name present.  */
19031
19032 static bfd_boolean
19033 process_note (Elf_Internal_Note *  pnote,
19034               Filedata *           filedata)
19035 {
19036   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
19037   const char * nt;
19038
19039   if (pnote->namesz == 0)
19040     /* If there is no note name, then use the default set of
19041        note type strings.  */
19042     nt = get_note_type (filedata, pnote->type);
19043
19044   else if (const_strneq (pnote->namedata, "GNU"))
19045     /* GNU-specific object file notes.  */
19046     nt = get_gnu_elf_note_type (pnote->type);
19047
19048   else if (const_strneq (pnote->namedata, "FreeBSD"))
19049     /* FreeBSD-specific core file notes.  */
19050     nt = get_freebsd_elfcore_note_type (filedata, pnote->type);
19051
19052   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
19053     /* NetBSD-specific core file notes.  */
19054     nt = get_netbsd_elfcore_note_type (filedata, pnote->type);
19055
19056   else if (const_strneq (pnote->namedata, "NetBSD"))
19057     /* NetBSD-specific core file notes.  */
19058     return process_netbsd_elf_note (pnote);
19059
19060   else if (const_strneq (pnote->namedata, "PaX"))
19061     /* NetBSD-specific core file notes.  */
19062     return process_netbsd_elf_note (pnote);
19063
19064   else if (strneq (pnote->namedata, "SPU/", 4))
19065     {
19066       /* SPU-specific core file notes.  */
19067       nt = pnote->namedata + 4;
19068       name = "SPU";
19069     }
19070
19071   else if (const_strneq (pnote->namedata, "IPF/VMS"))
19072     /* VMS/ia64-specific file notes.  */
19073     nt = get_ia64_vms_note_type (pnote->type);
19074
19075   else if (const_strneq (pnote->namedata, "stapsdt"))
19076     nt = get_stapsdt_note_type (pnote->type);
19077
19078   else
19079     /* Don't recognize this note name; just use the default set of
19080        note type strings.  */
19081     nt = get_note_type (filedata, pnote->type);
19082
19083   printf ("  ");
19084
19085   if (((const_strneq (pnote->namedata, "GA")
19086         && strchr ("*$!+", pnote->namedata[2]) != NULL)
19087        || strchr ("*$!+", pnote->namedata[0]) != NULL)
19088       && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
19089           || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
19090     print_gnu_build_attribute_name (pnote);
19091   else
19092     print_symbol (-20, name);
19093
19094   if (do_wide)
19095     printf (" 0x%08lx\t%s\t", pnote->descsz, nt);
19096   else
19097     printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
19098
19099   if (const_strneq (pnote->namedata, "IPF/VMS"))
19100     return print_ia64_vms_note (pnote);
19101   else if (const_strneq (pnote->namedata, "GNU"))
19102     return print_gnu_note (filedata, pnote);
19103   else if (const_strneq (pnote->namedata, "stapsdt"))
19104     return print_stapsdt_note (pnote);
19105   else if (const_strneq (pnote->namedata, "CORE"))
19106     return print_core_note (pnote);
19107   else if (((const_strneq (pnote->namedata, "GA")
19108              && strchr ("*$!+", pnote->namedata[2]) != NULL)
19109             || strchr ("*$!+", pnote->namedata[0]) != NULL)
19110            && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
19111                || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
19112     return print_gnu_build_attribute_description (pnote, filedata);
19113
19114   if (pnote->descsz)
19115     {
19116       unsigned long i;
19117
19118       printf (_("   description data: "));
19119       for (i = 0; i < pnote->descsz; i++)
19120         printf ("%02x ", pnote->descdata[i]);
19121       if (!do_wide)
19122         printf ("\n");
19123     }
19124
19125   if (do_wide)
19126     printf ("\n");
19127
19128   return TRUE;
19129 }
19130
19131 static bfd_boolean
19132 process_notes_at (Filedata *           filedata,
19133                   Elf_Internal_Shdr *  section,
19134                   bfd_vma              offset,
19135                   bfd_vma              length,
19136                   bfd_vma              align)
19137 {
19138   Elf_External_Note * pnotes;
19139   Elf_External_Note * external;
19140   char *              end;
19141   bfd_boolean         res = TRUE;
19142
19143   if (length <= 0)
19144     return FALSE;
19145
19146   if (section)
19147     {
19148       pnotes = (Elf_External_Note *) get_section_contents (section, filedata);
19149       if (pnotes)
19150         {
19151           if (! apply_relocations (filedata, section, (unsigned char *) pnotes, length, NULL, NULL))
19152             return FALSE;
19153         }
19154     }
19155   else
19156     pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
19157                                              _("notes"));
19158
19159   if (pnotes == NULL)
19160     return FALSE;
19161
19162   external = pnotes;
19163
19164   if (section)
19165     printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (filedata, section));
19166   else
19167     printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
19168             (unsigned long) offset, (unsigned long) length);
19169
19170   /* NB: Some note sections may have alignment value of 0 or 1.  gABI
19171      specifies that notes should be aligned to 4 bytes in 32-bit
19172      objects and to 8 bytes in 64-bit objects.  As a Linux extension,
19173      we also support 4 byte alignment in 64-bit objects.  If section
19174      alignment is less than 4, we treate alignment as 4 bytes.   */
19175   if (align < 4)
19176     align = 4;
19177   else if (align != 4 && align != 8)
19178     {
19179       warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
19180             (long) align);
19181       return FALSE;
19182     }
19183
19184   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
19185
19186   end = (char *) pnotes + length;
19187   while ((char *) external < end)
19188     {
19189       Elf_Internal_Note inote;
19190       size_t min_notesz;
19191       char * next;
19192       char * temp = NULL;
19193       size_t data_remaining = end - (char *) external;
19194
19195       if (!is_ia64_vms (filedata))
19196         {
19197           /* PR binutils/15191
19198              Make sure that there is enough data to read.  */
19199           min_notesz = offsetof (Elf_External_Note, name);
19200           if (data_remaining < min_notesz)
19201             {
19202               warn (ngettext ("Corrupt note: only %ld byte remains, "
19203                               "not enough for a full note\n",
19204                               "Corrupt note: only %ld bytes remain, "
19205                               "not enough for a full note\n",
19206                               data_remaining),
19207                     (long) data_remaining);
19208               break;
19209             }
19210           data_remaining -= min_notesz;
19211
19212           inote.type     = BYTE_GET (external->type);
19213           inote.namesz   = BYTE_GET (external->namesz);
19214           inote.namedata = external->name;
19215           inote.descsz   = BYTE_GET (external->descsz);
19216           inote.descdata = ((char *) external
19217                             + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
19218           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
19219           next = ((char *) external
19220                   + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
19221         }
19222       else
19223         {
19224           Elf64_External_VMS_Note *vms_external;
19225
19226           /* PR binutils/15191
19227              Make sure that there is enough data to read.  */
19228           min_notesz = offsetof (Elf64_External_VMS_Note, name);
19229           if (data_remaining < min_notesz)
19230             {
19231               warn (ngettext ("Corrupt note: only %ld byte remains, "
19232                               "not enough for a full note\n",
19233                               "Corrupt note: only %ld bytes remain, "
19234                               "not enough for a full note\n",
19235                               data_remaining),
19236                     (long) data_remaining);
19237               break;
19238             }
19239           data_remaining -= min_notesz;
19240
19241           vms_external = (Elf64_External_VMS_Note *) external;
19242           inote.type     = BYTE_GET (vms_external->type);
19243           inote.namesz   = BYTE_GET (vms_external->namesz);
19244           inote.namedata = vms_external->name;
19245           inote.descsz   = BYTE_GET (vms_external->descsz);
19246           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
19247           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
19248           next = inote.descdata + align_power (inote.descsz, 3);
19249         }
19250
19251       /* PR 17531: file: 3443835e.  */
19252       /* PR 17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4.  */
19253       if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
19254           || (size_t) (inote.descdata - inote.namedata) > data_remaining
19255           || (size_t) (next - inote.descdata) < inote.descsz
19256           || ((size_t) (next - inote.descdata)
19257               > data_remaining - (size_t) (inote.descdata - inote.namedata)))
19258         {
19259           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
19260                 (unsigned long) ((char *) external - (char *) pnotes));
19261           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
19262                 inote.type, inote.namesz, inote.descsz, (int) align);
19263           break;
19264         }
19265
19266       external = (Elf_External_Note *) next;
19267
19268       /* Verify that name is null terminated.  It appears that at least
19269          one version of Linux (RedHat 6.0) generates corefiles that don't
19270          comply with the ELF spec by failing to include the null byte in
19271          namesz.  */
19272       if (inote.namesz > 0 && inote.namedata[inote.namesz - 1] != '\0')
19273         {
19274           if ((size_t) (inote.descdata - inote.namedata) == inote.namesz)
19275             {
19276               temp = (char *) malloc (inote.namesz + 1);
19277               if (temp == NULL)
19278                 {
19279                   error (_("Out of memory allocating space for inote name\n"));
19280                   res = FALSE;
19281                   break;
19282                 }
19283
19284               memcpy (temp, inote.namedata, inote.namesz);
19285               inote.namedata = temp;
19286             }
19287           inote.namedata[inote.namesz] = 0;
19288         }
19289
19290       if (! process_note (& inote, filedata))
19291         res = FALSE;
19292
19293       if (temp != NULL)
19294         {
19295           free (temp);
19296           temp = NULL;
19297         }
19298     }
19299
19300   free (pnotes);
19301
19302   return res;
19303 }
19304
19305 static bfd_boolean
19306 process_corefile_note_segments (Filedata * filedata)
19307 {
19308   Elf_Internal_Phdr * segment;
19309   unsigned int i;
19310   bfd_boolean res = TRUE;
19311
19312   if (! get_program_headers (filedata))
19313     return TRUE;
19314
19315   for (i = 0, segment = filedata->program_headers;
19316        i < filedata->file_header.e_phnum;
19317        i++, segment++)
19318     {
19319       if (segment->p_type == PT_NOTE)
19320         if (! process_notes_at (filedata, NULL,
19321                                 (bfd_vma) segment->p_offset,
19322                                 (bfd_vma) segment->p_filesz,
19323                                 (bfd_vma) segment->p_align))
19324           res = FALSE;
19325     }
19326
19327   return res;
19328 }
19329
19330 static bfd_boolean
19331 process_v850_notes (Filedata * filedata, bfd_vma offset, bfd_vma length)
19332 {
19333   Elf_External_Note * pnotes;
19334   Elf_External_Note * external;
19335   char * end;
19336   bfd_boolean res = TRUE;
19337
19338   if (length <= 0)
19339     return FALSE;
19340
19341   pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
19342                                            _("v850 notes"));
19343   if (pnotes == NULL)
19344     return FALSE;
19345
19346   external = pnotes;
19347   end = (char*) pnotes + length;
19348
19349   printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
19350           (unsigned long) offset, (unsigned long) length);
19351
19352   while ((char *) external + sizeof (Elf_External_Note) < end)
19353     {
19354       Elf_External_Note * next;
19355       Elf_Internal_Note inote;
19356
19357       inote.type     = BYTE_GET (external->type);
19358       inote.namesz   = BYTE_GET (external->namesz);
19359       inote.namedata = external->name;
19360       inote.descsz   = BYTE_GET (external->descsz);
19361       inote.descdata = inote.namedata + align_power (inote.namesz, 2);
19362       inote.descpos  = offset + (inote.descdata - (char *) pnotes);
19363
19364       if (inote.descdata < (char *) pnotes || inote.descdata >= end)
19365         {
19366           warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
19367           inote.descdata = inote.namedata;
19368           inote.namesz   = 0;
19369         }
19370
19371       next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
19372
19373       if (   ((char *) next > end)
19374           || ((char *) next <  (char *) pnotes))
19375         {
19376           warn (_("corrupt descsz found in note at offset 0x%lx\n"),
19377                 (unsigned long) ((char *) external - (char *) pnotes));
19378           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
19379                 inote.type, inote.namesz, inote.descsz);
19380           break;
19381         }
19382
19383       external = next;
19384
19385       /* Prevent out-of-bounds indexing.  */
19386       if (   inote.namedata + inote.namesz > end
19387           || inote.namedata + inote.namesz < inote.namedata)
19388         {
19389           warn (_("corrupt namesz found in note at offset 0x%lx\n"),
19390                 (unsigned long) ((char *) external - (char *) pnotes));
19391           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
19392                 inote.type, inote.namesz, inote.descsz);
19393           break;
19394         }
19395
19396       printf ("  %s: ", get_v850_elf_note_type (inote.type));
19397
19398       if (! print_v850_note (& inote))
19399         {
19400           res = FALSE;
19401           printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
19402                   inote.namesz, inote.descsz);
19403         }
19404     }
19405
19406   free (pnotes);
19407
19408   return res;
19409 }
19410
19411 static bfd_boolean
19412 process_note_sections (Filedata * filedata)
19413 {
19414   Elf_Internal_Shdr * section;
19415   unsigned long i;
19416   unsigned int n = 0;
19417   bfd_boolean res = TRUE;
19418
19419   for (i = 0, section = filedata->section_headers;
19420        i < filedata->file_header.e_shnum && section != NULL;
19421        i++, section++)
19422     {
19423       if (section->sh_type == SHT_NOTE)
19424         {
19425           if (! process_notes_at (filedata, section,
19426                                   (bfd_vma) section->sh_offset,
19427                                   (bfd_vma) section->sh_size,
19428                                   (bfd_vma) section->sh_addralign))
19429             res = FALSE;
19430           n++;
19431         }
19432
19433       if ((   filedata->file_header.e_machine == EM_V800
19434            || filedata->file_header.e_machine == EM_V850
19435            || filedata->file_header.e_machine == EM_CYGNUS_V850)
19436           && section->sh_type == SHT_RENESAS_INFO)
19437         {
19438           if (! process_v850_notes (filedata,
19439                                     (bfd_vma) section->sh_offset,
19440                                     (bfd_vma) section->sh_size))
19441             res = FALSE;
19442           n++;
19443         }
19444     }
19445
19446   if (n == 0)
19447     /* Try processing NOTE segments instead.  */
19448     return process_corefile_note_segments (filedata);
19449
19450   return res;
19451 }
19452
19453 static bfd_boolean
19454 process_notes (Filedata * filedata)
19455 {
19456   /* If we have not been asked to display the notes then do nothing.  */
19457   if (! do_notes)
19458     return TRUE;
19459
19460   if (filedata->file_header.e_type != ET_CORE)
19461     return process_note_sections (filedata);
19462
19463   /* No program headers means no NOTE segment.  */
19464   if (filedata->file_header.e_phnum > 0)
19465     return process_corefile_note_segments (filedata);
19466
19467   printf (_("No note segments present in the core file.\n"));
19468   return TRUE;
19469 }
19470
19471 static unsigned char *
19472 display_public_gnu_attributes (unsigned char * start,
19473                                const unsigned char * const end)
19474 {
19475   printf (_("  Unknown GNU attribute: %s\n"), start);
19476
19477   start += strnlen ((char *) start, end - start);
19478   display_raw_attribute (start, end);
19479
19480   return (unsigned char *) end;
19481 }
19482
19483 static unsigned char *
19484 display_generic_attribute (unsigned char * start,
19485                            unsigned int tag,
19486                            const unsigned char * const end)
19487 {
19488   if (tag == 0)
19489     return (unsigned char *) end;
19490
19491   return display_tag_value (tag, start, end);
19492 }
19493
19494 static bfd_boolean
19495 process_arch_specific (Filedata * filedata)
19496 {
19497   if (! do_arch)
19498     return TRUE;
19499
19500   switch (filedata->file_header.e_machine)
19501     {
19502     case EM_ARC:
19503     case EM_ARC_COMPACT:
19504     case EM_ARC_COMPACT2:
19505       return process_attributes (filedata, "ARC", SHT_ARC_ATTRIBUTES,
19506                                  display_arc_attribute,
19507                                  display_generic_attribute);
19508     case EM_ARM:
19509       return process_attributes (filedata, "aeabi", SHT_ARM_ATTRIBUTES,
19510                                  display_arm_attribute,
19511                                  display_generic_attribute);
19512
19513     case EM_MIPS:
19514     case EM_MIPS_RS3_LE:
19515       return process_mips_specific (filedata);
19516
19517     case EM_MSP430:
19518      return process_attributes (filedata, "mspabi", SHT_MSP430_ATTRIBUTES,
19519                                 display_msp430x_attribute,
19520                                 display_generic_attribute);
19521
19522     case EM_RISCV:
19523      return process_attributes (filedata, "riscv", SHT_RISCV_ATTRIBUTES,
19524                                 display_riscv_attribute,
19525                                 display_generic_attribute);
19526
19527     case EM_NDS32:
19528       return process_nds32_specific (filedata);
19529
19530     case EM_PPC:
19531     case EM_PPC64:
19532       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19533                                  display_power_gnu_attribute);
19534
19535     case EM_S390:
19536     case EM_S390_OLD:
19537       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19538                                  display_s390_gnu_attribute);
19539
19540     case EM_SPARC:
19541     case EM_SPARC32PLUS:
19542     case EM_SPARCV9:
19543       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19544                                  display_sparc_gnu_attribute);
19545
19546     case EM_TI_C6000:
19547       return process_attributes (filedata, "c6xabi", SHT_C6000_ATTRIBUTES,
19548                                  display_tic6x_attribute,
19549                                  display_generic_attribute);
19550
19551     default:
19552       return process_attributes (filedata, "gnu", SHT_GNU_ATTRIBUTES,
19553                                  display_public_gnu_attributes,
19554                                  display_generic_attribute);
19555     }
19556 }
19557
19558 static bfd_boolean
19559 get_file_header (Filedata * filedata)
19560 {
19561   /* Read in the identity array.  */
19562   if (fread (filedata->file_header.e_ident, EI_NIDENT, 1, filedata->handle) != 1)
19563     return FALSE;
19564
19565   /* Determine how to read the rest of the header.  */
19566   switch (filedata->file_header.e_ident[EI_DATA])
19567     {
19568     default:
19569     case ELFDATANONE:
19570     case ELFDATA2LSB:
19571       byte_get = byte_get_little_endian;
19572       byte_put = byte_put_little_endian;
19573       break;
19574     case ELFDATA2MSB:
19575       byte_get = byte_get_big_endian;
19576       byte_put = byte_put_big_endian;
19577       break;
19578     }
19579
19580   /* For now we only support 32 bit and 64 bit ELF files.  */
19581   is_32bit_elf = (filedata->file_header.e_ident[EI_CLASS] != ELFCLASS64);
19582
19583   /* Read in the rest of the header.  */
19584   if (is_32bit_elf)
19585     {
19586       Elf32_External_Ehdr ehdr32;
19587
19588       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, filedata->handle) != 1)
19589         return FALSE;
19590
19591       filedata->file_header.e_type      = BYTE_GET (ehdr32.e_type);
19592       filedata->file_header.e_machine   = BYTE_GET (ehdr32.e_machine);
19593       filedata->file_header.e_version   = BYTE_GET (ehdr32.e_version);
19594       filedata->file_header.e_entry     = BYTE_GET (ehdr32.e_entry);
19595       filedata->file_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
19596       filedata->file_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
19597       filedata->file_header.e_flags     = BYTE_GET (ehdr32.e_flags);
19598       filedata->file_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
19599       filedata->file_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
19600       filedata->file_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
19601       filedata->file_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
19602       filedata->file_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
19603       filedata->file_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
19604     }
19605   else
19606     {
19607       Elf64_External_Ehdr ehdr64;
19608
19609       /* If we have been compiled with sizeof (bfd_vma) == 4, then
19610          we will not be able to cope with the 64bit data found in
19611          64 ELF files.  Detect this now and abort before we start
19612          overwriting things.  */
19613       if (sizeof (bfd_vma) < 8)
19614         {
19615           error (_("This instance of readelf has been built without support for a\n\
19616 64 bit data type and so it cannot read 64 bit ELF files.\n"));
19617           return FALSE;
19618         }
19619
19620       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, filedata->handle) != 1)
19621         return FALSE;
19622
19623       filedata->file_header.e_type      = BYTE_GET (ehdr64.e_type);
19624       filedata->file_header.e_machine   = BYTE_GET (ehdr64.e_machine);
19625       filedata->file_header.e_version   = BYTE_GET (ehdr64.e_version);
19626       filedata->file_header.e_entry     = BYTE_GET (ehdr64.e_entry);
19627       filedata->file_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
19628       filedata->file_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
19629       filedata->file_header.e_flags     = BYTE_GET (ehdr64.e_flags);
19630       filedata->file_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
19631       filedata->file_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
19632       filedata->file_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
19633       filedata->file_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
19634       filedata->file_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
19635       filedata->file_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
19636     }
19637
19638   if (filedata->file_header.e_shoff)
19639     {
19640       /* There may be some extensions in the first section header.  Don't
19641          bomb if we can't read it.  */
19642       if (is_32bit_elf)
19643         get_32bit_section_headers (filedata, TRUE);
19644       else
19645         get_64bit_section_headers (filedata, TRUE);
19646     }
19647
19648   return TRUE;
19649 }
19650
19651 static void
19652 close_file (Filedata * filedata)
19653 {
19654   if (filedata)
19655     {
19656       if (filedata->handle)
19657         fclose (filedata->handle);
19658       free (filedata);
19659     }
19660 }
19661
19662 void
19663 close_debug_file (void * data)
19664 {
19665   close_file ((Filedata *) data);
19666 }
19667
19668 static Filedata *
19669 open_file (const char * pathname)
19670 {
19671   struct stat  statbuf;
19672   Filedata *   filedata = NULL;
19673
19674   if (stat (pathname, & statbuf) < 0
19675       || ! S_ISREG (statbuf.st_mode))
19676     goto fail;
19677
19678   filedata = calloc (1, sizeof * filedata);
19679   if (filedata == NULL)
19680     goto fail;
19681
19682   filedata->handle = fopen (pathname, "rb");
19683   if (filedata->handle == NULL)
19684     goto fail;
19685
19686   filedata->file_size = (bfd_size_type) statbuf.st_size;
19687   filedata->file_name = pathname;
19688
19689   if (! get_file_header (filedata))
19690     goto fail;
19691
19692   if (filedata->file_header.e_shoff)
19693     {
19694       bfd_boolean res;
19695
19696       /* Read the section headers again, this time for real.  */
19697       if (is_32bit_elf)
19698         res = get_32bit_section_headers (filedata, FALSE);
19699       else
19700         res = get_64bit_section_headers (filedata, FALSE);
19701
19702       if (!res)
19703         goto fail;
19704     }
19705
19706   return filedata;
19707
19708  fail:
19709   if (filedata)
19710     {
19711       if (filedata->handle)
19712         fclose (filedata->handle);
19713       free (filedata);
19714     }
19715   return NULL;
19716 }
19717
19718 void *
19719 open_debug_file (const char * pathname)
19720 {
19721   return open_file (pathname);
19722 }
19723
19724 /* Process one ELF object file according to the command line options.
19725    This file may actually be stored in an archive.  The file is
19726    positioned at the start of the ELF object.  Returns TRUE if no
19727    problems were encountered, FALSE otherwise.  */
19728
19729 static bfd_boolean
19730 process_object (Filedata * filedata)
19731 {
19732   bfd_boolean  have_separate_files;
19733   unsigned int i;
19734   bfd_boolean res = TRUE;
19735
19736   if (! get_file_header (filedata))
19737     {
19738       error (_("%s: Failed to read file header\n"), filedata->file_name);
19739       return FALSE;
19740     }
19741
19742   /* Initialise per file variables.  */
19743   for (i = ARRAY_SIZE (version_info); i--;)
19744     version_info[i] = 0;
19745
19746   for (i = ARRAY_SIZE (dynamic_info); i--;)
19747     dynamic_info[i] = 0;
19748   dynamic_info_DT_GNU_HASH = 0;
19749
19750   /* Process the file.  */
19751   if (show_name)
19752     printf (_("\nFile: %s\n"), filedata->file_name);
19753
19754   /* Initialise the dump_sects array from the cmdline_dump_sects array.
19755      Note we do this even if cmdline_dump_sects is empty because we
19756      must make sure that the dump_sets array is zeroed out before each
19757      object file is processed.  */
19758   if (filedata->num_dump_sects > cmdline.num_dump_sects)
19759     memset (filedata->dump_sects, 0, filedata->num_dump_sects * sizeof (* filedata->dump_sects));
19760
19761   if (cmdline.num_dump_sects > 0)
19762     {
19763       if (filedata->num_dump_sects == 0)
19764         /* A sneaky way of allocating the dump_sects array.  */
19765         request_dump_bynumber (filedata, cmdline.num_dump_sects, 0);
19766
19767       assert (filedata->num_dump_sects >= cmdline.num_dump_sects);
19768       memcpy (filedata->dump_sects, cmdline.dump_sects,
19769               cmdline.num_dump_sects * sizeof (* filedata->dump_sects));
19770     }
19771
19772   if (! process_file_header (filedata))
19773     return FALSE;
19774
19775   if (! process_section_headers (filedata))
19776     {
19777       /* Without loaded section headers we cannot process lots of things.  */
19778       do_unwind = do_version = do_dump = do_arch = FALSE;
19779
19780       if (! do_using_dynamic)
19781         do_syms = do_dyn_syms = do_reloc = FALSE;
19782     }
19783
19784   if (! process_section_groups (filedata))
19785     /* Without loaded section groups we cannot process unwind.  */
19786     do_unwind = FALSE;
19787
19788   if (process_program_headers (filedata))
19789     process_dynamic_section (filedata);
19790   else
19791     res = FALSE;
19792
19793   if (! process_relocs (filedata))
19794     res = FALSE;
19795
19796   if (! process_unwind (filedata))
19797     res = FALSE;
19798
19799   if (! process_symbol_table (filedata))
19800     res = FALSE;
19801
19802   if (! process_syminfo (filedata))
19803     res = FALSE;
19804
19805   if (! process_version_sections (filedata))
19806     res = FALSE;
19807
19808   if (filedata->file_header.e_shstrndx != SHN_UNDEF)
19809     have_separate_files = load_separate_debug_files (filedata, filedata->file_name);
19810   else
19811     have_separate_files = FALSE;
19812
19813   if (! process_section_contents (filedata))
19814     res = FALSE;
19815
19816   if (have_separate_files)
19817     {
19818       separate_info * d;
19819
19820       for (d = first_separate_info; d != NULL; d = d->next)
19821         {
19822           if (! process_section_headers (d->handle))
19823             res = FALSE;
19824           else if (! process_section_contents (d->handle))
19825             res = FALSE;
19826         }
19827
19828       /* The file handles are closed by the call to free_debug_memory() below.  */
19829     }
19830
19831   if (! process_notes (filedata))
19832     res = FALSE;
19833
19834   if (! process_gnu_liblist (filedata))
19835     res = FALSE;
19836
19837   if (! process_arch_specific (filedata))
19838     res = FALSE;
19839
19840   free (filedata->program_headers);
19841   filedata->program_headers = NULL;
19842
19843   free (filedata->section_headers);
19844   filedata->section_headers = NULL;
19845
19846   free (filedata->string_table);
19847   filedata->string_table = NULL;
19848   filedata->string_table_length = 0;
19849
19850   if (dynamic_strings)
19851     {
19852       free (dynamic_strings);
19853       dynamic_strings = NULL;
19854       dynamic_strings_length = 0;
19855     }
19856
19857   if (dynamic_symbols)
19858     {
19859       free (dynamic_symbols);
19860       dynamic_symbols = NULL;
19861       num_dynamic_syms = 0;
19862     }
19863
19864   if (dynamic_syminfo)
19865     {
19866       free (dynamic_syminfo);
19867       dynamic_syminfo = NULL;
19868     }
19869
19870   if (dynamic_section)
19871     {
19872       free (dynamic_section);
19873       dynamic_section = NULL;
19874     }
19875
19876   if (section_headers_groups)
19877     {
19878       free (section_headers_groups);
19879       section_headers_groups = NULL;
19880     }
19881
19882   if (section_groups)
19883     {
19884       struct group_list * g;
19885       struct group_list * next;
19886
19887       for (i = 0; i < group_count; i++)
19888         {
19889           for (g = section_groups [i].root; g != NULL; g = next)
19890             {
19891               next = g->next;
19892               free (g);
19893             }
19894         }
19895
19896       free (section_groups);
19897       section_groups = NULL;
19898     }
19899
19900   free_debug_memory ();
19901
19902   return res;
19903 }
19904
19905 /* Process an ELF archive.
19906    On entry the file is positioned just after the ARMAG string.
19907    Returns TRUE upon success, FALSE otherwise.  */
19908
19909 static bfd_boolean
19910 process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
19911 {
19912   struct archive_info arch;
19913   struct archive_info nested_arch;
19914   size_t got;
19915   bfd_boolean ret = TRUE;
19916
19917   show_name = TRUE;
19918
19919   /* The ARCH structure is used to hold information about this archive.  */
19920   arch.file_name = NULL;
19921   arch.file = NULL;
19922   arch.index_array = NULL;
19923   arch.sym_table = NULL;
19924   arch.longnames = NULL;
19925
19926   /* The NESTED_ARCH structure is used as a single-item cache of information
19927      about a nested archive (when members of a thin archive reside within
19928      another regular archive file).  */
19929   nested_arch.file_name = NULL;
19930   nested_arch.file = NULL;
19931   nested_arch.index_array = NULL;
19932   nested_arch.sym_table = NULL;
19933   nested_arch.longnames = NULL;
19934
19935   if (setup_archive (&arch, filedata->file_name, filedata->handle,
19936                      is_thin_archive, do_archive_index) != 0)
19937     {
19938       ret = FALSE;
19939       goto out;
19940     }
19941
19942   if (do_archive_index)
19943     {
19944       if (arch.sym_table == NULL)
19945         error (_("%s: unable to dump the index as none was found\n"), filedata->file_name);
19946       else
19947         {
19948           unsigned long i, l;
19949           unsigned long current_pos;
19950
19951           printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
19952                   filedata->file_name, (unsigned long) arch.index_num, arch.sym_size);
19953
19954           current_pos = ftell (filedata->handle);
19955
19956           for (i = l = 0; i < arch.index_num; i++)
19957             {
19958               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
19959                 {
19960                   char * member_name;
19961
19962                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
19963
19964                   if (member_name != NULL)
19965                     {
19966                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
19967
19968                       if (qualified_name != NULL)
19969                         {
19970                           printf (_("Contents of binary %s at offset "), qualified_name);
19971                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
19972                           putchar ('\n');
19973                           free (qualified_name);
19974                         }
19975                     }
19976                 }
19977
19978               if (l >= arch.sym_size)
19979                 {
19980                   error (_("%s: end of the symbol table reached before the end of the index\n"),
19981                          filedata->file_name);
19982                   ret = FALSE;
19983                   break;
19984                 }
19985               /* PR 17531: file: 0b6630b2.  */
19986               printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
19987               l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
19988             }
19989
19990           if (arch.uses_64bit_indices)
19991             l = (l + 7) & ~ 7;
19992           else
19993             l += l & 1;
19994
19995           if (l < arch.sym_size)
19996             {
19997               error (ngettext ("%s: %ld byte remains in the symbol table, "
19998                                "but without corresponding entries in "
19999                                "the index table\n",
20000                                "%s: %ld bytes remain in the symbol table, "
20001                                "but without corresponding entries in "
20002                                "the index table\n",
20003                                arch.sym_size - l),
20004                      filedata->file_name, arch.sym_size - l);
20005               ret = FALSE;
20006             }
20007
20008           if (fseek (filedata->handle, current_pos, SEEK_SET) != 0)
20009             {
20010               error (_("%s: failed to seek back to start of object files in the archive\n"),
20011                      filedata->file_name);
20012               ret = FALSE;
20013               goto out;
20014             }
20015         }
20016
20017       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
20018           && !do_segments && !do_header && !do_dump && !do_version
20019           && !do_histogram && !do_debugging && !do_arch && !do_notes
20020           && !do_section_groups && !do_dyn_syms)
20021         {
20022           ret = TRUE; /* Archive index only.  */
20023           goto out;
20024         }
20025     }
20026
20027   while (1)
20028     {
20029       char * name;
20030       size_t namelen;
20031       char * qualified_name;
20032
20033       /* Read the next archive header.  */
20034       if (fseek (filedata->handle, arch.next_arhdr_offset, SEEK_SET) != 0)
20035         {
20036           error (_("%s: failed to seek to next archive header\n"), arch.file_name);
20037           return FALSE;
20038         }
20039       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, filedata->handle);
20040       if (got != sizeof arch.arhdr)
20041         {
20042           if (got == 0)
20043             break;
20044           /* PR 24049 - we cannot use filedata->file_name as this will
20045              have already been freed.  */
20046           error (_("%s: failed to read archive header\n"), arch.file_name);
20047
20048           ret = FALSE;
20049           break;
20050         }
20051       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
20052         {
20053           error (_("%s: did not find a valid archive header\n"), arch.file_name);
20054           ret = FALSE;
20055           break;
20056         }
20057
20058       arch.next_arhdr_offset += sizeof arch.arhdr;
20059
20060       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
20061       if (archive_file_size & 01)
20062         ++archive_file_size;
20063
20064       name = get_archive_member_name (&arch, &nested_arch);
20065       if (name == NULL)
20066         {
20067           error (_("%s: bad archive file name\n"), arch.file_name);
20068           ret = FALSE;
20069           break;
20070         }
20071       namelen = strlen (name);
20072
20073       qualified_name = make_qualified_name (&arch, &nested_arch, name);
20074       if (qualified_name == NULL)
20075         {
20076           error (_("%s: bad archive file name\n"), arch.file_name);
20077           ret = FALSE;
20078           break;
20079         }
20080
20081       if (is_thin_archive && arch.nested_member_origin == 0)
20082         {
20083           /* This is a proxy for an external member of a thin archive.  */
20084           Filedata * member_filedata;
20085           char * member_file_name = adjust_relative_path
20086             (filedata->file_name, name, namelen);
20087
20088           if (member_file_name == NULL)
20089             {
20090               ret = FALSE;
20091               break;
20092             }
20093
20094           member_filedata = open_file (member_file_name);
20095           if (member_filedata == NULL)
20096             {
20097               error (_("Input file '%s' is not readable.\n"), member_file_name);
20098               free (member_file_name);
20099               ret = FALSE;
20100               break;
20101             }
20102
20103           archive_file_offset = arch.nested_member_origin;
20104           member_filedata->file_name = qualified_name;
20105
20106           if (! process_object (member_filedata))
20107             ret = FALSE;
20108
20109           close_file (member_filedata);
20110           free (member_file_name);
20111         }
20112       else if (is_thin_archive)
20113         {
20114           Filedata thin_filedata;
20115
20116           memset (&thin_filedata, 0, sizeof (thin_filedata));
20117
20118           /* PR 15140: Allow for corrupt thin archives.  */
20119           if (nested_arch.file == NULL)
20120             {
20121               error (_("%s: contains corrupt thin archive: %s\n"),
20122                      qualified_name, name);
20123               ret = FALSE;
20124               break;
20125             }
20126
20127           /* This is a proxy for a member of a nested archive.  */
20128           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
20129
20130           /* The nested archive file will have been opened and setup by
20131              get_archive_member_name.  */
20132           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
20133             {
20134               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
20135               ret = FALSE;
20136               break;
20137             }
20138
20139           thin_filedata.handle = nested_arch.file;
20140           thin_filedata.file_name = qualified_name;
20141
20142           if (! process_object (& thin_filedata))
20143             ret = FALSE;
20144         }
20145       else
20146         {
20147           archive_file_offset = arch.next_arhdr_offset;
20148           arch.next_arhdr_offset += archive_file_size;
20149
20150           filedata->file_name = qualified_name;
20151           if (! process_object (filedata))
20152             ret = FALSE;
20153         }
20154
20155       if (filedata->dump_sects != NULL)
20156         {
20157           free (filedata->dump_sects);
20158           filedata->dump_sects = NULL;
20159           filedata->num_dump_sects = 0;
20160         }
20161
20162       free (qualified_name);
20163     }
20164
20165  out:
20166   if (nested_arch.file != NULL)
20167     fclose (nested_arch.file);
20168   release_archive (&nested_arch);
20169   release_archive (&arch);
20170
20171   return ret;
20172 }
20173
20174 static bfd_boolean
20175 process_file (char * file_name)
20176 {
20177   Filedata * filedata = NULL;
20178   struct stat statbuf;
20179   char armag[SARMAG];
20180   bfd_boolean ret = TRUE;
20181
20182   if (stat (file_name, &statbuf) < 0)
20183     {
20184       if (errno == ENOENT)
20185         error (_("'%s': No such file\n"), file_name);
20186       else
20187         error (_("Could not locate '%s'.  System error message: %s\n"),
20188                file_name, strerror (errno));
20189       return FALSE;
20190     }
20191
20192   if (! S_ISREG (statbuf.st_mode))
20193     {
20194       error (_("'%s' is not an ordinary file\n"), file_name);
20195       return FALSE;
20196     }
20197
20198   filedata = calloc (1, sizeof * filedata);
20199   if (filedata == NULL)
20200     {
20201       error (_("Out of memory allocating file data structure\n"));
20202       return FALSE;
20203     }
20204
20205   filedata->file_name = file_name;
20206   filedata->handle = fopen (file_name, "rb");
20207   if (filedata->handle == NULL)
20208     {
20209       error (_("Input file '%s' is not readable.\n"), file_name);
20210       free (filedata);
20211       return FALSE;
20212     }
20213
20214   if (fread (armag, SARMAG, 1, filedata->handle) != 1)
20215     {
20216       error (_("%s: Failed to read file's magic number\n"), file_name);
20217       fclose (filedata->handle);
20218       free (filedata);
20219       return FALSE;
20220     }
20221
20222   filedata->file_size = (bfd_size_type) statbuf.st_size;
20223
20224   if (memcmp (armag, ARMAG, SARMAG) == 0)
20225     {
20226       if (! process_archive (filedata, FALSE))
20227         ret = FALSE;
20228     }
20229   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
20230     {
20231       if ( ! process_archive (filedata, TRUE))
20232         ret = FALSE;
20233     }
20234   else
20235     {
20236       if (do_archive_index)
20237         error (_("File %s is not an archive so its index cannot be displayed.\n"),
20238                file_name);
20239
20240       rewind (filedata->handle);
20241       archive_file_size = archive_file_offset = 0;
20242
20243       if (! process_object (filedata))
20244         ret = FALSE;
20245     }
20246
20247   fclose (filedata->handle);
20248   free (filedata);
20249
20250   return ret;
20251 }
20252
20253 #ifdef SUPPORT_DISASSEMBLY
20254 /* Needed by the i386 disassembler.  For extra credit, someone could
20255    fix this so that we insert symbolic addresses here, esp for GOT/PLT
20256    symbols.  */
20257
20258 void
20259 print_address (unsigned int addr, FILE * outfile)
20260 {
20261   fprintf (outfile,"0x%8.8x", addr);
20262 }
20263
20264 /* Needed by the i386 disassembler.  */
20265
20266 void
20267 db_task_printsym (unsigned int addr)
20268 {
20269   print_address (addr, stderr);
20270 }
20271 #endif
20272
20273 int
20274 main (int argc, char ** argv)
20275 {
20276   int err;
20277
20278 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
20279   setlocale (LC_MESSAGES, "");
20280 #endif
20281 #if defined (HAVE_SETLOCALE)
20282   setlocale (LC_CTYPE, "");
20283 #endif
20284   bindtextdomain (PACKAGE, LOCALEDIR);
20285   textdomain (PACKAGE);
20286
20287   expandargv (&argc, &argv);
20288
20289   cmdline.file_name = "<cmdline>";
20290   parse_args (& cmdline, argc, argv);
20291
20292   if (optind < (argc - 1))
20293     show_name = TRUE;
20294   else if (optind >= argc)
20295     {
20296       warn (_("Nothing to do.\n"));
20297       usage (stderr);
20298     }
20299
20300   err = FALSE;
20301   while (optind < argc)
20302     if (! process_file (argv[optind++]))
20303       err = TRUE;
20304
20305   if (cmdline.dump_sects != NULL)
20306     free (cmdline.dump_sects);
20307
20308   free (dump_ctf_symtab_name);
20309   free (dump_ctf_strtab_name);
20310   free (dump_ctf_parent_name);
20311
20312   return err ? EXIT_FAILURE : EXIT_SUCCESS;
20313 }