[binutils, ARM, 1/16] Add support for Armv8.1-M Mainline CLI
[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
64 #include "elf/common.h"
65 #include "elf/external.h"
66 #include "elf/internal.h"
67
68
69 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
70    we can obtain the H8 reloc numbers.  We need these for the
71    get_reloc_size() function.  We include h8.h again after defining
72    RELOC_MACROS_GEN_FUNC so that we get the naming function as well.  */
73
74 #include "elf/h8.h"
75 #undef _ELF_H8_H
76
77 /* Undo the effects of #including reloc-macros.h.  */
78
79 #undef START_RELOC_NUMBERS
80 #undef RELOC_NUMBER
81 #undef FAKE_RELOC
82 #undef EMPTY_RELOC
83 #undef END_RELOC_NUMBERS
84 #undef _RELOC_MACROS_H
85
86 /* The following headers use the elf/reloc-macros.h file to
87    automatically generate relocation recognition functions
88    such as elf_mips_reloc_type()  */
89
90 #define RELOC_MACROS_GEN_FUNC
91
92 #include "elf/aarch64.h"
93 #include "elf/alpha.h"
94 #include "elf/arc.h"
95 #include "elf/arm.h"
96 #include "elf/avr.h"
97 #include "elf/bfin.h"
98 #include "elf/cr16.h"
99 #include "elf/cris.h"
100 #include "elf/crx.h"
101 #include "elf/csky.h"
102 #include "elf/d10v.h"
103 #include "elf/d30v.h"
104 #include "elf/dlx.h"
105 #include "elf/epiphany.h"
106 #include "elf/fr30.h"
107 #include "elf/frv.h"
108 #include "elf/ft32.h"
109 #include "elf/h8.h"
110 #include "elf/hppa.h"
111 #include "elf/i386.h"
112 #include "elf/i370.h"
113 #include "elf/i860.h"
114 #include "elf/i960.h"
115 #include "elf/ia64.h"
116 #include "elf/ip2k.h"
117 #include "elf/lm32.h"
118 #include "elf/iq2000.h"
119 #include "elf/m32c.h"
120 #include "elf/m32r.h"
121 #include "elf/m68k.h"
122 #include "elf/m68hc11.h"
123 #include "elf/s12z.h"
124 #include "elf/mcore.h"
125 #include "elf/mep.h"
126 #include "elf/metag.h"
127 #include "elf/microblaze.h"
128 #include "elf/mips.h"
129 #include "elf/mmix.h"
130 #include "elf/mn10200.h"
131 #include "elf/mn10300.h"
132 #include "elf/moxie.h"
133 #include "elf/mt.h"
134 #include "elf/msp430.h"
135 #include "elf/nds32.h"
136 #include "elf/nfp.h"
137 #include "elf/nios2.h"
138 #include "elf/or1k.h"
139 #include "elf/pj.h"
140 #include "elf/ppc.h"
141 #include "elf/ppc64.h"
142 #include "elf/pru.h"
143 #include "elf/riscv.h"
144 #include "elf/rl78.h"
145 #include "elf/rx.h"
146 #include "elf/s390.h"
147 #include "elf/score.h"
148 #include "elf/sh.h"
149 #include "elf/sparc.h"
150 #include "elf/spu.h"
151 #include "elf/tic6x.h"
152 #include "elf/tilegx.h"
153 #include "elf/tilepro.h"
154 #include "elf/v850.h"
155 #include "elf/vax.h"
156 #include "elf/visium.h"
157 #include "elf/wasm32.h"
158 #include "elf/x86-64.h"
159 #include "elf/xc16x.h"
160 #include "elf/xgate.h"
161 #include "elf/xstormy16.h"
162 #include "elf/xtensa.h"
163
164 #include "getopt.h"
165 #include "libiberty.h"
166 #include "safe-ctype.h"
167 #include "filenames.h"
168
169 #ifndef offsetof
170 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
171 #endif
172
173 typedef struct elf_section_list
174 {
175   Elf_Internal_Shdr *        hdr;
176   struct elf_section_list *  next;
177 } elf_section_list;
178
179 /* Flag bits indicating particular types of dump.  */
180 #define HEX_DUMP        (1 << 0)        /* The -x command line switch.  */
181 #define DISASS_DUMP     (1 << 1)        /* The -i command line switch.  */
182 #define DEBUG_DUMP      (1 << 2)        /* The -w command line switch.  */
183 #define STRING_DUMP     (1 << 3)        /* The -p command line switch.  */
184 #define RELOC_DUMP      (1 << 4)        /* The -R command line switch.  */
185
186 typedef unsigned char dump_type;
187
188 /* A linked list of the section names for which dumps were requested.  */
189 struct dump_list_entry
190 {
191   char *                    name;
192   dump_type                 type;
193   struct dump_list_entry *  next;
194 };
195
196 typedef struct filedata
197 {
198   const char *         file_name;
199   FILE *               handle;
200   bfd_size_type        file_size;
201   Elf_Internal_Ehdr    file_header;
202   Elf_Internal_Shdr *  section_headers;
203   Elf_Internal_Phdr *  program_headers;
204   char *               string_table;
205   unsigned long        string_table_length;
206   /* A dynamic array of flags indicating for which sections a dump of
207      some kind has been requested.  It is reset on a per-object file
208      basis and then initialised from the cmdline_dump_sects array,
209      the results of interpreting the -w switch, and the
210      dump_sects_byname list.  */
211   dump_type *          dump_sects;
212   unsigned int         num_dump_sects;
213 } Filedata;
214
215 char * program_name = "readelf";
216
217 static unsigned long archive_file_offset;
218 static unsigned long archive_file_size;
219 static unsigned long dynamic_addr;
220 static bfd_size_type dynamic_size;
221 static size_t dynamic_nent;
222 static char * dynamic_strings;
223 static unsigned long dynamic_strings_length;
224 static unsigned long num_dynamic_syms;
225 static Elf_Internal_Sym * dynamic_symbols;
226 static Elf_Internal_Syminfo * dynamic_syminfo;
227 static unsigned long dynamic_syminfo_offset;
228 static unsigned int dynamic_syminfo_nent;
229 static char program_interpreter[PATH_MAX];
230 static bfd_vma dynamic_info[DT_ENCODING];
231 static bfd_vma dynamic_info_DT_GNU_HASH;
232 static bfd_vma version_info[16];
233 static Elf_Internal_Dyn *  dynamic_section;
234 static elf_section_list * symtab_shndx_list;
235 static bfd_boolean show_name = FALSE;
236 static bfd_boolean do_dynamic = FALSE;
237 static bfd_boolean do_syms = FALSE;
238 static bfd_boolean do_dyn_syms = FALSE;
239 static bfd_boolean do_reloc = FALSE;
240 static bfd_boolean do_sections = FALSE;
241 static bfd_boolean do_section_groups = FALSE;
242 static bfd_boolean do_section_details = FALSE;
243 static bfd_boolean do_segments = FALSE;
244 static bfd_boolean do_unwind = FALSE;
245 static bfd_boolean do_using_dynamic = FALSE;
246 static bfd_boolean do_header = FALSE;
247 static bfd_boolean do_dump = FALSE;
248 static bfd_boolean do_version = FALSE;
249 static bfd_boolean do_histogram = FALSE;
250 static bfd_boolean do_debugging = FALSE;
251 static bfd_boolean do_arch = FALSE;
252 static bfd_boolean do_notes = FALSE;
253 static bfd_boolean do_archive_index = FALSE;
254 static bfd_boolean is_32bit_elf = FALSE;
255 static bfd_boolean decompress_dumps = FALSE;
256
257 struct group_list
258 {
259   struct group_list *  next;
260   unsigned int         section_index;
261 };
262
263 struct group
264 {
265   struct group_list *  root;
266   unsigned int         group_index;
267 };
268
269 static size_t           group_count;
270 static struct group *   section_groups;
271 static struct group **  section_headers_groups;
272
273 /* A dynamic array of flags indicating for which sections a dump
274    has been requested via command line switches.  */
275 static Filedata         cmdline;
276
277 static struct dump_list_entry * dump_sects_byname;
278
279 /* How to print a vma value.  */
280 typedef enum print_mode
281 {
282   HEX,
283   DEC,
284   DEC_5,
285   UNSIGNED,
286   PREFIX_HEX,
287   FULL_HEX,
288   LONG_HEX
289 }
290 print_mode;
291
292 /* Versioned symbol info.  */
293 enum versioned_symbol_info
294 {
295   symbol_undefined,
296   symbol_hidden,
297   symbol_public
298 };
299
300 static const char * get_symbol_version_string
301   (Filedata *, bfd_boolean, const char *, unsigned long, unsigned,
302    Elf_Internal_Sym *, enum versioned_symbol_info *, unsigned short *);
303
304 #define UNKNOWN -1
305
306 #define SECTION_NAME(X)                                         \
307   ((X) == NULL ? _("<none>")                                    \
308    : filedata->string_table == NULL ? _("<no-strings>")         \
309    : ((X)->sh_name >= filedata->string_table_length ? _("<corrupt>")    \
310   : filedata->string_table + (X)->sh_name))
311
312 #define DT_VERSIONTAGIDX(tag)   (DT_VERNEEDNUM - (tag)) /* Reverse order!  */
313
314 #define GET_ELF_SYMBOLS(file, section, sym_count)                       \
315   (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count)      \
316    : get_64bit_elf_symbols (file, section, sym_count))
317
318 #define VALID_DYNAMIC_NAME(offset)      ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
319 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
320    already been called and verified that the string exists.  */
321 #define GET_DYNAMIC_NAME(offset)        (dynamic_strings + offset)
322
323 #define REMOVE_ARCH_BITS(ADDR)                  \
324   do                                            \
325     {                                           \
326       if (filedata->file_header.e_machine == EM_ARM)    \
327         (ADDR) &= ~1;                           \
328     }                                           \
329   while (0)
330 \f
331 /* Print a BFD_VMA to an internal buffer, for use in error messages.
332    BFD_FMA_FMT can't be used in translated strings.  */
333
334 static const char *
335 bfd_vmatoa (char *fmtch, bfd_vma value)
336 {
337   /* bfd_vmatoa is used more then once in a printf call for output.
338      Cycle through an array of buffers.  */
339   static int buf_pos = 0;
340   static struct bfd_vmatoa_buf
341   {
342     char place[64];
343   } buf[4];
344   char *ret;
345   char fmt[32];
346
347   ret = buf[buf_pos++].place;
348   buf_pos %= ARRAY_SIZE (buf);
349
350   sprintf (fmt, "%%%s%s", BFD_VMA_FMT, fmtch);
351   snprintf (ret, sizeof (buf[0].place), fmt, value);
352   return ret;
353 }
354
355 /* Retrieve NMEMB structures, each SIZE bytes long from FILEDATA starting at
356    OFFSET + the offset of the current archive member, if we are examining an
357    archive.  Put the retrieved data into VAR, if it is not NULL.  Otherwise
358    allocate a buffer using malloc and fill that.  In either case return the
359    pointer to the start of the retrieved data or NULL if something went wrong.
360    If something does go wrong and REASON is not NULL then emit an error
361    message using REASON as part of the context.  */
362
363 static void *
364 get_data (void *         var,
365           Filedata *     filedata,
366           unsigned long  offset,
367           bfd_size_type  size,
368           bfd_size_type  nmemb,
369           const char *   reason)
370 {
371   void * mvar;
372   bfd_size_type amt = size * nmemb;
373
374   if (size == 0 || nmemb == 0)
375     return NULL;
376
377   /* If the size_t type is smaller than the bfd_size_type, eg because
378      you are building a 32-bit tool on a 64-bit host, then make sure
379      that when the sizes are cast to (size_t) no information is lost.  */
380   if (sizeof (size_t) < sizeof (bfd_size_type)
381       && (   (bfd_size_type) ((size_t) size) != size
382           || (bfd_size_type) ((size_t) nmemb) != nmemb))
383     {
384       if (reason)
385         error (_("Size truncation prevents reading %s"
386                  " elements of size %s for %s\n"),
387                bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
388       return NULL;
389     }
390
391   /* Check for size overflow.  */
392   if (amt < nmemb)
393     {
394       if (reason)
395         error (_("Size overflow prevents reading %s"
396                  " elements of size %s for %s\n"),
397                bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
398       return NULL;
399     }
400
401   /* Be kind to memory checkers (eg valgrind, address sanitizer) by not
402      attempting to allocate memory when the read is bound to fail.  */
403   if (archive_file_offset > filedata->file_size
404       || offset > filedata->file_size - archive_file_offset
405       || amt > filedata->file_size - archive_file_offset - offset)
406     {
407       if (reason)
408         error (_("Reading %s bytes extends past end of file for %s\n"),
409                bfd_vmatoa ("u", amt), reason);
410       return NULL;
411     }
412
413   if (fseek (filedata->handle, archive_file_offset + offset, SEEK_SET))
414     {
415       if (reason)
416         error (_("Unable to seek to 0x%lx for %s\n"),
417                archive_file_offset + offset, reason);
418       return NULL;
419     }
420
421   mvar = var;
422   if (mvar == NULL)
423     {
424       /* Check for overflow.  */
425       if (nmemb < (~(bfd_size_type) 0 - 1) / size)
426         /* + 1 so that we can '\0' terminate invalid string table sections.  */
427         mvar = malloc ((size_t) amt + 1);
428
429       if (mvar == NULL)
430         {
431           if (reason)
432             error (_("Out of memory allocating %s bytes for %s\n"),
433                    bfd_vmatoa ("u", amt), reason);
434           return NULL;
435         }
436
437       ((char *) mvar)[amt] = '\0';
438     }
439
440   if (fread (mvar, (size_t) size, (size_t) nmemb, filedata->handle) != nmemb)
441     {
442       if (reason)
443         error (_("Unable to read in %s bytes of %s\n"),
444                bfd_vmatoa ("u", amt), reason);
445       if (mvar != var)
446         free (mvar);
447       return NULL;
448     }
449
450   return mvar;
451 }
452
453 /* Print a VMA value in the MODE specified.
454    Returns the number of characters displayed.  */
455
456 static unsigned int
457 print_vma (bfd_vma vma, print_mode mode)
458 {
459   unsigned int nc = 0;
460
461   switch (mode)
462     {
463     case FULL_HEX:
464       nc = printf ("0x");
465       /* Fall through.  */
466     case LONG_HEX:
467 #ifdef BFD64
468       if (is_32bit_elf)
469         return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
470 #endif
471       printf_vma (vma);
472       return nc + 16;
473
474     case DEC_5:
475       if (vma <= 99999)
476         return printf ("%5" BFD_VMA_FMT "d", vma);
477       /* Fall through.  */
478     case PREFIX_HEX:
479       nc = printf ("0x");
480       /* Fall through.  */
481     case HEX:
482       return nc + printf ("%" BFD_VMA_FMT "x", vma);
483
484     case DEC:
485       return printf ("%" BFD_VMA_FMT "d", vma);
486
487     case UNSIGNED:
488       return printf ("%" BFD_VMA_FMT "u", vma);
489
490     default:
491       /* FIXME: Report unrecognised mode ?  */
492       return 0;
493     }
494 }
495
496 /* Display a symbol on stdout.  Handles the display of control characters and
497    multibye characters (assuming the host environment supports them).
498
499    Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
500
501    If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
502    padding as necessary.
503
504    Returns the number of emitted characters.  */
505
506 static unsigned int
507 print_symbol (signed int width, const char *symbol)
508 {
509   bfd_boolean extra_padding = FALSE;
510   signed int num_printed = 0;
511 #ifdef HAVE_MBSTATE_T
512   mbstate_t state;
513 #endif
514   unsigned int width_remaining;
515
516   if (width < 0)
517     {
518       /* Keep the width positive.  This helps the code below.  */
519       width = - width;
520       extra_padding = TRUE;
521     }
522   else if (width == 0)
523     return 0;
524
525   if (do_wide)
526     /* Set the remaining width to a very large value.
527        This simplifies the code below.  */
528     width_remaining = INT_MAX;
529   else
530     width_remaining = width;
531
532 #ifdef HAVE_MBSTATE_T
533   /* Initialise the multibyte conversion state.  */
534   memset (& state, 0, sizeof (state));
535 #endif
536
537   while (width_remaining)
538     {
539       size_t  n;
540       const char c = *symbol++;
541
542       if (c == 0)
543         break;
544
545       /* Do not print control characters directly as they can affect terminal
546          settings.  Such characters usually appear in the names generated
547          by the assembler for local labels.  */
548       if (ISCNTRL (c))
549         {
550           if (width_remaining < 2)
551             break;
552
553           printf ("^%c", c + 0x40);
554           width_remaining -= 2;
555           num_printed += 2;
556         }
557       else if (ISPRINT (c))
558         {
559           putchar (c);
560           width_remaining --;
561           num_printed ++;
562         }
563       else
564         {
565 #ifdef HAVE_MBSTATE_T
566           wchar_t w;
567 #endif
568           /* Let printf do the hard work of displaying multibyte characters.  */
569           printf ("%.1s", symbol - 1);
570           width_remaining --;
571           num_printed ++;
572
573 #ifdef HAVE_MBSTATE_T
574           /* Try to find out how many bytes made up the character that was
575              just printed.  Advance the symbol pointer past the bytes that
576              were displayed.  */
577           n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
578 #else
579           n = 1;
580 #endif
581           if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
582             symbol += (n - 1);
583         }
584     }
585
586   if (extra_padding && num_printed < width)
587     {
588       /* Fill in the remaining spaces.  */
589       printf ("%-*s", width - num_printed, " ");
590       num_printed = width;
591     }
592
593   return num_printed;
594 }
595
596 /* Returns a pointer to a static buffer containing a printable version of
597    the given section's name.  Like print_symbol, except that it does not try
598    to print multibyte characters, it just interprets them as hex values.  */
599
600 static const char *
601 printable_section_name (Filedata * filedata, const Elf_Internal_Shdr * sec)
602 {
603 #define MAX_PRINT_SEC_NAME_LEN 128
604   static char  sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
605   const char * name = SECTION_NAME (sec);
606   char *       buf = sec_name_buf;
607   char         c;
608   unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
609
610   while ((c = * name ++) != 0)
611     {
612       if (ISCNTRL (c))
613         {
614           if (remaining < 2)
615             break;
616
617           * buf ++ = '^';
618           * buf ++ = c + 0x40;
619           remaining -= 2;
620         }
621       else if (ISPRINT (c))
622         {
623           * buf ++ = c;
624           remaining -= 1;
625         }
626       else
627         {
628           static char hex[17] = "0123456789ABCDEF";
629
630           if (remaining < 4)
631             break;
632           * buf ++ = '<';
633           * buf ++ = hex[(c & 0xf0) >> 4];
634           * buf ++ = hex[c & 0x0f];
635           * buf ++ = '>';
636           remaining -= 4;
637         }
638
639       if (remaining == 0)
640         break;
641     }
642
643   * buf = 0;
644   return sec_name_buf;
645 }
646
647 static const char *
648 printable_section_name_from_index (Filedata * filedata, unsigned long ndx)
649 {
650   if (ndx >= filedata->file_header.e_shnum)
651     return _("<corrupt>");
652
653   return printable_section_name (filedata, filedata->section_headers + ndx);
654 }
655
656 /* Return a pointer to section NAME, or NULL if no such section exists.  */
657
658 static Elf_Internal_Shdr *
659 find_section (Filedata * filedata, const char * name)
660 {
661   unsigned int i;
662
663   if (filedata->section_headers == NULL)
664     return NULL;
665
666   for (i = 0; i < filedata->file_header.e_shnum; i++)
667     if (streq (SECTION_NAME (filedata->section_headers + i), name))
668       return filedata->section_headers + i;
669
670   return NULL;
671 }
672
673 /* Return a pointer to a section containing ADDR, or NULL if no such
674    section exists.  */
675
676 static Elf_Internal_Shdr *
677 find_section_by_address (Filedata * filedata, bfd_vma addr)
678 {
679   unsigned int i;
680
681   if (filedata->section_headers == NULL)
682     return NULL;
683
684   for (i = 0; i < filedata->file_header.e_shnum; i++)
685     {
686       Elf_Internal_Shdr *sec = filedata->section_headers + i;
687
688       if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
689         return sec;
690     }
691
692   return NULL;
693 }
694
695 static Elf_Internal_Shdr *
696 find_section_by_type (Filedata * filedata, unsigned int type)
697 {
698   unsigned int i;
699
700   if (filedata->section_headers == NULL)
701     return NULL;
702
703   for (i = 0; i < filedata->file_header.e_shnum; i++)
704     {
705       Elf_Internal_Shdr *sec = filedata->section_headers + i;
706
707       if (sec->sh_type == type)
708         return sec;
709     }
710
711   return NULL;
712 }
713
714 /* Return a pointer to section NAME, or NULL if no such section exists,
715    restricted to the list of sections given in SET.  */
716
717 static Elf_Internal_Shdr *
718 find_section_in_set (Filedata * filedata, const char * name, unsigned int * set)
719 {
720   unsigned int i;
721
722   if (filedata->section_headers == NULL)
723     return NULL;
724
725   if (set != NULL)
726     {
727       while ((i = *set++) > 0)
728         {
729           /* See PR 21156 for a reproducer.  */
730           if (i >= filedata->file_header.e_shnum)
731             continue; /* FIXME: Should we issue an error message ?  */
732
733           if (streq (SECTION_NAME (filedata->section_headers + i), name))
734             return filedata->section_headers + i;
735         }
736     }
737
738   return find_section (filedata, name);
739 }
740
741 /* Read an unsigned LEB128 encoded value from DATA.
742    Set *LENGTH_RETURN to the number of bytes read.  */
743
744 static inline unsigned long
745 read_uleb128 (unsigned char * data,
746               unsigned int * length_return,
747               const unsigned char * const end)
748 {
749   return read_leb128 (data, length_return, FALSE, end);
750 }
751
752 /* Return TRUE if the current file is for IA-64 machine and OpenVMS ABI.
753    This OS has so many departures from the ELF standard that we test it at
754    many places.  */
755
756 static inline bfd_boolean
757 is_ia64_vms (Filedata * filedata)
758 {
759   return filedata->file_header.e_machine == EM_IA_64
760     && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
761 }
762
763 /* Guess the relocation size commonly used by the specific machines.  */
764
765 static bfd_boolean
766 guess_is_rela (unsigned int e_machine)
767 {
768   switch (e_machine)
769     {
770       /* Targets that use REL relocations.  */
771     case EM_386:
772     case EM_IAMCU:
773     case EM_960:
774     case EM_ARM:
775     case EM_D10V:
776     case EM_CYGNUS_D10V:
777     case EM_DLX:
778     case EM_MIPS:
779     case EM_MIPS_RS3_LE:
780     case EM_CYGNUS_M32R:
781     case EM_SCORE:
782     case EM_XGATE:
783     case EM_NFP:
784       return FALSE;
785
786       /* Targets that use RELA relocations.  */
787     case EM_68K:
788     case EM_860:
789     case EM_AARCH64:
790     case EM_ADAPTEVA_EPIPHANY:
791     case EM_ALPHA:
792     case EM_ALTERA_NIOS2:
793     case EM_ARC:
794     case EM_ARC_COMPACT:
795     case EM_ARC_COMPACT2:
796     case EM_AVR:
797     case EM_AVR_OLD:
798     case EM_BLACKFIN:
799     case EM_CR16:
800     case EM_CRIS:
801     case EM_CRX:
802     case EM_CSKY:
803     case EM_D30V:
804     case EM_CYGNUS_D30V:
805     case EM_FR30:
806     case EM_FT32:
807     case EM_CYGNUS_FR30:
808     case EM_CYGNUS_FRV:
809     case EM_H8S:
810     case EM_H8_300:
811     case EM_H8_300H:
812     case EM_IA_64:
813     case EM_IP2K:
814     case EM_IP2K_OLD:
815     case EM_IQ2000:
816     case EM_LATTICEMICO32:
817     case EM_M32C_OLD:
818     case EM_M32C:
819     case EM_M32R:
820     case EM_MCORE:
821     case EM_CYGNUS_MEP:
822     case EM_METAG:
823     case EM_MMIX:
824     case EM_MN10200:
825     case EM_CYGNUS_MN10200:
826     case EM_MN10300:
827     case EM_CYGNUS_MN10300:
828     case EM_MOXIE:
829     case EM_MSP430:
830     case EM_MSP430_OLD:
831     case EM_MT:
832     case EM_NDS32:
833     case EM_NIOS32:
834     case EM_OR1K:
835     case EM_PPC64:
836     case EM_PPC:
837     case EM_TI_PRU:
838     case EM_RISCV:
839     case EM_RL78:
840     case EM_RX:
841     case EM_S390:
842     case EM_S390_OLD:
843     case EM_SH:
844     case EM_SPARC:
845     case EM_SPARC32PLUS:
846     case EM_SPARCV9:
847     case EM_SPU:
848     case EM_TI_C6000:
849     case EM_TILEGX:
850     case EM_TILEPRO:
851     case EM_V800:
852     case EM_V850:
853     case EM_CYGNUS_V850:
854     case EM_VAX:
855     case EM_VISIUM:
856     case EM_X86_64:
857     case EM_L1OM:
858     case EM_K1OM:
859     case EM_XSTORMY16:
860     case EM_XTENSA:
861     case EM_XTENSA_OLD:
862     case EM_MICROBLAZE:
863     case EM_MICROBLAZE_OLD:
864     case EM_WEBASSEMBLY:
865       return TRUE;
866
867     case EM_68HC05:
868     case EM_68HC08:
869     case EM_68HC11:
870     case EM_68HC16:
871     case EM_FX66:
872     case EM_ME16:
873     case EM_MMA:
874     case EM_NCPU:
875     case EM_NDR1:
876     case EM_PCP:
877     case EM_ST100:
878     case EM_ST19:
879     case EM_ST7:
880     case EM_ST9PLUS:
881     case EM_STARCORE:
882     case EM_SVX:
883     case EM_TINYJ:
884     default:
885       warn (_("Don't know about relocations on this machine architecture\n"));
886       return FALSE;
887     }
888 }
889
890 /* Load RELA type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
891    Returns TRUE upon success, FALSE otherwise.  If successful then a
892    pointer to a malloc'ed buffer containing the relocs is placed in *RELASP,
893    and the number of relocs loaded is placed in *NRELASP.  It is the caller's
894    responsibility to free the allocated buffer.  */
895
896 static bfd_boolean
897 slurp_rela_relocs (Filedata *            filedata,
898                    unsigned long         rel_offset,
899                    unsigned long         rel_size,
900                    Elf_Internal_Rela **  relasp,
901                    unsigned long *       nrelasp)
902 {
903   Elf_Internal_Rela * relas;
904   size_t nrelas;
905   unsigned int i;
906
907   if (is_32bit_elf)
908     {
909       Elf32_External_Rela * erelas;
910
911       erelas = (Elf32_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
912                                                  rel_size, _("32-bit relocation data"));
913       if (!erelas)
914         return FALSE;
915
916       nrelas = rel_size / sizeof (Elf32_External_Rela);
917
918       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
919                                              sizeof (Elf_Internal_Rela));
920
921       if (relas == NULL)
922         {
923           free (erelas);
924           error (_("out of memory parsing relocs\n"));
925           return FALSE;
926         }
927
928       for (i = 0; i < nrelas; i++)
929         {
930           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
931           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
932           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
933         }
934
935       free (erelas);
936     }
937   else
938     {
939       Elf64_External_Rela * erelas;
940
941       erelas = (Elf64_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
942                                                  rel_size, _("64-bit relocation data"));
943       if (!erelas)
944         return FALSE;
945
946       nrelas = rel_size / sizeof (Elf64_External_Rela);
947
948       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
949                                              sizeof (Elf_Internal_Rela));
950
951       if (relas == NULL)
952         {
953           free (erelas);
954           error (_("out of memory parsing relocs\n"));
955           return FALSE;
956         }
957
958       for (i = 0; i < nrelas; i++)
959         {
960           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
961           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
962           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
963
964           /* The #ifdef BFD64 below is to prevent a compile time
965              warning.  We know that if we do not have a 64 bit data
966              type that we will never execute this code anyway.  */
967 #ifdef BFD64
968           if (filedata->file_header.e_machine == EM_MIPS
969               && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
970             {
971               /* In little-endian objects, r_info isn't really a
972                  64-bit little-endian value: it has a 32-bit
973                  little-endian symbol index followed by four
974                  individual byte fields.  Reorder INFO
975                  accordingly.  */
976               bfd_vma inf = relas[i].r_info;
977               inf = (((inf & 0xffffffff) << 32)
978                       | ((inf >> 56) & 0xff)
979                       | ((inf >> 40) & 0xff00)
980                       | ((inf >> 24) & 0xff0000)
981                       | ((inf >> 8) & 0xff000000));
982               relas[i].r_info = inf;
983             }
984 #endif /* BFD64 */
985         }
986
987       free (erelas);
988     }
989
990   *relasp = relas;
991   *nrelasp = nrelas;
992   return TRUE;
993 }
994
995 /* Load REL type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
996    Returns TRUE upon success, FALSE otherwise.  If successful then a
997    pointer to a malloc'ed buffer containing the relocs is placed in *RELSP,
998    and the number of relocs loaded is placed in *NRELSP.  It is the caller's
999    responsibility to free the allocated buffer.  */
1000
1001 static bfd_boolean
1002 slurp_rel_relocs (Filedata *            filedata,
1003                   unsigned long         rel_offset,
1004                   unsigned long         rel_size,
1005                   Elf_Internal_Rela **  relsp,
1006                   unsigned long *       nrelsp)
1007 {
1008   Elf_Internal_Rela * rels;
1009   size_t nrels;
1010   unsigned int i;
1011
1012   if (is_32bit_elf)
1013     {
1014       Elf32_External_Rel * erels;
1015
1016       erels = (Elf32_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1017                                                rel_size, _("32-bit relocation data"));
1018       if (!erels)
1019         return FALSE;
1020
1021       nrels = rel_size / sizeof (Elf32_External_Rel);
1022
1023       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1024
1025       if (rels == NULL)
1026         {
1027           free (erels);
1028           error (_("out of memory parsing relocs\n"));
1029           return FALSE;
1030         }
1031
1032       for (i = 0; i < nrels; i++)
1033         {
1034           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1035           rels[i].r_info   = BYTE_GET (erels[i].r_info);
1036           rels[i].r_addend = 0;
1037         }
1038
1039       free (erels);
1040     }
1041   else
1042     {
1043       Elf64_External_Rel * erels;
1044
1045       erels = (Elf64_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1046                                                rel_size, _("64-bit relocation data"));
1047       if (!erels)
1048         return FALSE;
1049
1050       nrels = rel_size / sizeof (Elf64_External_Rel);
1051
1052       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1053
1054       if (rels == NULL)
1055         {
1056           free (erels);
1057           error (_("out of memory parsing relocs\n"));
1058           return FALSE;
1059         }
1060
1061       for (i = 0; i < nrels; i++)
1062         {
1063           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1064           rels[i].r_info   = BYTE_GET (erels[i].r_info);
1065           rels[i].r_addend = 0;
1066
1067           /* The #ifdef BFD64 below is to prevent a compile time
1068              warning.  We know that if we do not have a 64 bit data
1069              type that we will never execute this code anyway.  */
1070 #ifdef BFD64
1071           if (filedata->file_header.e_machine == EM_MIPS
1072               && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
1073             {
1074               /* In little-endian objects, r_info isn't really a
1075                  64-bit little-endian value: it has a 32-bit
1076                  little-endian symbol index followed by four
1077                  individual byte fields.  Reorder INFO
1078                  accordingly.  */
1079               bfd_vma inf = rels[i].r_info;
1080               inf = (((inf & 0xffffffff) << 32)
1081                      | ((inf >> 56) & 0xff)
1082                      | ((inf >> 40) & 0xff00)
1083                      | ((inf >> 24) & 0xff0000)
1084                      | ((inf >> 8) & 0xff000000));
1085               rels[i].r_info = inf;
1086             }
1087 #endif /* BFD64 */
1088         }
1089
1090       free (erels);
1091     }
1092
1093   *relsp = rels;
1094   *nrelsp = nrels;
1095   return TRUE;
1096 }
1097
1098 /* Returns the reloc type extracted from the reloc info field.  */
1099
1100 static unsigned int
1101 get_reloc_type (Filedata * filedata, bfd_vma reloc_info)
1102 {
1103   if (is_32bit_elf)
1104     return ELF32_R_TYPE (reloc_info);
1105
1106   switch (filedata->file_header.e_machine)
1107     {
1108     case EM_MIPS:
1109       /* Note: We assume that reloc_info has already been adjusted for us.  */
1110       return ELF64_MIPS_R_TYPE (reloc_info);
1111
1112     case EM_SPARCV9:
1113       return ELF64_R_TYPE_ID (reloc_info);
1114
1115     default:
1116       return ELF64_R_TYPE (reloc_info);
1117     }
1118 }
1119
1120 /* Return the symbol index extracted from the reloc info field.  */
1121
1122 static bfd_vma
1123 get_reloc_symindex (bfd_vma reloc_info)
1124 {
1125   return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1126 }
1127
1128 static inline bfd_boolean
1129 uses_msp430x_relocs (Filedata * filedata)
1130 {
1131   return
1132     filedata->file_header.e_machine == EM_MSP430 /* Paranoia.  */
1133     /* GCC uses osabi == ELFOSBI_STANDALONE.  */
1134     && (((filedata->file_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1135         /* TI compiler uses ELFOSABI_NONE.  */
1136         || (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1137 }
1138
1139 /* Display the contents of the relocation data found at the specified
1140    offset.  */
1141
1142 static bfd_boolean
1143 dump_relocations (Filedata *          filedata,
1144                   unsigned long       rel_offset,
1145                   unsigned long       rel_size,
1146                   Elf_Internal_Sym *  symtab,
1147                   unsigned long       nsyms,
1148                   char *              strtab,
1149                   unsigned long       strtablen,
1150                   int                 is_rela,
1151                   bfd_boolean         is_dynsym)
1152 {
1153   unsigned long i;
1154   Elf_Internal_Rela * rels;
1155   bfd_boolean res = TRUE;
1156
1157   if (is_rela == UNKNOWN)
1158     is_rela = guess_is_rela (filedata->file_header.e_machine);
1159
1160   if (is_rela)
1161     {
1162       if (!slurp_rela_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1163         return FALSE;
1164     }
1165   else
1166     {
1167       if (!slurp_rel_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1168         return FALSE;
1169     }
1170
1171   if (is_32bit_elf)
1172     {
1173       if (is_rela)
1174         {
1175           if (do_wide)
1176             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name + Addend\n"));
1177           else
1178             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name + Addend\n"));
1179         }
1180       else
1181         {
1182           if (do_wide)
1183             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name\n"));
1184           else
1185             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name\n"));
1186         }
1187     }
1188   else
1189     {
1190       if (is_rela)
1191         {
1192           if (do_wide)
1193             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend\n"));
1194           else
1195             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name + Addend\n"));
1196         }
1197       else
1198         {
1199           if (do_wide)
1200             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name\n"));
1201           else
1202             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name\n"));
1203         }
1204     }
1205
1206   for (i = 0; i < rel_size; i++)
1207     {
1208       const char * rtype;
1209       bfd_vma offset;
1210       bfd_vma inf;
1211       bfd_vma symtab_index;
1212       bfd_vma type;
1213
1214       offset = rels[i].r_offset;
1215       inf    = rels[i].r_info;
1216
1217       type = get_reloc_type (filedata, inf);
1218       symtab_index = get_reloc_symindex  (inf);
1219
1220       if (is_32bit_elf)
1221         {
1222           printf ("%8.8lx  %8.8lx ",
1223                   (unsigned long) offset & 0xffffffff,
1224                   (unsigned long) inf & 0xffffffff);
1225         }
1226       else
1227         {
1228 #if BFD_HOST_64BIT_LONG
1229           printf (do_wide
1230                   ? "%16.16lx  %16.16lx "
1231                   : "%12.12lx  %12.12lx ",
1232                   offset, inf);
1233 #elif BFD_HOST_64BIT_LONG_LONG
1234 #ifndef __MSVCRT__
1235           printf (do_wide
1236                   ? "%16.16llx  %16.16llx "
1237                   : "%12.12llx  %12.12llx ",
1238                   offset, inf);
1239 #else
1240           printf (do_wide
1241                   ? "%16.16I64x  %16.16I64x "
1242                   : "%12.12I64x  %12.12I64x ",
1243                   offset, inf);
1244 #endif
1245 #else
1246           printf (do_wide
1247                   ? "%8.8lx%8.8lx  %8.8lx%8.8lx "
1248                   : "%4.4lx%8.8lx  %4.4lx%8.8lx ",
1249                   _bfd_int64_high (offset),
1250                   _bfd_int64_low (offset),
1251                   _bfd_int64_high (inf),
1252                   _bfd_int64_low (inf));
1253 #endif
1254         }
1255
1256       switch (filedata->file_header.e_machine)
1257         {
1258         default:
1259           rtype = NULL;
1260           break;
1261
1262         case EM_AARCH64:
1263           rtype = elf_aarch64_reloc_type (type);
1264           break;
1265
1266         case EM_M32R:
1267         case EM_CYGNUS_M32R:
1268           rtype = elf_m32r_reloc_type (type);
1269           break;
1270
1271         case EM_386:
1272         case EM_IAMCU:
1273           rtype = elf_i386_reloc_type (type);
1274           break;
1275
1276         case EM_68HC11:
1277         case EM_68HC12:
1278           rtype = elf_m68hc11_reloc_type (type);
1279           break;
1280
1281         case EM_S12Z:
1282           rtype = elf_s12z_reloc_type (type);
1283           break;
1284
1285         case EM_68K:
1286           rtype = elf_m68k_reloc_type (type);
1287           break;
1288
1289         case EM_960:
1290           rtype = elf_i960_reloc_type (type);
1291           break;
1292
1293         case EM_AVR:
1294         case EM_AVR_OLD:
1295           rtype = elf_avr_reloc_type (type);
1296           break;
1297
1298         case EM_OLD_SPARCV9:
1299         case EM_SPARC32PLUS:
1300         case EM_SPARCV9:
1301         case EM_SPARC:
1302           rtype = elf_sparc_reloc_type (type);
1303           break;
1304
1305         case EM_SPU:
1306           rtype = elf_spu_reloc_type (type);
1307           break;
1308
1309         case EM_V800:
1310           rtype = v800_reloc_type (type);
1311           break;
1312         case EM_V850:
1313         case EM_CYGNUS_V850:
1314           rtype = v850_reloc_type (type);
1315           break;
1316
1317         case EM_D10V:
1318         case EM_CYGNUS_D10V:
1319           rtype = elf_d10v_reloc_type (type);
1320           break;
1321
1322         case EM_D30V:
1323         case EM_CYGNUS_D30V:
1324           rtype = elf_d30v_reloc_type (type);
1325           break;
1326
1327         case EM_DLX:
1328           rtype = elf_dlx_reloc_type (type);
1329           break;
1330
1331         case EM_SH:
1332           rtype = elf_sh_reloc_type (type);
1333           break;
1334
1335         case EM_MN10300:
1336         case EM_CYGNUS_MN10300:
1337           rtype = elf_mn10300_reloc_type (type);
1338           break;
1339
1340         case EM_MN10200:
1341         case EM_CYGNUS_MN10200:
1342           rtype = elf_mn10200_reloc_type (type);
1343           break;
1344
1345         case EM_FR30:
1346         case EM_CYGNUS_FR30:
1347           rtype = elf_fr30_reloc_type (type);
1348           break;
1349
1350         case EM_CYGNUS_FRV:
1351           rtype = elf_frv_reloc_type (type);
1352           break;
1353
1354         case EM_CSKY:
1355           rtype = elf_csky_reloc_type (type);
1356           break;
1357
1358         case EM_FT32:
1359           rtype = elf_ft32_reloc_type (type);
1360           break;
1361
1362         case EM_MCORE:
1363           rtype = elf_mcore_reloc_type (type);
1364           break;
1365
1366         case EM_MMIX:
1367           rtype = elf_mmix_reloc_type (type);
1368           break;
1369
1370         case EM_MOXIE:
1371           rtype = elf_moxie_reloc_type (type);
1372           break;
1373
1374         case EM_MSP430:
1375           if (uses_msp430x_relocs (filedata))
1376             {
1377               rtype = elf_msp430x_reloc_type (type);
1378               break;
1379             }
1380           /* Fall through.  */
1381         case EM_MSP430_OLD:
1382           rtype = elf_msp430_reloc_type (type);
1383           break;
1384
1385         case EM_NDS32:
1386           rtype = elf_nds32_reloc_type (type);
1387           break;
1388
1389         case EM_PPC:
1390           rtype = elf_ppc_reloc_type (type);
1391           break;
1392
1393         case EM_PPC64:
1394           rtype = elf_ppc64_reloc_type (type);
1395           break;
1396
1397         case EM_MIPS:
1398         case EM_MIPS_RS3_LE:
1399           rtype = elf_mips_reloc_type (type);
1400           break;
1401
1402         case EM_RISCV:
1403           rtype = elf_riscv_reloc_type (type);
1404           break;
1405
1406         case EM_ALPHA:
1407           rtype = elf_alpha_reloc_type (type);
1408           break;
1409
1410         case EM_ARM:
1411           rtype = elf_arm_reloc_type (type);
1412           break;
1413
1414         case EM_ARC:
1415         case EM_ARC_COMPACT:
1416         case EM_ARC_COMPACT2:
1417           rtype = elf_arc_reloc_type (type);
1418           break;
1419
1420         case EM_PARISC:
1421           rtype = elf_hppa_reloc_type (type);
1422           break;
1423
1424         case EM_H8_300:
1425         case EM_H8_300H:
1426         case EM_H8S:
1427           rtype = elf_h8_reloc_type (type);
1428           break;
1429
1430         case EM_OR1K:
1431           rtype = elf_or1k_reloc_type (type);
1432           break;
1433
1434         case EM_PJ:
1435         case EM_PJ_OLD:
1436           rtype = elf_pj_reloc_type (type);
1437           break;
1438         case EM_IA_64:
1439           rtype = elf_ia64_reloc_type (type);
1440           break;
1441
1442         case EM_CRIS:
1443           rtype = elf_cris_reloc_type (type);
1444           break;
1445
1446         case EM_860:
1447           rtype = elf_i860_reloc_type (type);
1448           break;
1449
1450         case EM_X86_64:
1451         case EM_L1OM:
1452         case EM_K1OM:
1453           rtype = elf_x86_64_reloc_type (type);
1454           break;
1455
1456         case EM_S370:
1457           rtype = i370_reloc_type (type);
1458           break;
1459
1460         case EM_S390_OLD:
1461         case EM_S390:
1462           rtype = elf_s390_reloc_type (type);
1463           break;
1464
1465         case EM_SCORE:
1466           rtype = elf_score_reloc_type (type);
1467           break;
1468
1469         case EM_XSTORMY16:
1470           rtype = elf_xstormy16_reloc_type (type);
1471           break;
1472
1473         case EM_CRX:
1474           rtype = elf_crx_reloc_type (type);
1475           break;
1476
1477         case EM_VAX:
1478           rtype = elf_vax_reloc_type (type);
1479           break;
1480
1481         case EM_VISIUM:
1482           rtype = elf_visium_reloc_type (type);
1483           break;
1484
1485         case EM_ADAPTEVA_EPIPHANY:
1486           rtype = elf_epiphany_reloc_type (type);
1487           break;
1488
1489         case EM_IP2K:
1490         case EM_IP2K_OLD:
1491           rtype = elf_ip2k_reloc_type (type);
1492           break;
1493
1494         case EM_IQ2000:
1495           rtype = elf_iq2000_reloc_type (type);
1496           break;
1497
1498         case EM_XTENSA_OLD:
1499         case EM_XTENSA:
1500           rtype = elf_xtensa_reloc_type (type);
1501           break;
1502
1503         case EM_LATTICEMICO32:
1504           rtype = elf_lm32_reloc_type (type);
1505           break;
1506
1507         case EM_M32C_OLD:
1508         case EM_M32C:
1509           rtype = elf_m32c_reloc_type (type);
1510           break;
1511
1512         case EM_MT:
1513           rtype = elf_mt_reloc_type (type);
1514           break;
1515
1516         case EM_BLACKFIN:
1517           rtype = elf_bfin_reloc_type (type);
1518           break;
1519
1520         case EM_CYGNUS_MEP:
1521           rtype = elf_mep_reloc_type (type);
1522           break;
1523
1524         case EM_CR16:
1525           rtype = elf_cr16_reloc_type (type);
1526           break;
1527
1528         case EM_MICROBLAZE:
1529         case EM_MICROBLAZE_OLD:
1530           rtype = elf_microblaze_reloc_type (type);
1531           break;
1532
1533         case EM_RL78:
1534           rtype = elf_rl78_reloc_type (type);
1535           break;
1536
1537         case EM_RX:
1538           rtype = elf_rx_reloc_type (type);
1539           break;
1540
1541         case EM_METAG:
1542           rtype = elf_metag_reloc_type (type);
1543           break;
1544
1545         case EM_XC16X:
1546         case EM_C166:
1547           rtype = elf_xc16x_reloc_type (type);
1548           break;
1549
1550         case EM_TI_C6000:
1551           rtype = elf_tic6x_reloc_type (type);
1552           break;
1553
1554         case EM_TILEGX:
1555           rtype = elf_tilegx_reloc_type (type);
1556           break;
1557
1558         case EM_TILEPRO:
1559           rtype = elf_tilepro_reloc_type (type);
1560           break;
1561
1562         case EM_WEBASSEMBLY:
1563           rtype = elf_wasm32_reloc_type (type);
1564           break;
1565
1566         case EM_XGATE:
1567           rtype = elf_xgate_reloc_type (type);
1568           break;
1569
1570         case EM_ALTERA_NIOS2:
1571           rtype = elf_nios2_reloc_type (type);
1572           break;
1573
1574         case EM_TI_PRU:
1575           rtype = elf_pru_reloc_type (type);
1576           break;
1577
1578         case EM_NFP:
1579           if (EF_NFP_MACH (filedata->file_header.e_flags) == E_NFP_MACH_3200)
1580             rtype = elf_nfp3200_reloc_type (type);
1581           else
1582             rtype = elf_nfp_reloc_type (type);
1583           break;
1584         }
1585
1586       if (rtype == NULL)
1587         printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1588       else
1589         printf (do_wide ? "%-22s" : "%-17.17s", rtype);
1590
1591       if (filedata->file_header.e_machine == EM_ALPHA
1592           && rtype != NULL
1593           && streq (rtype, "R_ALPHA_LITUSE")
1594           && is_rela)
1595         {
1596           switch (rels[i].r_addend)
1597             {
1598             case LITUSE_ALPHA_ADDR:   rtype = "ADDR";   break;
1599             case LITUSE_ALPHA_BASE:   rtype = "BASE";   break;
1600             case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1601             case LITUSE_ALPHA_JSR:    rtype = "JSR";    break;
1602             case LITUSE_ALPHA_TLSGD:  rtype = "TLSGD";  break;
1603             case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1604             case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1605             default: rtype = NULL;
1606             }
1607
1608           if (rtype)
1609             printf (" (%s)", rtype);
1610           else
1611             {
1612               putchar (' ');
1613               printf (_("<unknown addend: %lx>"),
1614                       (unsigned long) rels[i].r_addend);
1615               res = FALSE;
1616             }
1617         }
1618       else if (symtab_index)
1619         {
1620           if (symtab == NULL || symtab_index >= nsyms)
1621             {
1622               error (_(" bad symbol index: %08lx in reloc"), (unsigned long) symtab_index);
1623               res = FALSE;
1624             }
1625           else
1626             {
1627               Elf_Internal_Sym * psym;
1628               const char * version_string;
1629               enum versioned_symbol_info sym_info;
1630               unsigned short vna_other;
1631
1632               psym = symtab + symtab_index;
1633
1634               version_string
1635                 = get_symbol_version_string (filedata, is_dynsym,
1636                                              strtab, strtablen,
1637                                              symtab_index,
1638                                              psym,
1639                                              &sym_info,
1640                                              &vna_other);
1641
1642               printf (" ");
1643
1644               if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1645                 {
1646                   const char * name;
1647                   unsigned int len;
1648                   unsigned int width = is_32bit_elf ? 8 : 14;
1649
1650                   /* Relocations against GNU_IFUNC symbols do not use the value
1651                      of the symbol as the address to relocate against.  Instead
1652                      they invoke the function named by the symbol and use its
1653                      result as the address for relocation.
1654
1655                      To indicate this to the user, do not display the value of
1656                      the symbol in the "Symbols's Value" field.  Instead show
1657                      its name followed by () as a hint that the symbol is
1658                      invoked.  */
1659
1660                   if (strtab == NULL
1661                       || psym->st_name == 0
1662                       || psym->st_name >= strtablen)
1663                     name = "??";
1664                   else
1665                     name = strtab + psym->st_name;
1666
1667                   len = print_symbol (width, name);
1668                   if (version_string)
1669                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1670                             version_string);
1671                   printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1672                 }
1673               else
1674                 {
1675                   print_vma (psym->st_value, LONG_HEX);
1676
1677                   printf (is_32bit_elf ? "   " : " ");
1678                 }
1679
1680               if (psym->st_name == 0)
1681                 {
1682                   const char * sec_name = "<null>";
1683                   char name_buf[40];
1684
1685                   if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1686                     {
1687                       if (psym->st_shndx < filedata->file_header.e_shnum)
1688                         sec_name = SECTION_NAME (filedata->section_headers + psym->st_shndx);
1689                       else if (psym->st_shndx == SHN_ABS)
1690                         sec_name = "ABS";
1691                       else if (psym->st_shndx == SHN_COMMON)
1692                         sec_name = "COMMON";
1693                       else if ((filedata->file_header.e_machine == EM_MIPS
1694                                 && psym->st_shndx == SHN_MIPS_SCOMMON)
1695                                || (filedata->file_header.e_machine == EM_TI_C6000
1696                                    && psym->st_shndx == SHN_TIC6X_SCOMMON))
1697                         sec_name = "SCOMMON";
1698                       else if (filedata->file_header.e_machine == EM_MIPS
1699                                && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1700                         sec_name = "SUNDEF";
1701                       else if ((filedata->file_header.e_machine == EM_X86_64
1702                                 || filedata->file_header.e_machine == EM_L1OM
1703                                 || filedata->file_header.e_machine == EM_K1OM)
1704                                && psym->st_shndx == SHN_X86_64_LCOMMON)
1705                         sec_name = "LARGE_COMMON";
1706                       else if (filedata->file_header.e_machine == EM_IA_64
1707                                && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1708                                && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1709                         sec_name = "ANSI_COM";
1710                       else if (is_ia64_vms (filedata)
1711                                && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1712                         sec_name = "VMS_SYMVEC";
1713                       else
1714                         {
1715                           sprintf (name_buf, "<section 0x%x>",
1716                                    (unsigned int) psym->st_shndx);
1717                           sec_name = name_buf;
1718                         }
1719                     }
1720                   print_symbol (22, sec_name);
1721                 }
1722               else if (strtab == NULL)
1723                 printf (_("<string table index: %3ld>"), psym->st_name);
1724               else if (psym->st_name >= strtablen)
1725                 {
1726                   error (_("<corrupt string table index: %3ld>"), psym->st_name);
1727                   res = FALSE;
1728                 }
1729               else
1730                 {
1731                   print_symbol (22, strtab + psym->st_name);
1732                   if (version_string)
1733                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1734                             version_string);
1735                 }
1736
1737               if (is_rela)
1738                 {
1739                   bfd_vma off = rels[i].r_addend;
1740
1741                   if ((bfd_signed_vma) off < 0)
1742                     printf (" - %" BFD_VMA_FMT "x", - off);
1743                   else
1744                     printf (" + %" BFD_VMA_FMT "x", off);
1745                 }
1746             }
1747         }
1748       else if (is_rela)
1749         {
1750           bfd_vma off = rels[i].r_addend;
1751
1752           printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1753           if ((bfd_signed_vma) off < 0)
1754             printf ("-%" BFD_VMA_FMT "x", - off);
1755           else
1756             printf ("%" BFD_VMA_FMT "x", off);
1757         }
1758
1759       if (filedata->file_header.e_machine == EM_SPARCV9
1760           && rtype != NULL
1761           && streq (rtype, "R_SPARC_OLO10"))
1762         printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1763
1764       putchar ('\n');
1765
1766 #ifdef BFD64
1767       if (! is_32bit_elf && filedata->file_header.e_machine == EM_MIPS)
1768         {
1769           bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1770           bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1771           const char * rtype2 = elf_mips_reloc_type (type2);
1772           const char * rtype3 = elf_mips_reloc_type (type3);
1773
1774           printf ("                    Type2: ");
1775
1776           if (rtype2 == NULL)
1777             printf (_("unrecognized: %-7lx"),
1778                     (unsigned long) type2 & 0xffffffff);
1779           else
1780             printf ("%-17.17s", rtype2);
1781
1782           printf ("\n                    Type3: ");
1783
1784           if (rtype3 == NULL)
1785             printf (_("unrecognized: %-7lx"),
1786                     (unsigned long) type3 & 0xffffffff);
1787           else
1788             printf ("%-17.17s", rtype3);
1789
1790           putchar ('\n');
1791         }
1792 #endif /* BFD64 */
1793     }
1794
1795   free (rels);
1796
1797   return res;
1798 }
1799
1800 static const char *
1801 get_aarch64_dynamic_type (unsigned long type)
1802 {
1803   switch (type)
1804     {
1805     case DT_AARCH64_BTI_PLT:  return "AARCH64_BTI_PLT";
1806     case DT_AARCH64_PAC_PLT:  return "AARCH64_PAC_PLT";
1807     default:
1808       return NULL;
1809     }
1810 }
1811
1812 static const char *
1813 get_mips_dynamic_type (unsigned long type)
1814 {
1815   switch (type)
1816     {
1817     case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1818     case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1819     case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1820     case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1821     case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1822     case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1823     case DT_MIPS_MSYM: return "MIPS_MSYM";
1824     case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1825     case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1826     case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1827     case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1828     case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1829     case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1830     case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1831     case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1832     case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1833     case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1834     case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1835     case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1836     case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1837     case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1838     case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1839     case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1840     case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1841     case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1842     case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1843     case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1844     case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1845     case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1846     case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1847     case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1848     case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1849     case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1850     case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1851     case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1852     case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1853     case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1854     case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1855     case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1856     case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1857     case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1858     case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1859     case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1860     case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1861     case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1862     case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1863     default:
1864       return NULL;
1865     }
1866 }
1867
1868 static const char *
1869 get_sparc64_dynamic_type (unsigned long type)
1870 {
1871   switch (type)
1872     {
1873     case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1874     default:
1875       return NULL;
1876     }
1877 }
1878
1879 static const char *
1880 get_ppc_dynamic_type (unsigned long type)
1881 {
1882   switch (type)
1883     {
1884     case DT_PPC_GOT:    return "PPC_GOT";
1885     case DT_PPC_OPT:    return "PPC_OPT";
1886     default:
1887       return NULL;
1888     }
1889 }
1890
1891 static const char *
1892 get_ppc64_dynamic_type (unsigned long type)
1893 {
1894   switch (type)
1895     {
1896     case DT_PPC64_GLINK:  return "PPC64_GLINK";
1897     case DT_PPC64_OPD:    return "PPC64_OPD";
1898     case DT_PPC64_OPDSZ:  return "PPC64_OPDSZ";
1899     case DT_PPC64_OPT:    return "PPC64_OPT";
1900     default:
1901       return NULL;
1902     }
1903 }
1904
1905 static const char *
1906 get_parisc_dynamic_type (unsigned long type)
1907 {
1908   switch (type)
1909     {
1910     case DT_HP_LOAD_MAP:        return "HP_LOAD_MAP";
1911     case DT_HP_DLD_FLAGS:       return "HP_DLD_FLAGS";
1912     case DT_HP_DLD_HOOK:        return "HP_DLD_HOOK";
1913     case DT_HP_UX10_INIT:       return "HP_UX10_INIT";
1914     case DT_HP_UX10_INITSZ:     return "HP_UX10_INITSZ";
1915     case DT_HP_PREINIT:         return "HP_PREINIT";
1916     case DT_HP_PREINITSZ:       return "HP_PREINITSZ";
1917     case DT_HP_NEEDED:          return "HP_NEEDED";
1918     case DT_HP_TIME_STAMP:      return "HP_TIME_STAMP";
1919     case DT_HP_CHECKSUM:        return "HP_CHECKSUM";
1920     case DT_HP_GST_SIZE:        return "HP_GST_SIZE";
1921     case DT_HP_GST_VERSION:     return "HP_GST_VERSION";
1922     case DT_HP_GST_HASHVAL:     return "HP_GST_HASHVAL";
1923     case DT_HP_EPLTREL:         return "HP_GST_EPLTREL";
1924     case DT_HP_EPLTRELSZ:       return "HP_GST_EPLTRELSZ";
1925     case DT_HP_FILTERED:        return "HP_FILTERED";
1926     case DT_HP_FILTER_TLS:      return "HP_FILTER_TLS";
1927     case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1928     case DT_HP_LAZYLOAD:        return "HP_LAZYLOAD";
1929     case DT_HP_BIND_NOW_COUNT:  return "HP_BIND_NOW_COUNT";
1930     case DT_PLT:                return "PLT";
1931     case DT_PLT_SIZE:           return "PLT_SIZE";
1932     case DT_DLT:                return "DLT";
1933     case DT_DLT_SIZE:           return "DLT_SIZE";
1934     default:
1935       return NULL;
1936     }
1937 }
1938
1939 static const char *
1940 get_ia64_dynamic_type (unsigned long type)
1941 {
1942   switch (type)
1943     {
1944     case DT_IA_64_PLT_RESERVE:         return "IA_64_PLT_RESERVE";
1945     case DT_IA_64_VMS_SUBTYPE:         return "VMS_SUBTYPE";
1946     case DT_IA_64_VMS_IMGIOCNT:        return "VMS_IMGIOCNT";
1947     case DT_IA_64_VMS_LNKFLAGS:        return "VMS_LNKFLAGS";
1948     case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1949     case DT_IA_64_VMS_IDENT:           return "VMS_IDENT";
1950     case DT_IA_64_VMS_NEEDED_IDENT:    return "VMS_NEEDED_IDENT";
1951     case DT_IA_64_VMS_IMG_RELA_CNT:    return "VMS_IMG_RELA_CNT";
1952     case DT_IA_64_VMS_SEG_RELA_CNT:    return "VMS_SEG_RELA_CNT";
1953     case DT_IA_64_VMS_FIXUP_RELA_CNT:  return "VMS_FIXUP_RELA_CNT";
1954     case DT_IA_64_VMS_FIXUP_NEEDED:    return "VMS_FIXUP_NEEDED";
1955     case DT_IA_64_VMS_SYMVEC_CNT:      return "VMS_SYMVEC_CNT";
1956     case DT_IA_64_VMS_XLATED:          return "VMS_XLATED";
1957     case DT_IA_64_VMS_STACKSIZE:       return "VMS_STACKSIZE";
1958     case DT_IA_64_VMS_UNWINDSZ:        return "VMS_UNWINDSZ";
1959     case DT_IA_64_VMS_UNWIND_CODSEG:   return "VMS_UNWIND_CODSEG";
1960     case DT_IA_64_VMS_UNWIND_INFOSEG:  return "VMS_UNWIND_INFOSEG";
1961     case DT_IA_64_VMS_LINKTIME:        return "VMS_LINKTIME";
1962     case DT_IA_64_VMS_SEG_NO:          return "VMS_SEG_NO";
1963     case DT_IA_64_VMS_SYMVEC_OFFSET:   return "VMS_SYMVEC_OFFSET";
1964     case DT_IA_64_VMS_SYMVEC_SEG:      return "VMS_SYMVEC_SEG";
1965     case DT_IA_64_VMS_UNWIND_OFFSET:   return "VMS_UNWIND_OFFSET";
1966     case DT_IA_64_VMS_UNWIND_SEG:      return "VMS_UNWIND_SEG";
1967     case DT_IA_64_VMS_STRTAB_OFFSET:   return "VMS_STRTAB_OFFSET";
1968     case DT_IA_64_VMS_SYSVER_OFFSET:   return "VMS_SYSVER_OFFSET";
1969     case DT_IA_64_VMS_IMG_RELA_OFF:    return "VMS_IMG_RELA_OFF";
1970     case DT_IA_64_VMS_SEG_RELA_OFF:    return "VMS_SEG_RELA_OFF";
1971     case DT_IA_64_VMS_FIXUP_RELA_OFF:  return "VMS_FIXUP_RELA_OFF";
1972     case DT_IA_64_VMS_PLTGOT_OFFSET:   return "VMS_PLTGOT_OFFSET";
1973     case DT_IA_64_VMS_PLTGOT_SEG:      return "VMS_PLTGOT_SEG";
1974     case DT_IA_64_VMS_FPMODE:          return "VMS_FPMODE";
1975     default:
1976       return NULL;
1977     }
1978 }
1979
1980 static const char *
1981 get_solaris_section_type (unsigned long type)
1982 {
1983   switch (type)
1984     {
1985     case 0x6fffffee: return "SUNW_ancillary";
1986     case 0x6fffffef: return "SUNW_capchain";
1987     case 0x6ffffff0: return "SUNW_capinfo";
1988     case 0x6ffffff1: return "SUNW_symsort";
1989     case 0x6ffffff2: return "SUNW_tlssort";
1990     case 0x6ffffff3: return "SUNW_LDYNSYM";
1991     case 0x6ffffff4: return "SUNW_dof";
1992     case 0x6ffffff5: return "SUNW_cap";
1993     case 0x6ffffff6: return "SUNW_SIGNATURE";
1994     case 0x6ffffff7: return "SUNW_ANNOTATE";
1995     case 0x6ffffff8: return "SUNW_DEBUGSTR";
1996     case 0x6ffffff9: return "SUNW_DEBUG";
1997     case 0x6ffffffa: return "SUNW_move";
1998     case 0x6ffffffb: return "SUNW_COMDAT";
1999     case 0x6ffffffc: return "SUNW_syminfo";
2000     case 0x6ffffffd: return "SUNW_verdef";
2001     case 0x6ffffffe: return "SUNW_verneed";
2002     case 0x6fffffff: return "SUNW_versym";
2003     case 0x70000000: return "SPARC_GOTDATA";
2004     default: return NULL;
2005     }
2006 }
2007
2008 static const char *
2009 get_alpha_dynamic_type (unsigned long type)
2010 {
2011   switch (type)
2012     {
2013     case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
2014     default: return NULL;
2015     }
2016 }
2017
2018 static const char *
2019 get_score_dynamic_type (unsigned long type)
2020 {
2021   switch (type)
2022     {
2023     case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
2024     case DT_SCORE_LOCAL_GOTNO:  return "SCORE_LOCAL_GOTNO";
2025     case DT_SCORE_SYMTABNO:     return "SCORE_SYMTABNO";
2026     case DT_SCORE_GOTSYM:       return "SCORE_GOTSYM";
2027     case DT_SCORE_UNREFEXTNO:   return "SCORE_UNREFEXTNO";
2028     case DT_SCORE_HIPAGENO:     return "SCORE_HIPAGENO";
2029     default:                    return NULL;
2030     }
2031 }
2032
2033 static const char *
2034 get_tic6x_dynamic_type (unsigned long type)
2035 {
2036   switch (type)
2037     {
2038     case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
2039     case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
2040     case DT_C6000_DSBT_BASE:   return "C6000_DSBT_BASE";
2041     case DT_C6000_DSBT_SIZE:   return "C6000_DSBT_SIZE";
2042     case DT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
2043     case DT_C6000_DSBT_INDEX:  return "C6000_DSBT_INDEX";
2044     default:                   return NULL;
2045     }
2046 }
2047
2048 static const char *
2049 get_nios2_dynamic_type (unsigned long type)
2050 {
2051   switch (type)
2052     {
2053     case DT_NIOS2_GP: return "NIOS2_GP";
2054     default:          return NULL;
2055     }
2056 }
2057
2058 static const char *
2059 get_solaris_dynamic_type (unsigned long type)
2060 {
2061   switch (type)
2062     {
2063     case 0x6000000d: return "SUNW_AUXILIARY";
2064     case 0x6000000e: return "SUNW_RTLDINF";
2065     case 0x6000000f: return "SUNW_FILTER";
2066     case 0x60000010: return "SUNW_CAP";
2067     case 0x60000011: return "SUNW_SYMTAB";
2068     case 0x60000012: return "SUNW_SYMSZ";
2069     case 0x60000013: return "SUNW_SORTENT";
2070     case 0x60000014: return "SUNW_SYMSORT";
2071     case 0x60000015: return "SUNW_SYMSORTSZ";
2072     case 0x60000016: return "SUNW_TLSSORT";
2073     case 0x60000017: return "SUNW_TLSSORTSZ";
2074     case 0x60000018: return "SUNW_CAPINFO";
2075     case 0x60000019: return "SUNW_STRPAD";
2076     case 0x6000001a: return "SUNW_CAPCHAIN";
2077     case 0x6000001b: return "SUNW_LDMACH";
2078     case 0x6000001d: return "SUNW_CAPCHAINENT";
2079     case 0x6000001f: return "SUNW_CAPCHAINSZ";
2080     case 0x60000021: return "SUNW_PARENT";
2081     case 0x60000023: return "SUNW_ASLR";
2082     case 0x60000025: return "SUNW_RELAX";
2083     case 0x60000029: return "SUNW_NXHEAP";
2084     case 0x6000002b: return "SUNW_NXSTACK";
2085
2086     case 0x70000001: return "SPARC_REGISTER";
2087     case 0x7ffffffd: return "AUXILIARY";
2088     case 0x7ffffffe: return "USED";
2089     case 0x7fffffff: return "FILTER";
2090
2091     default: return NULL;
2092     }
2093 }
2094
2095 static const char *
2096 get_dynamic_type (Filedata * filedata, unsigned long type)
2097 {
2098   static char buff[64];
2099
2100   switch (type)
2101     {
2102     case DT_NULL:       return "NULL";
2103     case DT_NEEDED:     return "NEEDED";
2104     case DT_PLTRELSZ:   return "PLTRELSZ";
2105     case DT_PLTGOT:     return "PLTGOT";
2106     case DT_HASH:       return "HASH";
2107     case DT_STRTAB:     return "STRTAB";
2108     case DT_SYMTAB:     return "SYMTAB";
2109     case DT_RELA:       return "RELA";
2110     case DT_RELASZ:     return "RELASZ";
2111     case DT_RELAENT:    return "RELAENT";
2112     case DT_STRSZ:      return "STRSZ";
2113     case DT_SYMENT:     return "SYMENT";
2114     case DT_INIT:       return "INIT";
2115     case DT_FINI:       return "FINI";
2116     case DT_SONAME:     return "SONAME";
2117     case DT_RPATH:      return "RPATH";
2118     case DT_SYMBOLIC:   return "SYMBOLIC";
2119     case DT_REL:        return "REL";
2120     case DT_RELSZ:      return "RELSZ";
2121     case DT_RELENT:     return "RELENT";
2122     case DT_PLTREL:     return "PLTREL";
2123     case DT_DEBUG:      return "DEBUG";
2124     case DT_TEXTREL:    return "TEXTREL";
2125     case DT_JMPREL:     return "JMPREL";
2126     case DT_BIND_NOW:   return "BIND_NOW";
2127     case DT_INIT_ARRAY: return "INIT_ARRAY";
2128     case DT_FINI_ARRAY: return "FINI_ARRAY";
2129     case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2130     case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
2131     case DT_RUNPATH:    return "RUNPATH";
2132     case DT_FLAGS:      return "FLAGS";
2133
2134     case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2135     case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
2136     case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX";
2137
2138     case DT_CHECKSUM:   return "CHECKSUM";
2139     case DT_PLTPADSZ:   return "PLTPADSZ";
2140     case DT_MOVEENT:    return "MOVEENT";
2141     case DT_MOVESZ:     return "MOVESZ";
2142     case DT_FEATURE:    return "FEATURE";
2143     case DT_POSFLAG_1:  return "POSFLAG_1";
2144     case DT_SYMINSZ:    return "SYMINSZ";
2145     case DT_SYMINENT:   return "SYMINENT"; /* aka VALRNGHI */
2146
2147     case DT_ADDRRNGLO:  return "ADDRRNGLO";
2148     case DT_CONFIG:     return "CONFIG";
2149     case DT_DEPAUDIT:   return "DEPAUDIT";
2150     case DT_AUDIT:      return "AUDIT";
2151     case DT_PLTPAD:     return "PLTPAD";
2152     case DT_MOVETAB:    return "MOVETAB";
2153     case DT_SYMINFO:    return "SYMINFO"; /* aka ADDRRNGHI */
2154
2155     case DT_VERSYM:     return "VERSYM";
2156
2157     case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2158     case DT_TLSDESC_PLT: return "TLSDESC_PLT";
2159     case DT_RELACOUNT:  return "RELACOUNT";
2160     case DT_RELCOUNT:   return "RELCOUNT";
2161     case DT_FLAGS_1:    return "FLAGS_1";
2162     case DT_VERDEF:     return "VERDEF";
2163     case DT_VERDEFNUM:  return "VERDEFNUM";
2164     case DT_VERNEED:    return "VERNEED";
2165     case DT_VERNEEDNUM: return "VERNEEDNUM";
2166
2167     case DT_AUXILIARY:  return "AUXILIARY";
2168     case DT_USED:       return "USED";
2169     case DT_FILTER:     return "FILTER";
2170
2171     case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2172     case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2173     case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2174     case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2175     case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
2176     case DT_GNU_HASH:   return "GNU_HASH";
2177
2178     default:
2179       if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2180         {
2181           const char * result;
2182
2183           switch (filedata->file_header.e_machine)
2184             {
2185             case EM_AARCH64:
2186               result = get_aarch64_dynamic_type (type);
2187               break;
2188             case EM_MIPS:
2189             case EM_MIPS_RS3_LE:
2190               result = get_mips_dynamic_type (type);
2191               break;
2192             case EM_SPARCV9:
2193               result = get_sparc64_dynamic_type (type);
2194               break;
2195             case EM_PPC:
2196               result = get_ppc_dynamic_type (type);
2197               break;
2198             case EM_PPC64:
2199               result = get_ppc64_dynamic_type (type);
2200               break;
2201             case EM_IA_64:
2202               result = get_ia64_dynamic_type (type);
2203               break;
2204             case EM_ALPHA:
2205               result = get_alpha_dynamic_type (type);
2206               break;
2207             case EM_SCORE:
2208               result = get_score_dynamic_type (type);
2209               break;
2210             case EM_TI_C6000:
2211               result = get_tic6x_dynamic_type (type);
2212               break;
2213             case EM_ALTERA_NIOS2:
2214               result = get_nios2_dynamic_type (type);
2215               break;
2216             default:
2217               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2218                 result = get_solaris_dynamic_type (type);
2219               else
2220                 result = NULL;
2221               break;
2222             }
2223
2224           if (result != NULL)
2225             return result;
2226
2227           snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2228         }
2229       else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2230                || (filedata->file_header.e_machine == EM_PARISC
2231                    && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2232         {
2233           const char * result;
2234
2235           switch (filedata->file_header.e_machine)
2236             {
2237             case EM_PARISC:
2238               result = get_parisc_dynamic_type (type);
2239               break;
2240             case EM_IA_64:
2241               result = get_ia64_dynamic_type (type);
2242               break;
2243             default:
2244               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2245                 result = get_solaris_dynamic_type (type);
2246               else
2247                 result = NULL;
2248               break;
2249             }
2250
2251           if (result != NULL)
2252             return result;
2253
2254           snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2255                     type);
2256         }
2257       else
2258         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2259
2260       return buff;
2261     }
2262 }
2263
2264 static char *
2265 get_file_type (unsigned e_type)
2266 {
2267   static char buff[32];
2268
2269   switch (e_type)
2270     {
2271     case ET_NONE: return _("NONE (None)");
2272     case ET_REL:  return _("REL (Relocatable file)");
2273     case ET_EXEC: return _("EXEC (Executable file)");
2274     case ET_DYN:  return _("DYN (Shared object file)");
2275     case ET_CORE: return _("CORE (Core file)");
2276
2277     default:
2278       if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2279         snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2280       else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2281         snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2282       else
2283         snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2284       return buff;
2285     }
2286 }
2287
2288 static char *
2289 get_machine_name (unsigned e_machine)
2290 {
2291   static char buff[64]; /* XXX */
2292
2293   switch (e_machine)
2294     {
2295       /* Please keep this switch table sorted by increasing EM_ value.  */
2296       /* 0 */
2297     case EM_NONE:               return _("None");
2298     case EM_M32:                return "WE32100";
2299     case EM_SPARC:              return "Sparc";
2300     case EM_386:                return "Intel 80386";
2301     case EM_68K:                return "MC68000";
2302     case EM_88K:                return "MC88000";
2303     case EM_IAMCU:              return "Intel MCU";
2304     case EM_860:                return "Intel 80860";
2305     case EM_MIPS:               return "MIPS R3000";
2306     case EM_S370:               return "IBM System/370";
2307       /* 10 */
2308     case EM_MIPS_RS3_LE:        return "MIPS R4000 big-endian";
2309     case EM_OLD_SPARCV9:        return "Sparc v9 (old)";
2310     case EM_PARISC:             return "HPPA";
2311     case EM_VPP550:             return "Fujitsu VPP500";
2312     case EM_SPARC32PLUS:        return "Sparc v8+" ;
2313     case EM_960:                return "Intel 80960";
2314     case EM_PPC:                return "PowerPC";
2315       /* 20 */
2316     case EM_PPC64:              return "PowerPC64";
2317     case EM_S390_OLD:
2318     case EM_S390:               return "IBM S/390";
2319     case EM_SPU:                return "SPU";
2320       /* 30 */
2321     case EM_V800:               return "Renesas V850 (using RH850 ABI)";
2322     case EM_FR20:               return "Fujitsu FR20";
2323     case EM_RH32:               return "TRW RH32";
2324     case EM_MCORE:              return "MCORE";
2325       /* 40 */
2326     case EM_ARM:                return "ARM";
2327     case EM_OLD_ALPHA:          return "Digital Alpha (old)";
2328     case EM_SH:                 return "Renesas / SuperH SH";
2329     case EM_SPARCV9:            return "Sparc v9";
2330     case EM_TRICORE:            return "Siemens Tricore";
2331     case EM_ARC:                return "ARC";
2332     case EM_H8_300:             return "Renesas H8/300";
2333     case EM_H8_300H:            return "Renesas H8/300H";
2334     case EM_H8S:                return "Renesas H8S";
2335     case EM_H8_500:             return "Renesas H8/500";
2336       /* 50 */
2337     case EM_IA_64:              return "Intel IA-64";
2338     case EM_MIPS_X:             return "Stanford MIPS-X";
2339     case EM_COLDFIRE:           return "Motorola Coldfire";
2340     case EM_68HC12:             return "Motorola MC68HC12 Microcontroller";
2341     case EM_MMA:                return "Fujitsu Multimedia Accelerator";
2342     case EM_PCP:                return "Siemens PCP";
2343     case EM_NCPU:               return "Sony nCPU embedded RISC processor";
2344     case EM_NDR1:               return "Denso NDR1 microprocesspr";
2345     case EM_STARCORE:           return "Motorola Star*Core processor";
2346     case EM_ME16:               return "Toyota ME16 processor";
2347       /* 60 */
2348     case EM_ST100:              return "STMicroelectronics ST100 processor";
2349     case EM_TINYJ:              return "Advanced Logic Corp. TinyJ embedded processor";
2350     case EM_X86_64:             return "Advanced Micro Devices X86-64";
2351     case EM_PDSP:               return "Sony DSP processor";
2352     case EM_PDP10:              return "Digital Equipment Corp. PDP-10";
2353     case EM_PDP11:              return "Digital Equipment Corp. PDP-11";
2354     case EM_FX66:               return "Siemens FX66 microcontroller";
2355     case EM_ST9PLUS:            return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2356     case EM_ST7:                return "STMicroelectronics ST7 8-bit microcontroller";
2357     case EM_68HC16:             return "Motorola MC68HC16 Microcontroller";
2358       /* 70 */
2359     case EM_68HC11:             return "Motorola MC68HC11 Microcontroller";
2360     case EM_68HC08:             return "Motorola MC68HC08 Microcontroller";
2361     case EM_68HC05:             return "Motorola MC68HC05 Microcontroller";
2362     case EM_SVX:                return "Silicon Graphics SVx";
2363     case EM_ST19:               return "STMicroelectronics ST19 8-bit microcontroller";
2364     case EM_VAX:                return "Digital VAX";
2365     case EM_CRIS:               return "Axis Communications 32-bit embedded processor";
2366     case EM_JAVELIN:            return "Infineon Technologies 32-bit embedded cpu";
2367     case EM_FIREPATH:           return "Element 14 64-bit DSP processor";
2368     case EM_ZSP:                return "LSI Logic's 16-bit DSP processor";
2369       /* 80 */
2370     case EM_MMIX:               return "Donald Knuth's educational 64-bit processor";
2371     case EM_HUANY:              return "Harvard Universitys's machine-independent object format";
2372     case EM_PRISM:              return "Vitesse Prism";
2373     case EM_AVR_OLD:
2374     case EM_AVR:                return "Atmel AVR 8-bit microcontroller";
2375     case EM_CYGNUS_FR30:
2376     case EM_FR30:               return "Fujitsu FR30";
2377     case EM_CYGNUS_D10V:
2378     case EM_D10V:               return "d10v";
2379     case EM_CYGNUS_D30V:
2380     case EM_D30V:               return "d30v";
2381     case EM_CYGNUS_V850:
2382     case EM_V850:               return "Renesas V850";
2383     case EM_CYGNUS_M32R:
2384     case EM_M32R:               return "Renesas M32R (formerly Mitsubishi M32r)";
2385     case EM_CYGNUS_MN10300:
2386     case EM_MN10300:            return "mn10300";
2387       /* 90 */
2388     case EM_CYGNUS_MN10200:
2389     case EM_MN10200:            return "mn10200";
2390     case EM_PJ:                 return "picoJava";
2391     case EM_OR1K:               return "OpenRISC 1000";
2392     case EM_ARC_COMPACT:        return "ARCompact";
2393     case EM_XTENSA_OLD:
2394     case EM_XTENSA:             return "Tensilica Xtensa Processor";
2395     case EM_VIDEOCORE:          return "Alphamosaic VideoCore processor";
2396     case EM_TMM_GPP:            return "Thompson Multimedia General Purpose Processor";
2397     case EM_NS32K:              return "National Semiconductor 32000 series";
2398     case EM_TPC:                return "Tenor Network TPC processor";
2399     case EM_SNP1K:              return "Trebia SNP 1000 processor";
2400       /* 100 */
2401     case EM_ST200:              return "STMicroelectronics ST200 microcontroller";  
2402     case EM_IP2K_OLD:
2403     case EM_IP2K:               return "Ubicom IP2xxx 8-bit microcontrollers";
2404     case EM_MAX:                return "MAX Processor";
2405     case EM_CR:                 return "National Semiconductor CompactRISC";
2406     case EM_F2MC16:             return "Fujitsu F2MC16";
2407     case EM_MSP430:             return "Texas Instruments msp430 microcontroller";
2408     case EM_BLACKFIN:           return "Analog Devices Blackfin";
2409     case EM_SE_C33:             return "S1C33 Family of Seiko Epson processors";
2410     case EM_SEP:                return "Sharp embedded microprocessor";
2411     case EM_ARCA:               return "Arca RISC microprocessor";
2412       /* 110 */
2413     case EM_UNICORE:            return "Unicore";
2414     case EM_EXCESS:             return "eXcess 16/32/64-bit configurable embedded CPU";
2415     case EM_DXP:                return "Icera Semiconductor Inc. Deep Execution Processor";
2416     case EM_ALTERA_NIOS2:       return "Altera Nios II";
2417     case EM_CRX:                return "National Semiconductor CRX microprocessor";
2418     case EM_XGATE:              return "Motorola XGATE embedded processor";
2419     case EM_C166:
2420     case EM_XC16X:              return "Infineon Technologies xc16x";
2421     case EM_M16C:               return "Renesas M16C series microprocessors";
2422     case EM_DSPIC30F:           return "Microchip Technology dsPIC30F Digital Signal Controller";
2423     case EM_CE:                 return "Freescale Communication Engine RISC core";
2424       /* 120 */
2425     case EM_M32C:               return "Renesas M32c";
2426       /* 130 */
2427     case EM_TSK3000:            return "Altium TSK3000 core";
2428     case EM_RS08:               return "Freescale RS08 embedded processor";
2429     case EM_ECOG2:              return "Cyan Technology eCOG2 microprocessor";
2430     case EM_SCORE:              return "SUNPLUS S+Core";
2431     case EM_DSP24:              return "New Japan Radio (NJR) 24-bit DSP Processor";
2432     case EM_VIDEOCORE3:         return "Broadcom VideoCore III processor";
2433     case EM_LATTICEMICO32:      return "Lattice Mico32";
2434     case EM_SE_C17:             return "Seiko Epson C17 family";
2435       /* 140 */
2436     case EM_TI_C6000:           return "Texas Instruments TMS320C6000 DSP family";
2437     case EM_TI_C2000:           return "Texas Instruments TMS320C2000 DSP family";
2438     case EM_TI_C5500:           return "Texas Instruments TMS320C55x DSP family";
2439     case EM_TI_PRU:             return "TI PRU I/O processor";
2440       /* 160 */
2441     case EM_MMDSP_PLUS:         return "STMicroelectronics 64bit VLIW Data Signal Processor";
2442     case EM_CYPRESS_M8C:        return "Cypress M8C microprocessor";
2443     case EM_R32C:               return "Renesas R32C series microprocessors";
2444     case EM_TRIMEDIA:           return "NXP Semiconductors TriMedia architecture family";
2445     case EM_QDSP6:              return "QUALCOMM DSP6 Processor";
2446     case EM_8051:               return "Intel 8051 and variants";
2447     case EM_STXP7X:             return "STMicroelectronics STxP7x family";
2448     case EM_NDS32:              return "Andes Technology compact code size embedded RISC processor family";
2449     case EM_ECOG1X:             return "Cyan Technology eCOG1X family";
2450     case EM_MAXQ30:             return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2451       /* 170 */
2452     case EM_XIMO16:             return "New Japan Radio (NJR) 16-bit DSP Processor";
2453     case EM_MANIK:              return "M2000 Reconfigurable RISC Microprocessor";
2454     case EM_CRAYNV2:            return "Cray Inc. NV2 vector architecture";
2455     case EM_RX:                 return "Renesas RX";
2456     case EM_METAG:              return "Imagination Technologies Meta processor architecture";
2457     case EM_MCST_ELBRUS:        return "MCST Elbrus general purpose hardware architecture";
2458     case EM_ECOG16:             return "Cyan Technology eCOG16 family";
2459     case EM_CR16:
2460     case EM_MICROBLAZE:
2461     case EM_MICROBLAZE_OLD:     return "Xilinx MicroBlaze";
2462     case EM_ETPU:               return "Freescale Extended Time Processing Unit";
2463     case EM_SLE9X:              return "Infineon Technologies SLE9X core";
2464       /* 180 */
2465     case EM_L1OM:               return "Intel L1OM";
2466     case EM_K1OM:               return "Intel K1OM";
2467     case EM_INTEL182:           return "Intel (reserved)";
2468     case EM_AARCH64:            return "AArch64";
2469     case EM_ARM184:             return "ARM (reserved)";
2470     case EM_AVR32:              return "Atmel Corporation 32-bit microprocessor";
2471     case EM_STM8:               return "STMicroeletronics STM8 8-bit microcontroller";
2472     case EM_TILE64:             return "Tilera TILE64 multicore architecture family";
2473     case EM_TILEPRO:            return "Tilera TILEPro multicore architecture family";
2474       /* 190 */
2475     case EM_CUDA:               return "NVIDIA CUDA architecture";
2476     case EM_TILEGX:             return "Tilera TILE-Gx multicore architecture family";
2477     case EM_CLOUDSHIELD:        return "CloudShield architecture family";
2478     case EM_COREA_1ST:          return "KIPO-KAIST Core-A 1st generation processor family";
2479     case EM_COREA_2ND:          return "KIPO-KAIST Core-A 2nd generation processor family";
2480     case EM_ARC_COMPACT2:       return "ARCv2";
2481     case EM_OPEN8:              return "Open8 8-bit RISC soft processor core";
2482     case EM_RL78:               return "Renesas RL78";
2483     case EM_VIDEOCORE5:         return "Broadcom VideoCore V processor";
2484     case EM_78K0R:              return "Renesas 78K0R";
2485       /* 200 */
2486     case EM_56800EX:            return "Freescale 56800EX Digital Signal Controller (DSC)";
2487     case EM_BA1:                return "Beyond BA1 CPU architecture";
2488     case EM_BA2:                return "Beyond BA2 CPU architecture";
2489     case EM_XCORE:              return "XMOS xCORE processor family";
2490     case EM_MCHP_PIC:           return "Microchip 8-bit PIC(r) family";
2491       /* 210 */
2492     case EM_KM32:               return "KM211 KM32 32-bit processor";
2493     case EM_KMX32:              return "KM211 KMX32 32-bit processor";
2494     case EM_KMX16:              return "KM211 KMX16 16-bit processor";
2495     case EM_KMX8:               return "KM211 KMX8 8-bit processor";
2496     case EM_KVARC:              return "KM211 KVARC processor";
2497     case EM_CDP:                return "Paneve CDP architecture family";
2498     case EM_COGE:               return "Cognitive Smart Memory Processor";
2499     case EM_COOL:               return "Bluechip Systems CoolEngine";
2500     case EM_NORC:               return "Nanoradio Optimized RISC";
2501     case EM_CSR_KALIMBA:        return "CSR Kalimba architecture family";
2502       /* 220 */
2503     case EM_Z80:                return "Zilog Z80";
2504     case EM_VISIUM:             return "CDS VISIUMcore processor";
2505     case EM_FT32:               return "FTDI Chip FT32";
2506     case EM_MOXIE:              return "Moxie";
2507     case EM_AMDGPU:             return "AMD GPU";
2508     case EM_RISCV:              return "RISC-V";
2509     case EM_LANAI:              return "Lanai 32-bit processor";
2510     case EM_BPF:                return "Linux BPF";
2511     case EM_NFP:                return "Netronome Flow Processor";
2512
2513       /* Large numbers...  */
2514     case EM_MT:                 return "Morpho Techologies MT processor";
2515     case EM_ALPHA:              return "Alpha";
2516     case EM_WEBASSEMBLY:        return "Web Assembly";
2517     case EM_DLX:                return "OpenDLX";  
2518     case EM_XSTORMY16:          return "Sanyo XStormy16 CPU core";
2519     case EM_IQ2000:             return "Vitesse IQ2000";
2520     case EM_M32C_OLD:
2521     case EM_NIOS32:             return "Altera Nios";
2522     case EM_CYGNUS_MEP:         return "Toshiba MeP Media Engine";
2523     case EM_ADAPTEVA_EPIPHANY:  return "Adapteva EPIPHANY";
2524     case EM_CYGNUS_FRV:         return "Fujitsu FR-V";
2525     case EM_S12Z:               return "Freescale S12Z";
2526     case EM_CSKY:               return "C-SKY";
2527
2528     default:
2529       snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2530       return buff;
2531     }
2532 }
2533
2534 static void
2535 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2536 {
2537   /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2.  Some
2538      other compilers don't a specific architecture type in the e_flags, and
2539      instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2540      architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2541      architectures.
2542
2543      Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2544      but also sets a specific architecture type in the e_flags field.
2545
2546      However, when decoding the flags we don't worry if we see an
2547      unexpected pairing, for example EM_ARC_COMPACT machine type, with
2548      ARCEM architecture type.  */
2549
2550   switch (e_flags & EF_ARC_MACH_MSK)
2551     {
2552       /* We only expect these to occur for EM_ARC_COMPACT2.  */
2553     case EF_ARC_CPU_ARCV2EM:
2554       strcat (buf, ", ARC EM");
2555       break;
2556     case EF_ARC_CPU_ARCV2HS:
2557       strcat (buf, ", ARC HS");
2558       break;
2559
2560       /* We only expect these to occur for EM_ARC_COMPACT.  */
2561     case E_ARC_MACH_ARC600:
2562       strcat (buf, ", ARC600");
2563       break;
2564     case E_ARC_MACH_ARC601:
2565       strcat (buf, ", ARC601");
2566       break;
2567     case E_ARC_MACH_ARC700:
2568       strcat (buf, ", ARC700");
2569       break;
2570
2571       /* The only times we should end up here are (a) A corrupt ELF, (b) A
2572          new ELF with new architecture being read by an old version of
2573          readelf, or (c) An ELF built with non-GNU compiler that does not
2574          set the architecture in the e_flags.  */
2575     default:
2576       if (e_machine == EM_ARC_COMPACT)
2577         strcat (buf, ", Unknown ARCompact");
2578       else
2579         strcat (buf, ", Unknown ARC");
2580       break;
2581     }
2582
2583   switch (e_flags & EF_ARC_OSABI_MSK)
2584     {
2585     case E_ARC_OSABI_ORIG:
2586       strcat (buf, ", (ABI:legacy)");
2587       break;
2588     case E_ARC_OSABI_V2:
2589       strcat (buf, ", (ABI:v2)");
2590       break;
2591       /* Only upstream 3.9+ kernels will support ARCv2 ISA.  */
2592     case E_ARC_OSABI_V3:
2593       strcat (buf, ", v3 no-legacy-syscalls ABI");
2594       break;
2595     case E_ARC_OSABI_V4:
2596       strcat (buf, ", v4 ABI");
2597       break;
2598     default:
2599       strcat (buf, ", unrecognised ARC OSABI flag");
2600       break;
2601     }
2602 }
2603
2604 static void
2605 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2606 {
2607   unsigned eabi;
2608   bfd_boolean unknown = FALSE;
2609
2610   eabi = EF_ARM_EABI_VERSION (e_flags);
2611   e_flags &= ~ EF_ARM_EABIMASK;
2612
2613   /* Handle "generic" ARM flags.  */
2614   if (e_flags & EF_ARM_RELEXEC)
2615     {
2616       strcat (buf, ", relocatable executable");
2617       e_flags &= ~ EF_ARM_RELEXEC;
2618     }
2619
2620   if (e_flags & EF_ARM_PIC)
2621     {
2622       strcat (buf, ", position independent");
2623       e_flags &= ~ EF_ARM_PIC;
2624     }
2625
2626   /* Now handle EABI specific flags.  */
2627   switch (eabi)
2628     {
2629     default:
2630       strcat (buf, ", <unrecognized EABI>");
2631       if (e_flags)
2632         unknown = TRUE;
2633       break;
2634
2635     case EF_ARM_EABI_VER1:
2636       strcat (buf, ", Version1 EABI");
2637       while (e_flags)
2638         {
2639           unsigned flag;
2640
2641           /* Process flags one bit at a time.  */
2642           flag = e_flags & - e_flags;
2643           e_flags &= ~ flag;
2644
2645           switch (flag)
2646             {
2647             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2648               strcat (buf, ", sorted symbol tables");
2649               break;
2650
2651             default:
2652               unknown = TRUE;
2653               break;
2654             }
2655         }
2656       break;
2657
2658     case EF_ARM_EABI_VER2:
2659       strcat (buf, ", Version2 EABI");
2660       while (e_flags)
2661         {
2662           unsigned flag;
2663
2664           /* Process flags one bit at a time.  */
2665           flag = e_flags & - e_flags;
2666           e_flags &= ~ flag;
2667
2668           switch (flag)
2669             {
2670             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2671               strcat (buf, ", sorted symbol tables");
2672               break;
2673
2674             case EF_ARM_DYNSYMSUSESEGIDX:
2675               strcat (buf, ", dynamic symbols use segment index");
2676               break;
2677
2678             case EF_ARM_MAPSYMSFIRST:
2679               strcat (buf, ", mapping symbols precede others");
2680               break;
2681
2682             default:
2683               unknown = TRUE;
2684               break;
2685             }
2686         }
2687       break;
2688
2689     case EF_ARM_EABI_VER3:
2690       strcat (buf, ", Version3 EABI");
2691       break;
2692
2693     case EF_ARM_EABI_VER4:
2694       strcat (buf, ", Version4 EABI");
2695       while (e_flags)
2696         {
2697           unsigned flag;
2698
2699           /* Process flags one bit at a time.  */
2700           flag = e_flags & - e_flags;
2701           e_flags &= ~ flag;
2702
2703           switch (flag)
2704             {
2705             case EF_ARM_BE8:
2706               strcat (buf, ", BE8");
2707               break;
2708
2709             case EF_ARM_LE8:
2710               strcat (buf, ", LE8");
2711               break;
2712
2713             default:
2714               unknown = TRUE;
2715               break;
2716             }
2717         }
2718       break;
2719
2720     case EF_ARM_EABI_VER5:
2721       strcat (buf, ", Version5 EABI");
2722       while (e_flags)
2723         {
2724           unsigned flag;
2725
2726           /* Process flags one bit at a time.  */
2727           flag = e_flags & - e_flags;
2728           e_flags &= ~ flag;
2729
2730           switch (flag)
2731             {
2732             case EF_ARM_BE8:
2733               strcat (buf, ", BE8");
2734               break;
2735
2736             case EF_ARM_LE8:
2737               strcat (buf, ", LE8");
2738               break;
2739
2740             case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT.  */
2741               strcat (buf, ", soft-float ABI");
2742               break;
2743
2744             case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT.  */
2745               strcat (buf, ", hard-float ABI");
2746               break;
2747
2748             default:
2749               unknown = TRUE;
2750               break;
2751             }
2752         }
2753       break;
2754
2755     case EF_ARM_EABI_UNKNOWN:
2756       strcat (buf, ", GNU EABI");
2757       while (e_flags)
2758         {
2759           unsigned flag;
2760
2761           /* Process flags one bit at a time.  */
2762           flag = e_flags & - e_flags;
2763           e_flags &= ~ flag;
2764
2765           switch (flag)
2766             {
2767             case EF_ARM_INTERWORK:
2768               strcat (buf, ", interworking enabled");
2769               break;
2770
2771             case EF_ARM_APCS_26:
2772               strcat (buf, ", uses APCS/26");
2773               break;
2774
2775             case EF_ARM_APCS_FLOAT:
2776               strcat (buf, ", uses APCS/float");
2777               break;
2778
2779             case EF_ARM_PIC:
2780               strcat (buf, ", position independent");
2781               break;
2782
2783             case EF_ARM_ALIGN8:
2784               strcat (buf, ", 8 bit structure alignment");
2785               break;
2786
2787             case EF_ARM_NEW_ABI:
2788               strcat (buf, ", uses new ABI");
2789               break;
2790
2791             case EF_ARM_OLD_ABI:
2792               strcat (buf, ", uses old ABI");
2793               break;
2794
2795             case EF_ARM_SOFT_FLOAT:
2796               strcat (buf, ", software FP");
2797               break;
2798
2799             case EF_ARM_VFP_FLOAT:
2800               strcat (buf, ", VFP");
2801               break;
2802
2803             case EF_ARM_MAVERICK_FLOAT:
2804               strcat (buf, ", Maverick FP");
2805               break;
2806
2807             default:
2808               unknown = TRUE;
2809               break;
2810             }
2811         }
2812     }
2813
2814   if (unknown)
2815     strcat (buf,_(", <unknown>"));
2816 }
2817
2818 static void
2819 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2820 {
2821   --size; /* Leave space for null terminator.  */
2822
2823   switch (e_flags & EF_AVR_MACH)
2824     {
2825     case E_AVR_MACH_AVR1:
2826       strncat (buf, ", avr:1", size);
2827       break;
2828     case E_AVR_MACH_AVR2:
2829       strncat (buf, ", avr:2", size);
2830       break;
2831     case E_AVR_MACH_AVR25:
2832       strncat (buf, ", avr:25", size);
2833       break;
2834     case E_AVR_MACH_AVR3:
2835       strncat (buf, ", avr:3", size);
2836       break;
2837     case E_AVR_MACH_AVR31:
2838       strncat (buf, ", avr:31", size);
2839       break;
2840     case E_AVR_MACH_AVR35:
2841       strncat (buf, ", avr:35", size);
2842       break;
2843     case E_AVR_MACH_AVR4:
2844       strncat (buf, ", avr:4", size);
2845       break;
2846     case E_AVR_MACH_AVR5:
2847       strncat (buf, ", avr:5", size);
2848       break;
2849     case E_AVR_MACH_AVR51:
2850       strncat (buf, ", avr:51", size);
2851       break;
2852     case E_AVR_MACH_AVR6:
2853       strncat (buf, ", avr:6", size);
2854       break;
2855     case E_AVR_MACH_AVRTINY:
2856       strncat (buf, ", avr:100", size);
2857       break;
2858     case E_AVR_MACH_XMEGA1:
2859       strncat (buf, ", avr:101", size);
2860       break;
2861     case E_AVR_MACH_XMEGA2:
2862       strncat (buf, ", avr:102", size);
2863       break;
2864     case E_AVR_MACH_XMEGA3:
2865       strncat (buf, ", avr:103", size);
2866       break;
2867     case E_AVR_MACH_XMEGA4:
2868       strncat (buf, ", avr:104", size);
2869       break;
2870     case E_AVR_MACH_XMEGA5:
2871       strncat (buf, ", avr:105", size);
2872       break;
2873     case E_AVR_MACH_XMEGA6:
2874       strncat (buf, ", avr:106", size);
2875       break;
2876     case E_AVR_MACH_XMEGA7:
2877       strncat (buf, ", avr:107", size);
2878       break;
2879     default:
2880       strncat (buf, ", avr:<unknown>", size);
2881       break;
2882     }
2883
2884   size -= strlen (buf);
2885   if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2886     strncat (buf, ", link-relax", size);
2887 }
2888
2889 static void
2890 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2891 {
2892   unsigned abi;
2893   unsigned arch;
2894   unsigned config;
2895   unsigned version;
2896   bfd_boolean has_fpu = FALSE;
2897   unsigned int r = 0;
2898
2899   static const char *ABI_STRINGS[] =
2900   {
2901     "ABI v0", /* use r5 as return register; only used in N1213HC */
2902     "ABI v1", /* use r0 as return register */
2903     "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2904     "ABI v2fp", /* for FPU */
2905     "AABI",
2906     "ABI2 FP+"
2907   };
2908   static const char *VER_STRINGS[] =
2909   {
2910     "Andes ELF V1.3 or older",
2911     "Andes ELF V1.3.1",
2912     "Andes ELF V1.4"
2913   };
2914   static const char *ARCH_STRINGS[] =
2915   {
2916     "",
2917     "Andes Star v1.0",
2918     "Andes Star v2.0",
2919     "Andes Star v3.0",
2920     "Andes Star v3.0m"
2921   };
2922
2923   abi = EF_NDS_ABI & e_flags;
2924   arch = EF_NDS_ARCH & e_flags;
2925   config = EF_NDS_INST & e_flags;
2926   version = EF_NDS32_ELF_VERSION & e_flags;
2927
2928   memset (buf, 0, size);
2929
2930   switch (abi)
2931     {
2932     case E_NDS_ABI_V0:
2933     case E_NDS_ABI_V1:
2934     case E_NDS_ABI_V2:
2935     case E_NDS_ABI_V2FP:
2936     case E_NDS_ABI_AABI:
2937     case E_NDS_ABI_V2FP_PLUS:
2938       /* In case there are holes in the array.  */
2939       r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2940       break;
2941
2942     default:
2943       r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2944       break;
2945     }
2946
2947   switch (version)
2948     {
2949     case E_NDS32_ELF_VER_1_2:
2950     case E_NDS32_ELF_VER_1_3:
2951     case E_NDS32_ELF_VER_1_4:
2952       r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2953       break;
2954
2955     default:
2956       r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2957       break;
2958     }
2959
2960   if (E_NDS_ABI_V0 == abi)
2961     {
2962       /* OLD ABI; only used in N1213HC, has performance extension 1.  */
2963       r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2964       if (arch == E_NDS_ARCH_STAR_V1_0)
2965         r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2966       return;
2967     }
2968
2969   switch (arch)
2970     {
2971     case E_NDS_ARCH_STAR_V1_0:
2972     case E_NDS_ARCH_STAR_V2_0:
2973     case E_NDS_ARCH_STAR_V3_0:
2974     case E_NDS_ARCH_STAR_V3_M:
2975       r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2976       break;
2977
2978     default:
2979       r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2980       /* ARCH version determines how the e_flags are interpreted.
2981          If it is unknown, we cannot proceed.  */
2982       return;
2983     }
2984
2985   /* Newer ABI; Now handle architecture specific flags.  */
2986   if (arch == E_NDS_ARCH_STAR_V1_0)
2987     {
2988       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2989         r += snprintf (buf + r, size -r, ", MFUSR_PC");
2990
2991       if (!(config & E_NDS32_HAS_NO_MAC_INST))
2992         r += snprintf (buf + r, size -r, ", MAC");
2993
2994       if (config & E_NDS32_HAS_DIV_INST)
2995         r += snprintf (buf + r, size -r, ", DIV");
2996
2997       if (config & E_NDS32_HAS_16BIT_INST)
2998         r += snprintf (buf + r, size -r, ", 16b");
2999     }
3000   else
3001     {
3002       if (config & E_NDS32_HAS_MFUSR_PC_INST)
3003         {
3004           if (version <= E_NDS32_ELF_VER_1_3)
3005             r += snprintf (buf + r, size -r, ", [B8]");
3006           else
3007             r += snprintf (buf + r, size -r, ", EX9");
3008         }
3009
3010       if (config & E_NDS32_HAS_MAC_DX_INST)
3011         r += snprintf (buf + r, size -r, ", MAC_DX");
3012
3013       if (config & E_NDS32_HAS_DIV_DX_INST)
3014         r += snprintf (buf + r, size -r, ", DIV_DX");
3015
3016       if (config & E_NDS32_HAS_16BIT_INST)
3017         {
3018           if (version <= E_NDS32_ELF_VER_1_3)
3019             r += snprintf (buf + r, size -r, ", 16b");
3020           else
3021             r += snprintf (buf + r, size -r, ", IFC");
3022         }
3023     }
3024
3025   if (config & E_NDS32_HAS_EXT_INST)
3026     r += snprintf (buf + r, size -r, ", PERF1");
3027
3028   if (config & E_NDS32_HAS_EXT2_INST)
3029     r += snprintf (buf + r, size -r, ", PERF2");
3030
3031   if (config & E_NDS32_HAS_FPU_INST)
3032     {
3033       has_fpu = TRUE;
3034       r += snprintf (buf + r, size -r, ", FPU_SP");
3035     }
3036
3037   if (config & E_NDS32_HAS_FPU_DP_INST)
3038     {
3039       has_fpu = TRUE;
3040       r += snprintf (buf + r, size -r, ", FPU_DP");
3041     }
3042
3043   if (config & E_NDS32_HAS_FPU_MAC_INST)
3044     {
3045       has_fpu = TRUE;
3046       r += snprintf (buf + r, size -r, ", FPU_MAC");
3047     }
3048
3049   if (has_fpu)
3050     {
3051       switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
3052         {
3053         case E_NDS32_FPU_REG_8SP_4DP:
3054           r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
3055           break;
3056         case E_NDS32_FPU_REG_16SP_8DP:
3057           r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
3058           break;
3059         case E_NDS32_FPU_REG_32SP_16DP:
3060           r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
3061           break;
3062         case E_NDS32_FPU_REG_32SP_32DP:
3063           r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
3064           break;
3065         }
3066     }
3067
3068   if (config & E_NDS32_HAS_AUDIO_INST)
3069     r += snprintf (buf + r, size -r, ", AUDIO");
3070
3071   if (config & E_NDS32_HAS_STRING_INST)
3072     r += snprintf (buf + r, size -r, ", STR");
3073
3074   if (config & E_NDS32_HAS_REDUCED_REGS)
3075     r += snprintf (buf + r, size -r, ", 16REG");
3076
3077   if (config & E_NDS32_HAS_VIDEO_INST)
3078     {
3079       if (version <= E_NDS32_ELF_VER_1_3)
3080         r += snprintf (buf + r, size -r, ", VIDEO");
3081       else
3082         r += snprintf (buf + r, size -r, ", SATURATION");
3083     }
3084
3085   if (config & E_NDS32_HAS_ENCRIPT_INST)
3086     r += snprintf (buf + r, size -r, ", ENCRP");
3087
3088   if (config & E_NDS32_HAS_L2C_INST)
3089     r += snprintf (buf + r, size -r, ", L2C");
3090 }
3091
3092 static char *
3093 get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine)
3094 {
3095   static char buf[1024];
3096
3097   buf[0] = '\0';
3098
3099   if (e_flags)
3100     {
3101       switch (e_machine)
3102         {
3103         default:
3104           break;
3105
3106         case EM_ARC_COMPACT2:
3107         case EM_ARC_COMPACT:
3108           decode_ARC_machine_flags (e_flags, e_machine, buf);
3109           break;
3110
3111         case EM_ARM:
3112           decode_ARM_machine_flags (e_flags, buf);
3113           break;
3114
3115         case EM_AVR:
3116           decode_AVR_machine_flags (e_flags, buf, sizeof buf);
3117           break;
3118
3119         case EM_BLACKFIN:
3120           if (e_flags & EF_BFIN_PIC)
3121             strcat (buf, ", PIC");
3122
3123           if (e_flags & EF_BFIN_FDPIC)
3124             strcat (buf, ", FDPIC");
3125
3126           if (e_flags & EF_BFIN_CODE_IN_L1)
3127             strcat (buf, ", code in L1");
3128
3129           if (e_flags & EF_BFIN_DATA_IN_L1)
3130             strcat (buf, ", data in L1");
3131
3132           break;
3133
3134         case EM_CYGNUS_FRV:
3135           switch (e_flags & EF_FRV_CPU_MASK)
3136             {
3137             case EF_FRV_CPU_GENERIC:
3138               break;
3139
3140             default:
3141               strcat (buf, ", fr???");
3142               break;
3143
3144             case EF_FRV_CPU_FR300:
3145               strcat (buf, ", fr300");
3146               break;
3147
3148             case EF_FRV_CPU_FR400:
3149               strcat (buf, ", fr400");
3150               break;
3151             case EF_FRV_CPU_FR405:
3152               strcat (buf, ", fr405");
3153               break;
3154
3155             case EF_FRV_CPU_FR450:
3156               strcat (buf, ", fr450");
3157               break;
3158
3159             case EF_FRV_CPU_FR500:
3160               strcat (buf, ", fr500");
3161               break;
3162             case EF_FRV_CPU_FR550:
3163               strcat (buf, ", fr550");
3164               break;
3165
3166             case EF_FRV_CPU_SIMPLE:
3167               strcat (buf, ", simple");
3168               break;
3169             case EF_FRV_CPU_TOMCAT:
3170               strcat (buf, ", tomcat");
3171               break;
3172             }
3173           break;
3174
3175         case EM_68K:
3176           if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
3177             strcat (buf, ", m68000");
3178           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3179             strcat (buf, ", cpu32");
3180           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
3181             strcat (buf, ", fido_a");
3182           else
3183             {
3184               char const * isa = _("unknown");
3185               char const * mac = _("unknown mac");
3186               char const * additional = NULL;
3187
3188               switch (e_flags & EF_M68K_CF_ISA_MASK)
3189                 {
3190                 case EF_M68K_CF_ISA_A_NODIV:
3191                   isa = "A";
3192                   additional = ", nodiv";
3193                   break;
3194                 case EF_M68K_CF_ISA_A:
3195                   isa = "A";
3196                   break;
3197                 case EF_M68K_CF_ISA_A_PLUS:
3198                   isa = "A+";
3199                   break;
3200                 case EF_M68K_CF_ISA_B_NOUSP:
3201                   isa = "B";
3202                   additional = ", nousp";
3203                   break;
3204                 case EF_M68K_CF_ISA_B:
3205                   isa = "B";
3206                   break;
3207                 case EF_M68K_CF_ISA_C:
3208                   isa = "C";
3209                   break;
3210                 case EF_M68K_CF_ISA_C_NODIV:
3211                   isa = "C";
3212                   additional = ", nodiv";
3213                   break;
3214                 }
3215               strcat (buf, ", cf, isa ");
3216               strcat (buf, isa);
3217               if (additional)
3218                 strcat (buf, additional);
3219               if (e_flags & EF_M68K_CF_FLOAT)
3220                 strcat (buf, ", float");
3221               switch (e_flags & EF_M68K_CF_MAC_MASK)
3222                 {
3223                 case 0:
3224                   mac = NULL;
3225                   break;
3226                 case EF_M68K_CF_MAC:
3227                   mac = "mac";
3228                   break;
3229                 case EF_M68K_CF_EMAC:
3230                   mac = "emac";
3231                   break;
3232                 case EF_M68K_CF_EMAC_B:
3233                   mac = "emac_b";
3234                   break;
3235                 }
3236               if (mac)
3237                 {
3238                   strcat (buf, ", ");
3239                   strcat (buf, mac);
3240                 }
3241             }
3242           break;
3243
3244         case EM_CYGNUS_MEP:
3245           switch (e_flags & EF_MEP_CPU_MASK)
3246             {
3247             case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3248             case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3249             case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3250             case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3251             case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3252             case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3253             default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3254             }
3255
3256           switch (e_flags & EF_MEP_COP_MASK)
3257             {
3258             case EF_MEP_COP_NONE: break;
3259             case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3260             case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3261             case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3262             case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3263             default: strcat (buf, _("<unknown MeP copro type>")); break;
3264             }
3265
3266           if (e_flags & EF_MEP_LIBRARY)
3267             strcat (buf, ", Built for Library");
3268
3269           if (e_flags & EF_MEP_INDEX_MASK)
3270             sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3271                      e_flags & EF_MEP_INDEX_MASK);
3272
3273           if (e_flags & ~ EF_MEP_ALL_FLAGS)
3274             sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3275                      e_flags & ~ EF_MEP_ALL_FLAGS);
3276           break;
3277
3278         case EM_PPC:
3279           if (e_flags & EF_PPC_EMB)
3280             strcat (buf, ", emb");
3281
3282           if (e_flags & EF_PPC_RELOCATABLE)
3283             strcat (buf, _(", relocatable"));
3284
3285           if (e_flags & EF_PPC_RELOCATABLE_LIB)
3286             strcat (buf, _(", relocatable-lib"));
3287           break;
3288
3289         case EM_PPC64:
3290           if (e_flags & EF_PPC64_ABI)
3291             {
3292               char abi[] = ", abiv0";
3293
3294               abi[6] += e_flags & EF_PPC64_ABI;
3295               strcat (buf, abi);
3296             }
3297           break;
3298
3299         case EM_V800:
3300           if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3301             strcat (buf, ", RH850 ABI");
3302
3303           if (e_flags & EF_V800_850E3)
3304             strcat (buf, ", V3 architecture");
3305
3306           if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3307             strcat (buf, ", FPU not used");
3308
3309           if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3310             strcat (buf, ", regmode: COMMON");
3311
3312           if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3313             strcat (buf, ", r4 not used");
3314
3315           if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3316             strcat (buf, ", r30 not used");
3317
3318           if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3319             strcat (buf, ", r5 not used");
3320
3321           if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3322             strcat (buf, ", r2 not used");
3323
3324           for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3325             {
3326               switch (e_flags & - e_flags)
3327                 {
3328                 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3329                 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3330                 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3331                 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3332                 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3333                 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3334                 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3335                 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3336                 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3337                 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3338                 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3339                 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3340                 default: break;
3341                 }
3342             }
3343           break;
3344
3345         case EM_V850:
3346         case EM_CYGNUS_V850:
3347           switch (e_flags & EF_V850_ARCH)
3348             {
3349             case E_V850E3V5_ARCH:
3350               strcat (buf, ", v850e3v5");
3351               break;
3352             case E_V850E2V3_ARCH:
3353               strcat (buf, ", v850e2v3");
3354               break;
3355             case E_V850E2_ARCH:
3356               strcat (buf, ", v850e2");
3357               break;
3358             case E_V850E1_ARCH:
3359               strcat (buf, ", v850e1");
3360               break;
3361             case E_V850E_ARCH:
3362               strcat (buf, ", v850e");
3363               break;
3364             case E_V850_ARCH:
3365               strcat (buf, ", v850");
3366               break;
3367             default:
3368               strcat (buf, _(", unknown v850 architecture variant"));
3369               break;
3370             }
3371           break;
3372
3373         case EM_M32R:
3374         case EM_CYGNUS_M32R:
3375           if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3376             strcat (buf, ", m32r");
3377           break;
3378
3379         case EM_MIPS:
3380         case EM_MIPS_RS3_LE:
3381           if (e_flags & EF_MIPS_NOREORDER)
3382             strcat (buf, ", noreorder");
3383
3384           if (e_flags & EF_MIPS_PIC)
3385             strcat (buf, ", pic");
3386
3387           if (e_flags & EF_MIPS_CPIC)
3388             strcat (buf, ", cpic");
3389
3390           if (e_flags & EF_MIPS_UCODE)
3391             strcat (buf, ", ugen_reserved");
3392
3393           if (e_flags & EF_MIPS_ABI2)
3394             strcat (buf, ", abi2");
3395
3396           if (e_flags & EF_MIPS_OPTIONS_FIRST)
3397             strcat (buf, ", odk first");
3398
3399           if (e_flags & EF_MIPS_32BITMODE)
3400             strcat (buf, ", 32bitmode");
3401
3402           if (e_flags & EF_MIPS_NAN2008)
3403             strcat (buf, ", nan2008");
3404
3405           if (e_flags & EF_MIPS_FP64)
3406             strcat (buf, ", fp64");
3407
3408           switch ((e_flags & EF_MIPS_MACH))
3409             {
3410             case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3411             case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3412             case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3413             case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3414             case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3415             case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3416             case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3417             case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3418             case E_MIPS_MACH_5900: strcat (buf, ", 5900"); break;
3419             case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
3420             case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3421             case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3422             case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3423             case E_MIPS_MACH_GS464: strcat (buf, ", gs464"); break;
3424             case E_MIPS_MACH_GS464E: strcat (buf, ", gs464e"); break;
3425             case E_MIPS_MACH_GS264E: strcat (buf, ", gs264e"); break;
3426             case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3427             case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3428             case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3429             case E_MIPS_MACH_XLR:  strcat (buf, ", xlr"); break;
3430             case E_MIPS_MACH_IAMR2:  strcat (buf, ", interaptiv-mr2"); break;
3431             case 0:
3432             /* We simply ignore the field in this case to avoid confusion:
3433                MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3434                extension.  */
3435               break;
3436             default: strcat (buf, _(", unknown CPU")); break;
3437             }
3438
3439           switch ((e_flags & EF_MIPS_ABI))
3440             {
3441             case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3442             case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3443             case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3444             case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3445             case 0:
3446             /* We simply ignore the field in this case to avoid confusion:
3447                MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3448                This means it is likely to be an o32 file, but not for
3449                sure.  */
3450               break;
3451             default: strcat (buf, _(", unknown ABI")); break;
3452             }
3453
3454           if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3455             strcat (buf, ", mdmx");
3456
3457           if (e_flags & EF_MIPS_ARCH_ASE_M16)
3458             strcat (buf, ", mips16");
3459
3460           if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3461             strcat (buf, ", micromips");
3462
3463           switch ((e_flags & EF_MIPS_ARCH))
3464             {
3465             case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3466             case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3467             case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3468             case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3469             case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3470             case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3471             case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3472             case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3473             case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3474             case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3475             case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3476             default: strcat (buf, _(", unknown ISA")); break;
3477             }
3478           break;
3479
3480         case EM_NDS32:
3481           decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3482           break;
3483
3484         case EM_NFP:
3485           switch (EF_NFP_MACH (e_flags))
3486             {
3487             case E_NFP_MACH_3200:
3488               strcat (buf, ", NFP-32xx");
3489               break;
3490             case E_NFP_MACH_6000:
3491               strcat (buf, ", NFP-6xxx");
3492               break;
3493             }
3494           break;
3495
3496         case EM_RISCV:
3497           if (e_flags & EF_RISCV_RVC)
3498             strcat (buf, ", RVC");
3499
3500           if (e_flags & EF_RISCV_RVE)
3501             strcat (buf, ", RVE");
3502
3503           switch (e_flags & EF_RISCV_FLOAT_ABI)
3504             {
3505             case EF_RISCV_FLOAT_ABI_SOFT:
3506               strcat (buf, ", soft-float ABI");
3507               break;
3508
3509             case EF_RISCV_FLOAT_ABI_SINGLE:
3510               strcat (buf, ", single-float ABI");
3511               break;
3512
3513             case EF_RISCV_FLOAT_ABI_DOUBLE:
3514               strcat (buf, ", double-float ABI");
3515               break;
3516
3517             case EF_RISCV_FLOAT_ABI_QUAD:
3518               strcat (buf, ", quad-float ABI");
3519               break;
3520             }
3521           break;
3522
3523         case EM_SH:
3524           switch ((e_flags & EF_SH_MACH_MASK))
3525             {
3526             case EF_SH1: strcat (buf, ", sh1"); break;
3527             case EF_SH2: strcat (buf, ", sh2"); break;
3528             case EF_SH3: strcat (buf, ", sh3"); break;
3529             case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3530             case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3531             case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3532             case EF_SH3E: strcat (buf, ", sh3e"); break;
3533             case EF_SH4: strcat (buf, ", sh4"); break;
3534             case EF_SH5: strcat (buf, ", sh5"); break;
3535             case EF_SH2E: strcat (buf, ", sh2e"); break;
3536             case EF_SH4A: strcat (buf, ", sh4a"); break;
3537             case EF_SH2A: strcat (buf, ", sh2a"); break;
3538             case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3539             case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3540             case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3541             case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3542             case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3543             case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3544             case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3545             case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3546             case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3547             default: strcat (buf, _(", unknown ISA")); break;
3548             }
3549
3550           if (e_flags & EF_SH_PIC)
3551             strcat (buf, ", pic");
3552
3553           if (e_flags & EF_SH_FDPIC)
3554             strcat (buf, ", fdpic");
3555           break;
3556
3557         case EM_OR1K:
3558           if (e_flags & EF_OR1K_NODELAY)
3559             strcat (buf, ", no delay");
3560           break;
3561
3562         case EM_SPARCV9:
3563           if (e_flags & EF_SPARC_32PLUS)
3564             strcat (buf, ", v8+");
3565
3566           if (e_flags & EF_SPARC_SUN_US1)
3567             strcat (buf, ", ultrasparcI");
3568
3569           if (e_flags & EF_SPARC_SUN_US3)
3570             strcat (buf, ", ultrasparcIII");
3571
3572           if (e_flags & EF_SPARC_HAL_R1)
3573             strcat (buf, ", halr1");
3574
3575           if (e_flags & EF_SPARC_LEDATA)
3576             strcat (buf, ", ledata");
3577
3578           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3579             strcat (buf, ", tso");
3580
3581           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3582             strcat (buf, ", pso");
3583
3584           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3585             strcat (buf, ", rmo");
3586           break;
3587
3588         case EM_PARISC:
3589           switch (e_flags & EF_PARISC_ARCH)
3590             {
3591             case EFA_PARISC_1_0:
3592               strcpy (buf, ", PA-RISC 1.0");
3593               break;
3594             case EFA_PARISC_1_1:
3595               strcpy (buf, ", PA-RISC 1.1");
3596               break;
3597             case EFA_PARISC_2_0:
3598               strcpy (buf, ", PA-RISC 2.0");
3599               break;
3600             default:
3601               break;
3602             }
3603           if (e_flags & EF_PARISC_TRAPNIL)
3604             strcat (buf, ", trapnil");
3605           if (e_flags & EF_PARISC_EXT)
3606             strcat (buf, ", ext");
3607           if (e_flags & EF_PARISC_LSB)
3608             strcat (buf, ", lsb");
3609           if (e_flags & EF_PARISC_WIDE)
3610             strcat (buf, ", wide");
3611           if (e_flags & EF_PARISC_NO_KABP)
3612             strcat (buf, ", no kabp");
3613           if (e_flags & EF_PARISC_LAZYSWAP)
3614             strcat (buf, ", lazyswap");
3615           break;
3616
3617         case EM_PJ:
3618         case EM_PJ_OLD:
3619           if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3620             strcat (buf, ", new calling convention");
3621
3622           if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3623             strcat (buf, ", gnu calling convention");
3624           break;
3625
3626         case EM_IA_64:
3627           if ((e_flags & EF_IA_64_ABI64))
3628             strcat (buf, ", 64-bit");
3629           else
3630             strcat (buf, ", 32-bit");
3631           if ((e_flags & EF_IA_64_REDUCEDFP))
3632             strcat (buf, ", reduced fp model");
3633           if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3634             strcat (buf, ", no function descriptors, constant gp");
3635           else if ((e_flags & EF_IA_64_CONS_GP))
3636             strcat (buf, ", constant gp");
3637           if ((e_flags & EF_IA_64_ABSOLUTE))
3638             strcat (buf, ", absolute");
3639           if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3640             {
3641               if ((e_flags & EF_IA_64_VMS_LINKAGES))
3642                 strcat (buf, ", vms_linkages");
3643               switch ((e_flags & EF_IA_64_VMS_COMCOD))
3644                 {
3645                 case EF_IA_64_VMS_COMCOD_SUCCESS:
3646                   break;
3647                 case EF_IA_64_VMS_COMCOD_WARNING:
3648                   strcat (buf, ", warning");
3649                   break;
3650                 case EF_IA_64_VMS_COMCOD_ERROR:
3651                   strcat (buf, ", error");
3652                   break;
3653                 case EF_IA_64_VMS_COMCOD_ABORT:
3654                   strcat (buf, ", abort");
3655                   break;
3656                 default:
3657                   warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3658                         e_flags & EF_IA_64_VMS_COMCOD);
3659                   strcat (buf, ", <unknown>");
3660                 }
3661             }
3662           break;
3663
3664         case EM_VAX:
3665           if ((e_flags & EF_VAX_NONPIC))
3666             strcat (buf, ", non-PIC");
3667           if ((e_flags & EF_VAX_DFLOAT))
3668             strcat (buf, ", D-Float");
3669           if ((e_flags & EF_VAX_GFLOAT))
3670             strcat (buf, ", G-Float");
3671           break;
3672
3673         case EM_VISIUM:
3674           if (e_flags & EF_VISIUM_ARCH_MCM)
3675             strcat (buf, ", mcm");
3676           else if (e_flags & EF_VISIUM_ARCH_MCM24)
3677             strcat (buf, ", mcm24");
3678           if (e_flags & EF_VISIUM_ARCH_GR6)
3679             strcat (buf, ", gr6");
3680           break;
3681
3682         case EM_RL78:
3683           switch (e_flags & E_FLAG_RL78_CPU_MASK)
3684             {
3685             case E_FLAG_RL78_ANY_CPU: break;
3686             case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3687             case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3688             case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3689             }
3690           if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3691             strcat (buf, ", 64-bit doubles");
3692           break;
3693
3694         case EM_RX:
3695           if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3696             strcat (buf, ", 64-bit doubles");
3697           if (e_flags & E_FLAG_RX_DSP)
3698             strcat (buf, ", dsp");
3699           if (e_flags & E_FLAG_RX_PID)
3700             strcat (buf, ", pid");
3701           if (e_flags & E_FLAG_RX_ABI)
3702             strcat (buf, ", RX ABI");
3703           if (e_flags & E_FLAG_RX_SINSNS_SET)
3704             strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3705                     ? ", uses String instructions" : ", bans String instructions");
3706           if (e_flags & E_FLAG_RX_V2)
3707             strcat (buf, ", V2");
3708           if (e_flags & E_FLAG_RX_V3)
3709             strcat (buf, ", V3");
3710           break;
3711
3712         case EM_S390:
3713           if (e_flags & EF_S390_HIGH_GPRS)
3714             strcat (buf, ", highgprs");
3715           break;
3716
3717         case EM_TI_C6000:
3718           if ((e_flags & EF_C6000_REL))
3719             strcat (buf, ", relocatable module");
3720           break;
3721
3722         case EM_MSP430:
3723           strcat (buf, _(": architecture variant: "));
3724           switch (e_flags & EF_MSP430_MACH)
3725             {
3726             case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3727             case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3728             case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3729             case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3730             case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3731             case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3732             case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3733             case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3734             case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3735             case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3736             case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3737             case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3738             case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3739             case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3740             case E_MSP430_MACH_MSP430X  : strcat (buf, "MSP430X"); break;
3741             default:
3742               strcat (buf, _(": unknown")); break;
3743             }
3744
3745           if (e_flags & ~ EF_MSP430_MACH)
3746             strcat (buf, _(": unknown extra flag bits also present"));
3747         }
3748     }
3749
3750   return buf;
3751 }
3752
3753 static const char *
3754 get_osabi_name (Filedata * filedata, unsigned int osabi)
3755 {
3756   static char buff[32];
3757
3758   switch (osabi)
3759     {
3760     case ELFOSABI_NONE:         return "UNIX - System V";
3761     case ELFOSABI_HPUX:         return "UNIX - HP-UX";
3762     case ELFOSABI_NETBSD:       return "UNIX - NetBSD";
3763     case ELFOSABI_GNU:          return "UNIX - GNU";
3764     case ELFOSABI_SOLARIS:      return "UNIX - Solaris";
3765     case ELFOSABI_AIX:          return "UNIX - AIX";
3766     case ELFOSABI_IRIX:         return "UNIX - IRIX";
3767     case ELFOSABI_FREEBSD:      return "UNIX - FreeBSD";
3768     case ELFOSABI_TRU64:        return "UNIX - TRU64";
3769     case ELFOSABI_MODESTO:      return "Novell - Modesto";
3770     case ELFOSABI_OPENBSD:      return "UNIX - OpenBSD";
3771     case ELFOSABI_OPENVMS:      return "VMS - OpenVMS";
3772     case ELFOSABI_NSK:          return "HP - Non-Stop Kernel";
3773     case ELFOSABI_AROS:         return "AROS";
3774     case ELFOSABI_FENIXOS:      return "FenixOS";
3775     case ELFOSABI_CLOUDABI:     return "Nuxi CloudABI";
3776     case ELFOSABI_OPENVOS:      return "Stratus Technologies OpenVOS";
3777     default:
3778       if (osabi >= 64)
3779         switch (filedata->file_header.e_machine)
3780           {
3781           case EM_ARM:
3782             switch (osabi)
3783               {
3784               case ELFOSABI_ARM:        return "ARM";
3785               case ELFOSABI_ARM_FDPIC:  return "ARM FDPIC";
3786               default:
3787                 break;
3788               }
3789             break;
3790
3791           case EM_MSP430:
3792           case EM_MSP430_OLD:
3793           case EM_VISIUM:
3794             switch (osabi)
3795               {
3796               case ELFOSABI_STANDALONE: return _("Standalone App");
3797               default:
3798                 break;
3799               }
3800             break;
3801
3802           case EM_TI_C6000:
3803             switch (osabi)
3804               {
3805               case ELFOSABI_C6000_ELFABI:       return _("Bare-metal C6000");
3806               case ELFOSABI_C6000_LINUX:        return "Linux C6000";
3807               default:
3808                 break;
3809               }
3810             break;
3811
3812           default:
3813             break;
3814           }
3815       snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3816       return buff;
3817     }
3818 }
3819
3820 static const char *
3821 get_aarch64_segment_type (unsigned long type)
3822 {
3823   switch (type)
3824     {
3825     case PT_AARCH64_ARCHEXT:  return "AARCH64_ARCHEXT";
3826     default:                  return NULL;
3827     }
3828 }
3829
3830 static const char *
3831 get_arm_segment_type (unsigned long type)
3832 {
3833   switch (type)
3834     {
3835     case PT_ARM_EXIDX: return "EXIDX";
3836     default:           return NULL;
3837     }
3838 }
3839
3840 static const char *
3841 get_s390_segment_type (unsigned long type)
3842 {
3843   switch (type)
3844     {
3845     case PT_S390_PGSTE: return "S390_PGSTE";
3846     default:            return NULL;
3847     }
3848 }
3849
3850 static const char *
3851 get_mips_segment_type (unsigned long type)
3852 {
3853   switch (type)
3854     {
3855     case PT_MIPS_REGINFO:   return "REGINFO";
3856     case PT_MIPS_RTPROC:    return "RTPROC";
3857     case PT_MIPS_OPTIONS:   return "OPTIONS";
3858     case PT_MIPS_ABIFLAGS:  return "ABIFLAGS";
3859     default:                return NULL;
3860     }
3861 }
3862
3863 static const char *
3864 get_parisc_segment_type (unsigned long type)
3865 {
3866   switch (type)
3867     {
3868     case PT_HP_TLS:             return "HP_TLS";
3869     case PT_HP_CORE_NONE:       return "HP_CORE_NONE";
3870     case PT_HP_CORE_VERSION:    return "HP_CORE_VERSION";
3871     case PT_HP_CORE_KERNEL:     return "HP_CORE_KERNEL";
3872     case PT_HP_CORE_COMM:       return "HP_CORE_COMM";
3873     case PT_HP_CORE_PROC:       return "HP_CORE_PROC";
3874     case PT_HP_CORE_LOADABLE:   return "HP_CORE_LOADABLE";
3875     case PT_HP_CORE_STACK:      return "HP_CORE_STACK";
3876     case PT_HP_CORE_SHM:        return "HP_CORE_SHM";
3877     case PT_HP_CORE_MMF:        return "HP_CORE_MMF";
3878     case PT_HP_PARALLEL:        return "HP_PARALLEL";
3879     case PT_HP_FASTBIND:        return "HP_FASTBIND";
3880     case PT_HP_OPT_ANNOT:       return "HP_OPT_ANNOT";
3881     case PT_HP_HSL_ANNOT:       return "HP_HSL_ANNOT";
3882     case PT_HP_STACK:           return "HP_STACK";
3883     case PT_HP_CORE_UTSNAME:    return "HP_CORE_UTSNAME";
3884     case PT_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
3885     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
3886     case PT_PARISC_WEAKORDER:   return "PARISC_WEAKORDER";
3887     default:                    return NULL;
3888     }
3889 }
3890
3891 static const char *
3892 get_ia64_segment_type (unsigned long type)
3893 {
3894   switch (type)
3895     {
3896     case PT_IA_64_ARCHEXT:      return "IA_64_ARCHEXT";
3897     case PT_IA_64_UNWIND:       return "IA_64_UNWIND";
3898     case PT_HP_TLS:             return "HP_TLS";
3899     case PT_IA_64_HP_OPT_ANOT:  return "HP_OPT_ANNOT";
3900     case PT_IA_64_HP_HSL_ANOT:  return "HP_HSL_ANNOT";
3901     case PT_IA_64_HP_STACK:     return "HP_STACK";
3902     default:                    return NULL;
3903     }
3904 }
3905
3906 static const char *
3907 get_tic6x_segment_type (unsigned long type)
3908 {
3909   switch (type)
3910     {
3911     case PT_C6000_PHATTR:  return "C6000_PHATTR";
3912     default:               return NULL;
3913     }
3914 }
3915
3916 static const char *
3917 get_solaris_segment_type (unsigned long type)
3918 {
3919   switch (type)
3920     {
3921     case 0x6464e550: return "PT_SUNW_UNWIND";
3922     case 0x6474e550: return "PT_SUNW_EH_FRAME";
3923     case 0x6ffffff7: return "PT_LOSUNW";
3924     case 0x6ffffffa: return "PT_SUNWBSS";
3925     case 0x6ffffffb: return "PT_SUNWSTACK";
3926     case 0x6ffffffc: return "PT_SUNWDTRACE";
3927     case 0x6ffffffd: return "PT_SUNWCAP";
3928     case 0x6fffffff: return "PT_HISUNW";
3929     default:         return NULL;
3930     }
3931 }
3932
3933 static const char *
3934 get_segment_type (Filedata * filedata, unsigned long p_type)
3935 {
3936   static char buff[32];
3937
3938   switch (p_type)
3939     {
3940     case PT_NULL:       return "NULL";
3941     case PT_LOAD:       return "LOAD";
3942     case PT_DYNAMIC:    return "DYNAMIC";
3943     case PT_INTERP:     return "INTERP";
3944     case PT_NOTE:       return "NOTE";
3945     case PT_SHLIB:      return "SHLIB";
3946     case PT_PHDR:       return "PHDR";
3947     case PT_TLS:        return "TLS";
3948     case PT_GNU_EH_FRAME: return "GNU_EH_FRAME";
3949     case PT_GNU_STACK:  return "GNU_STACK";
3950     case PT_GNU_RELRO:  return "GNU_RELRO";
3951     case PT_GNU_PROPERTY: return "GNU_PROPERTY";
3952
3953     default:
3954       if (p_type >= PT_GNU_MBIND_LO && p_type <= PT_GNU_MBIND_HI)
3955         {
3956           sprintf (buff, "GNU_MBIND+%#lx",
3957                    p_type - PT_GNU_MBIND_LO);
3958         }
3959       else if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3960         {
3961           const char * result;
3962
3963           switch (filedata->file_header.e_machine)
3964             {
3965             case EM_AARCH64:
3966               result = get_aarch64_segment_type (p_type);
3967               break;
3968             case EM_ARM:
3969               result = get_arm_segment_type (p_type);
3970               break;
3971             case EM_MIPS:
3972             case EM_MIPS_RS3_LE:
3973               result = get_mips_segment_type (p_type);
3974               break;
3975             case EM_PARISC:
3976               result = get_parisc_segment_type (p_type);
3977               break;
3978             case EM_IA_64:
3979               result = get_ia64_segment_type (p_type);
3980               break;
3981             case EM_TI_C6000:
3982               result = get_tic6x_segment_type (p_type);
3983               break;
3984             case EM_S390:
3985             case EM_S390_OLD:
3986               result = get_s390_segment_type (p_type);
3987               break;
3988             default:
3989               result = NULL;
3990               break;
3991             }
3992
3993           if (result != NULL)
3994             return result;
3995
3996           sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
3997         }
3998       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3999         {
4000           const char * result;
4001
4002           switch (filedata->file_header.e_machine)
4003             {
4004             case EM_PARISC:
4005               result = get_parisc_segment_type (p_type);
4006               break;
4007             case EM_IA_64:
4008               result = get_ia64_segment_type (p_type);
4009               break;
4010             default:
4011               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4012                 result = get_solaris_segment_type (p_type);
4013               else
4014                 result = NULL;
4015               break;
4016             }
4017
4018           if (result != NULL)
4019             return result;
4020
4021           sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
4022         }
4023       else
4024         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
4025
4026       return buff;
4027     }
4028 }
4029
4030 static const char *
4031 get_arc_section_type_name (unsigned int sh_type)
4032 {
4033   switch (sh_type)
4034     {
4035     case SHT_ARC_ATTRIBUTES:      return "ARC_ATTRIBUTES";
4036     default:
4037       break;
4038     }
4039   return NULL;
4040 }
4041
4042 static const char *
4043 get_mips_section_type_name (unsigned int sh_type)
4044 {
4045   switch (sh_type)
4046     {
4047     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
4048     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
4049     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
4050     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
4051     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
4052     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
4053     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
4054     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
4055     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
4056     case SHT_MIPS_RELD:          return "MIPS_RELD";
4057     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
4058     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
4059     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
4060     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
4061     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
4062     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
4063     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
4064     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
4065     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
4066     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
4067     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
4068     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
4069     case SHT_MIPS_LINE:          return "MIPS_LINE";
4070     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
4071     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
4072     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
4073     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
4074     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
4075     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
4076     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
4077     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
4078     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
4079     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
4080     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
4081     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
4082     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
4083     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
4084     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
4085     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
4086     case SHT_MIPS_ABIFLAGS:      return "MIPS_ABIFLAGS";
4087     default:
4088       break;
4089     }
4090   return NULL;
4091 }
4092
4093 static const char *
4094 get_parisc_section_type_name (unsigned int sh_type)
4095 {
4096   switch (sh_type)
4097     {
4098     case SHT_PARISC_EXT:        return "PARISC_EXT";
4099     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
4100     case SHT_PARISC_DOC:        return "PARISC_DOC";
4101     case SHT_PARISC_ANNOT:      return "PARISC_ANNOT";
4102     case SHT_PARISC_SYMEXTN:    return "PARISC_SYMEXTN";
4103     case SHT_PARISC_STUBS:      return "PARISC_STUBS";
4104     case SHT_PARISC_DLKM:       return "PARISC_DLKM";
4105     default:                    return NULL;
4106     }
4107 }
4108
4109 static const char *
4110 get_ia64_section_type_name (Filedata * filedata, unsigned int sh_type)
4111 {
4112   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
4113   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
4114     return get_osabi_name (filedata, (sh_type & 0x00FF0000) >> 16);
4115
4116   switch (sh_type)
4117     {
4118     case SHT_IA_64_EXT:                return "IA_64_EXT";
4119     case SHT_IA_64_UNWIND:             return "IA_64_UNWIND";
4120     case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
4121     case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
4122     case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
4123     case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
4124     case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
4125     case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
4126     case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
4127     case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
4128     default:
4129       break;
4130     }
4131   return NULL;
4132 }
4133
4134 static const char *
4135 get_x86_64_section_type_name (unsigned int sh_type)
4136 {
4137   switch (sh_type)
4138     {
4139     case SHT_X86_64_UNWIND:     return "X86_64_UNWIND";
4140     default:                    return NULL;
4141     }
4142 }
4143
4144 static const char *
4145 get_aarch64_section_type_name (unsigned int sh_type)
4146 {
4147   switch (sh_type)
4148     {
4149     case SHT_AARCH64_ATTRIBUTES: return "AARCH64_ATTRIBUTES";
4150     default:                     return NULL;
4151     }
4152 }
4153
4154 static const char *
4155 get_arm_section_type_name (unsigned int sh_type)
4156 {
4157   switch (sh_type)
4158     {
4159     case SHT_ARM_EXIDX:           return "ARM_EXIDX";
4160     case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
4161     case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
4162     case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
4163     case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
4164     default:                      return NULL;
4165     }
4166 }
4167
4168 static const char *
4169 get_tic6x_section_type_name (unsigned int sh_type)
4170 {
4171   switch (sh_type)
4172     {
4173     case SHT_C6000_UNWIND:      return "C6000_UNWIND";
4174     case SHT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
4175     case SHT_C6000_ATTRIBUTES:  return "C6000_ATTRIBUTES";
4176     case SHT_TI_ICODE:          return "TI_ICODE";
4177     case SHT_TI_XREF:           return "TI_XREF";
4178     case SHT_TI_HANDLER:        return "TI_HANDLER";
4179     case SHT_TI_INITINFO:       return "TI_INITINFO";
4180     case SHT_TI_PHATTRS:        return "TI_PHATTRS";
4181     default:                    return NULL;
4182     }
4183 }
4184
4185 static const char *
4186 get_msp430x_section_type_name (unsigned int sh_type)
4187 {
4188   switch (sh_type)
4189     {
4190     case SHT_MSP430_SEC_FLAGS:    return "MSP430_SEC_FLAGS";
4191     case SHT_MSP430_SYM_ALIASES:  return "MSP430_SYM_ALIASES";
4192     case SHT_MSP430_ATTRIBUTES:   return "MSP430_ATTRIBUTES";
4193     default:                      return NULL;
4194     }
4195 }
4196
4197 static const char *
4198 get_nfp_section_type_name (unsigned int sh_type)
4199 {
4200   switch (sh_type)
4201     {
4202     case SHT_NFP_MECONFIG:      return "NFP_MECONFIG";
4203     case SHT_NFP_INITREG:       return "NFP_INITREG";
4204     case SHT_NFP_UDEBUG:        return "NFP_UDEBUG";
4205     default:                    return NULL;
4206     }
4207 }
4208
4209 static const char *
4210 get_v850_section_type_name (unsigned int sh_type)
4211 {
4212   switch (sh_type)
4213     {
4214     case SHT_V850_SCOMMON:  return "V850 Small Common";
4215     case SHT_V850_TCOMMON:  return "V850 Tiny Common";
4216     case SHT_V850_ZCOMMON:  return "V850 Zero Common";
4217     case SHT_RENESAS_IOP:   return "RENESAS IOP";
4218     case SHT_RENESAS_INFO:  return "RENESAS INFO";
4219     default:                return NULL;
4220     }
4221 }
4222
4223 static const char *
4224 get_riscv_section_type_name (unsigned int sh_type)
4225 {
4226   switch (sh_type)
4227     {
4228     case SHT_RISCV_ATTRIBUTES:  return "RISCV_ATTRIBUTES";
4229     default: return NULL;
4230     }
4231 }
4232
4233 static const char *
4234 get_section_type_name (Filedata * filedata, unsigned int sh_type)
4235 {
4236   static char buff[32];
4237   const char * result;
4238
4239   switch (sh_type)
4240     {
4241     case SHT_NULL:              return "NULL";
4242     case SHT_PROGBITS:          return "PROGBITS";
4243     case SHT_SYMTAB:            return "SYMTAB";
4244     case SHT_STRTAB:            return "STRTAB";
4245     case SHT_RELA:              return "RELA";
4246     case SHT_HASH:              return "HASH";
4247     case SHT_DYNAMIC:           return "DYNAMIC";
4248     case SHT_NOTE:              return "NOTE";
4249     case SHT_NOBITS:            return "NOBITS";
4250     case SHT_REL:               return "REL";
4251     case SHT_SHLIB:             return "SHLIB";
4252     case SHT_DYNSYM:            return "DYNSYM";
4253     case SHT_INIT_ARRAY:        return "INIT_ARRAY";
4254     case SHT_FINI_ARRAY:        return "FINI_ARRAY";
4255     case SHT_PREINIT_ARRAY:     return "PREINIT_ARRAY";
4256     case SHT_GNU_HASH:          return "GNU_HASH";
4257     case SHT_GROUP:             return "GROUP";
4258     case SHT_SYMTAB_SHNDX:      return "SYMTAB SECTION INDICES";
4259     case SHT_GNU_verdef:        return "VERDEF";
4260     case SHT_GNU_verneed:       return "VERNEED";
4261     case SHT_GNU_versym:        return "VERSYM";
4262     case 0x6ffffff0:            return "VERSYM";
4263     case 0x6ffffffc:            return "VERDEF";
4264     case 0x7ffffffd:            return "AUXILIARY";
4265     case 0x7fffffff:            return "FILTER";
4266     case SHT_GNU_LIBLIST:       return "GNU_LIBLIST";
4267
4268     default:
4269       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4270         {
4271           switch (filedata->file_header.e_machine)
4272             {
4273             case EM_ARC:
4274             case EM_ARC_COMPACT:
4275             case EM_ARC_COMPACT2:
4276               result = get_arc_section_type_name (sh_type);
4277               break;
4278             case EM_MIPS:
4279             case EM_MIPS_RS3_LE:
4280               result = get_mips_section_type_name (sh_type);
4281               break;
4282             case EM_PARISC:
4283               result = get_parisc_section_type_name (sh_type);
4284               break;
4285             case EM_IA_64:
4286               result = get_ia64_section_type_name (filedata, sh_type);
4287               break;
4288             case EM_X86_64:
4289             case EM_L1OM:
4290             case EM_K1OM:
4291               result = get_x86_64_section_type_name (sh_type);
4292               break;
4293             case EM_AARCH64:
4294               result = get_aarch64_section_type_name (sh_type);
4295               break;
4296             case EM_ARM:
4297               result = get_arm_section_type_name (sh_type);
4298               break;
4299             case EM_TI_C6000:
4300               result = get_tic6x_section_type_name (sh_type);
4301               break;
4302             case EM_MSP430:
4303               result = get_msp430x_section_type_name (sh_type);
4304               break;
4305             case EM_NFP:
4306               result = get_nfp_section_type_name (sh_type);
4307               break;
4308             case EM_V800:
4309             case EM_V850:
4310             case EM_CYGNUS_V850:
4311               result = get_v850_section_type_name (sh_type);
4312               break;
4313             case EM_RISCV:
4314               result = get_riscv_section_type_name (sh_type);
4315               break;
4316             default:
4317               result = NULL;
4318               break;
4319             }
4320
4321           if (result != NULL)
4322             return result;
4323
4324           sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4325         }
4326       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4327         {
4328           switch (filedata->file_header.e_machine)
4329             {
4330             case EM_IA_64:
4331               result = get_ia64_section_type_name (filedata, sh_type);
4332               break;
4333             default:
4334               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4335                 result = get_solaris_section_type (sh_type);
4336               else
4337                 {
4338                   switch (sh_type)
4339                     {
4340                     case SHT_GNU_INCREMENTAL_INPUTS: result = "GNU_INCREMENTAL_INPUTS"; break;
4341                     case SHT_GNU_ATTRIBUTES: result = "GNU_ATTRIBUTES"; break;
4342                     case SHT_GNU_HASH: result = "GNU_HASH"; break;
4343                     case SHT_GNU_LIBLIST: result = "GNU_LIBLIST"; break;
4344                     default:
4345                       result = NULL;
4346                       break;
4347                     }
4348                 }
4349               break;
4350             }
4351
4352           if (result != NULL)
4353             return result;
4354
4355           sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4356         }
4357       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4358         {
4359           switch (filedata->file_header.e_machine)
4360             {
4361             case EM_V800:
4362             case EM_V850:
4363             case EM_CYGNUS_V850:
4364               result = get_v850_section_type_name (sh_type);
4365               break;
4366             default:
4367               result = NULL;
4368               break;
4369             }
4370
4371           if (result != NULL)
4372             return result;
4373
4374           sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4375         }
4376       else
4377         /* This message is probably going to be displayed in a 15
4378            character wide field, so put the hex value first.  */
4379         snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4380
4381       return buff;
4382     }
4383 }
4384
4385 #define OPTION_DEBUG_DUMP       512
4386 #define OPTION_DYN_SYMS         513
4387 #define OPTION_DWARF_DEPTH      514
4388 #define OPTION_DWARF_START      515
4389 #define OPTION_DWARF_CHECK      516
4390
4391 static struct option options[] =
4392 {
4393   {"all",              no_argument, 0, 'a'},
4394   {"file-header",      no_argument, 0, 'h'},
4395   {"program-headers",  no_argument, 0, 'l'},
4396   {"headers",          no_argument, 0, 'e'},
4397   {"histogram",        no_argument, 0, 'I'},
4398   {"segments",         no_argument, 0, 'l'},
4399   {"sections",         no_argument, 0, 'S'},
4400   {"section-headers",  no_argument, 0, 'S'},
4401   {"section-groups",   no_argument, 0, 'g'},
4402   {"section-details",  no_argument, 0, 't'},
4403   {"full-section-name",no_argument, 0, 'N'},
4404   {"symbols",          no_argument, 0, 's'},
4405   {"syms",             no_argument, 0, 's'},
4406   {"dyn-syms",         no_argument, 0, OPTION_DYN_SYMS},
4407   {"relocs",           no_argument, 0, 'r'},
4408   {"notes",            no_argument, 0, 'n'},
4409   {"dynamic",          no_argument, 0, 'd'},
4410   {"arch-specific",    no_argument, 0, 'A'},
4411   {"version-info",     no_argument, 0, 'V'},
4412   {"use-dynamic",      no_argument, 0, 'D'},
4413   {"unwind",           no_argument, 0, 'u'},
4414   {"archive-index",    no_argument, 0, 'c'},
4415   {"hex-dump",         required_argument, 0, 'x'},
4416   {"relocated-dump",   required_argument, 0, 'R'},
4417   {"string-dump",      required_argument, 0, 'p'},
4418   {"decompress",       no_argument, 0, 'z'},
4419 #ifdef SUPPORT_DISASSEMBLY
4420   {"instruction-dump", required_argument, 0, 'i'},
4421 #endif
4422   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
4423
4424   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
4425   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
4426   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
4427
4428   {"version",          no_argument, 0, 'v'},
4429   {"wide",             no_argument, 0, 'W'},
4430   {"help",             no_argument, 0, 'H'},
4431   {0,                  no_argument, 0, 0}
4432 };
4433
4434 static void
4435 usage (FILE * stream)
4436 {
4437   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4438   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4439   fprintf (stream, _(" Options are:\n\
4440   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4441   -h --file-header       Display the ELF file header\n\
4442   -l --program-headers   Display the program headers\n\
4443      --segments          An alias for --program-headers\n\
4444   -S --section-headers   Display the sections' header\n\
4445      --sections          An alias for --section-headers\n\
4446   -g --section-groups    Display the section groups\n\
4447   -t --section-details   Display the section details\n\
4448   -e --headers           Equivalent to: -h -l -S\n\
4449   -s --syms              Display the symbol table\n\
4450      --symbols           An alias for --syms\n\
4451   --dyn-syms             Display the dynamic symbol table\n\
4452   -n --notes             Display the core notes (if present)\n\
4453   -r --relocs            Display the relocations (if present)\n\
4454   -u --unwind            Display the unwind info (if present)\n\
4455   -d --dynamic           Display the dynamic section (if present)\n\
4456   -V --version-info      Display the version sections (if present)\n\
4457   -A --arch-specific     Display architecture specific information (if any)\n\
4458   -c --archive-index     Display the symbol/file index in an archive\n\
4459   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
4460   -x --hex-dump=<number|name>\n\
4461                          Dump the contents of section <number|name> as bytes\n\
4462   -p --string-dump=<number|name>\n\
4463                          Dump the contents of section <number|name> as strings\n\
4464   -R --relocated-dump=<number|name>\n\
4465                          Dump the contents of section <number|name> as relocated bytes\n\
4466   -z --decompress        Decompress section before dumping it\n\
4467   -w[lLiaprmfFsoRtUuTgAckK] or\n\
4468   --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4469                =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4470                =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4471                =addr,=cu_index,=links,=follow-links]\n\
4472                          Display the contents of DWARF debug sections\n"));
4473   fprintf (stream, _("\
4474   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
4475   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
4476                          or deeper\n"));
4477 #ifdef SUPPORT_DISASSEMBLY
4478   fprintf (stream, _("\
4479   -i --instruction-dump=<number|name>\n\
4480                          Disassemble the contents of section <number|name>\n"));
4481 #endif
4482   fprintf (stream, _("\
4483   -I --histogram         Display histogram of bucket list lengths\n\
4484   -W --wide              Allow output width to exceed 80 characters\n\
4485   @<file>                Read options from <file>\n\
4486   -H --help              Display this information\n\
4487   -v --version           Display the version number of readelf\n"));
4488
4489   if (REPORT_BUGS_TO[0] && stream == stdout)
4490     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4491
4492   exit (stream == stdout ? 0 : 1);
4493 }
4494
4495 /* Record the fact that the user wants the contents of section number
4496    SECTION to be displayed using the method(s) encoded as flags bits
4497    in TYPE.  Note, TYPE can be zero if we are creating the array for
4498    the first time.  */
4499
4500 static void
4501 request_dump_bynumber (Filedata * filedata, unsigned int section, dump_type type)
4502 {
4503   if (section >= filedata->num_dump_sects)
4504     {
4505       dump_type * new_dump_sects;
4506
4507       new_dump_sects = (dump_type *) calloc (section + 1,
4508                                              sizeof (* new_dump_sects));
4509
4510       if (new_dump_sects == NULL)
4511         error (_("Out of memory allocating dump request table.\n"));
4512       else
4513         {
4514           if (filedata->dump_sects)
4515             {
4516               /* Copy current flag settings.  */
4517               memcpy (new_dump_sects, filedata->dump_sects,
4518                       filedata->num_dump_sects * sizeof (* new_dump_sects));
4519
4520               free (filedata->dump_sects);
4521             }
4522
4523           filedata->dump_sects = new_dump_sects;
4524           filedata->num_dump_sects = section + 1;
4525         }
4526     }
4527
4528   if (filedata->dump_sects)
4529     filedata->dump_sects[section] |= type;
4530 }
4531
4532 /* Request a dump by section name.  */
4533
4534 static void
4535 request_dump_byname (const char * section, dump_type type)
4536 {
4537   struct dump_list_entry * new_request;
4538
4539   new_request = (struct dump_list_entry *)
4540       malloc (sizeof (struct dump_list_entry));
4541   if (!new_request)
4542     error (_("Out of memory allocating dump request table.\n"));
4543
4544   new_request->name = strdup (section);
4545   if (!new_request->name)
4546     error (_("Out of memory allocating dump request table.\n"));
4547
4548   new_request->type = type;
4549
4550   new_request->next = dump_sects_byname;
4551   dump_sects_byname = new_request;
4552 }
4553
4554 static inline void
4555 request_dump (Filedata * filedata, dump_type type)
4556 {
4557   int section;
4558   char * cp;
4559
4560   do_dump++;
4561   section = strtoul (optarg, & cp, 0);
4562
4563   if (! *cp && section >= 0)
4564     request_dump_bynumber (filedata, section, type);
4565   else
4566     request_dump_byname (optarg, type);
4567 }
4568
4569 static void
4570 parse_args (Filedata * filedata, int argc, char ** argv)
4571 {
4572   int c;
4573
4574   if (argc < 2)
4575     usage (stderr);
4576
4577   while ((c = getopt_long
4578           (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4579     {
4580       switch (c)
4581         {
4582         case 0:
4583           /* Long options.  */
4584           break;
4585         case 'H':
4586           usage (stdout);
4587           break;
4588
4589         case 'a':
4590           do_syms = TRUE;
4591           do_reloc = TRUE;
4592           do_unwind = TRUE;
4593           do_dynamic = TRUE;
4594           do_header = TRUE;
4595           do_sections = TRUE;
4596           do_section_groups = TRUE;
4597           do_segments = TRUE;
4598           do_version = TRUE;
4599           do_histogram = TRUE;
4600           do_arch = TRUE;
4601           do_notes = TRUE;
4602           break;
4603         case 'g':
4604           do_section_groups = TRUE;
4605           break;
4606         case 't':
4607         case 'N':
4608           do_sections = TRUE;
4609           do_section_details = TRUE;
4610           break;
4611         case 'e':
4612           do_header = TRUE;
4613           do_sections = TRUE;
4614           do_segments = TRUE;
4615           break;
4616         case 'A':
4617           do_arch = TRUE;
4618           break;
4619         case 'D':
4620           do_using_dynamic = TRUE;
4621           break;
4622         case 'r':
4623           do_reloc = TRUE;
4624           break;
4625         case 'u':
4626           do_unwind = TRUE;
4627           break;
4628         case 'h':
4629           do_header = TRUE;
4630           break;
4631         case 'l':
4632           do_segments = TRUE;
4633           break;
4634         case 's':
4635           do_syms = TRUE;
4636           break;
4637         case 'S':
4638           do_sections = TRUE;
4639           break;
4640         case 'd':
4641           do_dynamic = TRUE;
4642           break;
4643         case 'I':
4644           do_histogram = TRUE;
4645           break;
4646         case 'n':
4647           do_notes = TRUE;
4648           break;
4649         case 'c':
4650           do_archive_index = TRUE;
4651           break;
4652         case 'x':
4653           request_dump (filedata, HEX_DUMP);
4654           break;
4655         case 'p':
4656           request_dump (filedata, STRING_DUMP);
4657           break;
4658         case 'R':
4659           request_dump (filedata, RELOC_DUMP);
4660           break;
4661         case 'z':
4662           decompress_dumps = TRUE;
4663           break;
4664         case 'w':
4665           do_dump = TRUE;
4666           if (optarg == 0)
4667             {
4668               do_debugging = TRUE;
4669               dwarf_select_sections_all ();
4670             }
4671           else
4672             {
4673               do_debugging = FALSE;
4674               dwarf_select_sections_by_letters (optarg);
4675             }
4676           break;
4677         case OPTION_DEBUG_DUMP:
4678           do_dump = TRUE;
4679           if (optarg == 0)
4680             do_debugging = TRUE;
4681           else
4682             {
4683               do_debugging = FALSE;
4684               dwarf_select_sections_by_names (optarg);
4685             }
4686           break;
4687         case OPTION_DWARF_DEPTH:
4688           {
4689             char *cp;
4690
4691             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4692           }
4693           break;
4694         case OPTION_DWARF_START:
4695           {
4696             char *cp;
4697
4698             dwarf_start_die = strtoul (optarg, & cp, 0);
4699           }
4700           break;
4701         case OPTION_DWARF_CHECK:
4702           dwarf_check = TRUE;
4703           break;
4704         case OPTION_DYN_SYMS:
4705           do_dyn_syms = TRUE;
4706           break;
4707 #ifdef SUPPORT_DISASSEMBLY
4708         case 'i':
4709           request_dump (filedata, DISASS_DUMP);
4710           break;
4711 #endif
4712         case 'v':
4713           print_version (program_name);
4714           break;
4715         case 'V':
4716           do_version = TRUE;
4717           break;
4718         case 'W':
4719           do_wide = TRUE;
4720           break;
4721         default:
4722           /* xgettext:c-format */
4723           error (_("Invalid option '-%c'\n"), c);
4724           /* Fall through.  */
4725         case '?':
4726           usage (stderr);
4727         }
4728     }
4729
4730   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4731       && !do_segments && !do_header && !do_dump && !do_version
4732       && !do_histogram && !do_debugging && !do_arch && !do_notes
4733       && !do_section_groups && !do_archive_index
4734       && !do_dyn_syms)
4735     usage (stderr);
4736 }
4737
4738 static const char *
4739 get_elf_class (unsigned int elf_class)
4740 {
4741   static char buff[32];
4742
4743   switch (elf_class)
4744     {
4745     case ELFCLASSNONE: return _("none");
4746     case ELFCLASS32:   return "ELF32";
4747     case ELFCLASS64:   return "ELF64";
4748     default:
4749       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4750       return buff;
4751     }
4752 }
4753
4754 static const char *
4755 get_data_encoding (unsigned int encoding)
4756 {
4757   static char buff[32];
4758
4759   switch (encoding)
4760     {
4761     case ELFDATANONE: return _("none");
4762     case ELFDATA2LSB: return _("2's complement, little endian");
4763     case ELFDATA2MSB: return _("2's complement, big endian");
4764     default:
4765       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4766       return buff;
4767     }
4768 }
4769
4770 /* Decode the data held in 'filedata->file_header'.  */
4771
4772 static bfd_boolean
4773 process_file_header (Filedata * filedata)
4774 {
4775   Elf_Internal_Ehdr * header = & filedata->file_header;
4776
4777   if (   header->e_ident[EI_MAG0] != ELFMAG0
4778       || header->e_ident[EI_MAG1] != ELFMAG1
4779       || header->e_ident[EI_MAG2] != ELFMAG2
4780       || header->e_ident[EI_MAG3] != ELFMAG3)
4781     {
4782       error
4783         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4784       return FALSE;
4785     }
4786
4787   init_dwarf_regnames (header->e_machine);
4788
4789   if (do_header)
4790     {
4791       unsigned i;
4792
4793       printf (_("ELF Header:\n"));
4794       printf (_("  Magic:   "));
4795       for (i = 0; i < EI_NIDENT; i++)
4796         printf ("%2.2x ", header->e_ident[i]);
4797       printf ("\n");
4798       printf (_("  Class:                             %s\n"),
4799               get_elf_class (header->e_ident[EI_CLASS]));
4800       printf (_("  Data:                              %s\n"),
4801               get_data_encoding (header->e_ident[EI_DATA]));
4802       printf (_("  Version:                           %d%s\n"),
4803               header->e_ident[EI_VERSION],
4804               (header->e_ident[EI_VERSION] == EV_CURRENT
4805                ? _(" (current)")
4806                : (header->e_ident[EI_VERSION] != EV_NONE
4807                   ? _(" <unknown>")
4808                   : "")));
4809       printf (_("  OS/ABI:                            %s\n"),
4810               get_osabi_name (filedata, header->e_ident[EI_OSABI]));
4811       printf (_("  ABI Version:                       %d\n"),
4812               header->e_ident[EI_ABIVERSION]);
4813       printf (_("  Type:                              %s\n"),
4814               get_file_type (header->e_type));
4815       printf (_("  Machine:                           %s\n"),
4816               get_machine_name (header->e_machine));
4817       printf (_("  Version:                           0x%lx\n"),
4818               header->e_version);
4819
4820       printf (_("  Entry point address:               "));
4821       print_vma (header->e_entry, PREFIX_HEX);
4822       printf (_("\n  Start of program headers:          "));
4823       print_vma (header->e_phoff, DEC);
4824       printf (_(" (bytes into file)\n  Start of section headers:          "));
4825       print_vma (header->e_shoff, DEC);
4826       printf (_(" (bytes into file)\n"));
4827
4828       printf (_("  Flags:                             0x%lx%s\n"),
4829               header->e_flags,
4830               get_machine_flags (filedata, header->e_flags, header->e_machine));
4831       printf (_("  Size of this header:               %u (bytes)\n"),
4832               header->e_ehsize);
4833       printf (_("  Size of program headers:           %u (bytes)\n"),
4834               header->e_phentsize);
4835       printf (_("  Number of program headers:         %u"),
4836               header->e_phnum);
4837       if (filedata->section_headers != NULL
4838           && header->e_phnum == PN_XNUM
4839           && filedata->section_headers[0].sh_info != 0)
4840         {
4841           header->e_phnum = filedata->section_headers[0].sh_info;
4842           printf (" (%u)", header->e_phnum);
4843         }
4844       putc ('\n', stdout);
4845       printf (_("  Size of section headers:           %u (bytes)\n"),
4846               header->e_shentsize);
4847       printf (_("  Number of section headers:         %u"),
4848               header->e_shnum);
4849       if (filedata->section_headers != NULL && header->e_shnum == SHN_UNDEF)
4850         {
4851           header->e_shnum = filedata->section_headers[0].sh_size;
4852           printf (" (%u)", header->e_shnum);
4853         }
4854       putc ('\n', stdout);
4855       printf (_("  Section header string table index: %u"),
4856               header->e_shstrndx);
4857       if (filedata->section_headers != NULL
4858           && header->e_shstrndx == (SHN_XINDEX & 0xffff))
4859         {
4860           header->e_shstrndx = filedata->section_headers[0].sh_link;
4861           printf (" (%u)", header->e_shstrndx);
4862         }
4863       if (header->e_shstrndx != SHN_UNDEF
4864           && header->e_shstrndx >= header->e_shnum)
4865         {
4866           header->e_shstrndx = SHN_UNDEF;
4867           printf (_(" <corrupt: out of range>"));
4868         }
4869       putc ('\n', stdout);
4870     }
4871
4872   if (filedata->section_headers != NULL)
4873     {
4874       if (header->e_phnum == PN_XNUM
4875           && filedata->section_headers[0].sh_info != 0)
4876         header->e_phnum = filedata->section_headers[0].sh_info;
4877       if (header->e_shnum == SHN_UNDEF)
4878         header->e_shnum = filedata->section_headers[0].sh_size;
4879       if (header->e_shstrndx == (SHN_XINDEX & 0xffff))
4880         header->e_shstrndx = filedata->section_headers[0].sh_link;
4881       if (header->e_shstrndx >= header->e_shnum)
4882         header->e_shstrndx = SHN_UNDEF;
4883       free (filedata->section_headers);
4884       filedata->section_headers = NULL;
4885     }
4886
4887   return TRUE;
4888 }
4889
4890 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4891    Returns TRUE upon success, FALSE otherwise.  Loads 32-bit headers.  */
4892
4893 static bfd_boolean
4894 get_32bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4895 {
4896   Elf32_External_Phdr * phdrs;
4897   Elf32_External_Phdr * external;
4898   Elf_Internal_Phdr *   internal;
4899   unsigned int i;
4900   unsigned int size = filedata->file_header.e_phentsize;
4901   unsigned int num  = filedata->file_header.e_phnum;
4902
4903   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4904   if (size == 0 || num == 0)
4905     return FALSE;
4906   if (size < sizeof * phdrs)
4907     {
4908       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4909       return FALSE;
4910     }
4911   if (size > sizeof * phdrs)
4912     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4913
4914   phdrs = (Elf32_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4915                                             size, num, _("program headers"));
4916   if (phdrs == NULL)
4917     return FALSE;
4918
4919   for (i = 0, internal = pheaders, external = phdrs;
4920        i < filedata->file_header.e_phnum;
4921        i++, internal++, external++)
4922     {
4923       internal->p_type   = BYTE_GET (external->p_type);
4924       internal->p_offset = BYTE_GET (external->p_offset);
4925       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4926       internal->p_paddr  = BYTE_GET (external->p_paddr);
4927       internal->p_filesz = BYTE_GET (external->p_filesz);
4928       internal->p_memsz  = BYTE_GET (external->p_memsz);
4929       internal->p_flags  = BYTE_GET (external->p_flags);
4930       internal->p_align  = BYTE_GET (external->p_align);
4931     }
4932
4933   free (phdrs);
4934   return TRUE;
4935 }
4936
4937 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4938    Returns TRUE upon success, FALSE otherwise.  Loads 64-bit headers.  */
4939
4940 static bfd_boolean
4941 get_64bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4942 {
4943   Elf64_External_Phdr * phdrs;
4944   Elf64_External_Phdr * external;
4945   Elf_Internal_Phdr *   internal;
4946   unsigned int i;
4947   unsigned int size = filedata->file_header.e_phentsize;
4948   unsigned int num  = filedata->file_header.e_phnum;
4949
4950   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4951   if (size == 0 || num == 0)
4952     return FALSE;
4953   if (size < sizeof * phdrs)
4954     {
4955       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4956       return FALSE;
4957     }
4958   if (size > sizeof * phdrs)
4959     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4960
4961   phdrs = (Elf64_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4962                                             size, num, _("program headers"));
4963   if (!phdrs)
4964     return FALSE;
4965
4966   for (i = 0, internal = pheaders, external = phdrs;
4967        i < filedata->file_header.e_phnum;
4968        i++, internal++, external++)
4969     {
4970       internal->p_type   = BYTE_GET (external->p_type);
4971       internal->p_flags  = BYTE_GET (external->p_flags);
4972       internal->p_offset = BYTE_GET (external->p_offset);
4973       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4974       internal->p_paddr  = BYTE_GET (external->p_paddr);
4975       internal->p_filesz = BYTE_GET (external->p_filesz);
4976       internal->p_memsz  = BYTE_GET (external->p_memsz);
4977       internal->p_align  = BYTE_GET (external->p_align);
4978     }
4979
4980   free (phdrs);
4981   return TRUE;
4982 }
4983
4984 /* Returns TRUE if the program headers were read into `program_headers'.  */
4985
4986 static bfd_boolean
4987 get_program_headers (Filedata * filedata)
4988 {
4989   Elf_Internal_Phdr * phdrs;
4990
4991   /* Check cache of prior read.  */
4992   if (filedata->program_headers != NULL)
4993     return TRUE;
4994
4995   /* Be kind to memory checkers by looking for
4996      e_phnum values which we know must be invalid.  */
4997   if (filedata->file_header.e_phnum
4998       * (is_32bit_elf ? sizeof (Elf32_External_Phdr) : sizeof (Elf64_External_Phdr))
4999       >= filedata->file_size)
5000     {
5001       error (_("Too many program headers - %#x - the file is not that big\n"),
5002              filedata->file_header.e_phnum);
5003       return FALSE;
5004     }
5005
5006   phdrs = (Elf_Internal_Phdr *) cmalloc (filedata->file_header.e_phnum,
5007                                          sizeof (Elf_Internal_Phdr));
5008   if (phdrs == NULL)
5009     {
5010       error (_("Out of memory reading %u program headers\n"),
5011              filedata->file_header.e_phnum);
5012       return FALSE;
5013     }
5014
5015   if (is_32bit_elf
5016       ? get_32bit_program_headers (filedata, phdrs)
5017       : get_64bit_program_headers (filedata, phdrs))
5018     {
5019       filedata->program_headers = phdrs;
5020       return TRUE;
5021     }
5022
5023   free (phdrs);
5024   return FALSE;
5025 }
5026
5027 /* Returns TRUE if the program headers were loaded.  */
5028
5029 static bfd_boolean
5030 process_program_headers (Filedata * filedata)
5031 {
5032   Elf_Internal_Phdr * segment;
5033   unsigned int i;
5034   Elf_Internal_Phdr * previous_load = NULL;
5035
5036   if (filedata->file_header.e_phnum == 0)
5037     {
5038       /* PR binutils/12467.  */
5039       if (filedata->file_header.e_phoff != 0)
5040         {
5041           warn (_("possibly corrupt ELF header - it has a non-zero program"
5042                   " header offset, but no program headers\n"));
5043           return FALSE;
5044         }
5045       else if (do_segments)
5046         printf (_("\nThere are no program headers in this file.\n"));
5047       return TRUE;
5048     }
5049
5050   if (do_segments && !do_header)
5051     {
5052       printf (_("\nElf file type is %s\n"), get_file_type (filedata->file_header.e_type));
5053       printf (_("Entry point 0x%s\n"), bfd_vmatoa ("x", filedata->file_header.e_entry));
5054       printf (ngettext ("There is %d program header, starting at offset %s\n",
5055                         "There are %d program headers, starting at offset %s\n",
5056                         filedata->file_header.e_phnum),
5057               filedata->file_header.e_phnum,
5058               bfd_vmatoa ("u", filedata->file_header.e_phoff));
5059     }
5060
5061   if (! get_program_headers (filedata))
5062     return TRUE;
5063
5064   if (do_segments)
5065     {
5066       if (filedata->file_header.e_phnum > 1)
5067         printf (_("\nProgram Headers:\n"));
5068       else
5069         printf (_("\nProgram Headers:\n"));
5070
5071       if (is_32bit_elf)
5072         printf
5073           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
5074       else if (do_wide)
5075         printf
5076           (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
5077       else
5078         {
5079           printf
5080             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
5081           printf
5082             (_("                 FileSiz            MemSiz              Flags  Align\n"));
5083         }
5084     }
5085
5086   dynamic_addr = 0;
5087   dynamic_size = 0;
5088
5089   for (i = 0, segment = filedata->program_headers;
5090        i < filedata->file_header.e_phnum;
5091        i++, segment++)
5092     {
5093       if (do_segments)
5094         {
5095           printf ("  %-14.14s ", get_segment_type (filedata, segment->p_type));
5096
5097           if (is_32bit_elf)
5098             {
5099               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5100               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
5101               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
5102               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
5103               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
5104               printf ("%c%c%c ",
5105                       (segment->p_flags & PF_R ? 'R' : ' '),
5106                       (segment->p_flags & PF_W ? 'W' : ' '),
5107                       (segment->p_flags & PF_X ? 'E' : ' '));
5108               printf ("%#lx", (unsigned long) segment->p_align);
5109             }
5110           else if (do_wide)
5111             {
5112               if ((unsigned long) segment->p_offset == segment->p_offset)
5113                 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5114               else
5115                 {
5116                   print_vma (segment->p_offset, FULL_HEX);
5117                   putchar (' ');
5118                 }
5119
5120               print_vma (segment->p_vaddr, FULL_HEX);
5121               putchar (' ');
5122               print_vma (segment->p_paddr, FULL_HEX);
5123               putchar (' ');
5124
5125               if ((unsigned long) segment->p_filesz == segment->p_filesz)
5126                 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
5127               else
5128                 {
5129                   print_vma (segment->p_filesz, FULL_HEX);
5130                   putchar (' ');
5131                 }
5132
5133               if ((unsigned long) segment->p_memsz == segment->p_memsz)
5134                 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
5135               else
5136                 {
5137                   print_vma (segment->p_memsz, FULL_HEX);
5138                 }
5139
5140               printf (" %c%c%c ",
5141                       (segment->p_flags & PF_R ? 'R' : ' '),
5142                       (segment->p_flags & PF_W ? 'W' : ' '),
5143                       (segment->p_flags & PF_X ? 'E' : ' '));
5144
5145               if ((unsigned long) segment->p_align == segment->p_align)
5146                 printf ("%#lx", (unsigned long) segment->p_align);
5147               else
5148                 {
5149                   print_vma (segment->p_align, PREFIX_HEX);
5150                 }
5151             }
5152           else
5153             {
5154               print_vma (segment->p_offset, FULL_HEX);
5155               putchar (' ');
5156               print_vma (segment->p_vaddr, FULL_HEX);
5157               putchar (' ');
5158               print_vma (segment->p_paddr, FULL_HEX);
5159               printf ("\n                 ");
5160               print_vma (segment->p_filesz, FULL_HEX);
5161               putchar (' ');
5162               print_vma (segment->p_memsz, FULL_HEX);
5163               printf ("  %c%c%c    ",
5164                       (segment->p_flags & PF_R ? 'R' : ' '),
5165                       (segment->p_flags & PF_W ? 'W' : ' '),
5166                       (segment->p_flags & PF_X ? 'E' : ' '));
5167               print_vma (segment->p_align, PREFIX_HEX);
5168             }
5169
5170           putc ('\n', stdout);
5171         }
5172
5173       switch (segment->p_type)
5174         {
5175         case PT_LOAD:
5176 #if 0 /* Do not warn about out of order PT_LOAD segments.  Although officially
5177          required by the ELF standard, several programs, including the Linux
5178          kernel, make use of non-ordered segments.  */
5179           if (previous_load
5180               && previous_load->p_vaddr > segment->p_vaddr)
5181             error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
5182 #endif
5183           if (segment->p_memsz < segment->p_filesz)
5184             error (_("the segment's file size is larger than its memory size\n"));
5185           previous_load = segment;
5186           break;
5187
5188         case PT_PHDR:
5189           /* PR 20815 - Verify that the program header is loaded into memory.  */
5190           if (i > 0 && previous_load != NULL)
5191             error (_("the PHDR segment must occur before any LOAD segment\n"));
5192           if (filedata->file_header.e_machine != EM_PARISC)
5193             {
5194               unsigned int j;
5195
5196               for (j = 1; j < filedata->file_header.e_phnum; j++)
5197                 if (filedata->program_headers[j].p_vaddr <= segment->p_vaddr
5198                     && (filedata->program_headers[j].p_vaddr
5199                         + filedata->program_headers[j].p_memsz)
5200                     >= (segment->p_vaddr + segment->p_filesz))
5201                   break;
5202               if (j == filedata->file_header.e_phnum)
5203                 error (_("the PHDR segment is not covered by a LOAD segment\n"));
5204             }
5205           break;
5206
5207         case PT_DYNAMIC:
5208           if (dynamic_addr)
5209             error (_("more than one dynamic segment\n"));
5210
5211           /* By default, assume that the .dynamic section is the first
5212              section in the DYNAMIC segment.  */
5213           dynamic_addr = segment->p_offset;
5214           dynamic_size = segment->p_filesz;
5215
5216           /* Try to locate the .dynamic section. If there is
5217              a section header table, we can easily locate it.  */
5218           if (filedata->section_headers != NULL)
5219             {
5220               Elf_Internal_Shdr * sec;
5221
5222               sec = find_section (filedata, ".dynamic");
5223               if (sec == NULL || sec->sh_size == 0)
5224                 {
5225                   /* A corresponding .dynamic section is expected, but on
5226                      IA-64/OpenVMS it is OK for it to be missing.  */
5227                   if (!is_ia64_vms (filedata))
5228                     error (_("no .dynamic section in the dynamic segment\n"));
5229                   break;
5230                 }
5231
5232               if (sec->sh_type == SHT_NOBITS)
5233                 {
5234                   dynamic_size = 0;
5235                   break;
5236                 }
5237
5238               dynamic_addr = sec->sh_offset;
5239               dynamic_size = sec->sh_size;
5240
5241               if (dynamic_addr < segment->p_offset
5242                   || dynamic_addr > segment->p_offset + segment->p_filesz)
5243                 warn (_("the .dynamic section is not contained"
5244                         " within the dynamic segment\n"));
5245               else if (dynamic_addr > segment->p_offset)
5246                 warn (_("the .dynamic section is not the first section"
5247                         " in the dynamic segment.\n"));
5248             }
5249
5250           /* PR binutils/17512: Avoid corrupt dynamic section info in the
5251              segment.  Check this after matching against the section headers
5252              so we don't warn on debuginfo file (which have NOBITS .dynamic
5253              sections).  */
5254           if (dynamic_addr > filedata->file_size
5255               || dynamic_size > filedata->file_size - dynamic_addr)
5256             {
5257               error (_("the dynamic segment offset + size exceeds the size of the file\n"));
5258               dynamic_addr = dynamic_size = 0;
5259             }
5260           break;
5261
5262         case PT_INTERP:
5263           if (fseek (filedata->handle, archive_file_offset + (long) segment->p_offset,
5264                      SEEK_SET))
5265             error (_("Unable to find program interpreter name\n"));
5266           else
5267             {
5268               char fmt [32];
5269               int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
5270
5271               if (ret >= (int) sizeof (fmt) || ret < 0)
5272                 error (_("Internal error: failed to create format string to display program interpreter\n"));
5273
5274               program_interpreter[0] = 0;
5275               if (fscanf (filedata->handle, fmt, program_interpreter) <= 0)
5276                 error (_("Unable to read program interpreter name\n"));
5277
5278               if (do_segments)
5279                 printf (_("      [Requesting program interpreter: %s]\n"),
5280                     program_interpreter);
5281             }
5282           break;
5283         }
5284     }
5285
5286   if (do_segments
5287       && filedata->section_headers != NULL
5288       && filedata->string_table != NULL)
5289     {
5290       printf (_("\n Section to Segment mapping:\n"));
5291       printf (_("  Segment Sections...\n"));
5292
5293       for (i = 0; i < filedata->file_header.e_phnum; i++)
5294         {
5295           unsigned int j;
5296           Elf_Internal_Shdr * section;
5297
5298           segment = filedata->program_headers + i;
5299           section = filedata->section_headers + 1;
5300
5301           printf ("   %2.2d     ", i);
5302
5303           for (j = 1; j < filedata->file_header.e_shnum; j++, section++)
5304             {
5305               if (!ELF_TBSS_SPECIAL (section, segment)
5306                   && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
5307                 printf ("%s ", printable_section_name (filedata, section));
5308             }
5309
5310           putc ('\n',stdout);
5311         }
5312     }
5313
5314   return TRUE;
5315 }
5316
5317
5318 /* Find the file offset corresponding to VMA by using the program headers.  */
5319
5320 static long
5321 offset_from_vma (Filedata * filedata, bfd_vma vma, bfd_size_type size)
5322 {
5323   Elf_Internal_Phdr * seg;
5324
5325   if (! get_program_headers (filedata))
5326     {
5327       warn (_("Cannot interpret virtual addresses without program headers.\n"));
5328       return (long) vma;
5329     }
5330
5331   for (seg = filedata->program_headers;
5332        seg < filedata->program_headers + filedata->file_header.e_phnum;
5333        ++seg)
5334     {
5335       if (seg->p_type != PT_LOAD)
5336         continue;
5337
5338       if (vma >= (seg->p_vaddr & -seg->p_align)
5339           && vma + size <= seg->p_vaddr + seg->p_filesz)
5340         return vma - seg->p_vaddr + seg->p_offset;
5341     }
5342
5343   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
5344         (unsigned long) vma);
5345   return (long) vma;
5346 }
5347
5348
5349 /* Allocate memory and load the sections headers into FILEDATA->filedata->section_headers.
5350    If PROBE is true, this is just a probe and we do not generate any error
5351    messages if the load fails.  */
5352
5353 static bfd_boolean
5354 get_32bit_section_headers (Filedata * filedata, bfd_boolean probe)
5355 {
5356   Elf32_External_Shdr * shdrs;
5357   Elf_Internal_Shdr *   internal;
5358   unsigned int          i;
5359   unsigned int          size = filedata->file_header.e_shentsize;
5360   unsigned int          num = probe ? 1 : filedata->file_header.e_shnum;
5361
5362   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5363   if (size == 0 || num == 0)
5364     return FALSE;
5365   if (size < sizeof * shdrs)
5366     {
5367       if (! probe)
5368         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5369       return FALSE;
5370     }
5371   if (!probe && size > sizeof * shdrs)
5372     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5373
5374   shdrs = (Elf32_External_Shdr *) get_data (NULL, filedata, filedata->file_header.e_shoff,
5375                                             size, num,
5376                                             probe ? NULL : _("section headers"));
5377   if (shdrs == NULL)
5378     return FALSE;
5379
5380   free (filedata->section_headers);
5381   filedata->section_headers = (Elf_Internal_Shdr *)
5382     cmalloc (num, sizeof (Elf_Internal_Shdr));
5383   if (filedata->section_headers == NULL)
5384     {
5385       if (!probe)
5386         error (_("Out of memory reading %u section headers\n"), num);
5387       free (shdrs);
5388       return FALSE;
5389     }
5390
5391   for (i = 0, internal = filedata->section_headers;
5392        i < num;
5393        i++, internal++)
5394     {
5395       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5396       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5397       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5398       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5399       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5400       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5401       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5402       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5403       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5404       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5405       if (!probe && internal->sh_link > num)
5406         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5407       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5408         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5409     }
5410
5411   free (shdrs);
5412   return TRUE;
5413 }
5414
5415 /* Like get_32bit_section_headers, except that it fetches 64-bit headers.  */
5416
5417 static bfd_boolean
5418 get_64bit_section_headers (Filedata * filedata, bfd_boolean probe)
5419 {
5420   Elf64_External_Shdr *  shdrs;
5421   Elf_Internal_Shdr *    internal;
5422   unsigned int           i;
5423   unsigned int           size = filedata->file_header.e_shentsize;
5424   unsigned int           num = probe ? 1 : filedata->file_header.e_shnum;
5425
5426   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5427   if (size == 0 || num == 0)
5428     return FALSE;
5429
5430   if (size < sizeof * shdrs)
5431     {
5432       if (! probe)
5433         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5434       return FALSE;
5435     }
5436
5437   if (! probe && size > sizeof * shdrs)
5438     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5439
5440   shdrs = (Elf64_External_Shdr *) get_data (NULL, filedata,
5441                                             filedata->file_header.e_shoff,
5442                                             size, num,
5443                                             probe ? NULL : _("section headers"));
5444   if (shdrs == NULL)
5445     return FALSE;
5446
5447   free (filedata->section_headers);
5448   filedata->section_headers = (Elf_Internal_Shdr *)
5449     cmalloc (num, sizeof (Elf_Internal_Shdr));
5450   if (filedata->section_headers == NULL)
5451     {
5452       if (! probe)
5453         error (_("Out of memory reading %u section headers\n"), num);
5454       free (shdrs);
5455       return FALSE;
5456     }
5457
5458   for (i = 0, internal = filedata->section_headers;
5459        i < num;
5460        i++, internal++)
5461     {
5462       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5463       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5464       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5465       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5466       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5467       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5468       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5469       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5470       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5471       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5472       if (!probe && internal->sh_link > num)
5473         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5474       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5475         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5476     }
5477
5478   free (shdrs);
5479   return TRUE;
5480 }
5481
5482 static Elf_Internal_Sym *
5483 get_32bit_elf_symbols (Filedata *           filedata,
5484                        Elf_Internal_Shdr *  section,
5485                        unsigned long *      num_syms_return)
5486 {
5487   unsigned long number = 0;
5488   Elf32_External_Sym * esyms = NULL;
5489   Elf_External_Sym_Shndx * shndx = NULL;
5490   Elf_Internal_Sym * isyms = NULL;
5491   Elf_Internal_Sym * psym;
5492   unsigned int j;
5493   elf_section_list * entry;
5494
5495   if (section->sh_size == 0)
5496     {
5497       if (num_syms_return != NULL)
5498         * num_syms_return = 0;
5499       return NULL;
5500     }
5501
5502   /* Run some sanity checks first.  */
5503   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5504     {
5505       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5506              printable_section_name (filedata, section),
5507              (unsigned long) section->sh_entsize);
5508       goto exit_point;
5509     }
5510
5511   if (section->sh_size > filedata->file_size)
5512     {
5513       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5514              printable_section_name (filedata, section),
5515              (unsigned long) section->sh_size);
5516       goto exit_point;
5517     }
5518
5519   number = section->sh_size / section->sh_entsize;
5520
5521   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5522     {
5523       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5524              (unsigned long) section->sh_size,
5525              printable_section_name (filedata, section),
5526              (unsigned long) section->sh_entsize);
5527       goto exit_point;
5528     }
5529
5530   esyms = (Elf32_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5531                                            section->sh_size, _("symbols"));
5532   if (esyms == NULL)
5533     goto exit_point;
5534
5535   shndx = NULL;
5536   for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5537     {
5538       if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5539         continue;
5540
5541       if (shndx != NULL)
5542         {
5543           error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5544           free (shndx);
5545         }
5546
5547       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5548                                                    entry->hdr->sh_offset,
5549                                                    1, entry->hdr->sh_size,
5550                                                    _("symbol table section indices"));
5551       if (shndx == NULL)
5552         goto exit_point;
5553
5554       /* PR17531: file: heap-buffer-overflow */
5555       if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5556         {
5557           error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5558                  printable_section_name (filedata, entry->hdr),
5559                  (unsigned long) entry->hdr->sh_size,
5560                  (unsigned long) section->sh_size);
5561           goto exit_point;
5562         }
5563     }
5564
5565   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5566
5567   if (isyms == NULL)
5568     {
5569       error (_("Out of memory reading %lu symbols\n"),
5570              (unsigned long) number);
5571       goto exit_point;
5572     }
5573
5574   for (j = 0, psym = isyms; j < number; j++, psym++)
5575     {
5576       psym->st_name  = BYTE_GET (esyms[j].st_name);
5577       psym->st_value = BYTE_GET (esyms[j].st_value);
5578       psym->st_size  = BYTE_GET (esyms[j].st_size);
5579       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5580       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5581         psym->st_shndx
5582           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5583       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5584         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5585       psym->st_info  = BYTE_GET (esyms[j].st_info);
5586       psym->st_other = BYTE_GET (esyms[j].st_other);
5587     }
5588
5589  exit_point:
5590   free (shndx);
5591   free (esyms);
5592
5593   if (num_syms_return != NULL)
5594     * num_syms_return = isyms == NULL ? 0 : number;
5595
5596   return isyms;
5597 }
5598
5599 static Elf_Internal_Sym *
5600 get_64bit_elf_symbols (Filedata *           filedata,
5601                        Elf_Internal_Shdr *  section,
5602                        unsigned long *      num_syms_return)
5603 {
5604   unsigned long number = 0;
5605   Elf64_External_Sym * esyms = NULL;
5606   Elf_External_Sym_Shndx * shndx = NULL;
5607   Elf_Internal_Sym * isyms = NULL;
5608   Elf_Internal_Sym * psym;
5609   unsigned int j;
5610   elf_section_list * entry;
5611
5612   if (section->sh_size == 0)
5613     {
5614       if (num_syms_return != NULL)
5615         * num_syms_return = 0;
5616       return NULL;
5617     }
5618
5619   /* Run some sanity checks first.  */
5620   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5621     {
5622       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5623              printable_section_name (filedata, section),
5624              (unsigned long) section->sh_entsize);
5625       goto exit_point;
5626     }
5627
5628   if (section->sh_size > filedata->file_size)
5629     {
5630       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5631              printable_section_name (filedata, section),
5632              (unsigned long) section->sh_size);
5633       goto exit_point;
5634     }
5635
5636   number = section->sh_size / section->sh_entsize;
5637
5638   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5639     {
5640       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5641              (unsigned long) section->sh_size,
5642              printable_section_name (filedata, section),
5643              (unsigned long) section->sh_entsize);
5644       goto exit_point;
5645     }
5646
5647   esyms = (Elf64_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5648                                            section->sh_size, _("symbols"));
5649   if (!esyms)
5650     goto exit_point;
5651
5652   shndx = NULL;
5653   for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5654     {
5655       if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5656         continue;
5657
5658       if (shndx != NULL)
5659         {
5660           error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5661           free (shndx);
5662         }
5663
5664       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5665                                                    entry->hdr->sh_offset,
5666                                                    1, entry->hdr->sh_size,
5667                                                    _("symbol table section indices"));
5668       if (shndx == NULL)
5669         goto exit_point;
5670
5671       /* PR17531: file: heap-buffer-overflow */
5672       if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5673         {
5674           error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5675                  printable_section_name (filedata, entry->hdr),
5676                  (unsigned long) entry->hdr->sh_size,
5677                  (unsigned long) section->sh_size);
5678           goto exit_point;
5679         }
5680     }
5681
5682   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5683
5684   if (isyms == NULL)
5685     {
5686       error (_("Out of memory reading %lu symbols\n"),
5687              (unsigned long) number);
5688       goto exit_point;
5689     }
5690
5691   for (j = 0, psym = isyms; j < number; j++, psym++)
5692     {
5693       psym->st_name  = BYTE_GET (esyms[j].st_name);
5694       psym->st_info  = BYTE_GET (esyms[j].st_info);
5695       psym->st_other = BYTE_GET (esyms[j].st_other);
5696       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5697
5698       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5699         psym->st_shndx
5700           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5701       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5702         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5703
5704       psym->st_value = BYTE_GET (esyms[j].st_value);
5705       psym->st_size  = BYTE_GET (esyms[j].st_size);
5706     }
5707
5708  exit_point:
5709   free (shndx);
5710   free (esyms);
5711
5712   if (num_syms_return != NULL)
5713     * num_syms_return = isyms == NULL ? 0 : number;
5714
5715   return isyms;
5716 }
5717
5718 static const char *
5719 get_elf_section_flags (Filedata * filedata, bfd_vma sh_flags)
5720 {
5721   static char buff[1024];
5722   char * p = buff;
5723   unsigned int field_size = is_32bit_elf ? 8 : 16;
5724   signed int sindex;
5725   unsigned int size = sizeof (buff) - (field_size + 4 + 1);
5726   bfd_vma os_flags = 0;
5727   bfd_vma proc_flags = 0;
5728   bfd_vma unknown_flags = 0;
5729   static const struct
5730     {
5731       const char * str;
5732       unsigned int len;
5733     }
5734   flags [] =
5735     {
5736       /*  0 */ { STRING_COMMA_LEN ("WRITE") },
5737       /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
5738       /*  2 */ { STRING_COMMA_LEN ("EXEC") },
5739       /*  3 */ { STRING_COMMA_LEN ("MERGE") },
5740       /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
5741       /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
5742       /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5743       /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5744       /*  8 */ { STRING_COMMA_LEN ("GROUP") },
5745       /*  9 */ { STRING_COMMA_LEN ("TLS") },
5746       /* IA-64 specific.  */
5747       /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5748       /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5749       /* IA-64 OpenVMS specific.  */
5750       /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5751       /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5752       /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5753       /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5754       /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5755       /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5756       /* Generic.  */
5757       /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5758       /* SPARC specific.  */
5759       /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5760       /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5761       /* ARM specific.  */
5762       /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5763       /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5764       /* 23 */ { STRING_COMMA_LEN ("COMDEF") },
5765       /* GNU specific.  */
5766       /* 24 */ { STRING_COMMA_LEN ("GNU_MBIND") },
5767       /* VLE specific.  */
5768       /* 25 */ { STRING_COMMA_LEN ("VLE") },
5769     };
5770
5771   if (do_section_details)
5772     {
5773       sprintf (buff, "[%*.*lx]: ",
5774                field_size, field_size, (unsigned long) sh_flags);
5775       p += field_size + 4;
5776     }
5777
5778   while (sh_flags)
5779     {
5780       bfd_vma flag;
5781
5782       flag = sh_flags & - sh_flags;
5783       sh_flags &= ~ flag;
5784
5785       if (do_section_details)
5786         {
5787           switch (flag)
5788             {
5789             case SHF_WRITE:             sindex = 0; break;
5790             case SHF_ALLOC:             sindex = 1; break;
5791             case SHF_EXECINSTR:         sindex = 2; break;
5792             case SHF_MERGE:             sindex = 3; break;
5793             case SHF_STRINGS:           sindex = 4; break;
5794             case SHF_INFO_LINK:         sindex = 5; break;
5795             case SHF_LINK_ORDER:        sindex = 6; break;
5796             case SHF_OS_NONCONFORMING:  sindex = 7; break;
5797             case SHF_GROUP:             sindex = 8; break;
5798             case SHF_TLS:               sindex = 9; break;
5799             case SHF_EXCLUDE:           sindex = 18; break;
5800             case SHF_COMPRESSED:        sindex = 20; break;
5801             case SHF_GNU_MBIND:         sindex = 24; break;
5802
5803             default:
5804               sindex = -1;
5805               switch (filedata->file_header.e_machine)
5806                 {
5807                 case EM_IA_64:
5808                   if (flag == SHF_IA_64_SHORT)
5809                     sindex = 10;
5810                   else if (flag == SHF_IA_64_NORECOV)
5811                     sindex = 11;
5812 #ifdef BFD64
5813                   else if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5814                     switch (flag)
5815                       {
5816                       case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
5817                       case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
5818                       case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
5819                       case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
5820                       case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5821                       case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
5822                       default:                        break;
5823                       }
5824 #endif
5825                   break;
5826
5827                 case EM_386:
5828                 case EM_IAMCU:
5829                 case EM_X86_64:
5830                 case EM_L1OM:
5831                 case EM_K1OM:
5832                 case EM_OLD_SPARCV9:
5833                 case EM_SPARC32PLUS:
5834                 case EM_SPARCV9:
5835                 case EM_SPARC:
5836                   if (flag == SHF_ORDERED)
5837                     sindex = 19;
5838                   break;
5839
5840                 case EM_ARM:
5841                   switch (flag)
5842                     {
5843                     case SHF_ENTRYSECT: sindex = 21; break;
5844                     case SHF_ARM_PURECODE: sindex = 22; break;
5845                     case SHF_COMDEF: sindex = 23; break;
5846                     default: break;
5847                     }
5848                   break;
5849                 case EM_PPC:
5850                   if (flag == SHF_PPC_VLE)
5851                     sindex = 25;
5852                   break;
5853
5854                 default:
5855                   break;
5856                 }
5857             }
5858
5859           if (sindex != -1)
5860             {
5861               if (p != buff + field_size + 4)
5862                 {
5863                   if (size < (10 + 2))
5864                     {
5865                       warn (_("Internal error: not enough buffer room for section flag info"));
5866                       return _("<unknown>");
5867                     }
5868                   size -= 2;
5869                   *p++ = ',';
5870                   *p++ = ' ';
5871                 }
5872
5873               size -= flags [sindex].len;
5874               p = stpcpy (p, flags [sindex].str);
5875             }
5876           else if (flag & SHF_MASKOS)
5877             os_flags |= flag;
5878           else if (flag & SHF_MASKPROC)
5879             proc_flags |= flag;
5880           else
5881             unknown_flags |= flag;
5882         }
5883       else
5884         {
5885           switch (flag)
5886             {
5887             case SHF_WRITE:             *p = 'W'; break;
5888             case SHF_ALLOC:             *p = 'A'; break;
5889             case SHF_EXECINSTR:         *p = 'X'; break;
5890             case SHF_MERGE:             *p = 'M'; break;
5891             case SHF_STRINGS:           *p = 'S'; break;
5892             case SHF_INFO_LINK:         *p = 'I'; break;
5893             case SHF_LINK_ORDER:        *p = 'L'; break;
5894             case SHF_OS_NONCONFORMING:  *p = 'O'; break;
5895             case SHF_GROUP:             *p = 'G'; break;
5896             case SHF_TLS:               *p = 'T'; break;
5897             case SHF_EXCLUDE:           *p = 'E'; break;
5898             case SHF_COMPRESSED:        *p = 'C'; break;
5899             case SHF_GNU_MBIND:         *p = 'D'; break;
5900
5901             default:
5902               if ((filedata->file_header.e_machine == EM_X86_64
5903                    || filedata->file_header.e_machine == EM_L1OM
5904                    || filedata->file_header.e_machine == EM_K1OM)
5905                   && flag == SHF_X86_64_LARGE)
5906                 *p = 'l';
5907               else if (filedata->file_header.e_machine == EM_ARM
5908                        && flag == SHF_ARM_PURECODE)
5909                   *p = 'y';
5910               else if (filedata->file_header.e_machine == EM_PPC
5911                        && flag == SHF_PPC_VLE)
5912                   *p = 'v';
5913               else if (flag & SHF_MASKOS)
5914                 {
5915                   *p = 'o';
5916                   sh_flags &= ~ SHF_MASKOS;
5917                 }
5918               else if (flag & SHF_MASKPROC)
5919                 {
5920                   *p = 'p';
5921                   sh_flags &= ~ SHF_MASKPROC;
5922                 }
5923               else
5924                 *p = 'x';
5925               break;
5926             }
5927           p++;
5928         }
5929     }
5930
5931   if (do_section_details)
5932     {
5933       if (os_flags)
5934         {
5935           size -= 5 + field_size;
5936           if (p != buff + field_size + 4)
5937             {
5938               if (size < (2 + 1))
5939                 {
5940                   warn (_("Internal error: not enough buffer room for section flag info"));
5941                   return _("<unknown>");
5942                 }
5943               size -= 2;
5944               *p++ = ',';
5945               *p++ = ' ';
5946             }
5947           sprintf (p, "OS (%*.*lx)", field_size, field_size,
5948                    (unsigned long) os_flags);
5949           p += 5 + field_size;
5950         }
5951       if (proc_flags)
5952         {
5953           size -= 7 + field_size;
5954           if (p != buff + field_size + 4)
5955             {
5956               if (size < (2 + 1))
5957                 {
5958                   warn (_("Internal error: not enough buffer room for section flag info"));
5959                   return _("<unknown>");
5960                 }
5961               size -= 2;
5962               *p++ = ',';
5963               *p++ = ' ';
5964             }
5965           sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5966                    (unsigned long) proc_flags);
5967           p += 7 + field_size;
5968         }
5969       if (unknown_flags)
5970         {
5971           size -= 10 + field_size;
5972           if (p != buff + field_size + 4)
5973             {
5974               if (size < (2 + 1))
5975                 {
5976                   warn (_("Internal error: not enough buffer room for section flag info"));
5977                   return _("<unknown>");
5978                 }
5979               size -= 2;
5980               *p++ = ',';
5981               *p++ = ' ';
5982             }
5983           sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5984                    (unsigned long) unknown_flags);
5985           p += 10 + field_size;
5986         }
5987     }
5988
5989   *p = '\0';
5990   return buff;
5991 }
5992
5993 static unsigned int
5994 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf, bfd_size_type size)
5995 {
5996   if (is_32bit_elf)
5997     {
5998       Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5999
6000       if (size < sizeof (* echdr))
6001         {
6002           error (_("Compressed section is too small even for a compression header\n"));
6003           return 0;
6004         }
6005
6006       chdr->ch_type = BYTE_GET (echdr->ch_type);
6007       chdr->ch_size = BYTE_GET (echdr->ch_size);
6008       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
6009       return sizeof (*echdr);
6010     }
6011   else
6012     {
6013       Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
6014
6015       if (size < sizeof (* echdr))
6016         {
6017           error (_("Compressed section is too small even for a compression header\n"));
6018           return 0;
6019         }
6020
6021       chdr->ch_type = BYTE_GET (echdr->ch_type);
6022       chdr->ch_size = BYTE_GET (echdr->ch_size);
6023       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
6024       return sizeof (*echdr);
6025     }
6026 }
6027
6028 static bfd_boolean
6029 process_section_headers (Filedata * filedata)
6030 {
6031   Elf_Internal_Shdr * section;
6032   unsigned int i;
6033
6034   filedata->section_headers = NULL;
6035
6036   if (filedata->file_header.e_shnum == 0)
6037     {
6038       /* PR binutils/12467.  */
6039       if (filedata->file_header.e_shoff != 0)
6040         {
6041           warn (_("possibly corrupt ELF file header - it has a non-zero"
6042                   " section header offset, but no section headers\n"));
6043           return FALSE;
6044         }
6045       else if (do_sections)
6046         printf (_("\nThere are no sections in this file.\n"));
6047
6048       return TRUE;
6049     }
6050
6051   if (do_sections && !do_header)
6052     printf (ngettext ("There is %d section header, "
6053                       "starting at offset 0x%lx:\n",
6054                       "There are %d section headers, "
6055                       "starting at offset 0x%lx:\n",
6056                       filedata->file_header.e_shnum),
6057             filedata->file_header.e_shnum,
6058             (unsigned long) filedata->file_header.e_shoff);
6059
6060   if (is_32bit_elf)
6061     {
6062       if (! get_32bit_section_headers (filedata, FALSE))
6063         return FALSE;
6064     }
6065   else
6066     {
6067       if (! get_64bit_section_headers (filedata, FALSE))
6068         return FALSE;
6069     }
6070
6071   /* Read in the string table, so that we have names to display.  */
6072   if (filedata->file_header.e_shstrndx != SHN_UNDEF
6073        && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
6074     {
6075       section = filedata->section_headers + filedata->file_header.e_shstrndx;
6076
6077       if (section->sh_size != 0)
6078         {
6079           filedata->string_table = (char *) get_data (NULL, filedata, section->sh_offset,
6080                                                       1, section->sh_size,
6081                                                       _("string table"));
6082
6083           filedata->string_table_length = filedata->string_table != NULL ? section->sh_size : 0;
6084         }
6085     }
6086
6087   /* Scan the sections for the dynamic symbol table
6088      and dynamic string table and debug sections.  */
6089   dynamic_symbols = NULL;
6090   dynamic_strings = NULL;
6091   dynamic_syminfo = NULL;
6092   symtab_shndx_list = NULL;
6093
6094   eh_addr_size = is_32bit_elf ? 4 : 8;
6095   switch (filedata->file_header.e_machine)
6096     {
6097     case EM_MIPS:
6098     case EM_MIPS_RS3_LE:
6099       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
6100          FDE addresses.  However, the ABI also has a semi-official ILP32
6101          variant for which the normal FDE address size rules apply.
6102
6103          GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
6104          section, where XX is the size of longs in bits.  Unfortunately,
6105          earlier compilers provided no way of distinguishing ILP32 objects
6106          from LP64 objects, so if there's any doubt, we should assume that
6107          the official LP64 form is being used.  */
6108       if ((filedata->file_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
6109           && find_section (filedata, ".gcc_compiled_long32") == NULL)
6110         eh_addr_size = 8;
6111       break;
6112
6113     case EM_H8_300:
6114     case EM_H8_300H:
6115       switch (filedata->file_header.e_flags & EF_H8_MACH)
6116         {
6117         case E_H8_MACH_H8300:
6118         case E_H8_MACH_H8300HN:
6119         case E_H8_MACH_H8300SN:
6120         case E_H8_MACH_H8300SXN:
6121           eh_addr_size = 2;
6122           break;
6123         case E_H8_MACH_H8300H:
6124         case E_H8_MACH_H8300S:
6125         case E_H8_MACH_H8300SX:
6126           eh_addr_size = 4;
6127           break;
6128         }
6129       break;
6130
6131     case EM_M32C_OLD:
6132     case EM_M32C:
6133       switch (filedata->file_header.e_flags & EF_M32C_CPU_MASK)
6134         {
6135         case EF_M32C_CPU_M16C:
6136           eh_addr_size = 2;
6137           break;
6138         }
6139       break;
6140     }
6141
6142 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64)                \
6143   do                                                                    \
6144     {                                                                   \
6145       bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64;  \
6146       if (section->sh_entsize != expected_entsize)                      \
6147         {                                                               \
6148           char buf[40];                                                 \
6149           sprintf_vma (buf, section->sh_entsize);                       \
6150           /* Note: coded this way so that there is a single string for  \
6151              translation.  */ \
6152           error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
6153           error (_("(Using the expected size of %u for the rest of this dump)\n"), \
6154                    (unsigned) expected_entsize);                        \
6155           section->sh_entsize = expected_entsize;                       \
6156         }                                                               \
6157     }                                                                   \
6158   while (0)
6159
6160 #define CHECK_ENTSIZE(section, i, type)                                 \
6161   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),         \
6162                         sizeof (Elf64_External_##type))
6163
6164   for (i = 0, section = filedata->section_headers;
6165        i < filedata->file_header.e_shnum;
6166        i++, section++)
6167     {
6168       char * name = SECTION_NAME (section);
6169
6170       if (section->sh_type == SHT_DYNSYM)
6171         {
6172           if (dynamic_symbols != NULL)
6173             {
6174               error (_("File contains multiple dynamic symbol tables\n"));
6175               continue;
6176             }
6177
6178           CHECK_ENTSIZE (section, i, Sym);
6179           dynamic_symbols = GET_ELF_SYMBOLS (filedata, section, & num_dynamic_syms);
6180         }
6181       else if (section->sh_type == SHT_STRTAB
6182                && streq (name, ".dynstr"))
6183         {
6184           if (dynamic_strings != NULL)
6185             {
6186               error (_("File contains multiple dynamic string tables\n"));
6187               continue;
6188             }
6189
6190           dynamic_strings = (char *) get_data (NULL, filedata, section->sh_offset,
6191                                                1, section->sh_size,
6192                                                _("dynamic strings"));
6193           dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
6194         }
6195       else if (section->sh_type == SHT_SYMTAB_SHNDX)
6196         {
6197           elf_section_list * entry = xmalloc (sizeof * entry);
6198
6199           entry->hdr = section;
6200           entry->next = symtab_shndx_list;
6201           symtab_shndx_list = entry;
6202         }
6203       else if (section->sh_type == SHT_SYMTAB)
6204         CHECK_ENTSIZE (section, i, Sym);
6205       else if (section->sh_type == SHT_GROUP)
6206         CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
6207       else if (section->sh_type == SHT_REL)
6208         CHECK_ENTSIZE (section, i, Rel);
6209       else if (section->sh_type == SHT_RELA)
6210         CHECK_ENTSIZE (section, i, Rela);
6211       else if ((do_debugging || do_debug_info || do_debug_abbrevs
6212                 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
6213                 || do_debug_aranges || do_debug_frames || do_debug_macinfo
6214                 || do_debug_str || do_debug_loc || do_debug_ranges
6215                 || do_debug_addr || do_debug_cu_index || do_debug_links)
6216                && (const_strneq (name, ".debug_")
6217                    || const_strneq (name, ".zdebug_")))
6218         {
6219           if (name[1] == 'z')
6220             name += sizeof (".zdebug_") - 1;
6221           else
6222             name += sizeof (".debug_") - 1;
6223
6224           if (do_debugging
6225               || (do_debug_info     && const_strneq (name, "info"))
6226               || (do_debug_info     && const_strneq (name, "types"))
6227               || (do_debug_abbrevs  && const_strneq (name, "abbrev"))
6228               || (do_debug_lines    && strcmp (name, "line") == 0)
6229               || (do_debug_lines    && const_strneq (name, "line."))
6230               || (do_debug_pubnames && const_strneq (name, "pubnames"))
6231               || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
6232               || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
6233               || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
6234               || (do_debug_aranges  && const_strneq (name, "aranges"))
6235               || (do_debug_ranges   && const_strneq (name, "ranges"))
6236               || (do_debug_ranges   && const_strneq (name, "rnglists"))
6237               || (do_debug_frames   && const_strneq (name, "frame"))
6238               || (do_debug_macinfo  && const_strneq (name, "macinfo"))
6239               || (do_debug_macinfo  && const_strneq (name, "macro"))
6240               || (do_debug_str      && const_strneq (name, "str"))
6241               || (do_debug_loc      && const_strneq (name, "loc"))
6242               || (do_debug_loc      && const_strneq (name, "loclists"))
6243               || (do_debug_addr     && const_strneq (name, "addr"))
6244               || (do_debug_cu_index && const_strneq (name, "cu_index"))
6245               || (do_debug_cu_index && const_strneq (name, "tu_index"))
6246               )
6247             request_dump_bynumber (filedata, i, DEBUG_DUMP);
6248         }
6249       /* Linkonce section to be combined with .debug_info at link time.  */
6250       else if ((do_debugging || do_debug_info)
6251                && const_strneq (name, ".gnu.linkonce.wi."))
6252         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6253       else if (do_debug_frames && streq (name, ".eh_frame"))
6254         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6255       else if (do_gdb_index && (streq (name, ".gdb_index")
6256                                 || streq (name, ".debug_names")))
6257         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6258       /* Trace sections for Itanium VMS.  */
6259       else if ((do_debugging || do_trace_info || do_trace_abbrevs
6260                 || do_trace_aranges)
6261                && const_strneq (name, ".trace_"))
6262         {
6263           name += sizeof (".trace_") - 1;
6264
6265           if (do_debugging
6266               || (do_trace_info     && streq (name, "info"))
6267               || (do_trace_abbrevs  && streq (name, "abbrev"))
6268               || (do_trace_aranges  && streq (name, "aranges"))
6269               )
6270             request_dump_bynumber (filedata, i, DEBUG_DUMP);
6271         }
6272       else if ((do_debugging || do_debug_links)
6273                && (const_strneq (name, ".gnu_debuglink")
6274                    || const_strneq (name, ".gnu_debugaltlink")))
6275         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6276     }
6277
6278   if (! do_sections)
6279     return TRUE;
6280
6281   if (filedata->file_header.e_shnum > 1)
6282     printf (_("\nSection Headers:\n"));
6283   else
6284     printf (_("\nSection Header:\n"));
6285
6286   if (is_32bit_elf)
6287     {
6288       if (do_section_details)
6289         {
6290           printf (_("  [Nr] Name\n"));
6291           printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
6292         }
6293       else
6294         printf
6295           (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
6296     }
6297   else if (do_wide)
6298     {
6299       if (do_section_details)
6300         {
6301           printf (_("  [Nr] Name\n"));
6302           printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
6303         }
6304       else
6305         printf
6306           (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
6307     }
6308   else
6309     {
6310       if (do_section_details)
6311         {
6312           printf (_("  [Nr] Name\n"));
6313           printf (_("       Type              Address          Offset            Link\n"));
6314           printf (_("       Size              EntSize          Info              Align\n"));
6315         }
6316       else
6317         {
6318           printf (_("  [Nr] Name              Type             Address           Offset\n"));
6319           printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
6320         }
6321     }
6322
6323   if (do_section_details)
6324     printf (_("       Flags\n"));
6325
6326   for (i = 0, section = filedata->section_headers;
6327        i < filedata->file_header.e_shnum;
6328        i++, section++)
6329     {
6330       /* Run some sanity checks on the section header.  */
6331
6332       /* Check the sh_link field.  */
6333       switch (section->sh_type)
6334         {
6335         case SHT_REL:
6336         case SHT_RELA:
6337           if (section->sh_link == 0
6338               && (filedata->file_header.e_type == ET_EXEC
6339                   || filedata->file_header.e_type == ET_DYN))
6340             /* A dynamic relocation section where all entries use a
6341                zero symbol index need not specify a symtab section.  */
6342             break;
6343           /* Fall through.  */
6344         case SHT_SYMTAB_SHNDX:
6345         case SHT_GROUP:
6346         case SHT_HASH:
6347         case SHT_GNU_HASH:
6348         case SHT_GNU_versym:
6349           if (section->sh_link == 0
6350               || section->sh_link >= filedata->file_header.e_shnum
6351               || (filedata->section_headers[section->sh_link].sh_type != SHT_SYMTAB
6352                   && filedata->section_headers[section->sh_link].sh_type != SHT_DYNSYM))
6353             warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6354                   i, section->sh_link);
6355           break;
6356
6357         case SHT_DYNAMIC:
6358         case SHT_SYMTAB:
6359         case SHT_DYNSYM:
6360         case SHT_GNU_verneed:
6361         case SHT_GNU_verdef:
6362         case SHT_GNU_LIBLIST:
6363           if (section->sh_link == 0
6364               || section->sh_link >= filedata->file_header.e_shnum
6365               || filedata->section_headers[section->sh_link].sh_type != SHT_STRTAB)
6366             warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6367                   i, section->sh_link);
6368           break;
6369
6370         case SHT_INIT_ARRAY:
6371         case SHT_FINI_ARRAY:
6372         case SHT_PREINIT_ARRAY:
6373           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6374             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6375                   i, section->sh_link);
6376           break;
6377
6378         default:
6379           /* FIXME: Add support for target specific section types.  */
6380 #if 0     /* Currently we do not check other section types as there are too
6381              many special cases.  Stab sections for example have a type
6382              of SHT_PROGBITS but an sh_link field that links to the .stabstr
6383              section.  */
6384           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6385             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6386                   i, section->sh_link);
6387 #endif
6388           break;
6389         }
6390
6391       /* Check the sh_info field.  */
6392       switch (section->sh_type)
6393         {
6394         case SHT_REL:
6395         case SHT_RELA:
6396           if (section->sh_info == 0
6397               && (filedata->file_header.e_type == ET_EXEC
6398                   || filedata->file_header.e_type == ET_DYN))
6399             /* Dynamic relocations apply to segments, so they do not
6400                need to specify the section they relocate.  */
6401             break;
6402           if (section->sh_info == 0
6403               || section->sh_info >= filedata->file_header.e_shnum
6404               || (filedata->section_headers[section->sh_info].sh_type != SHT_PROGBITS
6405                   && filedata->section_headers[section->sh_info].sh_type != SHT_NOBITS
6406                   && filedata->section_headers[section->sh_info].sh_type != SHT_NOTE
6407                   && filedata->section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
6408                   && filedata->section_headers[section->sh_info].sh_type != SHT_FINI_ARRAY
6409                   && filedata->section_headers[section->sh_info].sh_type != SHT_PREINIT_ARRAY
6410                   /* FIXME: Are other section types valid ?  */
6411                   && filedata->section_headers[section->sh_info].sh_type < SHT_LOOS))
6412             warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6413                   i, section->sh_info);
6414           break;
6415
6416         case SHT_DYNAMIC:
6417         case SHT_HASH:
6418         case SHT_SYMTAB_SHNDX:
6419         case SHT_INIT_ARRAY:
6420         case SHT_FINI_ARRAY:
6421         case SHT_PREINIT_ARRAY:
6422           if (section->sh_info != 0)
6423             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6424                   i, section->sh_info);
6425           break;
6426
6427         case SHT_GROUP:
6428         case SHT_SYMTAB:
6429         case SHT_DYNSYM:
6430           /* A symbol index - we assume that it is valid.  */
6431           break;
6432
6433         default:
6434           /* FIXME: Add support for target specific section types.  */
6435           if (section->sh_type == SHT_NOBITS)
6436             /* NOBITS section headers with non-zero sh_info fields can be
6437                created when a binary is stripped of everything but its debug
6438                information.  The stripped sections have their headers
6439                preserved but their types set to SHT_NOBITS.  So do not check
6440                this type of section.  */
6441             ;
6442           else if (section->sh_flags & SHF_INFO_LINK)
6443             {
6444               if (section->sh_info < 1 || section->sh_info >= filedata->file_header.e_shnum)
6445                 warn (_("[%2u]: Expected link to another section in info field"), i);
6446             }
6447           else if (section->sh_type < SHT_LOOS
6448                    && (section->sh_flags & SHF_GNU_MBIND) == 0
6449                    && section->sh_info != 0)
6450             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6451                   i, section->sh_info);
6452           break;
6453         }
6454
6455       /* Check the sh_size field.  */
6456       if (section->sh_size > filedata->file_size
6457           && section->sh_type != SHT_NOBITS
6458           && section->sh_type != SHT_NULL
6459           && section->sh_type < SHT_LOOS)
6460         warn (_("Size of section %u is larger than the entire file!\n"), i);
6461
6462       printf ("  [%2u] ", i);
6463       if (do_section_details)
6464         printf ("%s\n      ", printable_section_name (filedata, section));
6465       else
6466         print_symbol (-17, SECTION_NAME (section));
6467
6468       printf (do_wide ? " %-15s " : " %-15.15s ",
6469               get_section_type_name (filedata, section->sh_type));
6470
6471       if (is_32bit_elf)
6472         {
6473           const char * link_too_big = NULL;
6474
6475           print_vma (section->sh_addr, LONG_HEX);
6476
6477           printf ( " %6.6lx %6.6lx %2.2lx",
6478                    (unsigned long) section->sh_offset,
6479                    (unsigned long) section->sh_size,
6480                    (unsigned long) section->sh_entsize);
6481
6482           if (do_section_details)
6483             fputs ("  ", stdout);
6484           else
6485             printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6486
6487           if (section->sh_link >= filedata->file_header.e_shnum)
6488             {
6489               link_too_big = "";
6490               /* The sh_link value is out of range.  Normally this indicates
6491                  an error but it can have special values in Solaris binaries.  */
6492               switch (filedata->file_header.e_machine)
6493                 {
6494                 case EM_386:
6495                 case EM_IAMCU:
6496                 case EM_X86_64:
6497                 case EM_L1OM:
6498                 case EM_K1OM:
6499                 case EM_OLD_SPARCV9:
6500                 case EM_SPARC32PLUS:
6501                 case EM_SPARCV9:
6502                 case EM_SPARC:
6503                   if (section->sh_link == (SHN_BEFORE & 0xffff))
6504                     link_too_big = "BEFORE";
6505                   else if (section->sh_link == (SHN_AFTER & 0xffff))
6506                     link_too_big = "AFTER";
6507                   break;
6508                 default:
6509                   break;
6510                 }
6511             }
6512
6513           if (do_section_details)
6514             {
6515               if (link_too_big != NULL && * link_too_big)
6516                 printf ("<%s> ", link_too_big);
6517               else
6518                 printf ("%2u ", section->sh_link);
6519               printf ("%3u %2lu\n", section->sh_info,
6520                       (unsigned long) section->sh_addralign);
6521             }
6522           else
6523             printf ("%2u %3u %2lu\n",
6524                     section->sh_link,
6525                     section->sh_info,
6526                     (unsigned long) section->sh_addralign);
6527
6528           if (link_too_big && ! * link_too_big)
6529             warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6530                   i, section->sh_link);
6531         }
6532       else if (do_wide)
6533         {
6534           print_vma (section->sh_addr, LONG_HEX);
6535
6536           if ((long) section->sh_offset == section->sh_offset)
6537             printf (" %6.6lx", (unsigned long) section->sh_offset);
6538           else
6539             {
6540               putchar (' ');
6541               print_vma (section->sh_offset, LONG_HEX);
6542             }
6543
6544           if ((unsigned long) section->sh_size == section->sh_size)
6545             printf (" %6.6lx", (unsigned long) section->sh_size);
6546           else
6547             {
6548               putchar (' ');
6549               print_vma (section->sh_size, LONG_HEX);
6550             }
6551
6552           if ((unsigned long) section->sh_entsize == section->sh_entsize)
6553             printf (" %2.2lx", (unsigned long) section->sh_entsize);
6554           else
6555             {
6556               putchar (' ');
6557               print_vma (section->sh_entsize, LONG_HEX);
6558             }
6559
6560           if (do_section_details)
6561             fputs ("  ", stdout);
6562           else
6563             printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6564
6565           printf ("%2u %3u ", section->sh_link, section->sh_info);
6566
6567           if ((unsigned long) section->sh_addralign == section->sh_addralign)
6568             printf ("%2lu\n", (unsigned long) section->sh_addralign);
6569           else
6570             {
6571               print_vma (section->sh_addralign, DEC);
6572               putchar ('\n');
6573             }
6574         }
6575       else if (do_section_details)
6576         {
6577           putchar (' ');
6578           print_vma (section->sh_addr, LONG_HEX);
6579           if ((long) section->sh_offset == section->sh_offset)
6580             printf ("  %16.16lx", (unsigned long) section->sh_offset);
6581           else
6582             {
6583               printf ("  ");
6584               print_vma (section->sh_offset, LONG_HEX);
6585             }
6586           printf ("  %u\n       ", section->sh_link);
6587           print_vma (section->sh_size, LONG_HEX);
6588           putchar (' ');
6589           print_vma (section->sh_entsize, LONG_HEX);
6590
6591           printf ("  %-16u  %lu\n",
6592                   section->sh_info,
6593                   (unsigned long) section->sh_addralign);
6594         }
6595       else
6596         {
6597           putchar (' ');
6598           print_vma (section->sh_addr, LONG_HEX);
6599           if ((long) section->sh_offset == section->sh_offset)
6600             printf ("  %8.8lx", (unsigned long) section->sh_offset);
6601           else
6602             {
6603               printf ("  ");
6604               print_vma (section->sh_offset, LONG_HEX);
6605             }
6606           printf ("\n       ");
6607           print_vma (section->sh_size, LONG_HEX);
6608           printf ("  ");
6609           print_vma (section->sh_entsize, LONG_HEX);
6610
6611           printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6612
6613           printf ("     %2u   %3u     %lu\n",
6614                   section->sh_link,
6615                   section->sh_info,
6616                   (unsigned long) section->sh_addralign);
6617         }
6618
6619       if (do_section_details)
6620         {
6621           printf ("       %s\n", get_elf_section_flags (filedata, section->sh_flags));
6622           if ((section->sh_flags & SHF_COMPRESSED) != 0)
6623             {
6624               /* Minimum section size is 12 bytes for 32-bit compression
6625                  header + 12 bytes for compressed data header.  */
6626               unsigned char buf[24];
6627
6628               assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6629               if (get_data (&buf, filedata, section->sh_offset, 1,
6630                             sizeof (buf), _("compression header")))
6631                 {
6632                   Elf_Internal_Chdr chdr;
6633
6634                   (void) get_compression_header (&chdr, buf, sizeof (buf));
6635
6636                   if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6637                     printf ("       ZLIB, ");
6638                   else
6639                     printf (_("       [<unknown>: 0x%x], "),
6640                             chdr.ch_type);
6641                   print_vma (chdr.ch_size, LONG_HEX);
6642                   printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6643                 }
6644             }
6645         }
6646     }
6647
6648   if (!do_section_details)
6649     {
6650       /* The ordering of the letters shown here matches the ordering of the
6651          corresponding SHF_xxx values, and hence the order in which these
6652          letters will be displayed to the user.  */
6653       printf (_("Key to Flags:\n\
6654   W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6655   L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6656   C (compressed), x (unknown), o (OS specific), E (exclude),\n  "));
6657       if (filedata->file_header.e_machine == EM_X86_64
6658           || filedata->file_header.e_machine == EM_L1OM
6659           || filedata->file_header.e_machine == EM_K1OM)
6660         printf (_("l (large), "));
6661       else if (filedata->file_header.e_machine == EM_ARM)
6662         printf (_("y (purecode), "));
6663       else if (filedata->file_header.e_machine == EM_PPC)
6664         printf (_("v (VLE), "));
6665       printf ("p (processor specific)\n");
6666     }
6667
6668   return TRUE;
6669 }
6670
6671 static const char *
6672 get_group_flags (unsigned int flags)
6673 {
6674   static char buff[128];
6675
6676   if (flags == 0)
6677     return "";
6678   else if (flags == GRP_COMDAT)
6679     return "COMDAT ";
6680
6681   snprintf (buff, 14, _("[0x%x: "), flags);
6682
6683   flags &= ~ GRP_COMDAT;
6684   if (flags & GRP_MASKOS)
6685     {
6686       strcat (buff, "<OS specific>");
6687       flags &= ~ GRP_MASKOS;
6688     }
6689
6690   if (flags & GRP_MASKPROC)
6691     {
6692       strcat (buff, "<PROC specific>");
6693       flags &= ~ GRP_MASKPROC;
6694     }
6695
6696   if (flags)
6697     strcat (buff, "<unknown>");
6698
6699   strcat (buff, "]");
6700   return buff;
6701 }
6702
6703 static bfd_boolean
6704 process_section_groups (Filedata * filedata)
6705 {
6706   Elf_Internal_Shdr * section;
6707   unsigned int i;
6708   struct group * group;
6709   Elf_Internal_Shdr * symtab_sec;
6710   Elf_Internal_Shdr * strtab_sec;
6711   Elf_Internal_Sym * symtab;
6712   unsigned long num_syms;
6713   char * strtab;
6714   size_t strtab_size;
6715
6716   /* Don't process section groups unless needed.  */
6717   if (!do_unwind && !do_section_groups)
6718     return TRUE;
6719
6720   if (filedata->file_header.e_shnum == 0)
6721     {
6722       if (do_section_groups)
6723         printf (_("\nThere are no sections to group in this file.\n"));
6724
6725       return TRUE;
6726     }
6727
6728   if (filedata->section_headers == NULL)
6729     {
6730       error (_("Section headers are not available!\n"));
6731       /* PR 13622: This can happen with a corrupt ELF header.  */
6732       return FALSE;
6733     }
6734
6735   section_headers_groups = (struct group **) calloc (filedata->file_header.e_shnum,
6736                                                      sizeof (struct group *));
6737
6738   if (section_headers_groups == NULL)
6739     {
6740       error (_("Out of memory reading %u section group headers\n"),
6741              filedata->file_header.e_shnum);
6742       return FALSE;
6743     }
6744
6745   /* Scan the sections for the group section.  */
6746   group_count = 0;
6747   for (i = 0, section = filedata->section_headers;
6748        i < filedata->file_header.e_shnum;
6749        i++, section++)
6750     if (section->sh_type == SHT_GROUP)
6751       group_count++;
6752
6753   if (group_count == 0)
6754     {
6755       if (do_section_groups)
6756         printf (_("\nThere are no section groups in this file.\n"));
6757
6758       return TRUE;
6759     }
6760
6761   section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6762
6763   if (section_groups == NULL)
6764     {
6765       error (_("Out of memory reading %lu groups\n"),
6766              (unsigned long) group_count);
6767       return FALSE;
6768     }
6769
6770   symtab_sec = NULL;
6771   strtab_sec = NULL;
6772   symtab = NULL;
6773   num_syms = 0;
6774   strtab = NULL;
6775   strtab_size = 0;
6776   for (i = 0, section = filedata->section_headers, group = section_groups;
6777        i < filedata->file_header.e_shnum;
6778        i++, section++)
6779     {
6780       if (section->sh_type == SHT_GROUP)
6781         {
6782           const char * name = printable_section_name (filedata, section);
6783           const char * group_name;
6784           unsigned char * start;
6785           unsigned char * indices;
6786           unsigned int entry, j, size;
6787           Elf_Internal_Shdr * sec;
6788           Elf_Internal_Sym * sym;
6789
6790           /* Get the symbol table.  */
6791           if (section->sh_link >= filedata->file_header.e_shnum
6792               || ((sec = filedata->section_headers + section->sh_link)->sh_type
6793                   != SHT_SYMTAB))
6794             {
6795               error (_("Bad sh_link in group section `%s'\n"), name);
6796               continue;
6797             }
6798
6799           if (symtab_sec != sec)
6800             {
6801               symtab_sec = sec;
6802               if (symtab)
6803                 free (symtab);
6804               symtab = GET_ELF_SYMBOLS (filedata, symtab_sec, & num_syms);
6805             }
6806
6807           if (symtab == NULL)
6808             {
6809               error (_("Corrupt header in group section `%s'\n"), name);
6810               continue;
6811             }
6812
6813           if (section->sh_info >= num_syms)
6814             {
6815               error (_("Bad sh_info in group section `%s'\n"), name);
6816               continue;
6817             }
6818
6819           sym = symtab + section->sh_info;
6820
6821           if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6822             {
6823               if (sym->st_shndx == 0
6824                   || sym->st_shndx >= filedata->file_header.e_shnum)
6825                 {
6826                   error (_("Bad sh_info in group section `%s'\n"), name);
6827                   continue;
6828                 }
6829
6830               group_name = SECTION_NAME (filedata->section_headers + sym->st_shndx);
6831               strtab_sec = NULL;
6832               if (strtab)
6833                 free (strtab);
6834               strtab = NULL;
6835               strtab_size = 0;
6836             }
6837           else
6838             {
6839               /* Get the string table.  */
6840               if (symtab_sec->sh_link >= filedata->file_header.e_shnum)
6841                 {
6842                   strtab_sec = NULL;
6843                   if (strtab)
6844                     free (strtab);
6845                   strtab = NULL;
6846                   strtab_size = 0;
6847                 }
6848               else if (strtab_sec
6849                        != (sec = filedata->section_headers + symtab_sec->sh_link))
6850                 {
6851                   strtab_sec = sec;
6852                   if (strtab)
6853                     free (strtab);
6854
6855                   strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
6856                                               1, strtab_sec->sh_size,
6857                                               _("string table"));
6858                   strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6859                 }
6860               group_name = sym->st_name < strtab_size
6861                 ? strtab + sym->st_name : _("<corrupt>");
6862             }
6863
6864           /* PR 17531: file: loop.  */
6865           if (section->sh_entsize > section->sh_size)
6866             {
6867               error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6868                      printable_section_name (filedata, section),
6869                      (unsigned long) section->sh_entsize,
6870                      (unsigned long) section->sh_size);
6871               break;
6872             }
6873
6874           start = (unsigned char *) get_data (NULL, filedata, section->sh_offset,
6875                                               1, section->sh_size,
6876                                               _("section data"));
6877           if (start == NULL)
6878             continue;
6879
6880           indices = start;
6881           size = (section->sh_size / section->sh_entsize) - 1;
6882           entry = byte_get (indices, 4);
6883           indices += 4;
6884
6885           if (do_section_groups)
6886             {
6887               printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6888                       get_group_flags (entry), i, name, group_name, size);
6889
6890               printf (_("   [Index]    Name\n"));
6891             }
6892
6893           group->group_index = i;
6894
6895           for (j = 0; j < size; j++)
6896             {
6897               struct group_list * g;
6898
6899               entry = byte_get (indices, 4);
6900               indices += 4;
6901
6902               if (entry >= filedata->file_header.e_shnum)
6903                 {
6904                   static unsigned num_group_errors = 0;
6905
6906                   if (num_group_errors ++ < 10)
6907                     {
6908                       error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6909                              entry, i, filedata->file_header.e_shnum - 1);
6910                       if (num_group_errors == 10)
6911                         warn (_("Further error messages about overlarge group section indices suppressed\n"));
6912                     }
6913                   continue;
6914                 }
6915
6916               if (section_headers_groups [entry] != NULL)
6917                 {
6918                   if (entry)
6919                     {
6920                       static unsigned num_errs = 0;
6921
6922                       if (num_errs ++ < 10)
6923                         {
6924                           error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6925                                  entry, i,
6926                                  section_headers_groups [entry]->group_index);
6927                           if (num_errs == 10)
6928                             warn (_("Further error messages about already contained group sections suppressed\n"));
6929                         }
6930                       continue;
6931                     }
6932                   else
6933                     {
6934                       /* Intel C/C++ compiler may put section 0 in a
6935                          section group.  We just warn it the first time
6936                          and ignore it afterwards.  */
6937                       static bfd_boolean warned = FALSE;
6938                       if (!warned)
6939                         {
6940                           error (_("section 0 in group section [%5u]\n"),
6941                                  section_headers_groups [entry]->group_index);
6942                           warned = TRUE;
6943                         }
6944                     }
6945                 }
6946
6947               section_headers_groups [entry] = group;
6948
6949               if (do_section_groups)
6950                 {
6951                   sec = filedata->section_headers + entry;
6952                   printf ("   [%5u]   %s\n", entry, printable_section_name (filedata, sec));
6953                 }
6954
6955               g = (struct group_list *) xmalloc (sizeof (struct group_list));
6956               g->section_index = entry;
6957               g->next = group->root;
6958               group->root = g;
6959             }
6960
6961           if (start)
6962             free (start);
6963
6964           group++;
6965         }
6966     }
6967
6968   if (symtab)
6969     free (symtab);
6970   if (strtab)
6971     free (strtab);
6972   return TRUE;
6973 }
6974
6975 /* Data used to display dynamic fixups.  */
6976
6977 struct ia64_vms_dynfixup
6978 {
6979   bfd_vma needed_ident;         /* Library ident number.  */
6980   bfd_vma needed;               /* Index in the dstrtab of the library name.  */
6981   bfd_vma fixup_needed;         /* Index of the library.  */
6982   bfd_vma fixup_rela_cnt;       /* Number of fixups.  */
6983   bfd_vma fixup_rela_off;       /* Fixups offset in the dynamic segment.  */
6984 };
6985
6986 /* Data used to display dynamic relocations.  */
6987
6988 struct ia64_vms_dynimgrela
6989 {
6990   bfd_vma img_rela_cnt;         /* Number of relocations.  */
6991   bfd_vma img_rela_off;         /* Reloc offset in the dynamic segment.  */
6992 };
6993
6994 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6995    library).  */
6996
6997 static bfd_boolean
6998 dump_ia64_vms_dynamic_fixups (Filedata *                  filedata,
6999                               struct ia64_vms_dynfixup *  fixup,
7000                               const char *                strtab,
7001                               unsigned int                strtab_sz)
7002 {
7003   Elf64_External_VMS_IMAGE_FIXUP * imfs;
7004   long i;
7005   const char * lib_name;
7006
7007   imfs = get_data (NULL, filedata, dynamic_addr + fixup->fixup_rela_off,
7008                    1, fixup->fixup_rela_cnt * sizeof (*imfs),
7009                    _("dynamic section image fixups"));
7010   if (!imfs)
7011     return FALSE;
7012
7013   if (fixup->needed < strtab_sz)
7014     lib_name = strtab + fixup->needed;
7015   else
7016     {
7017       warn (_("corrupt library name index of 0x%lx found in dynamic entry"),
7018             (unsigned long) fixup->needed);
7019       lib_name = "???";
7020     }
7021   printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
7022           (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
7023   printf
7024     (_("Seg Offset           Type                             SymVec DataType\n"));
7025
7026   for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
7027     {
7028       unsigned int type;
7029       const char *rtype;
7030
7031       printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
7032       printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
7033       type = BYTE_GET (imfs [i].type);
7034       rtype = elf_ia64_reloc_type (type);
7035       if (rtype == NULL)
7036         printf (" 0x%08x                       ", type);
7037       else
7038         printf (" %-32s ", rtype);
7039       printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
7040       printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
7041     }
7042
7043   free (imfs);
7044   return TRUE;
7045 }
7046
7047 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
7048
7049 static bfd_boolean
7050 dump_ia64_vms_dynamic_relocs (Filedata * filedata, struct ia64_vms_dynimgrela *imgrela)
7051 {
7052   Elf64_External_VMS_IMAGE_RELA *imrs;
7053   long i;
7054
7055   imrs = get_data (NULL, filedata, dynamic_addr + imgrela->img_rela_off,
7056                    1, imgrela->img_rela_cnt * sizeof (*imrs),
7057                    _("dynamic section image relocations"));
7058   if (!imrs)
7059     return FALSE;
7060
7061   printf (_("\nImage relocs\n"));
7062   printf
7063     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
7064
7065   for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
7066     {
7067       unsigned int type;
7068       const char *rtype;
7069
7070       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
7071       printf ("%08" BFD_VMA_FMT "x ",
7072               (bfd_vma) BYTE_GET (imrs [i].rela_offset));
7073       type = BYTE_GET (imrs [i].type);
7074       rtype = elf_ia64_reloc_type (type);
7075       if (rtype == NULL)
7076         printf ("0x%08x                      ", type);
7077       else
7078         printf ("%-31s ", rtype);
7079       print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
7080       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
7081       printf ("%08" BFD_VMA_FMT "x\n",
7082               (bfd_vma) BYTE_GET (imrs [i].sym_offset));
7083     }
7084
7085   free (imrs);
7086   return TRUE;
7087 }
7088
7089 /* Display IA-64 OpenVMS dynamic relocations and fixups.  */
7090
7091 static bfd_boolean
7092 process_ia64_vms_dynamic_relocs (Filedata * filedata)
7093 {
7094   struct ia64_vms_dynfixup fixup;
7095   struct ia64_vms_dynimgrela imgrela;
7096   Elf_Internal_Dyn *entry;
7097   bfd_vma strtab_off = 0;
7098   bfd_vma strtab_sz = 0;
7099   char *strtab = NULL;
7100   bfd_boolean res = TRUE;
7101
7102   memset (&fixup, 0, sizeof (fixup));
7103   memset (&imgrela, 0, sizeof (imgrela));
7104
7105   /* Note: the order of the entries is specified by the OpenVMS specs.  */
7106   for (entry = dynamic_section;
7107        entry < dynamic_section + dynamic_nent;
7108        entry++)
7109     {
7110       switch (entry->d_tag)
7111         {
7112         case DT_IA_64_VMS_STRTAB_OFFSET:
7113           strtab_off = entry->d_un.d_val;
7114           break;
7115         case DT_STRSZ:
7116           strtab_sz = entry->d_un.d_val;
7117           if (strtab == NULL)
7118             strtab = get_data (NULL, filedata, dynamic_addr + strtab_off,
7119                                1, strtab_sz, _("dynamic string section"));
7120           break;
7121
7122         case DT_IA_64_VMS_NEEDED_IDENT:
7123           fixup.needed_ident = entry->d_un.d_val;
7124           break;
7125         case DT_NEEDED:
7126           fixup.needed = entry->d_un.d_val;
7127           break;
7128         case DT_IA_64_VMS_FIXUP_NEEDED:
7129           fixup.fixup_needed = entry->d_un.d_val;
7130           break;
7131         case DT_IA_64_VMS_FIXUP_RELA_CNT:
7132           fixup.fixup_rela_cnt = entry->d_un.d_val;
7133           break;
7134         case DT_IA_64_VMS_FIXUP_RELA_OFF:
7135           fixup.fixup_rela_off = entry->d_un.d_val;
7136           if (! dump_ia64_vms_dynamic_fixups (filedata, &fixup, strtab, strtab_sz))
7137             res = FALSE;
7138           break;
7139         case DT_IA_64_VMS_IMG_RELA_CNT:
7140           imgrela.img_rela_cnt = entry->d_un.d_val;
7141           break;
7142         case DT_IA_64_VMS_IMG_RELA_OFF:
7143           imgrela.img_rela_off = entry->d_un.d_val;
7144           if (! dump_ia64_vms_dynamic_relocs (filedata, &imgrela))
7145             res = FALSE;
7146           break;
7147
7148         default:
7149           break;
7150         }
7151     }
7152
7153   if (strtab != NULL)
7154     free (strtab);
7155
7156   return res;
7157 }
7158
7159 static struct
7160 {
7161   const char * name;
7162   int reloc;
7163   int size;
7164   int rela;
7165 }
7166   dynamic_relocations [] =
7167 {
7168   { "REL", DT_REL, DT_RELSZ, FALSE },
7169   { "RELA", DT_RELA, DT_RELASZ, TRUE },
7170   { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
7171 };
7172
7173 /* Process the reloc section.  */
7174
7175 static bfd_boolean
7176 process_relocs (Filedata * filedata)
7177 {
7178   unsigned long rel_size;
7179   unsigned long rel_offset;
7180
7181   if (!do_reloc)
7182     return TRUE;
7183
7184   if (do_using_dynamic)
7185     {
7186       int          is_rela;
7187       const char * name;
7188       bfd_boolean  has_dynamic_reloc;
7189       unsigned int i;
7190
7191       has_dynamic_reloc = FALSE;
7192
7193       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7194         {
7195           is_rela = dynamic_relocations [i].rela;
7196           name = dynamic_relocations [i].name;
7197           rel_size = dynamic_info [dynamic_relocations [i].size];
7198           rel_offset = dynamic_info [dynamic_relocations [i].reloc];
7199
7200           if (rel_size)
7201             has_dynamic_reloc = TRUE;
7202
7203           if (is_rela == UNKNOWN)
7204             {
7205               if (dynamic_relocations [i].reloc == DT_JMPREL)
7206                 switch (dynamic_info[DT_PLTREL])
7207                   {
7208                   case DT_REL:
7209                     is_rela = FALSE;
7210                     break;
7211                   case DT_RELA:
7212                     is_rela = TRUE;
7213                     break;
7214                   }
7215             }
7216
7217           if (rel_size)
7218             {
7219               printf
7220                 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
7221                  name, rel_offset, rel_size);
7222
7223               dump_relocations (filedata,
7224                                 offset_from_vma (filedata, rel_offset, rel_size),
7225                                 rel_size,
7226                                 dynamic_symbols, num_dynamic_syms,
7227                                 dynamic_strings, dynamic_strings_length,
7228                                 is_rela, TRUE /* is_dynamic */);
7229             }
7230         }
7231
7232       if (is_ia64_vms (filedata))
7233         if (process_ia64_vms_dynamic_relocs (filedata))
7234           has_dynamic_reloc = TRUE;
7235
7236       if (! has_dynamic_reloc)
7237         printf (_("\nThere are no dynamic relocations in this file.\n"));
7238     }
7239   else
7240     {
7241       Elf_Internal_Shdr * section;
7242       unsigned long i;
7243       bfd_boolean found = FALSE;
7244
7245       for (i = 0, section = filedata->section_headers;
7246            i < filedata->file_header.e_shnum;
7247            i++, section++)
7248         {
7249           if (   section->sh_type != SHT_RELA
7250               && section->sh_type != SHT_REL)
7251             continue;
7252
7253           rel_offset = section->sh_offset;
7254           rel_size   = section->sh_size;
7255
7256           if (rel_size)
7257             {
7258               Elf_Internal_Shdr * strsec;
7259               int is_rela;
7260               unsigned long num_rela;
7261
7262               printf (_("\nRelocation section "));
7263
7264               if (filedata->string_table == NULL)
7265                 printf ("%d", section->sh_name);
7266               else
7267                 printf ("'%s'", printable_section_name (filedata, section));
7268
7269               num_rela = rel_size / section->sh_entsize;
7270               printf (ngettext (" at offset 0x%lx contains %lu entry:\n",
7271                                 " at offset 0x%lx contains %lu entries:\n",
7272                                 num_rela),
7273                       rel_offset, num_rela);
7274
7275               is_rela = section->sh_type == SHT_RELA;
7276
7277               if (section->sh_link != 0
7278                   && section->sh_link < filedata->file_header.e_shnum)
7279                 {
7280                   Elf_Internal_Shdr * symsec;
7281                   Elf_Internal_Sym *  symtab;
7282                   unsigned long nsyms;
7283                   unsigned long strtablen = 0;
7284                   char * strtab = NULL;
7285
7286                   symsec = filedata->section_headers + section->sh_link;
7287                   if (symsec->sh_type != SHT_SYMTAB
7288                       && symsec->sh_type != SHT_DYNSYM)
7289                     continue;
7290
7291                   symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
7292
7293                   if (symtab == NULL)
7294                     continue;
7295
7296                   if (symsec->sh_link != 0
7297                       && symsec->sh_link < filedata->file_header.e_shnum)
7298                     {
7299                       strsec = filedata->section_headers + symsec->sh_link;
7300
7301                       strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7302                                                   1, strsec->sh_size,
7303                                                   _("string table"));
7304                       strtablen = strtab == NULL ? 0 : strsec->sh_size;
7305                     }
7306
7307                   dump_relocations (filedata, rel_offset, rel_size,
7308                                     symtab, nsyms, strtab, strtablen,
7309                                     is_rela,
7310                                     symsec->sh_type == SHT_DYNSYM);
7311                   if (strtab)
7312                     free (strtab);
7313                   free (symtab);
7314                 }
7315               else
7316                 dump_relocations (filedata, rel_offset, rel_size,
7317                                   NULL, 0, NULL, 0, is_rela,
7318                                   FALSE /* is_dynamic */);
7319
7320               found = TRUE;
7321             }
7322         }
7323
7324       if (! found)
7325         {
7326           /* Users sometimes forget the -D option, so try to be helpful.  */
7327           for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7328             {
7329               if (dynamic_info [dynamic_relocations [i].size])
7330                 {
7331                   printf (_("\nThere are no static relocations in this file."));
7332                   printf (_("\nTo see the dynamic relocations add --use-dynamic to the command line.\n"));
7333
7334                   break;
7335                 }
7336             }
7337           if (i == ARRAY_SIZE (dynamic_relocations))
7338             printf (_("\nThere are no relocations in this file.\n"));
7339         }
7340     }
7341
7342   return TRUE;
7343 }
7344
7345 /* An absolute address consists of a section and an offset.  If the
7346    section is NULL, the offset itself is the address, otherwise, the
7347    address equals to LOAD_ADDRESS(section) + offset.  */
7348
7349 struct absaddr
7350 {
7351   unsigned short section;
7352   bfd_vma offset;
7353 };
7354
7355 #define ABSADDR(a) \
7356   ((a).section \
7357    ? filedata->section_headers [(a).section].sh_addr + (a).offset \
7358    : (a).offset)
7359
7360 /* Find the nearest symbol at or below ADDR.  Returns the symbol
7361    name, if found, and the offset from the symbol to ADDR.  */
7362
7363 static void
7364 find_symbol_for_address (Filedata *          filedata,
7365                          Elf_Internal_Sym *  symtab,
7366                          unsigned long       nsyms,
7367                          const char *        strtab,
7368                          unsigned long       strtab_size,
7369                          struct absaddr      addr,
7370                          const char **       symname,
7371                          bfd_vma *           offset)
7372 {
7373   bfd_vma dist = 0x100000;
7374   Elf_Internal_Sym * sym;
7375   Elf_Internal_Sym * beg;
7376   Elf_Internal_Sym * end;
7377   Elf_Internal_Sym * best = NULL;
7378
7379   REMOVE_ARCH_BITS (addr.offset);
7380   beg = symtab;
7381   end = symtab + nsyms;
7382
7383   while (beg < end)
7384     {
7385       bfd_vma value;
7386
7387       sym = beg + (end - beg) / 2;
7388
7389       value = sym->st_value;
7390       REMOVE_ARCH_BITS (value);
7391
7392       if (sym->st_name != 0
7393           && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
7394           && addr.offset >= value
7395           && addr.offset - value < dist)
7396         {
7397           best = sym;
7398           dist = addr.offset - value;
7399           if (!dist)
7400             break;
7401         }
7402
7403       if (addr.offset < value)
7404         end = sym;
7405       else
7406         beg = sym + 1;
7407     }
7408
7409   if (best)
7410     {
7411       *symname = (best->st_name >= strtab_size
7412                   ? _("<corrupt>") : strtab + best->st_name);
7413       *offset = dist;
7414       return;
7415     }
7416
7417   *symname = NULL;
7418   *offset = addr.offset;
7419 }
7420
7421 static /* signed */ int
7422 symcmp (const void *p, const void *q)
7423 {
7424   Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7425   Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7426
7427   return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7428 }
7429
7430 /* Process the unwind section.  */
7431
7432 #include "unwind-ia64.h"
7433
7434 struct ia64_unw_table_entry
7435 {
7436   struct absaddr start;
7437   struct absaddr end;
7438   struct absaddr info;
7439 };
7440
7441 struct ia64_unw_aux_info
7442 {
7443   struct ia64_unw_table_entry * table;          /* Unwind table.  */
7444   unsigned long                 table_len;      /* Length of unwind table.  */
7445   unsigned char *               info;           /* Unwind info.  */
7446   unsigned long                 info_size;      /* Size of unwind info.  */
7447   bfd_vma                       info_addr;      /* Starting address of unwind info.  */
7448   bfd_vma                       seg_base;       /* Starting address of segment.  */
7449   Elf_Internal_Sym *            symtab;         /* The symbol table.  */
7450   unsigned long                 nsyms;          /* Number of symbols.  */
7451   Elf_Internal_Sym *            funtab;         /* Sorted table of STT_FUNC symbols.  */
7452   unsigned long                 nfuns;          /* Number of entries in funtab.  */
7453   char *                        strtab;         /* The string table.  */
7454   unsigned long                 strtab_size;    /* Size of string table.  */
7455 };
7456
7457 static bfd_boolean
7458 dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
7459 {
7460   struct ia64_unw_table_entry * tp;
7461   unsigned long j, nfuns;
7462   int in_body;
7463   bfd_boolean res = TRUE;
7464
7465   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7466   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7467     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7468       aux->funtab[nfuns++] = aux->symtab[j];
7469   aux->nfuns = nfuns;
7470   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7471
7472   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7473     {
7474       bfd_vma stamp;
7475       bfd_vma offset;
7476       const unsigned char * dp;
7477       const unsigned char * head;
7478       const unsigned char * end;
7479       const char * procname;
7480
7481       find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7482                                aux->strtab_size, tp->start, &procname, &offset);
7483
7484       fputs ("\n<", stdout);
7485
7486       if (procname)
7487         {
7488           fputs (procname, stdout);
7489
7490           if (offset)
7491             printf ("+%lx", (unsigned long) offset);
7492         }
7493
7494       fputs (">: [", stdout);
7495       print_vma (tp->start.offset, PREFIX_HEX);
7496       fputc ('-', stdout);
7497       print_vma (tp->end.offset, PREFIX_HEX);
7498       printf ("], info at +0x%lx\n",
7499               (unsigned long) (tp->info.offset - aux->seg_base));
7500
7501       /* PR 17531: file: 86232b32.  */
7502       if (aux->info == NULL)
7503         continue;
7504
7505       /* PR 17531: file: 0997b4d1.  */
7506       if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7507         {
7508           warn (_("Invalid offset %lx in table entry %ld\n"),
7509                 (long) tp->info.offset, (long) (tp - aux->table));
7510           res = FALSE;
7511           continue;
7512         }
7513
7514       head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
7515       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7516
7517       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7518               (unsigned) UNW_VER (stamp),
7519               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7520               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7521               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7522               (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7523
7524       if (UNW_VER (stamp) != 1)
7525         {
7526           printf (_("\tUnknown version.\n"));
7527           continue;
7528         }
7529
7530       in_body = 0;
7531       end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7532       /* PR 17531: file: 16ceda89.  */
7533       if (end > aux->info + aux->info_size)
7534         end = aux->info + aux->info_size;
7535       for (dp = head + 8; dp < end;)
7536         dp = unw_decode (dp, in_body, & in_body, end);
7537     }
7538
7539   free (aux->funtab);
7540
7541   return res;
7542 }
7543
7544 static bfd_boolean
7545 slurp_ia64_unwind_table (Filedata *                  filedata,
7546                          struct ia64_unw_aux_info *  aux,
7547                          Elf_Internal_Shdr *         sec)
7548 {
7549   unsigned long size, nrelas, i;
7550   Elf_Internal_Phdr * seg;
7551   struct ia64_unw_table_entry * tep;
7552   Elf_Internal_Shdr * relsec;
7553   Elf_Internal_Rela * rela;
7554   Elf_Internal_Rela * rp;
7555   unsigned char * table;
7556   unsigned char * tp;
7557   Elf_Internal_Sym * sym;
7558   const char * relname;
7559
7560   aux->table_len = 0;
7561
7562   /* First, find the starting address of the segment that includes
7563      this section: */
7564
7565   if (filedata->file_header.e_phnum)
7566     {
7567       if (! get_program_headers (filedata))
7568           return FALSE;
7569
7570       for (seg = filedata->program_headers;
7571            seg < filedata->program_headers + filedata->file_header.e_phnum;
7572            ++seg)
7573         {
7574           if (seg->p_type != PT_LOAD)
7575             continue;
7576
7577           if (sec->sh_addr >= seg->p_vaddr
7578               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7579             {
7580               aux->seg_base = seg->p_vaddr;
7581               break;
7582             }
7583         }
7584     }
7585
7586   /* Second, build the unwind table from the contents of the unwind section:  */
7587   size = sec->sh_size;
7588   table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7589                                       _("unwind table"));
7590   if (!table)
7591     return FALSE;
7592
7593   aux->table_len = size / (3 * eh_addr_size);
7594   aux->table = (struct ia64_unw_table_entry *)
7595     xcmalloc (aux->table_len, sizeof (aux->table[0]));
7596   tep = aux->table;
7597
7598   for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7599     {
7600       tep->start.section = SHN_UNDEF;
7601       tep->end.section   = SHN_UNDEF;
7602       tep->info.section  = SHN_UNDEF;
7603       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7604       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7605       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7606       tep->start.offset += aux->seg_base;
7607       tep->end.offset   += aux->seg_base;
7608       tep->info.offset  += aux->seg_base;
7609     }
7610   free (table);
7611
7612   /* Third, apply any relocations to the unwind table:  */
7613   for (relsec = filedata->section_headers;
7614        relsec < filedata->section_headers + filedata->file_header.e_shnum;
7615        ++relsec)
7616     {
7617       if (relsec->sh_type != SHT_RELA
7618           || relsec->sh_info >= filedata->file_header.e_shnum
7619           || filedata->section_headers + relsec->sh_info != sec)
7620         continue;
7621
7622       if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
7623                               & rela, & nrelas))
7624         {
7625           free (aux->table);
7626           aux->table = NULL;
7627           aux->table_len = 0;
7628           return FALSE;
7629         }
7630
7631       for (rp = rela; rp < rela + nrelas; ++rp)
7632         {
7633           unsigned int sym_ndx;
7634           unsigned int r_type = get_reloc_type (filedata, rp->r_info);
7635           relname = elf_ia64_reloc_type (r_type);
7636
7637           /* PR 17531: file: 9fa67536.  */
7638           if (relname == NULL)
7639             {
7640               warn (_("Skipping unknown relocation type: %u\n"), r_type);
7641               continue;
7642             }
7643
7644           if (! const_strneq (relname, "R_IA64_SEGREL"))
7645             {
7646               warn (_("Skipping unexpected relocation type: %s\n"), relname);
7647               continue;
7648             }
7649
7650           i = rp->r_offset / (3 * eh_addr_size);
7651
7652           /* PR 17531: file: 5bc8d9bf.  */
7653           if (i >= aux->table_len)
7654             {
7655               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7656               continue;
7657             }
7658
7659           sym_ndx = get_reloc_symindex (rp->r_info);
7660           if (sym_ndx >= aux->nsyms)
7661             {
7662               warn (_("Skipping reloc with invalid symbol index: %u\n"),
7663                     sym_ndx);
7664               continue;
7665             }
7666           sym = aux->symtab + sym_ndx;
7667
7668           switch (rp->r_offset / eh_addr_size % 3)
7669             {
7670             case 0:
7671               aux->table[i].start.section = sym->st_shndx;
7672               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
7673               break;
7674             case 1:
7675               aux->table[i].end.section   = sym->st_shndx;
7676               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
7677               break;
7678             case 2:
7679               aux->table[i].info.section  = sym->st_shndx;
7680               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
7681               break;
7682             default:
7683               break;
7684             }
7685         }
7686
7687       free (rela);
7688     }
7689
7690   return TRUE;
7691 }
7692
7693 static bfd_boolean
7694 ia64_process_unwind (Filedata * filedata)
7695 {
7696   Elf_Internal_Shdr * sec;
7697   Elf_Internal_Shdr * unwsec = NULL;
7698   Elf_Internal_Shdr * strsec;
7699   unsigned long i, unwcount = 0, unwstart = 0;
7700   struct ia64_unw_aux_info aux;
7701   bfd_boolean res = TRUE;
7702
7703   memset (& aux, 0, sizeof (aux));
7704
7705   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
7706     {
7707       if (sec->sh_type == SHT_SYMTAB
7708           && sec->sh_link < filedata->file_header.e_shnum)
7709         {
7710           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
7711
7712           strsec = filedata->section_headers + sec->sh_link;
7713           if (aux.strtab != NULL)
7714             {
7715               error (_("Multiple auxillary string tables encountered\n"));
7716               free (aux.strtab);
7717               res = FALSE;
7718             }
7719           aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7720                                           1, strsec->sh_size,
7721                                           _("string table"));
7722           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7723         }
7724       else if (sec->sh_type == SHT_IA_64_UNWIND)
7725         unwcount++;
7726     }
7727
7728   if (!unwcount)
7729     printf (_("\nThere are no unwind sections in this file.\n"));
7730
7731   while (unwcount-- > 0)
7732     {
7733       char * suffix;
7734       size_t len, len2;
7735
7736       for (i = unwstart, sec = filedata->section_headers + unwstart, unwsec = NULL;
7737            i < filedata->file_header.e_shnum; ++i, ++sec)
7738         if (sec->sh_type == SHT_IA_64_UNWIND)
7739           {
7740             unwsec = sec;
7741             break;
7742           }
7743       /* We have already counted the number of SHT_IA64_UNWIND
7744          sections so the loop above should never fail.  */
7745       assert (unwsec != NULL);
7746
7747       unwstart = i + 1;
7748       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7749
7750       if ((unwsec->sh_flags & SHF_GROUP) != 0)
7751         {
7752           /* We need to find which section group it is in.  */
7753           struct group_list * g;
7754
7755           if (section_headers_groups == NULL
7756               || section_headers_groups [i] == NULL)
7757             i = filedata->file_header.e_shnum;
7758           else
7759             {
7760               g = section_headers_groups [i]->root;
7761
7762               for (; g != NULL; g = g->next)
7763                 {
7764                   sec = filedata->section_headers + g->section_index;
7765
7766                   if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7767                     break;
7768                 }
7769
7770               if (g == NULL)
7771                 i = filedata->file_header.e_shnum;
7772             }
7773         }
7774       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7775         {
7776           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
7777           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7778           suffix = SECTION_NAME (unwsec) + len;
7779           for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7780                ++i, ++sec)
7781             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7782                 && streq (SECTION_NAME (sec) + len2, suffix))
7783               break;
7784         }
7785       else
7786         {
7787           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7788              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
7789           len = sizeof (ELF_STRING_ia64_unwind) - 1;
7790           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7791           suffix = "";
7792           if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7793             suffix = SECTION_NAME (unwsec) + len;
7794           for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7795                ++i, ++sec)
7796             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7797                 && streq (SECTION_NAME (sec) + len2, suffix))
7798               break;
7799         }
7800
7801       if (i == filedata->file_header.e_shnum)
7802         {
7803           printf (_("\nCould not find unwind info section for "));
7804
7805           if (filedata->string_table == NULL)
7806             printf ("%d", unwsec->sh_name);
7807           else
7808             printf ("'%s'", printable_section_name (filedata, unwsec));
7809         }
7810       else
7811         {
7812           aux.info_addr = sec->sh_addr;
7813           aux.info = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1,
7814                                                  sec->sh_size,
7815                                                  _("unwind info"));
7816           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7817
7818           printf (_("\nUnwind section "));
7819
7820           if (filedata->string_table == NULL)
7821             printf ("%d", unwsec->sh_name);
7822           else
7823             printf ("'%s'", printable_section_name (filedata, unwsec));
7824
7825           printf (_(" at offset 0x%lx contains %lu entries:\n"),
7826                   (unsigned long) unwsec->sh_offset,
7827                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7828
7829           if (slurp_ia64_unwind_table (filedata, & aux, unwsec)
7830               && aux.table_len > 0)
7831             dump_ia64_unwind (filedata, & aux);
7832
7833           if (aux.table)
7834             free ((char *) aux.table);
7835           if (aux.info)
7836             free ((char *) aux.info);
7837           aux.table = NULL;
7838           aux.info = NULL;
7839         }
7840     }
7841
7842   if (aux.symtab)
7843     free (aux.symtab);
7844   if (aux.strtab)
7845     free ((char *) aux.strtab);
7846
7847   return res;
7848 }
7849
7850 struct hppa_unw_table_entry
7851 {
7852   struct absaddr start;
7853   struct absaddr end;
7854   unsigned int Cannot_unwind:1;                 /* 0 */
7855   unsigned int Millicode:1;                     /* 1 */
7856   unsigned int Millicode_save_sr0:1;            /* 2 */
7857   unsigned int Region_description:2;            /* 3..4 */
7858   unsigned int reserved1:1;                     /* 5 */
7859   unsigned int Entry_SR:1;                      /* 6 */
7860   unsigned int Entry_FR:4;     /* Number saved     7..10 */
7861   unsigned int Entry_GR:5;     /* Number saved     11..15 */
7862   unsigned int Args_stored:1;                   /* 16 */
7863   unsigned int Variable_Frame:1;                /* 17 */
7864   unsigned int Separate_Package_Body:1;         /* 18 */
7865   unsigned int Frame_Extension_Millicode:1;     /* 19 */
7866   unsigned int Stack_Overflow_Check:1;          /* 20 */
7867   unsigned int Two_Instruction_SP_Increment:1;  /* 21 */
7868   unsigned int Ada_Region:1;                    /* 22 */
7869   unsigned int cxx_info:1;                      /* 23 */
7870   unsigned int cxx_try_catch:1;                 /* 24 */
7871   unsigned int sched_entry_seq:1;               /* 25 */
7872   unsigned int reserved2:1;                     /* 26 */
7873   unsigned int Save_SP:1;                       /* 27 */
7874   unsigned int Save_RP:1;                       /* 28 */
7875   unsigned int Save_MRP_in_frame:1;             /* 29 */
7876   unsigned int extn_ptr_defined:1;              /* 30 */
7877   unsigned int Cleanup_defined:1;               /* 31 */
7878
7879   unsigned int MPE_XL_interrupt_marker:1;       /* 0 */
7880   unsigned int HP_UX_interrupt_marker:1;        /* 1 */
7881   unsigned int Large_frame:1;                   /* 2 */
7882   unsigned int Pseudo_SP_Set:1;                 /* 3 */
7883   unsigned int reserved4:1;                     /* 4 */
7884   unsigned int Total_frame_size:27;             /* 5..31 */
7885 };
7886
7887 struct hppa_unw_aux_info
7888 {
7889   struct hppa_unw_table_entry *  table;         /* Unwind table.  */
7890   unsigned long                  table_len;     /* Length of unwind table.  */
7891   bfd_vma                        seg_base;      /* Starting address of segment.  */
7892   Elf_Internal_Sym *             symtab;        /* The symbol table.  */
7893   unsigned long                  nsyms;         /* Number of symbols.  */
7894   Elf_Internal_Sym *             funtab;        /* Sorted table of STT_FUNC symbols.  */
7895   unsigned long                  nfuns;         /* Number of entries in funtab.  */
7896   char *                         strtab;        /* The string table.  */
7897   unsigned long                  strtab_size;   /* Size of string table.  */
7898 };
7899
7900 static bfd_boolean
7901 dump_hppa_unwind (Filedata * filedata, struct hppa_unw_aux_info * aux)
7902 {
7903   struct hppa_unw_table_entry * tp;
7904   unsigned long j, nfuns;
7905   bfd_boolean res = TRUE;
7906
7907   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7908   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7909     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7910       aux->funtab[nfuns++] = aux->symtab[j];
7911   aux->nfuns = nfuns;
7912   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7913
7914   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7915     {
7916       bfd_vma offset;
7917       const char * procname;
7918
7919       find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7920                                aux->strtab_size, tp->start, &procname,
7921                                &offset);
7922
7923       fputs ("\n<", stdout);
7924
7925       if (procname)
7926         {
7927           fputs (procname, stdout);
7928
7929           if (offset)
7930             printf ("+%lx", (unsigned long) offset);
7931         }
7932
7933       fputs (">: [", stdout);
7934       print_vma (tp->start.offset, PREFIX_HEX);
7935       fputc ('-', stdout);
7936       print_vma (tp->end.offset, PREFIX_HEX);
7937       printf ("]\n\t");
7938
7939 #define PF(_m) if (tp->_m) printf (#_m " ");
7940 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7941       PF(Cannot_unwind);
7942       PF(Millicode);
7943       PF(Millicode_save_sr0);
7944       /* PV(Region_description);  */
7945       PF(Entry_SR);
7946       PV(Entry_FR);
7947       PV(Entry_GR);
7948       PF(Args_stored);
7949       PF(Variable_Frame);
7950       PF(Separate_Package_Body);
7951       PF(Frame_Extension_Millicode);
7952       PF(Stack_Overflow_Check);
7953       PF(Two_Instruction_SP_Increment);
7954       PF(Ada_Region);
7955       PF(cxx_info);
7956       PF(cxx_try_catch);
7957       PF(sched_entry_seq);
7958       PF(Save_SP);
7959       PF(Save_RP);
7960       PF(Save_MRP_in_frame);
7961       PF(extn_ptr_defined);
7962       PF(Cleanup_defined);
7963       PF(MPE_XL_interrupt_marker);
7964       PF(HP_UX_interrupt_marker);
7965       PF(Large_frame);
7966       PF(Pseudo_SP_Set);
7967       PV(Total_frame_size);
7968 #undef PF
7969 #undef PV
7970     }
7971
7972   printf ("\n");
7973
7974   free (aux->funtab);
7975
7976   return res;
7977 }
7978
7979 static bfd_boolean
7980 slurp_hppa_unwind_table (Filedata *                  filedata,
7981                          struct hppa_unw_aux_info *  aux,
7982                          Elf_Internal_Shdr *         sec)
7983 {
7984   unsigned long size, unw_ent_size, nentries, nrelas, i;
7985   Elf_Internal_Phdr * seg;
7986   struct hppa_unw_table_entry * tep;
7987   Elf_Internal_Shdr * relsec;
7988   Elf_Internal_Rela * rela;
7989   Elf_Internal_Rela * rp;
7990   unsigned char * table;
7991   unsigned char * tp;
7992   Elf_Internal_Sym * sym;
7993   const char * relname;
7994
7995   /* First, find the starting address of the segment that includes
7996      this section.  */
7997   if (filedata->file_header.e_phnum)
7998     {
7999       if (! get_program_headers (filedata))
8000         return FALSE;
8001
8002       for (seg = filedata->program_headers;
8003            seg < filedata->program_headers + filedata->file_header.e_phnum;
8004            ++seg)
8005         {
8006           if (seg->p_type != PT_LOAD)
8007             continue;
8008
8009           if (sec->sh_addr >= seg->p_vaddr
8010               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
8011             {
8012               aux->seg_base = seg->p_vaddr;
8013               break;
8014             }
8015         }
8016     }
8017
8018   /* Second, build the unwind table from the contents of the unwind
8019      section.  */
8020   size = sec->sh_size;
8021   table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
8022                                       _("unwind table"));
8023   if (!table)
8024     return FALSE;
8025
8026   unw_ent_size = 16;
8027   nentries = size / unw_ent_size;
8028   size = unw_ent_size * nentries;
8029
8030   tep = aux->table = (struct hppa_unw_table_entry *)
8031       xcmalloc (nentries, sizeof (aux->table[0]));
8032
8033   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
8034     {
8035       unsigned int tmp1, tmp2;
8036
8037       tep->start.section = SHN_UNDEF;
8038       tep->end.section   = SHN_UNDEF;
8039
8040       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
8041       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
8042       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
8043       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
8044
8045       tep->start.offset += aux->seg_base;
8046       tep->end.offset   += aux->seg_base;
8047
8048       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
8049       tep->Millicode = (tmp1 >> 30) & 0x1;
8050       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
8051       tep->Region_description = (tmp1 >> 27) & 0x3;
8052       tep->reserved1 = (tmp1 >> 26) & 0x1;
8053       tep->Entry_SR = (tmp1 >> 25) & 0x1;
8054       tep->Entry_FR = (tmp1 >> 21) & 0xf;
8055       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
8056       tep->Args_stored = (tmp1 >> 15) & 0x1;
8057       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
8058       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
8059       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
8060       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
8061       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
8062       tep->Ada_Region = (tmp1 >> 9) & 0x1;
8063       tep->cxx_info = (tmp1 >> 8) & 0x1;
8064       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
8065       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
8066       tep->reserved2 = (tmp1 >> 5) & 0x1;
8067       tep->Save_SP = (tmp1 >> 4) & 0x1;
8068       tep->Save_RP = (tmp1 >> 3) & 0x1;
8069       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
8070       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
8071       tep->Cleanup_defined = tmp1 & 0x1;
8072
8073       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
8074       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
8075       tep->Large_frame = (tmp2 >> 29) & 0x1;
8076       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
8077       tep->reserved4 = (tmp2 >> 27) & 0x1;
8078       tep->Total_frame_size = tmp2 & 0x7ffffff;
8079     }
8080   free (table);
8081
8082   /* Third, apply any relocations to the unwind table.  */
8083   for (relsec = filedata->section_headers;
8084        relsec < filedata->section_headers + filedata->file_header.e_shnum;
8085        ++relsec)
8086     {
8087       if (relsec->sh_type != SHT_RELA
8088           || relsec->sh_info >= filedata->file_header.e_shnum
8089           || filedata->section_headers + relsec->sh_info != sec)
8090         continue;
8091
8092       if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
8093                               & rela, & nrelas))
8094         return FALSE;
8095
8096       for (rp = rela; rp < rela + nrelas; ++rp)
8097         {
8098           unsigned int sym_ndx;
8099           unsigned int r_type = get_reloc_type (filedata, rp->r_info);
8100           relname = elf_hppa_reloc_type (r_type);
8101
8102           if (relname == NULL)
8103             {
8104               warn (_("Skipping unknown relocation type: %u\n"), r_type);
8105               continue;
8106             }
8107
8108           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
8109           if (! const_strneq (relname, "R_PARISC_SEGREL"))
8110             {
8111               warn (_("Skipping unexpected relocation type: %s\n"), relname);
8112               continue;
8113             }
8114
8115           i = rp->r_offset / unw_ent_size;
8116           if (i >= aux->table_len)
8117             {
8118               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
8119               continue;
8120             }
8121
8122           sym_ndx = get_reloc_symindex (rp->r_info);
8123           if (sym_ndx >= aux->nsyms)
8124             {
8125               warn (_("Skipping reloc with invalid symbol index: %u\n"),
8126                     sym_ndx);
8127               continue;
8128             }
8129           sym = aux->symtab + sym_ndx;
8130
8131           switch ((rp->r_offset % unw_ent_size) / 4)
8132             {
8133             case 0:
8134               aux->table[i].start.section = sym->st_shndx;
8135               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
8136               break;
8137             case 1:
8138               aux->table[i].end.section   = sym->st_shndx;
8139               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
8140               break;
8141             default:
8142               break;
8143             }
8144         }
8145
8146       free (rela);
8147     }
8148
8149   aux->table_len = nentries;
8150
8151   return TRUE;
8152 }
8153
8154 static bfd_boolean
8155 hppa_process_unwind (Filedata * filedata)
8156 {
8157   struct hppa_unw_aux_info aux;
8158   Elf_Internal_Shdr * unwsec = NULL;
8159   Elf_Internal_Shdr * strsec;
8160   Elf_Internal_Shdr * sec;
8161   unsigned long i;
8162   bfd_boolean res = TRUE;
8163
8164   if (filedata->string_table == NULL)
8165     return FALSE;
8166
8167   memset (& aux, 0, sizeof (aux));
8168
8169   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8170     {
8171       if (sec->sh_type == SHT_SYMTAB
8172           && sec->sh_link < filedata->file_header.e_shnum)
8173         {
8174           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
8175
8176           strsec = filedata->section_headers + sec->sh_link;
8177           if (aux.strtab != NULL)
8178             {
8179               error (_("Multiple auxillary string tables encountered\n"));
8180               free (aux.strtab);
8181               res = FALSE;
8182             }
8183           aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
8184                                           1, strsec->sh_size,
8185                                           _("string table"));
8186           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8187         }
8188       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8189         unwsec = sec;
8190     }
8191
8192   if (!unwsec)
8193     printf (_("\nThere are no unwind sections in this file.\n"));
8194
8195   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8196     {
8197       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8198         {
8199           unsigned long num_unwind = sec->sh_size / 16;
8200
8201           printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
8202                             "contains %lu entry:\n",
8203                             "\nUnwind section '%s' at offset 0x%lx "
8204                             "contains %lu entries:\n",
8205                             num_unwind),
8206                   printable_section_name (filedata, sec),
8207                   (unsigned long) sec->sh_offset,
8208                   num_unwind);
8209
8210           if (! slurp_hppa_unwind_table (filedata, &aux, sec))
8211             res = FALSE;
8212
8213           if (res && aux.table_len > 0)
8214             {
8215               if (! dump_hppa_unwind (filedata, &aux))
8216                 res = FALSE;
8217             }
8218
8219           if (aux.table)
8220             free ((char *) aux.table);
8221           aux.table = NULL;
8222         }
8223     }
8224
8225   if (aux.symtab)
8226     free (aux.symtab);
8227   if (aux.strtab)
8228     free ((char *) aux.strtab);
8229
8230   return res;
8231 }
8232
8233 struct arm_section
8234 {
8235   unsigned char *      data;            /* The unwind data.  */
8236   Elf_Internal_Shdr *  sec;             /* The cached unwind section header.  */
8237   Elf_Internal_Rela *  rela;            /* The cached relocations for this section.  */
8238   unsigned long        nrelas;          /* The number of relocations.  */
8239   unsigned int         rel_type;        /* REL or RELA ?  */
8240   Elf_Internal_Rela *  next_rela;       /* Cyclic pointer to the next reloc to process.  */
8241 };
8242
8243 struct arm_unw_aux_info
8244 {
8245   Filedata *          filedata;         /* The file containing the unwind sections.  */
8246   Elf_Internal_Sym *  symtab;           /* The file's symbol table.  */
8247   unsigned long       nsyms;            /* Number of symbols.  */
8248   Elf_Internal_Sym *  funtab;           /* Sorted table of STT_FUNC symbols.  */
8249   unsigned long       nfuns;            /* Number of these symbols.  */
8250   char *              strtab;           /* The file's string table.  */
8251   unsigned long       strtab_size;      /* Size of string table.  */
8252 };
8253
8254 static const char *
8255 arm_print_vma_and_name (Filedata *                 filedata,
8256                         struct arm_unw_aux_info *  aux,
8257                         bfd_vma                    fn,
8258                         struct absaddr             addr)
8259 {
8260   const char *procname;
8261   bfd_vma sym_offset;
8262
8263   if (addr.section == SHN_UNDEF)
8264     addr.offset = fn;
8265
8266   find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
8267                            aux->strtab_size, addr, &procname,
8268                            &sym_offset);
8269
8270   print_vma (fn, PREFIX_HEX);
8271
8272   if (procname)
8273     {
8274       fputs (" <", stdout);
8275       fputs (procname, stdout);
8276
8277       if (sym_offset)
8278         printf ("+0x%lx", (unsigned long) sym_offset);
8279       fputc ('>', stdout);
8280     }
8281
8282   return procname;
8283 }
8284
8285 static void
8286 arm_free_section (struct arm_section *arm_sec)
8287 {
8288   if (arm_sec->data != NULL)
8289     free (arm_sec->data);
8290
8291   if (arm_sec->rela != NULL)
8292     free (arm_sec->rela);
8293 }
8294
8295 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
8296       cached section and install SEC instead.
8297    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
8298       and return its valued in * WORDP, relocating if necessary.
8299    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
8300       relocation's offset in ADDR.
8301    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
8302       into the string table of the symbol associated with the reloc.  If no
8303       reloc was applied store -1 there.
8304    5) Return TRUE upon success, FALSE otherwise.  */
8305
8306 static bfd_boolean
8307 get_unwind_section_word (Filedata *                 filedata,
8308                          struct arm_unw_aux_info *  aux,
8309                          struct arm_section *       arm_sec,
8310                          Elf_Internal_Shdr *        sec,
8311                          bfd_vma                    word_offset,
8312                          unsigned int *             wordp,
8313                          struct absaddr *           addr,
8314                          bfd_vma *                  sym_name)
8315 {
8316   Elf_Internal_Rela *rp;
8317   Elf_Internal_Sym *sym;
8318   const char * relname;
8319   unsigned int word;
8320   bfd_boolean wrapped;
8321
8322   if (sec == NULL || arm_sec == NULL)
8323     return FALSE;
8324
8325   addr->section = SHN_UNDEF;
8326   addr->offset = 0;
8327
8328   if (sym_name != NULL)
8329     *sym_name = (bfd_vma) -1;
8330
8331   /* If necessary, update the section cache.  */
8332   if (sec != arm_sec->sec)
8333     {
8334       Elf_Internal_Shdr *relsec;
8335
8336       arm_free_section (arm_sec);
8337
8338       arm_sec->sec = sec;
8339       arm_sec->data = get_data (NULL, aux->filedata, sec->sh_offset, 1,
8340                                 sec->sh_size, _("unwind data"));
8341       arm_sec->rela = NULL;
8342       arm_sec->nrelas = 0;
8343
8344       for (relsec = filedata->section_headers;
8345            relsec < filedata->section_headers + filedata->file_header.e_shnum;
8346            ++relsec)
8347         {
8348           if (relsec->sh_info >= filedata->file_header.e_shnum
8349               || filedata->section_headers + relsec->sh_info != sec
8350               /* PR 15745: Check the section type as well.  */
8351               || (relsec->sh_type != SHT_REL
8352                   && relsec->sh_type != SHT_RELA))
8353             continue;
8354
8355           arm_sec->rel_type = relsec->sh_type;
8356           if (relsec->sh_type == SHT_REL)
8357             {
8358               if (!slurp_rel_relocs (aux->filedata, relsec->sh_offset,
8359                                      relsec->sh_size,
8360                                      & arm_sec->rela, & arm_sec->nrelas))
8361                 return FALSE;
8362             }
8363           else /* relsec->sh_type == SHT_RELA */
8364             {
8365               if (!slurp_rela_relocs (aux->filedata, relsec->sh_offset,
8366                                       relsec->sh_size,
8367                                       & arm_sec->rela, & arm_sec->nrelas))
8368                 return FALSE;
8369             }
8370           break;
8371         }
8372
8373       arm_sec->next_rela = arm_sec->rela;
8374     }
8375
8376   /* If there is no unwind data we can do nothing.  */
8377   if (arm_sec->data == NULL)
8378     return FALSE;
8379
8380   /* If the offset is invalid then fail.  */
8381   if (/* PR 21343 *//* PR 18879 */
8382       sec->sh_size < 4
8383       || word_offset > (sec->sh_size - 4)
8384       || ((bfd_signed_vma) word_offset) < 0)
8385     return FALSE;
8386
8387   /* Get the word at the required offset.  */
8388   word = byte_get (arm_sec->data + word_offset, 4);
8389
8390   /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128.  */
8391   if (arm_sec->rela == NULL)
8392     {
8393       * wordp = word;
8394       return TRUE;
8395     }
8396
8397   /* Look through the relocs to find the one that applies to the provided offset.  */
8398   wrapped = FALSE;
8399   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
8400     {
8401       bfd_vma prelval, offset;
8402
8403       if (rp->r_offset > word_offset && !wrapped)
8404         {
8405           rp = arm_sec->rela;
8406           wrapped = TRUE;
8407         }
8408       if (rp->r_offset > word_offset)
8409         break;
8410
8411       if (rp->r_offset & 3)
8412         {
8413           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8414                 (unsigned long) rp->r_offset);
8415           continue;
8416         }
8417
8418       if (rp->r_offset < word_offset)
8419         continue;
8420
8421       /* PR 17531: file: 027-161405-0.004  */
8422       if (aux->symtab == NULL)
8423         continue;
8424
8425       if (arm_sec->rel_type == SHT_REL)
8426         {
8427           offset = word & 0x7fffffff;
8428           if (offset & 0x40000000)
8429             offset |= ~ (bfd_vma) 0x7fffffff;
8430         }
8431       else if (arm_sec->rel_type == SHT_RELA)
8432         offset = rp->r_addend;
8433       else
8434         {
8435           error (_("Unknown section relocation type %d encountered\n"),
8436                  arm_sec->rel_type);
8437           break;
8438         }
8439
8440       /* PR 17531 file: 027-1241568-0.004.  */
8441       if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8442         {
8443           error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8444                  (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8445           break;
8446         }
8447
8448       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
8449       offset += sym->st_value;
8450       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8451
8452       /* Check that we are processing the expected reloc type.  */
8453       if (filedata->file_header.e_machine == EM_ARM)
8454         {
8455           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
8456           if (relname == NULL)
8457             {
8458               warn (_("Skipping unknown ARM relocation type: %d\n"),
8459                     (int) ELF32_R_TYPE (rp->r_info));
8460               continue;
8461             }
8462
8463           if (streq (relname, "R_ARM_NONE"))
8464               continue;
8465
8466           if (! streq (relname, "R_ARM_PREL31"))
8467             {
8468               warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
8469               continue;
8470             }
8471         }
8472       else if (filedata->file_header.e_machine == EM_TI_C6000)
8473         {
8474           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
8475           if (relname == NULL)
8476             {
8477               warn (_("Skipping unknown C6000 relocation type: %d\n"),
8478                     (int) ELF32_R_TYPE (rp->r_info));
8479               continue;
8480             }
8481
8482           if (streq (relname, "R_C6000_NONE"))
8483             continue;
8484
8485           if (! streq (relname, "R_C6000_PREL31"))
8486             {
8487               warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
8488               continue;
8489             }
8490
8491           prelval >>= 1;
8492         }
8493       else
8494         {
8495           /* This function currently only supports ARM and TI unwinders.  */
8496           warn (_("Only TI and ARM unwinders are currently supported\n"));
8497           break;
8498         }
8499
8500       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8501       addr->section = sym->st_shndx;
8502       addr->offset = offset;
8503
8504       if (sym_name)
8505         * sym_name = sym->st_name;
8506       break;
8507     }
8508
8509   *wordp = word;
8510   arm_sec->next_rela = rp;
8511
8512   return TRUE;
8513 }
8514
8515 static const char *tic6x_unwind_regnames[16] =
8516 {
8517   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8518   "A14", "A13", "A12", "A11", "A10",
8519   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8520 };
8521
8522 static void
8523 decode_tic6x_unwind_regmask (unsigned int mask)
8524 {
8525   int i;
8526
8527   for (i = 12; mask; mask >>= 1, i--)
8528     {
8529       if (mask & 1)
8530         {
8531           fputs (tic6x_unwind_regnames[i], stdout);
8532           if (mask > 1)
8533             fputs (", ", stdout);
8534         }
8535     }
8536 }
8537
8538 #define ADVANCE                                                 \
8539   if (remaining == 0 && more_words)                             \
8540     {                                                           \
8541       data_offset += 4;                                         \
8542       if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec,     \
8543                                      data_offset, & word, & addr, NULL))        \
8544         return FALSE;                                           \
8545       remaining = 4;                                            \
8546       more_words--;                                             \
8547     }                                                           \
8548
8549 #define GET_OP(OP)                      \
8550   ADVANCE;                              \
8551   if (remaining)                        \
8552     {                                   \
8553       remaining--;                      \
8554       (OP) = word >> 24;                \
8555       word <<= 8;                       \
8556     }                                   \
8557   else                                  \
8558     {                                   \
8559       printf (_("[Truncated opcode]\n"));       \
8560       return FALSE;                     \
8561     }                                   \
8562   printf ("0x%02x ", OP)
8563
8564 static bfd_boolean
8565 decode_arm_unwind_bytecode (Filedata *                 filedata,
8566                             struct arm_unw_aux_info *  aux,
8567                             unsigned int               word,
8568                             unsigned int               remaining,
8569                             unsigned int               more_words,
8570                             bfd_vma                    data_offset,
8571                             Elf_Internal_Shdr *        data_sec,
8572                             struct arm_section *       data_arm_sec)
8573 {
8574   struct absaddr addr;
8575   bfd_boolean res = TRUE;
8576
8577   /* Decode the unwinding instructions.  */
8578   while (1)
8579     {
8580       unsigned int op, op2;
8581
8582       ADVANCE;
8583       if (remaining == 0)
8584         break;
8585       remaining--;
8586       op = word >> 24;
8587       word <<= 8;
8588
8589       printf ("  0x%02x ", op);
8590
8591       if ((op & 0xc0) == 0x00)
8592         {
8593           int offset = ((op & 0x3f) << 2) + 4;
8594
8595           printf ("     vsp = vsp + %d", offset);
8596         }
8597       else if ((op & 0xc0) == 0x40)
8598         {
8599           int offset = ((op & 0x3f) << 2) + 4;
8600
8601           printf ("     vsp = vsp - %d", offset);
8602         }
8603       else if ((op & 0xf0) == 0x80)
8604         {
8605           GET_OP (op2);
8606           if (op == 0x80 && op2 == 0)
8607             printf (_("Refuse to unwind"));
8608           else
8609             {
8610               unsigned int mask = ((op & 0x0f) << 8) | op2;
8611               bfd_boolean first = TRUE;
8612               int i;
8613
8614               printf ("pop {");
8615               for (i = 0; i < 12; i++)
8616                 if (mask & (1 << i))
8617                   {
8618                     if (first)
8619                       first = FALSE;
8620                     else
8621                       printf (", ");
8622                     printf ("r%d", 4 + i);
8623                   }
8624               printf ("}");
8625             }
8626         }
8627       else if ((op & 0xf0) == 0x90)
8628         {
8629           if (op == 0x9d || op == 0x9f)
8630             printf (_("     [Reserved]"));
8631           else
8632             printf ("     vsp = r%d", op & 0x0f);
8633         }
8634       else if ((op & 0xf0) == 0xa0)
8635         {
8636           int end = 4 + (op & 0x07);
8637           bfd_boolean first = TRUE;
8638           int i;
8639
8640           printf ("     pop {");
8641           for (i = 4; i <= end; i++)
8642             {
8643               if (first)
8644                 first = FALSE;
8645               else
8646                 printf (", ");
8647               printf ("r%d", i);
8648             }
8649           if (op & 0x08)
8650             {
8651               if (!first)
8652                 printf (", ");
8653               printf ("r14");
8654             }
8655           printf ("}");
8656         }
8657       else if (op == 0xb0)
8658         printf (_("     finish"));
8659       else if (op == 0xb1)
8660         {
8661           GET_OP (op2);
8662           if (op2 == 0 || (op2 & 0xf0) != 0)
8663             printf (_("[Spare]"));
8664           else
8665             {
8666               unsigned int mask = op2 & 0x0f;
8667               bfd_boolean first = TRUE;
8668               int i;
8669
8670               printf ("pop {");
8671               for (i = 0; i < 12; i++)
8672                 if (mask & (1 << i))
8673                   {
8674                     if (first)
8675                       first = FALSE;
8676                     else
8677                       printf (", ");
8678                     printf ("r%d", i);
8679                   }
8680               printf ("}");
8681             }
8682         }
8683       else if (op == 0xb2)
8684         {
8685           unsigned char buf[9];
8686           unsigned int i, len;
8687           unsigned long offset;
8688
8689           for (i = 0; i < sizeof (buf); i++)
8690             {
8691               GET_OP (buf[i]);
8692               if ((buf[i] & 0x80) == 0)
8693                 break;
8694             }
8695           if (i == sizeof (buf))
8696             {
8697               error (_("corrupt change to vsp"));
8698               res = FALSE;
8699             }
8700           else
8701             {
8702               offset = read_uleb128 (buf, &len, buf + i + 1);
8703               assert (len == i + 1);
8704               offset = offset * 4 + 0x204;
8705               printf ("vsp = vsp + %ld", offset);
8706             }
8707         }
8708       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8709         {
8710           unsigned int first, last;
8711
8712           GET_OP (op2);
8713           first = op2 >> 4;
8714           last = op2 & 0x0f;
8715           if (op == 0xc8)
8716             first = first + 16;
8717           printf ("pop {D%d", first);
8718           if (last)
8719             printf ("-D%d", first + last);
8720           printf ("}");
8721         }
8722       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8723         {
8724           unsigned int count = op & 0x07;
8725
8726           printf ("pop {D8");
8727           if (count)
8728             printf ("-D%d", 8 + count);
8729           printf ("}");
8730         }
8731       else if (op >= 0xc0 && op <= 0xc5)
8732         {
8733           unsigned int count = op & 0x07;
8734
8735           printf ("     pop {wR10");
8736           if (count)
8737             printf ("-wR%d", 10 + count);
8738           printf ("}");
8739         }
8740       else if (op == 0xc6)
8741         {
8742           unsigned int first, last;
8743
8744           GET_OP (op2);
8745           first = op2 >> 4;
8746           last = op2 & 0x0f;
8747           printf ("pop {wR%d", first);
8748           if (last)
8749             printf ("-wR%d", first + last);
8750           printf ("}");
8751         }
8752       else if (op == 0xc7)
8753         {
8754           GET_OP (op2);
8755           if (op2 == 0 || (op2 & 0xf0) != 0)
8756             printf (_("[Spare]"));
8757           else
8758             {
8759               unsigned int mask = op2 & 0x0f;
8760               bfd_boolean first = TRUE;
8761               int i;
8762
8763               printf ("pop {");
8764               for (i = 0; i < 4; i++)
8765                 if (mask & (1 << i))
8766                   {
8767                     if (first)
8768                       first = FALSE;
8769                     else
8770                       printf (", ");
8771                     printf ("wCGR%d", i);
8772                   }
8773               printf ("}");
8774             }
8775         }
8776       else
8777         {
8778           printf (_("     [unsupported opcode]"));
8779           res = FALSE;
8780         }
8781
8782       printf ("\n");
8783     }
8784
8785   return res;
8786 }
8787
8788 static bfd_boolean
8789 decode_tic6x_unwind_bytecode (Filedata *                 filedata,
8790                               struct arm_unw_aux_info *  aux,
8791                               unsigned int               word,
8792                               unsigned int               remaining,
8793                               unsigned int               more_words,
8794                               bfd_vma                    data_offset,
8795                               Elf_Internal_Shdr *        data_sec,
8796                               struct arm_section *       data_arm_sec)
8797 {
8798   struct absaddr addr;
8799
8800   /* Decode the unwinding instructions.  */
8801   while (1)
8802     {
8803       unsigned int op, op2;
8804
8805       ADVANCE;
8806       if (remaining == 0)
8807         break;
8808       remaining--;
8809       op = word >> 24;
8810       word <<= 8;
8811
8812       printf ("  0x%02x ", op);
8813
8814       if ((op & 0xc0) == 0x00)
8815         {
8816           int offset = ((op & 0x3f) << 3) + 8;
8817           printf ("     sp = sp + %d", offset);
8818         }
8819       else if ((op & 0xc0) == 0x80)
8820         {
8821           GET_OP (op2);
8822           if (op == 0x80 && op2 == 0)
8823             printf (_("Refuse to unwind"));
8824           else
8825             {
8826               unsigned int mask = ((op & 0x1f) << 8) | op2;
8827               if (op & 0x20)
8828                 printf ("pop compact {");
8829               else
8830                 printf ("pop {");
8831
8832               decode_tic6x_unwind_regmask (mask);
8833               printf("}");
8834             }
8835         }
8836       else if ((op & 0xf0) == 0xc0)
8837         {
8838           unsigned int reg;
8839           unsigned int nregs;
8840           unsigned int i;
8841           const char *name;
8842           struct
8843           {
8844             unsigned int offset;
8845             unsigned int reg;
8846           } regpos[16];
8847
8848           /* Scan entire instruction first so that GET_OP output is not
8849              interleaved with disassembly.  */
8850           nregs = 0;
8851           for (i = 0; nregs < (op & 0xf); i++)
8852             {
8853               GET_OP (op2);
8854               reg = op2 >> 4;
8855               if (reg != 0xf)
8856                 {
8857                   regpos[nregs].offset = i * 2;
8858                   regpos[nregs].reg = reg;
8859                   nregs++;
8860                 }
8861
8862               reg = op2 & 0xf;
8863               if (reg != 0xf)
8864                 {
8865                   regpos[nregs].offset = i * 2 + 1;
8866                   regpos[nregs].reg = reg;
8867                   nregs++;
8868                 }
8869             }
8870
8871           printf (_("pop frame {"));
8872           if (nregs == 0)
8873             {
8874               printf (_("*corrupt* - no registers specified"));
8875             }
8876           else
8877             {
8878               reg = nregs - 1;
8879               for (i = i * 2; i > 0; i--)
8880                 {
8881                   if (regpos[reg].offset == i - 1)
8882                     {
8883                       name = tic6x_unwind_regnames[regpos[reg].reg];
8884                       if (reg > 0)
8885                         reg--;
8886                     }
8887                   else
8888                     name = _("[pad]");
8889
8890                   fputs (name, stdout);
8891                   if (i > 1)
8892                     printf (", ");
8893                 }
8894             }
8895
8896           printf ("}");
8897         }
8898       else if (op == 0xd0)
8899         printf ("     MOV FP, SP");
8900       else if (op == 0xd1)
8901         printf ("     __c6xabi_pop_rts");
8902       else if (op == 0xd2)
8903         {
8904           unsigned char buf[9];
8905           unsigned int i, len;
8906           unsigned long offset;
8907
8908           for (i = 0; i < sizeof (buf); i++)
8909             {
8910               GET_OP (buf[i]);
8911               if ((buf[i] & 0x80) == 0)
8912                 break;
8913             }
8914           /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2.  */
8915           if (i == sizeof (buf))
8916             {
8917               warn (_("Corrupt stack pointer adjustment detected\n"));
8918               return FALSE;
8919             }
8920
8921           offset = read_uleb128 (buf, &len, buf + i + 1);
8922           assert (len == i + 1);
8923           offset = offset * 8 + 0x408;
8924           printf (_("sp = sp + %ld"), offset);
8925         }
8926       else if ((op & 0xf0) == 0xe0)
8927         {
8928           if ((op & 0x0f) == 7)
8929             printf ("     RETURN");
8930           else
8931             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8932         }
8933       else
8934         {
8935           printf (_("     [unsupported opcode]"));
8936         }
8937       putchar ('\n');
8938     }
8939
8940   return TRUE;
8941 }
8942
8943 static bfd_vma
8944 arm_expand_prel31 (Filedata * filedata, bfd_vma word, bfd_vma where)
8945 {
8946   bfd_vma offset;
8947
8948   offset = word & 0x7fffffff;
8949   if (offset & 0x40000000)
8950     offset |= ~ (bfd_vma) 0x7fffffff;
8951
8952   if (filedata->file_header.e_machine == EM_TI_C6000)
8953     offset <<= 1;
8954
8955   return offset + where;
8956 }
8957
8958 static bfd_boolean
8959 decode_arm_unwind (Filedata *                 filedata,
8960                    struct arm_unw_aux_info *  aux,
8961                    unsigned int               word,
8962                    unsigned int               remaining,
8963                    bfd_vma                    data_offset,
8964                    Elf_Internal_Shdr *        data_sec,
8965                    struct arm_section *       data_arm_sec)
8966 {
8967   int per_index;
8968   unsigned int more_words = 0;
8969   struct absaddr addr;
8970   bfd_vma sym_name = (bfd_vma) -1;
8971   bfd_boolean res = TRUE;
8972
8973   if (remaining == 0)
8974     {
8975       /* Fetch the first word.
8976          Note - when decoding an object file the address extracted
8977          here will always be 0.  So we also pass in the sym_name
8978          parameter so that we can find the symbol associated with
8979          the personality routine.  */
8980       if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, data_offset,
8981                                      & word, & addr, & sym_name))
8982         return FALSE;
8983
8984       remaining = 4;
8985     }
8986
8987   if ((word & 0x80000000) == 0)
8988     {
8989       /* Expand prel31 for personality routine.  */
8990       bfd_vma fn;
8991       const char *procname;
8992
8993       fn = arm_expand_prel31 (filedata, word, data_sec->sh_addr + data_offset);
8994       printf (_("  Personality routine: "));
8995       if (fn == 0
8996           && addr.section == SHN_UNDEF && addr.offset == 0
8997           && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8998         {
8999           procname = aux->strtab + sym_name;
9000           print_vma (fn, PREFIX_HEX);
9001           if (procname)
9002             {
9003               fputs (" <", stdout);
9004               fputs (procname, stdout);
9005               fputc ('>', stdout);
9006             }
9007         }
9008       else
9009         procname = arm_print_vma_and_name (filedata, aux, fn, addr);
9010       fputc ('\n', stdout);
9011
9012       /* The GCC personality routines use the standard compact
9013          encoding, starting with one byte giving the number of
9014          words.  */
9015       if (procname != NULL
9016           && (const_strneq (procname, "__gcc_personality_v0")
9017               || const_strneq (procname, "__gxx_personality_v0")
9018               || const_strneq (procname, "__gcj_personality_v0")
9019               || const_strneq (procname, "__gnu_objc_personality_v0")))
9020         {
9021           remaining = 0;
9022           more_words = 1;
9023           ADVANCE;
9024           if (!remaining)
9025             {
9026               printf (_("  [Truncated data]\n"));
9027               return FALSE;
9028             }
9029           more_words = word >> 24;
9030           word <<= 8;
9031           remaining--;
9032           per_index = -1;
9033         }
9034       else
9035         return TRUE;
9036     }
9037   else
9038     {
9039       /* ARM EHABI Section 6.3:
9040
9041          An exception-handling table entry for the compact model looks like:
9042
9043            31 30-28 27-24 23-0
9044            -- ----- ----- ----
9045             1   0   index Data for personalityRoutine[index]    */
9046
9047       if (filedata->file_header.e_machine == EM_ARM
9048           && (word & 0x70000000))
9049         {
9050           warn (_("Corrupt ARM compact model table entry: %x \n"), word);
9051           res = FALSE;
9052         }
9053
9054       per_index = (word >> 24) & 0x7f;
9055       printf (_("  Compact model index: %d\n"), per_index);
9056       if (per_index == 0)
9057         {
9058           more_words = 0;
9059           word <<= 8;
9060           remaining--;
9061         }
9062       else if (per_index < 3)
9063         {
9064           more_words = (word >> 16) & 0xff;
9065           word <<= 16;
9066           remaining -= 2;
9067         }
9068     }
9069
9070   switch (filedata->file_header.e_machine)
9071     {
9072     case EM_ARM:
9073       if (per_index < 3)
9074         {
9075           if (! decode_arm_unwind_bytecode (filedata, aux, word, remaining, more_words,
9076                                             data_offset, data_sec, data_arm_sec))
9077             res = FALSE;
9078         }
9079       else
9080         {
9081           warn (_("Unknown ARM compact model index encountered\n"));
9082           printf (_("  [reserved]\n"));
9083           res = FALSE;
9084         }
9085       break;
9086
9087     case EM_TI_C6000:
9088       if (per_index < 3)
9089         {
9090           if (! decode_tic6x_unwind_bytecode (filedata, aux, word, remaining, more_words,
9091                                               data_offset, data_sec, data_arm_sec))
9092             res = FALSE;
9093         }
9094       else if (per_index < 5)
9095         {
9096           if (((word >> 17) & 0x7f) == 0x7f)
9097             printf (_("  Restore stack from frame pointer\n"));
9098           else
9099             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
9100           printf (_("  Registers restored: "));
9101           if (per_index == 4)
9102             printf (" (compact) ");
9103           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
9104           putchar ('\n');
9105           printf (_("  Return register: %s\n"),
9106                   tic6x_unwind_regnames[word & 0xf]);
9107         }
9108       else
9109         printf (_("  [reserved (%d)]\n"), per_index);
9110       break;
9111
9112     default:
9113       error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
9114              filedata->file_header.e_machine);
9115       res = FALSE;
9116     }
9117
9118   /* Decode the descriptors.  Not implemented.  */
9119
9120   return res;
9121 }
9122
9123 static bfd_boolean
9124 dump_arm_unwind (Filedata *                 filedata,
9125                  struct arm_unw_aux_info *  aux,
9126                  Elf_Internal_Shdr *        exidx_sec)
9127 {
9128   struct arm_section exidx_arm_sec, extab_arm_sec;
9129   unsigned int i, exidx_len;
9130   unsigned long j, nfuns;
9131   bfd_boolean res = TRUE;
9132
9133   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
9134   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
9135   exidx_len = exidx_sec->sh_size / 8;
9136
9137   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
9138   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
9139     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
9140       aux->funtab[nfuns++] = aux->symtab[j];
9141   aux->nfuns = nfuns;
9142   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
9143
9144   for (i = 0; i < exidx_len; i++)
9145     {
9146       unsigned int exidx_fn, exidx_entry;
9147       struct absaddr fn_addr, entry_addr;
9148       bfd_vma fn;
9149
9150       fputc ('\n', stdout);
9151
9152       if (! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9153                                      8 * i, & exidx_fn, & fn_addr, NULL)
9154           || ! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9155                                         8 * i + 4, & exidx_entry, & entry_addr, NULL))
9156         {
9157           free (aux->funtab);
9158           arm_free_section (& exidx_arm_sec);
9159           arm_free_section (& extab_arm_sec);
9160           return FALSE;
9161         }
9162
9163       /* ARM EHABI, Section 5:
9164          An index table entry consists of 2 words.
9165          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
9166       if (exidx_fn & 0x80000000)
9167         {
9168           warn (_("corrupt index table entry: %x\n"), exidx_fn);
9169           res = FALSE;
9170         }
9171
9172       fn = arm_expand_prel31 (filedata, exidx_fn, exidx_sec->sh_addr + 8 * i);
9173
9174       arm_print_vma_and_name (filedata, aux, fn, fn_addr);
9175       fputs (": ", stdout);
9176
9177       if (exidx_entry == 1)
9178         {
9179           print_vma (exidx_entry, PREFIX_HEX);
9180           fputs (" [cantunwind]\n", stdout);
9181         }
9182       else if (exidx_entry & 0x80000000)
9183         {
9184           print_vma (exidx_entry, PREFIX_HEX);
9185           fputc ('\n', stdout);
9186           decode_arm_unwind (filedata, aux, exidx_entry, 4, 0, NULL, NULL);
9187         }
9188       else
9189         {
9190           bfd_vma table, table_offset = 0;
9191           Elf_Internal_Shdr *table_sec;
9192
9193           fputs ("@", stdout);
9194           table = arm_expand_prel31 (filedata, exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
9195           print_vma (table, PREFIX_HEX);
9196           printf ("\n");
9197
9198           /* Locate the matching .ARM.extab.  */
9199           if (entry_addr.section != SHN_UNDEF
9200               && entry_addr.section < filedata->file_header.e_shnum)
9201             {
9202               table_sec = filedata->section_headers + entry_addr.section;
9203               table_offset = entry_addr.offset;
9204               /* PR 18879 */
9205               if (table_offset > table_sec->sh_size
9206                   || ((bfd_signed_vma) table_offset) < 0)
9207                 {
9208                   warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
9209                         (unsigned long) table_offset,
9210                         printable_section_name (filedata, table_sec));
9211                   res = FALSE;
9212                   continue;
9213                 }
9214             }
9215           else
9216             {
9217               table_sec = find_section_by_address (filedata, table);
9218               if (table_sec != NULL)
9219                 table_offset = table - table_sec->sh_addr;
9220             }
9221
9222           if (table_sec == NULL)
9223             {
9224               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
9225                     (unsigned long) table);
9226               res = FALSE;
9227               continue;
9228             }
9229
9230           if (! decode_arm_unwind (filedata, aux, 0, 0, table_offset, table_sec,
9231                                    &extab_arm_sec))
9232             res = FALSE;
9233         }
9234     }
9235
9236   printf ("\n");
9237
9238   free (aux->funtab);
9239   arm_free_section (&exidx_arm_sec);
9240   arm_free_section (&extab_arm_sec);
9241
9242   return res;
9243 }
9244
9245 /* Used for both ARM and C6X unwinding tables.  */
9246
9247 static bfd_boolean
9248 arm_process_unwind (Filedata * filedata)
9249 {
9250   struct arm_unw_aux_info aux;
9251   Elf_Internal_Shdr *unwsec = NULL;
9252   Elf_Internal_Shdr *strsec;
9253   Elf_Internal_Shdr *sec;
9254   unsigned long i;
9255   unsigned int sec_type;
9256   bfd_boolean res = TRUE;
9257
9258   switch (filedata->file_header.e_machine)
9259     {
9260     case EM_ARM:
9261       sec_type = SHT_ARM_EXIDX;
9262       break;
9263
9264     case EM_TI_C6000:
9265       sec_type = SHT_C6000_UNWIND;
9266       break;
9267
9268     default:
9269       error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
9270              filedata->file_header.e_machine);
9271       return FALSE;
9272     }
9273
9274   if (filedata->string_table == NULL)
9275     return FALSE;
9276
9277   memset (& aux, 0, sizeof (aux));
9278   aux.filedata = filedata;
9279
9280   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9281     {
9282       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < filedata->file_header.e_shnum)
9283         {
9284           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
9285
9286           strsec = filedata->section_headers + sec->sh_link;
9287
9288           /* PR binutils/17531 file: 011-12666-0.004.  */
9289           if (aux.strtab != NULL)
9290             {
9291               error (_("Multiple string tables found in file.\n"));
9292               free (aux.strtab);
9293               res = FALSE;
9294             }
9295           aux.strtab = get_data (NULL, filedata, strsec->sh_offset,
9296                                  1, strsec->sh_size, _("string table"));
9297           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
9298         }
9299       else if (sec->sh_type == sec_type)
9300         unwsec = sec;
9301     }
9302
9303   if (unwsec == NULL)
9304     printf (_("\nThere are no unwind sections in this file.\n"));
9305   else
9306     for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9307       {
9308         if (sec->sh_type == sec_type)
9309           {
9310             unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size);
9311             printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
9312                               "contains %lu entry:\n",
9313                               "\nUnwind section '%s' at offset 0x%lx "
9314                               "contains %lu entries:\n",
9315                               num_unwind),
9316                     printable_section_name (filedata, sec),
9317                     (unsigned long) sec->sh_offset,
9318                     num_unwind);
9319
9320             if (! dump_arm_unwind (filedata, &aux, sec))
9321               res = FALSE;
9322           }
9323       }
9324
9325   if (aux.symtab)
9326     free (aux.symtab);
9327   if (aux.strtab)
9328     free ((char *) aux.strtab);
9329
9330   return res;
9331 }
9332
9333 static bfd_boolean
9334 process_unwind (Filedata * filedata)
9335 {
9336   struct unwind_handler
9337   {
9338     unsigned int machtype;
9339     bfd_boolean (* handler)(Filedata *);
9340   } handlers[] =
9341   {
9342     { EM_ARM, arm_process_unwind },
9343     { EM_IA_64, ia64_process_unwind },
9344     { EM_PARISC, hppa_process_unwind },
9345     { EM_TI_C6000, arm_process_unwind },
9346     { 0, NULL }
9347   };
9348   int i;
9349
9350   if (!do_unwind)
9351     return TRUE;
9352
9353   for (i = 0; handlers[i].handler != NULL; i++)
9354     if (filedata->file_header.e_machine == handlers[i].machtype)
9355       return handlers[i].handler (filedata);
9356
9357   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
9358           get_machine_name (filedata->file_header.e_machine));
9359   return TRUE;
9360 }
9361
9362 static void
9363 dynamic_section_aarch64_val (Elf_Internal_Dyn * entry)
9364 {
9365   switch (entry->d_tag)
9366     {
9367     case DT_AARCH64_BTI_PLT:
9368     case DT_AARCH64_PAC_PLT:
9369       break;
9370     default:
9371       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9372       break;
9373     }
9374   putchar ('\n');
9375 }
9376
9377 static void
9378 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
9379 {
9380   switch (entry->d_tag)
9381     {
9382     case DT_MIPS_FLAGS:
9383       if (entry->d_un.d_val == 0)
9384         printf (_("NONE"));
9385       else
9386         {
9387           static const char * opts[] =
9388           {
9389             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
9390             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
9391             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
9392             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
9393             "RLD_ORDER_SAFE"
9394           };
9395           unsigned int cnt;
9396           bfd_boolean first = TRUE;
9397
9398           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
9399             if (entry->d_un.d_val & (1 << cnt))
9400               {
9401                 printf ("%s%s", first ? "" : " ", opts[cnt]);
9402                 first = FALSE;
9403               }
9404         }
9405       break;
9406
9407     case DT_MIPS_IVERSION:
9408       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9409         printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
9410       else
9411         {
9412           char buf[40];
9413           sprintf_vma (buf, entry->d_un.d_ptr);
9414           /* Note: coded this way so that there is a single string for translation.  */
9415           printf (_("<corrupt: %s>"), buf);
9416         }
9417       break;
9418
9419     case DT_MIPS_TIME_STAMP:
9420       {
9421         char timebuf[128];
9422         struct tm * tmp;
9423         time_t atime = entry->d_un.d_val;
9424
9425         tmp = gmtime (&atime);
9426         /* PR 17531: file: 6accc532.  */
9427         if (tmp == NULL)
9428           snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
9429         else
9430           snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
9431                     tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9432                     tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9433         printf (_("Time Stamp: %s"), timebuf);
9434       }
9435       break;
9436
9437     case DT_MIPS_RLD_VERSION:
9438     case DT_MIPS_LOCAL_GOTNO:
9439     case DT_MIPS_CONFLICTNO:
9440     case DT_MIPS_LIBLISTNO:
9441     case DT_MIPS_SYMTABNO:
9442     case DT_MIPS_UNREFEXTNO:
9443     case DT_MIPS_HIPAGENO:
9444     case DT_MIPS_DELTA_CLASS_NO:
9445     case DT_MIPS_DELTA_INSTANCE_NO:
9446     case DT_MIPS_DELTA_RELOC_NO:
9447     case DT_MIPS_DELTA_SYM_NO:
9448     case DT_MIPS_DELTA_CLASSSYM_NO:
9449     case DT_MIPS_COMPACT_SIZE:
9450       print_vma (entry->d_un.d_val, DEC);
9451       break;
9452
9453     default:
9454       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9455     }
9456     putchar ('\n');
9457 }
9458
9459 static void
9460 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
9461 {
9462   switch (entry->d_tag)
9463     {
9464     case DT_HP_DLD_FLAGS:
9465       {
9466         static struct
9467         {
9468           long int bit;
9469           const char * str;
9470         }
9471         flags[] =
9472         {
9473           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
9474           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
9475           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
9476           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
9477           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
9478           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
9479           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9480           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9481           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9482           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
9483           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9484           { DT_HP_GST, "HP_GST" },
9485           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9486           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9487           { DT_HP_NODELETE, "HP_NODELETE" },
9488           { DT_HP_GROUP, "HP_GROUP" },
9489           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
9490         };
9491         bfd_boolean first = TRUE;
9492         size_t cnt;
9493         bfd_vma val = entry->d_un.d_val;
9494
9495         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
9496           if (val & flags[cnt].bit)
9497             {
9498               if (! first)
9499                 putchar (' ');
9500               fputs (flags[cnt].str, stdout);
9501               first = FALSE;
9502               val ^= flags[cnt].bit;
9503             }
9504
9505         if (val != 0 || first)
9506           {
9507             if (! first)
9508               putchar (' ');
9509             print_vma (val, HEX);
9510           }
9511       }
9512       break;
9513
9514     default:
9515       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9516       break;
9517     }
9518   putchar ('\n');
9519 }
9520
9521 #ifdef BFD64
9522
9523 /* VMS vs Unix time offset and factor.  */
9524
9525 #define VMS_EPOCH_OFFSET 35067168000000000LL
9526 #define VMS_GRANULARITY_FACTOR 10000000
9527
9528 /* Display a VMS time in a human readable format.  */
9529
9530 static void
9531 print_vms_time (bfd_int64_t vmstime)
9532 {
9533   struct tm *tm;
9534   time_t unxtime;
9535
9536   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9537   tm = gmtime (&unxtime);
9538   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9539           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9540           tm->tm_hour, tm->tm_min, tm->tm_sec);
9541 }
9542 #endif /* BFD64 */
9543
9544 static void
9545 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
9546 {
9547   switch (entry->d_tag)
9548     {
9549     case DT_IA_64_PLT_RESERVE:
9550       /* First 3 slots reserved.  */
9551       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9552       printf (" -- ");
9553       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
9554       break;
9555
9556     case DT_IA_64_VMS_LINKTIME:
9557 #ifdef BFD64
9558       print_vms_time (entry->d_un.d_val);
9559 #endif
9560       break;
9561
9562     case DT_IA_64_VMS_LNKFLAGS:
9563       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9564       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9565         printf (" CALL_DEBUG");
9566       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9567         printf (" NOP0BUFS");
9568       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9569         printf (" P0IMAGE");
9570       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9571         printf (" MKTHREADS");
9572       if (entry->d_un.d_val & VMS_LF_UPCALLS)
9573         printf (" UPCALLS");
9574       if (entry->d_un.d_val & VMS_LF_IMGSTA)
9575         printf (" IMGSTA");
9576       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9577         printf (" INITIALIZE");
9578       if (entry->d_un.d_val & VMS_LF_MAIN)
9579         printf (" MAIN");
9580       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9581         printf (" EXE_INIT");
9582       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9583         printf (" TBK_IN_IMG");
9584       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9585         printf (" DBG_IN_IMG");
9586       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9587         printf (" TBK_IN_DSF");
9588       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9589         printf (" DBG_IN_DSF");
9590       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9591         printf (" SIGNATURES");
9592       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9593         printf (" REL_SEG_OFF");
9594       break;
9595
9596     default:
9597       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9598       break;
9599     }
9600   putchar ('\n');
9601 }
9602
9603 static bfd_boolean
9604 get_32bit_dynamic_section (Filedata * filedata)
9605 {
9606   Elf32_External_Dyn * edyn;
9607   Elf32_External_Dyn * ext;
9608   Elf_Internal_Dyn * entry;
9609
9610   edyn = (Elf32_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9611                                           dynamic_size, _("dynamic section"));
9612   if (!edyn)
9613     return FALSE;
9614
9615   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9616      might not have the luxury of section headers.  Look for the DT_NULL
9617      terminator to determine the number of entries.  */
9618   for (ext = edyn, dynamic_nent = 0;
9619        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9620        ext++)
9621     {
9622       dynamic_nent++;
9623       if (BYTE_GET (ext->d_tag) == DT_NULL)
9624         break;
9625     }
9626
9627   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9628                                                   sizeof (* entry));
9629   if (dynamic_section == NULL)
9630     {
9631       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9632              (unsigned long) dynamic_nent);
9633       free (edyn);
9634       return FALSE;
9635     }
9636
9637   for (ext = edyn, entry = dynamic_section;
9638        entry < dynamic_section + dynamic_nent;
9639        ext++, entry++)
9640     {
9641       entry->d_tag      = BYTE_GET (ext->d_tag);
9642       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9643     }
9644
9645   free (edyn);
9646
9647   return TRUE;
9648 }
9649
9650 static bfd_boolean
9651 get_64bit_dynamic_section (Filedata * filedata)
9652 {
9653   Elf64_External_Dyn * edyn;
9654   Elf64_External_Dyn * ext;
9655   Elf_Internal_Dyn * entry;
9656
9657   /* Read in the data.  */
9658   edyn = (Elf64_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9659                                           dynamic_size, _("dynamic section"));
9660   if (!edyn)
9661     return FALSE;
9662
9663   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9664      might not have the luxury of section headers.  Look for the DT_NULL
9665      terminator to determine the number of entries.  */
9666   for (ext = edyn, dynamic_nent = 0;
9667        /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer.  */
9668        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9669        ext++)
9670     {
9671       dynamic_nent++;
9672       if (BYTE_GET (ext->d_tag) == DT_NULL)
9673         break;
9674     }
9675
9676   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9677                                                   sizeof (* entry));
9678   if (dynamic_section == NULL)
9679     {
9680       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9681              (unsigned long) dynamic_nent);
9682       free (edyn);
9683       return FALSE;
9684     }
9685
9686   /* Convert from external to internal formats.  */
9687   for (ext = edyn, entry = dynamic_section;
9688        entry < dynamic_section + dynamic_nent;
9689        ext++, entry++)
9690     {
9691       entry->d_tag      = BYTE_GET (ext->d_tag);
9692       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9693     }
9694
9695   free (edyn);
9696
9697   return TRUE;
9698 }
9699
9700 static void
9701 print_dynamic_flags (bfd_vma flags)
9702 {
9703   bfd_boolean first = TRUE;
9704
9705   while (flags)
9706     {
9707       bfd_vma flag;
9708
9709       flag = flags & - flags;
9710       flags &= ~ flag;
9711
9712       if (first)
9713         first = FALSE;
9714       else
9715         putc (' ', stdout);
9716
9717       switch (flag)
9718         {
9719         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
9720         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
9721         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
9722         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
9723         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
9724         default:                fputs (_("unknown"), stdout); break;
9725         }
9726     }
9727   puts ("");
9728 }
9729
9730 /* Parse and display the contents of the dynamic section.  */
9731
9732 static bfd_boolean
9733 process_dynamic_section (Filedata * filedata)
9734 {
9735   Elf_Internal_Dyn * entry;
9736
9737   if (dynamic_size == 0)
9738     {
9739       if (do_dynamic)
9740         printf (_("\nThere is no dynamic section in this file.\n"));
9741
9742       return TRUE;
9743     }
9744
9745   if (is_32bit_elf)
9746     {
9747       if (! get_32bit_dynamic_section (filedata))
9748         return FALSE;
9749     }
9750   else
9751     {
9752       if (! get_64bit_dynamic_section (filedata))
9753         return FALSE;
9754     }
9755
9756   /* Find the appropriate symbol table.  */
9757   if (dynamic_symbols == NULL)
9758     {
9759       for (entry = dynamic_section;
9760            entry < dynamic_section + dynamic_nent;
9761            ++entry)
9762         {
9763           Elf_Internal_Shdr section;
9764
9765           if (entry->d_tag != DT_SYMTAB)
9766             continue;
9767
9768           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9769
9770           /* Since we do not know how big the symbol table is,
9771              we default to reading in the entire file (!) and
9772              processing that.  This is overkill, I know, but it
9773              should work.  */
9774           section.sh_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9775           if ((bfd_size_type) section.sh_offset > filedata->file_size)
9776             {
9777               /* See PR 21379 for a reproducer.  */
9778               error (_("Invalid DT_SYMTAB entry: %lx"), (long) section.sh_offset);
9779               return FALSE;
9780             }
9781
9782           if (archive_file_offset != 0)
9783             section.sh_size = archive_file_size - section.sh_offset;
9784           else
9785             section.sh_size = filedata->file_size - section.sh_offset;
9786
9787           if (is_32bit_elf)
9788             section.sh_entsize = sizeof (Elf32_External_Sym);
9789           else
9790             section.sh_entsize = sizeof (Elf64_External_Sym);
9791           section.sh_name = filedata->string_table_length;
9792
9793           if (dynamic_symbols != NULL)
9794             {
9795               error (_("Multiple dynamic symbol table sections found\n"));
9796               free (dynamic_symbols);
9797             }
9798           dynamic_symbols = GET_ELF_SYMBOLS (filedata, &section, & num_dynamic_syms);
9799           if (num_dynamic_syms < 1)
9800             {
9801               error (_("Unable to determine the number of symbols to load\n"));
9802               continue;
9803             }
9804         }
9805     }
9806
9807   /* Similarly find a string table.  */
9808   if (dynamic_strings == NULL)
9809     {
9810       for (entry = dynamic_section;
9811            entry < dynamic_section + dynamic_nent;
9812            ++entry)
9813         {
9814           unsigned long offset;
9815           long str_tab_len;
9816
9817           if (entry->d_tag != DT_STRTAB)
9818             continue;
9819
9820           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9821
9822           /* Since we do not know how big the string table is,
9823              we default to reading in the entire file (!) and
9824              processing that.  This is overkill, I know, but it
9825              should work.  */
9826
9827           offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9828
9829           if (archive_file_offset != 0)
9830             str_tab_len = archive_file_size - offset;
9831           else
9832             str_tab_len = filedata->file_size - offset;
9833
9834           if (str_tab_len < 1)
9835             {
9836               error
9837                 (_("Unable to determine the length of the dynamic string table\n"));
9838               continue;
9839             }
9840
9841           if (dynamic_strings != NULL)
9842             {
9843               error (_("Multiple dynamic string tables found\n"));
9844               free (dynamic_strings);
9845             }
9846
9847           dynamic_strings = (char *) get_data (NULL, filedata, offset, 1,
9848                                                str_tab_len,
9849                                                _("dynamic string table"));
9850           dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9851         }
9852     }
9853
9854   /* And find the syminfo section if available.  */
9855   if (dynamic_syminfo == NULL)
9856     {
9857       unsigned long syminsz = 0;
9858
9859       for (entry = dynamic_section;
9860            entry < dynamic_section + dynamic_nent;
9861            ++entry)
9862         {
9863           if (entry->d_tag == DT_SYMINENT)
9864             {
9865               /* Note: these braces are necessary to avoid a syntax
9866                  error from the SunOS4 C compiler.  */
9867               /* PR binutils/17531: A corrupt file can trigger this test.
9868                  So do not use an assert, instead generate an error message.  */
9869               if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9870                 error (_("Bad value (%d) for SYMINENT entry\n"),
9871                        (int) entry->d_un.d_val);
9872             }
9873           else if (entry->d_tag == DT_SYMINSZ)
9874             syminsz = entry->d_un.d_val;
9875           else if (entry->d_tag == DT_SYMINFO)
9876             dynamic_syminfo_offset = offset_from_vma (filedata, entry->d_un.d_val,
9877                                                       syminsz);
9878         }
9879
9880       if (dynamic_syminfo_offset != 0 && syminsz != 0)
9881         {
9882           Elf_External_Syminfo * extsyminfo;
9883           Elf_External_Syminfo * extsym;
9884           Elf_Internal_Syminfo * syminfo;
9885
9886           /* There is a syminfo section.  Read the data.  */
9887           extsyminfo = (Elf_External_Syminfo *)
9888               get_data (NULL, filedata, dynamic_syminfo_offset, 1, syminsz,
9889                         _("symbol information"));
9890           if (!extsyminfo)
9891             return FALSE;
9892
9893           if (dynamic_syminfo != NULL)
9894             {
9895               error (_("Multiple dynamic symbol information sections found\n"));
9896               free (dynamic_syminfo);
9897             }
9898           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9899           if (dynamic_syminfo == NULL)
9900             {
9901               error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9902                      (unsigned long) syminsz);
9903               return FALSE;
9904             }
9905
9906           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9907           for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9908                syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9909                ++syminfo, ++extsym)
9910             {
9911               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9912               syminfo->si_flags = BYTE_GET (extsym->si_flags);
9913             }
9914
9915           free (extsyminfo);
9916         }
9917     }
9918
9919   if (do_dynamic && dynamic_addr)
9920     printf (ngettext ("\nDynamic section at offset 0x%lx "
9921                       "contains %lu entry:\n",
9922                       "\nDynamic section at offset 0x%lx "
9923                       "contains %lu entries:\n",
9924                       dynamic_nent),
9925             dynamic_addr, (unsigned long) dynamic_nent);
9926   if (do_dynamic)
9927     printf (_("  Tag        Type                         Name/Value\n"));
9928
9929   for (entry = dynamic_section;
9930        entry < dynamic_section + dynamic_nent;
9931        entry++)
9932     {
9933       if (do_dynamic)
9934         {
9935           const char * dtype;
9936
9937           putchar (' ');
9938           print_vma (entry->d_tag, FULL_HEX);
9939           dtype = get_dynamic_type (filedata, entry->d_tag);
9940           printf (" (%s)%*s", dtype,
9941                   ((is_32bit_elf ? 27 : 19) - (int) strlen (dtype)), " ");
9942         }
9943
9944       switch (entry->d_tag)
9945         {
9946         case DT_FLAGS:
9947           if (do_dynamic)
9948             print_dynamic_flags (entry->d_un.d_val);
9949           break;
9950
9951         case DT_AUXILIARY:
9952         case DT_FILTER:
9953         case DT_CONFIG:
9954         case DT_DEPAUDIT:
9955         case DT_AUDIT:
9956           if (do_dynamic)
9957             {
9958               switch (entry->d_tag)
9959                 {
9960                 case DT_AUXILIARY:
9961                   printf (_("Auxiliary library"));
9962                   break;
9963
9964                 case DT_FILTER:
9965                   printf (_("Filter library"));
9966                   break;
9967
9968                 case DT_CONFIG:
9969                   printf (_("Configuration file"));
9970                   break;
9971
9972                 case DT_DEPAUDIT:
9973                   printf (_("Dependency audit library"));
9974                   break;
9975
9976                 case DT_AUDIT:
9977                   printf (_("Audit library"));
9978                   break;
9979                 }
9980
9981               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9982                 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9983               else
9984                 {
9985                   printf (": ");
9986                   print_vma (entry->d_un.d_val, PREFIX_HEX);
9987                   putchar ('\n');
9988                 }
9989             }
9990           break;
9991
9992         case DT_FEATURE:
9993           if (do_dynamic)
9994             {
9995               printf (_("Flags:"));
9996
9997               if (entry->d_un.d_val == 0)
9998                 printf (_(" None\n"));
9999               else
10000                 {
10001                   unsigned long int val = entry->d_un.d_val;
10002
10003                   if (val & DTF_1_PARINIT)
10004                     {
10005                       printf (" PARINIT");
10006                       val ^= DTF_1_PARINIT;
10007                     }
10008                   if (val & DTF_1_CONFEXP)
10009                     {
10010                       printf (" CONFEXP");
10011                       val ^= DTF_1_CONFEXP;
10012                     }
10013                   if (val != 0)
10014                     printf (" %lx", val);
10015                   puts ("");
10016                 }
10017             }
10018           break;
10019
10020         case DT_POSFLAG_1:
10021           if (do_dynamic)
10022             {
10023               printf (_("Flags:"));
10024
10025               if (entry->d_un.d_val == 0)
10026                 printf (_(" None\n"));
10027               else
10028                 {
10029                   unsigned long int val = entry->d_un.d_val;
10030
10031                   if (val & DF_P1_LAZYLOAD)
10032                     {
10033                       printf (" LAZYLOAD");
10034                       val ^= DF_P1_LAZYLOAD;
10035                     }
10036                   if (val & DF_P1_GROUPPERM)
10037                     {
10038                       printf (" GROUPPERM");
10039                       val ^= DF_P1_GROUPPERM;
10040                     }
10041                   if (val != 0)
10042                     printf (" %lx", val);
10043                   puts ("");
10044                 }
10045             }
10046           break;
10047
10048         case DT_FLAGS_1:
10049           if (do_dynamic)
10050             {
10051               printf (_("Flags:"));
10052               if (entry->d_un.d_val == 0)
10053                 printf (_(" None\n"));
10054               else
10055                 {
10056                   unsigned long int val = entry->d_un.d_val;
10057
10058                   if (val & DF_1_NOW)
10059                     {
10060                       printf (" NOW");
10061                       val ^= DF_1_NOW;
10062                     }
10063                   if (val & DF_1_GLOBAL)
10064                     {
10065                       printf (" GLOBAL");
10066                       val ^= DF_1_GLOBAL;
10067                     }
10068                   if (val & DF_1_GROUP)
10069                     {
10070                       printf (" GROUP");
10071                       val ^= DF_1_GROUP;
10072                     }
10073                   if (val & DF_1_NODELETE)
10074                     {
10075                       printf (" NODELETE");
10076                       val ^= DF_1_NODELETE;
10077                     }
10078                   if (val & DF_1_LOADFLTR)
10079                     {
10080                       printf (" LOADFLTR");
10081                       val ^= DF_1_LOADFLTR;
10082                     }
10083                   if (val & DF_1_INITFIRST)
10084                     {
10085                       printf (" INITFIRST");
10086                       val ^= DF_1_INITFIRST;
10087                     }
10088                   if (val & DF_1_NOOPEN)
10089                     {
10090                       printf (" NOOPEN");
10091                       val ^= DF_1_NOOPEN;
10092                     }
10093                   if (val & DF_1_ORIGIN)
10094                     {
10095                       printf (" ORIGIN");
10096                       val ^= DF_1_ORIGIN;
10097                     }
10098                   if (val & DF_1_DIRECT)
10099                     {
10100                       printf (" DIRECT");
10101                       val ^= DF_1_DIRECT;
10102                     }
10103                   if (val & DF_1_TRANS)
10104                     {
10105                       printf (" TRANS");
10106                       val ^= DF_1_TRANS;
10107                     }
10108                   if (val & DF_1_INTERPOSE)
10109                     {
10110                       printf (" INTERPOSE");
10111                       val ^= DF_1_INTERPOSE;
10112                     }
10113                   if (val & DF_1_NODEFLIB)
10114                     {
10115                       printf (" NODEFLIB");
10116                       val ^= DF_1_NODEFLIB;
10117                     }
10118                   if (val & DF_1_NODUMP)
10119                     {
10120                       printf (" NODUMP");
10121                       val ^= DF_1_NODUMP;
10122                     }
10123                   if (val & DF_1_CONFALT)
10124                     {
10125                       printf (" CONFALT");
10126                       val ^= DF_1_CONFALT;
10127                     }
10128                   if (val & DF_1_ENDFILTEE)
10129                     {
10130                       printf (" ENDFILTEE");
10131                       val ^= DF_1_ENDFILTEE;
10132                     }
10133                   if (val & DF_1_DISPRELDNE)
10134                     {
10135                       printf (" DISPRELDNE");
10136                       val ^= DF_1_DISPRELDNE;
10137                     }
10138                   if (val & DF_1_DISPRELPND)
10139                     {
10140                       printf (" DISPRELPND");
10141                       val ^= DF_1_DISPRELPND;
10142                     }
10143                   if (val & DF_1_NODIRECT)
10144                     {
10145                       printf (" NODIRECT");
10146                       val ^= DF_1_NODIRECT;
10147                     }
10148                   if (val & DF_1_IGNMULDEF)
10149                     {
10150                       printf (" IGNMULDEF");
10151                       val ^= DF_1_IGNMULDEF;
10152                     }
10153                   if (val & DF_1_NOKSYMS)
10154                     {
10155                       printf (" NOKSYMS");
10156                       val ^= DF_1_NOKSYMS;
10157                     }
10158                   if (val & DF_1_NOHDR)
10159                     {
10160                       printf (" NOHDR");
10161                       val ^= DF_1_NOHDR;
10162                     }
10163                   if (val & DF_1_EDITED)
10164                     {
10165                       printf (" EDITED");
10166                       val ^= DF_1_EDITED;
10167                     }
10168                   if (val & DF_1_NORELOC)
10169                     {
10170                       printf (" NORELOC");
10171                       val ^= DF_1_NORELOC;
10172                     }
10173                   if (val & DF_1_SYMINTPOSE)
10174                     {
10175                       printf (" SYMINTPOSE");
10176                       val ^= DF_1_SYMINTPOSE;
10177                     }
10178                   if (val & DF_1_GLOBAUDIT)
10179                     {
10180                       printf (" GLOBAUDIT");
10181                       val ^= DF_1_GLOBAUDIT;
10182                     }
10183                   if (val & DF_1_SINGLETON)
10184                     {
10185                       printf (" SINGLETON");
10186                       val ^= DF_1_SINGLETON;
10187                     }
10188                   if (val & DF_1_STUB)
10189                     {
10190                       printf (" STUB");
10191                       val ^= DF_1_STUB;
10192                     }
10193                   if (val & DF_1_PIE)
10194                     {
10195                       printf (" PIE");
10196                       val ^= DF_1_PIE;
10197                     }
10198                   if (val & DF_1_KMOD)
10199                     {
10200                       printf (" KMOD");
10201                       val ^= DF_1_KMOD;
10202                     }
10203                   if (val & DF_1_WEAKFILTER)
10204                     {
10205                       printf (" WEAKFILTER");
10206                       val ^= DF_1_WEAKFILTER;
10207                     }
10208                   if (val & DF_1_NOCOMMON)
10209                     {
10210                       printf (" NOCOMMON");
10211                       val ^= DF_1_NOCOMMON;
10212                     }
10213                   if (val != 0)
10214                     printf (" %lx", val);
10215                   puts ("");
10216                 }
10217             }
10218           break;
10219
10220         case DT_PLTREL:
10221           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10222           if (do_dynamic)
10223             puts (get_dynamic_type (filedata, entry->d_un.d_val));
10224           break;
10225
10226         case DT_NULL    :
10227         case DT_NEEDED  :
10228         case DT_PLTGOT  :
10229         case DT_HASH    :
10230         case DT_STRTAB  :
10231         case DT_SYMTAB  :
10232         case DT_RELA    :
10233         case DT_INIT    :
10234         case DT_FINI    :
10235         case DT_SONAME  :
10236         case DT_RPATH   :
10237         case DT_SYMBOLIC:
10238         case DT_REL     :
10239         case DT_DEBUG   :
10240         case DT_TEXTREL :
10241         case DT_JMPREL  :
10242         case DT_RUNPATH :
10243           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10244
10245           if (do_dynamic)
10246             {
10247               char * name;
10248
10249               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
10250                 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10251               else
10252                 name = NULL;
10253
10254               if (name)
10255                 {
10256                   switch (entry->d_tag)
10257                     {
10258                     case DT_NEEDED:
10259                       printf (_("Shared library: [%s]"), name);
10260
10261                       if (streq (name, program_interpreter))
10262                         printf (_(" program interpreter"));
10263                       break;
10264
10265                     case DT_SONAME:
10266                       printf (_("Library soname: [%s]"), name);
10267                       break;
10268
10269                     case DT_RPATH:
10270                       printf (_("Library rpath: [%s]"), name);
10271                       break;
10272
10273                     case DT_RUNPATH:
10274                       printf (_("Library runpath: [%s]"), name);
10275                       break;
10276
10277                     default:
10278                       print_vma (entry->d_un.d_val, PREFIX_HEX);
10279                       break;
10280                     }
10281                 }
10282               else
10283                 print_vma (entry->d_un.d_val, PREFIX_HEX);
10284
10285               putchar ('\n');
10286             }
10287           break;
10288
10289         case DT_PLTRELSZ:
10290         case DT_RELASZ  :
10291         case DT_STRSZ   :
10292         case DT_RELSZ   :
10293         case DT_RELAENT :
10294         case DT_SYMENT  :
10295         case DT_RELENT  :
10296           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10297           /* Fall through.  */
10298         case DT_PLTPADSZ:
10299         case DT_MOVEENT :
10300         case DT_MOVESZ  :
10301         case DT_INIT_ARRAYSZ:
10302         case DT_FINI_ARRAYSZ:
10303         case DT_GNU_CONFLICTSZ:
10304         case DT_GNU_LIBLISTSZ:
10305           if (do_dynamic)
10306             {
10307               print_vma (entry->d_un.d_val, UNSIGNED);
10308               printf (_(" (bytes)\n"));
10309             }
10310           break;
10311
10312         case DT_VERDEFNUM:
10313         case DT_VERNEEDNUM:
10314         case DT_RELACOUNT:
10315         case DT_RELCOUNT:
10316           if (do_dynamic)
10317             {
10318               print_vma (entry->d_un.d_val, UNSIGNED);
10319               putchar ('\n');
10320             }
10321           break;
10322
10323         case DT_SYMINSZ:
10324         case DT_SYMINENT:
10325         case DT_SYMINFO:
10326         case DT_USED:
10327         case DT_INIT_ARRAY:
10328         case DT_FINI_ARRAY:
10329           if (do_dynamic)
10330             {
10331               if (entry->d_tag == DT_USED
10332                   && VALID_DYNAMIC_NAME (entry->d_un.d_val))
10333                 {
10334                   char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10335
10336                   if (*name)
10337                     {
10338                       printf (_("Not needed object: [%s]\n"), name);
10339                       break;
10340                     }
10341                 }
10342
10343               print_vma (entry->d_un.d_val, PREFIX_HEX);
10344               putchar ('\n');
10345             }
10346           break;
10347
10348         case DT_BIND_NOW:
10349           /* The value of this entry is ignored.  */
10350           if (do_dynamic)
10351             putchar ('\n');
10352           break;
10353
10354         case DT_GNU_PRELINKED:
10355           if (do_dynamic)
10356             {
10357               struct tm * tmp;
10358               time_t atime = entry->d_un.d_val;
10359
10360               tmp = gmtime (&atime);
10361               /* PR 17533 file: 041-1244816-0.004.  */
10362               if (tmp == NULL)
10363                 printf (_("<corrupt time val: %lx"),
10364                         (unsigned long) atime);
10365               else
10366                 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
10367                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
10368                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
10369
10370             }
10371           break;
10372
10373         case DT_GNU_HASH:
10374           dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
10375           if (do_dynamic)
10376             {
10377               print_vma (entry->d_un.d_val, PREFIX_HEX);
10378               putchar ('\n');
10379             }
10380           break;
10381
10382         default:
10383           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
10384             version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
10385               entry->d_un.d_val;
10386
10387           if (do_dynamic)
10388             {
10389               switch (filedata->file_header.e_machine)
10390                 {
10391                 case EM_AARCH64:
10392                   dynamic_section_aarch64_val (entry);
10393                   break;
10394                 case EM_MIPS:
10395                 case EM_MIPS_RS3_LE:
10396                   dynamic_section_mips_val (entry);
10397                   break;
10398                 case EM_PARISC:
10399                   dynamic_section_parisc_val (entry);
10400                   break;
10401                 case EM_IA_64:
10402                   dynamic_section_ia64_val (entry);
10403                   break;
10404                 default:
10405                   print_vma (entry->d_un.d_val, PREFIX_HEX);
10406                   putchar ('\n');
10407                 }
10408             }
10409           break;
10410         }
10411     }
10412
10413   return TRUE;
10414 }
10415
10416 static char *
10417 get_ver_flags (unsigned int flags)
10418 {
10419   static char buff[128];
10420
10421   buff[0] = 0;
10422
10423   if (flags == 0)
10424     return _("none");
10425
10426   if (flags & VER_FLG_BASE)
10427     strcat (buff, "BASE");
10428
10429   if (flags & VER_FLG_WEAK)
10430     {
10431       if (flags & VER_FLG_BASE)
10432         strcat (buff, " | ");
10433
10434       strcat (buff, "WEAK");
10435     }
10436
10437   if (flags & VER_FLG_INFO)
10438     {
10439       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
10440         strcat (buff, " | ");
10441
10442       strcat (buff, "INFO");
10443     }
10444
10445   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10446     {
10447       if (flags & (VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10448         strcat (buff, " | ");
10449
10450       strcat (buff, _("<unknown>"));
10451     }
10452
10453   return buff;
10454 }
10455
10456 /* Display the contents of the version sections.  */
10457
10458 static bfd_boolean
10459 process_version_sections (Filedata * filedata)
10460 {
10461   Elf_Internal_Shdr * section;
10462   unsigned i;
10463   bfd_boolean found = FALSE;
10464
10465   if (! do_version)
10466     return TRUE;
10467
10468   for (i = 0, section = filedata->section_headers;
10469        i < filedata->file_header.e_shnum;
10470        i++, section++)
10471     {
10472       switch (section->sh_type)
10473         {
10474         case SHT_GNU_verdef:
10475           {
10476             Elf_External_Verdef * edefs;
10477             unsigned long idx;
10478             unsigned long cnt;
10479             char * endbuf;
10480
10481             found = TRUE;
10482
10483             printf (ngettext ("\nVersion definition section '%s' "
10484                               "contains %u entry:\n",
10485                               "\nVersion definition section '%s' "
10486                               "contains %u entries:\n",
10487                               section->sh_info),
10488                     printable_section_name (filedata, section),
10489                     section->sh_info);
10490
10491             printf (_("  Addr: 0x"));
10492             printf_vma (section->sh_addr);
10493             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10494                     (unsigned long) section->sh_offset, section->sh_link,
10495                     printable_section_name_from_index (filedata, section->sh_link));
10496
10497             edefs = (Elf_External_Verdef *)
10498                 get_data (NULL, filedata, section->sh_offset, 1,section->sh_size,
10499                           _("version definition section"));
10500             if (!edefs)
10501               break;
10502             endbuf = (char *) edefs + section->sh_size;
10503
10504             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10505               {
10506                 char * vstart;
10507                 Elf_External_Verdef * edef;
10508                 Elf_Internal_Verdef ent;
10509                 Elf_External_Verdaux * eaux;
10510                 Elf_Internal_Verdaux aux;
10511                 unsigned long isum;
10512                 int j;
10513
10514                 vstart = ((char *) edefs) + idx;
10515                 if (vstart + sizeof (*edef) > endbuf)
10516                   break;
10517
10518                 edef = (Elf_External_Verdef *) vstart;
10519
10520                 ent.vd_version = BYTE_GET (edef->vd_version);
10521                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
10522                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
10523                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
10524                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
10525                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
10526                 ent.vd_next    = BYTE_GET (edef->vd_next);
10527
10528                 printf (_("  %#06lx: Rev: %d  Flags: %s"),
10529                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
10530
10531                 printf (_("  Index: %d  Cnt: %d  "),
10532                         ent.vd_ndx, ent.vd_cnt);
10533
10534                 /* Check for overflow.  */
10535                 if (ent.vd_aux > (size_t) (endbuf - vstart))
10536                   break;
10537
10538                 vstart += ent.vd_aux;
10539
10540                 if (vstart + sizeof (*eaux) > endbuf)
10541                   break;
10542                 eaux = (Elf_External_Verdaux *) vstart;
10543
10544                 aux.vda_name = BYTE_GET (eaux->vda_name);
10545                 aux.vda_next = BYTE_GET (eaux->vda_next);
10546
10547                 if (VALID_DYNAMIC_NAME (aux.vda_name))
10548                   printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
10549                 else
10550                   printf (_("Name index: %ld\n"), aux.vda_name);
10551
10552                 isum = idx + ent.vd_aux;
10553
10554                 for (j = 1; j < ent.vd_cnt; j++)
10555                   {
10556                     if (aux.vda_next < sizeof (*eaux)
10557                         && !(j == ent.vd_cnt - 1 && aux.vda_next == 0))
10558                       {
10559                         warn (_("Invalid vda_next field of %lx\n"),
10560                               aux.vda_next);
10561                         j = ent.vd_cnt;
10562                         break;
10563                       }
10564                     /* Check for overflow.  */
10565                     if (aux.vda_next > (size_t) (endbuf - vstart))
10566                       break;
10567
10568                     isum   += aux.vda_next;
10569                     vstart += aux.vda_next;
10570
10571                     if (vstart + sizeof (*eaux) > endbuf)
10572                       break;
10573                     eaux = (Elf_External_Verdaux *) vstart;
10574
10575                     aux.vda_name = BYTE_GET (eaux->vda_name);
10576                     aux.vda_next = BYTE_GET (eaux->vda_next);
10577
10578                     if (VALID_DYNAMIC_NAME (aux.vda_name))
10579                       printf (_("  %#06lx: Parent %d: %s\n"),
10580                               isum, j, GET_DYNAMIC_NAME (aux.vda_name));
10581                     else
10582                       printf (_("  %#06lx: Parent %d, name index: %ld\n"),
10583                               isum, j, aux.vda_name);
10584                   }
10585
10586                 if (j < ent.vd_cnt)
10587                   printf (_("  Version def aux past end of section\n"));
10588
10589                 /* PR 17531:
10590                    file: id:000001,src:000172+005151,op:splice,rep:2.  */
10591                 if (ent.vd_next < sizeof (*edef)
10592                     && !(cnt == section->sh_info - 1 && ent.vd_next == 0))
10593                   {
10594                     warn (_("Invalid vd_next field of %lx\n"), ent.vd_next);
10595                     cnt = section->sh_info;
10596                     break;
10597                   }
10598                 if (ent.vd_next > (size_t) (endbuf - ((char *) edefs + idx)))
10599                   break;
10600
10601                 idx += ent.vd_next;
10602               }
10603
10604             if (cnt < section->sh_info)
10605               printf (_("  Version definition past end of section\n"));
10606
10607             free (edefs);
10608           }
10609           break;
10610
10611         case SHT_GNU_verneed:
10612           {
10613             Elf_External_Verneed * eneed;
10614             unsigned long idx;
10615             unsigned long cnt;
10616             char * endbuf;
10617
10618             found = TRUE;
10619
10620             printf (ngettext ("\nVersion needs section '%s' "
10621                               "contains %u entry:\n",
10622                               "\nVersion needs section '%s' "
10623                               "contains %u entries:\n",
10624                               section->sh_info),
10625                     printable_section_name (filedata, section), section->sh_info);
10626
10627             printf (_(" Addr: 0x"));
10628             printf_vma (section->sh_addr);
10629             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10630                     (unsigned long) section->sh_offset, section->sh_link,
10631                     printable_section_name_from_index (filedata, section->sh_link));
10632
10633             eneed = (Elf_External_Verneed *) get_data (NULL, filedata,
10634                                                        section->sh_offset, 1,
10635                                                        section->sh_size,
10636                                                        _("Version Needs section"));
10637             if (!eneed)
10638               break;
10639             endbuf = (char *) eneed + section->sh_size;
10640
10641             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10642               {
10643                 Elf_External_Verneed * entry;
10644                 Elf_Internal_Verneed ent;
10645                 unsigned long isum;
10646                 int j;
10647                 char * vstart;
10648
10649                 vstart = ((char *) eneed) + idx;
10650                 if (vstart + sizeof (*entry) > endbuf)
10651                   break;
10652
10653                 entry = (Elf_External_Verneed *) vstart;
10654
10655                 ent.vn_version = BYTE_GET (entry->vn_version);
10656                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
10657                 ent.vn_file    = BYTE_GET (entry->vn_file);
10658                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
10659                 ent.vn_next    = BYTE_GET (entry->vn_next);
10660
10661                 printf (_("  %#06lx: Version: %d"), idx, ent.vn_version);
10662
10663                 if (VALID_DYNAMIC_NAME (ent.vn_file))
10664                   printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
10665                 else
10666                   printf (_("  File: %lx"), ent.vn_file);
10667
10668                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
10669
10670                 /* Check for overflow.  */
10671                 if (ent.vn_aux > (size_t) (endbuf - vstart))
10672                   break;
10673                 vstart += ent.vn_aux;
10674
10675                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10676                   {
10677                     Elf_External_Vernaux * eaux;
10678                     Elf_Internal_Vernaux aux;
10679
10680                     if (vstart + sizeof (*eaux) > endbuf)
10681                       break;
10682                     eaux = (Elf_External_Vernaux *) vstart;
10683
10684                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
10685                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
10686                     aux.vna_other = BYTE_GET (eaux->vna_other);
10687                     aux.vna_name  = BYTE_GET (eaux->vna_name);
10688                     aux.vna_next  = BYTE_GET (eaux->vna_next);
10689
10690                     if (VALID_DYNAMIC_NAME (aux.vna_name))
10691                       printf (_("  %#06lx:   Name: %s"),
10692                               isum, GET_DYNAMIC_NAME (aux.vna_name));
10693                     else
10694                       printf (_("  %#06lx:   Name index: %lx"),
10695                               isum, aux.vna_name);
10696
10697                     printf (_("  Flags: %s  Version: %d\n"),
10698                             get_ver_flags (aux.vna_flags), aux.vna_other);
10699
10700                     if (aux.vna_next < sizeof (*eaux)
10701                         && !(j == ent.vn_cnt - 1 && aux.vna_next == 0))
10702                       {
10703                         warn (_("Invalid vna_next field of %lx\n"),
10704                               aux.vna_next);
10705                         j = ent.vn_cnt;
10706                         break;
10707                       }
10708                     /* Check for overflow.  */
10709                     if (aux.vna_next > (size_t) (endbuf - vstart))
10710                       break;
10711                     isum   += aux.vna_next;
10712                     vstart += aux.vna_next;
10713                   }
10714
10715                 if (j < ent.vn_cnt)
10716                   warn (_("Missing Version Needs auxillary information\n"));
10717
10718                 if (ent.vn_next < sizeof (*entry)
10719                     && !(cnt == section->sh_info - 1 && ent.vn_next == 0))
10720                   {
10721                     warn (_("Invalid vn_next field of %lx\n"), ent.vn_next);
10722                     cnt = section->sh_info;
10723                     break;
10724                   }
10725                 if (ent.vn_next > (size_t) (endbuf - ((char *) eneed + idx)))
10726                   break;
10727                 idx += ent.vn_next;
10728               }
10729
10730             if (cnt < section->sh_info)
10731               warn (_("Missing Version Needs information\n"));
10732
10733             free (eneed);
10734           }
10735           break;
10736
10737         case SHT_GNU_versym:
10738           {
10739             Elf_Internal_Shdr * link_section;
10740             size_t total;
10741             unsigned int cnt;
10742             unsigned char * edata;
10743             unsigned short * data;
10744             char * strtab;
10745             Elf_Internal_Sym * symbols;
10746             Elf_Internal_Shdr * string_sec;
10747             unsigned long num_syms;
10748             long off;
10749
10750             if (section->sh_link >= filedata->file_header.e_shnum)
10751               break;
10752
10753             link_section = filedata->section_headers + section->sh_link;
10754             total = section->sh_size / sizeof (Elf_External_Versym);
10755
10756             if (link_section->sh_link >= filedata->file_header.e_shnum)
10757               break;
10758
10759             found = TRUE;
10760
10761             symbols = GET_ELF_SYMBOLS (filedata, link_section, & num_syms);
10762             if (symbols == NULL)
10763               break;
10764
10765             string_sec = filedata->section_headers + link_section->sh_link;
10766
10767             strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
10768                                         string_sec->sh_size,
10769                                         _("version string table"));
10770             if (!strtab)
10771               {
10772                 free (symbols);
10773                 break;
10774               }
10775
10776             printf (ngettext ("\nVersion symbols section '%s' "
10777                               "contains %lu entry:\n",
10778                               "\nVersion symbols section '%s' "
10779                               "contains %lu entries:\n",
10780                               total),
10781                     printable_section_name (filedata, section), (unsigned long) total);
10782
10783             printf (_(" Addr: "));
10784             printf_vma (section->sh_addr);
10785             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10786                     (unsigned long) section->sh_offset, section->sh_link,
10787                     printable_section_name (filedata, link_section));
10788
10789             off = offset_from_vma (filedata,
10790                                    version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10791                                    total * sizeof (short));
10792             edata = (unsigned char *) get_data (NULL, filedata, off, total,
10793                                                 sizeof (short),
10794                                                 _("version symbol data"));
10795             if (!edata)
10796               {
10797                 free (strtab);
10798                 free (symbols);
10799                 break;
10800               }
10801
10802             data = (short unsigned int *) cmalloc (total, sizeof (short));
10803
10804             for (cnt = total; cnt --;)
10805               data[cnt] = byte_get (edata + cnt * sizeof (short),
10806                                     sizeof (short));
10807
10808             free (edata);
10809
10810             for (cnt = 0; cnt < total; cnt += 4)
10811               {
10812                 int j, nn;
10813                 char *name;
10814                 char *invalid = _("*invalid*");
10815
10816                 printf ("  %03x:", cnt);
10817
10818                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10819                   switch (data[cnt + j])
10820                     {
10821                     case 0:
10822                       fputs (_("   0 (*local*)    "), stdout);
10823                       break;
10824
10825                     case 1:
10826                       fputs (_("   1 (*global*)   "), stdout);
10827                       break;
10828
10829                     default:
10830                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10831                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10832
10833                       /* If this index value is greater than the size of the symbols
10834                          array, break to avoid an out-of-bounds read.  */
10835                       if ((unsigned long)(cnt + j) >= num_syms)
10836                         {
10837                           warn (_("invalid index into symbol array\n"));
10838                           break;
10839                         }
10840
10841                       name = NULL;
10842                       if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10843                         {
10844                           Elf_Internal_Verneed ivn;
10845                           unsigned long offset;
10846
10847                           offset = offset_from_vma
10848                             (filedata, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10849                              sizeof (Elf_External_Verneed));
10850
10851                           do
10852                             {
10853                               Elf_Internal_Vernaux ivna;
10854                               Elf_External_Verneed evn;
10855                               Elf_External_Vernaux evna;
10856                               unsigned long a_off;
10857
10858                               if (get_data (&evn, filedata, offset, sizeof (evn), 1,
10859                                             _("version need")) == NULL)
10860                                 break;
10861
10862                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10863                               ivn.vn_next = BYTE_GET (evn.vn_next);
10864
10865                               a_off = offset + ivn.vn_aux;
10866
10867                               do
10868                                 {
10869                                   if (get_data (&evna, filedata, a_off, sizeof (evna),
10870                                                 1, _("version need aux (2)")) == NULL)
10871                                     {
10872                                       ivna.vna_next  = 0;
10873                                       ivna.vna_other = 0;
10874                                     }
10875                                   else
10876                                     {
10877                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
10878                                       ivna.vna_other = BYTE_GET (evna.vna_other);
10879                                     }
10880
10881                                   a_off += ivna.vna_next;
10882                                 }
10883                               while (ivna.vna_other != data[cnt + j]
10884                                      && ivna.vna_next != 0);
10885
10886                               if (ivna.vna_other == data[cnt + j])
10887                                 {
10888                                   ivna.vna_name = BYTE_GET (evna.vna_name);
10889
10890                                   if (ivna.vna_name >= string_sec->sh_size)
10891                                     name = invalid;
10892                                   else
10893                                     name = strtab + ivna.vna_name;
10894                                   break;
10895                                 }
10896
10897                               offset += ivn.vn_next;
10898                             }
10899                           while (ivn.vn_next);
10900                         }
10901
10902                       if (data[cnt + j] != 0x8001
10903                           && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10904                         {
10905                           Elf_Internal_Verdef ivd;
10906                           Elf_External_Verdef evd;
10907                           unsigned long offset;
10908
10909                           offset = offset_from_vma
10910                             (filedata, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10911                              sizeof evd);
10912
10913                           do
10914                             {
10915                               if (get_data (&evd, filedata, offset, sizeof (evd), 1,
10916                                             _("version def")) == NULL)
10917                                 {
10918                                   ivd.vd_next = 0;
10919                                   /* PR 17531: file: 046-1082287-0.004.  */
10920                                   ivd.vd_ndx  = (data[cnt + j] & VERSYM_VERSION) + 1;
10921                                   break;
10922                                 }
10923                               else
10924                                 {
10925                                   ivd.vd_next = BYTE_GET (evd.vd_next);
10926                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
10927                                 }
10928
10929                               offset += ivd.vd_next;
10930                             }
10931                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10932                                  && ivd.vd_next != 0);
10933
10934                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10935                             {
10936                               Elf_External_Verdaux evda;
10937                               Elf_Internal_Verdaux ivda;
10938
10939                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
10940
10941                               if (get_data (&evda, filedata,
10942                                             offset - ivd.vd_next + ivd.vd_aux,
10943                                             sizeof (evda), 1,
10944                                             _("version def aux")) == NULL)
10945                                 break;
10946
10947                               ivda.vda_name = BYTE_GET (evda.vda_name);
10948
10949                               if (ivda.vda_name >= string_sec->sh_size)
10950                                 name = invalid;
10951                               else if (name != NULL && name != invalid)
10952                                 name = _("*both*");
10953                               else
10954                                 name = strtab + ivda.vda_name;
10955                             }
10956                         }
10957                       if (name != NULL)
10958                         nn += printf ("(%s%-*s",
10959                                       name,
10960                                       12 - (int) strlen (name),
10961                                       ")");
10962
10963                       if (nn < 18)
10964                         printf ("%*c", 18 - nn, ' ');
10965                     }
10966
10967                 putchar ('\n');
10968               }
10969
10970             free (data);
10971             free (strtab);
10972             free (symbols);
10973           }
10974           break;
10975
10976         default:
10977           break;
10978         }
10979     }
10980
10981   if (! found)
10982     printf (_("\nNo version information found in this file.\n"));
10983
10984   return TRUE;
10985 }
10986
10987 static const char *
10988 get_symbol_binding (Filedata * filedata, unsigned int binding)
10989 {
10990   static char buff[32];
10991
10992   switch (binding)
10993     {
10994     case STB_LOCAL:     return "LOCAL";
10995     case STB_GLOBAL:    return "GLOBAL";
10996     case STB_WEAK:      return "WEAK";
10997     default:
10998       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10999         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
11000                   binding);
11001       else if (binding >= STB_LOOS && binding <= STB_HIOS)
11002         {
11003           if (binding == STB_GNU_UNIQUE
11004               && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
11005                   /* GNU is still using the default value 0.  */
11006                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
11007             return "UNIQUE";
11008           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
11009         }
11010       else
11011         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
11012       return buff;
11013     }
11014 }
11015
11016 static const char *
11017 get_symbol_type (Filedata * filedata, unsigned int type)
11018 {
11019   static char buff[32];
11020
11021   switch (type)
11022     {
11023     case STT_NOTYPE:    return "NOTYPE";
11024     case STT_OBJECT:    return "OBJECT";
11025     case STT_FUNC:      return "FUNC";
11026     case STT_SECTION:   return "SECTION";
11027     case STT_FILE:      return "FILE";
11028     case STT_COMMON:    return "COMMON";
11029     case STT_TLS:       return "TLS";
11030     case STT_RELC:      return "RELC";
11031     case STT_SRELC:     return "SRELC";
11032     default:
11033       if (type >= STT_LOPROC && type <= STT_HIPROC)
11034         {
11035           if (filedata->file_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
11036             return "THUMB_FUNC";
11037
11038           if (filedata->file_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
11039             return "REGISTER";
11040
11041           if (filedata->file_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
11042             return "PARISC_MILLI";
11043
11044           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
11045         }
11046       else if (type >= STT_LOOS && type <= STT_HIOS)
11047         {
11048           if (filedata->file_header.e_machine == EM_PARISC)
11049             {
11050               if (type == STT_HP_OPAQUE)
11051                 return "HP_OPAQUE";
11052               if (type == STT_HP_STUB)
11053                 return "HP_STUB";
11054             }
11055
11056           if (type == STT_GNU_IFUNC
11057               && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
11058                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
11059                   /* GNU is still using the default value 0.  */
11060                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
11061             return "IFUNC";
11062
11063           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
11064         }
11065       else
11066         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
11067       return buff;
11068     }
11069 }
11070
11071 static const char *
11072 get_symbol_visibility (unsigned int visibility)
11073 {
11074   switch (visibility)
11075     {
11076     case STV_DEFAULT:   return "DEFAULT";
11077     case STV_INTERNAL:  return "INTERNAL";
11078     case STV_HIDDEN:    return "HIDDEN";
11079     case STV_PROTECTED: return "PROTECTED";
11080     default:
11081       error (_("Unrecognized visibility value: %u"), visibility);
11082       return _("<unknown>");
11083     }
11084 }
11085
11086 static const char *
11087 get_solaris_symbol_visibility (unsigned int visibility)
11088 {
11089   switch (visibility)
11090     {
11091     case 4: return "EXPORTED";
11092     case 5: return "SINGLETON";
11093     case 6: return "ELIMINATE";
11094     default: return get_symbol_visibility (visibility);
11095     }
11096 }
11097
11098 static const char *
11099 get_mips_symbol_other (unsigned int other)
11100 {
11101   switch (other)
11102     {
11103     case STO_OPTIONAL:      return "OPTIONAL";
11104     case STO_MIPS_PLT:      return "MIPS PLT";
11105     case STO_MIPS_PIC:      return "MIPS PIC";
11106     case STO_MICROMIPS:     return "MICROMIPS";
11107     case STO_MICROMIPS | STO_MIPS_PIC:      return "MICROMIPS, MIPS PIC";
11108     case STO_MIPS16:        return "MIPS16";
11109     default:                return NULL;
11110     }
11111 }
11112
11113 static const char *
11114 get_ia64_symbol_other (Filedata * filedata, unsigned int other)
11115 {
11116   if (is_ia64_vms (filedata))
11117     {
11118       static char res[32];
11119
11120       res[0] = 0;
11121
11122       /* Function types is for images and .STB files only.  */
11123       switch (filedata->file_header.e_type)
11124         {
11125         case ET_DYN:
11126         case ET_EXEC:
11127           switch (VMS_ST_FUNC_TYPE (other))
11128             {
11129             case VMS_SFT_CODE_ADDR:
11130               strcat (res, " CA");
11131               break;
11132             case VMS_SFT_SYMV_IDX:
11133               strcat (res, " VEC");
11134               break;
11135             case VMS_SFT_FD:
11136               strcat (res, " FD");
11137               break;
11138             case VMS_SFT_RESERVE:
11139               strcat (res, " RSV");
11140               break;
11141             default:
11142               warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
11143                     VMS_ST_FUNC_TYPE (other));
11144               strcat (res, " <unknown>");
11145               break;
11146             }
11147           break;
11148         default:
11149           break;
11150         }
11151       switch (VMS_ST_LINKAGE (other))
11152         {
11153         case VMS_STL_IGNORE:
11154           strcat (res, " IGN");
11155           break;
11156         case VMS_STL_RESERVE:
11157           strcat (res, " RSV");
11158           break;
11159         case VMS_STL_STD:
11160           strcat (res, " STD");
11161           break;
11162         case VMS_STL_LNK:
11163           strcat (res, " LNK");
11164           break;
11165         default:
11166           warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
11167                 VMS_ST_LINKAGE (other));
11168           strcat (res, " <unknown>");
11169           break;
11170         }
11171
11172       if (res[0] != 0)
11173         return res + 1;
11174       else
11175         return res;
11176     }
11177   return NULL;
11178 }
11179
11180 static const char *
11181 get_ppc64_symbol_other (unsigned int other)
11182 {
11183   if ((other & ~STO_PPC64_LOCAL_MASK) != 0)
11184     return NULL;
11185
11186   other >>= STO_PPC64_LOCAL_BIT;
11187   if (other <= 6)
11188     {
11189       static char buf[32];
11190       if (other >= 2)
11191         other = ppc64_decode_local_entry (other);
11192       snprintf (buf, sizeof buf, _("<localentry>: %d"), other);
11193       return buf;
11194     }
11195   return NULL;
11196 }
11197
11198 static const char *
11199 get_symbol_other (Filedata * filedata, unsigned int other)
11200 {
11201   const char * result = NULL;
11202   static char buff [32];
11203
11204   if (other == 0)
11205     return "";
11206
11207   switch (filedata->file_header.e_machine)
11208     {
11209     case EM_MIPS:
11210       result = get_mips_symbol_other (other);
11211       break;
11212     case EM_IA_64:
11213       result = get_ia64_symbol_other (filedata, other);
11214       break;
11215     case EM_PPC64:
11216       result = get_ppc64_symbol_other (other);
11217       break;
11218     default:
11219       result = NULL;
11220       break;
11221     }
11222
11223   if (result)
11224     return result;
11225
11226   snprintf (buff, sizeof buff, _("<other>: %x"), other);
11227   return buff;
11228 }
11229
11230 static const char *
11231 get_symbol_index_type (Filedata * filedata, unsigned int type)
11232 {
11233   static char buff[32];
11234
11235   switch (type)
11236     {
11237     case SHN_UNDEF:     return "UND";
11238     case SHN_ABS:       return "ABS";
11239     case SHN_COMMON:    return "COM";
11240     default:
11241       if (type == SHN_IA_64_ANSI_COMMON
11242           && filedata->file_header.e_machine == EM_IA_64
11243           && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
11244         return "ANSI_COM";
11245       else if ((filedata->file_header.e_machine == EM_X86_64
11246                 || filedata->file_header.e_machine == EM_L1OM
11247                 || filedata->file_header.e_machine == EM_K1OM)
11248                && type == SHN_X86_64_LCOMMON)
11249         return "LARGE_COM";
11250       else if ((type == SHN_MIPS_SCOMMON
11251                 && filedata->file_header.e_machine == EM_MIPS)
11252                || (type == SHN_TIC6X_SCOMMON
11253                    && filedata->file_header.e_machine == EM_TI_C6000))
11254         return "SCOM";
11255       else if (type == SHN_MIPS_SUNDEFINED
11256                && filedata->file_header.e_machine == EM_MIPS)
11257         return "SUND";
11258       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
11259         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
11260       else if (type >= SHN_LOOS && type <= SHN_HIOS)
11261         sprintf (buff, "OS [0x%04x]", type & 0xffff);
11262       else if (type >= SHN_LORESERVE)
11263         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
11264       else if (type >= filedata->file_header.e_shnum)
11265         sprintf (buff, _("bad section index[%3d]"), type);
11266       else
11267         sprintf (buff, "%3d", type);
11268       break;
11269     }
11270
11271   return buff;
11272 }
11273
11274 static bfd_vma *
11275 get_dynamic_data (Filedata * filedata, bfd_size_type number, unsigned int ent_size)
11276 {
11277   unsigned char * e_data;
11278   bfd_vma * i_data;
11279
11280   /* If the size_t type is smaller than the bfd_size_type, eg because
11281      you are building a 32-bit tool on a 64-bit host, then make sure
11282      that when (number) is cast to (size_t) no information is lost.  */
11283   if (sizeof (size_t) < sizeof (bfd_size_type)
11284       && (bfd_size_type) ((size_t) number) != number)
11285     {
11286       error (_("Size truncation prevents reading %s elements of size %u\n"),
11287              bfd_vmatoa ("u", number), ent_size);
11288       return NULL;
11289     }
11290
11291   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
11292      attempting to allocate memory when the read is bound to fail.  */
11293   if (ent_size * number > filedata->file_size)
11294     {
11295       error (_("Invalid number of dynamic entries: %s\n"),
11296              bfd_vmatoa ("u", number));
11297       return NULL;
11298     }
11299
11300   e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
11301   if (e_data == NULL)
11302     {
11303       error (_("Out of memory reading %s dynamic entries\n"),
11304              bfd_vmatoa ("u", number));
11305       return NULL;
11306     }
11307
11308   if (fread (e_data, ent_size, (size_t) number, filedata->handle) != number)
11309     {
11310       error (_("Unable to read in %s bytes of dynamic data\n"),
11311              bfd_vmatoa ("u", number * ent_size));
11312       free (e_data);
11313       return NULL;
11314     }
11315
11316   i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
11317   if (i_data == NULL)
11318     {
11319       error (_("Out of memory allocating space for %s dynamic entries\n"),
11320              bfd_vmatoa ("u", number));
11321       free (e_data);
11322       return NULL;
11323     }
11324
11325   while (number--)
11326     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
11327
11328   free (e_data);
11329
11330   return i_data;
11331 }
11332
11333 static void
11334 print_dynamic_symbol (Filedata * filedata, bfd_vma si, unsigned long hn)
11335 {
11336   Elf_Internal_Sym * psym;
11337   int n;
11338
11339   n = print_vma (si, DEC_5);
11340   if (n < 5)
11341     fputs (&"     "[n], stdout);
11342   printf (" %3lu: ", hn);
11343
11344   if (dynamic_symbols == NULL || si >= num_dynamic_syms)
11345     {
11346       printf (_("<No info available for dynamic symbol number %lu>\n"),
11347               (unsigned long) si);
11348       return;
11349     }
11350
11351   psym = dynamic_symbols + si;
11352   print_vma (psym->st_value, LONG_HEX);
11353   putchar (' ');
11354   print_vma (psym->st_size, DEC_5);
11355
11356   printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11357   printf (" %-6s",  get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11358
11359   if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11360     printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11361   else
11362     {
11363       unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11364
11365       printf (" %-7s",  get_symbol_visibility (vis));
11366       /* Check to see if any other bits in the st_other field are set.
11367          Note - displaying this information disrupts the layout of the
11368          table being generated, but for the moment this case is very
11369          rare.  */
11370       if (psym->st_other ^ vis)
11371         printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11372     }
11373
11374   printf (" %3.3s ", get_symbol_index_type (filedata, psym->st_shndx));
11375   if (VALID_DYNAMIC_NAME (psym->st_name))
11376     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11377   else
11378     printf (_(" <corrupt: %14ld>"), psym->st_name);
11379   putchar ('\n');
11380 }
11381
11382 static const char *
11383 get_symbol_version_string (Filedata *                   filedata,
11384                            bfd_boolean                  is_dynsym,
11385                            const char *                 strtab,
11386                            unsigned long int            strtab_size,
11387                            unsigned int                 si,
11388                            Elf_Internal_Sym *           psym,
11389                            enum versioned_symbol_info * sym_info,
11390                            unsigned short *             vna_other)
11391 {
11392   unsigned char data[2];
11393   unsigned short vers_data;
11394   unsigned long offset;
11395   unsigned short max_vd_ndx;
11396
11397   if (!is_dynsym
11398       || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
11399     return NULL;
11400
11401   offset = offset_from_vma (filedata, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
11402                             sizeof data + si * sizeof (vers_data));
11403
11404   if (get_data (&data, filedata, offset + si * sizeof (vers_data),
11405                 sizeof (data), 1, _("version data")) == NULL)
11406     return NULL;
11407
11408   vers_data = byte_get (data, 2);
11409
11410   if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data == 0)
11411     return NULL;
11412
11413   max_vd_ndx = 0;
11414
11415   /* Usually we'd only see verdef for defined symbols, and verneed for
11416      undefined symbols.  However, symbols defined by the linker in
11417      .dynbss for variables copied from a shared library in order to
11418      avoid text relocations are defined yet have verneed.  We could
11419      use a heuristic to detect the special case, for example, check
11420      for verneed first on symbols defined in SHT_NOBITS sections, but
11421      it is simpler and more reliable to just look for both verdef and
11422      verneed.  .dynbss might not be mapped to a SHT_NOBITS section.  */
11423
11424   if (psym->st_shndx != SHN_UNDEF
11425       && vers_data != 0x8001
11426       && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
11427     {
11428       Elf_Internal_Verdef ivd;
11429       Elf_Internal_Verdaux ivda;
11430       Elf_External_Verdaux evda;
11431       unsigned long off;
11432
11433       off = offset_from_vma (filedata,
11434                              version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
11435                              sizeof (Elf_External_Verdef));
11436
11437       do
11438         {
11439           Elf_External_Verdef evd;
11440
11441           if (get_data (&evd, filedata, off, sizeof (evd), 1,
11442                         _("version def")) == NULL)
11443             {
11444               ivd.vd_ndx = 0;
11445               ivd.vd_aux = 0;
11446               ivd.vd_next = 0;
11447               ivd.vd_flags = 0;
11448             }
11449           else
11450             {
11451               ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
11452               ivd.vd_aux = BYTE_GET (evd.vd_aux);
11453               ivd.vd_next = BYTE_GET (evd.vd_next);
11454               ivd.vd_flags = BYTE_GET (evd.vd_flags);
11455             }
11456
11457           if ((ivd.vd_ndx & VERSYM_VERSION) > max_vd_ndx)
11458             max_vd_ndx = ivd.vd_ndx & VERSYM_VERSION;
11459
11460           off += ivd.vd_next;
11461         }
11462       while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
11463
11464       if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
11465         {
11466           if (ivd.vd_ndx == 1 && ivd.vd_flags == VER_FLG_BASE) 
11467             return NULL;
11468
11469           off -= ivd.vd_next;
11470           off += ivd.vd_aux;
11471
11472           if (get_data (&evda, filedata, off, sizeof (evda), 1,
11473                         _("version def aux")) != NULL)
11474             {
11475               ivda.vda_name = BYTE_GET (evda.vda_name);
11476
11477               if (psym->st_name != ivda.vda_name)
11478                 {
11479                   *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
11480                                ? symbol_hidden : symbol_public);
11481                   return (ivda.vda_name < strtab_size
11482                           ? strtab + ivda.vda_name : _("<corrupt>"));
11483                 }
11484             }
11485         }
11486     }
11487
11488   if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
11489     {
11490       Elf_External_Verneed evn;
11491       Elf_Internal_Verneed ivn;
11492       Elf_Internal_Vernaux ivna;
11493
11494       offset = offset_from_vma (filedata,
11495                                 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
11496                                 sizeof evn);
11497       do
11498         {
11499           unsigned long vna_off;
11500
11501           if (get_data (&evn, filedata, offset, sizeof (evn), 1,
11502                         _("version need")) == NULL)
11503             {
11504               ivna.vna_next = 0;
11505               ivna.vna_other = 0;
11506               ivna.vna_name = 0;
11507               break;
11508             }
11509
11510           ivn.vn_aux  = BYTE_GET (evn.vn_aux);
11511           ivn.vn_next = BYTE_GET (evn.vn_next);
11512
11513           vna_off = offset + ivn.vn_aux;
11514
11515           do
11516             {
11517               Elf_External_Vernaux evna;
11518
11519               if (get_data (&evna, filedata, vna_off, sizeof (evna), 1,
11520                             _("version need aux (3)")) == NULL)
11521                 {
11522                   ivna.vna_next = 0;
11523                   ivna.vna_other = 0;
11524                   ivna.vna_name = 0;
11525                 }
11526               else
11527                 {
11528                   ivna.vna_other = BYTE_GET (evna.vna_other);
11529                   ivna.vna_next  = BYTE_GET (evna.vna_next);
11530                   ivna.vna_name  = BYTE_GET (evna.vna_name);
11531                 }
11532
11533               vna_off += ivna.vna_next;
11534             }
11535           while (ivna.vna_other != vers_data && ivna.vna_next != 0);
11536
11537           if (ivna.vna_other == vers_data)
11538             break;
11539
11540           offset += ivn.vn_next;
11541         }
11542       while (ivn.vn_next != 0);
11543
11544       if (ivna.vna_other == vers_data)
11545         {
11546           *sym_info = symbol_undefined;
11547           *vna_other = ivna.vna_other;
11548           return (ivna.vna_name < strtab_size
11549                   ? strtab + ivna.vna_name : _("<corrupt>"));
11550         }
11551       else if ((max_vd_ndx || (vers_data & VERSYM_VERSION) != 1)
11552                && (vers_data & VERSYM_VERSION) > max_vd_ndx)
11553         return _("<corrupt>");
11554     }
11555   return NULL;
11556 }
11557
11558 /* Dump the symbol table.  */
11559 static bfd_boolean
11560 process_symbol_table (Filedata * filedata)
11561 {
11562   Elf_Internal_Shdr * section;
11563   bfd_size_type nbuckets = 0;
11564   bfd_size_type nchains = 0;
11565   bfd_vma * buckets = NULL;
11566   bfd_vma * chains = NULL;
11567   bfd_vma ngnubuckets = 0;
11568   bfd_vma * gnubuckets = NULL;
11569   bfd_vma * gnuchains = NULL;
11570   bfd_vma gnusymidx = 0;
11571   bfd_size_type ngnuchains = 0;
11572
11573   if (!do_syms && !do_dyn_syms && !do_histogram)
11574     return TRUE;
11575
11576   if (dynamic_info[DT_HASH]
11577       && (do_histogram
11578           || (do_using_dynamic
11579               && !do_dyn_syms
11580               && dynamic_strings != NULL)))
11581     {
11582       unsigned char nb[8];
11583       unsigned char nc[8];
11584       unsigned int hash_ent_size = 4;
11585
11586       if ((filedata->file_header.e_machine == EM_ALPHA
11587            || filedata->file_header.e_machine == EM_S390
11588            || filedata->file_header.e_machine == EM_S390_OLD)
11589           && filedata->file_header.e_ident[EI_CLASS] == ELFCLASS64)
11590         hash_ent_size = 8;
11591
11592       if (fseek (filedata->handle,
11593                  (archive_file_offset
11594                   + offset_from_vma (filedata, dynamic_info[DT_HASH],
11595                                      sizeof nb + sizeof nc)),
11596                  SEEK_SET))
11597         {
11598           error (_("Unable to seek to start of dynamic information\n"));
11599           goto no_hash;
11600         }
11601
11602       if (fread (nb, hash_ent_size, 1, filedata->handle) != 1)
11603         {
11604           error (_("Failed to read in number of buckets\n"));
11605           goto no_hash;
11606         }
11607
11608       if (fread (nc, hash_ent_size, 1, filedata->handle) != 1)
11609         {
11610           error (_("Failed to read in number of chains\n"));
11611           goto no_hash;
11612         }
11613
11614       nbuckets = byte_get (nb, hash_ent_size);
11615       nchains  = byte_get (nc, hash_ent_size);
11616
11617       buckets = get_dynamic_data (filedata, nbuckets, hash_ent_size);
11618       chains  = get_dynamic_data (filedata, nchains, hash_ent_size);
11619
11620     no_hash:
11621       if (buckets == NULL || chains == NULL)
11622         {
11623           if (do_using_dynamic)
11624             return FALSE;
11625           free (buckets);
11626           free (chains);
11627           buckets = NULL;
11628           chains = NULL;
11629           nbuckets = 0;
11630           nchains = 0;
11631         }
11632     }
11633
11634   if (dynamic_info_DT_GNU_HASH
11635       && (do_histogram
11636           || (do_using_dynamic
11637               && !do_dyn_syms
11638               && dynamic_strings != NULL)))
11639     {
11640       unsigned char nb[16];
11641       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11642       bfd_vma buckets_vma;
11643
11644       if (fseek (filedata->handle,
11645                  (archive_file_offset
11646                   + offset_from_vma (filedata, dynamic_info_DT_GNU_HASH,
11647                                      sizeof nb)),
11648                  SEEK_SET))
11649         {
11650           error (_("Unable to seek to start of dynamic information\n"));
11651           goto no_gnu_hash;
11652         }
11653
11654       if (fread (nb, 16, 1, filedata->handle) != 1)
11655         {
11656           error (_("Failed to read in number of buckets\n"));
11657           goto no_gnu_hash;
11658         }
11659
11660       ngnubuckets = byte_get (nb, 4);
11661       gnusymidx = byte_get (nb + 4, 4);
11662       bitmaskwords = byte_get (nb + 8, 4);
11663       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
11664       if (is_32bit_elf)
11665         buckets_vma += bitmaskwords * 4;
11666       else
11667         buckets_vma += bitmaskwords * 8;
11668
11669       if (fseek (filedata->handle,
11670                  (archive_file_offset
11671                   + offset_from_vma (filedata, buckets_vma, 4)),
11672                  SEEK_SET))
11673         {
11674           error (_("Unable to seek to start of dynamic information\n"));
11675           goto no_gnu_hash;
11676         }
11677
11678       gnubuckets = get_dynamic_data (filedata, ngnubuckets, 4);
11679
11680       if (gnubuckets == NULL)
11681         goto no_gnu_hash;
11682
11683       for (i = 0; i < ngnubuckets; i++)
11684         if (gnubuckets[i] != 0)
11685           {
11686             if (gnubuckets[i] < gnusymidx)
11687               return FALSE;
11688
11689             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11690               maxchain = gnubuckets[i];
11691           }
11692
11693       if (maxchain == 0xffffffff)
11694         goto no_gnu_hash;
11695
11696       maxchain -= gnusymidx;
11697
11698       if (fseek (filedata->handle,
11699                  (archive_file_offset
11700                   + offset_from_vma (filedata, buckets_vma
11701                                            + 4 * (ngnubuckets + maxchain), 4)),
11702                  SEEK_SET))
11703         {
11704           error (_("Unable to seek to start of dynamic information\n"));
11705           goto no_gnu_hash;
11706         }
11707
11708       do
11709         {
11710           if (fread (nb, 4, 1, filedata->handle) != 1)
11711             {
11712               error (_("Failed to determine last chain length\n"));
11713               goto no_gnu_hash;
11714             }
11715
11716           if (maxchain + 1 == 0)
11717             goto no_gnu_hash;
11718
11719           ++maxchain;
11720         }
11721       while ((byte_get (nb, 4) & 1) == 0);
11722
11723       if (fseek (filedata->handle,
11724                  (archive_file_offset
11725                   + offset_from_vma (filedata, buckets_vma + 4 * ngnubuckets, 4)),
11726                  SEEK_SET))
11727         {
11728           error (_("Unable to seek to start of dynamic information\n"));
11729           goto no_gnu_hash;
11730         }
11731
11732       gnuchains = get_dynamic_data (filedata, maxchain, 4);
11733       ngnuchains = maxchain;
11734
11735     no_gnu_hash:
11736       if (gnuchains == NULL)
11737         {
11738           free (gnubuckets);
11739           gnubuckets = NULL;
11740           ngnubuckets = 0;
11741           if (do_using_dynamic)
11742             return FALSE;
11743         }
11744     }
11745
11746   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11747       && do_syms
11748       && do_using_dynamic
11749       && dynamic_strings != NULL
11750       && dynamic_symbols != NULL)
11751     {
11752       unsigned long hn;
11753
11754       if (dynamic_info[DT_HASH])
11755         {
11756           bfd_vma si;
11757           char *visited;
11758
11759           printf (_("\nSymbol table for image:\n"));
11760           if (is_32bit_elf)
11761             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11762           else
11763             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11764
11765           visited = xcmalloc (nchains, 1);
11766           memset (visited, 0, nchains);
11767           for (hn = 0; hn < nbuckets; hn++)
11768             {
11769               for (si = buckets[hn]; si > 0; si = chains[si])
11770                 {
11771                   print_dynamic_symbol (filedata, si, hn);
11772                   if (si >= nchains || visited[si])
11773                     {
11774                       error (_("histogram chain is corrupt\n"));
11775                       break;
11776                     }
11777                   visited[si] = 1;
11778                 }
11779             }
11780           free (visited);
11781         }
11782
11783       if (dynamic_info_DT_GNU_HASH)
11784         {
11785           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11786           if (is_32bit_elf)
11787             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11788           else
11789             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11790
11791           for (hn = 0; hn < ngnubuckets; ++hn)
11792             if (gnubuckets[hn] != 0)
11793               {
11794                 bfd_vma si = gnubuckets[hn];
11795                 bfd_vma off = si - gnusymidx;
11796
11797                 do
11798                   {
11799                     print_dynamic_symbol (filedata, si, hn);
11800                     si++;
11801                   }
11802                 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11803               }
11804         }
11805     }
11806   else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11807            && filedata->section_headers != NULL)
11808     {
11809       unsigned int i;
11810
11811       for (i = 0, section = filedata->section_headers;
11812            i < filedata->file_header.e_shnum;
11813            i++, section++)
11814         {
11815           unsigned int si;
11816           char * strtab = NULL;
11817           unsigned long int strtab_size = 0;
11818           Elf_Internal_Sym * symtab;
11819           Elf_Internal_Sym * psym;
11820           unsigned long num_syms;
11821
11822           if ((section->sh_type != SHT_SYMTAB
11823                && section->sh_type != SHT_DYNSYM)
11824               || (!do_syms
11825                   && section->sh_type == SHT_SYMTAB))
11826             continue;
11827
11828           if (section->sh_entsize == 0)
11829             {
11830               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11831                       printable_section_name (filedata, section));
11832               continue;
11833             }
11834
11835           num_syms = section->sh_size / section->sh_entsize;
11836           printf (ngettext ("\nSymbol table '%s' contains %lu entry:\n",
11837                             "\nSymbol table '%s' contains %lu entries:\n",
11838                             num_syms),
11839                   printable_section_name (filedata, section),
11840                   num_syms);
11841
11842           if (is_32bit_elf)
11843             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
11844           else
11845             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
11846
11847           symtab = GET_ELF_SYMBOLS (filedata, section, & num_syms);
11848           if (symtab == NULL)
11849             continue;
11850
11851           if (section->sh_link == filedata->file_header.e_shstrndx)
11852             {
11853               strtab = filedata->string_table;
11854               strtab_size = filedata->string_table_length;
11855             }
11856           else if (section->sh_link < filedata->file_header.e_shnum)
11857             {
11858               Elf_Internal_Shdr * string_sec;
11859
11860               string_sec = filedata->section_headers + section->sh_link;
11861
11862               strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset,
11863                                           1, string_sec->sh_size,
11864                                           _("string table"));
11865               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11866             }
11867
11868           for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11869             {
11870               const char *version_string;
11871               enum versioned_symbol_info sym_info;
11872               unsigned short vna_other;
11873
11874               printf ("%6d: ", si);
11875               print_vma (psym->st_value, LONG_HEX);
11876               putchar (' ');
11877               print_vma (psym->st_size, DEC_5);
11878               printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11879               printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11880               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11881                 printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11882               else
11883                 {
11884                   unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11885
11886                   printf (" %-7s", get_symbol_visibility (vis));
11887                   /* Check to see if any other bits in the st_other field are set.
11888                      Note - displaying this information disrupts the layout of the
11889                      table being generated, but for the moment this case is very rare.  */
11890                   if (psym->st_other ^ vis)
11891                     printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11892                 }
11893               printf (" %4s ", get_symbol_index_type (filedata, psym->st_shndx));
11894               print_symbol (25, psym->st_name < strtab_size
11895                             ? strtab + psym->st_name : _("<corrupt>"));
11896
11897               version_string
11898                 = get_symbol_version_string (filedata,
11899                                              section->sh_type == SHT_DYNSYM,
11900                                              strtab, strtab_size, si,
11901                                              psym, &sym_info, &vna_other);
11902               if (version_string)
11903                 {
11904                   if (sym_info == symbol_undefined)
11905                     printf ("@%s (%d)", version_string, vna_other);
11906                   else
11907                     printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11908                             version_string);
11909                 }
11910
11911               putchar ('\n');
11912
11913               if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
11914                   && si >= section->sh_info
11915                   /* Irix 5 and 6 MIPS binaries are known to ignore this requirement.  */
11916                   && filedata->file_header.e_machine != EM_MIPS
11917                   /* Solaris binaries have been found to violate this requirement as
11918                      well.  Not sure if this is a bug or an ABI requirement.  */
11919                   && filedata->file_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
11920                 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11921                       si, printable_section_name (filedata, section), section->sh_info);
11922             }
11923
11924           free (symtab);
11925           if (strtab != filedata->string_table)
11926             free (strtab);
11927         }
11928     }
11929   else if (do_syms)
11930     printf
11931       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11932
11933   if (do_histogram && buckets != NULL)
11934     {
11935       unsigned long * lengths;
11936       unsigned long * counts;
11937       unsigned long hn;
11938       bfd_vma si;
11939       unsigned long maxlength = 0;
11940       unsigned long nzero_counts = 0;
11941       unsigned long nsyms = 0;
11942       char *visited;
11943
11944       printf (ngettext ("\nHistogram for bucket list length "
11945                         "(total of %lu bucket):\n",
11946                         "\nHistogram for bucket list length "
11947                         "(total of %lu buckets):\n",
11948                         (unsigned long) nbuckets),
11949               (unsigned long) nbuckets);
11950
11951       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11952       if (lengths == NULL)
11953         {
11954           error (_("Out of memory allocating space for histogram buckets\n"));
11955           return FALSE;
11956         }
11957       visited = xcmalloc (nchains, 1);
11958       memset (visited, 0, nchains);
11959
11960       printf (_(" Length  Number     %% of total  Coverage\n"));
11961       for (hn = 0; hn < nbuckets; ++hn)
11962         {
11963           for (si = buckets[hn]; si > 0; si = chains[si])
11964             {
11965               ++nsyms;
11966               if (maxlength < ++lengths[hn])
11967                 ++maxlength;
11968               if (si >= nchains || visited[si])
11969                 {
11970                   error (_("histogram chain is corrupt\n"));
11971                   break;
11972                 }
11973               visited[si] = 1;
11974             }
11975         }
11976       free (visited);
11977
11978       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11979       if (counts == NULL)
11980         {
11981           free (lengths);
11982           error (_("Out of memory allocating space for histogram counts\n"));
11983           return FALSE;
11984         }
11985
11986       for (hn = 0; hn < nbuckets; ++hn)
11987         ++counts[lengths[hn]];
11988
11989       if (nbuckets > 0)
11990         {
11991           unsigned long i;
11992           printf ("      0  %-10lu (%5.1f%%)\n",
11993                   counts[0], (counts[0] * 100.0) / nbuckets);
11994           for (i = 1; i <= maxlength; ++i)
11995             {
11996               nzero_counts += counts[i] * i;
11997               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
11998                       i, counts[i], (counts[i] * 100.0) / nbuckets,
11999                       (nzero_counts * 100.0) / nsyms);
12000             }
12001         }
12002
12003       free (counts);
12004       free (lengths);
12005     }
12006
12007   if (buckets != NULL)
12008     {
12009       free (buckets);
12010       free (chains);
12011     }
12012
12013   if (do_histogram && gnubuckets != NULL)
12014     {
12015       unsigned long * lengths;
12016       unsigned long * counts;
12017       unsigned long hn;
12018       unsigned long maxlength = 0;
12019       unsigned long nzero_counts = 0;
12020       unsigned long nsyms = 0;
12021
12022       printf (ngettext ("\nHistogram for `.gnu.hash' bucket list length "
12023                         "(total of %lu bucket):\n",
12024                         "\nHistogram for `.gnu.hash' bucket list length "
12025                         "(total of %lu buckets):\n",
12026                         (unsigned long) ngnubuckets),
12027               (unsigned long) ngnubuckets);
12028
12029       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
12030       if (lengths == NULL)
12031         {
12032           error (_("Out of memory allocating space for gnu histogram buckets\n"));
12033           return FALSE;
12034         }
12035
12036       printf (_(" Length  Number     %% of total  Coverage\n"));
12037
12038       for (hn = 0; hn < ngnubuckets; ++hn)
12039         if (gnubuckets[hn] != 0)
12040           {
12041             bfd_vma off, length = 1;
12042
12043             for (off = gnubuckets[hn] - gnusymidx;
12044                  /* PR 17531 file: 010-77222-0.004.  */
12045                  off < ngnuchains && (gnuchains[off] & 1) == 0;
12046                  ++off)
12047               ++length;
12048             lengths[hn] = length;
12049             if (length > maxlength)
12050               maxlength = length;
12051             nsyms += length;
12052           }
12053
12054       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
12055       if (counts == NULL)
12056         {
12057           free (lengths);
12058           error (_("Out of memory allocating space for gnu histogram counts\n"));
12059           return FALSE;
12060         }
12061
12062       for (hn = 0; hn < ngnubuckets; ++hn)
12063         ++counts[lengths[hn]];
12064
12065       if (ngnubuckets > 0)
12066         {
12067           unsigned long j;
12068           printf ("      0  %-10lu (%5.1f%%)\n",
12069                   counts[0], (counts[0] * 100.0) / ngnubuckets);
12070           for (j = 1; j <= maxlength; ++j)
12071             {
12072               nzero_counts += counts[j] * j;
12073               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
12074                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
12075                       (nzero_counts * 100.0) / nsyms);
12076             }
12077         }
12078
12079       free (counts);
12080       free (lengths);
12081       free (gnubuckets);
12082       free (gnuchains);
12083     }
12084
12085   return TRUE;
12086 }
12087
12088 static bfd_boolean
12089 process_syminfo (Filedata * filedata ATTRIBUTE_UNUSED)
12090 {
12091   unsigned int i;
12092
12093   if (dynamic_syminfo == NULL
12094       || !do_dynamic)
12095     /* No syminfo, this is ok.  */
12096     return TRUE;
12097
12098   /* There better should be a dynamic symbol section.  */
12099   if (dynamic_symbols == NULL || dynamic_strings == NULL)
12100     return FALSE;
12101
12102   if (dynamic_addr)
12103     printf (ngettext ("\nDynamic info segment at offset 0x%lx "
12104                       "contains %d entry:\n",
12105                       "\nDynamic info segment at offset 0x%lx "
12106                       "contains %d entries:\n",
12107                       dynamic_syminfo_nent),
12108             dynamic_syminfo_offset, dynamic_syminfo_nent);
12109
12110   printf (_(" Num: Name                           BoundTo     Flags\n"));
12111   for (i = 0; i < dynamic_syminfo_nent; ++i)
12112     {
12113       unsigned short int flags = dynamic_syminfo[i].si_flags;
12114
12115       printf ("%4d: ", i);
12116       if (i >= num_dynamic_syms)
12117         printf (_("<corrupt index>"));
12118       else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
12119         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
12120       else
12121         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
12122       putchar (' ');
12123
12124       switch (dynamic_syminfo[i].si_boundto)
12125         {
12126         case SYMINFO_BT_SELF:
12127           fputs ("SELF       ", stdout);
12128           break;
12129         case SYMINFO_BT_PARENT:
12130           fputs ("PARENT     ", stdout);
12131           break;
12132         default:
12133           if (dynamic_syminfo[i].si_boundto > 0
12134               && dynamic_syminfo[i].si_boundto < dynamic_nent
12135               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
12136             {
12137               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
12138               putchar (' ' );
12139             }
12140           else
12141             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
12142           break;
12143         }
12144
12145       if (flags & SYMINFO_FLG_DIRECT)
12146         printf (" DIRECT");
12147       if (flags & SYMINFO_FLG_PASSTHRU)
12148         printf (" PASSTHRU");
12149       if (flags & SYMINFO_FLG_COPY)
12150         printf (" COPY");
12151       if (flags & SYMINFO_FLG_LAZYLOAD)
12152         printf (" LAZYLOAD");
12153
12154       puts ("");
12155     }
12156
12157   return TRUE;
12158 }
12159
12160 #define IN_RANGE(START,END,ADDR,OFF)            \
12161   (((ADDR) >= (START)) && ((ADDR) + (OFF) < (END)))
12162
12163 /* Check to see if the given reloc needs to be handled in a target specific
12164    manner.  If so then process the reloc and return TRUE otherwise return
12165    FALSE.
12166
12167    If called with reloc == NULL, then this is a signal that reloc processing
12168    for the current section has finished, and any saved state should be
12169    discarded.  */
12170
12171 static bfd_boolean
12172 target_specific_reloc_handling (Filedata *           filedata,
12173                                 Elf_Internal_Rela *  reloc,
12174                                 unsigned char *      start,
12175                                 unsigned char *      end,
12176                                 Elf_Internal_Sym *   symtab,
12177                                 unsigned long        num_syms)
12178 {
12179   unsigned int reloc_type = 0;
12180   unsigned long sym_index = 0;
12181
12182   if (reloc)
12183     {
12184       reloc_type = get_reloc_type (filedata, reloc->r_info);
12185       sym_index = get_reloc_symindex (reloc->r_info);
12186     }
12187
12188   switch (filedata->file_header.e_machine)
12189     {
12190     case EM_MSP430:
12191     case EM_MSP430_OLD:
12192       {
12193         static Elf_Internal_Sym * saved_sym = NULL;
12194
12195         if (reloc == NULL)
12196           {
12197             saved_sym = NULL;
12198             return TRUE;
12199           }
12200
12201         switch (reloc_type)
12202           {
12203           case 10: /* R_MSP430_SYM_DIFF */
12204             if (uses_msp430x_relocs (filedata))
12205               break;
12206             /* Fall through.  */
12207           case 21: /* R_MSP430X_SYM_DIFF */
12208             /* PR 21139.  */
12209             if (sym_index >= num_syms)
12210               error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
12211                      sym_index);
12212             else
12213               saved_sym = symtab + sym_index;
12214             return TRUE;
12215
12216           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
12217           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
12218             goto handle_sym_diff;
12219
12220           case 5: /* R_MSP430_16_BYTE */
12221           case 9: /* R_MSP430_8 */
12222             if (uses_msp430x_relocs (filedata))
12223               break;
12224             goto handle_sym_diff;
12225
12226           case 2: /* R_MSP430_ABS16 */
12227           case 15: /* R_MSP430X_ABS16 */
12228             if (! uses_msp430x_relocs (filedata))
12229               break;
12230             goto handle_sym_diff;
12231
12232           handle_sym_diff:
12233             if (saved_sym != NULL)
12234               {
12235                 int reloc_size = reloc_type == 1 ? 4 : 2;
12236                 bfd_vma value;
12237
12238                 if (sym_index >= num_syms)
12239                   error (_("MSP430 reloc contains invalid symbol index %lu\n"),
12240                          sym_index);
12241                 else
12242                   {
12243                     value = reloc->r_addend + (symtab[sym_index].st_value
12244                                                - saved_sym->st_value);
12245
12246                     if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12247                       byte_put (start + reloc->r_offset, value, reloc_size);
12248                     else
12249                       /* PR 21137 */
12250                       error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
12251                              (long) reloc->r_offset);
12252                   }
12253
12254                 saved_sym = NULL;
12255                 return TRUE;
12256               }
12257             break;
12258
12259           default:
12260             if (saved_sym != NULL)
12261               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
12262             break;
12263           }
12264         break;
12265       }
12266
12267     case EM_MN10300:
12268     case EM_CYGNUS_MN10300:
12269       {
12270         static Elf_Internal_Sym * saved_sym = NULL;
12271
12272         if (reloc == NULL)
12273           {
12274             saved_sym = NULL;
12275             return TRUE;
12276           }
12277
12278         switch (reloc_type)
12279           {
12280           case 34: /* R_MN10300_ALIGN */
12281             return TRUE;
12282           case 33: /* R_MN10300_SYM_DIFF */
12283             if (sym_index >= num_syms)
12284               error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
12285                      sym_index);
12286             else
12287               saved_sym = symtab + sym_index;
12288             return TRUE;
12289
12290           case 1: /* R_MN10300_32 */
12291           case 2: /* R_MN10300_16 */
12292             if (saved_sym != NULL)
12293               {
12294                 int reloc_size = reloc_type == 1 ? 4 : 2;
12295                 bfd_vma value;
12296
12297                 if (sym_index >= num_syms)
12298                   error (_("MN10300 reloc contains invalid symbol index %lu\n"),
12299                          sym_index);
12300                 else
12301                   {
12302                     value = reloc->r_addend + (symtab[sym_index].st_value
12303                                                - saved_sym->st_value);
12304
12305                     if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12306                       byte_put (start + reloc->r_offset, value, reloc_size);
12307                     else
12308                       error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
12309                              (long) reloc->r_offset);
12310                   }
12311
12312                 saved_sym = NULL;
12313                 return TRUE;
12314               }
12315             break;
12316           default:
12317             if (saved_sym != NULL)
12318               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
12319             break;
12320           }
12321         break;
12322       }
12323
12324     case EM_RL78:
12325       {
12326         static bfd_vma saved_sym1 = 0;
12327         static bfd_vma saved_sym2 = 0;
12328         static bfd_vma value;
12329
12330         if (reloc == NULL)
12331           {
12332             saved_sym1 = saved_sym2 = 0;
12333             return TRUE;
12334           }
12335
12336         switch (reloc_type)
12337           {
12338           case 0x80: /* R_RL78_SYM.  */
12339             saved_sym1 = saved_sym2;
12340             if (sym_index >= num_syms)
12341               error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
12342                      sym_index);
12343             else
12344               {
12345                 saved_sym2 = symtab[sym_index].st_value;
12346                 saved_sym2 += reloc->r_addend;
12347               }
12348             return TRUE;
12349
12350           case 0x83: /* R_RL78_OPsub.  */
12351             value = saved_sym1 - saved_sym2;
12352             saved_sym2 = saved_sym1 = 0;
12353             return TRUE;
12354             break;
12355
12356           case 0x41: /* R_RL78_ABS32.  */
12357             if (IN_RANGE (start, end, start + reloc->r_offset, 4))
12358               byte_put (start + reloc->r_offset, value, 4);
12359             else
12360               error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12361                      (long) reloc->r_offset);
12362             value = 0;
12363             return TRUE;
12364
12365           case 0x43: /* R_RL78_ABS16.  */
12366             if (IN_RANGE (start, end, start + reloc->r_offset, 2))
12367               byte_put (start + reloc->r_offset, value, 2);
12368             else
12369               error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12370                      (long) reloc->r_offset);
12371             value = 0;
12372             return TRUE;
12373
12374           default:
12375             break;
12376           }
12377         break;
12378       }
12379     }
12380
12381   return FALSE;
12382 }
12383
12384 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
12385    DWARF debug sections.  This is a target specific test.  Note - we do not
12386    go through the whole including-target-headers-multiple-times route, (as
12387    we have already done with <elf/h8.h>) because this would become very
12388    messy and even then this function would have to contain target specific
12389    information (the names of the relocs instead of their numeric values).
12390    FIXME: This is not the correct way to solve this problem.  The proper way
12391    is to have target specific reloc sizing and typing functions created by
12392    the reloc-macros.h header, in the same way that it already creates the
12393    reloc naming functions.  */
12394
12395 static bfd_boolean
12396 is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12397 {
12398   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12399   switch (filedata->file_header.e_machine)
12400     {
12401     case EM_386:
12402     case EM_IAMCU:
12403       return reloc_type == 1; /* R_386_32.  */
12404     case EM_68K:
12405       return reloc_type == 1; /* R_68K_32.  */
12406     case EM_860:
12407       return reloc_type == 1; /* R_860_32.  */
12408     case EM_960:
12409       return reloc_type == 2; /* R_960_32.  */
12410     case EM_AARCH64:
12411       return (reloc_type == 258
12412               || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
12413     case EM_ADAPTEVA_EPIPHANY:
12414       return reloc_type == 3;
12415     case EM_ALPHA:
12416       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
12417     case EM_ARC:
12418       return reloc_type == 1; /* R_ARC_32.  */
12419     case EM_ARC_COMPACT:
12420     case EM_ARC_COMPACT2:
12421       return reloc_type == 4; /* R_ARC_32.  */
12422     case EM_ARM:
12423       return reloc_type == 2; /* R_ARM_ABS32 */
12424     case EM_AVR_OLD:
12425     case EM_AVR:
12426       return reloc_type == 1;
12427     case EM_BLACKFIN:
12428       return reloc_type == 0x12; /* R_byte4_data.  */
12429     case EM_CRIS:
12430       return reloc_type == 3; /* R_CRIS_32.  */
12431     case EM_CR16:
12432       return reloc_type == 3; /* R_CR16_NUM32.  */
12433     case EM_CRX:
12434       return reloc_type == 15; /* R_CRX_NUM32.  */
12435     case EM_CSKY:
12436       return reloc_type == 1; /* R_CKCORE_ADDR32.  */
12437     case EM_CYGNUS_FRV:
12438       return reloc_type == 1;
12439     case EM_CYGNUS_D10V:
12440     case EM_D10V:
12441       return reloc_type == 6; /* R_D10V_32.  */
12442     case EM_CYGNUS_D30V:
12443     case EM_D30V:
12444       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
12445     case EM_DLX:
12446       return reloc_type == 3; /* R_DLX_RELOC_32.  */
12447     case EM_CYGNUS_FR30:
12448     case EM_FR30:
12449       return reloc_type == 3; /* R_FR30_32.  */
12450     case EM_FT32:
12451       return reloc_type == 1; /* R_FT32_32.  */
12452     case EM_H8S:
12453     case EM_H8_300:
12454     case EM_H8_300H:
12455       return reloc_type == 1; /* R_H8_DIR32.  */
12456     case EM_IA_64:
12457       return (reloc_type == 0x64    /* R_IA64_SECREL32MSB.  */
12458               || reloc_type == 0x65 /* R_IA64_SECREL32LSB.  */
12459               || reloc_type == 0x24 /* R_IA64_DIR32MSB.  */
12460               || reloc_type == 0x25 /* R_IA64_DIR32LSB.  */);
12461     case EM_IP2K_OLD:
12462     case EM_IP2K:
12463       return reloc_type == 2; /* R_IP2K_32.  */
12464     case EM_IQ2000:
12465       return reloc_type == 2; /* R_IQ2000_32.  */
12466     case EM_LATTICEMICO32:
12467       return reloc_type == 3; /* R_LM32_32.  */
12468     case EM_M32C_OLD:
12469     case EM_M32C:
12470       return reloc_type == 3; /* R_M32C_32.  */
12471     case EM_M32R:
12472       return reloc_type == 34; /* R_M32R_32_RELA.  */
12473     case EM_68HC11:
12474     case EM_68HC12:
12475       return reloc_type == 6; /* R_M68HC11_32.  */
12476     case EM_S12Z:
12477       return reloc_type == 7 || /* R_S12Z_EXT32 */
12478         reloc_type == 6;        /* R_S12Z_CW32.  */
12479     case EM_MCORE:
12480       return reloc_type == 1; /* R_MCORE_ADDR32.  */
12481     case EM_CYGNUS_MEP:
12482       return reloc_type == 4; /* R_MEP_32.  */
12483     case EM_METAG:
12484       return reloc_type == 2; /* R_METAG_ADDR32.  */
12485     case EM_MICROBLAZE:
12486       return reloc_type == 1; /* R_MICROBLAZE_32.  */
12487     case EM_MIPS:
12488       return reloc_type == 2; /* R_MIPS_32.  */
12489     case EM_MMIX:
12490       return reloc_type == 4; /* R_MMIX_32.  */
12491     case EM_CYGNUS_MN10200:
12492     case EM_MN10200:
12493       return reloc_type == 1; /* R_MN10200_32.  */
12494     case EM_CYGNUS_MN10300:
12495     case EM_MN10300:
12496       return reloc_type == 1; /* R_MN10300_32.  */
12497     case EM_MOXIE:
12498       return reloc_type == 1; /* R_MOXIE_32.  */
12499     case EM_MSP430_OLD:
12500     case EM_MSP430:
12501       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
12502     case EM_MT:
12503       return reloc_type == 2; /* R_MT_32.  */
12504     case EM_NDS32:
12505       return reloc_type == 20; /* R_NDS32_RELA.  */
12506     case EM_ALTERA_NIOS2:
12507       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
12508     case EM_NIOS32:
12509       return reloc_type == 1; /* R_NIOS_32.  */
12510     case EM_OR1K:
12511       return reloc_type == 1; /* R_OR1K_32.  */
12512     case EM_PARISC:
12513       return (reloc_type == 1 /* R_PARISC_DIR32.  */          
12514               || reloc_type == 2 /* R_PARISC_DIR21L.  */
12515               || reloc_type == 41); /* R_PARISC_SECREL32.  */
12516     case EM_PJ:
12517     case EM_PJ_OLD:
12518       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
12519     case EM_PPC64:
12520       return reloc_type == 1; /* R_PPC64_ADDR32.  */
12521     case EM_PPC:
12522       return reloc_type == 1; /* R_PPC_ADDR32.  */
12523     case EM_TI_PRU:
12524       return reloc_type == 11; /* R_PRU_BFD_RELOC_32.  */
12525     case EM_RISCV:
12526       return reloc_type == 1; /* R_RISCV_32.  */
12527     case EM_RL78:
12528       return reloc_type == 1; /* R_RL78_DIR32.  */
12529     case EM_RX:
12530       return reloc_type == 1; /* R_RX_DIR32.  */
12531     case EM_S370:
12532       return reloc_type == 1; /* R_I370_ADDR31.  */
12533     case EM_S390_OLD:
12534     case EM_S390:
12535       return reloc_type == 4; /* R_S390_32.  */
12536     case EM_SCORE:
12537       return reloc_type == 8; /* R_SCORE_ABS32.  */
12538     case EM_SH:
12539       return reloc_type == 1; /* R_SH_DIR32.  */
12540     case EM_SPARC32PLUS:
12541     case EM_SPARCV9:
12542     case EM_SPARC:
12543       return reloc_type == 3 /* R_SPARC_32.  */
12544         || reloc_type == 23; /* R_SPARC_UA32.  */
12545     case EM_SPU:
12546       return reloc_type == 6; /* R_SPU_ADDR32 */
12547     case EM_TI_C6000:
12548       return reloc_type == 1; /* R_C6000_ABS32.  */
12549     case EM_TILEGX:
12550       return reloc_type == 2; /* R_TILEGX_32.  */
12551     case EM_TILEPRO:
12552       return reloc_type == 1; /* R_TILEPRO_32.  */
12553     case EM_CYGNUS_V850:
12554     case EM_V850:
12555       return reloc_type == 6; /* R_V850_ABS32.  */
12556     case EM_V800:
12557       return reloc_type == 0x33; /* R_V810_WORD.  */
12558     case EM_VAX:
12559       return reloc_type == 1; /* R_VAX_32.  */
12560     case EM_VISIUM:
12561       return reloc_type == 3;  /* R_VISIUM_32. */
12562     case EM_WEBASSEMBLY:
12563       return reloc_type == 1;  /* R_WASM32_32.  */
12564     case EM_X86_64:
12565     case EM_L1OM:
12566     case EM_K1OM:
12567       return reloc_type == 10; /* R_X86_64_32.  */
12568     case EM_XC16X:
12569     case EM_C166:
12570       return reloc_type == 3; /* R_XC16C_ABS_32.  */
12571     case EM_XGATE:
12572       return reloc_type == 4; /* R_XGATE_32.  */
12573     case EM_XSTORMY16:
12574       return reloc_type == 1; /* R_XSTROMY16_32.  */
12575     case EM_XTENSA_OLD:
12576     case EM_XTENSA:
12577       return reloc_type == 1; /* R_XTENSA_32.  */
12578     default:
12579       {
12580         static unsigned int prev_warn = 0;
12581
12582         /* Avoid repeating the same warning multiple times.  */
12583         if (prev_warn != filedata->file_header.e_machine)
12584           error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
12585                  filedata->file_header.e_machine);
12586         prev_warn = filedata->file_header.e_machine;
12587         return FALSE;
12588       }
12589     }
12590 }
12591
12592 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12593    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
12594
12595 static bfd_boolean
12596 is_32bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12597 {
12598   switch (filedata->file_header.e_machine)
12599   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12600     {
12601     case EM_386:
12602     case EM_IAMCU:
12603       return reloc_type == 2;  /* R_386_PC32.  */
12604     case EM_68K:
12605       return reloc_type == 4;  /* R_68K_PC32.  */
12606     case EM_AARCH64:
12607       return reloc_type == 261; /* R_AARCH64_PREL32 */
12608     case EM_ADAPTEVA_EPIPHANY:
12609       return reloc_type == 6;
12610     case EM_ALPHA:
12611       return reloc_type == 10; /* R_ALPHA_SREL32.  */
12612     case EM_ARC_COMPACT:
12613     case EM_ARC_COMPACT2:
12614       return reloc_type == 49; /* R_ARC_32_PCREL.  */
12615     case EM_ARM:
12616       return reloc_type == 3;  /* R_ARM_REL32 */
12617     case EM_AVR_OLD:
12618     case EM_AVR:
12619       return reloc_type == 36; /* R_AVR_32_PCREL.  */
12620     case EM_MICROBLAZE:
12621       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
12622     case EM_OR1K:
12623       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
12624     case EM_PARISC:
12625       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
12626     case EM_PPC:
12627       return reloc_type == 26; /* R_PPC_REL32.  */
12628     case EM_PPC64:
12629       return reloc_type == 26; /* R_PPC64_REL32.  */
12630     case EM_RISCV:
12631       return reloc_type == 57;  /* R_RISCV_32_PCREL.  */
12632     case EM_S390_OLD:
12633     case EM_S390:
12634       return reloc_type == 5;  /* R_390_PC32.  */
12635     case EM_SH:
12636       return reloc_type == 2;  /* R_SH_REL32.  */
12637     case EM_SPARC32PLUS:
12638     case EM_SPARCV9:
12639     case EM_SPARC:
12640       return reloc_type == 6;  /* R_SPARC_DISP32.  */
12641     case EM_SPU:
12642       return reloc_type == 13; /* R_SPU_REL32.  */
12643     case EM_TILEGX:
12644       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
12645     case EM_TILEPRO:
12646       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
12647     case EM_VISIUM:
12648       return reloc_type == 6;  /* R_VISIUM_32_PCREL */
12649     case EM_X86_64:
12650     case EM_L1OM:
12651     case EM_K1OM:
12652       return reloc_type == 2;  /* R_X86_64_PC32.  */
12653     case EM_XTENSA_OLD:
12654     case EM_XTENSA:
12655       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
12656     default:
12657       /* Do not abort or issue an error message here.  Not all targets use
12658          pc-relative 32-bit relocs in their DWARF debug information and we
12659          have already tested for target coverage in is_32bit_abs_reloc.  A
12660          more helpful warning message will be generated by apply_relocations
12661          anyway, so just return.  */
12662       return FALSE;
12663     }
12664 }
12665
12666 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12667    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
12668
12669 static bfd_boolean
12670 is_64bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12671 {
12672   switch (filedata->file_header.e_machine)
12673     {
12674     case EM_AARCH64:
12675       return reloc_type == 257; /* R_AARCH64_ABS64.  */
12676     case EM_ALPHA:
12677       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
12678     case EM_IA_64:
12679       return (reloc_type == 0x26    /* R_IA64_DIR64MSB.  */
12680               || reloc_type == 0x27 /* R_IA64_DIR64LSB.  */);
12681     case EM_PARISC:
12682       return reloc_type == 80; /* R_PARISC_DIR64.  */
12683     case EM_PPC64:
12684       return reloc_type == 38; /* R_PPC64_ADDR64.  */
12685     case EM_RISCV:
12686       return reloc_type == 2; /* R_RISCV_64.  */
12687     case EM_SPARC32PLUS:
12688     case EM_SPARCV9:
12689     case EM_SPARC:
12690       return reloc_type == 32 /* R_SPARC_64.  */
12691         || reloc_type == 54; /* R_SPARC_UA64.  */
12692     case EM_X86_64:
12693     case EM_L1OM:
12694     case EM_K1OM:
12695       return reloc_type == 1; /* R_X86_64_64.  */
12696     case EM_S390_OLD:
12697     case EM_S390:
12698       return reloc_type == 22;  /* R_S390_64.  */
12699     case EM_TILEGX:
12700       return reloc_type == 1; /* R_TILEGX_64.  */
12701     case EM_MIPS:
12702       return reloc_type == 18;  /* R_MIPS_64.  */
12703     default:
12704       return FALSE;
12705     }
12706 }
12707
12708 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12709    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
12710
12711 static bfd_boolean
12712 is_64bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12713 {
12714   switch (filedata->file_header.e_machine)
12715     {
12716     case EM_AARCH64:
12717       return reloc_type == 260; /* R_AARCH64_PREL64.  */
12718     case EM_ALPHA:
12719       return reloc_type == 11; /* R_ALPHA_SREL64.  */
12720     case EM_IA_64:
12721       return (reloc_type == 0x4e    /* R_IA64_PCREL64MSB.  */
12722               || reloc_type == 0x4f /* R_IA64_PCREL64LSB.  */);
12723     case EM_PARISC:
12724       return reloc_type == 72; /* R_PARISC_PCREL64.  */
12725     case EM_PPC64:
12726       return reloc_type == 44; /* R_PPC64_REL64.  */
12727     case EM_SPARC32PLUS:
12728     case EM_SPARCV9:
12729     case EM_SPARC:
12730       return reloc_type == 46; /* R_SPARC_DISP64.  */
12731     case EM_X86_64:
12732     case EM_L1OM:
12733     case EM_K1OM:
12734       return reloc_type == 24; /* R_X86_64_PC64.  */
12735     case EM_S390_OLD:
12736     case EM_S390:
12737       return reloc_type == 23;  /* R_S390_PC64.  */
12738     case EM_TILEGX:
12739       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
12740     default:
12741       return FALSE;
12742     }
12743 }
12744
12745 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12746    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
12747
12748 static bfd_boolean
12749 is_24bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12750 {
12751   switch (filedata->file_header.e_machine)
12752     {
12753     case EM_CYGNUS_MN10200:
12754     case EM_MN10200:
12755       return reloc_type == 4; /* R_MN10200_24.  */
12756     case EM_FT32:
12757       return reloc_type == 5; /* R_FT32_20.  */
12758     default:
12759       return FALSE;
12760     }
12761 }
12762
12763 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12764    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
12765
12766 static bfd_boolean
12767 is_16bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12768 {
12769   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12770   switch (filedata->file_header.e_machine)
12771     {
12772     case EM_ARC:
12773     case EM_ARC_COMPACT:
12774     case EM_ARC_COMPACT2:
12775       return reloc_type == 2; /* R_ARC_16.  */
12776     case EM_ADAPTEVA_EPIPHANY:
12777       return reloc_type == 5;
12778     case EM_AVR_OLD:
12779     case EM_AVR:
12780       return reloc_type == 4; /* R_AVR_16.  */
12781     case EM_CYGNUS_D10V:
12782     case EM_D10V:
12783       return reloc_type == 3; /* R_D10V_16.  */
12784     case EM_FT32:
12785       return reloc_type == 2; /* R_FT32_16.  */
12786     case EM_H8S:
12787     case EM_H8_300:
12788     case EM_H8_300H:
12789       return reloc_type == R_H8_DIR16;
12790     case EM_IP2K_OLD:
12791     case EM_IP2K:
12792       return reloc_type == 1; /* R_IP2K_16.  */
12793     case EM_M32C_OLD:
12794     case EM_M32C:
12795       return reloc_type == 1; /* R_M32C_16 */
12796     case EM_CYGNUS_MN10200:
12797     case EM_MN10200:
12798       return reloc_type == 2; /* R_MN10200_16.  */
12799     case EM_CYGNUS_MN10300:
12800     case EM_MN10300:
12801       return reloc_type == 2; /* R_MN10300_16.  */
12802     case EM_MSP430:
12803       if (uses_msp430x_relocs (filedata))
12804         return reloc_type == 2; /* R_MSP430_ABS16.  */
12805       /* Fall through.  */
12806     case EM_MSP430_OLD:
12807       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
12808     case EM_NDS32:
12809       return reloc_type == 19; /* R_NDS32_RELA.  */
12810     case EM_ALTERA_NIOS2:
12811       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
12812     case EM_NIOS32:
12813       return reloc_type == 9; /* R_NIOS_16.  */
12814     case EM_OR1K:
12815       return reloc_type == 2; /* R_OR1K_16.  */
12816     case EM_RISCV:
12817       return reloc_type == 55; /* R_RISCV_SET16.  */
12818     case EM_TI_PRU:
12819       return reloc_type == 8; /* R_PRU_BFD_RELOC_16.  */
12820     case EM_TI_C6000:
12821       return reloc_type == 2; /* R_C6000_ABS16.  */
12822     case EM_VISIUM:
12823       return reloc_type == 2; /* R_VISIUM_16. */
12824     case EM_XC16X:
12825     case EM_C166:
12826       return reloc_type == 2; /* R_XC16C_ABS_16.  */
12827     case EM_XGATE:
12828       return reloc_type == 3; /* R_XGATE_16.  */
12829     default:
12830       return FALSE;
12831     }
12832 }
12833
12834 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12835    a 8-bit absolute RELA relocation used in DWARF debug sections.  */
12836
12837 static bfd_boolean
12838 is_8bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12839 {
12840   switch (filedata->file_header.e_machine)
12841     {
12842     case EM_RISCV:
12843       return reloc_type == 54; /* R_RISCV_SET8.  */
12844     default:
12845       return FALSE;
12846     }
12847 }
12848
12849 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12850    a 6-bit absolute RELA relocation used in DWARF debug sections.  */
12851
12852 static bfd_boolean
12853 is_6bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12854 {
12855   switch (filedata->file_header.e_machine)
12856     {
12857     case EM_RISCV:
12858       return reloc_type == 53; /* R_RISCV_SET6.  */
12859     default:
12860       return FALSE;
12861     }
12862 }
12863
12864 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12865    a 32-bit inplace add RELA relocation used in DWARF debug sections.  */
12866
12867 static bfd_boolean
12868 is_32bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12869 {
12870   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12871   switch (filedata->file_header.e_machine)
12872     {
12873     case EM_RISCV:
12874       return reloc_type == 35; /* R_RISCV_ADD32.  */
12875     default:
12876       return FALSE;
12877     }
12878 }
12879
12880 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12881    a 32-bit inplace sub RELA relocation used in DWARF debug sections.  */
12882
12883 static bfd_boolean
12884 is_32bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12885 {
12886   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12887   switch (filedata->file_header.e_machine)
12888     {
12889     case EM_RISCV:
12890       return reloc_type == 39; /* R_RISCV_SUB32.  */
12891     default:
12892       return FALSE;
12893     }
12894 }
12895
12896 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12897    a 64-bit inplace add RELA relocation used in DWARF debug sections.  */
12898
12899 static bfd_boolean
12900 is_64bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12901 {
12902   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12903   switch (filedata->file_header.e_machine)
12904     {
12905     case EM_RISCV:
12906       return reloc_type == 36; /* R_RISCV_ADD64.  */
12907     default:
12908       return FALSE;
12909     }
12910 }
12911
12912 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12913    a 64-bit inplace sub RELA relocation used in DWARF debug sections.  */
12914
12915 static bfd_boolean
12916 is_64bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12917 {
12918   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12919   switch (filedata->file_header.e_machine)
12920     {
12921     case EM_RISCV:
12922       return reloc_type == 40; /* R_RISCV_SUB64.  */
12923     default:
12924       return FALSE;
12925     }
12926 }
12927
12928 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12929    a 16-bit inplace add RELA relocation used in DWARF debug sections.  */
12930
12931 static bfd_boolean
12932 is_16bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12933 {
12934   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12935   switch (filedata->file_header.e_machine)
12936     {
12937     case EM_RISCV:
12938       return reloc_type == 34; /* R_RISCV_ADD16.  */
12939     default:
12940       return FALSE;
12941     }
12942 }
12943
12944 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12945    a 16-bit inplace sub RELA relocation used in DWARF debug sections.  */
12946
12947 static bfd_boolean
12948 is_16bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12949 {
12950   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12951   switch (filedata->file_header.e_machine)
12952     {
12953     case EM_RISCV:
12954       return reloc_type == 38; /* R_RISCV_SUB16.  */
12955     default:
12956       return FALSE;
12957     }
12958 }
12959
12960 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12961    a 8-bit inplace add RELA relocation used in DWARF debug sections.  */
12962
12963 static bfd_boolean
12964 is_8bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12965 {
12966   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12967   switch (filedata->file_header.e_machine)
12968     {
12969     case EM_RISCV:
12970       return reloc_type == 33; /* R_RISCV_ADD8.  */
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 8-bit inplace sub RELA relocation used in DWARF debug sections.  */
12978
12979 static bfd_boolean
12980 is_8bit_inplace_sub_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 == 37; /* R_RISCV_SUB8.  */
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 6-bit inplace sub RELA relocation used in DWARF debug sections.  */
12994
12995 static bfd_boolean
12996 is_6bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12997 {
12998   switch (filedata->file_header.e_machine)
12999     {
13000     case EM_RISCV:
13001       return reloc_type == 52; /* R_RISCV_SUB6.  */
13002     default:
13003       return FALSE;
13004     }
13005 }
13006
13007 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
13008    relocation entries (possibly formerly used for SHT_GROUP sections).  */
13009
13010 static bfd_boolean
13011 is_none_reloc (Filedata * filedata, unsigned int reloc_type)
13012 {
13013   switch (filedata->file_header.e_machine)
13014     {
13015     case EM_386:     /* R_386_NONE.  */
13016     case EM_68K:     /* R_68K_NONE.  */
13017     case EM_ADAPTEVA_EPIPHANY:
13018     case EM_ALPHA:   /* R_ALPHA_NONE.  */
13019     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
13020     case EM_ARC:     /* R_ARC_NONE.  */
13021     case EM_ARC_COMPACT2: /* R_ARC_NONE.  */
13022     case EM_ARC_COMPACT: /* R_ARC_NONE.  */
13023     case EM_ARM:     /* R_ARM_NONE.  */
13024     case EM_C166:    /* R_XC16X_NONE.  */
13025     case EM_CRIS:    /* R_CRIS_NONE.  */
13026     case EM_FT32:    /* R_FT32_NONE.  */
13027     case EM_IA_64:   /* R_IA64_NONE.  */
13028     case EM_K1OM:    /* R_X86_64_NONE.  */
13029     case EM_L1OM:    /* R_X86_64_NONE.  */
13030     case EM_M32R:    /* R_M32R_NONE.  */
13031     case EM_MIPS:    /* R_MIPS_NONE.  */
13032     case EM_MN10300: /* R_MN10300_NONE.  */
13033     case EM_MOXIE:   /* R_MOXIE_NONE.  */
13034     case EM_NIOS32:  /* R_NIOS_NONE.  */
13035     case EM_OR1K:    /* R_OR1K_NONE. */
13036     case EM_PARISC:  /* R_PARISC_NONE.  */
13037     case EM_PPC64:   /* R_PPC64_NONE.  */
13038     case EM_PPC:     /* R_PPC_NONE.  */
13039     case EM_RISCV:   /* R_RISCV_NONE.  */
13040     case EM_S390:    /* R_390_NONE.  */
13041     case EM_S390_OLD:
13042     case EM_SH:      /* R_SH_NONE.  */
13043     case EM_SPARC32PLUS:
13044     case EM_SPARC:   /* R_SPARC_NONE.  */
13045     case EM_SPARCV9:
13046     case EM_TILEGX:  /* R_TILEGX_NONE.  */
13047     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
13048     case EM_TI_C6000:/* R_C6000_NONE.  */
13049     case EM_X86_64:  /* R_X86_64_NONE.  */
13050     case EM_XC16X:
13051     case EM_WEBASSEMBLY: /* R_WASM32_NONE.  */
13052       return reloc_type == 0;
13053
13054     case EM_AARCH64:
13055       return reloc_type == 0 || reloc_type == 256;
13056     case EM_AVR_OLD:
13057     case EM_AVR:
13058       return (reloc_type == 0 /* R_AVR_NONE.  */
13059               || reloc_type == 30 /* R_AVR_DIFF8.  */
13060               || reloc_type == 31 /* R_AVR_DIFF16.  */
13061               || reloc_type == 32 /* R_AVR_DIFF32.  */);
13062     case EM_METAG:
13063       return reloc_type == 3; /* R_METAG_NONE.  */
13064     case EM_NDS32:
13065       return (reloc_type == 0       /* R_XTENSA_NONE.  */
13066               || reloc_type == 204  /* R_NDS32_DIFF8.  */
13067               || reloc_type == 205  /* R_NDS32_DIFF16.  */
13068               || reloc_type == 206  /* R_NDS32_DIFF32.  */
13069               || reloc_type == 207  /* R_NDS32_ULEB128.  */);
13070     case EM_TI_PRU:
13071       return (reloc_type == 0       /* R_PRU_NONE.  */
13072               || reloc_type == 65   /* R_PRU_DIFF8.  */
13073               || reloc_type == 66   /* R_PRU_DIFF16.  */
13074               || reloc_type == 67   /* R_PRU_DIFF32.  */);
13075     case EM_XTENSA_OLD:
13076     case EM_XTENSA:
13077       return (reloc_type == 0      /* R_XTENSA_NONE.  */
13078               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
13079               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
13080               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
13081     }
13082   return FALSE;
13083 }
13084
13085 /* Returns TRUE if there is a relocation against
13086    section NAME at OFFSET bytes.  */
13087
13088 bfd_boolean
13089 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
13090 {
13091   Elf_Internal_Rela * relocs;
13092   Elf_Internal_Rela * rp;
13093
13094   if (dsec == NULL || dsec->reloc_info == NULL)
13095     return FALSE;
13096
13097   relocs = (Elf_Internal_Rela *) dsec->reloc_info;
13098
13099   for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
13100     if (rp->r_offset == offset)
13101       return TRUE;
13102
13103    return FALSE;
13104 }
13105
13106 /* Apply relocations to a section.
13107    Returns TRUE upon success, FALSE otherwise.
13108    If RELOCS_RETURN is non-NULL then it is set to point to the loaded relocs.
13109    It is then the caller's responsibility to free them.  NUM_RELOCS_RETURN
13110    will be set to the number of relocs loaded.
13111
13112    Note: So far support has been added only for those relocations
13113    which can be found in debug sections. FIXME: Add support for
13114    more relocations ?  */
13115
13116 static bfd_boolean
13117 apply_relocations (Filedata *                 filedata,
13118                    const Elf_Internal_Shdr *  section,
13119                    unsigned char *            start,
13120                    bfd_size_type              size,
13121                    void **                    relocs_return,
13122                    unsigned long *            num_relocs_return)
13123 {
13124   Elf_Internal_Shdr * relsec;
13125   unsigned char * end = start + size;
13126
13127   if (relocs_return != NULL)
13128     {
13129       * (Elf_Internal_Rela **) relocs_return = NULL;
13130       * num_relocs_return = 0;
13131     }
13132
13133   if (filedata->file_header.e_type != ET_REL)
13134     /* No relocs to apply.  */
13135     return TRUE;
13136
13137   /* Find the reloc section associated with the section.  */
13138   for (relsec = filedata->section_headers;
13139        relsec < filedata->section_headers + filedata->file_header.e_shnum;
13140        ++relsec)
13141     {
13142       bfd_boolean is_rela;
13143       unsigned long num_relocs;
13144       Elf_Internal_Rela * relocs;
13145       Elf_Internal_Rela * rp;
13146       Elf_Internal_Shdr * symsec;
13147       Elf_Internal_Sym * symtab;
13148       unsigned long num_syms;
13149       Elf_Internal_Sym * sym;
13150
13151       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13152           || relsec->sh_info >= filedata->file_header.e_shnum
13153           || filedata->section_headers + relsec->sh_info != section
13154           || relsec->sh_size == 0
13155           || relsec->sh_link >= filedata->file_header.e_shnum)
13156         continue;
13157
13158       is_rela = relsec->sh_type == SHT_RELA;
13159
13160       if (is_rela)
13161         {
13162           if (!slurp_rela_relocs (filedata, relsec->sh_offset,
13163                                   relsec->sh_size, & relocs, & num_relocs))
13164             return FALSE;
13165         }
13166       else
13167         {
13168           if (!slurp_rel_relocs (filedata, relsec->sh_offset,
13169                                  relsec->sh_size, & relocs, & num_relocs))
13170             return FALSE;
13171         }
13172
13173       /* SH uses RELA but uses in place value instead of the addend field.  */
13174       if (filedata->file_header.e_machine == EM_SH)
13175         is_rela = FALSE;
13176
13177       symsec = filedata->section_headers + relsec->sh_link;
13178       if (symsec->sh_type != SHT_SYMTAB
13179           && symsec->sh_type != SHT_DYNSYM)
13180         return FALSE;
13181       symtab = GET_ELF_SYMBOLS (filedata, symsec, & num_syms);
13182
13183       for (rp = relocs; rp < relocs + num_relocs; ++rp)
13184         {
13185           bfd_vma         addend;
13186           unsigned int    reloc_type;
13187           unsigned int    reloc_size;
13188           bfd_boolean     reloc_inplace = FALSE;
13189           bfd_boolean     reloc_subtract = FALSE;
13190           unsigned char * rloc;
13191           unsigned long   sym_index;
13192
13193           reloc_type = get_reloc_type (filedata, rp->r_info);
13194
13195           if (target_specific_reloc_handling (filedata, rp, start, end, symtab, num_syms))
13196             continue;
13197           else if (is_none_reloc (filedata, reloc_type))
13198             continue;
13199           else if (is_32bit_abs_reloc (filedata, reloc_type)
13200                    || is_32bit_pcrel_reloc (filedata, reloc_type))
13201             reloc_size = 4;
13202           else if (is_64bit_abs_reloc (filedata, reloc_type)
13203                    || is_64bit_pcrel_reloc (filedata, reloc_type))
13204             reloc_size = 8;
13205           else if (is_24bit_abs_reloc (filedata, reloc_type))
13206             reloc_size = 3;
13207           else if (is_16bit_abs_reloc (filedata, reloc_type))
13208             reloc_size = 2;
13209           else if (is_8bit_abs_reloc (filedata, reloc_type)
13210                    || is_6bit_abs_reloc (filedata, reloc_type))
13211             reloc_size = 1;
13212           else if ((reloc_subtract = is_32bit_inplace_sub_reloc (filedata,
13213                                                                  reloc_type))
13214                    || is_32bit_inplace_add_reloc (filedata, reloc_type))
13215             {
13216               reloc_size = 4;
13217               reloc_inplace = TRUE;
13218             }
13219           else if ((reloc_subtract = is_64bit_inplace_sub_reloc (filedata,
13220                                                                  reloc_type))
13221                    || is_64bit_inplace_add_reloc (filedata, reloc_type))
13222             {
13223               reloc_size = 8;
13224               reloc_inplace = TRUE;
13225             }
13226           else if ((reloc_subtract = is_16bit_inplace_sub_reloc (filedata,
13227                                                                  reloc_type))
13228                    || is_16bit_inplace_add_reloc (filedata, reloc_type))
13229             {
13230               reloc_size = 2;
13231               reloc_inplace = TRUE;
13232             }
13233           else if ((reloc_subtract = is_8bit_inplace_sub_reloc (filedata,
13234                                                                 reloc_type))
13235                    || is_8bit_inplace_add_reloc (filedata, reloc_type))
13236             {
13237               reloc_size = 1;
13238               reloc_inplace = TRUE;
13239             }
13240           else if ((reloc_subtract = is_6bit_inplace_sub_reloc (filedata,
13241                                                                 reloc_type)))
13242             {
13243               reloc_size = 1;
13244               reloc_inplace = TRUE;
13245             }
13246           else
13247             {
13248               static unsigned int prev_reloc = 0;
13249
13250               if (reloc_type != prev_reloc)
13251                 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
13252                       reloc_type, printable_section_name (filedata, section));
13253               prev_reloc = reloc_type;
13254               continue;
13255             }
13256
13257           rloc = start + rp->r_offset;
13258           if ((rloc + reloc_size) > end || (rloc < start))
13259             {
13260               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
13261                     (unsigned long) rp->r_offset,
13262                     printable_section_name (filedata, section));
13263               continue;
13264             }
13265
13266           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
13267           if (sym_index >= num_syms)
13268             {
13269               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
13270                     sym_index, printable_section_name (filedata, section));
13271               continue;
13272             }
13273           sym = symtab + sym_index;
13274
13275           /* If the reloc has a symbol associated with it,
13276              make sure that it is of an appropriate type.
13277
13278              Relocations against symbols without type can happen.
13279              Gcc -feliminate-dwarf2-dups may generate symbols
13280              without type for debug info.
13281
13282              Icc generates relocations against function symbols
13283              instead of local labels.
13284
13285              Relocations against object symbols can happen, eg when
13286              referencing a global array.  For an example of this see
13287              the _clz.o binary in libgcc.a.  */
13288           if (sym != symtab
13289               && ELF_ST_TYPE (sym->st_info) != STT_COMMON
13290               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
13291             {
13292               warn (_("skipping unexpected symbol type %s in section %s relocation %ld\n"),
13293                     get_symbol_type (filedata, ELF_ST_TYPE (sym->st_info)),
13294                     printable_section_name (filedata, relsec),
13295                     (long int)(rp - relocs));
13296               continue;
13297             }
13298
13299           addend = 0;
13300           if (is_rela)
13301             addend += rp->r_addend;
13302           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
13303              partial_inplace.  */
13304           if (!is_rela
13305               || (filedata->file_header.e_machine == EM_XTENSA
13306                   && reloc_type == 1)
13307               || ((filedata->file_header.e_machine == EM_PJ
13308                    || filedata->file_header.e_machine == EM_PJ_OLD)
13309                   && reloc_type == 1)
13310               || ((filedata->file_header.e_machine == EM_D30V
13311                    || filedata->file_header.e_machine == EM_CYGNUS_D30V)
13312                   && reloc_type == 12)
13313               || reloc_inplace)
13314             {
13315               if (is_6bit_inplace_sub_reloc (filedata, reloc_type))
13316                 addend += byte_get (rloc, reloc_size) & 0x3f;
13317               else
13318                 addend += byte_get (rloc, reloc_size);
13319             }
13320
13321           if (is_32bit_pcrel_reloc (filedata, reloc_type)
13322               || is_64bit_pcrel_reloc (filedata, reloc_type))
13323             {
13324               /* On HPPA, all pc-relative relocations are biased by 8.  */
13325               if (filedata->file_header.e_machine == EM_PARISC)
13326                 addend -= 8;
13327               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
13328                         reloc_size);
13329             }
13330           else if (is_6bit_abs_reloc (filedata, reloc_type)
13331                    || is_6bit_inplace_sub_reloc (filedata, reloc_type))
13332             {
13333               if (reloc_subtract)
13334                 addend -= sym->st_value;
13335               else
13336                 addend += sym->st_value;
13337               addend = (addend & 0x3f) | (byte_get (rloc, reloc_size) & 0xc0);
13338               byte_put (rloc, addend, reloc_size);
13339             }
13340           else if (reloc_subtract)
13341             byte_put (rloc, addend - sym->st_value, reloc_size);
13342           else
13343             byte_put (rloc, addend + sym->st_value, reloc_size);
13344         }
13345
13346       free (symtab);
13347       /* Let the target specific reloc processing code know that
13348          we have finished with these relocs.  */
13349       target_specific_reloc_handling (filedata, NULL, NULL, NULL, NULL, 0);
13350
13351       if (relocs_return)
13352         {
13353           * (Elf_Internal_Rela **) relocs_return = relocs;
13354           * num_relocs_return = num_relocs;
13355         }
13356       else
13357         free (relocs);
13358
13359       break;
13360     }
13361
13362   return TRUE;
13363 }
13364
13365 #ifdef SUPPORT_DISASSEMBLY
13366 static bfd_boolean
13367 disassemble_section (Elf_Internal_Shdr * section, Filedata * filedata)
13368 {
13369   printf (_("\nAssembly dump of section %s\n"), printable_section_name (filedata, section));
13370
13371   /* FIXME: XXX -- to be done --- XXX */
13372
13373   return TRUE;
13374 }
13375 #endif
13376
13377 /* Reads in the contents of SECTION from FILE, returning a pointer
13378    to a malloc'ed buffer or NULL if something went wrong.  */
13379
13380 static char *
13381 get_section_contents (Elf_Internal_Shdr * section, Filedata * filedata)
13382 {
13383   bfd_size_type num_bytes = section->sh_size;
13384
13385   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
13386     {
13387       printf (_("Section '%s' has no data to dump.\n"),
13388               printable_section_name (filedata, section));
13389       return NULL;
13390     }
13391
13392   return  (char *) get_data (NULL, filedata, section->sh_offset, 1, num_bytes,
13393                              _("section contents"));
13394 }
13395
13396 /* Uncompresses a section that was compressed using zlib, in place.  */
13397
13398 static bfd_boolean
13399 uncompress_section_contents (unsigned char **   buffer,
13400                              dwarf_size_type    uncompressed_size,
13401                              dwarf_size_type *  size)
13402 {
13403   dwarf_size_type compressed_size = *size;
13404   unsigned char * compressed_buffer = *buffer;
13405   unsigned char * uncompressed_buffer;
13406   z_stream strm;
13407   int rc;
13408
13409   /* It is possible the section consists of several compressed
13410      buffers concatenated together, so we uncompress in a loop.  */
13411   /* PR 18313: The state field in the z_stream structure is supposed
13412      to be invisible to the user (ie us), but some compilers will
13413      still complain about it being used without initialisation.  So
13414      we first zero the entire z_stream structure and then set the fields
13415      that we need.  */
13416   memset (& strm, 0, sizeof strm);
13417   strm.avail_in = compressed_size;
13418   strm.next_in = (Bytef *) compressed_buffer;
13419   strm.avail_out = uncompressed_size;
13420   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
13421
13422   rc = inflateInit (& strm);
13423   while (strm.avail_in > 0)
13424     {
13425       if (rc != Z_OK)
13426         goto fail;
13427       strm.next_out = ((Bytef *) uncompressed_buffer
13428                        + (uncompressed_size - strm.avail_out));
13429       rc = inflate (&strm, Z_FINISH);
13430       if (rc != Z_STREAM_END)
13431         goto fail;
13432       rc = inflateReset (& strm);
13433     }
13434   rc = inflateEnd (& strm);
13435   if (rc != Z_OK
13436       || strm.avail_out != 0)
13437     goto fail;
13438
13439   *buffer = uncompressed_buffer;
13440   *size = uncompressed_size;
13441   return TRUE;
13442
13443  fail:
13444   free (uncompressed_buffer);
13445   /* Indicate decompression failure.  */
13446   *buffer = NULL;
13447   return FALSE;
13448 }
13449
13450 static bfd_boolean
13451 dump_section_as_strings (Elf_Internal_Shdr * section, Filedata * filedata)
13452 {
13453   Elf_Internal_Shdr *  relsec;
13454   bfd_size_type        num_bytes;
13455   unsigned char *      data;
13456   unsigned char *      end;
13457   unsigned char *      real_start;
13458   unsigned char *      start;
13459   bfd_boolean          some_strings_shown;
13460
13461   real_start = start = (unsigned char *) get_section_contents (section, filedata);
13462   if (start == NULL)
13463     /* PR 21820: Do not fail if the section was empty.  */
13464     return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13465
13466   num_bytes = section->sh_size;
13467
13468   printf (_("\nString dump of section '%s':\n"), printable_section_name (filedata, section));
13469
13470   if (decompress_dumps)
13471     {
13472       dwarf_size_type new_size = num_bytes;
13473       dwarf_size_type uncompressed_size = 0;
13474
13475       if ((section->sh_flags & SHF_COMPRESSED) != 0)
13476         {
13477           Elf_Internal_Chdr chdr;
13478           unsigned int compression_header_size
13479             = get_compression_header (& chdr, (unsigned char *) start,
13480                                       num_bytes);
13481
13482           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13483             {
13484               warn (_("section '%s' has unsupported compress type: %d\n"),
13485                     printable_section_name (filedata, section), chdr.ch_type);
13486               return FALSE;
13487             }
13488           uncompressed_size = chdr.ch_size;
13489           start += compression_header_size;
13490           new_size -= compression_header_size;
13491         }
13492       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13493         {
13494           /* Read the zlib header.  In this case, it should be "ZLIB"
13495              followed by the uncompressed section size, 8 bytes in
13496              big-endian order.  */
13497           uncompressed_size = start[4]; uncompressed_size <<= 8;
13498           uncompressed_size += start[5]; uncompressed_size <<= 8;
13499           uncompressed_size += start[6]; uncompressed_size <<= 8;
13500           uncompressed_size += start[7]; uncompressed_size <<= 8;
13501           uncompressed_size += start[8]; uncompressed_size <<= 8;
13502           uncompressed_size += start[9]; uncompressed_size <<= 8;
13503           uncompressed_size += start[10]; uncompressed_size <<= 8;
13504           uncompressed_size += start[11];
13505           start += 12;
13506           new_size -= 12;
13507         }
13508
13509       if (uncompressed_size)
13510         {
13511           if (uncompress_section_contents (& start,
13512                                            uncompressed_size, & new_size))
13513             num_bytes = new_size;
13514           else
13515             {
13516               error (_("Unable to decompress section %s\n"),
13517                      printable_section_name (filedata, section));
13518               return FALSE;
13519             }
13520         }
13521       else
13522         start = real_start;
13523     }
13524
13525   /* If the section being dumped has relocations against it the user might
13526      be expecting these relocations to have been applied.  Check for this
13527      case and issue a warning message in order to avoid confusion.
13528      FIXME: Maybe we ought to have an option that dumps a section with
13529      relocs applied ?  */
13530   for (relsec = filedata->section_headers;
13531        relsec < filedata->section_headers + filedata->file_header.e_shnum;
13532        ++relsec)
13533     {
13534       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13535           || relsec->sh_info >= filedata->file_header.e_shnum
13536           || filedata->section_headers + relsec->sh_info != section
13537           || relsec->sh_size == 0
13538           || relsec->sh_link >= filedata->file_header.e_shnum)
13539         continue;
13540
13541       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13542       break;
13543     }
13544
13545   data = start;
13546   end  = start + num_bytes;
13547   some_strings_shown = FALSE;
13548
13549   while (data < end)
13550     {
13551       while (!ISPRINT (* data))
13552         if (++ data >= end)
13553           break;
13554
13555       if (data < end)
13556         {
13557           size_t maxlen = end - data;
13558
13559 #ifndef __MSVCRT__
13560           /* PR 11128: Use two separate invocations in order to work
13561              around bugs in the Solaris 8 implementation of printf.  */
13562           printf ("  [%6tx]  ", data - start);
13563 #else
13564           printf ("  [%6Ix]  ", (size_t) (data - start));
13565 #endif
13566           if (maxlen > 0)
13567             {
13568               print_symbol ((int) maxlen, (const char *) data);
13569               putchar ('\n');
13570               data += strnlen ((const char *) data, maxlen);
13571             }
13572           else
13573             {
13574               printf (_("<corrupt>\n"));
13575               data = end;
13576             }
13577           some_strings_shown = TRUE;
13578         }
13579     }
13580
13581   if (! some_strings_shown)
13582     printf (_("  No strings found in this section."));
13583
13584   free (real_start);
13585
13586   putchar ('\n');
13587   return TRUE;
13588 }
13589
13590 static bfd_boolean
13591 dump_section_as_bytes (Elf_Internal_Shdr *  section,
13592                        Filedata *           filedata,
13593                        bfd_boolean          relocate)
13594 {
13595   Elf_Internal_Shdr * relsec;
13596   bfd_size_type       bytes;
13597   bfd_size_type       section_size;
13598   bfd_vma             addr;
13599   unsigned char *     data;
13600   unsigned char *     real_start;
13601   unsigned char *     start;
13602
13603   real_start = start = (unsigned char *) get_section_contents (section, filedata);
13604   if (start == NULL)
13605     /* PR 21820: Do not fail if the section was empty.  */
13606     return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13607
13608   section_size = section->sh_size;
13609
13610   printf (_("\nHex dump of section '%s':\n"), printable_section_name (filedata, section));
13611
13612   if (decompress_dumps)
13613     {
13614       dwarf_size_type new_size = section_size;
13615       dwarf_size_type uncompressed_size = 0;
13616
13617       if ((section->sh_flags & SHF_COMPRESSED) != 0)
13618         {
13619           Elf_Internal_Chdr chdr;
13620           unsigned int compression_header_size
13621             = get_compression_header (& chdr, start, section_size);
13622
13623           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13624             {
13625               warn (_("section '%s' has unsupported compress type: %d\n"),
13626                     printable_section_name (filedata, section), chdr.ch_type);
13627               return FALSE;
13628             }
13629           uncompressed_size = chdr.ch_size;
13630           start += compression_header_size;
13631           new_size -= compression_header_size;
13632         }
13633       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13634         {
13635           /* Read the zlib header.  In this case, it should be "ZLIB"
13636              followed by the uncompressed section size, 8 bytes in
13637              big-endian order.  */
13638           uncompressed_size = start[4]; uncompressed_size <<= 8;
13639           uncompressed_size += start[5]; uncompressed_size <<= 8;
13640           uncompressed_size += start[6]; uncompressed_size <<= 8;
13641           uncompressed_size += start[7]; uncompressed_size <<= 8;
13642           uncompressed_size += start[8]; uncompressed_size <<= 8;
13643           uncompressed_size += start[9]; uncompressed_size <<= 8;
13644           uncompressed_size += start[10]; uncompressed_size <<= 8;
13645           uncompressed_size += start[11];
13646           start += 12;
13647           new_size -= 12;
13648         }
13649
13650       if (uncompressed_size)
13651         {
13652           if (uncompress_section_contents (& start, uncompressed_size,
13653                                            & new_size))
13654             {
13655               section_size = new_size;
13656             }
13657           else
13658             {
13659               error (_("Unable to decompress section %s\n"),
13660                      printable_section_name (filedata, section));
13661               /* FIXME: Print the section anyway ?  */
13662               return FALSE;
13663             }
13664         }
13665       else
13666         start = real_start;
13667     }
13668
13669   if (relocate)
13670     {
13671       if (! apply_relocations (filedata, section, start, section_size, NULL, NULL))
13672         return FALSE;
13673     }
13674   else
13675     {
13676       /* If the section being dumped has relocations against it the user might
13677          be expecting these relocations to have been applied.  Check for this
13678          case and issue a warning message in order to avoid confusion.
13679          FIXME: Maybe we ought to have an option that dumps a section with
13680          relocs applied ?  */
13681       for (relsec = filedata->section_headers;
13682            relsec < filedata->section_headers + filedata->file_header.e_shnum;
13683            ++relsec)
13684         {
13685           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13686               || relsec->sh_info >= filedata->file_header.e_shnum
13687               || filedata->section_headers + relsec->sh_info != section
13688               || relsec->sh_size == 0
13689               || relsec->sh_link >= filedata->file_header.e_shnum)
13690             continue;
13691
13692           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13693           break;
13694         }
13695     }
13696
13697   addr = section->sh_addr;
13698   bytes = section_size;
13699   data = start;
13700
13701   while (bytes)
13702     {
13703       int j;
13704       int k;
13705       int lbytes;
13706
13707       lbytes = (bytes > 16 ? 16 : bytes);
13708
13709       printf ("  0x%8.8lx ", (unsigned long) addr);
13710
13711       for (j = 0; j < 16; j++)
13712         {
13713           if (j < lbytes)
13714             printf ("%2.2x", data[j]);
13715           else
13716             printf ("  ");
13717
13718           if ((j & 3) == 3)
13719             printf (" ");
13720         }
13721
13722       for (j = 0; j < lbytes; j++)
13723         {
13724           k = data[j];
13725           if (k >= ' ' && k < 0x7f)
13726             printf ("%c", k);
13727           else
13728             printf (".");
13729         }
13730
13731       putchar ('\n');
13732
13733       data  += lbytes;
13734       addr  += lbytes;
13735       bytes -= lbytes;
13736     }
13737
13738   free (real_start);
13739
13740   putchar ('\n');
13741   return TRUE;
13742 }
13743
13744 static bfd_boolean
13745 load_specific_debug_section (enum dwarf_section_display_enum  debug,
13746                              const Elf_Internal_Shdr *        sec,
13747                              void *                           data)
13748 {
13749   struct dwarf_section * section = &debug_displays [debug].section;
13750   char buf [64];
13751   Filedata * filedata = (Filedata *) data;
13752   
13753   if (section->start != NULL)
13754     {
13755       /* If it is already loaded, do nothing.  */
13756       if (streq (section->filename, filedata->file_name))
13757         return TRUE;
13758       free (section->start);
13759     }
13760
13761   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
13762   section->address = sec->sh_addr;
13763   section->user_data = NULL;
13764   section->filename = filedata->file_name;
13765   section->start = (unsigned char *) get_data (NULL, filedata,
13766                                                sec->sh_offset, 1,
13767                                                sec->sh_size, buf);
13768   if (section->start == NULL)
13769     section->size = 0;
13770   else
13771     {
13772       unsigned char *start = section->start;
13773       dwarf_size_type size = sec->sh_size;
13774       dwarf_size_type uncompressed_size = 0;
13775
13776       if ((sec->sh_flags & SHF_COMPRESSED) != 0)
13777         {
13778           Elf_Internal_Chdr chdr;
13779           unsigned int compression_header_size;
13780
13781           if (size < (is_32bit_elf
13782                       ? sizeof (Elf32_External_Chdr)
13783                       : sizeof (Elf64_External_Chdr)))
13784             {
13785               warn (_("compressed section %s is too small to contain a compression header"),
13786                     section->name);
13787               return FALSE;
13788             }
13789
13790           compression_header_size = get_compression_header (&chdr, start, size);
13791
13792           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13793             {
13794               warn (_("section '%s' has unsupported compress type: %d\n"),
13795                     section->name, chdr.ch_type);
13796               return FALSE;
13797             }
13798           uncompressed_size = chdr.ch_size;
13799           start += compression_header_size;
13800           size -= compression_header_size;
13801         }
13802       else if (size > 12 && streq ((char *) start, "ZLIB"))
13803         {
13804           /* Read the zlib header.  In this case, it should be "ZLIB"
13805              followed by the uncompressed section size, 8 bytes in
13806              big-endian order.  */
13807           uncompressed_size = start[4]; uncompressed_size <<= 8;
13808           uncompressed_size += start[5]; uncompressed_size <<= 8;
13809           uncompressed_size += start[6]; uncompressed_size <<= 8;
13810           uncompressed_size += start[7]; uncompressed_size <<= 8;
13811           uncompressed_size += start[8]; uncompressed_size <<= 8;
13812           uncompressed_size += start[9]; uncompressed_size <<= 8;
13813           uncompressed_size += start[10]; uncompressed_size <<= 8;
13814           uncompressed_size += start[11];
13815           start += 12;
13816           size -= 12;
13817         }
13818
13819       if (uncompressed_size)
13820         {
13821           if (uncompress_section_contents (&start, uncompressed_size,
13822                                            &size))
13823             {
13824               /* Free the compressed buffer, update the section buffer
13825                  and the section size if uncompress is successful.  */
13826               free (section->start);
13827               section->start = start;
13828             }
13829           else
13830             {
13831               error (_("Unable to decompress section %s\n"),
13832                      printable_section_name (filedata, sec));
13833               return FALSE;
13834             }
13835         }
13836
13837       section->size = size;
13838     }
13839
13840   if (section->start == NULL)
13841     return FALSE;
13842
13843   if (debug_displays [debug].relocate)
13844     {
13845       if (! apply_relocations (filedata, sec, section->start, section->size,
13846                                & section->reloc_info, & section->num_relocs))
13847         return FALSE;
13848     }
13849   else
13850     {
13851       section->reloc_info = NULL;
13852       section->num_relocs = 0;
13853     }
13854
13855   return TRUE;
13856 }
13857
13858 /* If this is not NULL, load_debug_section will only look for sections
13859    within the list of sections given here.  */
13860 static unsigned int * section_subset = NULL;
13861
13862 bfd_boolean
13863 load_debug_section (enum dwarf_section_display_enum debug, void * data)
13864 {
13865   struct dwarf_section * section = &debug_displays [debug].section;
13866   Elf_Internal_Shdr * sec;
13867   Filedata * filedata = (Filedata *) data;
13868
13869   /* Without section headers we cannot find any sections.  */
13870   if (filedata->section_headers == NULL)
13871     return FALSE;
13872
13873   if (filedata->string_table == NULL
13874       && filedata->file_header.e_shstrndx != SHN_UNDEF
13875       && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
13876     {
13877       Elf_Internal_Shdr * strs;
13878
13879       /* Read in the string table, so that we have section names to scan.  */
13880       strs = filedata->section_headers + filedata->file_header.e_shstrndx;
13881
13882       if (strs != NULL && strs->sh_size != 0)
13883         {
13884           filedata->string_table
13885             = (char *) get_data (NULL, filedata, strs->sh_offset,
13886                                  1, strs->sh_size, _("string table"));
13887
13888           filedata->string_table_length
13889             = filedata->string_table != NULL ? strs->sh_size : 0;
13890         }
13891     }
13892
13893   /* Locate the debug section.  */
13894   sec = find_section_in_set (filedata, section->uncompressed_name, section_subset);
13895   if (sec != NULL)
13896     section->name = section->uncompressed_name;
13897   else
13898     {
13899       sec = find_section_in_set (filedata, section->compressed_name, section_subset);
13900       if (sec != NULL)
13901         section->name = section->compressed_name;
13902     }
13903   if (sec == NULL)
13904     return FALSE;
13905
13906   /* If we're loading from a subset of sections, and we've loaded
13907      a section matching this name before, it's likely that it's a
13908      different one.  */
13909   if (section_subset != NULL)
13910     free_debug_section (debug);
13911
13912   return load_specific_debug_section (debug, sec, data);
13913 }
13914
13915 void
13916 free_debug_section (enum dwarf_section_display_enum debug)
13917 {
13918   struct dwarf_section * section = &debug_displays [debug].section;
13919
13920   if (section->start == NULL)
13921     return;
13922
13923   free ((char *) section->start);
13924   section->start = NULL;
13925   section->address = 0;
13926   section->size = 0;
13927 }
13928
13929 static bfd_boolean
13930 display_debug_section (int shndx, Elf_Internal_Shdr * section, Filedata * filedata)
13931 {
13932   char * name = SECTION_NAME (section);
13933   const char * print_name = printable_section_name (filedata, section);
13934   bfd_size_type length;
13935   bfd_boolean result = TRUE;
13936   int i;
13937
13938   length = section->sh_size;
13939   if (length == 0)
13940     {
13941       printf (_("\nSection '%s' has no debugging data.\n"), print_name);
13942       return TRUE;
13943     }
13944   if (section->sh_type == SHT_NOBITS)
13945     {
13946       /* There is no point in dumping the contents of a debugging section
13947          which has the NOBITS type - the bits in the file will be random.
13948          This can happen when a file containing a .eh_frame section is
13949          stripped with the --only-keep-debug command line option.  */
13950       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
13951               print_name);
13952       return FALSE;
13953     }
13954
13955   if (const_strneq (name, ".gnu.linkonce.wi."))
13956     name = ".debug_info";
13957
13958   /* See if we know how to display the contents of this section.  */
13959   for (i = 0; i < max; i++)
13960     {
13961       enum dwarf_section_display_enum  id = (enum dwarf_section_display_enum) i;
13962       struct dwarf_section_display *   display = debug_displays + i;
13963       struct dwarf_section *           sec = & display->section;
13964
13965       if (streq (sec->uncompressed_name, name)
13966           || (id == line && const_strneq (name, ".debug_line."))
13967           || streq (sec->compressed_name, name))
13968         {
13969           bfd_boolean secondary = (section != find_section (filedata, name));
13970
13971           if (secondary)
13972             free_debug_section (id);
13973
13974           if (i == line && const_strneq (name, ".debug_line."))
13975             sec->name = name;
13976           else if (streq (sec->uncompressed_name, name))
13977             sec->name = sec->uncompressed_name;
13978           else
13979             sec->name = sec->compressed_name;
13980
13981           if (load_specific_debug_section (id, section, filedata))
13982             {
13983               /* If this debug section is part of a CU/TU set in a .dwp file,
13984                  restrict load_debug_section to the sections in that set.  */
13985               section_subset = find_cu_tu_set (filedata, shndx);
13986
13987               result &= display->display (sec, filedata);
13988
13989               section_subset = NULL;
13990
13991               if (secondary || (id != info && id != abbrev))
13992                 free_debug_section (id);
13993             }
13994           break;
13995         }
13996     }
13997
13998   if (i == max)
13999     {
14000       printf (_("Unrecognized debug section: %s\n"), print_name);
14001       result = FALSE;
14002     }
14003
14004   return result;
14005 }
14006
14007 /* Set DUMP_SECTS for all sections where dumps were requested
14008    based on section name.  */
14009
14010 static void
14011 initialise_dumps_byname (Filedata * filedata)
14012 {
14013   struct dump_list_entry * cur;
14014
14015   for (cur = dump_sects_byname; cur; cur = cur->next)
14016     {
14017       unsigned int i;
14018       bfd_boolean any = FALSE;
14019
14020       for (i = 0; i < filedata->file_header.e_shnum; i++)
14021         if (streq (SECTION_NAME (filedata->section_headers + i), cur->name))
14022           {
14023             request_dump_bynumber (filedata, i, cur->type);
14024             any = TRUE;
14025           }
14026
14027       if (!any)
14028         warn (_("Section '%s' was not dumped because it does not exist!\n"),
14029               cur->name);
14030     }
14031 }
14032
14033 static bfd_boolean
14034 process_section_contents (Filedata * filedata)
14035 {
14036   Elf_Internal_Shdr * section;
14037   unsigned int i;
14038   bfd_boolean res = TRUE;
14039
14040   if (! do_dump)
14041     return TRUE;
14042
14043   initialise_dumps_byname (filedata);
14044
14045   for (i = 0, section = filedata->section_headers;
14046        i < filedata->file_header.e_shnum && i < filedata->num_dump_sects;
14047        i++, section++)
14048     {
14049       dump_type dump = filedata->dump_sects[i];
14050
14051 #ifdef SUPPORT_DISASSEMBLY
14052       if (dump & DISASS_DUMP)
14053         {
14054           if (! disassemble_section (section, filedata))
14055             res = FALSE;
14056         }
14057 #endif
14058       if (dump & HEX_DUMP)
14059         {
14060           if (! dump_section_as_bytes (section, filedata, FALSE))
14061             res = FALSE;
14062         }
14063
14064       if (dump & RELOC_DUMP)
14065         {
14066           if (! dump_section_as_bytes (section, filedata, TRUE))
14067             res = FALSE;
14068         }
14069
14070       if (dump & STRING_DUMP)
14071         {
14072           if (! dump_section_as_strings (section, filedata))
14073             res = FALSE;
14074         }
14075
14076       if (dump & DEBUG_DUMP)
14077         {
14078           if (! display_debug_section (i, section, filedata))
14079             res = FALSE;
14080         }
14081     }
14082
14083   /* Check to see if the user requested a
14084      dump of a section that does not exist.  */
14085   while (i < filedata->num_dump_sects)
14086     {
14087       if (filedata->dump_sects[i])
14088         {
14089           warn (_("Section %d was not dumped because it does not exist!\n"), i);
14090           res = FALSE;
14091         }
14092       i++;
14093     }
14094
14095   return res;
14096 }
14097
14098 static void
14099 process_mips_fpe_exception (int mask)
14100 {
14101   if (mask)
14102     {
14103       bfd_boolean first = TRUE;
14104
14105       if (mask & OEX_FPU_INEX)
14106         fputs ("INEX", stdout), first = FALSE;
14107       if (mask & OEX_FPU_UFLO)
14108         printf ("%sUFLO", first ? "" : "|"), first = FALSE;
14109       if (mask & OEX_FPU_OFLO)
14110         printf ("%sOFLO", first ? "" : "|"), first = FALSE;
14111       if (mask & OEX_FPU_DIV0)
14112         printf ("%sDIV0", first ? "" : "|"), first = FALSE;
14113       if (mask & OEX_FPU_INVAL)
14114         printf ("%sINVAL", first ? "" : "|");
14115     }
14116   else
14117     fputs ("0", stdout);
14118 }
14119
14120 /* Display's the value of TAG at location P.  If TAG is
14121    greater than 0 it is assumed to be an unknown tag, and
14122    a message is printed to this effect.  Otherwise it is
14123    assumed that a message has already been printed.
14124
14125    If the bottom bit of TAG is set it assumed to have a
14126    string value, otherwise it is assumed to have an integer
14127    value.
14128
14129    Returns an updated P pointing to the first unread byte
14130    beyond the end of TAG's value.
14131
14132    Reads at or beyond END will not be made.  */
14133
14134 static unsigned char *
14135 display_tag_value (signed int tag,
14136                    unsigned char * p,
14137                    const unsigned char * const end)
14138 {
14139   unsigned long val;
14140
14141   if (tag > 0)
14142     printf ("  Tag_unknown_%d: ", tag);
14143
14144   if (p >= end)
14145     {
14146       warn (_("<corrupt tag>\n"));
14147     }
14148   else if (tag & 1)
14149     {
14150       /* PR 17531 file: 027-19978-0.004.  */
14151       size_t maxlen = (end - p) - 1;
14152
14153       putchar ('"');
14154       if (maxlen > 0)
14155         {
14156           print_symbol ((int) maxlen, (const char *) p);
14157           p += strnlen ((char *) p, maxlen) + 1;
14158         }
14159       else
14160         {
14161           printf (_("<corrupt string tag>"));
14162           p = (unsigned char *) end;
14163         }
14164       printf ("\"\n");
14165     }
14166   else
14167     {
14168       unsigned int len;
14169
14170       val = read_uleb128 (p, &len, end);
14171       p += len;
14172       printf ("%ld (0x%lx)\n", val, val);
14173     }
14174
14175   assert (p <= end);
14176   return p;
14177 }
14178
14179 /* ARC ABI attributes section.  */
14180
14181 static unsigned char *
14182 display_arc_attribute (unsigned char * p,
14183                        const unsigned char * const end)
14184 {
14185   unsigned int tag;
14186   unsigned int len;
14187   unsigned int val;
14188
14189   tag = read_uleb128 (p, &len, end);
14190   p += len;
14191
14192   switch (tag)
14193     {
14194     case Tag_ARC_PCS_config:
14195       val = read_uleb128 (p, &len, end);
14196       p += len;
14197       printf ("  Tag_ARC_PCS_config: ");
14198       switch (val)
14199         {
14200         case 0:
14201           printf (_("Absent/Non standard\n"));
14202           break;
14203         case 1:
14204           printf (_("Bare metal/mwdt\n"));
14205           break;
14206         case 2:
14207           printf (_("Bare metal/newlib\n"));
14208           break;
14209         case 3:
14210           printf (_("Linux/uclibc\n"));
14211           break;
14212         case 4:
14213           printf (_("Linux/glibc\n"));
14214           break;
14215         default:
14216           printf (_("Unknown\n"));
14217           break;
14218         }
14219       break;
14220
14221     case Tag_ARC_CPU_base:
14222       val = read_uleb128 (p, &len, end);
14223       p += len;
14224       printf ("  Tag_ARC_CPU_base: ");
14225       switch (val)
14226         {
14227         default:
14228         case TAG_CPU_NONE:
14229           printf (_("Absent\n"));
14230           break;
14231         case TAG_CPU_ARC6xx:
14232           printf ("ARC6xx\n");
14233           break;
14234         case TAG_CPU_ARC7xx:
14235           printf ("ARC7xx\n");
14236           break;
14237         case TAG_CPU_ARCEM:
14238           printf ("ARCEM\n");
14239           break;
14240         case TAG_CPU_ARCHS:
14241           printf ("ARCHS\n");
14242           break;
14243         }
14244       break;
14245
14246     case Tag_ARC_CPU_variation:
14247       val = read_uleb128 (p, &len, end);
14248       p += len;
14249       printf ("  Tag_ARC_CPU_variation: ");
14250       switch (val)
14251         {
14252         default:
14253           if (val > 0 && val < 16)
14254               printf ("Core%d\n", val);
14255           else
14256               printf ("Unknown\n");
14257           break;
14258
14259         case 0:
14260           printf (_("Absent\n"));
14261           break;
14262         }
14263       break;
14264
14265     case Tag_ARC_CPU_name:
14266       printf ("  Tag_ARC_CPU_name: ");
14267       p = display_tag_value (-1, p, end);
14268       break;
14269
14270     case Tag_ARC_ABI_rf16:
14271       val = read_uleb128 (p, &len, end);
14272       p += len;
14273       printf ("  Tag_ARC_ABI_rf16: %s\n", val ? _("yes") : _("no"));
14274       break;
14275
14276     case Tag_ARC_ABI_osver:
14277       val = read_uleb128 (p, &len, end);
14278       p += len;
14279       printf ("  Tag_ARC_ABI_osver: v%d\n", val);
14280       break;
14281
14282     case Tag_ARC_ABI_pic:
14283     case Tag_ARC_ABI_sda:
14284       val = read_uleb128 (p, &len, end);
14285       p += len;
14286       printf (tag == Tag_ARC_ABI_sda ? "  Tag_ARC_ABI_sda: "
14287               : "  Tag_ARC_ABI_pic: ");
14288       switch (val)
14289         {
14290         case 0:
14291           printf (_("Absent\n"));
14292           break;
14293         case 1:
14294           printf ("MWDT\n");
14295           break;
14296         case 2:
14297           printf ("GNU\n");
14298           break;
14299         default:
14300           printf (_("Unknown\n"));
14301           break;
14302         }
14303       break;
14304
14305     case Tag_ARC_ABI_tls:
14306       val = read_uleb128 (p, &len, end);
14307       p += len;
14308       printf ("  Tag_ARC_ABI_tls: %s\n", val ? "r25": "none");
14309       break;
14310
14311     case Tag_ARC_ABI_enumsize:
14312       val = read_uleb128 (p, &len, end);
14313       p += len;
14314       printf ("  Tag_ARC_ABI_enumsize: %s\n", val ? _("default") :
14315               _("smallest"));
14316       break;
14317
14318     case Tag_ARC_ABI_exceptions:
14319       val = read_uleb128 (p, &len, end);
14320       p += len;
14321       printf ("  Tag_ARC_ABI_exceptions: %s\n", val ? _("OPTFP")
14322               : _("default"));
14323       break;
14324
14325     case Tag_ARC_ABI_double_size:
14326       val = read_uleb128 (p, &len, end);
14327       p += len;
14328       printf ("  Tag_ARC_ABI_double_size: %d\n", val);
14329       break;
14330
14331     case Tag_ARC_ISA_config:
14332       printf ("  Tag_ARC_ISA_config: ");
14333       p = display_tag_value (-1, p, end);
14334       break;
14335
14336     case Tag_ARC_ISA_apex:
14337       printf ("  Tag_ARC_ISA_apex: ");
14338       p = display_tag_value (-1, p, end);
14339       break;
14340
14341     case Tag_ARC_ISA_mpy_option:
14342       val = read_uleb128 (p, &len, end);
14343       p += len;
14344       printf ("  Tag_ARC_ISA_mpy_option: %d\n", val);
14345       break;
14346
14347     case Tag_ARC_ATR_version:
14348       val = read_uleb128 (p, &len, end);
14349       p += len;
14350       printf ("  Tag_ARC_ATR_version: %d\n", val);
14351       break;
14352
14353     default:
14354       return display_tag_value (tag & 1, p, end);
14355     }
14356
14357   return p;
14358 }
14359
14360 /* ARM EABI attributes section.  */
14361 typedef struct
14362 {
14363   unsigned int tag;
14364   const char * name;
14365   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
14366   unsigned int type;
14367   const char ** table;
14368 } arm_attr_public_tag;
14369
14370 static const char * arm_attr_tag_CPU_arch[] =
14371   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
14372    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "v8-R", "v8-M.baseline",
14373    "v8-M.mainline", "", "", "", "v8.1-M.mainline"};
14374 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
14375 static const char * arm_attr_tag_THUMB_ISA_use[] =
14376   {"No", "Thumb-1", "Thumb-2", "Yes"};
14377 static const char * arm_attr_tag_FP_arch[] =
14378   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
14379    "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
14380 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
14381 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
14382   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
14383    "NEON for ARMv8.1"};
14384 static const char * arm_attr_tag_PCS_config[] =
14385   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
14386    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
14387 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
14388   {"V6", "SB", "TLS", "Unused"};
14389 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
14390   {"Absolute", "PC-relative", "SB-relative", "None"};
14391 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
14392   {"Absolute", "PC-relative", "None"};
14393 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
14394   {"None", "direct", "GOT-indirect"};
14395 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
14396   {"None", "??? 1", "2", "??? 3", "4"};
14397 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
14398 static const char * arm_attr_tag_ABI_FP_denormal[] =
14399   {"Unused", "Needed", "Sign only"};
14400 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
14401 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
14402 static const char * arm_attr_tag_ABI_FP_number_model[] =
14403   {"Unused", "Finite", "RTABI", "IEEE 754"};
14404 static const char * arm_attr_tag_ABI_enum_size[] =
14405   {"Unused", "small", "int", "forced to int"};
14406 static const char * arm_attr_tag_ABI_HardFP_use[] =
14407   {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
14408 static const char * arm_attr_tag_ABI_VFP_args[] =
14409   {"AAPCS", "VFP registers", "custom", "compatible"};
14410 static const char * arm_attr_tag_ABI_WMMX_args[] =
14411   {"AAPCS", "WMMX registers", "custom"};
14412 static const char * arm_attr_tag_ABI_optimization_goals[] =
14413   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14414     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
14415 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
14416   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14417     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
14418 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
14419 static const char * arm_attr_tag_FP_HP_extension[] =
14420   {"Not Allowed", "Allowed"};
14421 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
14422   {"None", "IEEE 754", "Alternative Format"};
14423 static const char * arm_attr_tag_DSP_extension[] =
14424   {"Follow architecture", "Allowed"};
14425 static const char * arm_attr_tag_MPextension_use[] =
14426   {"Not Allowed", "Allowed"};
14427 static const char * arm_attr_tag_DIV_use[] =
14428   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
14429     "Allowed in v7-A with integer division extension"};
14430 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
14431 static const char * arm_attr_tag_Virtualization_use[] =
14432   {"Not Allowed", "TrustZone", "Virtualization Extensions",
14433     "TrustZone and Virtualization Extensions"};
14434 static const char * arm_attr_tag_MPextension_use_legacy[] =
14435   {"Not Allowed", "Allowed"};
14436
14437 #define LOOKUP(id, name) \
14438   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
14439 static arm_attr_public_tag arm_attr_public_tags[] =
14440 {
14441   {4, "CPU_raw_name", 1, NULL},
14442   {5, "CPU_name", 1, NULL},
14443   LOOKUP(6, CPU_arch),
14444   {7, "CPU_arch_profile", 0, NULL},
14445   LOOKUP(8, ARM_ISA_use),
14446   LOOKUP(9, THUMB_ISA_use),
14447   LOOKUP(10, FP_arch),
14448   LOOKUP(11, WMMX_arch),
14449   LOOKUP(12, Advanced_SIMD_arch),
14450   LOOKUP(13, PCS_config),
14451   LOOKUP(14, ABI_PCS_R9_use),
14452   LOOKUP(15, ABI_PCS_RW_data),
14453   LOOKUP(16, ABI_PCS_RO_data),
14454   LOOKUP(17, ABI_PCS_GOT_use),
14455   LOOKUP(18, ABI_PCS_wchar_t),
14456   LOOKUP(19, ABI_FP_rounding),
14457   LOOKUP(20, ABI_FP_denormal),
14458   LOOKUP(21, ABI_FP_exceptions),
14459   LOOKUP(22, ABI_FP_user_exceptions),
14460   LOOKUP(23, ABI_FP_number_model),
14461   {24, "ABI_align_needed", 0, NULL},
14462   {25, "ABI_align_preserved", 0, NULL},
14463   LOOKUP(26, ABI_enum_size),
14464   LOOKUP(27, ABI_HardFP_use),
14465   LOOKUP(28, ABI_VFP_args),
14466   LOOKUP(29, ABI_WMMX_args),
14467   LOOKUP(30, ABI_optimization_goals),
14468   LOOKUP(31, ABI_FP_optimization_goals),
14469   {32, "compatibility", 0, NULL},
14470   LOOKUP(34, CPU_unaligned_access),
14471   LOOKUP(36, FP_HP_extension),
14472   LOOKUP(38, ABI_FP_16bit_format),
14473   LOOKUP(42, MPextension_use),
14474   LOOKUP(44, DIV_use),
14475   LOOKUP(46, DSP_extension),
14476   {64, "nodefaults", 0, NULL},
14477   {65, "also_compatible_with", 0, NULL},
14478   LOOKUP(66, T2EE_use),
14479   {67, "conformance", 1, NULL},
14480   LOOKUP(68, Virtualization_use),
14481   LOOKUP(70, MPextension_use_legacy)
14482 };
14483 #undef LOOKUP
14484
14485 static unsigned char *
14486 display_arm_attribute (unsigned char * p,
14487                        const unsigned char * const end)
14488 {
14489   unsigned int tag;
14490   unsigned int len;
14491   unsigned int val;
14492   arm_attr_public_tag * attr;
14493   unsigned i;
14494   unsigned int type;
14495
14496   tag = read_uleb128 (p, &len, end);
14497   p += len;
14498   attr = NULL;
14499   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
14500     {
14501       if (arm_attr_public_tags[i].tag == tag)
14502         {
14503           attr = &arm_attr_public_tags[i];
14504           break;
14505         }
14506     }
14507
14508   if (attr)
14509     {
14510       printf ("  Tag_%s: ", attr->name);
14511       switch (attr->type)
14512         {
14513         case 0:
14514           switch (tag)
14515             {
14516             case 7: /* Tag_CPU_arch_profile.  */
14517               val = read_uleb128 (p, &len, end);
14518               p += len;
14519               switch (val)
14520                 {
14521                 case 0: printf (_("None\n")); break;
14522                 case 'A': printf (_("Application\n")); break;
14523                 case 'R': printf (_("Realtime\n")); break;
14524                 case 'M': printf (_("Microcontroller\n")); break;
14525                 case 'S': printf (_("Application or Realtime\n")); break;
14526                 default: printf ("??? (%d)\n", val); break;
14527                 }
14528               break;
14529
14530             case 24: /* Tag_align_needed.  */
14531               val = read_uleb128 (p, &len, end);
14532               p += len;
14533               switch (val)
14534                 {
14535                 case 0: printf (_("None\n")); break;
14536                 case 1: printf (_("8-byte\n")); break;
14537                 case 2: printf (_("4-byte\n")); break;
14538                 case 3: printf ("??? 3\n"); break;
14539                 default:
14540                   if (val <= 12)
14541                     printf (_("8-byte and up to %d-byte extended\n"),
14542                             1 << val);
14543                   else
14544                     printf ("??? (%d)\n", val);
14545                   break;
14546                 }
14547               break;
14548
14549             case 25: /* Tag_align_preserved.  */
14550               val = read_uleb128 (p, &len, end);
14551               p += len;
14552               switch (val)
14553                 {
14554                 case 0: printf (_("None\n")); break;
14555                 case 1: printf (_("8-byte, except leaf SP\n")); break;
14556                 case 2: printf (_("8-byte\n")); break;
14557                 case 3: printf ("??? 3\n"); break;
14558                 default:
14559                   if (val <= 12)
14560                     printf (_("8-byte and up to %d-byte extended\n"),
14561                             1 << val);
14562                   else
14563                     printf ("??? (%d)\n", val);
14564                   break;
14565                 }
14566               break;
14567
14568             case 32: /* Tag_compatibility.  */
14569               {
14570                 val = read_uleb128 (p, &len, end);
14571                 p += len;
14572                 printf (_("flag = %d, vendor = "), val);
14573                 if (p < end - 1)
14574                   {
14575                     size_t maxlen = (end - p) - 1;
14576
14577                     print_symbol ((int) maxlen, (const char *) p);
14578                     p += strnlen ((char *) p, maxlen) + 1;
14579                   }
14580                 else
14581                   {
14582                     printf (_("<corrupt>"));
14583                     p = (unsigned char *) end;
14584                   }
14585                 putchar ('\n');
14586               }
14587               break;
14588
14589             case 64: /* Tag_nodefaults.  */
14590               /* PR 17531: file: 001-505008-0.01.  */
14591               if (p < end)
14592                 p++;
14593               printf (_("True\n"));
14594               break;
14595
14596             case 65: /* Tag_also_compatible_with.  */
14597               val = read_uleb128 (p, &len, end);
14598               p += len;
14599               if (val == 6 /* Tag_CPU_arch.  */)
14600                 {
14601                   val = read_uleb128 (p, &len, end);
14602                   p += len;
14603                   if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
14604                     printf ("??? (%d)\n", val);
14605                   else
14606                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
14607                 }
14608               else
14609                 printf ("???\n");
14610               while (p < end && *(p++) != '\0' /* NUL terminator.  */)
14611                 ;
14612               break;
14613
14614             default:
14615               printf (_("<unknown: %d>\n"), tag);
14616               break;
14617             }
14618           return p;
14619
14620         case 1:
14621           return display_tag_value (-1, p, end);
14622         case 2:
14623           return display_tag_value (0, p, end);
14624
14625         default:
14626           assert (attr->type & 0x80);
14627           val = read_uleb128 (p, &len, end);
14628           p += len;
14629           type = attr->type & 0x7f;
14630           if (val >= type)
14631             printf ("??? (%d)\n", val);
14632           else
14633             printf ("%s\n", attr->table[val]);
14634           return p;
14635         }
14636     }
14637
14638   return display_tag_value (tag, p, end);
14639 }
14640
14641 static unsigned char *
14642 display_gnu_attribute (unsigned char * p,
14643                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const),
14644                        const unsigned char * const end)
14645 {
14646   int tag;
14647   unsigned int len;
14648   unsigned int val;
14649
14650   tag = read_uleb128 (p, &len, end);
14651   p += len;
14652
14653   /* Tag_compatibility is the only generic GNU attribute defined at
14654      present.  */
14655   if (tag == 32)
14656     {
14657       val = read_uleb128 (p, &len, end);
14658       p += len;
14659
14660       printf (_("flag = %d, vendor = "), val);
14661       if (p == end)
14662         {
14663           printf (_("<corrupt>\n"));
14664           warn (_("corrupt vendor attribute\n"));
14665         }
14666       else
14667         {
14668           if (p < end - 1)
14669             {
14670               size_t maxlen = (end - p) - 1;
14671
14672               print_symbol ((int) maxlen, (const char *) p);
14673               p += strnlen ((char *) p, maxlen) + 1;
14674             }
14675           else
14676             {
14677               printf (_("<corrupt>"));
14678               p = (unsigned char *) end;
14679             }
14680           putchar ('\n');
14681         }
14682       return p;
14683     }
14684
14685   if ((tag & 2) == 0 && display_proc_gnu_attribute)
14686     return display_proc_gnu_attribute (p, tag, end);
14687
14688   return display_tag_value (tag, p, end);
14689 }
14690
14691 static unsigned char *
14692 display_power_gnu_attribute (unsigned char * p,
14693                              unsigned int tag,
14694                              const unsigned char * const end)
14695 {
14696   unsigned int len;
14697   unsigned int val;
14698
14699   if (tag == Tag_GNU_Power_ABI_FP)
14700     {
14701       val = read_uleb128 (p, &len, end);
14702       p += len;
14703       printf ("  Tag_GNU_Power_ABI_FP: ");
14704       if (len == 0)
14705         {
14706           printf (_("<corrupt>\n"));
14707           return p;
14708         }
14709
14710       if (val > 15)
14711         printf ("(%#x), ", val);
14712
14713       switch (val & 3)
14714         {
14715         case 0:
14716           printf (_("unspecified hard/soft float, "));
14717           break;
14718         case 1:
14719           printf (_("hard float, "));
14720           break;
14721         case 2:
14722           printf (_("soft float, "));
14723           break;
14724         case 3:
14725           printf (_("single-precision hard float, "));
14726           break;
14727         }
14728
14729       switch (val & 0xC)
14730         {
14731         case 0:
14732           printf (_("unspecified long double\n"));
14733           break;
14734         case 4:
14735           printf (_("128-bit IBM long double\n"));
14736           break;
14737         case 8:
14738           printf (_("64-bit long double\n"));
14739           break;
14740         case 12:
14741           printf (_("128-bit IEEE long double\n"));
14742           break;
14743         }
14744       return p;
14745     }
14746
14747   if (tag == Tag_GNU_Power_ABI_Vector)
14748     {
14749       val = read_uleb128 (p, &len, end);
14750       p += len;
14751       printf ("  Tag_GNU_Power_ABI_Vector: ");
14752       if (len == 0)
14753         {
14754           printf (_("<corrupt>\n"));
14755           return p;
14756         }
14757
14758       if (val > 3)
14759         printf ("(%#x), ", val);
14760
14761       switch (val & 3)
14762         {
14763         case 0:
14764           printf (_("unspecified\n"));
14765           break;
14766         case 1:
14767           printf (_("generic\n"));
14768           break;
14769         case 2:
14770           printf ("AltiVec\n");
14771           break;
14772         case 3:
14773           printf ("SPE\n");
14774           break;
14775         }
14776       return p;
14777     }
14778
14779   if (tag == Tag_GNU_Power_ABI_Struct_Return)
14780     {
14781       val = read_uleb128 (p, &len, end);
14782       p += len;
14783       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
14784       if (len == 0)
14785         {
14786           printf (_("<corrupt>\n"));
14787           return p;
14788         }
14789
14790       if (val > 2)
14791         printf ("(%#x), ", val);
14792
14793       switch (val & 3)
14794         {
14795         case 0:
14796           printf (_("unspecified\n"));
14797           break;
14798         case 1:
14799           printf ("r3/r4\n");
14800           break;
14801         case 2:
14802           printf (_("memory\n"));
14803           break;
14804         case 3:
14805           printf ("???\n");
14806           break;
14807         }
14808       return p;
14809     }
14810
14811   return display_tag_value (tag & 1, p, end);
14812 }
14813
14814 static unsigned char *
14815 display_s390_gnu_attribute (unsigned char * p,
14816                             unsigned int tag,
14817                             const unsigned char * const end)
14818 {
14819   unsigned int len;
14820   int val;
14821
14822   if (tag == Tag_GNU_S390_ABI_Vector)
14823     {
14824       val = read_uleb128 (p, &len, end);
14825       p += len;
14826       printf ("  Tag_GNU_S390_ABI_Vector: ");
14827
14828       switch (val)
14829         {
14830         case 0:
14831           printf (_("any\n"));
14832           break;
14833         case 1:
14834           printf (_("software\n"));
14835           break;
14836         case 2:
14837           printf (_("hardware\n"));
14838           break;
14839         default:
14840           printf ("??? (%d)\n", val);
14841           break;
14842         }
14843       return p;
14844    }
14845
14846   return display_tag_value (tag & 1, p, end);
14847 }
14848
14849 static void
14850 display_sparc_hwcaps (unsigned int mask)
14851 {
14852   if (mask)
14853     {
14854       bfd_boolean first = TRUE;
14855
14856       if (mask & ELF_SPARC_HWCAP_MUL32)
14857         fputs ("mul32", stdout), first = FALSE;
14858       if (mask & ELF_SPARC_HWCAP_DIV32)
14859         printf ("%sdiv32", first ? "" : "|"), first = FALSE;
14860       if (mask & ELF_SPARC_HWCAP_FSMULD)
14861         printf ("%sfsmuld", first ? "" : "|"), first = FALSE;
14862       if (mask & ELF_SPARC_HWCAP_V8PLUS)
14863         printf ("%sv8plus", first ? "" : "|"), first = FALSE;
14864       if (mask & ELF_SPARC_HWCAP_POPC)
14865         printf ("%spopc", first ? "" : "|"), first = FALSE;
14866       if (mask & ELF_SPARC_HWCAP_VIS)
14867         printf ("%svis", first ? "" : "|"), first = FALSE;
14868       if (mask & ELF_SPARC_HWCAP_VIS2)
14869         printf ("%svis2", first ? "" : "|"), first = FALSE;
14870       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
14871         printf ("%sASIBlkInit", first ? "" : "|"), first = FALSE;
14872       if (mask & ELF_SPARC_HWCAP_FMAF)
14873         printf ("%sfmaf", first ? "" : "|"), first = FALSE;
14874       if (mask & ELF_SPARC_HWCAP_VIS3)
14875         printf ("%svis3", first ? "" : "|"), first = FALSE;
14876       if (mask & ELF_SPARC_HWCAP_HPC)
14877         printf ("%shpc", first ? "" : "|"), first = FALSE;
14878       if (mask & ELF_SPARC_HWCAP_RANDOM)
14879         printf ("%srandom", first ? "" : "|"), first = FALSE;
14880       if (mask & ELF_SPARC_HWCAP_TRANS)
14881         printf ("%strans", first ? "" : "|"), first = FALSE;
14882       if (mask & ELF_SPARC_HWCAP_FJFMAU)
14883         printf ("%sfjfmau", first ? "" : "|"), first = FALSE;
14884       if (mask & ELF_SPARC_HWCAP_IMA)
14885         printf ("%sima", first ? "" : "|"), first = FALSE;
14886       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
14887         printf ("%scspare", first ? "" : "|"), first = FALSE;
14888     }
14889   else
14890     fputc ('0', stdout);
14891   fputc ('\n', stdout);
14892 }
14893
14894 static void
14895 display_sparc_hwcaps2 (unsigned int mask)
14896 {
14897   if (mask)
14898     {
14899       bfd_boolean first = TRUE;
14900
14901       if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
14902         fputs ("fjathplus", stdout), first = FALSE;
14903       if (mask & ELF_SPARC_HWCAP2_VIS3B)
14904         printf ("%svis3b", first ? "" : "|"), first = FALSE;
14905       if (mask & ELF_SPARC_HWCAP2_ADP)
14906         printf ("%sadp", first ? "" : "|"), first = FALSE;
14907       if (mask & ELF_SPARC_HWCAP2_SPARC5)
14908         printf ("%ssparc5", first ? "" : "|"), first = FALSE;
14909       if (mask & ELF_SPARC_HWCAP2_MWAIT)
14910         printf ("%smwait", first ? "" : "|"), first = FALSE;
14911       if (mask & ELF_SPARC_HWCAP2_XMPMUL)
14912         printf ("%sxmpmul", first ? "" : "|"), first = FALSE;
14913       if (mask & ELF_SPARC_HWCAP2_XMONT)
14914         printf ("%sxmont2", first ? "" : "|"), first = FALSE;
14915       if (mask & ELF_SPARC_HWCAP2_NSEC)
14916         printf ("%snsec", first ? "" : "|"), first = FALSE;
14917       if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
14918         printf ("%sfjathhpc", first ? "" : "|"), first = FALSE;
14919       if (mask & ELF_SPARC_HWCAP2_FJDES)
14920         printf ("%sfjdes", first ? "" : "|"), first = FALSE;
14921       if (mask & ELF_SPARC_HWCAP2_FJAES)
14922         printf ("%sfjaes", first ? "" : "|"), first = FALSE;
14923     }
14924   else
14925     fputc ('0', stdout);
14926   fputc ('\n', stdout);
14927 }
14928
14929 static unsigned char *
14930 display_sparc_gnu_attribute (unsigned char * p,
14931                              unsigned int tag,
14932                              const unsigned char * const end)
14933 {
14934   unsigned int len;
14935   int val;
14936
14937   if (tag == Tag_GNU_Sparc_HWCAPS)
14938     {
14939       val = read_uleb128 (p, &len, end);
14940       p += len;
14941       printf ("  Tag_GNU_Sparc_HWCAPS: ");
14942       display_sparc_hwcaps (val);
14943       return p;
14944     }
14945   if (tag == Tag_GNU_Sparc_HWCAPS2)
14946     {
14947       val = read_uleb128 (p, &len, end);
14948       p += len;
14949       printf ("  Tag_GNU_Sparc_HWCAPS2: ");
14950       display_sparc_hwcaps2 (val);
14951       return p;
14952     }
14953
14954   return display_tag_value (tag, p, end);
14955 }
14956
14957 static void
14958 print_mips_fp_abi_value (unsigned int val)
14959 {
14960   switch (val)
14961     {
14962     case Val_GNU_MIPS_ABI_FP_ANY:
14963       printf (_("Hard or soft float\n"));
14964       break;
14965     case Val_GNU_MIPS_ABI_FP_DOUBLE:
14966       printf (_("Hard float (double precision)\n"));
14967       break;
14968     case Val_GNU_MIPS_ABI_FP_SINGLE:
14969       printf (_("Hard float (single precision)\n"));
14970       break;
14971     case Val_GNU_MIPS_ABI_FP_SOFT:
14972       printf (_("Soft float\n"));
14973       break;
14974     case Val_GNU_MIPS_ABI_FP_OLD_64:
14975       printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
14976       break;
14977     case Val_GNU_MIPS_ABI_FP_XX:
14978       printf (_("Hard float (32-bit CPU, Any FPU)\n"));
14979       break;
14980     case Val_GNU_MIPS_ABI_FP_64:
14981       printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
14982       break;
14983     case Val_GNU_MIPS_ABI_FP_64A:
14984       printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
14985       break;
14986     case Val_GNU_MIPS_ABI_FP_NAN2008:
14987       printf (_("NaN 2008 compatibility\n"));
14988       break;
14989     default:
14990       printf ("??? (%d)\n", val);
14991       break;
14992     }
14993 }
14994
14995 static unsigned char *
14996 display_mips_gnu_attribute (unsigned char * p,
14997                             unsigned int tag,
14998                             const unsigned char * const end)
14999 {
15000   if (tag == Tag_GNU_MIPS_ABI_FP)
15001     {
15002       unsigned int len;
15003       unsigned int val;
15004
15005       val = read_uleb128 (p, &len, end);
15006       p += len;
15007       printf ("  Tag_GNU_MIPS_ABI_FP: ");
15008
15009       print_mips_fp_abi_value (val);
15010
15011       return p;
15012    }
15013
15014   if (tag == Tag_GNU_MIPS_ABI_MSA)
15015     {
15016       unsigned int len;
15017       unsigned int val;
15018
15019       val = read_uleb128 (p, &len, end);
15020       p += len;
15021       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
15022
15023       switch (val)
15024         {
15025         case Val_GNU_MIPS_ABI_MSA_ANY:
15026           printf (_("Any MSA or not\n"));
15027           break;
15028         case Val_GNU_MIPS_ABI_MSA_128:
15029           printf (_("128-bit MSA\n"));
15030           break;
15031         default:
15032           printf ("??? (%d)\n", val);
15033           break;
15034         }
15035       return p;
15036     }
15037
15038   return display_tag_value (tag & 1, p, end);
15039 }
15040
15041 static unsigned char *
15042 display_tic6x_attribute (unsigned char * p,
15043                          const unsigned char * const end)
15044 {
15045   unsigned int tag;
15046   unsigned int len;
15047   int val;
15048
15049   tag = read_uleb128 (p, &len, end);
15050   p += len;
15051
15052   switch (tag)
15053     {
15054     case Tag_ISA:
15055       val = read_uleb128 (p, &len, end);
15056       p += len;
15057       printf ("  Tag_ISA: ");
15058
15059       switch (val)
15060         {
15061         case C6XABI_Tag_ISA_none:
15062           printf (_("None\n"));
15063           break;
15064         case C6XABI_Tag_ISA_C62X:
15065           printf ("C62x\n");
15066           break;
15067         case C6XABI_Tag_ISA_C67X:
15068           printf ("C67x\n");
15069           break;
15070         case C6XABI_Tag_ISA_C67XP:
15071           printf ("C67x+\n");
15072           break;
15073         case C6XABI_Tag_ISA_C64X:
15074           printf ("C64x\n");
15075           break;
15076         case C6XABI_Tag_ISA_C64XP:
15077           printf ("C64x+\n");
15078           break;
15079         case C6XABI_Tag_ISA_C674X:
15080           printf ("C674x\n");
15081           break;
15082         default:
15083           printf ("??? (%d)\n", val);
15084           break;
15085         }
15086       return p;
15087
15088     case Tag_ABI_wchar_t:
15089       val = read_uleb128 (p, &len, end);
15090       p += len;
15091       printf ("  Tag_ABI_wchar_t: ");
15092       switch (val)
15093         {
15094         case 0:
15095           printf (_("Not used\n"));
15096           break;
15097         case 1:
15098           printf (_("2 bytes\n"));
15099           break;
15100         case 2:
15101           printf (_("4 bytes\n"));
15102           break;
15103         default:
15104           printf ("??? (%d)\n", val);
15105           break;
15106         }
15107       return p;
15108
15109     case Tag_ABI_stack_align_needed:
15110       val = read_uleb128 (p, &len, end);
15111       p += len;
15112       printf ("  Tag_ABI_stack_align_needed: ");
15113       switch (val)
15114         {
15115         case 0:
15116           printf (_("8-byte\n"));
15117           break;
15118         case 1:
15119           printf (_("16-byte\n"));
15120           break;
15121         default:
15122           printf ("??? (%d)\n", val);
15123           break;
15124         }
15125       return p;
15126
15127     case Tag_ABI_stack_align_preserved:
15128       val = read_uleb128 (p, &len, end);
15129       p += len;
15130       printf ("  Tag_ABI_stack_align_preserved: ");
15131       switch (val)
15132         {
15133         case 0:
15134           printf (_("8-byte\n"));
15135           break;
15136         case 1:
15137           printf (_("16-byte\n"));
15138           break;
15139         default:
15140           printf ("??? (%d)\n", val);
15141           break;
15142         }
15143       return p;
15144
15145     case Tag_ABI_DSBT:
15146       val = read_uleb128 (p, &len, end);
15147       p += len;
15148       printf ("  Tag_ABI_DSBT: ");
15149       switch (val)
15150         {
15151         case 0:
15152           printf (_("DSBT addressing not used\n"));
15153           break;
15154         case 1:
15155           printf (_("DSBT addressing used\n"));
15156           break;
15157         default:
15158           printf ("??? (%d)\n", val);
15159           break;
15160         }
15161       return p;
15162
15163     case Tag_ABI_PID:
15164       val = read_uleb128 (p, &len, end);
15165       p += len;
15166       printf ("  Tag_ABI_PID: ");
15167       switch (val)
15168         {
15169         case 0:
15170           printf (_("Data addressing position-dependent\n"));
15171           break;
15172         case 1:
15173           printf (_("Data addressing position-independent, GOT near DP\n"));
15174           break;
15175         case 2:
15176           printf (_("Data addressing position-independent, GOT far from DP\n"));
15177           break;
15178         default:
15179           printf ("??? (%d)\n", val);
15180           break;
15181         }
15182       return p;
15183
15184     case Tag_ABI_PIC:
15185       val = read_uleb128 (p, &len, end);
15186       p += len;
15187       printf ("  Tag_ABI_PIC: ");
15188       switch (val)
15189         {
15190         case 0:
15191           printf (_("Code addressing position-dependent\n"));
15192           break;
15193         case 1:
15194           printf (_("Code addressing position-independent\n"));
15195           break;
15196         default:
15197           printf ("??? (%d)\n", val);
15198           break;
15199         }
15200       return p;
15201
15202     case Tag_ABI_array_object_alignment:
15203       val = read_uleb128 (p, &len, end);
15204       p += len;
15205       printf ("  Tag_ABI_array_object_alignment: ");
15206       switch (val)
15207         {
15208         case 0:
15209           printf (_("8-byte\n"));
15210           break;
15211         case 1:
15212           printf (_("4-byte\n"));
15213           break;
15214         case 2:
15215           printf (_("16-byte\n"));
15216           break;
15217         default:
15218           printf ("??? (%d)\n", val);
15219           break;
15220         }
15221       return p;
15222
15223     case Tag_ABI_array_object_align_expected:
15224       val = read_uleb128 (p, &len, end);
15225       p += len;
15226       printf ("  Tag_ABI_array_object_align_expected: ");
15227       switch (val)
15228         {
15229         case 0:
15230           printf (_("8-byte\n"));
15231           break;
15232         case 1:
15233           printf (_("4-byte\n"));
15234           break;
15235         case 2:
15236           printf (_("16-byte\n"));
15237           break;
15238         default:
15239           printf ("??? (%d)\n", val);
15240           break;
15241         }
15242       return p;
15243
15244     case Tag_ABI_compatibility:
15245       {
15246         val = read_uleb128 (p, &len, end);
15247         p += len;
15248         printf ("  Tag_ABI_compatibility: ");
15249         printf (_("flag = %d, vendor = "), val);
15250         if (p < end - 1)
15251           {
15252             size_t maxlen = (end - p) - 1;
15253
15254             print_symbol ((int) maxlen, (const char *) p);
15255             p += strnlen ((char *) p, maxlen) + 1;
15256           }
15257         else
15258           {
15259             printf (_("<corrupt>"));
15260             p = (unsigned char *) end;
15261           }
15262         putchar ('\n');
15263         return p;
15264       }
15265
15266     case Tag_ABI_conformance:
15267       {
15268         printf ("  Tag_ABI_conformance: \"");
15269         if (p < end - 1)
15270           {
15271             size_t maxlen = (end - p) - 1;
15272
15273             print_symbol ((int) maxlen, (const char *) p);
15274             p += strnlen ((char *) p, maxlen) + 1;
15275           }
15276         else
15277           {
15278             printf (_("<corrupt>"));
15279             p = (unsigned char *) end;
15280           }
15281         printf ("\"\n");
15282         return p;
15283       }
15284     }
15285
15286   return display_tag_value (tag, p, end);
15287 }
15288
15289 static void
15290 display_raw_attribute (unsigned char * p, unsigned char const * const end)
15291 {
15292   unsigned long addr = 0;
15293   size_t bytes = end - p;
15294
15295   assert (end >= p);
15296   while (bytes)
15297     {
15298       int j;
15299       int k;
15300       int lbytes = (bytes > 16 ? 16 : bytes);
15301
15302       printf ("  0x%8.8lx ", addr);
15303
15304       for (j = 0; j < 16; j++)
15305         {
15306           if (j < lbytes)
15307             printf ("%2.2x", p[j]);
15308           else
15309             printf ("  ");
15310
15311           if ((j & 3) == 3)
15312             printf (" ");
15313         }
15314
15315       for (j = 0; j < lbytes; j++)
15316         {
15317           k = p[j];
15318           if (k >= ' ' && k < 0x7f)
15319             printf ("%c", k);
15320           else
15321             printf (".");
15322         }
15323
15324       putchar ('\n');
15325
15326       p  += lbytes;
15327       bytes -= lbytes;
15328       addr += lbytes;
15329     }
15330
15331   putchar ('\n');
15332 }
15333
15334 static unsigned char *
15335 display_msp430x_attribute (unsigned char * p,
15336                            const unsigned char * const end)
15337 {
15338   unsigned int len;
15339   unsigned int val;
15340   unsigned int tag;
15341
15342   tag = read_uleb128 (p, & len, end);
15343   p += len;
15344
15345   switch (tag)
15346     {
15347     case OFBA_MSPABI_Tag_ISA:
15348       val = read_uleb128 (p, &len, end);
15349       p += len;
15350       printf ("  Tag_ISA: ");
15351       switch (val)
15352         {
15353         case 0: printf (_("None\n")); break;
15354         case 1: printf (_("MSP430\n")); break;
15355         case 2: printf (_("MSP430X\n")); break;
15356         default: printf ("??? (%d)\n", val); break;
15357         }
15358       break;
15359
15360     case OFBA_MSPABI_Tag_Code_Model:
15361       val = read_uleb128 (p, &len, end);
15362       p += len;
15363       printf ("  Tag_Code_Model: ");
15364       switch (val)
15365         {
15366         case 0: printf (_("None\n")); break;
15367         case 1: printf (_("Small\n")); break;
15368         case 2: printf (_("Large\n")); break;
15369         default: printf ("??? (%d)\n", val); break;
15370         }
15371       break;
15372
15373     case OFBA_MSPABI_Tag_Data_Model:
15374       val = read_uleb128 (p, &len, end);
15375       p += len;
15376       printf ("  Tag_Data_Model: ");
15377       switch (val)
15378         {
15379         case 0: printf (_("None\n")); break;
15380         case 1: printf (_("Small\n")); break;
15381         case 2: printf (_("Large\n")); break;
15382         case 3: printf (_("Restricted Large\n")); break;
15383         default: printf ("??? (%d)\n", val); break;
15384         }
15385       break;
15386
15387     default:
15388       printf (_("  <unknown tag %d>: "), tag);
15389
15390       if (tag & 1)
15391         {
15392           putchar ('"');
15393           if (p < end - 1)
15394             {
15395               size_t maxlen = (end - p) - 1;
15396
15397               print_symbol ((int) maxlen, (const char *) p);
15398               p += strnlen ((char *) p, maxlen) + 1;
15399             }
15400           else
15401             {
15402               printf (_("<corrupt>"));
15403               p = (unsigned char *) end;
15404             }
15405           printf ("\"\n");
15406         }
15407       else
15408         {
15409           val = read_uleb128 (p, &len, end);
15410           p += len;
15411           printf ("%d (0x%x)\n", val, val);
15412         }
15413       break;
15414    }
15415
15416   assert (p <= end);
15417   return p;
15418 }
15419
15420 struct riscv_attr_tag_t {
15421   const char *name;
15422   int tag;
15423 };
15424
15425 static struct riscv_attr_tag_t riscv_attr_tag[] =
15426 {
15427 #define T(tag) {"Tag_RISCV_" #tag, Tag_RISCV_##tag}
15428   T(arch),
15429   T(priv_spec),
15430   T(priv_spec_minor),
15431   T(priv_spec_revision),
15432   T(unaligned_access),
15433   T(stack_align),
15434 #undef T
15435 };
15436
15437 static unsigned char *
15438 display_riscv_attribute (unsigned char *p,
15439                          const unsigned char * const end)
15440 {
15441   unsigned int len;
15442   int val;
15443   int tag;
15444   struct riscv_attr_tag_t *attr = NULL;
15445   unsigned i;
15446
15447   tag = read_uleb128 (p, &len, end);
15448   p += len;
15449
15450   /* Find the name of attribute. */
15451   for (i = 0; i < ARRAY_SIZE (riscv_attr_tag); i++)
15452     {
15453       if (riscv_attr_tag[i].tag == tag)
15454         {
15455           attr = &riscv_attr_tag[i];
15456           break;
15457         }
15458     }
15459
15460   if (attr)
15461     printf ("  %s: ", attr->name);
15462   else
15463     return display_tag_value (tag, p, end);
15464
15465   switch (tag)
15466     {
15467     case Tag_RISCV_priv_spec:
15468     case Tag_RISCV_priv_spec_minor:
15469     case Tag_RISCV_priv_spec_revision:
15470       val = read_uleb128 (p, &len, end);
15471       p += len;
15472       printf (_("%d\n"), val);
15473       break;
15474     case Tag_RISCV_unaligned_access:
15475       val = read_uleb128 (p, &len, end);
15476       p += len;
15477       switch (val)
15478         {
15479         case 0:
15480           printf (_("No unaligned access\n"));
15481           break;
15482         case 1:
15483           printf (_("Unaligned access\n"));
15484           break;
15485         }
15486       break;
15487     case Tag_RISCV_stack_align:
15488       val = read_uleb128 (p, &len, end);
15489       p += len;
15490       printf (_("%d-bytes\n"), val);
15491       break;
15492     case Tag_RISCV_arch:
15493       p = display_tag_value (-1, p, end);
15494       break;
15495     default:
15496       return display_tag_value (tag, p, end);
15497     }
15498
15499   return p;
15500 }
15501
15502 static bfd_boolean
15503 process_attributes (Filedata * filedata,
15504                     const char * public_name,
15505                     unsigned int proc_type,
15506                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
15507                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const))
15508 {
15509   Elf_Internal_Shdr * sect;
15510   unsigned i;
15511   bfd_boolean res = TRUE;
15512
15513   /* Find the section header so that we get the size.  */
15514   for (i = 0, sect = filedata->section_headers;
15515        i < filedata->file_header.e_shnum;
15516        i++, sect++)
15517     {
15518       unsigned char * contents;
15519       unsigned char * p;
15520
15521       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
15522         continue;
15523
15524       contents = (unsigned char *) get_data (NULL, filedata, sect->sh_offset, 1,
15525                                              sect->sh_size, _("attributes"));
15526       if (contents == NULL)
15527         {
15528           res = FALSE;
15529           continue;
15530         }
15531
15532       p = contents;
15533       /* The first character is the version of the attributes.
15534          Currently only version 1, (aka 'A') is recognised here.  */
15535       if (*p != 'A')
15536         {
15537           printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p);
15538           res = FALSE;
15539         }
15540       else
15541         {
15542           bfd_vma section_len;
15543
15544           section_len = sect->sh_size - 1;
15545           p++;
15546
15547           while (section_len > 0)
15548             {
15549               bfd_vma attr_len;
15550               unsigned int namelen;
15551               bfd_boolean public_section;
15552               bfd_boolean gnu_section;
15553
15554               if (section_len <= 4)
15555                 {
15556                   error (_("Tag section ends prematurely\n"));
15557                   res = FALSE;
15558                   break;
15559                 }
15560               attr_len = byte_get (p, 4);
15561               p += 4;
15562
15563               if (attr_len > section_len)
15564                 {
15565                   error (_("Bad attribute length (%u > %u)\n"),
15566                           (unsigned) attr_len, (unsigned) section_len);
15567                   attr_len = section_len;
15568                   res = FALSE;
15569                 }
15570               /* PR 17531: file: 001-101425-0.004  */
15571               else if (attr_len < 5)
15572                 {
15573                   error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
15574                   res = FALSE;
15575                   break;
15576                 }
15577
15578               section_len -= attr_len;
15579               attr_len -= 4;
15580
15581               namelen = strnlen ((char *) p, attr_len) + 1;
15582               if (namelen == 0 || namelen >= attr_len)
15583                 {
15584                   error (_("Corrupt attribute section name\n"));
15585                   res = FALSE;
15586                   break;
15587                 }
15588
15589               printf (_("Attribute Section: "));
15590               print_symbol (INT_MAX, (const char *) p);
15591               putchar ('\n');
15592
15593               if (public_name && streq ((char *) p, public_name))
15594                 public_section = TRUE;
15595               else
15596                 public_section = FALSE;
15597
15598               if (streq ((char *) p, "gnu"))
15599                 gnu_section = TRUE;
15600               else
15601                 gnu_section = FALSE;
15602
15603               p += namelen;
15604               attr_len -= namelen;
15605
15606               while (attr_len > 0 && p < contents + sect->sh_size)
15607                 {
15608                   int tag;
15609                   int val;
15610                   bfd_vma size;
15611                   unsigned char * end;
15612
15613                   /* PR binutils/17531: Safe handling of corrupt files.  */
15614                   if (attr_len < 6)
15615                     {
15616                       error (_("Unused bytes at end of section\n"));
15617                       res = FALSE;
15618                       section_len = 0;
15619                       break;
15620                     }
15621
15622                   tag = *(p++);
15623                   size = byte_get (p, 4);
15624                   if (size > attr_len)
15625                     {
15626                       error (_("Bad subsection length (%u > %u)\n"),
15627                               (unsigned) size, (unsigned) attr_len);
15628                       res = FALSE;
15629                       size = attr_len;
15630                     }
15631                   /* PR binutils/17531: Safe handling of corrupt files.  */
15632                   if (size < 6)
15633                     {
15634                       error (_("Bad subsection length (%u < 6)\n"),
15635                               (unsigned) size);
15636                       res = FALSE;
15637                       section_len = 0;
15638                       break;
15639                     }
15640
15641                   attr_len -= size;
15642                   end = p + size - 1;
15643                   assert (end <= contents + sect->sh_size);
15644                   p += 4;
15645
15646                   switch (tag)
15647                     {
15648                     case 1:
15649                       printf (_("File Attributes\n"));
15650                       break;
15651                     case 2:
15652                       printf (_("Section Attributes:"));
15653                       goto do_numlist;
15654                     case 3:
15655                       printf (_("Symbol Attributes:"));
15656                       /* Fall through.  */
15657                     do_numlist:
15658                       for (;;)
15659                         {
15660                           unsigned int j;
15661
15662                           val = read_uleb128 (p, &j, end);
15663                           p += j;
15664                           if (val == 0)
15665                             break;
15666                           printf (" %d", val);
15667                         }
15668                       printf ("\n");
15669                       break;
15670                     default:
15671                       printf (_("Unknown tag: %d\n"), tag);
15672                       public_section = FALSE;
15673                       break;
15674                     }
15675
15676                   if (public_section && display_pub_attribute != NULL)
15677                     {
15678                       while (p < end)
15679                         p = display_pub_attribute (p, end);
15680                       assert (p == end);
15681                     }
15682                   else if (gnu_section && display_proc_gnu_attribute != NULL)
15683                     {
15684                       while (p < end)
15685                         p = display_gnu_attribute (p,
15686                                                    display_proc_gnu_attribute,
15687                                                    end);
15688                       assert (p == end);
15689                     }
15690                   else if (p < end)
15691                     {
15692                       printf (_("  Unknown attribute:\n"));
15693                       display_raw_attribute (p, end);
15694                       p = end;
15695                     }
15696                   else
15697                     attr_len = 0;
15698                 }
15699             }
15700         }
15701
15702       free (contents);
15703     }
15704
15705   return res;
15706 }
15707
15708 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
15709    Print the Address, Access and Initial fields of an entry at VMA ADDR
15710    and return the VMA of the next entry, or -1 if there was a problem.
15711    Does not read from DATA_END or beyond.  */
15712
15713 static bfd_vma
15714 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
15715                       unsigned char * data_end)
15716 {
15717   printf ("  ");
15718   print_vma (addr, LONG_HEX);
15719   printf (" ");
15720   if (addr < pltgot + 0xfff0)
15721     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
15722   else
15723     printf ("%10s", "");
15724   printf (" ");
15725   if (data == NULL)
15726     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15727   else
15728     {
15729       bfd_vma entry;
15730       unsigned char * from = data + addr - pltgot;
15731
15732       if (from + (is_32bit_elf ? 4 : 8) > data_end)
15733         {
15734           warn (_("MIPS GOT entry extends beyond the end of available data\n"));
15735           printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
15736           return (bfd_vma) -1;
15737         }
15738       else
15739         {
15740           entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15741           print_vma (entry, LONG_HEX);
15742         }
15743     }
15744   return addr + (is_32bit_elf ? 4 : 8);
15745 }
15746
15747 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
15748    PLTGOT.  Print the Address and Initial fields of an entry at VMA
15749    ADDR and return the VMA of the next entry.  */
15750
15751 static bfd_vma
15752 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
15753 {
15754   printf ("  ");
15755   print_vma (addr, LONG_HEX);
15756   printf (" ");
15757   if (data == NULL)
15758     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15759   else
15760     {
15761       bfd_vma entry;
15762
15763       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15764       print_vma (entry, LONG_HEX);
15765     }
15766   return addr + (is_32bit_elf ? 4 : 8);
15767 }
15768
15769 static void
15770 print_mips_ases (unsigned int mask)
15771 {
15772   if (mask & AFL_ASE_DSP)
15773     fputs ("\n\tDSP ASE", stdout);
15774   if (mask & AFL_ASE_DSPR2)
15775     fputs ("\n\tDSP R2 ASE", stdout);
15776   if (mask & AFL_ASE_DSPR3)
15777     fputs ("\n\tDSP R3 ASE", stdout);
15778   if (mask & AFL_ASE_EVA)
15779     fputs ("\n\tEnhanced VA Scheme", stdout);
15780   if (mask & AFL_ASE_MCU)
15781     fputs ("\n\tMCU (MicroController) ASE", stdout);
15782   if (mask & AFL_ASE_MDMX)
15783     fputs ("\n\tMDMX ASE", stdout);
15784   if (mask & AFL_ASE_MIPS3D)
15785     fputs ("\n\tMIPS-3D ASE", stdout);
15786   if (mask & AFL_ASE_MT)
15787     fputs ("\n\tMT ASE", stdout);
15788   if (mask & AFL_ASE_SMARTMIPS)
15789     fputs ("\n\tSmartMIPS ASE", stdout);
15790   if (mask & AFL_ASE_VIRT)
15791     fputs ("\n\tVZ ASE", stdout);
15792   if (mask & AFL_ASE_MSA)
15793     fputs ("\n\tMSA ASE", stdout);
15794   if (mask & AFL_ASE_MIPS16)
15795     fputs ("\n\tMIPS16 ASE", stdout);
15796   if (mask & AFL_ASE_MICROMIPS)
15797     fputs ("\n\tMICROMIPS ASE", stdout);
15798   if (mask & AFL_ASE_XPA)
15799     fputs ("\n\tXPA ASE", stdout);
15800   if (mask & AFL_ASE_MIPS16E2)
15801     fputs ("\n\tMIPS16e2 ASE", stdout);
15802   if (mask & AFL_ASE_CRC)
15803     fputs ("\n\tCRC ASE", stdout);
15804   if (mask & AFL_ASE_GINV)
15805     fputs ("\n\tGINV ASE", stdout);
15806   if (mask & AFL_ASE_LOONGSON_MMI)
15807     fputs ("\n\tLoongson MMI ASE", stdout);
15808   if (mask & AFL_ASE_LOONGSON_CAM)
15809     fputs ("\n\tLoongson CAM ASE", stdout);
15810   if (mask & AFL_ASE_LOONGSON_EXT)
15811     fputs ("\n\tLoongson EXT ASE", stdout);
15812   if (mask & AFL_ASE_LOONGSON_EXT2)
15813     fputs ("\n\tLoongson EXT2 ASE", stdout);
15814   if (mask == 0)
15815     fprintf (stdout, "\n\t%s", _("None"));
15816   else if ((mask & ~AFL_ASE_MASK) != 0)
15817     fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
15818 }
15819
15820 static void
15821 print_mips_isa_ext (unsigned int isa_ext)
15822 {
15823   switch (isa_ext)
15824     {
15825     case 0:
15826       fputs (_("None"), stdout);
15827       break;
15828     case AFL_EXT_XLR:
15829       fputs ("RMI XLR", stdout);
15830       break;
15831     case AFL_EXT_OCTEON3:
15832       fputs ("Cavium Networks Octeon3", stdout);
15833       break;
15834     case AFL_EXT_OCTEON2:
15835       fputs ("Cavium Networks Octeon2", stdout);
15836       break;
15837     case AFL_EXT_OCTEONP:
15838       fputs ("Cavium Networks OcteonP", stdout);
15839       break;
15840     case AFL_EXT_OCTEON:
15841       fputs ("Cavium Networks Octeon", stdout);
15842       break;
15843     case AFL_EXT_5900:
15844       fputs ("Toshiba R5900", stdout);
15845       break;
15846     case AFL_EXT_4650:
15847       fputs ("MIPS R4650", stdout);
15848       break;
15849     case AFL_EXT_4010:
15850       fputs ("LSI R4010", stdout);
15851       break;
15852     case AFL_EXT_4100:
15853       fputs ("NEC VR4100", stdout);
15854       break;
15855     case AFL_EXT_3900:
15856       fputs ("Toshiba R3900", stdout);
15857       break;
15858     case AFL_EXT_10000:
15859       fputs ("MIPS R10000", stdout);
15860       break;
15861     case AFL_EXT_SB1:
15862       fputs ("Broadcom SB-1", stdout);
15863       break;
15864     case AFL_EXT_4111:
15865       fputs ("NEC VR4111/VR4181", stdout);
15866       break;
15867     case AFL_EXT_4120:
15868       fputs ("NEC VR4120", stdout);
15869       break;
15870     case AFL_EXT_5400:
15871       fputs ("NEC VR5400", stdout);
15872       break;
15873     case AFL_EXT_5500:
15874       fputs ("NEC VR5500", stdout);
15875       break;
15876     case AFL_EXT_LOONGSON_2E:
15877       fputs ("ST Microelectronics Loongson 2E", stdout);
15878       break;
15879     case AFL_EXT_LOONGSON_2F:
15880       fputs ("ST Microelectronics Loongson 2F", stdout);
15881       break;
15882     case AFL_EXT_INTERAPTIV_MR2:
15883       fputs ("Imagination interAptiv MR2", stdout);
15884       break;
15885     default:
15886       fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
15887     }
15888 }
15889
15890 static signed int
15891 get_mips_reg_size (int reg_size)
15892 {
15893   return (reg_size == AFL_REG_NONE) ? 0
15894          : (reg_size == AFL_REG_32) ? 32
15895          : (reg_size == AFL_REG_64) ? 64
15896          : (reg_size == AFL_REG_128) ? 128
15897          : -1;
15898 }
15899
15900 static bfd_boolean
15901 process_mips_specific (Filedata * filedata)
15902 {
15903   Elf_Internal_Dyn * entry;
15904   Elf_Internal_Shdr *sect = NULL;
15905   size_t liblist_offset = 0;
15906   size_t liblistno = 0;
15907   size_t conflictsno = 0;
15908   size_t options_offset = 0;
15909   size_t conflicts_offset = 0;
15910   size_t pltrelsz = 0;
15911   size_t pltrel = 0;
15912   bfd_vma pltgot = 0;
15913   bfd_vma mips_pltgot = 0;
15914   bfd_vma jmprel = 0;
15915   bfd_vma local_gotno = 0;
15916   bfd_vma gotsym = 0;
15917   bfd_vma symtabno = 0;
15918   bfd_boolean res = TRUE;
15919
15920   if (! process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
15921                             display_mips_gnu_attribute))
15922     res = FALSE;
15923
15924   sect = find_section (filedata, ".MIPS.abiflags");
15925
15926   if (sect != NULL)
15927     {
15928       Elf_External_ABIFlags_v0 *abiflags_ext;
15929       Elf_Internal_ABIFlags_v0 abiflags_in;
15930
15931       if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
15932         {
15933           error (_("Corrupt MIPS ABI Flags section.\n"));
15934           res = FALSE;
15935         }
15936       else
15937         {
15938           abiflags_ext = get_data (NULL, filedata, sect->sh_offset, 1,
15939                                    sect->sh_size, _("MIPS ABI Flags section"));
15940           if (abiflags_ext)
15941             {
15942               abiflags_in.version = BYTE_GET (abiflags_ext->version);
15943               abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
15944               abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
15945               abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
15946               abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
15947               abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
15948               abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
15949               abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
15950               abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
15951               abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
15952               abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
15953
15954               printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
15955               printf ("\nISA: MIPS%d", abiflags_in.isa_level);
15956               if (abiflags_in.isa_rev > 1)
15957                 printf ("r%d", abiflags_in.isa_rev);
15958               printf ("\nGPR size: %d",
15959                       get_mips_reg_size (abiflags_in.gpr_size));
15960               printf ("\nCPR1 size: %d",
15961                       get_mips_reg_size (abiflags_in.cpr1_size));
15962               printf ("\nCPR2 size: %d",
15963                       get_mips_reg_size (abiflags_in.cpr2_size));
15964               fputs ("\nFP ABI: ", stdout);
15965               print_mips_fp_abi_value (abiflags_in.fp_abi);
15966               fputs ("ISA Extension: ", stdout);
15967               print_mips_isa_ext (abiflags_in.isa_ext);
15968               fputs ("\nASEs:", stdout);
15969               print_mips_ases (abiflags_in.ases);
15970               printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
15971               printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
15972               fputc ('\n', stdout);
15973               free (abiflags_ext);
15974             }
15975         }
15976     }
15977
15978   /* We have a lot of special sections.  Thanks SGI!  */
15979   if (dynamic_section == NULL)
15980     {
15981       /* No dynamic information available.  See if there is static GOT.  */
15982       sect = find_section (filedata, ".got");
15983       if (sect != NULL)
15984         {
15985           unsigned char *data_end;
15986           unsigned char *data;
15987           bfd_vma ent, end;
15988           int addr_size;
15989
15990           pltgot = sect->sh_addr;
15991
15992           ent = pltgot;
15993           addr_size = (is_32bit_elf ? 4 : 8);
15994           end = pltgot + sect->sh_size;
15995
15996           data = (unsigned char *) get_data (NULL, filedata, sect->sh_offset,
15997                                              end - pltgot, 1,
15998                                              _("Global Offset Table data"));
15999           /* PR 12855: Null data is handled gracefully throughout.  */
16000           data_end = data + (end - pltgot);
16001
16002           printf (_("\nStatic GOT:\n"));
16003           printf (_(" Canonical gp value: "));
16004           print_vma (ent + 0x7ff0, LONG_HEX);
16005           printf ("\n\n");
16006
16007           /* In a dynamic binary GOT[0] is reserved for the dynamic
16008              loader to store the lazy resolver pointer, however in
16009              a static binary it may well have been omitted and GOT
16010              reduced to a table of addresses.
16011              PR 21344: Check for the entry being fully available
16012              before fetching it.  */
16013           if (data
16014               && data + ent - pltgot + addr_size <= data_end
16015               && byte_get (data + ent - pltgot, addr_size) == 0)
16016             {
16017               printf (_(" Reserved entries:\n"));
16018               printf (_("  %*s %10s %*s\n"),
16019                       addr_size * 2, _("Address"), _("Access"),
16020                       addr_size * 2, _("Value"));
16021               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16022               printf ("\n");
16023               if (ent == (bfd_vma) -1)
16024                 goto sgot_print_fail;
16025
16026               /* Check for the MSB of GOT[1] being set, identifying a
16027                  GNU object.  This entry will be used by some runtime
16028                  loaders, to store the module pointer.  Otherwise this
16029                  is an ordinary local entry.
16030                  PR 21344: Check for the entry being fully available
16031                  before fetching it.  */
16032               if (data
16033                   && data + ent - pltgot + addr_size <= data_end
16034                   && (byte_get (data + ent - pltgot, addr_size)
16035                       >> (addr_size * 8 - 1)) != 0)
16036                 {
16037                   ent = print_mips_got_entry (data, pltgot, ent, data_end);
16038                   printf ("\n");
16039                   if (ent == (bfd_vma) -1)
16040                     goto sgot_print_fail;
16041                 }
16042               printf ("\n");
16043             }
16044
16045           if (data != NULL && ent < end)
16046             {
16047               printf (_(" Local entries:\n"));
16048               printf ("  %*s %10s %*s\n",
16049                       addr_size * 2, _("Address"), _("Access"),
16050                       addr_size * 2, _("Value"));
16051               while (ent < end)
16052                 {
16053                   ent = print_mips_got_entry (data, pltgot, ent, data_end);
16054                   printf ("\n");
16055                   if (ent == (bfd_vma) -1)
16056                     goto sgot_print_fail;
16057                 }
16058               printf ("\n");
16059             }
16060
16061         sgot_print_fail:
16062           if (data)
16063             free (data);
16064         }
16065       return res;
16066     }
16067
16068   for (entry = dynamic_section;
16069        /* PR 17531 file: 012-50589-0.004.  */
16070        entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
16071        ++entry)
16072     switch (entry->d_tag)
16073       {
16074       case DT_MIPS_LIBLIST:
16075         liblist_offset
16076           = offset_from_vma (filedata, entry->d_un.d_val,
16077                              liblistno * sizeof (Elf32_External_Lib));
16078         break;
16079       case DT_MIPS_LIBLISTNO:
16080         liblistno = entry->d_un.d_val;
16081         break;
16082       case DT_MIPS_OPTIONS:
16083         options_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
16084         break;
16085       case DT_MIPS_CONFLICT:
16086         conflicts_offset
16087           = offset_from_vma (filedata, entry->d_un.d_val,
16088                              conflictsno * sizeof (Elf32_External_Conflict));
16089         break;
16090       case DT_MIPS_CONFLICTNO:
16091         conflictsno = entry->d_un.d_val;
16092         break;
16093       case DT_PLTGOT:
16094         pltgot = entry->d_un.d_ptr;
16095         break;
16096       case DT_MIPS_LOCAL_GOTNO:
16097         local_gotno = entry->d_un.d_val;
16098         break;
16099       case DT_MIPS_GOTSYM:
16100         gotsym = entry->d_un.d_val;
16101         break;
16102       case DT_MIPS_SYMTABNO:
16103         symtabno = entry->d_un.d_val;
16104         break;
16105       case DT_MIPS_PLTGOT:
16106         mips_pltgot = entry->d_un.d_ptr;
16107         break;
16108       case DT_PLTREL:
16109         pltrel = entry->d_un.d_val;
16110         break;
16111       case DT_PLTRELSZ:
16112         pltrelsz = entry->d_un.d_val;
16113         break;
16114       case DT_JMPREL:
16115         jmprel = entry->d_un.d_ptr;
16116         break;
16117       default:
16118         break;
16119       }
16120
16121   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
16122     {
16123       Elf32_External_Lib * elib;
16124       size_t cnt;
16125
16126       elib = (Elf32_External_Lib *) get_data (NULL, filedata, liblist_offset,
16127                                               liblistno,
16128                                               sizeof (Elf32_External_Lib),
16129                                               _("liblist section data"));
16130       if (elib)
16131         {
16132           printf (ngettext ("\nSection '.liblist' contains %lu entry:\n",
16133                             "\nSection '.liblist' contains %lu entries:\n",
16134                             (unsigned long) liblistno),
16135                   (unsigned long) liblistno);
16136           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
16137                  stdout);
16138
16139           for (cnt = 0; cnt < liblistno; ++cnt)
16140             {
16141               Elf32_Lib liblist;
16142               time_t atime;
16143               char timebuf[128];
16144               struct tm * tmp;
16145
16146               liblist.l_name = BYTE_GET (elib[cnt].l_name);
16147               atime = BYTE_GET (elib[cnt].l_time_stamp);
16148               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16149               liblist.l_version = BYTE_GET (elib[cnt].l_version);
16150               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16151
16152               tmp = gmtime (&atime);
16153               snprintf (timebuf, sizeof (timebuf),
16154                         "%04u-%02u-%02uT%02u:%02u:%02u",
16155                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16156                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16157
16158               printf ("%3lu: ", (unsigned long) cnt);
16159               if (VALID_DYNAMIC_NAME (liblist.l_name))
16160                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
16161               else
16162                 printf (_("<corrupt: %9ld>"), liblist.l_name);
16163               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
16164                       liblist.l_version);
16165
16166               if (liblist.l_flags == 0)
16167                 puts (_(" NONE"));
16168               else
16169                 {
16170                   static const struct
16171                   {
16172                     const char * name;
16173                     int bit;
16174                   }
16175                   l_flags_vals[] =
16176                   {
16177                     { " EXACT_MATCH", LL_EXACT_MATCH },
16178                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
16179                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
16180                     { " EXPORTS", LL_EXPORTS },
16181                     { " DELAY_LOAD", LL_DELAY_LOAD },
16182                     { " DELTA", LL_DELTA }
16183                   };
16184                   int flags = liblist.l_flags;
16185                   size_t fcnt;
16186
16187                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
16188                     if ((flags & l_flags_vals[fcnt].bit) != 0)
16189                       {
16190                         fputs (l_flags_vals[fcnt].name, stdout);
16191                         flags ^= l_flags_vals[fcnt].bit;
16192                       }
16193                   if (flags != 0)
16194                     printf (" %#x", (unsigned int) flags);
16195
16196                   puts ("");
16197                 }
16198             }
16199
16200           free (elib);
16201         }
16202       else
16203         res = FALSE;
16204     }
16205
16206   if (options_offset != 0)
16207     {
16208       Elf_External_Options * eopt;
16209       Elf_Internal_Options * iopt;
16210       Elf_Internal_Options * option;
16211       size_t offset;
16212       int cnt;
16213       sect = filedata->section_headers;
16214
16215       /* Find the section header so that we get the size.  */
16216       sect = find_section_by_type (filedata, SHT_MIPS_OPTIONS);
16217       /* PR 17533 file: 012-277276-0.004.  */
16218       if (sect == NULL)
16219         {
16220           error (_("No MIPS_OPTIONS header found\n"));
16221           return FALSE;
16222         }
16223       /* PR 24243  */
16224       if (sect->sh_size < sizeof (* eopt))
16225         {
16226           error (_("The MIPS options section is too small.\n"));
16227           return FALSE;
16228         }
16229
16230       eopt = (Elf_External_Options *) get_data (NULL, filedata, options_offset, 1,
16231                                                 sect->sh_size, _("options"));
16232       if (eopt)
16233         {
16234           iopt = (Elf_Internal_Options *)
16235               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
16236           if (iopt == NULL)
16237             {
16238               error (_("Out of memory allocating space for MIPS options\n"));
16239               return FALSE;
16240             }
16241
16242           offset = cnt = 0;
16243           option = iopt;
16244
16245           while (offset <= sect->sh_size - sizeof (* eopt))
16246             {
16247               Elf_External_Options * eoption;
16248
16249               eoption = (Elf_External_Options *) ((char *) eopt + offset);
16250
16251               option->kind = BYTE_GET (eoption->kind);
16252               option->size = BYTE_GET (eoption->size);
16253               option->section = BYTE_GET (eoption->section);
16254               option->info = BYTE_GET (eoption->info);
16255
16256               /* PR 17531: file: ffa0fa3b.  */
16257               if (option->size < sizeof (* eopt)
16258                   || offset + option->size > sect->sh_size)
16259                 {
16260                   error (_("Invalid size (%u) for MIPS option\n"), option->size);
16261                   return FALSE;
16262                 }
16263               offset += option->size;
16264
16265               ++option;
16266               ++cnt;
16267             }
16268
16269           printf (ngettext ("\nSection '%s' contains %d entry:\n",
16270                             "\nSection '%s' contains %d entries:\n",
16271                             cnt),
16272                   printable_section_name (filedata, sect), cnt);
16273
16274           option = iopt;
16275           offset = 0;
16276
16277           while (cnt-- > 0)
16278             {
16279               size_t len;
16280
16281               switch (option->kind)
16282                 {
16283                 case ODK_NULL:
16284                   /* This shouldn't happen.  */
16285                   printf (" NULL       %d %lx", option->section, option->info);
16286                   break;
16287                 case ODK_REGINFO:
16288                   printf (" REGINFO    ");
16289                   if (filedata->file_header.e_machine == EM_MIPS)
16290                     {
16291                       /* 32bit form.  */
16292                       Elf32_External_RegInfo * ereg;
16293                       Elf32_RegInfo reginfo;
16294
16295                       ereg = (Elf32_External_RegInfo *) (option + 1);
16296                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
16297                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16298                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16299                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16300                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16301                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
16302
16303                       printf ("GPR %08lx  GP 0x%lx\n",
16304                               reginfo.ri_gprmask,
16305                               (unsigned long) reginfo.ri_gp_value);
16306                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
16307                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16308                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16309                     }
16310                   else
16311                     {
16312                       /* 64 bit form.  */
16313                       Elf64_External_RegInfo * ereg;
16314                       Elf64_Internal_RegInfo reginfo;
16315
16316                       ereg = (Elf64_External_RegInfo *) (option + 1);
16317                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
16318                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16319                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16320                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16321                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16322                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
16323
16324                       printf ("GPR %08lx  GP 0x",
16325                               reginfo.ri_gprmask);
16326                       printf_vma (reginfo.ri_gp_value);
16327                       printf ("\n");
16328
16329                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
16330                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16331                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16332                     }
16333                   ++option;
16334                   continue;
16335                 case ODK_EXCEPTIONS:
16336                   fputs (" EXCEPTIONS fpe_min(", stdout);
16337                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
16338                   fputs (") fpe_max(", stdout);
16339                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
16340                   fputs (")", stdout);
16341
16342                   if (option->info & OEX_PAGE0)
16343                     fputs (" PAGE0", stdout);
16344                   if (option->info & OEX_SMM)
16345                     fputs (" SMM", stdout);
16346                   if (option->info & OEX_FPDBUG)
16347                     fputs (" FPDBUG", stdout);
16348                   if (option->info & OEX_DISMISS)
16349                     fputs (" DISMISS", stdout);
16350                   break;
16351                 case ODK_PAD:
16352                   fputs (" PAD       ", stdout);
16353                   if (option->info & OPAD_PREFIX)
16354                     fputs (" PREFIX", stdout);
16355                   if (option->info & OPAD_POSTFIX)
16356                     fputs (" POSTFIX", stdout);
16357                   if (option->info & OPAD_SYMBOL)
16358                     fputs (" SYMBOL", stdout);
16359                   break;
16360                 case ODK_HWPATCH:
16361                   fputs (" HWPATCH   ", stdout);
16362                   if (option->info & OHW_R4KEOP)
16363                     fputs (" R4KEOP", stdout);
16364                   if (option->info & OHW_R8KPFETCH)
16365                     fputs (" R8KPFETCH", stdout);
16366                   if (option->info & OHW_R5KEOP)
16367                     fputs (" R5KEOP", stdout);
16368                   if (option->info & OHW_R5KCVTL)
16369                     fputs (" R5KCVTL", stdout);
16370                   break;
16371                 case ODK_FILL:
16372                   fputs (" FILL       ", stdout);
16373                   /* XXX Print content of info word?  */
16374                   break;
16375                 case ODK_TAGS:
16376                   fputs (" TAGS       ", stdout);
16377                   /* XXX Print content of info word?  */
16378                   break;
16379                 case ODK_HWAND:
16380                   fputs (" HWAND     ", stdout);
16381                   if (option->info & OHWA0_R4KEOP_CHECKED)
16382                     fputs (" R4KEOP_CHECKED", stdout);
16383                   if (option->info & OHWA0_R4KEOP_CLEAN)
16384                     fputs (" R4KEOP_CLEAN", stdout);
16385                   break;
16386                 case ODK_HWOR:
16387                   fputs (" HWOR      ", stdout);
16388                   if (option->info & OHWA0_R4KEOP_CHECKED)
16389                     fputs (" R4KEOP_CHECKED", stdout);
16390                   if (option->info & OHWA0_R4KEOP_CLEAN)
16391                     fputs (" R4KEOP_CLEAN", stdout);
16392                   break;
16393                 case ODK_GP_GROUP:
16394                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
16395                           option->info & OGP_GROUP,
16396                           (option->info & OGP_SELF) >> 16);
16397                   break;
16398                 case ODK_IDENT:
16399                   printf (" IDENT     %#06lx  self-contained %#06lx",
16400                           option->info & OGP_GROUP,
16401                           (option->info & OGP_SELF) >> 16);
16402                   break;
16403                 default:
16404                   /* This shouldn't happen.  */
16405                   printf (" %3d ???     %d %lx",
16406                           option->kind, option->section, option->info);
16407                   break;
16408                 }
16409
16410               len = sizeof (* eopt);
16411               while (len < option->size)
16412                 {
16413                   unsigned char datum = * ((unsigned char *) eopt + offset + len);
16414
16415                   if (ISPRINT (datum))
16416                     printf ("%c", datum);
16417                   else
16418                     printf ("\\%03o", datum);
16419                   len ++;
16420                 }
16421               fputs ("\n", stdout);
16422
16423               offset += option->size;
16424               ++option;
16425             }
16426
16427           free (eopt);
16428         }
16429       else
16430         res = FALSE;
16431     }
16432
16433   if (conflicts_offset != 0 && conflictsno != 0)
16434     {
16435       Elf32_Conflict * iconf;
16436       size_t cnt;
16437
16438       if (dynamic_symbols == NULL)
16439         {
16440           error (_("conflict list found without a dynamic symbol table\n"));
16441           return FALSE;
16442         }
16443
16444       /* PR 21345 - print a slightly more helpful error message
16445          if we are sure that the cmalloc will fail.  */
16446       if (conflictsno * sizeof (* iconf) > filedata->file_size)
16447         {
16448           error (_("Overlarge number of conflicts detected: %lx\n"),
16449                  (long) conflictsno);
16450           return FALSE;
16451         }
16452
16453       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
16454       if (iconf == NULL)
16455         {
16456           error (_("Out of memory allocating space for dynamic conflicts\n"));
16457           return FALSE;
16458         }
16459
16460       if (is_32bit_elf)
16461         {
16462           Elf32_External_Conflict * econf32;
16463
16464           econf32 = (Elf32_External_Conflict *)
16465               get_data (NULL, filedata, conflicts_offset, conflictsno,
16466                         sizeof (* econf32), _("conflict"));
16467           if (!econf32)
16468             return FALSE;
16469
16470           for (cnt = 0; cnt < conflictsno; ++cnt)
16471             iconf[cnt] = BYTE_GET (econf32[cnt]);
16472
16473           free (econf32);
16474         }
16475       else
16476         {
16477           Elf64_External_Conflict * econf64;
16478
16479           econf64 = (Elf64_External_Conflict *)
16480               get_data (NULL, filedata, conflicts_offset, conflictsno,
16481                         sizeof (* econf64), _("conflict"));
16482           if (!econf64)
16483             return FALSE;
16484
16485           for (cnt = 0; cnt < conflictsno; ++cnt)
16486             iconf[cnt] = BYTE_GET (econf64[cnt]);
16487
16488           free (econf64);
16489         }
16490
16491       printf (ngettext ("\nSection '.conflict' contains %lu entry:\n",
16492                         "\nSection '.conflict' contains %lu entries:\n",
16493                         (unsigned long) conflictsno),
16494               (unsigned long) conflictsno);
16495       puts (_("  Num:    Index       Value  Name"));
16496
16497       for (cnt = 0; cnt < conflictsno; ++cnt)
16498         {
16499           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
16500
16501           if (iconf[cnt] >= num_dynamic_syms)
16502             printf (_("<corrupt symbol index>"));
16503           else
16504             {
16505               Elf_Internal_Sym * psym;
16506
16507               psym = & dynamic_symbols[iconf[cnt]];
16508               print_vma (psym->st_value, FULL_HEX);
16509               putchar (' ');
16510               if (VALID_DYNAMIC_NAME (psym->st_name))
16511                 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
16512               else
16513                 printf (_("<corrupt: %14ld>"), psym->st_name);
16514             }
16515           putchar ('\n');
16516         }
16517
16518       free (iconf);
16519     }
16520
16521   if (pltgot != 0 && local_gotno != 0)
16522     {
16523       bfd_vma ent, local_end, global_end;
16524       size_t i, offset;
16525       unsigned char * data;
16526       unsigned char * data_end;
16527       int addr_size;
16528
16529       ent = pltgot;
16530       addr_size = (is_32bit_elf ? 4 : 8);
16531       local_end = pltgot + local_gotno * addr_size;
16532
16533       /* PR binutils/17533 file: 012-111227-0.004  */
16534       if (symtabno < gotsym)
16535         {
16536           error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
16537                  (unsigned long) gotsym, (unsigned long) symtabno);
16538           return FALSE;
16539         }
16540
16541       global_end = local_end + (symtabno - gotsym) * addr_size;
16542       /* PR 17531: file: 54c91a34.  */
16543       if (global_end < local_end)
16544         {
16545           error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
16546           return FALSE;
16547         }
16548
16549       offset = offset_from_vma (filedata, pltgot, global_end - pltgot);
16550       data = (unsigned char *) get_data (NULL, filedata, offset,
16551                                          global_end - pltgot, 1,
16552                                          _("Global Offset Table data"));
16553       /* PR 12855: Null data is handled gracefully throughout.  */
16554       data_end = data + (global_end - pltgot);
16555
16556       printf (_("\nPrimary GOT:\n"));
16557       printf (_(" Canonical gp value: "));
16558       print_vma (pltgot + 0x7ff0, LONG_HEX);
16559       printf ("\n\n");
16560
16561       printf (_(" Reserved entries:\n"));
16562       printf (_("  %*s %10s %*s Purpose\n"),
16563               addr_size * 2, _("Address"), _("Access"),
16564               addr_size * 2, _("Initial"));
16565       ent = print_mips_got_entry (data, pltgot, ent, data_end);
16566       printf (_(" Lazy resolver\n"));
16567       if (ent == (bfd_vma) -1)
16568         goto got_print_fail;
16569
16570       /* Check for the MSB of GOT[1] being set, denoting a GNU object.
16571          This entry will be used by some runtime loaders, to store the
16572          module pointer.  Otherwise this is an ordinary local entry.
16573          PR 21344: Check for the entry being fully available before
16574          fetching it.  */
16575       if (data
16576           && data + ent - pltgot + addr_size <= data_end
16577           && (byte_get (data + ent - pltgot, addr_size)
16578               >> (addr_size * 8 - 1)) != 0)
16579         {
16580           ent = print_mips_got_entry (data, pltgot, ent, data_end);
16581           printf (_(" Module pointer (GNU extension)\n"));
16582           if (ent == (bfd_vma) -1)
16583             goto got_print_fail;
16584         }
16585       printf ("\n");
16586
16587       if (data != NULL && ent < local_end)
16588         {
16589           printf (_(" Local entries:\n"));
16590           printf ("  %*s %10s %*s\n",
16591                   addr_size * 2, _("Address"), _("Access"),
16592                   addr_size * 2, _("Initial"));
16593           while (ent < local_end)
16594             {
16595               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16596               printf ("\n");
16597               if (ent == (bfd_vma) -1)
16598                 goto got_print_fail;
16599             }
16600           printf ("\n");
16601         }
16602
16603       if (data != NULL && gotsym < symtabno)
16604         {
16605           int sym_width;
16606
16607           printf (_(" Global entries:\n"));
16608           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
16609                   addr_size * 2, _("Address"),
16610                   _("Access"),
16611                   addr_size * 2, _("Initial"),
16612                   addr_size * 2, _("Sym.Val."),
16613                   _("Type"),
16614                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
16615                   _("Ndx"), _("Name"));
16616
16617           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
16618
16619           for (i = gotsym; i < symtabno; i++)
16620             {
16621               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16622               printf (" ");
16623
16624               if (dynamic_symbols == NULL)
16625                 printf (_("<no dynamic symbols>"));
16626               else if (i < num_dynamic_syms)
16627                 {
16628                   Elf_Internal_Sym * psym = dynamic_symbols + i;
16629
16630                   print_vma (psym->st_value, LONG_HEX);
16631                   printf (" %-7s %3s ",
16632                           get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16633                           get_symbol_index_type (filedata, psym->st_shndx));
16634
16635                   if (VALID_DYNAMIC_NAME (psym->st_name))
16636                     print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16637                   else
16638                     printf (_("<corrupt: %14ld>"), psym->st_name);
16639                 }
16640               else
16641                 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
16642                         (unsigned long) i);
16643
16644               printf ("\n");
16645               if (ent == (bfd_vma) -1)
16646                 break;
16647             }
16648           printf ("\n");
16649         }
16650
16651     got_print_fail:
16652       if (data)
16653         free (data);
16654     }
16655
16656   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
16657     {
16658       bfd_vma ent, end;
16659       size_t offset, rel_offset;
16660       unsigned long count, i;
16661       unsigned char * data;
16662       int addr_size, sym_width;
16663       Elf_Internal_Rela * rels;
16664
16665       rel_offset = offset_from_vma (filedata, jmprel, pltrelsz);
16666       if (pltrel == DT_RELA)
16667         {
16668           if (!slurp_rela_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16669             return FALSE;
16670         }
16671       else
16672         {
16673           if (!slurp_rel_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16674             return FALSE;
16675         }
16676
16677       ent = mips_pltgot;
16678       addr_size = (is_32bit_elf ? 4 : 8);
16679       end = mips_pltgot + (2 + count) * addr_size;
16680
16681       offset = offset_from_vma (filedata, mips_pltgot, end - mips_pltgot);
16682       data = (unsigned char *) get_data (NULL, filedata, offset, end - mips_pltgot,
16683                                          1, _("Procedure Linkage Table data"));
16684       if (data == NULL)
16685         return FALSE;
16686
16687       printf ("\nPLT GOT:\n\n");
16688       printf (_(" Reserved entries:\n"));
16689       printf (_("  %*s %*s Purpose\n"),
16690               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
16691       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16692       printf (_(" PLT lazy resolver\n"));
16693       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16694       printf (_(" Module pointer\n"));
16695       printf ("\n");
16696
16697       printf (_(" Entries:\n"));
16698       printf ("  %*s %*s %*s %-7s %3s %s\n",
16699               addr_size * 2, _("Address"),
16700               addr_size * 2, _("Initial"),
16701               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
16702       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
16703       for (i = 0; i < count; i++)
16704         {
16705           unsigned long idx = get_reloc_symindex (rels[i].r_info);
16706
16707           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16708           printf (" ");
16709
16710           if (idx >= num_dynamic_syms)
16711             printf (_("<corrupt symbol index: %lu>"), idx);
16712           else
16713             {
16714               Elf_Internal_Sym * psym = dynamic_symbols + idx;
16715
16716               print_vma (psym->st_value, LONG_HEX);
16717               printf (" %-7s %3s ",
16718                       get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16719                       get_symbol_index_type (filedata, psym->st_shndx));
16720               if (VALID_DYNAMIC_NAME (psym->st_name))
16721                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16722               else
16723                 printf (_("<corrupt: %14ld>"), psym->st_name);
16724             }
16725           printf ("\n");
16726         }
16727       printf ("\n");
16728
16729       if (data)
16730         free (data);
16731       free (rels);
16732     }
16733
16734   return res;
16735 }
16736
16737 static bfd_boolean
16738 process_nds32_specific (Filedata * filedata)
16739 {
16740   Elf_Internal_Shdr *sect = NULL;
16741
16742   sect = find_section (filedata, ".nds32_e_flags");
16743   if (sect != NULL)
16744     {
16745       unsigned int *flag;
16746
16747       printf ("\nNDS32 elf flags section:\n");
16748       flag = get_data (NULL, filedata, sect->sh_offset, 1,
16749                        sect->sh_size, _("NDS32 elf flags section"));
16750
16751       if (! flag)
16752         return FALSE;
16753
16754       switch ((*flag) & 0x3)
16755         {
16756         case 0:
16757           printf ("(VEC_SIZE):\tNo entry.\n");
16758           break;
16759         case 1:
16760           printf ("(VEC_SIZE):\t4 bytes\n");
16761           break;
16762         case 2:
16763           printf ("(VEC_SIZE):\t16 bytes\n");
16764           break;
16765         case 3:
16766           printf ("(VEC_SIZE):\treserved\n");
16767           break;
16768         }
16769     }
16770
16771   return TRUE;
16772 }
16773
16774 static bfd_boolean
16775 process_gnu_liblist (Filedata * filedata)
16776 {
16777   Elf_Internal_Shdr * section;
16778   Elf_Internal_Shdr * string_sec;
16779   Elf32_External_Lib * elib;
16780   char * strtab;
16781   size_t strtab_size;
16782   size_t cnt;
16783   unsigned long num_liblist;
16784   unsigned i;
16785   bfd_boolean res = TRUE;
16786
16787   if (! do_arch)
16788     return TRUE;
16789
16790   for (i = 0, section = filedata->section_headers;
16791        i < filedata->file_header.e_shnum;
16792        i++, section++)
16793     {
16794       switch (section->sh_type)
16795         {
16796         case SHT_GNU_LIBLIST:
16797           if (section->sh_link >= filedata->file_header.e_shnum)
16798             break;
16799
16800           elib = (Elf32_External_Lib *)
16801               get_data (NULL, filedata, section->sh_offset, 1, section->sh_size,
16802                         _("liblist section data"));
16803
16804           if (elib == NULL)
16805             {
16806               res = FALSE;
16807               break;
16808             }
16809
16810           string_sec = filedata->section_headers + section->sh_link;
16811           strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
16812                                       string_sec->sh_size,
16813                                       _("liblist string table"));
16814           if (strtab == NULL
16815               || section->sh_entsize != sizeof (Elf32_External_Lib))
16816             {
16817               free (elib);
16818               free (strtab);
16819               res = FALSE;
16820               break;
16821             }
16822           strtab_size = string_sec->sh_size;
16823
16824           num_liblist = section->sh_size / sizeof (Elf32_External_Lib);
16825           printf (ngettext ("\nLibrary list section '%s' contains %lu entries:\n",
16826                             "\nLibrary list section '%s' contains %lu entries:\n",
16827                             num_liblist),
16828                   printable_section_name (filedata, section),
16829                   num_liblist);
16830
16831           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
16832
16833           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
16834                ++cnt)
16835             {
16836               Elf32_Lib liblist;
16837               time_t atime;
16838               char timebuf[128];
16839               struct tm * tmp;
16840
16841               liblist.l_name = BYTE_GET (elib[cnt].l_name);
16842               atime = BYTE_GET (elib[cnt].l_time_stamp);
16843               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16844               liblist.l_version = BYTE_GET (elib[cnt].l_version);
16845               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16846
16847               tmp = gmtime (&atime);
16848               snprintf (timebuf, sizeof (timebuf),
16849                         "%04u-%02u-%02uT%02u:%02u:%02u",
16850                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16851                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16852
16853               printf ("%3lu: ", (unsigned long) cnt);
16854               if (do_wide)
16855                 printf ("%-20s", liblist.l_name < strtab_size
16856                         ? strtab + liblist.l_name : _("<corrupt>"));
16857               else
16858                 printf ("%-20.20s", liblist.l_name < strtab_size
16859                         ? strtab + liblist.l_name : _("<corrupt>"));
16860               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
16861                       liblist.l_version, liblist.l_flags);
16862             }
16863
16864           free (elib);
16865           free (strtab);
16866         }
16867     }
16868
16869   return res;
16870 }
16871
16872 static const char *
16873 get_note_type (Filedata * filedata, unsigned e_type)
16874 {
16875   static char buff[64];
16876
16877   if (filedata->file_header.e_type == ET_CORE)
16878     switch (e_type)
16879       {
16880       case NT_AUXV:
16881         return _("NT_AUXV (auxiliary vector)");
16882       case NT_PRSTATUS:
16883         return _("NT_PRSTATUS (prstatus structure)");
16884       case NT_FPREGSET:
16885         return _("NT_FPREGSET (floating point registers)");
16886       case NT_PRPSINFO:
16887         return _("NT_PRPSINFO (prpsinfo structure)");
16888       case NT_TASKSTRUCT:
16889         return _("NT_TASKSTRUCT (task structure)");
16890       case NT_PRXFPREG:
16891         return _("NT_PRXFPREG (user_xfpregs structure)");
16892       case NT_PPC_VMX:
16893         return _("NT_PPC_VMX (ppc Altivec registers)");
16894       case NT_PPC_VSX:
16895         return _("NT_PPC_VSX (ppc VSX registers)");
16896       case NT_PPC_TAR:
16897         return _("NT_PPC_TAR (ppc TAR register)");
16898       case NT_PPC_PPR:
16899         return _("NT_PPC_PPR (ppc PPR register)");
16900       case NT_PPC_DSCR:
16901         return _("NT_PPC_DSCR (ppc DSCR register)");
16902       case NT_PPC_EBB:
16903         return _("NT_PPC_EBB (ppc EBB registers)");
16904       case NT_PPC_PMU:
16905         return _("NT_PPC_PMU (ppc PMU registers)");
16906       case NT_PPC_TM_CGPR:
16907         return _("NT_PPC_TM_CGPR (ppc checkpointed GPR registers)");
16908       case NT_PPC_TM_CFPR:
16909         return _("NT_PPC_TM_CFPR (ppc checkpointed floating point registers)");
16910       case NT_PPC_TM_CVMX:
16911         return _("NT_PPC_TM_CVMX (ppc checkpointed Altivec registers)");
16912       case NT_PPC_TM_CVSX:
16913         return _("NT_PPC_TM_CVSX (ppc checkpointed VSX registers)");
16914       case NT_PPC_TM_SPR:
16915         return _("NT_PPC_TM_SPR (ppc TM special purpose registers)");
16916       case NT_PPC_TM_CTAR:
16917         return _("NT_PPC_TM_CTAR (ppc checkpointed TAR register)");
16918       case NT_PPC_TM_CPPR:
16919         return _("NT_PPC_TM_CPPR (ppc checkpointed PPR register)");
16920       case NT_PPC_TM_CDSCR:
16921         return _("NT_PPC_TM_CDSCR (ppc checkpointed DSCR register)");
16922       case NT_386_TLS:
16923         return _("NT_386_TLS (x86 TLS information)");
16924       case NT_386_IOPERM:
16925         return _("NT_386_IOPERM (x86 I/O permissions)");
16926       case NT_X86_XSTATE:
16927         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
16928       case NT_S390_HIGH_GPRS:
16929         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
16930       case NT_S390_TIMER:
16931         return _("NT_S390_TIMER (s390 timer register)");
16932       case NT_S390_TODCMP:
16933         return _("NT_S390_TODCMP (s390 TOD comparator register)");
16934       case NT_S390_TODPREG:
16935         return _("NT_S390_TODPREG (s390 TOD programmable register)");
16936       case NT_S390_CTRS:
16937         return _("NT_S390_CTRS (s390 control registers)");
16938       case NT_S390_PREFIX:
16939         return _("NT_S390_PREFIX (s390 prefix register)");
16940       case NT_S390_LAST_BREAK:
16941         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
16942       case NT_S390_SYSTEM_CALL:
16943         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
16944       case NT_S390_TDB:
16945         return _("NT_S390_TDB (s390 transaction diagnostic block)");
16946       case NT_S390_VXRS_LOW:
16947         return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
16948       case NT_S390_VXRS_HIGH:
16949         return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
16950       case NT_S390_GS_CB:
16951         return _("NT_S390_GS_CB (s390 guarded-storage registers)");
16952       case NT_S390_GS_BC:
16953         return _("NT_S390_GS_BC (s390 guarded-storage broadcast control)");
16954       case NT_ARM_VFP:
16955         return _("NT_ARM_VFP (arm VFP registers)");
16956       case NT_ARM_TLS:
16957         return _("NT_ARM_TLS (AArch TLS registers)");
16958       case NT_ARM_HW_BREAK:
16959         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
16960       case NT_ARM_HW_WATCH:
16961         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
16962       case NT_PSTATUS:
16963         return _("NT_PSTATUS (pstatus structure)");
16964       case NT_FPREGS:
16965         return _("NT_FPREGS (floating point registers)");
16966       case NT_PSINFO:
16967         return _("NT_PSINFO (psinfo structure)");
16968       case NT_LWPSTATUS:
16969         return _("NT_LWPSTATUS (lwpstatus_t structure)");
16970       case NT_LWPSINFO:
16971         return _("NT_LWPSINFO (lwpsinfo_t structure)");
16972       case NT_WIN32PSTATUS:
16973         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
16974       case NT_SIGINFO:
16975         return _("NT_SIGINFO (siginfo_t data)");
16976       case NT_FILE:
16977         return _("NT_FILE (mapped files)");
16978       default:
16979         break;
16980       }
16981   else
16982     switch (e_type)
16983       {
16984       case NT_VERSION:
16985         return _("NT_VERSION (version)");
16986       case NT_ARCH:
16987         return _("NT_ARCH (architecture)");
16988       case NT_GNU_BUILD_ATTRIBUTE_OPEN:
16989         return _("OPEN");
16990       case NT_GNU_BUILD_ATTRIBUTE_FUNC:
16991         return _("func");
16992       default:
16993         break;
16994       }
16995
16996   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16997   return buff;
16998 }
16999
17000 static bfd_boolean
17001 print_core_note (Elf_Internal_Note *pnote)
17002 {
17003   unsigned int addr_size = is_32bit_elf ? 4 : 8;
17004   bfd_vma count, page_size;
17005   unsigned char *descdata, *filenames, *descend;
17006
17007   if (pnote->type != NT_FILE)
17008     {
17009       if (do_wide)
17010         printf ("\n");
17011       return TRUE;
17012     }
17013
17014 #ifndef BFD64
17015   if (!is_32bit_elf)
17016     {
17017       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
17018       /* Still "successful".  */
17019       return TRUE;
17020     }
17021 #endif
17022
17023   if (pnote->descsz < 2 * addr_size)
17024     {
17025       error (_("    Malformed note - too short for header\n"));
17026       return FALSE;
17027     }
17028
17029   descdata = (unsigned char *) pnote->descdata;
17030   descend = descdata + pnote->descsz;
17031
17032   if (descdata[pnote->descsz - 1] != '\0')
17033     {
17034       error (_("    Malformed note - does not end with \\0\n"));
17035       return FALSE;
17036     }
17037
17038   count = byte_get (descdata, addr_size);
17039   descdata += addr_size;
17040
17041   page_size = byte_get (descdata, addr_size);
17042   descdata += addr_size;
17043
17044   if (count > ((bfd_vma) -1 - 2 * addr_size) / (3 * addr_size)
17045       || pnote->descsz < 2 * addr_size + count * 3 * addr_size)
17046     {
17047       error (_("    Malformed note - too short for supplied file count\n"));
17048       return FALSE;
17049     }
17050
17051   printf (_("    Page size: "));
17052   print_vma (page_size, DEC);
17053   printf ("\n");
17054
17055   printf (_("    %*s%*s%*s\n"),
17056           (int) (2 + 2 * addr_size), _("Start"),
17057           (int) (4 + 2 * addr_size), _("End"),
17058           (int) (4 + 2 * addr_size), _("Page Offset"));
17059   filenames = descdata + count * 3 * addr_size;
17060   while (count-- > 0)
17061     {
17062       bfd_vma start, end, file_ofs;
17063
17064       if (filenames == descend)
17065         {
17066           error (_("    Malformed note - filenames end too early\n"));
17067           return FALSE;
17068         }
17069
17070       start = byte_get (descdata, addr_size);
17071       descdata += addr_size;
17072       end = byte_get (descdata, addr_size);
17073       descdata += addr_size;
17074       file_ofs = byte_get (descdata, addr_size);
17075       descdata += addr_size;
17076
17077       printf ("    ");
17078       print_vma (start, FULL_HEX);
17079       printf ("  ");
17080       print_vma (end, FULL_HEX);
17081       printf ("  ");
17082       print_vma (file_ofs, FULL_HEX);
17083       printf ("\n        %s\n", filenames);
17084
17085       filenames += 1 + strlen ((char *) filenames);
17086     }
17087
17088   return TRUE;
17089 }
17090
17091 static const char *
17092 get_gnu_elf_note_type (unsigned e_type)
17093 {
17094   /* NB/ Keep this switch statement in sync with print_gnu_note ().  */
17095   switch (e_type)
17096     {
17097     case NT_GNU_ABI_TAG:
17098       return _("NT_GNU_ABI_TAG (ABI version tag)");
17099     case NT_GNU_HWCAP:
17100       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
17101     case NT_GNU_BUILD_ID:
17102       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
17103     case NT_GNU_GOLD_VERSION:
17104       return _("NT_GNU_GOLD_VERSION (gold version)");
17105     case NT_GNU_PROPERTY_TYPE_0:
17106       return _("NT_GNU_PROPERTY_TYPE_0");
17107     case NT_GNU_BUILD_ATTRIBUTE_OPEN:
17108       return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
17109     case NT_GNU_BUILD_ATTRIBUTE_FUNC:
17110       return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
17111     default:
17112       {
17113         static char buff[64];
17114
17115         snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17116         return buff;
17117       }
17118     }
17119 }
17120
17121 static void
17122 decode_x86_compat_isa (unsigned int bitmask)
17123 {
17124   while (bitmask)
17125     {
17126       unsigned int bit = bitmask & (- bitmask);
17127
17128       bitmask &= ~ bit;
17129       switch (bit)
17130         {
17131         case GNU_PROPERTY_X86_COMPAT_ISA_1_486:
17132           printf ("i486");
17133           break;
17134         case GNU_PROPERTY_X86_COMPAT_ISA_1_586:
17135           printf ("586");
17136           break;
17137         case GNU_PROPERTY_X86_COMPAT_ISA_1_686:
17138           printf ("686");
17139           break;
17140         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE:
17141           printf ("SSE");
17142           break;
17143         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE2:
17144           printf ("SSE2");
17145           break;
17146         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE3:
17147           printf ("SSE3");
17148           break;
17149         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSSE3:
17150           printf ("SSSE3");
17151           break;
17152         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_1:
17153           printf ("SSE4_1");
17154           break;
17155         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_2:
17156           printf ("SSE4_2");
17157           break;
17158         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX:
17159           printf ("AVX");
17160           break;
17161         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX2:
17162           printf ("AVX2");
17163           break;
17164         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512F:
17165           printf ("AVX512F");
17166           break;
17167         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512CD:
17168           printf ("AVX512CD");
17169           break;
17170         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512ER:
17171           printf ("AVX512ER");
17172           break;
17173         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512PF:
17174           printf ("AVX512PF");
17175           break;
17176         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512VL:
17177           printf ("AVX512VL");
17178           break;
17179         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512DQ:
17180           printf ("AVX512DQ");
17181           break;
17182         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512BW:
17183           printf ("AVX512BW");
17184           break;
17185         default:
17186           printf (_("<unknown: %x>"), bit);
17187           break;
17188         }
17189       if (bitmask)
17190         printf (", ");
17191     }
17192 }
17193
17194 static void
17195 decode_x86_isa (unsigned int bitmask)
17196 {
17197   if (!bitmask)
17198     {
17199       printf (_("<None>"));
17200       return;
17201     }
17202
17203   while (bitmask)
17204     {
17205       unsigned int bit = bitmask & (- bitmask);
17206
17207       bitmask &= ~ bit;
17208       switch (bit)
17209         {
17210         case GNU_PROPERTY_X86_ISA_1_CMOV:
17211           printf ("CMOV");
17212           break;
17213         case GNU_PROPERTY_X86_ISA_1_SSE:
17214           printf ("SSE");
17215           break;
17216         case GNU_PROPERTY_X86_ISA_1_SSE2:
17217           printf ("SSE2");
17218           break;
17219         case GNU_PROPERTY_X86_ISA_1_SSE3:
17220           printf ("SSE3");
17221           break;
17222         case GNU_PROPERTY_X86_ISA_1_SSSE3:
17223           printf ("SSSE3");
17224           break;
17225         case GNU_PROPERTY_X86_ISA_1_SSE4_1:
17226           printf ("SSE4_1");
17227           break;
17228         case GNU_PROPERTY_X86_ISA_1_SSE4_2:
17229           printf ("SSE4_2");
17230           break;
17231         case GNU_PROPERTY_X86_ISA_1_AVX:
17232           printf ("AVX");
17233           break;
17234         case GNU_PROPERTY_X86_ISA_1_AVX2:
17235           printf ("AVX2");
17236           break;
17237         case GNU_PROPERTY_X86_ISA_1_FMA:
17238           printf ("FMA");
17239           break;
17240         case GNU_PROPERTY_X86_ISA_1_AVX512F:
17241           printf ("AVX512F");
17242           break;
17243         case GNU_PROPERTY_X86_ISA_1_AVX512CD:
17244           printf ("AVX512CD");
17245           break;
17246         case GNU_PROPERTY_X86_ISA_1_AVX512ER:
17247           printf ("AVX512ER");
17248           break;
17249         case GNU_PROPERTY_X86_ISA_1_AVX512PF:
17250           printf ("AVX512PF");
17251           break;
17252         case GNU_PROPERTY_X86_ISA_1_AVX512VL:
17253           printf ("AVX512VL");
17254           break;
17255         case GNU_PROPERTY_X86_ISA_1_AVX512DQ:
17256           printf ("AVX512DQ");
17257           break;
17258         case GNU_PROPERTY_X86_ISA_1_AVX512BW:
17259           printf ("AVX512BW");
17260           break;
17261         case GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS:
17262           printf ("AVX512_4FMAPS");
17263           break;
17264         case GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW:
17265           printf ("AVX512_4VNNIW");
17266           break;
17267         case GNU_PROPERTY_X86_ISA_1_AVX512_BITALG:
17268           printf ("AVX512_BITALG");
17269           break;
17270         case GNU_PROPERTY_X86_ISA_1_AVX512_IFMA:
17271           printf ("AVX512_IFMA");
17272           break;
17273         case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI:
17274           printf ("AVX512_VBMI");
17275           break;
17276         case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2:
17277           printf ("AVX512_VBMI2");
17278           break;
17279         case GNU_PROPERTY_X86_ISA_1_AVX512_VNNI:
17280           printf ("AVX512_VNNI");
17281           break;
17282         case GNU_PROPERTY_X86_ISA_1_AVX512_BF16:
17283           printf ("AVX512_BF16");
17284           break;
17285         default:
17286           printf (_("<unknown: %x>"), bit);
17287           break;
17288         }
17289       if (bitmask)
17290         printf (", ");
17291     }
17292 }
17293
17294 static void
17295 decode_x86_feature_1 (unsigned int bitmask)
17296 {
17297   if (!bitmask)
17298     {
17299       printf (_("<None>"));
17300       return;
17301     }
17302
17303   while (bitmask)
17304     {
17305       unsigned int bit = bitmask & (- bitmask);
17306
17307       bitmask &= ~ bit;
17308       switch (bit)
17309         {
17310         case GNU_PROPERTY_X86_FEATURE_1_IBT:
17311           printf ("IBT");
17312           break;
17313         case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
17314           printf ("SHSTK");
17315           break;
17316         default:
17317           printf (_("<unknown: %x>"), bit);
17318           break;
17319         }
17320       if (bitmask)
17321         printf (", ");
17322     }
17323 }
17324
17325 static void
17326 decode_x86_feature_2 (unsigned int bitmask)
17327 {
17328   if (!bitmask)
17329     {
17330       printf (_("<None>"));
17331       return;
17332     }
17333
17334   while (bitmask)
17335     {
17336       unsigned int bit = bitmask & (- bitmask);
17337
17338       bitmask &= ~ bit;
17339       switch (bit)
17340         {
17341         case GNU_PROPERTY_X86_FEATURE_2_X86:
17342           printf ("x86");
17343           break;
17344         case GNU_PROPERTY_X86_FEATURE_2_X87:
17345           printf ("x87");
17346           break;
17347         case GNU_PROPERTY_X86_FEATURE_2_MMX:
17348           printf ("MMX");
17349           break;
17350         case GNU_PROPERTY_X86_FEATURE_2_XMM:
17351           printf ("XMM");
17352           break;
17353         case GNU_PROPERTY_X86_FEATURE_2_YMM:
17354           printf ("YMM");
17355           break;
17356         case GNU_PROPERTY_X86_FEATURE_2_ZMM:
17357           printf ("ZMM");
17358           break;
17359         case GNU_PROPERTY_X86_FEATURE_2_FXSR:
17360           printf ("FXSR");
17361           break;
17362         case GNU_PROPERTY_X86_FEATURE_2_XSAVE:
17363           printf ("XSAVE");
17364           break;
17365         case GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT:
17366           printf ("XSAVEOPT");
17367           break;
17368         case GNU_PROPERTY_X86_FEATURE_2_XSAVEC:
17369           printf ("XSAVEC");
17370           break;
17371         default:
17372           printf (_("<unknown: %x>"), bit);
17373           break;
17374         }
17375       if (bitmask)
17376         printf (", ");
17377     }
17378 }
17379
17380 static void
17381 decode_aarch64_feature_1_and (unsigned int bitmask)
17382 {
17383   while (bitmask)
17384     {
17385       unsigned int bit = bitmask & (- bitmask);
17386
17387       bitmask &= ~ bit;
17388       switch (bit)
17389         {
17390         case GNU_PROPERTY_AARCH64_FEATURE_1_BTI:
17391           printf ("BTI");
17392           break;
17393
17394         case GNU_PROPERTY_AARCH64_FEATURE_1_PAC:
17395           printf ("PAC");
17396           break;
17397
17398         default:
17399           printf (_("<unknown: %x>"), bit);
17400           break;
17401         }
17402       if (bitmask)
17403         printf (", ");
17404     }
17405 }
17406
17407 static void
17408 print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
17409 {
17410   unsigned char * ptr = (unsigned char *) pnote->descdata;
17411   unsigned char * ptr_end = ptr + pnote->descsz;
17412   unsigned int    size = is_32bit_elf ? 4 : 8;
17413
17414   printf (_("      Properties: "));
17415
17416   if (pnote->descsz < 8 || (pnote->descsz % size) != 0)
17417     {
17418       printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz);
17419       return;
17420     }
17421
17422   while (ptr < ptr_end)
17423     {
17424       unsigned int j;
17425       unsigned int type;
17426       unsigned int datasz;
17427
17428       if ((size_t) (ptr_end - ptr) < 8)
17429         {
17430           printf (_("<corrupt descsz: %#lx>\n"), pnote->descsz);
17431           break;
17432         }
17433
17434       type = byte_get (ptr, 4);
17435       datasz = byte_get (ptr + 4, 4);
17436
17437       ptr += 8;
17438
17439       if (datasz > (size_t) (ptr_end - ptr))
17440         {
17441           printf (_("<corrupt type (%#x) datasz: %#x>\n"),
17442                   type, datasz);
17443           break;
17444         }
17445
17446       if (type >= GNU_PROPERTY_LOPROC && type <= GNU_PROPERTY_HIPROC)
17447         {
17448           if (filedata->file_header.e_machine == EM_X86_64
17449               || filedata->file_header.e_machine == EM_IAMCU
17450               || filedata->file_header.e_machine == EM_386)
17451             {
17452               unsigned int bitmask;
17453
17454               if (datasz == 4)
17455                 bitmask = byte_get (ptr, 4);
17456               else
17457                 bitmask = 0;
17458
17459               switch (type)
17460                 {
17461                 case GNU_PROPERTY_X86_ISA_1_USED:
17462                   if (datasz != 4)
17463                     printf (_("x86 ISA used: <corrupt length: %#x> "),
17464                             datasz);
17465                   else
17466                     {
17467                       printf ("x86 ISA used: ");
17468                       decode_x86_isa (bitmask);
17469                     }
17470                   goto next;
17471
17472                 case GNU_PROPERTY_X86_ISA_1_NEEDED:
17473                   if (datasz != 4)
17474                     printf (_("x86 ISA needed: <corrupt length: %#x> "),
17475                             datasz);
17476                   else
17477                     {
17478                       printf ("x86 ISA needed: ");
17479                       decode_x86_isa (bitmask);
17480                     }
17481                   goto next;
17482
17483                 case GNU_PROPERTY_X86_FEATURE_1_AND:
17484                   if (datasz != 4)
17485                     printf (_("x86 feature: <corrupt length: %#x> "),
17486                             datasz);
17487                   else
17488                     {
17489                       printf ("x86 feature: ");
17490                       decode_x86_feature_1 (bitmask);
17491                     }
17492                   goto next;
17493
17494                 case GNU_PROPERTY_X86_FEATURE_2_USED:
17495                   if (datasz != 4)
17496                     printf (_("x86 feature used: <corrupt length: %#x> "),
17497                             datasz);
17498                   else
17499                     {
17500                       printf ("x86 feature used: ");
17501                       decode_x86_feature_2 (bitmask);
17502                     }
17503                   goto next;
17504
17505                 case GNU_PROPERTY_X86_FEATURE_2_NEEDED:
17506                   if (datasz != 4)
17507                     printf (_("x86 feature needed: <corrupt length: %#x> "), datasz);
17508                   else
17509                     {
17510                       printf ("x86 feature needed: ");
17511                       decode_x86_feature_2 (bitmask);
17512                     }
17513                   goto next;
17514
17515                 case GNU_PROPERTY_X86_COMPAT_ISA_1_USED:
17516                   if (datasz != 4)
17517                     printf (_("x86 ISA used: <corrupt length: %#x> "),
17518                             datasz);
17519                   else
17520                     {
17521                       printf ("x86 ISA used: ");
17522                       decode_x86_compat_isa (bitmask);
17523                     }
17524                   goto next;
17525
17526                 case GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED:
17527                   if (datasz != 4)
17528                     printf (_("x86 ISA needed: <corrupt length: %#x> "),
17529                             datasz);
17530                   else
17531                     {
17532                       printf ("x86 ISA needed: ");
17533                       decode_x86_compat_isa (bitmask);
17534                     }
17535                   goto next;
17536
17537                 default:
17538                   break;
17539                 }
17540             }
17541           else if (filedata->file_header.e_machine == EM_AARCH64)
17542             {
17543               if (type == GNU_PROPERTY_AARCH64_FEATURE_1_AND)
17544                 {
17545                   printf ("AArch64 feature: ");
17546                   if (datasz != 4)
17547                     printf (_("<corrupt length: %#x> "), datasz);
17548                   else
17549                     decode_aarch64_feature_1_and (byte_get (ptr, 4));
17550                   goto next;
17551                 }
17552             }
17553         }
17554       else
17555         {
17556           switch (type)
17557             {
17558             case GNU_PROPERTY_STACK_SIZE:
17559               printf (_("stack size: "));
17560               if (datasz != size)
17561                 printf (_("<corrupt length: %#x> "), datasz);
17562               else
17563                 printf ("%#lx", (unsigned long) byte_get (ptr, size));
17564               goto next;
17565
17566             case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
17567               printf ("no copy on protected ");
17568               if (datasz)
17569                 printf (_("<corrupt length: %#x> "), datasz);
17570               goto next;
17571
17572             default:
17573               break;
17574             }
17575         }
17576
17577       if (type < GNU_PROPERTY_LOPROC)
17578         printf (_("<unknown type %#x data: "), type);
17579       else if (type < GNU_PROPERTY_LOUSER)
17580         printf (_("<procesor-specific type %#x data: "), type);
17581       else
17582         printf (_("<application-specific type %#x data: "), type);
17583       for (j = 0; j < datasz; ++j)
17584         printf ("%02x ", ptr[j] & 0xff);
17585       printf (">");
17586
17587 next:
17588       ptr += ((datasz + (size - 1)) & ~ (size - 1));
17589       if (ptr == ptr_end)
17590         break;
17591
17592       if (do_wide)
17593         printf (", ");
17594       else
17595         printf ("\n\t");
17596     }
17597
17598   printf ("\n");
17599 }
17600
17601 static bfd_boolean
17602 print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
17603 {
17604   /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type ().  */
17605   switch (pnote->type)
17606     {
17607     case NT_GNU_BUILD_ID:
17608       {
17609         unsigned long i;
17610
17611         printf (_("    Build ID: "));
17612         for (i = 0; i < pnote->descsz; ++i)
17613           printf ("%02x", pnote->descdata[i] & 0xff);
17614         printf ("\n");
17615       }
17616       break;
17617
17618     case NT_GNU_ABI_TAG:
17619       {
17620         unsigned long os, major, minor, subminor;
17621         const char *osname;
17622
17623         /* PR 17531: file: 030-599401-0.004.  */
17624         if (pnote->descsz < 16)
17625           {
17626             printf (_("    <corrupt GNU_ABI_TAG>\n"));
17627             break;
17628           }
17629
17630         os = byte_get ((unsigned char *) pnote->descdata, 4);
17631         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17632         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
17633         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
17634
17635         switch (os)
17636           {
17637           case GNU_ABI_TAG_LINUX:
17638             osname = "Linux";
17639             break;
17640           case GNU_ABI_TAG_HURD:
17641             osname = "Hurd";
17642             break;
17643           case GNU_ABI_TAG_SOLARIS:
17644             osname = "Solaris";
17645             break;
17646           case GNU_ABI_TAG_FREEBSD:
17647             osname = "FreeBSD";
17648             break;
17649           case GNU_ABI_TAG_NETBSD:
17650             osname = "NetBSD";
17651             break;
17652           case GNU_ABI_TAG_SYLLABLE:
17653             osname = "Syllable";
17654             break;
17655           case GNU_ABI_TAG_NACL:
17656             osname = "NaCl";
17657             break;
17658           default:
17659             osname = "Unknown";
17660             break;
17661           }
17662
17663         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
17664                 major, minor, subminor);
17665       }
17666       break;
17667
17668     case NT_GNU_GOLD_VERSION:
17669       {
17670         unsigned long i;
17671
17672         printf (_("    Version: "));
17673         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
17674           printf ("%c", pnote->descdata[i]);
17675         printf ("\n");
17676       }
17677       break;
17678
17679     case NT_GNU_HWCAP:
17680       {
17681         unsigned long num_entries, mask;
17682
17683         /* Hardware capabilities information.  Word 0 is the number of entries.
17684            Word 1 is a bitmask of enabled entries.  The rest of the descriptor
17685            is a series of entries, where each entry is a single byte followed
17686            by a nul terminated string.  The byte gives the bit number to test
17687            if enabled in the bitmask.  */
17688         printf (_("      Hardware Capabilities: "));
17689         if (pnote->descsz < 8)
17690           {
17691             error (_("<corrupt GNU_HWCAP>\n"));
17692             return FALSE;
17693           }
17694         num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
17695         mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17696         printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
17697         /* FIXME: Add code to display the entries... */
17698       }
17699       break;
17700
17701     case NT_GNU_PROPERTY_TYPE_0:
17702       print_gnu_property_note (filedata, pnote);
17703       break;
17704       
17705     default:
17706       /* Handle unrecognised types.  An error message should have already been
17707          created by get_gnu_elf_note_type(), so all that we need to do is to
17708          display the data.  */
17709       {
17710         unsigned long i;
17711
17712         printf (_("    Description data: "));
17713         for (i = 0; i < pnote->descsz; ++i)
17714           printf ("%02x ", pnote->descdata[i] & 0xff);
17715         printf ("\n");
17716       }
17717       break;
17718     }
17719
17720   return TRUE;
17721 }
17722
17723 static const char *
17724 get_v850_elf_note_type (enum v850_notes n_type)
17725 {
17726   static char buff[64];
17727
17728   switch (n_type)
17729     {
17730     case V850_NOTE_ALIGNMENT:  return _("Alignment of 8-byte objects");
17731     case V850_NOTE_DATA_SIZE:  return _("Sizeof double and long double");
17732     case V850_NOTE_FPU_INFO:   return _("Type of FPU support needed");
17733     case V850_NOTE_SIMD_INFO:  return _("Use of SIMD instructions");
17734     case V850_NOTE_CACHE_INFO: return _("Use of cache");
17735     case V850_NOTE_MMU_INFO:   return _("Use of MMU");
17736     default:
17737       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
17738       return buff;
17739     }
17740 }
17741
17742 static bfd_boolean
17743 print_v850_note (Elf_Internal_Note * pnote)
17744 {
17745   unsigned int val;
17746
17747   if (pnote->descsz != 4)
17748     return FALSE;
17749
17750   val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
17751
17752   if (val == 0)
17753     {
17754       printf (_("not set\n"));
17755       return TRUE;
17756     }
17757
17758   switch (pnote->type)
17759     {
17760     case V850_NOTE_ALIGNMENT:
17761       switch (val)
17762         {
17763         case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return TRUE;
17764         case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return TRUE;
17765         }
17766       break;
17767
17768     case V850_NOTE_DATA_SIZE:
17769       switch (val)
17770         {
17771         case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return TRUE;
17772         case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return TRUE;
17773         }
17774       break;
17775
17776     case V850_NOTE_FPU_INFO:
17777       switch (val)
17778         {
17779         case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return TRUE;
17780         case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return TRUE;
17781         }
17782       break;
17783
17784     case V850_NOTE_MMU_INFO:
17785     case V850_NOTE_CACHE_INFO:
17786     case V850_NOTE_SIMD_INFO:
17787       if (val == EF_RH850_SIMD)
17788         {
17789           printf (_("yes\n"));
17790           return TRUE;
17791         }
17792       break;
17793
17794     default:
17795       /* An 'unknown note type' message will already have been displayed.  */
17796       break;
17797     }
17798
17799   printf (_("unknown value: %x\n"), val);
17800   return FALSE;
17801 }
17802
17803 static bfd_boolean
17804 process_netbsd_elf_note (Elf_Internal_Note * pnote)
17805 {
17806   unsigned int version;
17807
17808   switch (pnote->type)
17809     {
17810     case NT_NETBSD_IDENT:
17811       version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
17812       if ((version / 10000) % 100)
17813         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
17814                 version, version / 100000000, (version / 1000000) % 100,
17815                 (version / 10000) % 100 > 26 ? "Z" : "",
17816                 'A' + (version / 10000) % 26);
17817       else
17818         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
17819                 version, version / 100000000, (version / 1000000) % 100,
17820                 (version / 100) % 100);
17821       return TRUE;
17822
17823     case NT_NETBSD_MARCH:
17824       printf ("  NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
17825               pnote->descdata);
17826       return TRUE;
17827
17828     default:
17829       printf ("  NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
17830               pnote->type);
17831       return FALSE;
17832     }
17833 }
17834
17835 static const char *
17836 get_freebsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17837 {
17838   switch (e_type)
17839     {
17840     case NT_FREEBSD_THRMISC:
17841       return _("NT_THRMISC (thrmisc structure)");
17842     case NT_FREEBSD_PROCSTAT_PROC:
17843       return _("NT_PROCSTAT_PROC (proc data)");
17844     case NT_FREEBSD_PROCSTAT_FILES:
17845       return _("NT_PROCSTAT_FILES (files data)");
17846     case NT_FREEBSD_PROCSTAT_VMMAP:
17847       return _("NT_PROCSTAT_VMMAP (vmmap data)");
17848     case NT_FREEBSD_PROCSTAT_GROUPS:
17849       return _("NT_PROCSTAT_GROUPS (groups data)");
17850     case NT_FREEBSD_PROCSTAT_UMASK:
17851       return _("NT_PROCSTAT_UMASK (umask data)");
17852     case NT_FREEBSD_PROCSTAT_RLIMIT:
17853       return _("NT_PROCSTAT_RLIMIT (rlimit data)");
17854     case NT_FREEBSD_PROCSTAT_OSREL:
17855       return _("NT_PROCSTAT_OSREL (osreldate data)");
17856     case NT_FREEBSD_PROCSTAT_PSSTRINGS:
17857       return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
17858     case NT_FREEBSD_PROCSTAT_AUXV:
17859       return _("NT_PROCSTAT_AUXV (auxv data)");
17860     case NT_FREEBSD_PTLWPINFO:
17861       return _("NT_PTLWPINFO (ptrace_lwpinfo structure)");
17862     }
17863   return get_note_type (filedata, e_type);
17864 }
17865
17866 static const char *
17867 get_netbsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17868 {
17869   static char buff[64];
17870
17871   if (e_type == NT_NETBSDCORE_PROCINFO)
17872     return _("NetBSD procinfo structure");
17873
17874   /* As of Jan 2002 there are no other machine-independent notes
17875      defined for NetBSD core files.  If the note type is less
17876      than the start of the machine-dependent note types, we don't
17877      understand it.  */
17878
17879   if (e_type < NT_NETBSDCORE_FIRSTMACH)
17880     {
17881       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17882       return buff;
17883     }
17884
17885   switch (filedata->file_header.e_machine)
17886     {
17887     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
17888        and PT_GETFPREGS == mach+2.  */
17889
17890     case EM_OLD_ALPHA:
17891     case EM_ALPHA:
17892     case EM_SPARC:
17893     case EM_SPARC32PLUS:
17894     case EM_SPARCV9:
17895       switch (e_type)
17896         {
17897         case NT_NETBSDCORE_FIRSTMACH + 0:
17898           return _("PT_GETREGS (reg structure)");
17899         case NT_NETBSDCORE_FIRSTMACH + 2:
17900           return _("PT_GETFPREGS (fpreg structure)");
17901         default:
17902           break;
17903         }
17904       break;
17905
17906     /* On all other arch's, PT_GETREGS == mach+1 and
17907        PT_GETFPREGS == mach+3.  */
17908     default:
17909       switch (e_type)
17910         {
17911         case NT_NETBSDCORE_FIRSTMACH + 1:
17912           return _("PT_GETREGS (reg structure)");
17913         case NT_NETBSDCORE_FIRSTMACH + 3:
17914           return _("PT_GETFPREGS (fpreg structure)");
17915         default:
17916           break;
17917         }
17918     }
17919
17920   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
17921             e_type - NT_NETBSDCORE_FIRSTMACH);
17922   return buff;
17923 }
17924
17925 static const char *
17926 get_stapsdt_note_type (unsigned e_type)
17927 {
17928   static char buff[64];
17929
17930   switch (e_type)
17931     {
17932     case NT_STAPSDT:
17933       return _("NT_STAPSDT (SystemTap probe descriptors)");
17934
17935     default:
17936       break;
17937     }
17938
17939   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17940   return buff;
17941 }
17942
17943 static bfd_boolean
17944 print_stapsdt_note (Elf_Internal_Note *pnote)
17945 {
17946   size_t len, maxlen;
17947   unsigned long addr_size = is_32bit_elf ? 4 : 8;
17948   char *data = pnote->descdata;
17949   char *data_end = pnote->descdata + pnote->descsz;
17950   bfd_vma pc, base_addr, semaphore;
17951   char *provider, *probe, *arg_fmt;
17952
17953   if (pnote->descsz < (addr_size * 3))
17954     goto stapdt_note_too_small;
17955
17956   pc = byte_get ((unsigned char *) data, addr_size);
17957   data += addr_size;
17958
17959   base_addr = byte_get ((unsigned char *) data, addr_size);
17960   data += addr_size;
17961
17962   semaphore = byte_get ((unsigned char *) data, addr_size);
17963   data += addr_size;
17964
17965   if (data >= data_end)
17966     goto stapdt_note_too_small;
17967   maxlen = data_end - data;
17968   len = strnlen (data, maxlen);
17969   if (len < maxlen)
17970     {
17971       provider = data;
17972       data += len + 1;
17973     }
17974   else
17975     goto stapdt_note_too_small;
17976
17977   if (data >= data_end)
17978     goto stapdt_note_too_small;
17979   maxlen = data_end - data;
17980   len = strnlen (data, maxlen);
17981   if (len < maxlen)
17982     {
17983       probe = data;
17984       data += len + 1;
17985     }
17986   else
17987     goto stapdt_note_too_small;
17988   
17989   if (data >= data_end)
17990     goto stapdt_note_too_small;
17991   maxlen = data_end - data;
17992   len = strnlen (data, maxlen);
17993   if (len < maxlen)
17994     {
17995       arg_fmt = data;
17996       data += len + 1;
17997     }
17998   else
17999     goto stapdt_note_too_small;
18000
18001   printf (_("    Provider: %s\n"), provider);
18002   printf (_("    Name: %s\n"), probe);
18003   printf (_("    Location: "));
18004   print_vma (pc, FULL_HEX);
18005   printf (_(", Base: "));
18006   print_vma (base_addr, FULL_HEX);
18007   printf (_(", Semaphore: "));
18008   print_vma (semaphore, FULL_HEX);
18009   printf ("\n");
18010   printf (_("    Arguments: %s\n"), arg_fmt);
18011
18012   return data == data_end;
18013
18014  stapdt_note_too_small:
18015   printf (_("  <corrupt - note is too small>\n"));
18016   error (_("corrupt stapdt note - the data size is too small\n"));
18017   return FALSE;
18018 }
18019
18020 static const char *
18021 get_ia64_vms_note_type (unsigned e_type)
18022 {
18023   static char buff[64];
18024
18025   switch (e_type)
18026     {
18027     case NT_VMS_MHD:
18028       return _("NT_VMS_MHD (module header)");
18029     case NT_VMS_LNM:
18030       return _("NT_VMS_LNM (language name)");
18031     case NT_VMS_SRC:
18032       return _("NT_VMS_SRC (source files)");
18033     case NT_VMS_TITLE:
18034       return "NT_VMS_TITLE";
18035     case NT_VMS_EIDC:
18036       return _("NT_VMS_EIDC (consistency check)");
18037     case NT_VMS_FPMODE:
18038       return _("NT_VMS_FPMODE (FP mode)");
18039     case NT_VMS_LINKTIME:
18040       return "NT_VMS_LINKTIME";
18041     case NT_VMS_IMGNAM:
18042       return _("NT_VMS_IMGNAM (image name)");
18043     case NT_VMS_IMGID:
18044       return _("NT_VMS_IMGID (image id)");
18045     case NT_VMS_LINKID:
18046       return _("NT_VMS_LINKID (link id)");
18047     case NT_VMS_IMGBID:
18048       return _("NT_VMS_IMGBID (build id)");
18049     case NT_VMS_GSTNAM:
18050       return _("NT_VMS_GSTNAM (sym table name)");
18051     case NT_VMS_ORIG_DYN:
18052       return "NT_VMS_ORIG_DYN";
18053     case NT_VMS_PATCHTIME:
18054       return "NT_VMS_PATCHTIME";
18055     default:
18056       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
18057       return buff;
18058     }
18059 }
18060
18061 static bfd_boolean
18062 print_ia64_vms_note (Elf_Internal_Note * pnote)
18063 {
18064   int maxlen = pnote->descsz;
18065
18066   if (maxlen < 2 || (unsigned long) maxlen != pnote->descsz)
18067     goto desc_size_fail;
18068
18069   switch (pnote->type)
18070     {
18071     case NT_VMS_MHD:
18072       if (maxlen <= 36)
18073         goto desc_size_fail;
18074
18075       int l = (int) strnlen (pnote->descdata + 34, maxlen - 34);
18076
18077       printf (_("    Creation date  : %.17s\n"), pnote->descdata);
18078       printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
18079       if (l + 34 < maxlen)
18080         {
18081           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
18082           if (l + 35 < maxlen)
18083             printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
18084           else
18085             printf (_("    Module version : <missing>\n"));
18086         }
18087       else
18088         {
18089           printf (_("    Module name    : <missing>\n"));
18090           printf (_("    Module version : <missing>\n"));
18091         }
18092       break;
18093
18094     case NT_VMS_LNM:
18095       printf (_("   Language: %.*s\n"), maxlen, pnote->descdata);
18096       break;
18097
18098 #ifdef BFD64
18099     case NT_VMS_FPMODE:
18100       printf (_("   Floating Point mode: "));
18101       if (maxlen < 8)
18102         goto desc_size_fail;
18103       /* FIXME: Generate an error if descsz > 8 ?  */
18104
18105       printf ("0x%016" BFD_VMA_FMT "x\n",
18106               (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
18107       break;
18108
18109     case NT_VMS_LINKTIME:
18110       printf (_("   Link time: "));
18111       if (maxlen < 8)
18112         goto desc_size_fail;
18113       /* FIXME: Generate an error if descsz > 8 ?  */
18114
18115       print_vms_time
18116         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
18117       printf ("\n");
18118       break;
18119
18120     case NT_VMS_PATCHTIME:
18121       printf (_("   Patch time: "));
18122       if (maxlen < 8)
18123         goto desc_size_fail;
18124       /* FIXME: Generate an error if descsz > 8 ?  */
18125
18126       print_vms_time
18127         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
18128       printf ("\n");
18129       break;
18130
18131     case NT_VMS_ORIG_DYN:
18132       if (maxlen < 34)
18133         goto desc_size_fail;
18134
18135       printf (_("   Major id: %u,  minor id: %u\n"),
18136               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
18137               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
18138       printf (_("   Last modified  : "));
18139       print_vms_time
18140         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
18141       printf (_("\n   Link flags  : "));
18142       printf ("0x%016" BFD_VMA_FMT "x\n",
18143               (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
18144       printf (_("   Header flags: 0x%08x\n"),
18145               (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
18146       printf (_("   Image id    : %.*s\n"), maxlen - 32, pnote->descdata + 32);
18147       break;
18148 #endif
18149
18150     case NT_VMS_IMGNAM:
18151       printf (_("    Image name: %.*s\n"), maxlen, pnote->descdata);
18152       break;
18153
18154     case NT_VMS_GSTNAM:
18155       printf (_("    Global symbol table name: %.*s\n"), maxlen, pnote->descdata);
18156       break;
18157
18158     case NT_VMS_IMGID:
18159       printf (_("    Image id: %.*s\n"), maxlen, pnote->descdata);
18160       break;
18161
18162     case NT_VMS_LINKID:
18163       printf (_("    Linker id: %.*s\n"), maxlen, pnote->descdata);
18164       break;
18165
18166     default:
18167       return FALSE;
18168     }
18169
18170   return TRUE;
18171
18172  desc_size_fail:
18173   printf (_("  <corrupt - data size is too small>\n"));
18174   error (_("corrupt IA64 note: data size is too small\n"));
18175   return FALSE;
18176 }
18177
18178 /* Find the symbol associated with a build attribute that is attached
18179    to address OFFSET.  If PNAME is non-NULL then store the name of
18180    the symbol (if found) in the provided pointer,  Returns NULL if a
18181    symbol could not be found.  */
18182
18183 static Elf_Internal_Sym *
18184 get_symbol_for_build_attribute (Filedata *       filedata,
18185                                 unsigned long    offset,
18186                                 bfd_boolean      is_open_attr,
18187                                 const char **    pname)
18188 {
18189   static Filedata *         saved_filedata = NULL;
18190   static char *             strtab;
18191   static unsigned long      strtablen;
18192   static Elf_Internal_Sym * symtab;
18193   static unsigned long      nsyms;
18194   Elf_Internal_Sym *        saved_sym = NULL;
18195   Elf_Internal_Sym *        sym;
18196
18197   if (filedata->section_headers != NULL
18198       && (saved_filedata == NULL || filedata != saved_filedata))
18199     {
18200       Elf_Internal_Shdr * symsec;
18201
18202       /* Load the symbol and string sections.  */
18203       for (symsec = filedata->section_headers;
18204            symsec < filedata->section_headers + filedata->file_header.e_shnum;
18205            symsec ++)
18206         {
18207           if (symsec->sh_type == SHT_SYMTAB)
18208             {
18209               symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
18210
18211               if (symsec->sh_link < filedata->file_header.e_shnum)
18212                 {
18213                   Elf_Internal_Shdr * strtab_sec = filedata->section_headers + symsec->sh_link;
18214
18215                   strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
18216                                               1, strtab_sec->sh_size,
18217                                               _("string table"));
18218                   strtablen = strtab != NULL ? strtab_sec->sh_size : 0;
18219                 }
18220             }
18221         }
18222       saved_filedata = filedata;
18223     }
18224
18225   if (symtab == NULL || strtab == NULL)
18226     return NULL;
18227
18228   /* Find a symbol whose value matches offset.  */
18229   for (sym = symtab; sym < symtab + nsyms; sym ++)
18230     if (sym->st_value == offset)
18231       {
18232         if (sym->st_name >= strtablen)
18233           /* Huh ?  This should not happen.  */
18234           continue;
18235
18236         if (strtab[sym->st_name] == 0)
18237           continue;
18238
18239         /* The AArch64 and ARM architectures define mapping symbols
18240            (eg $d, $x, $t) which we want to ignore.  */
18241         if (strtab[sym->st_name] == '$'
18242             && strtab[sym->st_name + 1] != 0
18243             && strtab[sym->st_name + 2] == 0)
18244           continue;
18245
18246         if (is_open_attr)
18247           {
18248             /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
18249                and FILE or OBJECT symbols over NOTYPE symbols.  We skip
18250                FUNC symbols entirely.  */
18251             switch (ELF_ST_TYPE (sym->st_info))
18252               {
18253               case STT_OBJECT:
18254               case STT_FILE:
18255                 saved_sym = sym;
18256                 if (sym->st_size)
18257                   {
18258                     /* If the symbol has a size associated
18259                        with it then we can stop searching.  */
18260                     sym = symtab + nsyms;
18261                   }
18262                 continue;
18263
18264               case STT_FUNC:
18265                 /* Ignore function symbols.  */
18266                 continue;
18267
18268               default:
18269                 break;
18270               }
18271
18272             switch (ELF_ST_BIND (sym->st_info))
18273               {
18274               case STB_GLOBAL:
18275                 if (saved_sym == NULL
18276                     || ELF_ST_TYPE (saved_sym->st_info) != STT_OBJECT)
18277                   saved_sym = sym;
18278                 break;
18279
18280               case STB_LOCAL:
18281                 if (saved_sym == NULL)
18282                   saved_sym = sym;
18283                 break;
18284
18285               default:
18286                 break;
18287               }
18288           }
18289         else
18290           {
18291             if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
18292               continue;
18293
18294             saved_sym = sym;
18295             break;
18296           }
18297       }
18298
18299   if (saved_sym && pname)
18300     * pname = strtab + saved_sym->st_name;
18301
18302   return saved_sym;
18303 }
18304
18305 /* Returns true iff addr1 and addr2 are in the same section.  */
18306
18307 static bfd_boolean
18308 same_section (Filedata * filedata, unsigned long addr1, unsigned long addr2)
18309 {
18310   Elf_Internal_Shdr * a1;
18311   Elf_Internal_Shdr * a2;
18312
18313   a1 = find_section_by_address (filedata, addr1);
18314   a2 = find_section_by_address (filedata, addr2);
18315   
18316   return a1 == a2 && a1 != NULL;
18317 }
18318
18319 static bfd_boolean
18320 print_gnu_build_attribute_description (Elf_Internal_Note *  pnote,
18321                                        Filedata *           filedata)
18322 {
18323   static unsigned long  global_offset = 0;
18324   static unsigned long  global_end = 0;
18325   static unsigned long  func_offset = 0;
18326   static unsigned long  func_end = 0;
18327
18328   Elf_Internal_Sym *    sym;
18329   const char *          name;
18330   unsigned long         start;
18331   unsigned long         end;
18332   bfd_boolean           is_open_attr = pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN;
18333
18334   switch (pnote->descsz)
18335     {
18336     case 0:
18337       /* A zero-length description means that the range of
18338          the previous note of the same type should be used.  */
18339       if (is_open_attr)
18340         {
18341           if (global_end > global_offset)
18342             printf (_("    Applies to region from %#lx to %#lx\n"),
18343                     global_offset, global_end);
18344           else
18345             printf (_("    Applies to region from %#lx\n"), global_offset);
18346         }
18347       else
18348         {
18349           if (func_end > func_offset)
18350             printf (_("    Applies to region from %#lx to %#lx\n"), func_offset, func_end);
18351           else
18352             printf (_("    Applies to region from %#lx\n"), func_offset);
18353         }
18354       return TRUE;
18355
18356     case 4:
18357       start = byte_get ((unsigned char *) pnote->descdata, 4);
18358       end = 0;
18359       break;
18360
18361     case 8:
18362       if (is_32bit_elf)
18363         {
18364           /* FIXME: We should check that version 3+ notes are being used here...  */
18365           start = byte_get ((unsigned char *) pnote->descdata, 4);
18366           end = byte_get ((unsigned char *) pnote->descdata + 4, 4);
18367         }
18368       else
18369         {
18370           start = byte_get ((unsigned char *) pnote->descdata, 8);
18371           end = 0;
18372         }
18373       break;
18374
18375     case 16:
18376       start = byte_get ((unsigned char *) pnote->descdata, 8);
18377       end = byte_get ((unsigned char *) pnote->descdata + 8, 8);
18378       break;
18379       
18380     default:
18381       error (_("    <invalid description size: %lx>\n"), pnote->descsz);
18382       printf (_("    <invalid descsz>"));
18383       return FALSE;
18384     }
18385
18386   name = NULL;
18387   sym = get_symbol_for_build_attribute (filedata, start, is_open_attr, & name);
18388   /* As of version 5 of the annobin plugin, filename symbols are biased by 2
18389      in order to avoid them being confused with the start address of the
18390      first function in the file...  */
18391   if (sym == NULL && is_open_attr)
18392     sym = get_symbol_for_build_attribute (filedata, start + 2, is_open_attr,
18393                                           & name);
18394
18395   if (end == 0 && sym != NULL && sym->st_size > 0)
18396     end = start + sym->st_size;
18397
18398   if (is_open_attr)
18399     {
18400       /* FIXME: Need to properly allow for section alignment.
18401          16 is just the alignment used on x86_64.  */
18402       if (global_end > 0
18403           && start > BFD_ALIGN (global_end, 16)
18404           /* Build notes are not guaranteed to be organised in order of
18405              increasing address, but we should find the all of the notes
18406              for one section in the same place.  */
18407           && same_section (filedata, start, global_end))
18408         warn (_("Gap in build notes detected from %#lx to %#lx\n"),
18409               global_end + 1, start - 1);
18410
18411       printf (_("    Applies to region from %#lx"), start);
18412       global_offset = start;
18413
18414       if (end)
18415         {
18416           printf (_(" to %#lx"), end);
18417           global_end = end;
18418         }
18419     }
18420   else
18421     {
18422       printf (_("    Applies to region from %#lx"), start);
18423       func_offset = start;
18424
18425       if (end)
18426         {
18427           printf (_(" to %#lx"), end);
18428           func_end = end;
18429         }
18430     }
18431
18432   if (sym && name)
18433     printf (_(" (%s)"), name);
18434
18435   printf ("\n");
18436   return TRUE;
18437 }
18438
18439 static bfd_boolean
18440 print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
18441 {
18442   static const char string_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_STRING, 0 };
18443   static const char number_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC, 0 };
18444   static const char bool_expected [3] = { GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE, GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE, 0 };
18445   char         name_type;
18446   char         name_attribute;
18447   const char * expected_types;
18448   const char * name = pnote->namedata;
18449   const char * text;
18450   signed int   left;
18451
18452   if (name == NULL || pnote->namesz < 2)
18453     {
18454       error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
18455       print_symbol (-20, _("  <corrupt name>"));
18456       return FALSE;
18457     }
18458
18459   if (do_wide)
18460     left = 28;
18461   else
18462     left = 20;
18463
18464   /* Version 2 of the spec adds a "GA" prefix to the name field.  */
18465   if (name[0] == 'G' && name[1] == 'A')
18466     {
18467       if (pnote->namesz < 4)
18468         {
18469           error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
18470           print_symbol (-20, _("  <corrupt name>"));
18471           return FALSE;
18472         }
18473
18474       printf ("GA");
18475       name += 2;
18476       left -= 2;
18477     }
18478
18479   switch ((name_type = * name))
18480     {
18481     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18482     case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
18483     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
18484     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
18485       printf ("%c", * name);
18486       left --;
18487       break;
18488     default:
18489       error (_("unrecognised attribute type in name field: %d\n"), name_type);
18490       print_symbol (-20, _("<unknown name type>"));
18491       return FALSE;
18492     }
18493
18494   ++ name;
18495   text = NULL;
18496
18497   switch ((name_attribute = * name))
18498     {
18499     case GNU_BUILD_ATTRIBUTE_VERSION:
18500       text = _("<version>");
18501       expected_types = string_expected;
18502       ++ name;
18503       break;
18504     case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18505       text = _("<stack prot>");
18506       expected_types = "!+*";
18507       ++ name;
18508       break;
18509     case GNU_BUILD_ATTRIBUTE_RELRO:
18510       text = _("<relro>");
18511       expected_types = bool_expected;
18512       ++ name;
18513       break;
18514     case GNU_BUILD_ATTRIBUTE_STACK_SIZE:
18515       text = _("<stack size>");
18516       expected_types = number_expected;
18517       ++ name;
18518       break;
18519     case GNU_BUILD_ATTRIBUTE_TOOL:
18520       text = _("<tool>");
18521       expected_types = string_expected;
18522       ++ name;
18523       break;
18524     case GNU_BUILD_ATTRIBUTE_ABI:
18525       text = _("<ABI>");
18526       expected_types = "$*";
18527       ++ name;
18528       break;
18529     case GNU_BUILD_ATTRIBUTE_PIC:
18530       text = _("<PIC>");
18531       expected_types = number_expected;
18532       ++ name;
18533       break;
18534     case GNU_BUILD_ATTRIBUTE_SHORT_ENUM:
18535       text = _("<short enum>");
18536       expected_types = bool_expected;
18537       ++ name;
18538       break;
18539     default:
18540       if (ISPRINT (* name))
18541         {
18542           int len = strnlen (name, pnote->namesz - (name - pnote->namedata)) + 1;
18543
18544           if (len > left && ! do_wide)
18545             len = left;
18546           printf ("%.*s:", len, name);
18547           left -= len;
18548           name += len;
18549         }
18550       else
18551         {
18552           static char tmpbuf [128];
18553
18554           error (_("unrecognised byte in name field: %d\n"), * name);
18555           sprintf (tmpbuf, _("<unknown:_%d>"), * name);
18556           text = tmpbuf;
18557           name ++;
18558         }
18559       expected_types = "*$!+";
18560       break;
18561     }
18562
18563   if (text)
18564     left -= printf ("%s", text);
18565
18566   if (strchr (expected_types, name_type) == NULL)
18567     warn (_("attribute does not have an expected type (%c)\n"), name_type);
18568
18569   if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
18570     {
18571       error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
18572              (unsigned long) pnote->namesz,
18573              (long) (name - pnote->namedata));
18574       return FALSE;
18575     }
18576
18577   if (left < 1 && ! do_wide)
18578     return TRUE;
18579
18580   switch (name_type)
18581     {
18582     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18583       {
18584         unsigned int        bytes;
18585         unsigned long long  val = 0;
18586         unsigned int        shift = 0;
18587         char *              decoded = NULL;
18588
18589         bytes = pnote->namesz - (name - pnote->namedata);
18590         if (bytes > 0)
18591           /* The -1 is because the name field is always 0 terminated, and we
18592              want to be able to ensure that the shift in the while loop below
18593              will not overflow.  */
18594           -- bytes;
18595
18596         if (bytes > sizeof (val))
18597           {
18598             error (_("corrupt numeric name field: too many bytes in the value: %x\n"),
18599                    bytes);
18600             bytes = sizeof (val);
18601           }
18602         /* We do not bother to warn if bytes == 0 as this can
18603            happen with some early versions of the gcc plugin.  */
18604
18605         while (bytes --)
18606           {
18607             unsigned long byte = (* name ++) & 0xff;
18608
18609             val |= byte << shift;
18610             shift += 8;
18611           }
18612
18613         switch (name_attribute)
18614           {
18615           case GNU_BUILD_ATTRIBUTE_PIC:
18616             switch (val)
18617               {
18618               case 0: decoded = "static"; break;
18619               case 1: decoded = "pic"; break;
18620               case 2: decoded = "PIC"; break;
18621               case 3: decoded = "pie"; break;
18622               case 4: decoded = "PIE"; break;
18623               default: break;
18624               }
18625             break;
18626           case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18627             switch (val)
18628               {
18629                 /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c.  */
18630               case 0: decoded = "off"; break;
18631               case 1: decoded = "on"; break;
18632               case 2: decoded = "all"; break;
18633               case 3: decoded = "strong"; break;
18634               case 4: decoded = "explicit"; break;
18635               default: break;
18636               }
18637             break;
18638           default:
18639             break;
18640           }
18641
18642         if (decoded != NULL)
18643           {
18644             print_symbol (-left, decoded);
18645             left = 0;
18646           }
18647         else if (val == 0)
18648           {
18649             printf ("0x0");
18650             left -= 3;
18651           }
18652         else
18653           {
18654             if (do_wide)
18655               left -= printf ("0x%llx", val);
18656             else
18657               left -= printf ("0x%-.*llx", left, val);
18658           }
18659       }
18660       break;
18661     case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
18662       left -= print_symbol (- left, name);
18663       break;
18664     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
18665       left -= print_symbol (- left, "true");
18666       break;
18667     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
18668       left -= print_symbol (- left, "false");
18669       break;
18670     }
18671
18672   if (do_wide && left > 0)
18673     printf ("%-*s", left, " ");
18674     
18675   return TRUE;
18676 }
18677
18678 /* Note that by the ELF standard, the name field is already null byte
18679    terminated, and namesz includes the terminating null byte.
18680    I.E. the value of namesz for the name "FSF" is 4.
18681
18682    If the value of namesz is zero, there is no name present.  */
18683
18684 static bfd_boolean
18685 process_note (Elf_Internal_Note *  pnote,
18686               Filedata *           filedata)
18687 {
18688   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
18689   const char * nt;
18690
18691   if (pnote->namesz == 0)
18692     /* If there is no note name, then use the default set of
18693        note type strings.  */
18694     nt = get_note_type (filedata, pnote->type);
18695
18696   else if (const_strneq (pnote->namedata, "GNU"))
18697     /* GNU-specific object file notes.  */
18698     nt = get_gnu_elf_note_type (pnote->type);
18699
18700   else if (const_strneq (pnote->namedata, "FreeBSD"))
18701     /* FreeBSD-specific core file notes.  */
18702     nt = get_freebsd_elfcore_note_type (filedata, pnote->type);
18703
18704   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
18705     /* NetBSD-specific core file notes.  */
18706     nt = get_netbsd_elfcore_note_type (filedata, pnote->type);
18707
18708   else if (const_strneq (pnote->namedata, "NetBSD"))
18709     /* NetBSD-specific core file notes.  */
18710     return process_netbsd_elf_note (pnote);
18711
18712   else if (strneq (pnote->namedata, "SPU/", 4))
18713     {
18714       /* SPU-specific core file notes.  */
18715       nt = pnote->namedata + 4;
18716       name = "SPU";
18717     }
18718
18719   else if (const_strneq (pnote->namedata, "IPF/VMS"))
18720     /* VMS/ia64-specific file notes.  */
18721     nt = get_ia64_vms_note_type (pnote->type);
18722
18723   else if (const_strneq (pnote->namedata, "stapsdt"))
18724     nt = get_stapsdt_note_type (pnote->type);
18725
18726   else
18727     /* Don't recognize this note name; just use the default set of
18728        note type strings.  */
18729     nt = get_note_type (filedata, pnote->type);
18730
18731   printf ("  ");
18732
18733   if (((const_strneq (pnote->namedata, "GA")
18734         && strchr ("*$!+", pnote->namedata[2]) != NULL)
18735        || strchr ("*$!+", pnote->namedata[0]) != NULL)
18736       && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18737           || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
18738     print_gnu_build_attribute_name (pnote);
18739   else
18740     print_symbol (-20, name);
18741
18742   if (do_wide)
18743     printf (" 0x%08lx\t%s\t", pnote->descsz, nt);
18744   else
18745     printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
18746
18747   if (const_strneq (pnote->namedata, "IPF/VMS"))
18748     return print_ia64_vms_note (pnote);
18749   else if (const_strneq (pnote->namedata, "GNU"))
18750     return print_gnu_note (filedata, pnote);
18751   else if (const_strneq (pnote->namedata, "stapsdt"))
18752     return print_stapsdt_note (pnote);
18753   else if (const_strneq (pnote->namedata, "CORE"))
18754     return print_core_note (pnote);
18755   else if (((const_strneq (pnote->namedata, "GA")
18756              && strchr ("*$!+", pnote->namedata[2]) != NULL)
18757             || strchr ("*$!+", pnote->namedata[0]) != NULL)
18758            && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18759                || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
18760     return print_gnu_build_attribute_description (pnote, filedata);
18761
18762   if (pnote->descsz)
18763     {
18764       unsigned long i;
18765
18766       printf (_("   description data: "));
18767       for (i = 0; i < pnote->descsz; i++)
18768         printf ("%02x ", pnote->descdata[i]);
18769       if (!do_wide)
18770         printf ("\n");
18771     }
18772
18773   if (do_wide)
18774     printf ("\n");
18775
18776   return TRUE;
18777 }
18778
18779 static bfd_boolean
18780 process_notes_at (Filedata *           filedata,
18781                   Elf_Internal_Shdr *  section,
18782                   bfd_vma              offset,
18783                   bfd_vma              length,
18784                   bfd_vma              align)
18785 {
18786   Elf_External_Note * pnotes;
18787   Elf_External_Note * external;
18788   char *              end;
18789   bfd_boolean         res = TRUE;
18790
18791   if (length <= 0)
18792     return FALSE;
18793
18794   if (section)
18795     {
18796       pnotes = (Elf_External_Note *) get_section_contents (section, filedata);
18797       if (pnotes)
18798         {
18799           if (! apply_relocations (filedata, section, (unsigned char *) pnotes, length, NULL, NULL))
18800             return FALSE;
18801         }
18802     }
18803   else
18804     pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18805                                              _("notes"));
18806
18807   if (pnotes == NULL)
18808     return FALSE;
18809
18810   external = pnotes;
18811
18812   if (section)
18813     printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (filedata, section));
18814   else
18815     printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
18816             (unsigned long) offset, (unsigned long) length);
18817
18818   /* NB: Some note sections may have alignment value of 0 or 1.  gABI
18819      specifies that notes should be aligned to 4 bytes in 32-bit
18820      objects and to 8 bytes in 64-bit objects.  As a Linux extension,
18821      we also support 4 byte alignment in 64-bit objects.  If section
18822      alignment is less than 4, we treate alignment as 4 bytes.   */
18823   if (align < 4)
18824     align = 4;
18825   else if (align != 4 && align != 8)
18826     {
18827       warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
18828             (long) align);
18829       return FALSE;
18830     }
18831
18832   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
18833
18834   end = (char *) pnotes + length;
18835   while ((char *) external < end)
18836     {
18837       Elf_Internal_Note inote;
18838       size_t min_notesz;
18839       char * next;
18840       char * temp = NULL;
18841       size_t data_remaining = end - (char *) external;
18842
18843       if (!is_ia64_vms (filedata))
18844         {
18845           /* PR binutils/15191
18846              Make sure that there is enough data to read.  */
18847           min_notesz = offsetof (Elf_External_Note, name);
18848           if (data_remaining < min_notesz)
18849             {
18850               warn (ngettext ("Corrupt note: only %ld byte remains, "
18851                               "not enough for a full note\n",
18852                               "Corrupt note: only %ld bytes remain, "
18853                               "not enough for a full note\n",
18854                               data_remaining),
18855                     (long) data_remaining);
18856               break;
18857             }
18858           data_remaining -= min_notesz;
18859
18860           inote.type     = BYTE_GET (external->type);
18861           inote.namesz   = BYTE_GET (external->namesz);
18862           inote.namedata = external->name;
18863           inote.descsz   = BYTE_GET (external->descsz);
18864           inote.descdata = ((char *) external
18865                             + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
18866           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
18867           next = ((char *) external
18868                   + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
18869         }
18870       else
18871         {
18872           Elf64_External_VMS_Note *vms_external;
18873
18874           /* PR binutils/15191
18875              Make sure that there is enough data to read.  */
18876           min_notesz = offsetof (Elf64_External_VMS_Note, name);
18877           if (data_remaining < min_notesz)
18878             {
18879               warn (ngettext ("Corrupt note: only %ld byte remains, "
18880                               "not enough for a full note\n",
18881                               "Corrupt note: only %ld bytes remain, "
18882                               "not enough for a full note\n",
18883                               data_remaining),
18884                     (long) data_remaining);
18885               break;
18886             }
18887           data_remaining -= min_notesz;
18888
18889           vms_external = (Elf64_External_VMS_Note *) external;
18890           inote.type     = BYTE_GET (vms_external->type);
18891           inote.namesz   = BYTE_GET (vms_external->namesz);
18892           inote.namedata = vms_external->name;
18893           inote.descsz   = BYTE_GET (vms_external->descsz);
18894           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
18895           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
18896           next = inote.descdata + align_power (inote.descsz, 3);
18897         }
18898
18899       /* PR 17531: file: 3443835e.  */
18900       /* PR 17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4.  */
18901       if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
18902           || (size_t) (inote.descdata - inote.namedata) > data_remaining
18903           || (size_t) (next - inote.descdata) < inote.descsz
18904           || ((size_t) (next - inote.descdata)
18905               > data_remaining - (size_t) (inote.descdata - inote.namedata)))
18906         {
18907           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
18908                 (unsigned long) ((char *) external - (char *) pnotes));
18909           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
18910                 inote.type, inote.namesz, inote.descsz, (int) align);
18911           break;
18912         }
18913
18914       external = (Elf_External_Note *) next;
18915
18916       /* Verify that name is null terminated.  It appears that at least
18917          one version of Linux (RedHat 6.0) generates corefiles that don't
18918          comply with the ELF spec by failing to include the null byte in
18919          namesz.  */
18920       if (inote.namesz > 0 && inote.namedata[inote.namesz - 1] != '\0')
18921         {
18922           if ((size_t) (inote.descdata - inote.namedata) == inote.namesz)
18923             {
18924               temp = (char *) malloc (inote.namesz + 1);
18925               if (temp == NULL)
18926                 {
18927                   error (_("Out of memory allocating space for inote name\n"));
18928                   res = FALSE;
18929                   break;
18930                 }
18931
18932               memcpy (temp, inote.namedata, inote.namesz);
18933               inote.namedata = temp;
18934             }
18935           inote.namedata[inote.namesz] = 0;
18936         }
18937
18938       if (! process_note (& inote, filedata))
18939         res = FALSE;
18940
18941       if (temp != NULL)
18942         {
18943           free (temp);
18944           temp = NULL;
18945         }
18946     }
18947
18948   free (pnotes);
18949
18950   return res;
18951 }
18952
18953 static bfd_boolean
18954 process_corefile_note_segments (Filedata * filedata)
18955 {
18956   Elf_Internal_Phdr * segment;
18957   unsigned int i;
18958   bfd_boolean res = TRUE;
18959
18960   if (! get_program_headers (filedata))
18961     return TRUE;
18962
18963   for (i = 0, segment = filedata->program_headers;
18964        i < filedata->file_header.e_phnum;
18965        i++, segment++)
18966     {
18967       if (segment->p_type == PT_NOTE)
18968         if (! process_notes_at (filedata, NULL,
18969                                 (bfd_vma) segment->p_offset,
18970                                 (bfd_vma) segment->p_filesz,
18971                                 (bfd_vma) segment->p_align))
18972           res = FALSE;
18973     }
18974
18975   return res;
18976 }
18977
18978 static bfd_boolean
18979 process_v850_notes (Filedata * filedata, bfd_vma offset, bfd_vma length)
18980 {
18981   Elf_External_Note * pnotes;
18982   Elf_External_Note * external;
18983   char * end;
18984   bfd_boolean res = TRUE;
18985
18986   if (length <= 0)
18987     return FALSE;
18988
18989   pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18990                                            _("v850 notes"));
18991   if (pnotes == NULL)
18992     return FALSE;
18993
18994   external = pnotes;
18995   end = (char*) pnotes + length;
18996
18997   printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
18998           (unsigned long) offset, (unsigned long) length);
18999
19000   while ((char *) external + sizeof (Elf_External_Note) < end)
19001     {
19002       Elf_External_Note * next;
19003       Elf_Internal_Note inote;
19004
19005       inote.type     = BYTE_GET (external->type);
19006       inote.namesz   = BYTE_GET (external->namesz);
19007       inote.namedata = external->name;
19008       inote.descsz   = BYTE_GET (external->descsz);
19009       inote.descdata = inote.namedata + align_power (inote.namesz, 2);
19010       inote.descpos  = offset + (inote.descdata - (char *) pnotes);
19011
19012       if (inote.descdata < (char *) pnotes || inote.descdata >= end)
19013         {
19014           warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
19015           inote.descdata = inote.namedata;
19016           inote.namesz   = 0;
19017         }
19018
19019       next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
19020
19021       if (   ((char *) next > end)
19022           || ((char *) next <  (char *) pnotes))
19023         {
19024           warn (_("corrupt descsz found in note at offset 0x%lx\n"),
19025                 (unsigned long) ((char *) external - (char *) pnotes));
19026           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
19027                 inote.type, inote.namesz, inote.descsz);
19028           break;
19029         }
19030
19031       external = next;
19032
19033       /* Prevent out-of-bounds indexing.  */
19034       if (   inote.namedata + inote.namesz > end
19035           || inote.namedata + inote.namesz < inote.namedata)
19036         {
19037           warn (_("corrupt namesz found in note at offset 0x%lx\n"),
19038                 (unsigned long) ((char *) external - (char *) pnotes));
19039           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
19040                 inote.type, inote.namesz, inote.descsz);
19041           break;
19042         }
19043
19044       printf ("  %s: ", get_v850_elf_note_type (inote.type));
19045
19046       if (! print_v850_note (& inote))
19047         {
19048           res = FALSE;
19049           printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
19050                   inote.namesz, inote.descsz);
19051         }
19052     }
19053
19054   free (pnotes);
19055
19056   return res;
19057 }
19058
19059 static bfd_boolean
19060 process_note_sections (Filedata * filedata)
19061 {
19062   Elf_Internal_Shdr * section;
19063   unsigned long i;
19064   unsigned int n = 0;
19065   bfd_boolean res = TRUE;
19066
19067   for (i = 0, section = filedata->section_headers;
19068        i < filedata->file_header.e_shnum && section != NULL;
19069        i++, section++)
19070     {
19071       if (section->sh_type == SHT_NOTE)
19072         {
19073           if (! process_notes_at (filedata, section,
19074                                   (bfd_vma) section->sh_offset,
19075                                   (bfd_vma) section->sh_size,
19076                                   (bfd_vma) section->sh_addralign))
19077             res = FALSE;
19078           n++;
19079         }
19080
19081       if ((   filedata->file_header.e_machine == EM_V800
19082            || filedata->file_header.e_machine == EM_V850
19083            || filedata->file_header.e_machine == EM_CYGNUS_V850)
19084           && section->sh_type == SHT_RENESAS_INFO)
19085         {
19086           if (! process_v850_notes (filedata,
19087                                     (bfd_vma) section->sh_offset,
19088                                     (bfd_vma) section->sh_size))
19089             res = FALSE;
19090           n++;
19091         }
19092     }
19093
19094   if (n == 0)
19095     /* Try processing NOTE segments instead.  */
19096     return process_corefile_note_segments (filedata);
19097
19098   return res;
19099 }
19100
19101 static bfd_boolean
19102 process_notes (Filedata * filedata)
19103 {
19104   /* If we have not been asked to display the notes then do nothing.  */
19105   if (! do_notes)
19106     return TRUE;
19107
19108   if (filedata->file_header.e_type != ET_CORE)
19109     return process_note_sections (filedata);
19110
19111   /* No program headers means no NOTE segment.  */
19112   if (filedata->file_header.e_phnum > 0)
19113     return process_corefile_note_segments (filedata);
19114
19115   printf (_("No note segments present in the core file.\n"));
19116   return TRUE;
19117 }
19118
19119 static unsigned char *
19120 display_public_gnu_attributes (unsigned char * start,
19121                                const unsigned char * const end)
19122 {
19123   printf (_("  Unknown GNU attribute: %s\n"), start);
19124
19125   start += strnlen ((char *) start, end - start);
19126   display_raw_attribute (start, end);
19127
19128   return (unsigned char *) end;
19129 }
19130
19131 static unsigned char *
19132 display_generic_attribute (unsigned char * start,
19133                            unsigned int tag,
19134                            const unsigned char * const end)
19135 {
19136   if (tag == 0)
19137     return (unsigned char *) end;
19138
19139   return display_tag_value (tag, start, end);
19140 }
19141
19142 static bfd_boolean
19143 process_arch_specific (Filedata * filedata)
19144 {
19145   if (! do_arch)
19146     return TRUE;
19147
19148   switch (filedata->file_header.e_machine)
19149     {
19150     case EM_ARC:
19151     case EM_ARC_COMPACT:
19152     case EM_ARC_COMPACT2:
19153       return process_attributes (filedata, "ARC", SHT_ARC_ATTRIBUTES,
19154                                  display_arc_attribute,
19155                                  display_generic_attribute);
19156     case EM_ARM:
19157       return process_attributes (filedata, "aeabi", SHT_ARM_ATTRIBUTES,
19158                                  display_arm_attribute,
19159                                  display_generic_attribute);
19160
19161     case EM_MIPS:
19162     case EM_MIPS_RS3_LE:
19163       return process_mips_specific (filedata);
19164
19165     case EM_MSP430:
19166      return process_attributes (filedata, "mspabi", SHT_MSP430_ATTRIBUTES,
19167                                 display_msp430x_attribute,
19168                                 display_generic_attribute);
19169
19170     case EM_RISCV:
19171      return process_attributes (filedata, "riscv", SHT_RISCV_ATTRIBUTES,
19172                                 display_riscv_attribute,
19173                                 display_generic_attribute);
19174
19175     case EM_NDS32:
19176       return process_nds32_specific (filedata);
19177
19178     case EM_PPC:
19179     case EM_PPC64:
19180       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19181                                  display_power_gnu_attribute);
19182
19183     case EM_S390:
19184     case EM_S390_OLD:
19185       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19186                                  display_s390_gnu_attribute);
19187
19188     case EM_SPARC:
19189     case EM_SPARC32PLUS:
19190     case EM_SPARCV9:
19191       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19192                                  display_sparc_gnu_attribute);
19193
19194     case EM_TI_C6000:
19195       return process_attributes (filedata, "c6xabi", SHT_C6000_ATTRIBUTES,
19196                                  display_tic6x_attribute,
19197                                  display_generic_attribute);
19198
19199     default:
19200       return process_attributes (filedata, "gnu", SHT_GNU_ATTRIBUTES,
19201                                  display_public_gnu_attributes,
19202                                  display_generic_attribute);
19203     }
19204 }
19205
19206 static bfd_boolean
19207 get_file_header (Filedata * filedata)
19208 {
19209   /* Read in the identity array.  */
19210   if (fread (filedata->file_header.e_ident, EI_NIDENT, 1, filedata->handle) != 1)
19211     return FALSE;
19212
19213   /* Determine how to read the rest of the header.  */
19214   switch (filedata->file_header.e_ident[EI_DATA])
19215     {
19216     default:
19217     case ELFDATANONE:
19218     case ELFDATA2LSB:
19219       byte_get = byte_get_little_endian;
19220       byte_put = byte_put_little_endian;
19221       break;
19222     case ELFDATA2MSB:
19223       byte_get = byte_get_big_endian;
19224       byte_put = byte_put_big_endian;
19225       break;
19226     }
19227
19228   /* For now we only support 32 bit and 64 bit ELF files.  */
19229   is_32bit_elf = (filedata->file_header.e_ident[EI_CLASS] != ELFCLASS64);
19230
19231   /* Read in the rest of the header.  */
19232   if (is_32bit_elf)
19233     {
19234       Elf32_External_Ehdr ehdr32;
19235
19236       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, filedata->handle) != 1)
19237         return FALSE;
19238
19239       filedata->file_header.e_type      = BYTE_GET (ehdr32.e_type);
19240       filedata->file_header.e_machine   = BYTE_GET (ehdr32.e_machine);
19241       filedata->file_header.e_version   = BYTE_GET (ehdr32.e_version);
19242       filedata->file_header.e_entry     = BYTE_GET (ehdr32.e_entry);
19243       filedata->file_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
19244       filedata->file_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
19245       filedata->file_header.e_flags     = BYTE_GET (ehdr32.e_flags);
19246       filedata->file_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
19247       filedata->file_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
19248       filedata->file_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
19249       filedata->file_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
19250       filedata->file_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
19251       filedata->file_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
19252     }
19253   else
19254     {
19255       Elf64_External_Ehdr ehdr64;
19256
19257       /* If we have been compiled with sizeof (bfd_vma) == 4, then
19258          we will not be able to cope with the 64bit data found in
19259          64 ELF files.  Detect this now and abort before we start
19260          overwriting things.  */
19261       if (sizeof (bfd_vma) < 8)
19262         {
19263           error (_("This instance of readelf has been built without support for a\n\
19264 64 bit data type and so it cannot read 64 bit ELF files.\n"));
19265           return FALSE;
19266         }
19267
19268       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, filedata->handle) != 1)
19269         return FALSE;
19270
19271       filedata->file_header.e_type      = BYTE_GET (ehdr64.e_type);
19272       filedata->file_header.e_machine   = BYTE_GET (ehdr64.e_machine);
19273       filedata->file_header.e_version   = BYTE_GET (ehdr64.e_version);
19274       filedata->file_header.e_entry     = BYTE_GET (ehdr64.e_entry);
19275       filedata->file_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
19276       filedata->file_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
19277       filedata->file_header.e_flags     = BYTE_GET (ehdr64.e_flags);
19278       filedata->file_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
19279       filedata->file_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
19280       filedata->file_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
19281       filedata->file_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
19282       filedata->file_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
19283       filedata->file_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
19284     }
19285
19286   if (filedata->file_header.e_shoff)
19287     {
19288       /* There may be some extensions in the first section header.  Don't
19289          bomb if we can't read it.  */
19290       if (is_32bit_elf)
19291         get_32bit_section_headers (filedata, TRUE);
19292       else
19293         get_64bit_section_headers (filedata, TRUE);
19294     }
19295
19296   return TRUE;
19297 }
19298
19299 static void
19300 close_file (Filedata * filedata)
19301 {
19302   if (filedata)
19303     {
19304       if (filedata->handle)
19305         fclose (filedata->handle);
19306       free (filedata);
19307     }
19308 }
19309
19310 void
19311 close_debug_file (void * data)
19312 {
19313   close_file ((Filedata *) data);
19314 }
19315
19316 static Filedata *
19317 open_file (const char * pathname)
19318 {
19319   struct stat  statbuf;
19320   Filedata *   filedata = NULL;
19321
19322   if (stat (pathname, & statbuf) < 0
19323       || ! S_ISREG (statbuf.st_mode))
19324     goto fail;
19325
19326   filedata = calloc (1, sizeof * filedata);
19327   if (filedata == NULL)
19328     goto fail;
19329
19330   filedata->handle = fopen (pathname, "rb");
19331   if (filedata->handle == NULL)
19332     goto fail;
19333
19334   filedata->file_size = (bfd_size_type) statbuf.st_size;
19335   filedata->file_name = pathname;
19336
19337   if (! get_file_header (filedata))
19338     goto fail;
19339
19340   if (filedata->file_header.e_shoff)
19341     {
19342       bfd_boolean res;
19343
19344       /* Read the section headers again, this time for real.  */
19345       if (is_32bit_elf)
19346         res = get_32bit_section_headers (filedata, FALSE);
19347       else
19348         res = get_64bit_section_headers (filedata, FALSE);
19349
19350       if (!res)
19351         goto fail;
19352     }
19353
19354   return filedata;
19355
19356  fail:
19357   if (filedata)
19358     {
19359       if (filedata->handle)
19360         fclose (filedata->handle);
19361       free (filedata);
19362     }
19363   return NULL;
19364 }
19365
19366 void *
19367 open_debug_file (const char * pathname)
19368 {
19369   return open_file (pathname);
19370 }
19371
19372 /* Process one ELF object file according to the command line options.
19373    This file may actually be stored in an archive.  The file is
19374    positioned at the start of the ELF object.  Returns TRUE if no
19375    problems were encountered, FALSE otherwise.  */
19376
19377 static bfd_boolean
19378 process_object (Filedata * filedata)
19379 {
19380   bfd_boolean  have_separate_files;
19381   unsigned int i;
19382   bfd_boolean res = TRUE;
19383
19384   if (! get_file_header (filedata))
19385     {
19386       error (_("%s: Failed to read file header\n"), filedata->file_name);
19387       return FALSE;
19388     }
19389
19390   /* Initialise per file variables.  */
19391   for (i = ARRAY_SIZE (version_info); i--;)
19392     version_info[i] = 0;
19393
19394   for (i = ARRAY_SIZE (dynamic_info); i--;)
19395     dynamic_info[i] = 0;
19396   dynamic_info_DT_GNU_HASH = 0;
19397
19398   /* Process the file.  */
19399   if (show_name)
19400     printf (_("\nFile: %s\n"), filedata->file_name);
19401
19402   /* Initialise the dump_sects array from the cmdline_dump_sects array.
19403      Note we do this even if cmdline_dump_sects is empty because we
19404      must make sure that the dump_sets array is zeroed out before each
19405      object file is processed.  */
19406   if (filedata->num_dump_sects > cmdline.num_dump_sects)
19407     memset (filedata->dump_sects, 0, filedata->num_dump_sects * sizeof (* filedata->dump_sects));
19408
19409   if (cmdline.num_dump_sects > 0)
19410     {
19411       if (filedata->num_dump_sects == 0)
19412         /* A sneaky way of allocating the dump_sects array.  */
19413         request_dump_bynumber (filedata, cmdline.num_dump_sects, 0);
19414
19415       assert (filedata->num_dump_sects >= cmdline.num_dump_sects);
19416       memcpy (filedata->dump_sects, cmdline.dump_sects,
19417               cmdline.num_dump_sects * sizeof (* filedata->dump_sects));
19418     }
19419
19420   if (! process_file_header (filedata))
19421     return FALSE;
19422
19423   if (! process_section_headers (filedata))
19424     {
19425       /* Without loaded section headers we cannot process lots of things.  */
19426       do_unwind = do_version = do_dump = do_arch = FALSE;
19427
19428       if (! do_using_dynamic)
19429         do_syms = do_dyn_syms = do_reloc = FALSE;
19430     }
19431
19432   if (! process_section_groups (filedata))
19433     /* Without loaded section groups we cannot process unwind.  */
19434     do_unwind = FALSE;
19435
19436   if (process_program_headers (filedata))
19437     process_dynamic_section (filedata);
19438   else
19439     res = FALSE;
19440
19441   if (! process_relocs (filedata))
19442     res = FALSE;
19443
19444   if (! process_unwind (filedata))
19445     res = FALSE;
19446
19447   if (! process_symbol_table (filedata))
19448     res = FALSE;
19449
19450   if (! process_syminfo (filedata))
19451     res = FALSE;
19452
19453   if (! process_version_sections (filedata))
19454     res = FALSE;
19455
19456   if (filedata->file_header.e_shstrndx != SHN_UNDEF)
19457     have_separate_files = load_separate_debug_files (filedata, filedata->file_name);
19458   else
19459     have_separate_files = FALSE;
19460
19461   if (! process_section_contents (filedata))
19462     res = FALSE;
19463
19464   if (have_separate_files)
19465     {
19466       separate_info * d;
19467
19468       for (d = first_separate_info; d != NULL; d = d->next)
19469         {
19470           if (! process_section_headers (d->handle))
19471             res = FALSE;
19472           else if (! process_section_contents (d->handle))
19473             res = FALSE;
19474         }
19475
19476       /* The file handles are closed by the call to free_debug_memory() below.  */
19477     }
19478
19479   if (! process_notes (filedata))
19480     res = FALSE;
19481
19482   if (! process_gnu_liblist (filedata))
19483     res = FALSE;
19484
19485   if (! process_arch_specific (filedata))
19486     res = FALSE;
19487
19488   free (filedata->program_headers);
19489   filedata->program_headers = NULL;
19490
19491   free (filedata->section_headers);
19492   filedata->section_headers = NULL;
19493
19494   free (filedata->string_table);
19495   filedata->string_table = NULL;
19496   filedata->string_table_length = 0;
19497
19498   if (dynamic_strings)
19499     {
19500       free (dynamic_strings);
19501       dynamic_strings = NULL;
19502       dynamic_strings_length = 0;
19503     }
19504
19505   if (dynamic_symbols)
19506     {
19507       free (dynamic_symbols);
19508       dynamic_symbols = NULL;
19509       num_dynamic_syms = 0;
19510     }
19511
19512   if (dynamic_syminfo)
19513     {
19514       free (dynamic_syminfo);
19515       dynamic_syminfo = NULL;
19516     }
19517
19518   if (dynamic_section)
19519     {
19520       free (dynamic_section);
19521       dynamic_section = NULL;
19522     }
19523
19524   if (section_headers_groups)
19525     {
19526       free (section_headers_groups);
19527       section_headers_groups = NULL;
19528     }
19529
19530   if (section_groups)
19531     {
19532       struct group_list * g;
19533       struct group_list * next;
19534
19535       for (i = 0; i < group_count; i++)
19536         {
19537           for (g = section_groups [i].root; g != NULL; g = next)
19538             {
19539               next = g->next;
19540               free (g);
19541             }
19542         }
19543
19544       free (section_groups);
19545       section_groups = NULL;
19546     }
19547
19548   free_debug_memory ();
19549
19550   return res;
19551 }
19552
19553 /* Process an ELF archive.
19554    On entry the file is positioned just after the ARMAG string.
19555    Returns TRUE upon success, FALSE otherwise.  */
19556
19557 static bfd_boolean
19558 process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
19559 {
19560   struct archive_info arch;
19561   struct archive_info nested_arch;
19562   size_t got;
19563   bfd_boolean ret = TRUE;
19564
19565   show_name = TRUE;
19566
19567   /* The ARCH structure is used to hold information about this archive.  */
19568   arch.file_name = NULL;
19569   arch.file = NULL;
19570   arch.index_array = NULL;
19571   arch.sym_table = NULL;
19572   arch.longnames = NULL;
19573
19574   /* The NESTED_ARCH structure is used as a single-item cache of information
19575      about a nested archive (when members of a thin archive reside within
19576      another regular archive file).  */
19577   nested_arch.file_name = NULL;
19578   nested_arch.file = NULL;
19579   nested_arch.index_array = NULL;
19580   nested_arch.sym_table = NULL;
19581   nested_arch.longnames = NULL;
19582
19583   if (setup_archive (&arch, filedata->file_name, filedata->handle,
19584                      is_thin_archive, do_archive_index) != 0)
19585     {
19586       ret = FALSE;
19587       goto out;
19588     }
19589
19590   if (do_archive_index)
19591     {
19592       if (arch.sym_table == NULL)
19593         error (_("%s: unable to dump the index as none was found\n"), filedata->file_name);
19594       else
19595         {
19596           unsigned long i, l;
19597           unsigned long current_pos;
19598
19599           printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
19600                   filedata->file_name, (unsigned long) arch.index_num, arch.sym_size);
19601
19602           current_pos = ftell (filedata->handle);
19603
19604           for (i = l = 0; i < arch.index_num; i++)
19605             {
19606               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
19607                 {
19608                   char * member_name;
19609
19610                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
19611
19612                   if (member_name != NULL)
19613                     {
19614                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
19615
19616                       if (qualified_name != NULL)
19617                         {
19618                           printf (_("Contents of binary %s at offset "), qualified_name);
19619                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
19620                           putchar ('\n');
19621                           free (qualified_name);
19622                         }
19623                     }
19624                 }
19625
19626               if (l >= arch.sym_size)
19627                 {
19628                   error (_("%s: end of the symbol table reached before the end of the index\n"),
19629                          filedata->file_name);
19630                   ret = FALSE;
19631                   break;
19632                 }
19633               /* PR 17531: file: 0b6630b2.  */
19634               printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
19635               l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
19636             }
19637
19638           if (arch.uses_64bit_indices)
19639             l = (l + 7) & ~ 7;
19640           else
19641             l += l & 1;
19642
19643           if (l < arch.sym_size)
19644             {
19645               error (ngettext ("%s: %ld byte remains in the symbol table, "
19646                                "but without corresponding entries in "
19647                                "the index table\n",
19648                                "%s: %ld bytes remain in the symbol table, "
19649                                "but without corresponding entries in "
19650                                "the index table\n",
19651                                arch.sym_size - l),
19652                      filedata->file_name, arch.sym_size - l);
19653               ret = FALSE;
19654             }
19655
19656           if (fseek (filedata->handle, current_pos, SEEK_SET) != 0)
19657             {
19658               error (_("%s: failed to seek back to start of object files in the archive\n"),
19659                      filedata->file_name);
19660               ret = FALSE;
19661               goto out;
19662             }
19663         }
19664
19665       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
19666           && !do_segments && !do_header && !do_dump && !do_version
19667           && !do_histogram && !do_debugging && !do_arch && !do_notes
19668           && !do_section_groups && !do_dyn_syms)
19669         {
19670           ret = TRUE; /* Archive index only.  */
19671           goto out;
19672         }
19673     }
19674
19675   while (1)
19676     {
19677       char * name;
19678       size_t namelen;
19679       char * qualified_name;
19680
19681       /* Read the next archive header.  */
19682       if (fseek (filedata->handle, arch.next_arhdr_offset, SEEK_SET) != 0)
19683         {
19684           error (_("%s: failed to seek to next archive header\n"), arch.file_name);
19685           return FALSE;
19686         }
19687       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, filedata->handle);
19688       if (got != sizeof arch.arhdr)
19689         {
19690           if (got == 0)
19691             break;
19692           /* PR 24049 - we cannot use filedata->file_name as this will
19693              have already been freed.  */
19694           error (_("%s: failed to read archive header\n"), arch.file_name);
19695             
19696           ret = FALSE;
19697           break;
19698         }
19699       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
19700         {
19701           error (_("%s: did not find a valid archive header\n"), arch.file_name);
19702           ret = FALSE;
19703           break;
19704         }
19705
19706       arch.next_arhdr_offset += sizeof arch.arhdr;
19707
19708       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
19709       if (archive_file_size & 01)
19710         ++archive_file_size;
19711
19712       name = get_archive_member_name (&arch, &nested_arch);
19713       if (name == NULL)
19714         {
19715           error (_("%s: bad archive file name\n"), arch.file_name);
19716           ret = FALSE;
19717           break;
19718         }
19719       namelen = strlen (name);
19720
19721       qualified_name = make_qualified_name (&arch, &nested_arch, name);
19722       if (qualified_name == NULL)
19723         {
19724           error (_("%s: bad archive file name\n"), arch.file_name);
19725           ret = FALSE;
19726           break;
19727         }
19728
19729       if (is_thin_archive && arch.nested_member_origin == 0)
19730         {
19731           /* This is a proxy for an external member of a thin archive.  */
19732           Filedata * member_filedata;
19733           char * member_file_name = adjust_relative_path
19734             (filedata->file_name, name, namelen);
19735
19736           if (member_file_name == NULL)
19737             {
19738               ret = FALSE;
19739               break;
19740             }
19741
19742           member_filedata = open_file (member_file_name);
19743           if (member_filedata == NULL)
19744             {
19745               error (_("Input file '%s' is not readable.\n"), member_file_name);
19746               free (member_file_name);
19747               ret = FALSE;
19748               break;
19749             }
19750
19751           archive_file_offset = arch.nested_member_origin;
19752           member_filedata->file_name = qualified_name;
19753
19754           if (! process_object (member_filedata))
19755             ret = FALSE;
19756
19757           close_file (member_filedata);
19758           free (member_file_name);
19759         }
19760       else if (is_thin_archive)
19761         {
19762           Filedata thin_filedata;
19763
19764           memset (&thin_filedata, 0, sizeof (thin_filedata));
19765
19766           /* PR 15140: Allow for corrupt thin archives.  */
19767           if (nested_arch.file == NULL)
19768             {
19769               error (_("%s: contains corrupt thin archive: %s\n"),
19770                      qualified_name, name);
19771               ret = FALSE;
19772               break;
19773             }
19774
19775           /* This is a proxy for a member of a nested archive.  */
19776           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
19777
19778           /* The nested archive file will have been opened and setup by
19779              get_archive_member_name.  */
19780           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
19781             {
19782               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
19783               ret = FALSE;
19784               break;
19785             }
19786
19787           thin_filedata.handle = nested_arch.file;
19788           thin_filedata.file_name = qualified_name;
19789           
19790           if (! process_object (& thin_filedata))
19791             ret = FALSE;
19792         }
19793       else
19794         {
19795           archive_file_offset = arch.next_arhdr_offset;
19796           arch.next_arhdr_offset += archive_file_size;
19797
19798           filedata->file_name = qualified_name;
19799           if (! process_object (filedata))
19800             ret = FALSE;
19801         }
19802
19803       if (filedata->dump_sects != NULL)
19804         {
19805           free (filedata->dump_sects);
19806           filedata->dump_sects = NULL;
19807           filedata->num_dump_sects = 0;
19808         }
19809
19810       free (qualified_name);
19811     }
19812
19813  out:
19814   if (nested_arch.file != NULL)
19815     fclose (nested_arch.file);
19816   release_archive (&nested_arch);
19817   release_archive (&arch);
19818
19819   return ret;
19820 }
19821
19822 static bfd_boolean
19823 process_file (char * file_name)
19824 {
19825   Filedata * filedata = NULL;
19826   struct stat statbuf;
19827   char armag[SARMAG];
19828   bfd_boolean ret = TRUE;
19829
19830   if (stat (file_name, &statbuf) < 0)
19831     {
19832       if (errno == ENOENT)
19833         error (_("'%s': No such file\n"), file_name);
19834       else
19835         error (_("Could not locate '%s'.  System error message: %s\n"),
19836                file_name, strerror (errno));
19837       return FALSE;
19838     }
19839
19840   if (! S_ISREG (statbuf.st_mode))
19841     {
19842       error (_("'%s' is not an ordinary file\n"), file_name);
19843       return FALSE;
19844     }
19845
19846   filedata = calloc (1, sizeof * filedata);
19847   if (filedata == NULL)
19848     {
19849       error (_("Out of memory allocating file data structure\n"));
19850       return FALSE;
19851     }
19852
19853   filedata->file_name = file_name;
19854   filedata->handle = fopen (file_name, "rb");
19855   if (filedata->handle == NULL)
19856     {
19857       error (_("Input file '%s' is not readable.\n"), file_name);
19858       free (filedata);
19859       return FALSE;
19860     }
19861
19862   if (fread (armag, SARMAG, 1, filedata->handle) != 1)
19863     {
19864       error (_("%s: Failed to read file's magic number\n"), file_name);
19865       fclose (filedata->handle);
19866       free (filedata);
19867       return FALSE;
19868     }
19869
19870   filedata->file_size = (bfd_size_type) statbuf.st_size;
19871
19872   if (memcmp (armag, ARMAG, SARMAG) == 0)
19873     {
19874       if (! process_archive (filedata, FALSE))
19875         ret = FALSE;
19876     }
19877   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
19878     {
19879       if ( ! process_archive (filedata, TRUE))
19880         ret = FALSE;
19881     }
19882   else
19883     {
19884       if (do_archive_index)
19885         error (_("File %s is not an archive so its index cannot be displayed.\n"),
19886                file_name);
19887
19888       rewind (filedata->handle);
19889       archive_file_size = archive_file_offset = 0;
19890
19891       if (! process_object (filedata))
19892         ret = FALSE;
19893     }
19894
19895   fclose (filedata->handle);
19896   free (filedata);
19897
19898   return ret;
19899 }
19900
19901 #ifdef SUPPORT_DISASSEMBLY
19902 /* Needed by the i386 disassembler.  For extra credit, someone could
19903    fix this so that we insert symbolic addresses here, esp for GOT/PLT
19904    symbols.  */
19905
19906 void
19907 print_address (unsigned int addr, FILE * outfile)
19908 {
19909   fprintf (outfile,"0x%8.8x", addr);
19910 }
19911
19912 /* Needed by the i386 disassembler.  */
19913
19914 void
19915 db_task_printsym (unsigned int addr)
19916 {
19917   print_address (addr, stderr);
19918 }
19919 #endif
19920
19921 int
19922 main (int argc, char ** argv)
19923 {
19924   int err;
19925
19926 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
19927   setlocale (LC_MESSAGES, "");
19928 #endif
19929 #if defined (HAVE_SETLOCALE)
19930   setlocale (LC_CTYPE, "");
19931 #endif
19932   bindtextdomain (PACKAGE, LOCALEDIR);
19933   textdomain (PACKAGE);
19934
19935   expandargv (&argc, &argv);
19936
19937   cmdline.file_name = "<cmdline>";
19938   parse_args (& cmdline, argc, argv);
19939
19940   if (optind < (argc - 1))
19941     show_name = TRUE;
19942   else if (optind >= argc)
19943     {
19944       warn (_("Nothing to do.\n"));
19945       usage (stderr);
19946     }
19947
19948   err = FALSE;
19949   while (optind < argc)
19950     if (! process_file (argv[optind++]))
19951       err = TRUE;
19952
19953   if (cmdline.dump_sects != NULL)
19954     free (cmdline.dump_sects);
19955
19956   return err ? EXIT_FAILURE : EXIT_SUCCESS;
19957 }