binutils: add support for eBPF
[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/bpf.h"
106 #include "elf/epiphany.h"
107 #include "elf/fr30.h"
108 #include "elf/frv.h"
109 #include "elf/ft32.h"
110 #include "elf/h8.h"
111 #include "elf/hppa.h"
112 #include "elf/i386.h"
113 #include "elf/i370.h"
114 #include "elf/i860.h"
115 #include "elf/i960.h"
116 #include "elf/ia64.h"
117 #include "elf/ip2k.h"
118 #include "elf/lm32.h"
119 #include "elf/iq2000.h"
120 #include "elf/m32c.h"
121 #include "elf/m32r.h"
122 #include "elf/m68k.h"
123 #include "elf/m68hc11.h"
124 #include "elf/s12z.h"
125 #include "elf/mcore.h"
126 #include "elf/mep.h"
127 #include "elf/metag.h"
128 #include "elf/microblaze.h"
129 #include "elf/mips.h"
130 #include "elf/mmix.h"
131 #include "elf/mn10200.h"
132 #include "elf/mn10300.h"
133 #include "elf/moxie.h"
134 #include "elf/mt.h"
135 #include "elf/msp430.h"
136 #include "elf/nds32.h"
137 #include "elf/nfp.h"
138 #include "elf/nios2.h"
139 #include "elf/or1k.h"
140 #include "elf/pj.h"
141 #include "elf/ppc.h"
142 #include "elf/ppc64.h"
143 #include "elf/pru.h"
144 #include "elf/riscv.h"
145 #include "elf/rl78.h"
146 #include "elf/rx.h"
147 #include "elf/s390.h"
148 #include "elf/score.h"
149 #include "elf/sh.h"
150 #include "elf/sparc.h"
151 #include "elf/spu.h"
152 #include "elf/tic6x.h"
153 #include "elf/tilegx.h"
154 #include "elf/tilepro.h"
155 #include "elf/v850.h"
156 #include "elf/vax.h"
157 #include "elf/visium.h"
158 #include "elf/wasm32.h"
159 #include "elf/x86-64.h"
160 #include "elf/xc16x.h"
161 #include "elf/xgate.h"
162 #include "elf/xstormy16.h"
163 #include "elf/xtensa.h"
164
165 #include "getopt.h"
166 #include "libiberty.h"
167 #include "safe-ctype.h"
168 #include "filenames.h"
169
170 #ifndef offsetof
171 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
172 #endif
173
174 typedef struct elf_section_list
175 {
176   Elf_Internal_Shdr *        hdr;
177   struct elf_section_list *  next;
178 } elf_section_list;
179
180 /* Flag bits indicating particular types of dump.  */
181 #define HEX_DUMP        (1 << 0)        /* The -x command line switch.  */
182 #define DISASS_DUMP     (1 << 1)        /* The -i command line switch.  */
183 #define DEBUG_DUMP      (1 << 2)        /* The -w command line switch.  */
184 #define STRING_DUMP     (1 << 3)        /* The -p command line switch.  */
185 #define RELOC_DUMP      (1 << 4)        /* The -R command line switch.  */
186
187 typedef unsigned char dump_type;
188
189 /* A linked list of the section names for which dumps were requested.  */
190 struct dump_list_entry
191 {
192   char *                    name;
193   dump_type                 type;
194   struct dump_list_entry *  next;
195 };
196
197 typedef struct filedata
198 {
199   const char *         file_name;
200   FILE *               handle;
201   bfd_size_type        file_size;
202   Elf_Internal_Ehdr    file_header;
203   Elf_Internal_Shdr *  section_headers;
204   Elf_Internal_Phdr *  program_headers;
205   char *               string_table;
206   unsigned long        string_table_length;
207   /* A dynamic array of flags indicating for which sections a dump of
208      some kind has been requested.  It is reset on a per-object file
209      basis and then initialised from the cmdline_dump_sects array,
210      the results of interpreting the -w switch, and the
211      dump_sects_byname list.  */
212   dump_type *          dump_sects;
213   unsigned int         num_dump_sects;
214 } Filedata;
215
216 char * program_name = "readelf";
217
218 static unsigned long archive_file_offset;
219 static unsigned long archive_file_size;
220 static unsigned long dynamic_addr;
221 static bfd_size_type dynamic_size;
222 static size_t dynamic_nent;
223 static char * dynamic_strings;
224 static unsigned long dynamic_strings_length;
225 static unsigned long num_dynamic_syms;
226 static Elf_Internal_Sym * dynamic_symbols;
227 static Elf_Internal_Syminfo * dynamic_syminfo;
228 static unsigned long dynamic_syminfo_offset;
229 static unsigned int dynamic_syminfo_nent;
230 static char program_interpreter[PATH_MAX];
231 static bfd_vma dynamic_info[DT_ENCODING];
232 static bfd_vma dynamic_info_DT_GNU_HASH;
233 static bfd_vma version_info[16];
234 static Elf_Internal_Dyn *  dynamic_section;
235 static elf_section_list * symtab_shndx_list;
236 static bfd_boolean show_name = FALSE;
237 static bfd_boolean do_dynamic = FALSE;
238 static bfd_boolean do_syms = FALSE;
239 static bfd_boolean do_dyn_syms = FALSE;
240 static bfd_boolean do_reloc = FALSE;
241 static bfd_boolean do_sections = FALSE;
242 static bfd_boolean do_section_groups = FALSE;
243 static bfd_boolean do_section_details = FALSE;
244 static bfd_boolean do_segments = FALSE;
245 static bfd_boolean do_unwind = FALSE;
246 static bfd_boolean do_using_dynamic = FALSE;
247 static bfd_boolean do_header = FALSE;
248 static bfd_boolean do_dump = FALSE;
249 static bfd_boolean do_version = FALSE;
250 static bfd_boolean do_histogram = FALSE;
251 static bfd_boolean do_debugging = FALSE;
252 static bfd_boolean do_arch = FALSE;
253 static bfd_boolean do_notes = FALSE;
254 static bfd_boolean do_archive_index = FALSE;
255 static bfd_boolean is_32bit_elf = FALSE;
256 static bfd_boolean decompress_dumps = FALSE;
257
258 struct group_list
259 {
260   struct group_list *  next;
261   unsigned int         section_index;
262 };
263
264 struct group
265 {
266   struct group_list *  root;
267   unsigned int         group_index;
268 };
269
270 static size_t           group_count;
271 static struct group *   section_groups;
272 static struct group **  section_headers_groups;
273
274 /* A dynamic array of flags indicating for which sections a dump
275    has been requested via command line switches.  */
276 static Filedata         cmdline;
277
278 static struct dump_list_entry * dump_sects_byname;
279
280 /* How to print a vma value.  */
281 typedef enum print_mode
282 {
283   HEX,
284   DEC,
285   DEC_5,
286   UNSIGNED,
287   PREFIX_HEX,
288   FULL_HEX,
289   LONG_HEX
290 }
291 print_mode;
292
293 /* Versioned symbol info.  */
294 enum versioned_symbol_info
295 {
296   symbol_undefined,
297   symbol_hidden,
298   symbol_public
299 };
300
301 static const char * get_symbol_version_string
302   (Filedata *, bfd_boolean, const char *, unsigned long, unsigned,
303    Elf_Internal_Sym *, enum versioned_symbol_info *, unsigned short *);
304
305 #define UNKNOWN -1
306
307 #define SECTION_NAME(X)                                         \
308   ((X) == NULL ? _("<none>")                                    \
309    : filedata->string_table == NULL ? _("<no-strings>")         \
310    : ((X)->sh_name >= filedata->string_table_length ? _("<corrupt>")    \
311   : filedata->string_table + (X)->sh_name))
312
313 #define DT_VERSIONTAGIDX(tag)   (DT_VERNEEDNUM - (tag)) /* Reverse order!  */
314
315 #define GET_ELF_SYMBOLS(file, section, sym_count)                       \
316   (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count)      \
317    : get_64bit_elf_symbols (file, section, sym_count))
318
319 #define VALID_DYNAMIC_NAME(offset)      ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
320 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
321    already been called and verified that the string exists.  */
322 #define GET_DYNAMIC_NAME(offset)        (dynamic_strings + offset)
323
324 #define REMOVE_ARCH_BITS(ADDR)                  \
325   do                                            \
326     {                                           \
327       if (filedata->file_header.e_machine == EM_ARM)    \
328         (ADDR) &= ~1;                           \
329     }                                           \
330   while (0)
331 \f
332 /* Print a BFD_VMA to an internal buffer, for use in error messages.
333    BFD_FMA_FMT can't be used in translated strings.  */
334
335 static const char *
336 bfd_vmatoa (char *fmtch, bfd_vma value)
337 {
338   /* bfd_vmatoa is used more then once in a printf call for output.
339      Cycle through an array of buffers.  */
340   static int buf_pos = 0;
341   static struct bfd_vmatoa_buf
342   {
343     char place[64];
344   } buf[4];
345   char *ret;
346   char fmt[32];
347
348   ret = buf[buf_pos++].place;
349   buf_pos %= ARRAY_SIZE (buf);
350
351   sprintf (fmt, "%%%s%s", BFD_VMA_FMT, fmtch);
352   snprintf (ret, sizeof (buf[0].place), fmt, value);
353   return ret;
354 }
355
356 /* Retrieve NMEMB structures, each SIZE bytes long from FILEDATA starting at
357    OFFSET + the offset of the current archive member, if we are examining an
358    archive.  Put the retrieved data into VAR, if it is not NULL.  Otherwise
359    allocate a buffer using malloc and fill that.  In either case return the
360    pointer to the start of the retrieved data or NULL if something went wrong.
361    If something does go wrong and REASON is not NULL then emit an error
362    message using REASON as part of the context.  */
363
364 static void *
365 get_data (void *         var,
366           Filedata *     filedata,
367           unsigned long  offset,
368           bfd_size_type  size,
369           bfd_size_type  nmemb,
370           const char *   reason)
371 {
372   void * mvar;
373   bfd_size_type amt = size * nmemb;
374
375   if (size == 0 || nmemb == 0)
376     return NULL;
377
378   /* If the size_t type is smaller than the bfd_size_type, eg because
379      you are building a 32-bit tool on a 64-bit host, then make sure
380      that when the sizes are cast to (size_t) no information is lost.  */
381   if (sizeof (size_t) < sizeof (bfd_size_type)
382       && (   (bfd_size_type) ((size_t) size) != size
383           || (bfd_size_type) ((size_t) nmemb) != nmemb))
384     {
385       if (reason)
386         error (_("Size truncation prevents reading %s"
387                  " elements of size %s for %s\n"),
388                bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
389       return NULL;
390     }
391
392   /* Check for size overflow.  */
393   if (amt < nmemb)
394     {
395       if (reason)
396         error (_("Size overflow prevents reading %s"
397                  " elements of size %s for %s\n"),
398                bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
399       return NULL;
400     }
401
402   /* Be kind to memory checkers (eg valgrind, address sanitizer) by not
403      attempting to allocate memory when the read is bound to fail.  */
404   if (archive_file_offset > filedata->file_size
405       || offset > filedata->file_size - archive_file_offset
406       || amt > filedata->file_size - archive_file_offset - offset)
407     {
408       if (reason)
409         error (_("Reading %s bytes extends past end of file for %s\n"),
410                bfd_vmatoa ("u", amt), reason);
411       return NULL;
412     }
413
414   if (fseek (filedata->handle, archive_file_offset + offset, SEEK_SET))
415     {
416       if (reason)
417         error (_("Unable to seek to 0x%lx for %s\n"),
418                archive_file_offset + offset, reason);
419       return NULL;
420     }
421
422   mvar = var;
423   if (mvar == NULL)
424     {
425       /* Check for overflow.  */
426       if (nmemb < (~(bfd_size_type) 0 - 1) / size)
427         /* + 1 so that we can '\0' terminate invalid string table sections.  */
428         mvar = malloc ((size_t) amt + 1);
429
430       if (mvar == NULL)
431         {
432           if (reason)
433             error (_("Out of memory allocating %s bytes for %s\n"),
434                    bfd_vmatoa ("u", amt), reason);
435           return NULL;
436         }
437
438       ((char *) mvar)[amt] = '\0';
439     }
440
441   if (fread (mvar, (size_t) size, (size_t) nmemb, filedata->handle) != nmemb)
442     {
443       if (reason)
444         error (_("Unable to read in %s bytes of %s\n"),
445                bfd_vmatoa ("u", amt), reason);
446       if (mvar != var)
447         free (mvar);
448       return NULL;
449     }
450
451   return mvar;
452 }
453
454 /* Print a VMA value in the MODE specified.
455    Returns the number of characters displayed.  */
456
457 static unsigned int
458 print_vma (bfd_vma vma, print_mode mode)
459 {
460   unsigned int nc = 0;
461
462   switch (mode)
463     {
464     case FULL_HEX:
465       nc = printf ("0x");
466       /* Fall through.  */
467     case LONG_HEX:
468 #ifdef BFD64
469       if (is_32bit_elf)
470         return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
471 #endif
472       printf_vma (vma);
473       return nc + 16;
474
475     case DEC_5:
476       if (vma <= 99999)
477         return printf ("%5" BFD_VMA_FMT "d", vma);
478       /* Fall through.  */
479     case PREFIX_HEX:
480       nc = printf ("0x");
481       /* Fall through.  */
482     case HEX:
483       return nc + printf ("%" BFD_VMA_FMT "x", vma);
484
485     case DEC:
486       return printf ("%" BFD_VMA_FMT "d", vma);
487
488     case UNSIGNED:
489       return printf ("%" BFD_VMA_FMT "u", vma);
490
491     default:
492       /* FIXME: Report unrecognised mode ?  */
493       return 0;
494     }
495 }
496
497 /* Display a symbol on stdout.  Handles the display of control characters and
498    multibye characters (assuming the host environment supports them).
499
500    Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
501
502    If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
503    padding as necessary.
504
505    Returns the number of emitted characters.  */
506
507 static unsigned int
508 print_symbol (signed int width, const char *symbol)
509 {
510   bfd_boolean extra_padding = FALSE;
511   signed int num_printed = 0;
512 #ifdef HAVE_MBSTATE_T
513   mbstate_t state;
514 #endif
515   unsigned int width_remaining;
516
517   if (width < 0)
518     {
519       /* Keep the width positive.  This helps the code below.  */
520       width = - width;
521       extra_padding = TRUE;
522     }
523   else if (width == 0)
524     return 0;
525
526   if (do_wide)
527     /* Set the remaining width to a very large value.
528        This simplifies the code below.  */
529     width_remaining = INT_MAX;
530   else
531     width_remaining = width;
532
533 #ifdef HAVE_MBSTATE_T
534   /* Initialise the multibyte conversion state.  */
535   memset (& state, 0, sizeof (state));
536 #endif
537
538   while (width_remaining)
539     {
540       size_t  n;
541       const char c = *symbol++;
542
543       if (c == 0)
544         break;
545
546       /* Do not print control characters directly as they can affect terminal
547          settings.  Such characters usually appear in the names generated
548          by the assembler for local labels.  */
549       if (ISCNTRL (c))
550         {
551           if (width_remaining < 2)
552             break;
553
554           printf ("^%c", c + 0x40);
555           width_remaining -= 2;
556           num_printed += 2;
557         }
558       else if (ISPRINT (c))
559         {
560           putchar (c);
561           width_remaining --;
562           num_printed ++;
563         }
564       else
565         {
566 #ifdef HAVE_MBSTATE_T
567           wchar_t w;
568 #endif
569           /* Let printf do the hard work of displaying multibyte characters.  */
570           printf ("%.1s", symbol - 1);
571           width_remaining --;
572           num_printed ++;
573
574 #ifdef HAVE_MBSTATE_T
575           /* Try to find out how many bytes made up the character that was
576              just printed.  Advance the symbol pointer past the bytes that
577              were displayed.  */
578           n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
579 #else
580           n = 1;
581 #endif
582           if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
583             symbol += (n - 1);
584         }
585     }
586
587   if (extra_padding && num_printed < width)
588     {
589       /* Fill in the remaining spaces.  */
590       printf ("%-*s", width - num_printed, " ");
591       num_printed = width;
592     }
593
594   return num_printed;
595 }
596
597 /* Returns a pointer to a static buffer containing a printable version of
598    the given section's name.  Like print_symbol, except that it does not try
599    to print multibyte characters, it just interprets them as hex values.  */
600
601 static const char *
602 printable_section_name (Filedata * filedata, const Elf_Internal_Shdr * sec)
603 {
604 #define MAX_PRINT_SEC_NAME_LEN 128
605   static char  sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
606   const char * name = SECTION_NAME (sec);
607   char *       buf = sec_name_buf;
608   char         c;
609   unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
610
611   while ((c = * name ++) != 0)
612     {
613       if (ISCNTRL (c))
614         {
615           if (remaining < 2)
616             break;
617
618           * buf ++ = '^';
619           * buf ++ = c + 0x40;
620           remaining -= 2;
621         }
622       else if (ISPRINT (c))
623         {
624           * buf ++ = c;
625           remaining -= 1;
626         }
627       else
628         {
629           static char hex[17] = "0123456789ABCDEF";
630
631           if (remaining < 4)
632             break;
633           * buf ++ = '<';
634           * buf ++ = hex[(c & 0xf0) >> 4];
635           * buf ++ = hex[c & 0x0f];
636           * buf ++ = '>';
637           remaining -= 4;
638         }
639
640       if (remaining == 0)
641         break;
642     }
643
644   * buf = 0;
645   return sec_name_buf;
646 }
647
648 static const char *
649 printable_section_name_from_index (Filedata * filedata, unsigned long ndx)
650 {
651   if (ndx >= filedata->file_header.e_shnum)
652     return _("<corrupt>");
653
654   return printable_section_name (filedata, filedata->section_headers + ndx);
655 }
656
657 /* Return a pointer to section NAME, or NULL if no such section exists.  */
658
659 static Elf_Internal_Shdr *
660 find_section (Filedata * filedata, const char * name)
661 {
662   unsigned int i;
663
664   if (filedata->section_headers == NULL)
665     return NULL;
666
667   for (i = 0; i < filedata->file_header.e_shnum; i++)
668     if (streq (SECTION_NAME (filedata->section_headers + i), name))
669       return filedata->section_headers + i;
670
671   return NULL;
672 }
673
674 /* Return a pointer to a section containing ADDR, or NULL if no such
675    section exists.  */
676
677 static Elf_Internal_Shdr *
678 find_section_by_address (Filedata * filedata, bfd_vma addr)
679 {
680   unsigned int i;
681
682   if (filedata->section_headers == NULL)
683     return NULL;
684
685   for (i = 0; i < filedata->file_header.e_shnum; i++)
686     {
687       Elf_Internal_Shdr *sec = filedata->section_headers + i;
688
689       if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
690         return sec;
691     }
692
693   return NULL;
694 }
695
696 static Elf_Internal_Shdr *
697 find_section_by_type (Filedata * filedata, unsigned int type)
698 {
699   unsigned int i;
700
701   if (filedata->section_headers == NULL)
702     return NULL;
703
704   for (i = 0; i < filedata->file_header.e_shnum; i++)
705     {
706       Elf_Internal_Shdr *sec = filedata->section_headers + i;
707
708       if (sec->sh_type == type)
709         return sec;
710     }
711
712   return NULL;
713 }
714
715 /* Return a pointer to section NAME, or NULL if no such section exists,
716    restricted to the list of sections given in SET.  */
717
718 static Elf_Internal_Shdr *
719 find_section_in_set (Filedata * filedata, const char * name, unsigned int * set)
720 {
721   unsigned int i;
722
723   if (filedata->section_headers == NULL)
724     return NULL;
725
726   if (set != NULL)
727     {
728       while ((i = *set++) > 0)
729         {
730           /* See PR 21156 for a reproducer.  */
731           if (i >= filedata->file_header.e_shnum)
732             continue; /* FIXME: Should we issue an error message ?  */
733
734           if (streq (SECTION_NAME (filedata->section_headers + i), name))
735             return filedata->section_headers + i;
736         }
737     }
738
739   return find_section (filedata, name);
740 }
741
742 /* Read an unsigned LEB128 encoded value from DATA.
743    Set *LENGTH_RETURN to the number of bytes read.  */
744
745 static inline unsigned long
746 read_uleb128 (unsigned char * data,
747               unsigned int * length_return,
748               const unsigned char * const end)
749 {
750   return read_leb128 (data, length_return, FALSE, end);
751 }
752
753 /* Return TRUE if the current file is for IA-64 machine and OpenVMS ABI.
754    This OS has so many departures from the ELF standard that we test it at
755    many places.  */
756
757 static inline bfd_boolean
758 is_ia64_vms (Filedata * filedata)
759 {
760   return filedata->file_header.e_machine == EM_IA_64
761     && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
762 }
763
764 /* Guess the relocation size commonly used by the specific machines.  */
765
766 static bfd_boolean
767 guess_is_rela (unsigned int e_machine)
768 {
769   switch (e_machine)
770     {
771       /* Targets that use REL relocations.  */
772     case EM_386:
773     case EM_IAMCU:
774     case EM_960:
775     case EM_ARM:
776     case EM_D10V:
777     case EM_CYGNUS_D10V:
778     case EM_DLX:
779     case EM_MIPS:
780     case EM_MIPS_RS3_LE:
781     case EM_CYGNUS_M32R:
782     case EM_SCORE:
783     case EM_XGATE:
784     case EM_NFP:
785     case EM_BPF:
786       return FALSE;
787
788       /* Targets that use RELA relocations.  */
789     case EM_68K:
790     case EM_860:
791     case EM_AARCH64:
792     case EM_ADAPTEVA_EPIPHANY:
793     case EM_ALPHA:
794     case EM_ALTERA_NIOS2:
795     case EM_ARC:
796     case EM_ARC_COMPACT:
797     case EM_ARC_COMPACT2:
798     case EM_AVR:
799     case EM_AVR_OLD:
800     case EM_BLACKFIN:
801     case EM_CR16:
802     case EM_CRIS:
803     case EM_CRX:
804     case EM_CSKY:
805     case EM_D30V:
806     case EM_CYGNUS_D30V:
807     case EM_FR30:
808     case EM_FT32:
809     case EM_CYGNUS_FR30:
810     case EM_CYGNUS_FRV:
811     case EM_H8S:
812     case EM_H8_300:
813     case EM_H8_300H:
814     case EM_IA_64:
815     case EM_IP2K:
816     case EM_IP2K_OLD:
817     case EM_IQ2000:
818     case EM_LATTICEMICO32:
819     case EM_M32C_OLD:
820     case EM_M32C:
821     case EM_M32R:
822     case EM_MCORE:
823     case EM_CYGNUS_MEP:
824     case EM_METAG:
825     case EM_MMIX:
826     case EM_MN10200:
827     case EM_CYGNUS_MN10200:
828     case EM_MN10300:
829     case EM_CYGNUS_MN10300:
830     case EM_MOXIE:
831     case EM_MSP430:
832     case EM_MSP430_OLD:
833     case EM_MT:
834     case EM_NDS32:
835     case EM_NIOS32:
836     case EM_OR1K:
837     case EM_PPC64:
838     case EM_PPC:
839     case EM_TI_PRU:
840     case EM_RISCV:
841     case EM_RL78:
842     case EM_RX:
843     case EM_S390:
844     case EM_S390_OLD:
845     case EM_SH:
846     case EM_SPARC:
847     case EM_SPARC32PLUS:
848     case EM_SPARCV9:
849     case EM_SPU:
850     case EM_TI_C6000:
851     case EM_TILEGX:
852     case EM_TILEPRO:
853     case EM_V800:
854     case EM_V850:
855     case EM_CYGNUS_V850:
856     case EM_VAX:
857     case EM_VISIUM:
858     case EM_X86_64:
859     case EM_L1OM:
860     case EM_K1OM:
861     case EM_XSTORMY16:
862     case EM_XTENSA:
863     case EM_XTENSA_OLD:
864     case EM_MICROBLAZE:
865     case EM_MICROBLAZE_OLD:
866     case EM_WEBASSEMBLY:
867       return TRUE;
868
869     case EM_68HC05:
870     case EM_68HC08:
871     case EM_68HC11:
872     case EM_68HC16:
873     case EM_FX66:
874     case EM_ME16:
875     case EM_MMA:
876     case EM_NCPU:
877     case EM_NDR1:
878     case EM_PCP:
879     case EM_ST100:
880     case EM_ST19:
881     case EM_ST7:
882     case EM_ST9PLUS:
883     case EM_STARCORE:
884     case EM_SVX:
885     case EM_TINYJ:
886     default:
887       warn (_("Don't know about relocations on this machine architecture\n"));
888       return FALSE;
889     }
890 }
891
892 /* Load RELA type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
893    Returns TRUE upon success, FALSE otherwise.  If successful then a
894    pointer to a malloc'ed buffer containing the relocs is placed in *RELASP,
895    and the number of relocs loaded is placed in *NRELASP.  It is the caller's
896    responsibility to free the allocated buffer.  */
897
898 static bfd_boolean
899 slurp_rela_relocs (Filedata *            filedata,
900                    unsigned long         rel_offset,
901                    unsigned long         rel_size,
902                    Elf_Internal_Rela **  relasp,
903                    unsigned long *       nrelasp)
904 {
905   Elf_Internal_Rela * relas;
906   size_t nrelas;
907   unsigned int i;
908
909   if (is_32bit_elf)
910     {
911       Elf32_External_Rela * erelas;
912
913       erelas = (Elf32_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
914                                                  rel_size, _("32-bit relocation data"));
915       if (!erelas)
916         return FALSE;
917
918       nrelas = rel_size / sizeof (Elf32_External_Rela);
919
920       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
921                                              sizeof (Elf_Internal_Rela));
922
923       if (relas == NULL)
924         {
925           free (erelas);
926           error (_("out of memory parsing relocs\n"));
927           return FALSE;
928         }
929
930       for (i = 0; i < nrelas; i++)
931         {
932           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
933           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
934           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
935         }
936
937       free (erelas);
938     }
939   else
940     {
941       Elf64_External_Rela * erelas;
942
943       erelas = (Elf64_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
944                                                  rel_size, _("64-bit relocation data"));
945       if (!erelas)
946         return FALSE;
947
948       nrelas = rel_size / sizeof (Elf64_External_Rela);
949
950       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
951                                              sizeof (Elf_Internal_Rela));
952
953       if (relas == NULL)
954         {
955           free (erelas);
956           error (_("out of memory parsing relocs\n"));
957           return FALSE;
958         }
959
960       for (i = 0; i < nrelas; i++)
961         {
962           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
963           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
964           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
965
966           /* The #ifdef BFD64 below is to prevent a compile time
967              warning.  We know that if we do not have a 64 bit data
968              type that we will never execute this code anyway.  */
969 #ifdef BFD64
970           if (filedata->file_header.e_machine == EM_MIPS
971               && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
972             {
973               /* In little-endian objects, r_info isn't really a
974                  64-bit little-endian value: it has a 32-bit
975                  little-endian symbol index followed by four
976                  individual byte fields.  Reorder INFO
977                  accordingly.  */
978               bfd_vma inf = relas[i].r_info;
979               inf = (((inf & 0xffffffff) << 32)
980                       | ((inf >> 56) & 0xff)
981                       | ((inf >> 40) & 0xff00)
982                       | ((inf >> 24) & 0xff0000)
983                       | ((inf >> 8) & 0xff000000));
984               relas[i].r_info = inf;
985             }
986 #endif /* BFD64 */
987         }
988
989       free (erelas);
990     }
991
992   *relasp = relas;
993   *nrelasp = nrelas;
994   return TRUE;
995 }
996
997 /* Load REL type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
998    Returns TRUE upon success, FALSE otherwise.  If successful then a
999    pointer to a malloc'ed buffer containing the relocs is placed in *RELSP,
1000    and the number of relocs loaded is placed in *NRELSP.  It is the caller's
1001    responsibility to free the allocated buffer.  */
1002
1003 static bfd_boolean
1004 slurp_rel_relocs (Filedata *            filedata,
1005                   unsigned long         rel_offset,
1006                   unsigned long         rel_size,
1007                   Elf_Internal_Rela **  relsp,
1008                   unsigned long *       nrelsp)
1009 {
1010   Elf_Internal_Rela * rels;
1011   size_t nrels;
1012   unsigned int i;
1013
1014   if (is_32bit_elf)
1015     {
1016       Elf32_External_Rel * erels;
1017
1018       erels = (Elf32_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1019                                                rel_size, _("32-bit relocation data"));
1020       if (!erels)
1021         return FALSE;
1022
1023       nrels = rel_size / sizeof (Elf32_External_Rel);
1024
1025       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1026
1027       if (rels == NULL)
1028         {
1029           free (erels);
1030           error (_("out of memory parsing relocs\n"));
1031           return FALSE;
1032         }
1033
1034       for (i = 0; i < nrels; i++)
1035         {
1036           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1037           rels[i].r_info   = BYTE_GET (erels[i].r_info);
1038           rels[i].r_addend = 0;
1039         }
1040
1041       free (erels);
1042     }
1043   else
1044     {
1045       Elf64_External_Rel * erels;
1046
1047       erels = (Elf64_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1048                                                rel_size, _("64-bit relocation data"));
1049       if (!erels)
1050         return FALSE;
1051
1052       nrels = rel_size / sizeof (Elf64_External_Rel);
1053
1054       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1055
1056       if (rels == NULL)
1057         {
1058           free (erels);
1059           error (_("out of memory parsing relocs\n"));
1060           return FALSE;
1061         }
1062
1063       for (i = 0; i < nrels; i++)
1064         {
1065           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1066           rels[i].r_info   = BYTE_GET (erels[i].r_info);
1067           rels[i].r_addend = 0;
1068
1069           /* The #ifdef BFD64 below is to prevent a compile time
1070              warning.  We know that if we do not have a 64 bit data
1071              type that we will never execute this code anyway.  */
1072 #ifdef BFD64
1073           if (filedata->file_header.e_machine == EM_MIPS
1074               && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
1075             {
1076               /* In little-endian objects, r_info isn't really a
1077                  64-bit little-endian value: it has a 32-bit
1078                  little-endian symbol index followed by four
1079                  individual byte fields.  Reorder INFO
1080                  accordingly.  */
1081               bfd_vma inf = rels[i].r_info;
1082               inf = (((inf & 0xffffffff) << 32)
1083                      | ((inf >> 56) & 0xff)
1084                      | ((inf >> 40) & 0xff00)
1085                      | ((inf >> 24) & 0xff0000)
1086                      | ((inf >> 8) & 0xff000000));
1087               rels[i].r_info = inf;
1088             }
1089 #endif /* BFD64 */
1090         }
1091
1092       free (erels);
1093     }
1094
1095   *relsp = rels;
1096   *nrelsp = nrels;
1097   return TRUE;
1098 }
1099
1100 /* Returns the reloc type extracted from the reloc info field.  */
1101
1102 static unsigned int
1103 get_reloc_type (Filedata * filedata, bfd_vma reloc_info)
1104 {
1105   if (is_32bit_elf)
1106     return ELF32_R_TYPE (reloc_info);
1107
1108   switch (filedata->file_header.e_machine)
1109     {
1110     case EM_MIPS:
1111       /* Note: We assume that reloc_info has already been adjusted for us.  */
1112       return ELF64_MIPS_R_TYPE (reloc_info);
1113
1114     case EM_SPARCV9:
1115       return ELF64_R_TYPE_ID (reloc_info);
1116
1117     default:
1118       return ELF64_R_TYPE (reloc_info);
1119     }
1120 }
1121
1122 /* Return the symbol index extracted from the reloc info field.  */
1123
1124 static bfd_vma
1125 get_reloc_symindex (bfd_vma reloc_info)
1126 {
1127   return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1128 }
1129
1130 static inline bfd_boolean
1131 uses_msp430x_relocs (Filedata * filedata)
1132 {
1133   return
1134     filedata->file_header.e_machine == EM_MSP430 /* Paranoia.  */
1135     /* GCC uses osabi == ELFOSBI_STANDALONE.  */
1136     && (((filedata->file_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1137         /* TI compiler uses ELFOSABI_NONE.  */
1138         || (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1139 }
1140
1141 /* Display the contents of the relocation data found at the specified
1142    offset.  */
1143
1144 static bfd_boolean
1145 dump_relocations (Filedata *          filedata,
1146                   unsigned long       rel_offset,
1147                   unsigned long       rel_size,
1148                   Elf_Internal_Sym *  symtab,
1149                   unsigned long       nsyms,
1150                   char *              strtab,
1151                   unsigned long       strtablen,
1152                   int                 is_rela,
1153                   bfd_boolean         is_dynsym)
1154 {
1155   unsigned long i;
1156   Elf_Internal_Rela * rels;
1157   bfd_boolean res = TRUE;
1158
1159   if (is_rela == UNKNOWN)
1160     is_rela = guess_is_rela (filedata->file_header.e_machine);
1161
1162   if (is_rela)
1163     {
1164       if (!slurp_rela_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1165         return FALSE;
1166     }
1167   else
1168     {
1169       if (!slurp_rel_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1170         return FALSE;
1171     }
1172
1173   if (is_32bit_elf)
1174     {
1175       if (is_rela)
1176         {
1177           if (do_wide)
1178             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name + Addend\n"));
1179           else
1180             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name + Addend\n"));
1181         }
1182       else
1183         {
1184           if (do_wide)
1185             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name\n"));
1186           else
1187             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name\n"));
1188         }
1189     }
1190   else
1191     {
1192       if (is_rela)
1193         {
1194           if (do_wide)
1195             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend\n"));
1196           else
1197             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name + Addend\n"));
1198         }
1199       else
1200         {
1201           if (do_wide)
1202             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name\n"));
1203           else
1204             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name\n"));
1205         }
1206     }
1207
1208   for (i = 0; i < rel_size; i++)
1209     {
1210       const char * rtype;
1211       bfd_vma offset;
1212       bfd_vma inf;
1213       bfd_vma symtab_index;
1214       bfd_vma type;
1215
1216       offset = rels[i].r_offset;
1217       inf    = rels[i].r_info;
1218
1219       type = get_reloc_type (filedata, inf);
1220       symtab_index = get_reloc_symindex  (inf);
1221
1222       if (is_32bit_elf)
1223         {
1224           printf ("%8.8lx  %8.8lx ",
1225                   (unsigned long) offset & 0xffffffff,
1226                   (unsigned long) inf & 0xffffffff);
1227         }
1228       else
1229         {
1230 #if BFD_HOST_64BIT_LONG
1231           printf (do_wide
1232                   ? "%16.16lx  %16.16lx "
1233                   : "%12.12lx  %12.12lx ",
1234                   offset, inf);
1235 #elif BFD_HOST_64BIT_LONG_LONG
1236 #ifndef __MSVCRT__
1237           printf (do_wide
1238                   ? "%16.16llx  %16.16llx "
1239                   : "%12.12llx  %12.12llx ",
1240                   offset, inf);
1241 #else
1242           printf (do_wide
1243                   ? "%16.16I64x  %16.16I64x "
1244                   : "%12.12I64x  %12.12I64x ",
1245                   offset, inf);
1246 #endif
1247 #else
1248           printf (do_wide
1249                   ? "%8.8lx%8.8lx  %8.8lx%8.8lx "
1250                   : "%4.4lx%8.8lx  %4.4lx%8.8lx ",
1251                   _bfd_int64_high (offset),
1252                   _bfd_int64_low (offset),
1253                   _bfd_int64_high (inf),
1254                   _bfd_int64_low (inf));
1255 #endif
1256         }
1257
1258       switch (filedata->file_header.e_machine)
1259         {
1260         default:
1261           rtype = NULL;
1262           break;
1263
1264         case EM_AARCH64:
1265           rtype = elf_aarch64_reloc_type (type);
1266           break;
1267
1268         case EM_M32R:
1269         case EM_CYGNUS_M32R:
1270           rtype = elf_m32r_reloc_type (type);
1271           break;
1272
1273         case EM_386:
1274         case EM_IAMCU:
1275           rtype = elf_i386_reloc_type (type);
1276           break;
1277
1278         case EM_68HC11:
1279         case EM_68HC12:
1280           rtype = elf_m68hc11_reloc_type (type);
1281           break;
1282
1283         case EM_S12Z:
1284           rtype = elf_s12z_reloc_type (type);
1285           break;
1286
1287         case EM_68K:
1288           rtype = elf_m68k_reloc_type (type);
1289           break;
1290
1291         case EM_960:
1292           rtype = elf_i960_reloc_type (type);
1293           break;
1294
1295         case EM_AVR:
1296         case EM_AVR_OLD:
1297           rtype = elf_avr_reloc_type (type);
1298           break;
1299
1300         case EM_OLD_SPARCV9:
1301         case EM_SPARC32PLUS:
1302         case EM_SPARCV9:
1303         case EM_SPARC:
1304           rtype = elf_sparc_reloc_type (type);
1305           break;
1306
1307         case EM_SPU:
1308           rtype = elf_spu_reloc_type (type);
1309           break;
1310
1311         case EM_V800:
1312           rtype = v800_reloc_type (type);
1313           break;
1314         case EM_V850:
1315         case EM_CYGNUS_V850:
1316           rtype = v850_reloc_type (type);
1317           break;
1318
1319         case EM_D10V:
1320         case EM_CYGNUS_D10V:
1321           rtype = elf_d10v_reloc_type (type);
1322           break;
1323
1324         case EM_D30V:
1325         case EM_CYGNUS_D30V:
1326           rtype = elf_d30v_reloc_type (type);
1327           break;
1328
1329         case EM_DLX:
1330           rtype = elf_dlx_reloc_type (type);
1331           break;
1332
1333         case EM_SH:
1334           rtype = elf_sh_reloc_type (type);
1335           break;
1336
1337         case EM_MN10300:
1338         case EM_CYGNUS_MN10300:
1339           rtype = elf_mn10300_reloc_type (type);
1340           break;
1341
1342         case EM_MN10200:
1343         case EM_CYGNUS_MN10200:
1344           rtype = elf_mn10200_reloc_type (type);
1345           break;
1346
1347         case EM_FR30:
1348         case EM_CYGNUS_FR30:
1349           rtype = elf_fr30_reloc_type (type);
1350           break;
1351
1352         case EM_CYGNUS_FRV:
1353           rtype = elf_frv_reloc_type (type);
1354           break;
1355
1356         case EM_CSKY:
1357           rtype = elf_csky_reloc_type (type);
1358           break;
1359
1360         case EM_FT32:
1361           rtype = elf_ft32_reloc_type (type);
1362           break;
1363
1364         case EM_MCORE:
1365           rtype = elf_mcore_reloc_type (type);
1366           break;
1367
1368         case EM_MMIX:
1369           rtype = elf_mmix_reloc_type (type);
1370           break;
1371
1372         case EM_MOXIE:
1373           rtype = elf_moxie_reloc_type (type);
1374           break;
1375
1376         case EM_MSP430:
1377           if (uses_msp430x_relocs (filedata))
1378             {
1379               rtype = elf_msp430x_reloc_type (type);
1380               break;
1381             }
1382           /* Fall through.  */
1383         case EM_MSP430_OLD:
1384           rtype = elf_msp430_reloc_type (type);
1385           break;
1386
1387         case EM_NDS32:
1388           rtype = elf_nds32_reloc_type (type);
1389           break;
1390
1391         case EM_PPC:
1392           rtype = elf_ppc_reloc_type (type);
1393           break;
1394
1395         case EM_PPC64:
1396           rtype = elf_ppc64_reloc_type (type);
1397           break;
1398
1399         case EM_MIPS:
1400         case EM_MIPS_RS3_LE:
1401           rtype = elf_mips_reloc_type (type);
1402           break;
1403
1404         case EM_RISCV:
1405           rtype = elf_riscv_reloc_type (type);
1406           break;
1407
1408         case EM_ALPHA:
1409           rtype = elf_alpha_reloc_type (type);
1410           break;
1411
1412         case EM_ARM:
1413           rtype = elf_arm_reloc_type (type);
1414           break;
1415
1416         case EM_ARC:
1417         case EM_ARC_COMPACT:
1418         case EM_ARC_COMPACT2:
1419           rtype = elf_arc_reloc_type (type);
1420           break;
1421
1422         case EM_PARISC:
1423           rtype = elf_hppa_reloc_type (type);
1424           break;
1425
1426         case EM_H8_300:
1427         case EM_H8_300H:
1428         case EM_H8S:
1429           rtype = elf_h8_reloc_type (type);
1430           break;
1431
1432         case EM_OR1K:
1433           rtype = elf_or1k_reloc_type (type);
1434           break;
1435
1436         case EM_PJ:
1437         case EM_PJ_OLD:
1438           rtype = elf_pj_reloc_type (type);
1439           break;
1440         case EM_IA_64:
1441           rtype = elf_ia64_reloc_type (type);
1442           break;
1443
1444         case EM_CRIS:
1445           rtype = elf_cris_reloc_type (type);
1446           break;
1447
1448         case EM_860:
1449           rtype = elf_i860_reloc_type (type);
1450           break;
1451
1452         case EM_X86_64:
1453         case EM_L1OM:
1454         case EM_K1OM:
1455           rtype = elf_x86_64_reloc_type (type);
1456           break;
1457
1458         case EM_S370:
1459           rtype = i370_reloc_type (type);
1460           break;
1461
1462         case EM_S390_OLD:
1463         case EM_S390:
1464           rtype = elf_s390_reloc_type (type);
1465           break;
1466
1467         case EM_SCORE:
1468           rtype = elf_score_reloc_type (type);
1469           break;
1470
1471         case EM_XSTORMY16:
1472           rtype = elf_xstormy16_reloc_type (type);
1473           break;
1474
1475         case EM_CRX:
1476           rtype = elf_crx_reloc_type (type);
1477           break;
1478
1479         case EM_VAX:
1480           rtype = elf_vax_reloc_type (type);
1481           break;
1482
1483         case EM_VISIUM:
1484           rtype = elf_visium_reloc_type (type);
1485           break;
1486
1487         case EM_BPF:
1488           rtype = elf_bpf_reloc_type (type);
1489           break;
1490
1491         case EM_ADAPTEVA_EPIPHANY:
1492           rtype = elf_epiphany_reloc_type (type);
1493           break;
1494
1495         case EM_IP2K:
1496         case EM_IP2K_OLD:
1497           rtype = elf_ip2k_reloc_type (type);
1498           break;
1499
1500         case EM_IQ2000:
1501           rtype = elf_iq2000_reloc_type (type);
1502           break;
1503
1504         case EM_XTENSA_OLD:
1505         case EM_XTENSA:
1506           rtype = elf_xtensa_reloc_type (type);
1507           break;
1508
1509         case EM_LATTICEMICO32:
1510           rtype = elf_lm32_reloc_type (type);
1511           break;
1512
1513         case EM_M32C_OLD:
1514         case EM_M32C:
1515           rtype = elf_m32c_reloc_type (type);
1516           break;
1517
1518         case EM_MT:
1519           rtype = elf_mt_reloc_type (type);
1520           break;
1521
1522         case EM_BLACKFIN:
1523           rtype = elf_bfin_reloc_type (type);
1524           break;
1525
1526         case EM_CYGNUS_MEP:
1527           rtype = elf_mep_reloc_type (type);
1528           break;
1529
1530         case EM_CR16:
1531           rtype = elf_cr16_reloc_type (type);
1532           break;
1533
1534         case EM_MICROBLAZE:
1535         case EM_MICROBLAZE_OLD:
1536           rtype = elf_microblaze_reloc_type (type);
1537           break;
1538
1539         case EM_RL78:
1540           rtype = elf_rl78_reloc_type (type);
1541           break;
1542
1543         case EM_RX:
1544           rtype = elf_rx_reloc_type (type);
1545           break;
1546
1547         case EM_METAG:
1548           rtype = elf_metag_reloc_type (type);
1549           break;
1550
1551         case EM_XC16X:
1552         case EM_C166:
1553           rtype = elf_xc16x_reloc_type (type);
1554           break;
1555
1556         case EM_TI_C6000:
1557           rtype = elf_tic6x_reloc_type (type);
1558           break;
1559
1560         case EM_TILEGX:
1561           rtype = elf_tilegx_reloc_type (type);
1562           break;
1563
1564         case EM_TILEPRO:
1565           rtype = elf_tilepro_reloc_type (type);
1566           break;
1567
1568         case EM_WEBASSEMBLY:
1569           rtype = elf_wasm32_reloc_type (type);
1570           break;
1571
1572         case EM_XGATE:
1573           rtype = elf_xgate_reloc_type (type);
1574           break;
1575
1576         case EM_ALTERA_NIOS2:
1577           rtype = elf_nios2_reloc_type (type);
1578           break;
1579
1580         case EM_TI_PRU:
1581           rtype = elf_pru_reloc_type (type);
1582           break;
1583
1584         case EM_NFP:
1585           if (EF_NFP_MACH (filedata->file_header.e_flags) == E_NFP_MACH_3200)
1586             rtype = elf_nfp3200_reloc_type (type);
1587           else
1588             rtype = elf_nfp_reloc_type (type);
1589           break;
1590         }
1591
1592       if (rtype == NULL)
1593         printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1594       else
1595         printf (do_wide ? "%-22s" : "%-17.17s", rtype);
1596
1597       if (filedata->file_header.e_machine == EM_ALPHA
1598           && rtype != NULL
1599           && streq (rtype, "R_ALPHA_LITUSE")
1600           && is_rela)
1601         {
1602           switch (rels[i].r_addend)
1603             {
1604             case LITUSE_ALPHA_ADDR:   rtype = "ADDR";   break;
1605             case LITUSE_ALPHA_BASE:   rtype = "BASE";   break;
1606             case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1607             case LITUSE_ALPHA_JSR:    rtype = "JSR";    break;
1608             case LITUSE_ALPHA_TLSGD:  rtype = "TLSGD";  break;
1609             case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1610             case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1611             default: rtype = NULL;
1612             }
1613
1614           if (rtype)
1615             printf (" (%s)", rtype);
1616           else
1617             {
1618               putchar (' ');
1619               printf (_("<unknown addend: %lx>"),
1620                       (unsigned long) rels[i].r_addend);
1621               res = FALSE;
1622             }
1623         }
1624       else if (symtab_index)
1625         {
1626           if (symtab == NULL || symtab_index >= nsyms)
1627             {
1628               error (_(" bad symbol index: %08lx in reloc"), (unsigned long) symtab_index);
1629               res = FALSE;
1630             }
1631           else
1632             {
1633               Elf_Internal_Sym * psym;
1634               const char * version_string;
1635               enum versioned_symbol_info sym_info;
1636               unsigned short vna_other;
1637
1638               psym = symtab + symtab_index;
1639
1640               version_string
1641                 = get_symbol_version_string (filedata, is_dynsym,
1642                                              strtab, strtablen,
1643                                              symtab_index,
1644                                              psym,
1645                                              &sym_info,
1646                                              &vna_other);
1647
1648               printf (" ");
1649
1650               if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1651                 {
1652                   const char * name;
1653                   unsigned int len;
1654                   unsigned int width = is_32bit_elf ? 8 : 14;
1655
1656                   /* Relocations against GNU_IFUNC symbols do not use the value
1657                      of the symbol as the address to relocate against.  Instead
1658                      they invoke the function named by the symbol and use its
1659                      result as the address for relocation.
1660
1661                      To indicate this to the user, do not display the value of
1662                      the symbol in the "Symbols's Value" field.  Instead show
1663                      its name followed by () as a hint that the symbol is
1664                      invoked.  */
1665
1666                   if (strtab == NULL
1667                       || psym->st_name == 0
1668                       || psym->st_name >= strtablen)
1669                     name = "??";
1670                   else
1671                     name = strtab + psym->st_name;
1672
1673                   len = print_symbol (width, name);
1674                   if (version_string)
1675                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1676                             version_string);
1677                   printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1678                 }
1679               else
1680                 {
1681                   print_vma (psym->st_value, LONG_HEX);
1682
1683                   printf (is_32bit_elf ? "   " : " ");
1684                 }
1685
1686               if (psym->st_name == 0)
1687                 {
1688                   const char * sec_name = "<null>";
1689                   char name_buf[40];
1690
1691                   if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1692                     {
1693                       if (psym->st_shndx < filedata->file_header.e_shnum)
1694                         sec_name = SECTION_NAME (filedata->section_headers + psym->st_shndx);
1695                       else if (psym->st_shndx == SHN_ABS)
1696                         sec_name = "ABS";
1697                       else if (psym->st_shndx == SHN_COMMON)
1698                         sec_name = "COMMON";
1699                       else if ((filedata->file_header.e_machine == EM_MIPS
1700                                 && psym->st_shndx == SHN_MIPS_SCOMMON)
1701                                || (filedata->file_header.e_machine == EM_TI_C6000
1702                                    && psym->st_shndx == SHN_TIC6X_SCOMMON))
1703                         sec_name = "SCOMMON";
1704                       else if (filedata->file_header.e_machine == EM_MIPS
1705                                && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1706                         sec_name = "SUNDEF";
1707                       else if ((filedata->file_header.e_machine == EM_X86_64
1708                                 || filedata->file_header.e_machine == EM_L1OM
1709                                 || filedata->file_header.e_machine == EM_K1OM)
1710                                && psym->st_shndx == SHN_X86_64_LCOMMON)
1711                         sec_name = "LARGE_COMMON";
1712                       else if (filedata->file_header.e_machine == EM_IA_64
1713                                && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1714                                && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1715                         sec_name = "ANSI_COM";
1716                       else if (is_ia64_vms (filedata)
1717                                && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1718                         sec_name = "VMS_SYMVEC";
1719                       else
1720                         {
1721                           sprintf (name_buf, "<section 0x%x>",
1722                                    (unsigned int) psym->st_shndx);
1723                           sec_name = name_buf;
1724                         }
1725                     }
1726                   print_symbol (22, sec_name);
1727                 }
1728               else if (strtab == NULL)
1729                 printf (_("<string table index: %3ld>"), psym->st_name);
1730               else if (psym->st_name >= strtablen)
1731                 {
1732                   error (_("<corrupt string table index: %3ld>"), psym->st_name);
1733                   res = FALSE;
1734                 }
1735               else
1736                 {
1737                   print_symbol (22, strtab + psym->st_name);
1738                   if (version_string)
1739                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1740                             version_string);
1741                 }
1742
1743               if (is_rela)
1744                 {
1745                   bfd_vma off = rels[i].r_addend;
1746
1747                   if ((bfd_signed_vma) off < 0)
1748                     printf (" - %" BFD_VMA_FMT "x", - off);
1749                   else
1750                     printf (" + %" BFD_VMA_FMT "x", off);
1751                 }
1752             }
1753         }
1754       else if (is_rela)
1755         {
1756           bfd_vma off = rels[i].r_addend;
1757
1758           printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1759           if ((bfd_signed_vma) off < 0)
1760             printf ("-%" BFD_VMA_FMT "x", - off);
1761           else
1762             printf ("%" BFD_VMA_FMT "x", off);
1763         }
1764
1765       if (filedata->file_header.e_machine == EM_SPARCV9
1766           && rtype != NULL
1767           && streq (rtype, "R_SPARC_OLO10"))
1768         printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1769
1770       putchar ('\n');
1771
1772 #ifdef BFD64
1773       if (! is_32bit_elf && filedata->file_header.e_machine == EM_MIPS)
1774         {
1775           bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1776           bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1777           const char * rtype2 = elf_mips_reloc_type (type2);
1778           const char * rtype3 = elf_mips_reloc_type (type3);
1779
1780           printf ("                    Type2: ");
1781
1782           if (rtype2 == NULL)
1783             printf (_("unrecognized: %-7lx"),
1784                     (unsigned long) type2 & 0xffffffff);
1785           else
1786             printf ("%-17.17s", rtype2);
1787
1788           printf ("\n                    Type3: ");
1789
1790           if (rtype3 == NULL)
1791             printf (_("unrecognized: %-7lx"),
1792                     (unsigned long) type3 & 0xffffffff);
1793           else
1794             printf ("%-17.17s", rtype3);
1795
1796           putchar ('\n');
1797         }
1798 #endif /* BFD64 */
1799     }
1800
1801   free (rels);
1802
1803   return res;
1804 }
1805
1806 static const char *
1807 get_aarch64_dynamic_type (unsigned long type)
1808 {
1809   switch (type)
1810     {
1811     case DT_AARCH64_BTI_PLT:  return "AARCH64_BTI_PLT";
1812     case DT_AARCH64_PAC_PLT:  return "AARCH64_PAC_PLT";
1813     default:
1814       return NULL;
1815     }
1816 }
1817
1818 static const char *
1819 get_mips_dynamic_type (unsigned long type)
1820 {
1821   switch (type)
1822     {
1823     case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1824     case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1825     case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1826     case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1827     case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1828     case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1829     case DT_MIPS_MSYM: return "MIPS_MSYM";
1830     case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1831     case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1832     case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1833     case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1834     case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1835     case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1836     case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1837     case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1838     case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1839     case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1840     case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1841     case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1842     case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1843     case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1844     case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1845     case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1846     case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1847     case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1848     case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1849     case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1850     case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1851     case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1852     case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1853     case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1854     case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1855     case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1856     case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1857     case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1858     case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1859     case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1860     case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1861     case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1862     case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1863     case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1864     case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1865     case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1866     case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1867     case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1868     case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1869     default:
1870       return NULL;
1871     }
1872 }
1873
1874 static const char *
1875 get_sparc64_dynamic_type (unsigned long type)
1876 {
1877   switch (type)
1878     {
1879     case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1880     default:
1881       return NULL;
1882     }
1883 }
1884
1885 static const char *
1886 get_ppc_dynamic_type (unsigned long type)
1887 {
1888   switch (type)
1889     {
1890     case DT_PPC_GOT:    return "PPC_GOT";
1891     case DT_PPC_OPT:    return "PPC_OPT";
1892     default:
1893       return NULL;
1894     }
1895 }
1896
1897 static const char *
1898 get_ppc64_dynamic_type (unsigned long type)
1899 {
1900   switch (type)
1901     {
1902     case DT_PPC64_GLINK:  return "PPC64_GLINK";
1903     case DT_PPC64_OPD:    return "PPC64_OPD";
1904     case DT_PPC64_OPDSZ:  return "PPC64_OPDSZ";
1905     case DT_PPC64_OPT:    return "PPC64_OPT";
1906     default:
1907       return NULL;
1908     }
1909 }
1910
1911 static const char *
1912 get_parisc_dynamic_type (unsigned long type)
1913 {
1914   switch (type)
1915     {
1916     case DT_HP_LOAD_MAP:        return "HP_LOAD_MAP";
1917     case DT_HP_DLD_FLAGS:       return "HP_DLD_FLAGS";
1918     case DT_HP_DLD_HOOK:        return "HP_DLD_HOOK";
1919     case DT_HP_UX10_INIT:       return "HP_UX10_INIT";
1920     case DT_HP_UX10_INITSZ:     return "HP_UX10_INITSZ";
1921     case DT_HP_PREINIT:         return "HP_PREINIT";
1922     case DT_HP_PREINITSZ:       return "HP_PREINITSZ";
1923     case DT_HP_NEEDED:          return "HP_NEEDED";
1924     case DT_HP_TIME_STAMP:      return "HP_TIME_STAMP";
1925     case DT_HP_CHECKSUM:        return "HP_CHECKSUM";
1926     case DT_HP_GST_SIZE:        return "HP_GST_SIZE";
1927     case DT_HP_GST_VERSION:     return "HP_GST_VERSION";
1928     case DT_HP_GST_HASHVAL:     return "HP_GST_HASHVAL";
1929     case DT_HP_EPLTREL:         return "HP_GST_EPLTREL";
1930     case DT_HP_EPLTRELSZ:       return "HP_GST_EPLTRELSZ";
1931     case DT_HP_FILTERED:        return "HP_FILTERED";
1932     case DT_HP_FILTER_TLS:      return "HP_FILTER_TLS";
1933     case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1934     case DT_HP_LAZYLOAD:        return "HP_LAZYLOAD";
1935     case DT_HP_BIND_NOW_COUNT:  return "HP_BIND_NOW_COUNT";
1936     case DT_PLT:                return "PLT";
1937     case DT_PLT_SIZE:           return "PLT_SIZE";
1938     case DT_DLT:                return "DLT";
1939     case DT_DLT_SIZE:           return "DLT_SIZE";
1940     default:
1941       return NULL;
1942     }
1943 }
1944
1945 static const char *
1946 get_ia64_dynamic_type (unsigned long type)
1947 {
1948   switch (type)
1949     {
1950     case DT_IA_64_PLT_RESERVE:         return "IA_64_PLT_RESERVE";
1951     case DT_IA_64_VMS_SUBTYPE:         return "VMS_SUBTYPE";
1952     case DT_IA_64_VMS_IMGIOCNT:        return "VMS_IMGIOCNT";
1953     case DT_IA_64_VMS_LNKFLAGS:        return "VMS_LNKFLAGS";
1954     case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1955     case DT_IA_64_VMS_IDENT:           return "VMS_IDENT";
1956     case DT_IA_64_VMS_NEEDED_IDENT:    return "VMS_NEEDED_IDENT";
1957     case DT_IA_64_VMS_IMG_RELA_CNT:    return "VMS_IMG_RELA_CNT";
1958     case DT_IA_64_VMS_SEG_RELA_CNT:    return "VMS_SEG_RELA_CNT";
1959     case DT_IA_64_VMS_FIXUP_RELA_CNT:  return "VMS_FIXUP_RELA_CNT";
1960     case DT_IA_64_VMS_FIXUP_NEEDED:    return "VMS_FIXUP_NEEDED";
1961     case DT_IA_64_VMS_SYMVEC_CNT:      return "VMS_SYMVEC_CNT";
1962     case DT_IA_64_VMS_XLATED:          return "VMS_XLATED";
1963     case DT_IA_64_VMS_STACKSIZE:       return "VMS_STACKSIZE";
1964     case DT_IA_64_VMS_UNWINDSZ:        return "VMS_UNWINDSZ";
1965     case DT_IA_64_VMS_UNWIND_CODSEG:   return "VMS_UNWIND_CODSEG";
1966     case DT_IA_64_VMS_UNWIND_INFOSEG:  return "VMS_UNWIND_INFOSEG";
1967     case DT_IA_64_VMS_LINKTIME:        return "VMS_LINKTIME";
1968     case DT_IA_64_VMS_SEG_NO:          return "VMS_SEG_NO";
1969     case DT_IA_64_VMS_SYMVEC_OFFSET:   return "VMS_SYMVEC_OFFSET";
1970     case DT_IA_64_VMS_SYMVEC_SEG:      return "VMS_SYMVEC_SEG";
1971     case DT_IA_64_VMS_UNWIND_OFFSET:   return "VMS_UNWIND_OFFSET";
1972     case DT_IA_64_VMS_UNWIND_SEG:      return "VMS_UNWIND_SEG";
1973     case DT_IA_64_VMS_STRTAB_OFFSET:   return "VMS_STRTAB_OFFSET";
1974     case DT_IA_64_VMS_SYSVER_OFFSET:   return "VMS_SYSVER_OFFSET";
1975     case DT_IA_64_VMS_IMG_RELA_OFF:    return "VMS_IMG_RELA_OFF";
1976     case DT_IA_64_VMS_SEG_RELA_OFF:    return "VMS_SEG_RELA_OFF";
1977     case DT_IA_64_VMS_FIXUP_RELA_OFF:  return "VMS_FIXUP_RELA_OFF";
1978     case DT_IA_64_VMS_PLTGOT_OFFSET:   return "VMS_PLTGOT_OFFSET";
1979     case DT_IA_64_VMS_PLTGOT_SEG:      return "VMS_PLTGOT_SEG";
1980     case DT_IA_64_VMS_FPMODE:          return "VMS_FPMODE";
1981     default:
1982       return NULL;
1983     }
1984 }
1985
1986 static const char *
1987 get_solaris_section_type (unsigned long type)
1988 {
1989   switch (type)
1990     {
1991     case 0x6fffffee: return "SUNW_ancillary";
1992     case 0x6fffffef: return "SUNW_capchain";
1993     case 0x6ffffff0: return "SUNW_capinfo";
1994     case 0x6ffffff1: return "SUNW_symsort";
1995     case 0x6ffffff2: return "SUNW_tlssort";
1996     case 0x6ffffff3: return "SUNW_LDYNSYM";
1997     case 0x6ffffff4: return "SUNW_dof";
1998     case 0x6ffffff5: return "SUNW_cap";
1999     case 0x6ffffff6: return "SUNW_SIGNATURE";
2000     case 0x6ffffff7: return "SUNW_ANNOTATE";
2001     case 0x6ffffff8: return "SUNW_DEBUGSTR";
2002     case 0x6ffffff9: return "SUNW_DEBUG";
2003     case 0x6ffffffa: return "SUNW_move";
2004     case 0x6ffffffb: return "SUNW_COMDAT";
2005     case 0x6ffffffc: return "SUNW_syminfo";
2006     case 0x6ffffffd: return "SUNW_verdef";
2007     case 0x6ffffffe: return "SUNW_verneed";
2008     case 0x6fffffff: return "SUNW_versym";
2009     case 0x70000000: return "SPARC_GOTDATA";
2010     default: return NULL;
2011     }
2012 }
2013
2014 static const char *
2015 get_alpha_dynamic_type (unsigned long type)
2016 {
2017   switch (type)
2018     {
2019     case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
2020     default: return NULL;
2021     }
2022 }
2023
2024 static const char *
2025 get_score_dynamic_type (unsigned long type)
2026 {
2027   switch (type)
2028     {
2029     case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
2030     case DT_SCORE_LOCAL_GOTNO:  return "SCORE_LOCAL_GOTNO";
2031     case DT_SCORE_SYMTABNO:     return "SCORE_SYMTABNO";
2032     case DT_SCORE_GOTSYM:       return "SCORE_GOTSYM";
2033     case DT_SCORE_UNREFEXTNO:   return "SCORE_UNREFEXTNO";
2034     case DT_SCORE_HIPAGENO:     return "SCORE_HIPAGENO";
2035     default:                    return NULL;
2036     }
2037 }
2038
2039 static const char *
2040 get_tic6x_dynamic_type (unsigned long type)
2041 {
2042   switch (type)
2043     {
2044     case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
2045     case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
2046     case DT_C6000_DSBT_BASE:   return "C6000_DSBT_BASE";
2047     case DT_C6000_DSBT_SIZE:   return "C6000_DSBT_SIZE";
2048     case DT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
2049     case DT_C6000_DSBT_INDEX:  return "C6000_DSBT_INDEX";
2050     default:                   return NULL;
2051     }
2052 }
2053
2054 static const char *
2055 get_nios2_dynamic_type (unsigned long type)
2056 {
2057   switch (type)
2058     {
2059     case DT_NIOS2_GP: return "NIOS2_GP";
2060     default:          return NULL;
2061     }
2062 }
2063
2064 static const char *
2065 get_solaris_dynamic_type (unsigned long type)
2066 {
2067   switch (type)
2068     {
2069     case 0x6000000d: return "SUNW_AUXILIARY";
2070     case 0x6000000e: return "SUNW_RTLDINF";
2071     case 0x6000000f: return "SUNW_FILTER";
2072     case 0x60000010: return "SUNW_CAP";
2073     case 0x60000011: return "SUNW_SYMTAB";
2074     case 0x60000012: return "SUNW_SYMSZ";
2075     case 0x60000013: return "SUNW_SORTENT";
2076     case 0x60000014: return "SUNW_SYMSORT";
2077     case 0x60000015: return "SUNW_SYMSORTSZ";
2078     case 0x60000016: return "SUNW_TLSSORT";
2079     case 0x60000017: return "SUNW_TLSSORTSZ";
2080     case 0x60000018: return "SUNW_CAPINFO";
2081     case 0x60000019: return "SUNW_STRPAD";
2082     case 0x6000001a: return "SUNW_CAPCHAIN";
2083     case 0x6000001b: return "SUNW_LDMACH";
2084     case 0x6000001d: return "SUNW_CAPCHAINENT";
2085     case 0x6000001f: return "SUNW_CAPCHAINSZ";
2086     case 0x60000021: return "SUNW_PARENT";
2087     case 0x60000023: return "SUNW_ASLR";
2088     case 0x60000025: return "SUNW_RELAX";
2089     case 0x60000029: return "SUNW_NXHEAP";
2090     case 0x6000002b: return "SUNW_NXSTACK";
2091
2092     case 0x70000001: return "SPARC_REGISTER";
2093     case 0x7ffffffd: return "AUXILIARY";
2094     case 0x7ffffffe: return "USED";
2095     case 0x7fffffff: return "FILTER";
2096
2097     default: return NULL;
2098     }
2099 }
2100
2101 static const char *
2102 get_dynamic_type (Filedata * filedata, unsigned long type)
2103 {
2104   static char buff[64];
2105
2106   switch (type)
2107     {
2108     case DT_NULL:       return "NULL";
2109     case DT_NEEDED:     return "NEEDED";
2110     case DT_PLTRELSZ:   return "PLTRELSZ";
2111     case DT_PLTGOT:     return "PLTGOT";
2112     case DT_HASH:       return "HASH";
2113     case DT_STRTAB:     return "STRTAB";
2114     case DT_SYMTAB:     return "SYMTAB";
2115     case DT_RELA:       return "RELA";
2116     case DT_RELASZ:     return "RELASZ";
2117     case DT_RELAENT:    return "RELAENT";
2118     case DT_STRSZ:      return "STRSZ";
2119     case DT_SYMENT:     return "SYMENT";
2120     case DT_INIT:       return "INIT";
2121     case DT_FINI:       return "FINI";
2122     case DT_SONAME:     return "SONAME";
2123     case DT_RPATH:      return "RPATH";
2124     case DT_SYMBOLIC:   return "SYMBOLIC";
2125     case DT_REL:        return "REL";
2126     case DT_RELSZ:      return "RELSZ";
2127     case DT_RELENT:     return "RELENT";
2128     case DT_PLTREL:     return "PLTREL";
2129     case DT_DEBUG:      return "DEBUG";
2130     case DT_TEXTREL:    return "TEXTREL";
2131     case DT_JMPREL:     return "JMPREL";
2132     case DT_BIND_NOW:   return "BIND_NOW";
2133     case DT_INIT_ARRAY: return "INIT_ARRAY";
2134     case DT_FINI_ARRAY: return "FINI_ARRAY";
2135     case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2136     case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
2137     case DT_RUNPATH:    return "RUNPATH";
2138     case DT_FLAGS:      return "FLAGS";
2139
2140     case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2141     case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
2142     case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX";
2143
2144     case DT_CHECKSUM:   return "CHECKSUM";
2145     case DT_PLTPADSZ:   return "PLTPADSZ";
2146     case DT_MOVEENT:    return "MOVEENT";
2147     case DT_MOVESZ:     return "MOVESZ";
2148     case DT_FEATURE:    return "FEATURE";
2149     case DT_POSFLAG_1:  return "POSFLAG_1";
2150     case DT_SYMINSZ:    return "SYMINSZ";
2151     case DT_SYMINENT:   return "SYMINENT"; /* aka VALRNGHI */
2152
2153     case DT_ADDRRNGLO:  return "ADDRRNGLO";
2154     case DT_CONFIG:     return "CONFIG";
2155     case DT_DEPAUDIT:   return "DEPAUDIT";
2156     case DT_AUDIT:      return "AUDIT";
2157     case DT_PLTPAD:     return "PLTPAD";
2158     case DT_MOVETAB:    return "MOVETAB";
2159     case DT_SYMINFO:    return "SYMINFO"; /* aka ADDRRNGHI */
2160
2161     case DT_VERSYM:     return "VERSYM";
2162
2163     case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2164     case DT_TLSDESC_PLT: return "TLSDESC_PLT";
2165     case DT_RELACOUNT:  return "RELACOUNT";
2166     case DT_RELCOUNT:   return "RELCOUNT";
2167     case DT_FLAGS_1:    return "FLAGS_1";
2168     case DT_VERDEF:     return "VERDEF";
2169     case DT_VERDEFNUM:  return "VERDEFNUM";
2170     case DT_VERNEED:    return "VERNEED";
2171     case DT_VERNEEDNUM: return "VERNEEDNUM";
2172
2173     case DT_AUXILIARY:  return "AUXILIARY";
2174     case DT_USED:       return "USED";
2175     case DT_FILTER:     return "FILTER";
2176
2177     case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2178     case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2179     case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2180     case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2181     case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
2182     case DT_GNU_HASH:   return "GNU_HASH";
2183
2184     default:
2185       if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2186         {
2187           const char * result;
2188
2189           switch (filedata->file_header.e_machine)
2190             {
2191             case EM_AARCH64:
2192               result = get_aarch64_dynamic_type (type);
2193               break;
2194             case EM_MIPS:
2195             case EM_MIPS_RS3_LE:
2196               result = get_mips_dynamic_type (type);
2197               break;
2198             case EM_SPARCV9:
2199               result = get_sparc64_dynamic_type (type);
2200               break;
2201             case EM_PPC:
2202               result = get_ppc_dynamic_type (type);
2203               break;
2204             case EM_PPC64:
2205               result = get_ppc64_dynamic_type (type);
2206               break;
2207             case EM_IA_64:
2208               result = get_ia64_dynamic_type (type);
2209               break;
2210             case EM_ALPHA:
2211               result = get_alpha_dynamic_type (type);
2212               break;
2213             case EM_SCORE:
2214               result = get_score_dynamic_type (type);
2215               break;
2216             case EM_TI_C6000:
2217               result = get_tic6x_dynamic_type (type);
2218               break;
2219             case EM_ALTERA_NIOS2:
2220               result = get_nios2_dynamic_type (type);
2221               break;
2222             default:
2223               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2224                 result = get_solaris_dynamic_type (type);
2225               else
2226                 result = NULL;
2227               break;
2228             }
2229
2230           if (result != NULL)
2231             return result;
2232
2233           snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2234         }
2235       else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2236                || (filedata->file_header.e_machine == EM_PARISC
2237                    && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2238         {
2239           const char * result;
2240
2241           switch (filedata->file_header.e_machine)
2242             {
2243             case EM_PARISC:
2244               result = get_parisc_dynamic_type (type);
2245               break;
2246             case EM_IA_64:
2247               result = get_ia64_dynamic_type (type);
2248               break;
2249             default:
2250               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2251                 result = get_solaris_dynamic_type (type);
2252               else
2253                 result = NULL;
2254               break;
2255             }
2256
2257           if (result != NULL)
2258             return result;
2259
2260           snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2261                     type);
2262         }
2263       else
2264         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2265
2266       return buff;
2267     }
2268 }
2269
2270 static char *
2271 get_file_type (unsigned e_type)
2272 {
2273   static char buff[32];
2274
2275   switch (e_type)
2276     {
2277     case ET_NONE: return _("NONE (None)");
2278     case ET_REL:  return _("REL (Relocatable file)");
2279     case ET_EXEC: return _("EXEC (Executable file)");
2280     case ET_DYN:  return _("DYN (Shared object file)");
2281     case ET_CORE: return _("CORE (Core file)");
2282
2283     default:
2284       if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2285         snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2286       else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2287         snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2288       else
2289         snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2290       return buff;
2291     }
2292 }
2293
2294 static char *
2295 get_machine_name (unsigned e_machine)
2296 {
2297   static char buff[64]; /* XXX */
2298
2299   switch (e_machine)
2300     {
2301       /* Please keep this switch table sorted by increasing EM_ value.  */
2302       /* 0 */
2303     case EM_NONE:               return _("None");
2304     case EM_M32:                return "WE32100";
2305     case EM_SPARC:              return "Sparc";
2306     case EM_386:                return "Intel 80386";
2307     case EM_68K:                return "MC68000";
2308     case EM_88K:                return "MC88000";
2309     case EM_IAMCU:              return "Intel MCU";
2310     case EM_860:                return "Intel 80860";
2311     case EM_MIPS:               return "MIPS R3000";
2312     case EM_S370:               return "IBM System/370";
2313       /* 10 */
2314     case EM_MIPS_RS3_LE:        return "MIPS R4000 big-endian";
2315     case EM_OLD_SPARCV9:        return "Sparc v9 (old)";
2316     case EM_PARISC:             return "HPPA";
2317     case EM_VPP550:             return "Fujitsu VPP500";
2318     case EM_SPARC32PLUS:        return "Sparc v8+" ;
2319     case EM_960:                return "Intel 80960";
2320     case EM_PPC:                return "PowerPC";
2321       /* 20 */
2322     case EM_PPC64:              return "PowerPC64";
2323     case EM_S390_OLD:
2324     case EM_S390:               return "IBM S/390";
2325     case EM_SPU:                return "SPU";
2326       /* 30 */
2327     case EM_V800:               return "Renesas V850 (using RH850 ABI)";
2328     case EM_FR20:               return "Fujitsu FR20";
2329     case EM_RH32:               return "TRW RH32";
2330     case EM_MCORE:              return "MCORE";
2331       /* 40 */
2332     case EM_ARM:                return "ARM";
2333     case EM_OLD_ALPHA:          return "Digital Alpha (old)";
2334     case EM_SH:                 return "Renesas / SuperH SH";
2335     case EM_SPARCV9:            return "Sparc v9";
2336     case EM_TRICORE:            return "Siemens Tricore";
2337     case EM_ARC:                return "ARC";
2338     case EM_H8_300:             return "Renesas H8/300";
2339     case EM_H8_300H:            return "Renesas H8/300H";
2340     case EM_H8S:                return "Renesas H8S";
2341     case EM_H8_500:             return "Renesas H8/500";
2342       /* 50 */
2343     case EM_IA_64:              return "Intel IA-64";
2344     case EM_MIPS_X:             return "Stanford MIPS-X";
2345     case EM_COLDFIRE:           return "Motorola Coldfire";
2346     case EM_68HC12:             return "Motorola MC68HC12 Microcontroller";
2347     case EM_MMA:                return "Fujitsu Multimedia Accelerator";
2348     case EM_PCP:                return "Siemens PCP";
2349     case EM_NCPU:               return "Sony nCPU embedded RISC processor";
2350     case EM_NDR1:               return "Denso NDR1 microprocesspr";
2351     case EM_STARCORE:           return "Motorola Star*Core processor";
2352     case EM_ME16:               return "Toyota ME16 processor";
2353       /* 60 */
2354     case EM_ST100:              return "STMicroelectronics ST100 processor";
2355     case EM_TINYJ:              return "Advanced Logic Corp. TinyJ embedded processor";
2356     case EM_X86_64:             return "Advanced Micro Devices X86-64";
2357     case EM_PDSP:               return "Sony DSP processor";
2358     case EM_PDP10:              return "Digital Equipment Corp. PDP-10";
2359     case EM_PDP11:              return "Digital Equipment Corp. PDP-11";
2360     case EM_FX66:               return "Siemens FX66 microcontroller";
2361     case EM_ST9PLUS:            return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2362     case EM_ST7:                return "STMicroelectronics ST7 8-bit microcontroller";
2363     case EM_68HC16:             return "Motorola MC68HC16 Microcontroller";
2364       /* 70 */
2365     case EM_68HC11:             return "Motorola MC68HC11 Microcontroller";
2366     case EM_68HC08:             return "Motorola MC68HC08 Microcontroller";
2367     case EM_68HC05:             return "Motorola MC68HC05 Microcontroller";
2368     case EM_SVX:                return "Silicon Graphics SVx";
2369     case EM_ST19:               return "STMicroelectronics ST19 8-bit microcontroller";
2370     case EM_VAX:                return "Digital VAX";
2371     case EM_CRIS:               return "Axis Communications 32-bit embedded processor";
2372     case EM_JAVELIN:            return "Infineon Technologies 32-bit embedded cpu";
2373     case EM_FIREPATH:           return "Element 14 64-bit DSP processor";
2374     case EM_ZSP:                return "LSI Logic's 16-bit DSP processor";
2375       /* 80 */
2376     case EM_MMIX:               return "Donald Knuth's educational 64-bit processor";
2377     case EM_HUANY:              return "Harvard Universitys's machine-independent object format";
2378     case EM_PRISM:              return "Vitesse Prism";
2379     case EM_AVR_OLD:
2380     case EM_AVR:                return "Atmel AVR 8-bit microcontroller";
2381     case EM_CYGNUS_FR30:
2382     case EM_FR30:               return "Fujitsu FR30";
2383     case EM_CYGNUS_D10V:
2384     case EM_D10V:               return "d10v";
2385     case EM_CYGNUS_D30V:
2386     case EM_D30V:               return "d30v";
2387     case EM_CYGNUS_V850:
2388     case EM_V850:               return "Renesas V850";
2389     case EM_CYGNUS_M32R:
2390     case EM_M32R:               return "Renesas M32R (formerly Mitsubishi M32r)";
2391     case EM_CYGNUS_MN10300:
2392     case EM_MN10300:            return "mn10300";
2393       /* 90 */
2394     case EM_CYGNUS_MN10200:
2395     case EM_MN10200:            return "mn10200";
2396     case EM_PJ:                 return "picoJava";
2397     case EM_OR1K:               return "OpenRISC 1000";
2398     case EM_ARC_COMPACT:        return "ARCompact";
2399     case EM_XTENSA_OLD:
2400     case EM_XTENSA:             return "Tensilica Xtensa Processor";
2401     case EM_VIDEOCORE:          return "Alphamosaic VideoCore processor";
2402     case EM_TMM_GPP:            return "Thompson Multimedia General Purpose Processor";
2403     case EM_NS32K:              return "National Semiconductor 32000 series";
2404     case EM_TPC:                return "Tenor Network TPC processor";
2405     case EM_SNP1K:              return "Trebia SNP 1000 processor";
2406       /* 100 */
2407     case EM_ST200:              return "STMicroelectronics ST200 microcontroller";  
2408     case EM_IP2K_OLD:
2409     case EM_IP2K:               return "Ubicom IP2xxx 8-bit microcontrollers";
2410     case EM_MAX:                return "MAX Processor";
2411     case EM_CR:                 return "National Semiconductor CompactRISC";
2412     case EM_F2MC16:             return "Fujitsu F2MC16";
2413     case EM_MSP430:             return "Texas Instruments msp430 microcontroller";
2414     case EM_BLACKFIN:           return "Analog Devices Blackfin";
2415     case EM_SE_C33:             return "S1C33 Family of Seiko Epson processors";
2416     case EM_SEP:                return "Sharp embedded microprocessor";
2417     case EM_ARCA:               return "Arca RISC microprocessor";
2418       /* 110 */
2419     case EM_UNICORE:            return "Unicore";
2420     case EM_EXCESS:             return "eXcess 16/32/64-bit configurable embedded CPU";
2421     case EM_DXP:                return "Icera Semiconductor Inc. Deep Execution Processor";
2422     case EM_ALTERA_NIOS2:       return "Altera Nios II";
2423     case EM_CRX:                return "National Semiconductor CRX microprocessor";
2424     case EM_XGATE:              return "Motorola XGATE embedded processor";
2425     case EM_C166:
2426     case EM_XC16X:              return "Infineon Technologies xc16x";
2427     case EM_M16C:               return "Renesas M16C series microprocessors";
2428     case EM_DSPIC30F:           return "Microchip Technology dsPIC30F Digital Signal Controller";
2429     case EM_CE:                 return "Freescale Communication Engine RISC core";
2430       /* 120 */
2431     case EM_M32C:               return "Renesas M32c";
2432       /* 130 */
2433     case EM_TSK3000:            return "Altium TSK3000 core";
2434     case EM_RS08:               return "Freescale RS08 embedded processor";
2435     case EM_ECOG2:              return "Cyan Technology eCOG2 microprocessor";
2436     case EM_SCORE:              return "SUNPLUS S+Core";
2437     case EM_DSP24:              return "New Japan Radio (NJR) 24-bit DSP Processor";
2438     case EM_VIDEOCORE3:         return "Broadcom VideoCore III processor";
2439     case EM_LATTICEMICO32:      return "Lattice Mico32";
2440     case EM_SE_C17:             return "Seiko Epson C17 family";
2441       /* 140 */
2442     case EM_TI_C6000:           return "Texas Instruments TMS320C6000 DSP family";
2443     case EM_TI_C2000:           return "Texas Instruments TMS320C2000 DSP family";
2444     case EM_TI_C5500:           return "Texas Instruments TMS320C55x DSP family";
2445     case EM_TI_PRU:             return "TI PRU I/O processor";
2446       /* 160 */
2447     case EM_MMDSP_PLUS:         return "STMicroelectronics 64bit VLIW Data Signal Processor";
2448     case EM_CYPRESS_M8C:        return "Cypress M8C microprocessor";
2449     case EM_R32C:               return "Renesas R32C series microprocessors";
2450     case EM_TRIMEDIA:           return "NXP Semiconductors TriMedia architecture family";
2451     case EM_QDSP6:              return "QUALCOMM DSP6 Processor";
2452     case EM_8051:               return "Intel 8051 and variants";
2453     case EM_STXP7X:             return "STMicroelectronics STxP7x family";
2454     case EM_NDS32:              return "Andes Technology compact code size embedded RISC processor family";
2455     case EM_ECOG1X:             return "Cyan Technology eCOG1X family";
2456     case EM_MAXQ30:             return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2457       /* 170 */
2458     case EM_XIMO16:             return "New Japan Radio (NJR) 16-bit DSP Processor";
2459     case EM_MANIK:              return "M2000 Reconfigurable RISC Microprocessor";
2460     case EM_CRAYNV2:            return "Cray Inc. NV2 vector architecture";
2461     case EM_RX:                 return "Renesas RX";
2462     case EM_METAG:              return "Imagination Technologies Meta processor architecture";
2463     case EM_MCST_ELBRUS:        return "MCST Elbrus general purpose hardware architecture";
2464     case EM_ECOG16:             return "Cyan Technology eCOG16 family";
2465     case EM_CR16:
2466     case EM_MICROBLAZE:
2467     case EM_MICROBLAZE_OLD:     return "Xilinx MicroBlaze";
2468     case EM_ETPU:               return "Freescale Extended Time Processing Unit";
2469     case EM_SLE9X:              return "Infineon Technologies SLE9X core";
2470       /* 180 */
2471     case EM_L1OM:               return "Intel L1OM";
2472     case EM_K1OM:               return "Intel K1OM";
2473     case EM_INTEL182:           return "Intel (reserved)";
2474     case EM_AARCH64:            return "AArch64";
2475     case EM_ARM184:             return "ARM (reserved)";
2476     case EM_AVR32:              return "Atmel Corporation 32-bit microprocessor";
2477     case EM_STM8:               return "STMicroeletronics STM8 8-bit microcontroller";
2478     case EM_TILE64:             return "Tilera TILE64 multicore architecture family";
2479     case EM_TILEPRO:            return "Tilera TILEPro multicore architecture family";
2480       /* 190 */
2481     case EM_CUDA:               return "NVIDIA CUDA architecture";
2482     case EM_TILEGX:             return "Tilera TILE-Gx multicore architecture family";
2483     case EM_CLOUDSHIELD:        return "CloudShield architecture family";
2484     case EM_COREA_1ST:          return "KIPO-KAIST Core-A 1st generation processor family";
2485     case EM_COREA_2ND:          return "KIPO-KAIST Core-A 2nd generation processor family";
2486     case EM_ARC_COMPACT2:       return "ARCv2";
2487     case EM_OPEN8:              return "Open8 8-bit RISC soft processor core";
2488     case EM_RL78:               return "Renesas RL78";
2489     case EM_VIDEOCORE5:         return "Broadcom VideoCore V processor";
2490     case EM_78K0R:              return "Renesas 78K0R";
2491       /* 200 */
2492     case EM_56800EX:            return "Freescale 56800EX Digital Signal Controller (DSC)";
2493     case EM_BA1:                return "Beyond BA1 CPU architecture";
2494     case EM_BA2:                return "Beyond BA2 CPU architecture";
2495     case EM_XCORE:              return "XMOS xCORE processor family";
2496     case EM_MCHP_PIC:           return "Microchip 8-bit PIC(r) family";
2497       /* 210 */
2498     case EM_KM32:               return "KM211 KM32 32-bit processor";
2499     case EM_KMX32:              return "KM211 KMX32 32-bit processor";
2500     case EM_KMX16:              return "KM211 KMX16 16-bit processor";
2501     case EM_KMX8:               return "KM211 KMX8 8-bit processor";
2502     case EM_KVARC:              return "KM211 KVARC processor";
2503     case EM_CDP:                return "Paneve CDP architecture family";
2504     case EM_COGE:               return "Cognitive Smart Memory Processor";
2505     case EM_COOL:               return "Bluechip Systems CoolEngine";
2506     case EM_NORC:               return "Nanoradio Optimized RISC";
2507     case EM_CSR_KALIMBA:        return "CSR Kalimba architecture family";
2508       /* 220 */
2509     case EM_Z80:                return "Zilog Z80";
2510     case EM_VISIUM:             return "CDS VISIUMcore processor";
2511     case EM_FT32:               return "FTDI Chip FT32";
2512     case EM_MOXIE:              return "Moxie";
2513     case EM_AMDGPU:             return "AMD GPU";
2514     case EM_RISCV:              return "RISC-V";
2515     case EM_LANAI:              return "Lanai 32-bit processor";
2516     case EM_BPF:                return "Linux BPF";
2517     case EM_NFP:                return "Netronome Flow Processor";
2518
2519       /* Large numbers...  */
2520     case EM_MT:                 return "Morpho Techologies MT processor";
2521     case EM_ALPHA:              return "Alpha";
2522     case EM_WEBASSEMBLY:        return "Web Assembly";
2523     case EM_DLX:                return "OpenDLX";  
2524     case EM_XSTORMY16:          return "Sanyo XStormy16 CPU core";
2525     case EM_IQ2000:             return "Vitesse IQ2000";
2526     case EM_M32C_OLD:
2527     case EM_NIOS32:             return "Altera Nios";
2528     case EM_CYGNUS_MEP:         return "Toshiba MeP Media Engine";
2529     case EM_ADAPTEVA_EPIPHANY:  return "Adapteva EPIPHANY";
2530     case EM_CYGNUS_FRV:         return "Fujitsu FR-V";
2531     case EM_S12Z:               return "Freescale S12Z";
2532     case EM_CSKY:               return "C-SKY";
2533
2534     default:
2535       snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2536       return buff;
2537     }
2538 }
2539
2540 static void
2541 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2542 {
2543   /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2.  Some
2544      other compilers don't a specific architecture type in the e_flags, and
2545      instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2546      architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2547      architectures.
2548
2549      Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2550      but also sets a specific architecture type in the e_flags field.
2551
2552      However, when decoding the flags we don't worry if we see an
2553      unexpected pairing, for example EM_ARC_COMPACT machine type, with
2554      ARCEM architecture type.  */
2555
2556   switch (e_flags & EF_ARC_MACH_MSK)
2557     {
2558       /* We only expect these to occur for EM_ARC_COMPACT2.  */
2559     case EF_ARC_CPU_ARCV2EM:
2560       strcat (buf, ", ARC EM");
2561       break;
2562     case EF_ARC_CPU_ARCV2HS:
2563       strcat (buf, ", ARC HS");
2564       break;
2565
2566       /* We only expect these to occur for EM_ARC_COMPACT.  */
2567     case E_ARC_MACH_ARC600:
2568       strcat (buf, ", ARC600");
2569       break;
2570     case E_ARC_MACH_ARC601:
2571       strcat (buf, ", ARC601");
2572       break;
2573     case E_ARC_MACH_ARC700:
2574       strcat (buf, ", ARC700");
2575       break;
2576
2577       /* The only times we should end up here are (a) A corrupt ELF, (b) A
2578          new ELF with new architecture being read by an old version of
2579          readelf, or (c) An ELF built with non-GNU compiler that does not
2580          set the architecture in the e_flags.  */
2581     default:
2582       if (e_machine == EM_ARC_COMPACT)
2583         strcat (buf, ", Unknown ARCompact");
2584       else
2585         strcat (buf, ", Unknown ARC");
2586       break;
2587     }
2588
2589   switch (e_flags & EF_ARC_OSABI_MSK)
2590     {
2591     case E_ARC_OSABI_ORIG:
2592       strcat (buf, ", (ABI:legacy)");
2593       break;
2594     case E_ARC_OSABI_V2:
2595       strcat (buf, ", (ABI:v2)");
2596       break;
2597       /* Only upstream 3.9+ kernels will support ARCv2 ISA.  */
2598     case E_ARC_OSABI_V3:
2599       strcat (buf, ", v3 no-legacy-syscalls ABI");
2600       break;
2601     case E_ARC_OSABI_V4:
2602       strcat (buf, ", v4 ABI");
2603       break;
2604     default:
2605       strcat (buf, ", unrecognised ARC OSABI flag");
2606       break;
2607     }
2608 }
2609
2610 static void
2611 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2612 {
2613   unsigned eabi;
2614   bfd_boolean unknown = FALSE;
2615
2616   eabi = EF_ARM_EABI_VERSION (e_flags);
2617   e_flags &= ~ EF_ARM_EABIMASK;
2618
2619   /* Handle "generic" ARM flags.  */
2620   if (e_flags & EF_ARM_RELEXEC)
2621     {
2622       strcat (buf, ", relocatable executable");
2623       e_flags &= ~ EF_ARM_RELEXEC;
2624     }
2625
2626   if (e_flags & EF_ARM_PIC)
2627     {
2628       strcat (buf, ", position independent");
2629       e_flags &= ~ EF_ARM_PIC;
2630     }
2631
2632   /* Now handle EABI specific flags.  */
2633   switch (eabi)
2634     {
2635     default:
2636       strcat (buf, ", <unrecognized EABI>");
2637       if (e_flags)
2638         unknown = TRUE;
2639       break;
2640
2641     case EF_ARM_EABI_VER1:
2642       strcat (buf, ", Version1 EABI");
2643       while (e_flags)
2644         {
2645           unsigned flag;
2646
2647           /* Process flags one bit at a time.  */
2648           flag = e_flags & - e_flags;
2649           e_flags &= ~ flag;
2650
2651           switch (flag)
2652             {
2653             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2654               strcat (buf, ", sorted symbol tables");
2655               break;
2656
2657             default:
2658               unknown = TRUE;
2659               break;
2660             }
2661         }
2662       break;
2663
2664     case EF_ARM_EABI_VER2:
2665       strcat (buf, ", Version2 EABI");
2666       while (e_flags)
2667         {
2668           unsigned flag;
2669
2670           /* Process flags one bit at a time.  */
2671           flag = e_flags & - e_flags;
2672           e_flags &= ~ flag;
2673
2674           switch (flag)
2675             {
2676             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2677               strcat (buf, ", sorted symbol tables");
2678               break;
2679
2680             case EF_ARM_DYNSYMSUSESEGIDX:
2681               strcat (buf, ", dynamic symbols use segment index");
2682               break;
2683
2684             case EF_ARM_MAPSYMSFIRST:
2685               strcat (buf, ", mapping symbols precede others");
2686               break;
2687
2688             default:
2689               unknown = TRUE;
2690               break;
2691             }
2692         }
2693       break;
2694
2695     case EF_ARM_EABI_VER3:
2696       strcat (buf, ", Version3 EABI");
2697       break;
2698
2699     case EF_ARM_EABI_VER4:
2700       strcat (buf, ", Version4 EABI");
2701       while (e_flags)
2702         {
2703           unsigned flag;
2704
2705           /* Process flags one bit at a time.  */
2706           flag = e_flags & - e_flags;
2707           e_flags &= ~ flag;
2708
2709           switch (flag)
2710             {
2711             case EF_ARM_BE8:
2712               strcat (buf, ", BE8");
2713               break;
2714
2715             case EF_ARM_LE8:
2716               strcat (buf, ", LE8");
2717               break;
2718
2719             default:
2720               unknown = TRUE;
2721               break;
2722             }
2723         }
2724       break;
2725
2726     case EF_ARM_EABI_VER5:
2727       strcat (buf, ", Version5 EABI");
2728       while (e_flags)
2729         {
2730           unsigned flag;
2731
2732           /* Process flags one bit at a time.  */
2733           flag = e_flags & - e_flags;
2734           e_flags &= ~ flag;
2735
2736           switch (flag)
2737             {
2738             case EF_ARM_BE8:
2739               strcat (buf, ", BE8");
2740               break;
2741
2742             case EF_ARM_LE8:
2743               strcat (buf, ", LE8");
2744               break;
2745
2746             case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT.  */
2747               strcat (buf, ", soft-float ABI");
2748               break;
2749
2750             case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT.  */
2751               strcat (buf, ", hard-float ABI");
2752               break;
2753
2754             default:
2755               unknown = TRUE;
2756               break;
2757             }
2758         }
2759       break;
2760
2761     case EF_ARM_EABI_UNKNOWN:
2762       strcat (buf, ", GNU EABI");
2763       while (e_flags)
2764         {
2765           unsigned flag;
2766
2767           /* Process flags one bit at a time.  */
2768           flag = e_flags & - e_flags;
2769           e_flags &= ~ flag;
2770
2771           switch (flag)
2772             {
2773             case EF_ARM_INTERWORK:
2774               strcat (buf, ", interworking enabled");
2775               break;
2776
2777             case EF_ARM_APCS_26:
2778               strcat (buf, ", uses APCS/26");
2779               break;
2780
2781             case EF_ARM_APCS_FLOAT:
2782               strcat (buf, ", uses APCS/float");
2783               break;
2784
2785             case EF_ARM_PIC:
2786               strcat (buf, ", position independent");
2787               break;
2788
2789             case EF_ARM_ALIGN8:
2790               strcat (buf, ", 8 bit structure alignment");
2791               break;
2792
2793             case EF_ARM_NEW_ABI:
2794               strcat (buf, ", uses new ABI");
2795               break;
2796
2797             case EF_ARM_OLD_ABI:
2798               strcat (buf, ", uses old ABI");
2799               break;
2800
2801             case EF_ARM_SOFT_FLOAT:
2802               strcat (buf, ", software FP");
2803               break;
2804
2805             case EF_ARM_VFP_FLOAT:
2806               strcat (buf, ", VFP");
2807               break;
2808
2809             case EF_ARM_MAVERICK_FLOAT:
2810               strcat (buf, ", Maverick FP");
2811               break;
2812
2813             default:
2814               unknown = TRUE;
2815               break;
2816             }
2817         }
2818     }
2819
2820   if (unknown)
2821     strcat (buf,_(", <unknown>"));
2822 }
2823
2824 static void
2825 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2826 {
2827   --size; /* Leave space for null terminator.  */
2828
2829   switch (e_flags & EF_AVR_MACH)
2830     {
2831     case E_AVR_MACH_AVR1:
2832       strncat (buf, ", avr:1", size);
2833       break;
2834     case E_AVR_MACH_AVR2:
2835       strncat (buf, ", avr:2", size);
2836       break;
2837     case E_AVR_MACH_AVR25:
2838       strncat (buf, ", avr:25", size);
2839       break;
2840     case E_AVR_MACH_AVR3:
2841       strncat (buf, ", avr:3", size);
2842       break;
2843     case E_AVR_MACH_AVR31:
2844       strncat (buf, ", avr:31", size);
2845       break;
2846     case E_AVR_MACH_AVR35:
2847       strncat (buf, ", avr:35", size);
2848       break;
2849     case E_AVR_MACH_AVR4:
2850       strncat (buf, ", avr:4", size);
2851       break;
2852     case E_AVR_MACH_AVR5:
2853       strncat (buf, ", avr:5", size);
2854       break;
2855     case E_AVR_MACH_AVR51:
2856       strncat (buf, ", avr:51", size);
2857       break;
2858     case E_AVR_MACH_AVR6:
2859       strncat (buf, ", avr:6", size);
2860       break;
2861     case E_AVR_MACH_AVRTINY:
2862       strncat (buf, ", avr:100", size);
2863       break;
2864     case E_AVR_MACH_XMEGA1:
2865       strncat (buf, ", avr:101", size);
2866       break;
2867     case E_AVR_MACH_XMEGA2:
2868       strncat (buf, ", avr:102", size);
2869       break;
2870     case E_AVR_MACH_XMEGA3:
2871       strncat (buf, ", avr:103", size);
2872       break;
2873     case E_AVR_MACH_XMEGA4:
2874       strncat (buf, ", avr:104", size);
2875       break;
2876     case E_AVR_MACH_XMEGA5:
2877       strncat (buf, ", avr:105", size);
2878       break;
2879     case E_AVR_MACH_XMEGA6:
2880       strncat (buf, ", avr:106", size);
2881       break;
2882     case E_AVR_MACH_XMEGA7:
2883       strncat (buf, ", avr:107", size);
2884       break;
2885     default:
2886       strncat (buf, ", avr:<unknown>", size);
2887       break;
2888     }
2889
2890   size -= strlen (buf);
2891   if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2892     strncat (buf, ", link-relax", size);
2893 }
2894
2895 static void
2896 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2897 {
2898   unsigned abi;
2899   unsigned arch;
2900   unsigned config;
2901   unsigned version;
2902   bfd_boolean has_fpu = FALSE;
2903   unsigned int r = 0;
2904
2905   static const char *ABI_STRINGS[] =
2906   {
2907     "ABI v0", /* use r5 as return register; only used in N1213HC */
2908     "ABI v1", /* use r0 as return register */
2909     "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2910     "ABI v2fp", /* for FPU */
2911     "AABI",
2912     "ABI2 FP+"
2913   };
2914   static const char *VER_STRINGS[] =
2915   {
2916     "Andes ELF V1.3 or older",
2917     "Andes ELF V1.3.1",
2918     "Andes ELF V1.4"
2919   };
2920   static const char *ARCH_STRINGS[] =
2921   {
2922     "",
2923     "Andes Star v1.0",
2924     "Andes Star v2.0",
2925     "Andes Star v3.0",
2926     "Andes Star v3.0m"
2927   };
2928
2929   abi = EF_NDS_ABI & e_flags;
2930   arch = EF_NDS_ARCH & e_flags;
2931   config = EF_NDS_INST & e_flags;
2932   version = EF_NDS32_ELF_VERSION & e_flags;
2933
2934   memset (buf, 0, size);
2935
2936   switch (abi)
2937     {
2938     case E_NDS_ABI_V0:
2939     case E_NDS_ABI_V1:
2940     case E_NDS_ABI_V2:
2941     case E_NDS_ABI_V2FP:
2942     case E_NDS_ABI_AABI:
2943     case E_NDS_ABI_V2FP_PLUS:
2944       /* In case there are holes in the array.  */
2945       r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2946       break;
2947
2948     default:
2949       r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2950       break;
2951     }
2952
2953   switch (version)
2954     {
2955     case E_NDS32_ELF_VER_1_2:
2956     case E_NDS32_ELF_VER_1_3:
2957     case E_NDS32_ELF_VER_1_4:
2958       r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2959       break;
2960
2961     default:
2962       r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2963       break;
2964     }
2965
2966   if (E_NDS_ABI_V0 == abi)
2967     {
2968       /* OLD ABI; only used in N1213HC, has performance extension 1.  */
2969       r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2970       if (arch == E_NDS_ARCH_STAR_V1_0)
2971         r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2972       return;
2973     }
2974
2975   switch (arch)
2976     {
2977     case E_NDS_ARCH_STAR_V1_0:
2978     case E_NDS_ARCH_STAR_V2_0:
2979     case E_NDS_ARCH_STAR_V3_0:
2980     case E_NDS_ARCH_STAR_V3_M:
2981       r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2982       break;
2983
2984     default:
2985       r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2986       /* ARCH version determines how the e_flags are interpreted.
2987          If it is unknown, we cannot proceed.  */
2988       return;
2989     }
2990
2991   /* Newer ABI; Now handle architecture specific flags.  */
2992   if (arch == E_NDS_ARCH_STAR_V1_0)
2993     {
2994       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2995         r += snprintf (buf + r, size -r, ", MFUSR_PC");
2996
2997       if (!(config & E_NDS32_HAS_NO_MAC_INST))
2998         r += snprintf (buf + r, size -r, ", MAC");
2999
3000       if (config & E_NDS32_HAS_DIV_INST)
3001         r += snprintf (buf + r, size -r, ", DIV");
3002
3003       if (config & E_NDS32_HAS_16BIT_INST)
3004         r += snprintf (buf + r, size -r, ", 16b");
3005     }
3006   else
3007     {
3008       if (config & E_NDS32_HAS_MFUSR_PC_INST)
3009         {
3010           if (version <= E_NDS32_ELF_VER_1_3)
3011             r += snprintf (buf + r, size -r, ", [B8]");
3012           else
3013             r += snprintf (buf + r, size -r, ", EX9");
3014         }
3015
3016       if (config & E_NDS32_HAS_MAC_DX_INST)
3017         r += snprintf (buf + r, size -r, ", MAC_DX");
3018
3019       if (config & E_NDS32_HAS_DIV_DX_INST)
3020         r += snprintf (buf + r, size -r, ", DIV_DX");
3021
3022       if (config & E_NDS32_HAS_16BIT_INST)
3023         {
3024           if (version <= E_NDS32_ELF_VER_1_3)
3025             r += snprintf (buf + r, size -r, ", 16b");
3026           else
3027             r += snprintf (buf + r, size -r, ", IFC");
3028         }
3029     }
3030
3031   if (config & E_NDS32_HAS_EXT_INST)
3032     r += snprintf (buf + r, size -r, ", PERF1");
3033
3034   if (config & E_NDS32_HAS_EXT2_INST)
3035     r += snprintf (buf + r, size -r, ", PERF2");
3036
3037   if (config & E_NDS32_HAS_FPU_INST)
3038     {
3039       has_fpu = TRUE;
3040       r += snprintf (buf + r, size -r, ", FPU_SP");
3041     }
3042
3043   if (config & E_NDS32_HAS_FPU_DP_INST)
3044     {
3045       has_fpu = TRUE;
3046       r += snprintf (buf + r, size -r, ", FPU_DP");
3047     }
3048
3049   if (config & E_NDS32_HAS_FPU_MAC_INST)
3050     {
3051       has_fpu = TRUE;
3052       r += snprintf (buf + r, size -r, ", FPU_MAC");
3053     }
3054
3055   if (has_fpu)
3056     {
3057       switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
3058         {
3059         case E_NDS32_FPU_REG_8SP_4DP:
3060           r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
3061           break;
3062         case E_NDS32_FPU_REG_16SP_8DP:
3063           r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
3064           break;
3065         case E_NDS32_FPU_REG_32SP_16DP:
3066           r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
3067           break;
3068         case E_NDS32_FPU_REG_32SP_32DP:
3069           r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
3070           break;
3071         }
3072     }
3073
3074   if (config & E_NDS32_HAS_AUDIO_INST)
3075     r += snprintf (buf + r, size -r, ", AUDIO");
3076
3077   if (config & E_NDS32_HAS_STRING_INST)
3078     r += snprintf (buf + r, size -r, ", STR");
3079
3080   if (config & E_NDS32_HAS_REDUCED_REGS)
3081     r += snprintf (buf + r, size -r, ", 16REG");
3082
3083   if (config & E_NDS32_HAS_VIDEO_INST)
3084     {
3085       if (version <= E_NDS32_ELF_VER_1_3)
3086         r += snprintf (buf + r, size -r, ", VIDEO");
3087       else
3088         r += snprintf (buf + r, size -r, ", SATURATION");
3089     }
3090
3091   if (config & E_NDS32_HAS_ENCRIPT_INST)
3092     r += snprintf (buf + r, size -r, ", ENCRP");
3093
3094   if (config & E_NDS32_HAS_L2C_INST)
3095     r += snprintf (buf + r, size -r, ", L2C");
3096 }
3097
3098 static char *
3099 get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine)
3100 {
3101   static char buf[1024];
3102
3103   buf[0] = '\0';
3104
3105   if (e_flags)
3106     {
3107       switch (e_machine)
3108         {
3109         default:
3110           break;
3111
3112         case EM_ARC_COMPACT2:
3113         case EM_ARC_COMPACT:
3114           decode_ARC_machine_flags (e_flags, e_machine, buf);
3115           break;
3116
3117         case EM_ARM:
3118           decode_ARM_machine_flags (e_flags, buf);
3119           break;
3120
3121         case EM_AVR:
3122           decode_AVR_machine_flags (e_flags, buf, sizeof buf);
3123           break;
3124
3125         case EM_BLACKFIN:
3126           if (e_flags & EF_BFIN_PIC)
3127             strcat (buf, ", PIC");
3128
3129           if (e_flags & EF_BFIN_FDPIC)
3130             strcat (buf, ", FDPIC");
3131
3132           if (e_flags & EF_BFIN_CODE_IN_L1)
3133             strcat (buf, ", code in L1");
3134
3135           if (e_flags & EF_BFIN_DATA_IN_L1)
3136             strcat (buf, ", data in L1");
3137
3138           break;
3139
3140         case EM_CYGNUS_FRV:
3141           switch (e_flags & EF_FRV_CPU_MASK)
3142             {
3143             case EF_FRV_CPU_GENERIC:
3144               break;
3145
3146             default:
3147               strcat (buf, ", fr???");
3148               break;
3149
3150             case EF_FRV_CPU_FR300:
3151               strcat (buf, ", fr300");
3152               break;
3153
3154             case EF_FRV_CPU_FR400:
3155               strcat (buf, ", fr400");
3156               break;
3157             case EF_FRV_CPU_FR405:
3158               strcat (buf, ", fr405");
3159               break;
3160
3161             case EF_FRV_CPU_FR450:
3162               strcat (buf, ", fr450");
3163               break;
3164
3165             case EF_FRV_CPU_FR500:
3166               strcat (buf, ", fr500");
3167               break;
3168             case EF_FRV_CPU_FR550:
3169               strcat (buf, ", fr550");
3170               break;
3171
3172             case EF_FRV_CPU_SIMPLE:
3173               strcat (buf, ", simple");
3174               break;
3175             case EF_FRV_CPU_TOMCAT:
3176               strcat (buf, ", tomcat");
3177               break;
3178             }
3179           break;
3180
3181         case EM_68K:
3182           if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
3183             strcat (buf, ", m68000");
3184           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3185             strcat (buf, ", cpu32");
3186           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
3187             strcat (buf, ", fido_a");
3188           else
3189             {
3190               char const * isa = _("unknown");
3191               char const * mac = _("unknown mac");
3192               char const * additional = NULL;
3193
3194               switch (e_flags & EF_M68K_CF_ISA_MASK)
3195                 {
3196                 case EF_M68K_CF_ISA_A_NODIV:
3197                   isa = "A";
3198                   additional = ", nodiv";
3199                   break;
3200                 case EF_M68K_CF_ISA_A:
3201                   isa = "A";
3202                   break;
3203                 case EF_M68K_CF_ISA_A_PLUS:
3204                   isa = "A+";
3205                   break;
3206                 case EF_M68K_CF_ISA_B_NOUSP:
3207                   isa = "B";
3208                   additional = ", nousp";
3209                   break;
3210                 case EF_M68K_CF_ISA_B:
3211                   isa = "B";
3212                   break;
3213                 case EF_M68K_CF_ISA_C:
3214                   isa = "C";
3215                   break;
3216                 case EF_M68K_CF_ISA_C_NODIV:
3217                   isa = "C";
3218                   additional = ", nodiv";
3219                   break;
3220                 }
3221               strcat (buf, ", cf, isa ");
3222               strcat (buf, isa);
3223               if (additional)
3224                 strcat (buf, additional);
3225               if (e_flags & EF_M68K_CF_FLOAT)
3226                 strcat (buf, ", float");
3227               switch (e_flags & EF_M68K_CF_MAC_MASK)
3228                 {
3229                 case 0:
3230                   mac = NULL;
3231                   break;
3232                 case EF_M68K_CF_MAC:
3233                   mac = "mac";
3234                   break;
3235                 case EF_M68K_CF_EMAC:
3236                   mac = "emac";
3237                   break;
3238                 case EF_M68K_CF_EMAC_B:
3239                   mac = "emac_b";
3240                   break;
3241                 }
3242               if (mac)
3243                 {
3244                   strcat (buf, ", ");
3245                   strcat (buf, mac);
3246                 }
3247             }
3248           break;
3249
3250         case EM_CYGNUS_MEP:
3251           switch (e_flags & EF_MEP_CPU_MASK)
3252             {
3253             case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3254             case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3255             case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3256             case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3257             case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3258             case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3259             default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3260             }
3261
3262           switch (e_flags & EF_MEP_COP_MASK)
3263             {
3264             case EF_MEP_COP_NONE: break;
3265             case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3266             case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3267             case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3268             case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3269             default: strcat (buf, _("<unknown MeP copro type>")); break;
3270             }
3271
3272           if (e_flags & EF_MEP_LIBRARY)
3273             strcat (buf, ", Built for Library");
3274
3275           if (e_flags & EF_MEP_INDEX_MASK)
3276             sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3277                      e_flags & EF_MEP_INDEX_MASK);
3278
3279           if (e_flags & ~ EF_MEP_ALL_FLAGS)
3280             sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3281                      e_flags & ~ EF_MEP_ALL_FLAGS);
3282           break;
3283
3284         case EM_PPC:
3285           if (e_flags & EF_PPC_EMB)
3286             strcat (buf, ", emb");
3287
3288           if (e_flags & EF_PPC_RELOCATABLE)
3289             strcat (buf, _(", relocatable"));
3290
3291           if (e_flags & EF_PPC_RELOCATABLE_LIB)
3292             strcat (buf, _(", relocatable-lib"));
3293           break;
3294
3295         case EM_PPC64:
3296           if (e_flags & EF_PPC64_ABI)
3297             {
3298               char abi[] = ", abiv0";
3299
3300               abi[6] += e_flags & EF_PPC64_ABI;
3301               strcat (buf, abi);
3302             }
3303           break;
3304
3305         case EM_V800:
3306           if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3307             strcat (buf, ", RH850 ABI");
3308
3309           if (e_flags & EF_V800_850E3)
3310             strcat (buf, ", V3 architecture");
3311
3312           if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3313             strcat (buf, ", FPU not used");
3314
3315           if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3316             strcat (buf, ", regmode: COMMON");
3317
3318           if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3319             strcat (buf, ", r4 not used");
3320
3321           if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3322             strcat (buf, ", r30 not used");
3323
3324           if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3325             strcat (buf, ", r5 not used");
3326
3327           if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3328             strcat (buf, ", r2 not used");
3329
3330           for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3331             {
3332               switch (e_flags & - e_flags)
3333                 {
3334                 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3335                 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3336                 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3337                 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3338                 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3339                 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3340                 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3341                 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3342                 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3343                 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3344                 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3345                 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3346                 default: break;
3347                 }
3348             }
3349           break;
3350
3351         case EM_V850:
3352         case EM_CYGNUS_V850:
3353           switch (e_flags & EF_V850_ARCH)
3354             {
3355             case E_V850E3V5_ARCH:
3356               strcat (buf, ", v850e3v5");
3357               break;
3358             case E_V850E2V3_ARCH:
3359               strcat (buf, ", v850e2v3");
3360               break;
3361             case E_V850E2_ARCH:
3362               strcat (buf, ", v850e2");
3363               break;
3364             case E_V850E1_ARCH:
3365               strcat (buf, ", v850e1");
3366               break;
3367             case E_V850E_ARCH:
3368               strcat (buf, ", v850e");
3369               break;
3370             case E_V850_ARCH:
3371               strcat (buf, ", v850");
3372               break;
3373             default:
3374               strcat (buf, _(", unknown v850 architecture variant"));
3375               break;
3376             }
3377           break;
3378
3379         case EM_M32R:
3380         case EM_CYGNUS_M32R:
3381           if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3382             strcat (buf, ", m32r");
3383           break;
3384
3385         case EM_MIPS:
3386         case EM_MIPS_RS3_LE:
3387           if (e_flags & EF_MIPS_NOREORDER)
3388             strcat (buf, ", noreorder");
3389
3390           if (e_flags & EF_MIPS_PIC)
3391             strcat (buf, ", pic");
3392
3393           if (e_flags & EF_MIPS_CPIC)
3394             strcat (buf, ", cpic");
3395
3396           if (e_flags & EF_MIPS_UCODE)
3397             strcat (buf, ", ugen_reserved");
3398
3399           if (e_flags & EF_MIPS_ABI2)
3400             strcat (buf, ", abi2");
3401
3402           if (e_flags & EF_MIPS_OPTIONS_FIRST)
3403             strcat (buf, ", odk first");
3404
3405           if (e_flags & EF_MIPS_32BITMODE)
3406             strcat (buf, ", 32bitmode");
3407
3408           if (e_flags & EF_MIPS_NAN2008)
3409             strcat (buf, ", nan2008");
3410
3411           if (e_flags & EF_MIPS_FP64)
3412             strcat (buf, ", fp64");
3413
3414           switch ((e_flags & EF_MIPS_MACH))
3415             {
3416             case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3417             case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3418             case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3419             case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3420             case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3421             case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3422             case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3423             case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3424             case E_MIPS_MACH_5900: strcat (buf, ", 5900"); break;
3425             case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
3426             case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3427             case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3428             case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3429             case E_MIPS_MACH_GS464: strcat (buf, ", gs464"); break;
3430             case E_MIPS_MACH_GS464E: strcat (buf, ", gs464e"); break;
3431             case E_MIPS_MACH_GS264E: strcat (buf, ", gs264e"); break;
3432             case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3433             case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3434             case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3435             case E_MIPS_MACH_XLR:  strcat (buf, ", xlr"); break;
3436             case E_MIPS_MACH_IAMR2:  strcat (buf, ", interaptiv-mr2"); break;
3437             case 0:
3438             /* We simply ignore the field in this case to avoid confusion:
3439                MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3440                extension.  */
3441               break;
3442             default: strcat (buf, _(", unknown CPU")); break;
3443             }
3444
3445           switch ((e_flags & EF_MIPS_ABI))
3446             {
3447             case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3448             case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3449             case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3450             case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3451             case 0:
3452             /* We simply ignore the field in this case to avoid confusion:
3453                MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3454                This means it is likely to be an o32 file, but not for
3455                sure.  */
3456               break;
3457             default: strcat (buf, _(", unknown ABI")); break;
3458             }
3459
3460           if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3461             strcat (buf, ", mdmx");
3462
3463           if (e_flags & EF_MIPS_ARCH_ASE_M16)
3464             strcat (buf, ", mips16");
3465
3466           if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3467             strcat (buf, ", micromips");
3468
3469           switch ((e_flags & EF_MIPS_ARCH))
3470             {
3471             case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3472             case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3473             case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3474             case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3475             case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3476             case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3477             case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3478             case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3479             case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3480             case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3481             case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3482             default: strcat (buf, _(", unknown ISA")); break;
3483             }
3484           break;
3485
3486         case EM_NDS32:
3487           decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3488           break;
3489
3490         case EM_NFP:
3491           switch (EF_NFP_MACH (e_flags))
3492             {
3493             case E_NFP_MACH_3200:
3494               strcat (buf, ", NFP-32xx");
3495               break;
3496             case E_NFP_MACH_6000:
3497               strcat (buf, ", NFP-6xxx");
3498               break;
3499             }
3500           break;
3501
3502         case EM_RISCV:
3503           if (e_flags & EF_RISCV_RVC)
3504             strcat (buf, ", RVC");
3505
3506           if (e_flags & EF_RISCV_RVE)
3507             strcat (buf, ", RVE");
3508
3509           switch (e_flags & EF_RISCV_FLOAT_ABI)
3510             {
3511             case EF_RISCV_FLOAT_ABI_SOFT:
3512               strcat (buf, ", soft-float ABI");
3513               break;
3514
3515             case EF_RISCV_FLOAT_ABI_SINGLE:
3516               strcat (buf, ", single-float ABI");
3517               break;
3518
3519             case EF_RISCV_FLOAT_ABI_DOUBLE:
3520               strcat (buf, ", double-float ABI");
3521               break;
3522
3523             case EF_RISCV_FLOAT_ABI_QUAD:
3524               strcat (buf, ", quad-float ABI");
3525               break;
3526             }
3527           break;
3528
3529         case EM_SH:
3530           switch ((e_flags & EF_SH_MACH_MASK))
3531             {
3532             case EF_SH1: strcat (buf, ", sh1"); break;
3533             case EF_SH2: strcat (buf, ", sh2"); break;
3534             case EF_SH3: strcat (buf, ", sh3"); break;
3535             case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3536             case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3537             case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3538             case EF_SH3E: strcat (buf, ", sh3e"); break;
3539             case EF_SH4: strcat (buf, ", sh4"); break;
3540             case EF_SH5: strcat (buf, ", sh5"); break;
3541             case EF_SH2E: strcat (buf, ", sh2e"); break;
3542             case EF_SH4A: strcat (buf, ", sh4a"); break;
3543             case EF_SH2A: strcat (buf, ", sh2a"); break;
3544             case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3545             case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3546             case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3547             case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3548             case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3549             case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3550             case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3551             case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3552             case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3553             default: strcat (buf, _(", unknown ISA")); break;
3554             }
3555
3556           if (e_flags & EF_SH_PIC)
3557             strcat (buf, ", pic");
3558
3559           if (e_flags & EF_SH_FDPIC)
3560             strcat (buf, ", fdpic");
3561           break;
3562
3563         case EM_OR1K:
3564           if (e_flags & EF_OR1K_NODELAY)
3565             strcat (buf, ", no delay");
3566           break;
3567
3568         case EM_SPARCV9:
3569           if (e_flags & EF_SPARC_32PLUS)
3570             strcat (buf, ", v8+");
3571
3572           if (e_flags & EF_SPARC_SUN_US1)
3573             strcat (buf, ", ultrasparcI");
3574
3575           if (e_flags & EF_SPARC_SUN_US3)
3576             strcat (buf, ", ultrasparcIII");
3577
3578           if (e_flags & EF_SPARC_HAL_R1)
3579             strcat (buf, ", halr1");
3580
3581           if (e_flags & EF_SPARC_LEDATA)
3582             strcat (buf, ", ledata");
3583
3584           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3585             strcat (buf, ", tso");
3586
3587           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3588             strcat (buf, ", pso");
3589
3590           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3591             strcat (buf, ", rmo");
3592           break;
3593
3594         case EM_PARISC:
3595           switch (e_flags & EF_PARISC_ARCH)
3596             {
3597             case EFA_PARISC_1_0:
3598               strcpy (buf, ", PA-RISC 1.0");
3599               break;
3600             case EFA_PARISC_1_1:
3601               strcpy (buf, ", PA-RISC 1.1");
3602               break;
3603             case EFA_PARISC_2_0:
3604               strcpy (buf, ", PA-RISC 2.0");
3605               break;
3606             default:
3607               break;
3608             }
3609           if (e_flags & EF_PARISC_TRAPNIL)
3610             strcat (buf, ", trapnil");
3611           if (e_flags & EF_PARISC_EXT)
3612             strcat (buf, ", ext");
3613           if (e_flags & EF_PARISC_LSB)
3614             strcat (buf, ", lsb");
3615           if (e_flags & EF_PARISC_WIDE)
3616             strcat (buf, ", wide");
3617           if (e_flags & EF_PARISC_NO_KABP)
3618             strcat (buf, ", no kabp");
3619           if (e_flags & EF_PARISC_LAZYSWAP)
3620             strcat (buf, ", lazyswap");
3621           break;
3622
3623         case EM_PJ:
3624         case EM_PJ_OLD:
3625           if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3626             strcat (buf, ", new calling convention");
3627
3628           if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3629             strcat (buf, ", gnu calling convention");
3630           break;
3631
3632         case EM_IA_64:
3633           if ((e_flags & EF_IA_64_ABI64))
3634             strcat (buf, ", 64-bit");
3635           else
3636             strcat (buf, ", 32-bit");
3637           if ((e_flags & EF_IA_64_REDUCEDFP))
3638             strcat (buf, ", reduced fp model");
3639           if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3640             strcat (buf, ", no function descriptors, constant gp");
3641           else if ((e_flags & EF_IA_64_CONS_GP))
3642             strcat (buf, ", constant gp");
3643           if ((e_flags & EF_IA_64_ABSOLUTE))
3644             strcat (buf, ", absolute");
3645           if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3646             {
3647               if ((e_flags & EF_IA_64_VMS_LINKAGES))
3648                 strcat (buf, ", vms_linkages");
3649               switch ((e_flags & EF_IA_64_VMS_COMCOD))
3650                 {
3651                 case EF_IA_64_VMS_COMCOD_SUCCESS:
3652                   break;
3653                 case EF_IA_64_VMS_COMCOD_WARNING:
3654                   strcat (buf, ", warning");
3655                   break;
3656                 case EF_IA_64_VMS_COMCOD_ERROR:
3657                   strcat (buf, ", error");
3658                   break;
3659                 case EF_IA_64_VMS_COMCOD_ABORT:
3660                   strcat (buf, ", abort");
3661                   break;
3662                 default:
3663                   warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3664                         e_flags & EF_IA_64_VMS_COMCOD);
3665                   strcat (buf, ", <unknown>");
3666                 }
3667             }
3668           break;
3669
3670         case EM_VAX:
3671           if ((e_flags & EF_VAX_NONPIC))
3672             strcat (buf, ", non-PIC");
3673           if ((e_flags & EF_VAX_DFLOAT))
3674             strcat (buf, ", D-Float");
3675           if ((e_flags & EF_VAX_GFLOAT))
3676             strcat (buf, ", G-Float");
3677           break;
3678
3679         case EM_VISIUM:
3680           if (e_flags & EF_VISIUM_ARCH_MCM)
3681             strcat (buf, ", mcm");
3682           else if (e_flags & EF_VISIUM_ARCH_MCM24)
3683             strcat (buf, ", mcm24");
3684           if (e_flags & EF_VISIUM_ARCH_GR6)
3685             strcat (buf, ", gr6");
3686           break;
3687
3688         case EM_RL78:
3689           switch (e_flags & E_FLAG_RL78_CPU_MASK)
3690             {
3691             case E_FLAG_RL78_ANY_CPU: break;
3692             case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3693             case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3694             case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3695             }
3696           if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3697             strcat (buf, ", 64-bit doubles");
3698           break;
3699
3700         case EM_RX:
3701           if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3702             strcat (buf, ", 64-bit doubles");
3703           if (e_flags & E_FLAG_RX_DSP)
3704             strcat (buf, ", dsp");
3705           if (e_flags & E_FLAG_RX_PID)
3706             strcat (buf, ", pid");
3707           if (e_flags & E_FLAG_RX_ABI)
3708             strcat (buf, ", RX ABI");
3709           if (e_flags & E_FLAG_RX_SINSNS_SET)
3710             strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3711                     ? ", uses String instructions" : ", bans String instructions");
3712           if (e_flags & E_FLAG_RX_V2)
3713             strcat (buf, ", V2");
3714           if (e_flags & E_FLAG_RX_V3)
3715             strcat (buf, ", V3");
3716           break;
3717
3718         case EM_S390:
3719           if (e_flags & EF_S390_HIGH_GPRS)
3720             strcat (buf, ", highgprs");
3721           break;
3722
3723         case EM_TI_C6000:
3724           if ((e_flags & EF_C6000_REL))
3725             strcat (buf, ", relocatable module");
3726           break;
3727
3728         case EM_MSP430:
3729           strcat (buf, _(": architecture variant: "));
3730           switch (e_flags & EF_MSP430_MACH)
3731             {
3732             case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3733             case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3734             case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3735             case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3736             case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3737             case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3738             case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3739             case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3740             case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3741             case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3742             case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3743             case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3744             case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3745             case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3746             case E_MSP430_MACH_MSP430X  : strcat (buf, "MSP430X"); break;
3747             default:
3748               strcat (buf, _(": unknown")); break;
3749             }
3750
3751           if (e_flags & ~ EF_MSP430_MACH)
3752             strcat (buf, _(": unknown extra flag bits also present"));
3753         }
3754     }
3755
3756   return buf;
3757 }
3758
3759 static const char *
3760 get_osabi_name (Filedata * filedata, unsigned int osabi)
3761 {
3762   static char buff[32];
3763
3764   switch (osabi)
3765     {
3766     case ELFOSABI_NONE:         return "UNIX - System V";
3767     case ELFOSABI_HPUX:         return "UNIX - HP-UX";
3768     case ELFOSABI_NETBSD:       return "UNIX - NetBSD";
3769     case ELFOSABI_GNU:          return "UNIX - GNU";
3770     case ELFOSABI_SOLARIS:      return "UNIX - Solaris";
3771     case ELFOSABI_AIX:          return "UNIX - AIX";
3772     case ELFOSABI_IRIX:         return "UNIX - IRIX";
3773     case ELFOSABI_FREEBSD:      return "UNIX - FreeBSD";
3774     case ELFOSABI_TRU64:        return "UNIX - TRU64";
3775     case ELFOSABI_MODESTO:      return "Novell - Modesto";
3776     case ELFOSABI_OPENBSD:      return "UNIX - OpenBSD";
3777     case ELFOSABI_OPENVMS:      return "VMS - OpenVMS";
3778     case ELFOSABI_NSK:          return "HP - Non-Stop Kernel";
3779     case ELFOSABI_AROS:         return "AROS";
3780     case ELFOSABI_FENIXOS:      return "FenixOS";
3781     case ELFOSABI_CLOUDABI:     return "Nuxi CloudABI";
3782     case ELFOSABI_OPENVOS:      return "Stratus Technologies OpenVOS";
3783     default:
3784       if (osabi >= 64)
3785         switch (filedata->file_header.e_machine)
3786           {
3787           case EM_ARM:
3788             switch (osabi)
3789               {
3790               case ELFOSABI_ARM:        return "ARM";
3791               case ELFOSABI_ARM_FDPIC:  return "ARM FDPIC";
3792               default:
3793                 break;
3794               }
3795             break;
3796
3797           case EM_MSP430:
3798           case EM_MSP430_OLD:
3799           case EM_VISIUM:
3800             switch (osabi)
3801               {
3802               case ELFOSABI_STANDALONE: return _("Standalone App");
3803               default:
3804                 break;
3805               }
3806             break;
3807
3808           case EM_TI_C6000:
3809             switch (osabi)
3810               {
3811               case ELFOSABI_C6000_ELFABI:       return _("Bare-metal C6000");
3812               case ELFOSABI_C6000_LINUX:        return "Linux C6000";
3813               default:
3814                 break;
3815               }
3816             break;
3817
3818           default:
3819             break;
3820           }
3821       snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3822       return buff;
3823     }
3824 }
3825
3826 static const char *
3827 get_aarch64_segment_type (unsigned long type)
3828 {
3829   switch (type)
3830     {
3831     case PT_AARCH64_ARCHEXT:  return "AARCH64_ARCHEXT";
3832     default:                  return NULL;
3833     }
3834 }
3835
3836 static const char *
3837 get_arm_segment_type (unsigned long type)
3838 {
3839   switch (type)
3840     {
3841     case PT_ARM_EXIDX: return "EXIDX";
3842     default:           return NULL;
3843     }
3844 }
3845
3846 static const char *
3847 get_s390_segment_type (unsigned long type)
3848 {
3849   switch (type)
3850     {
3851     case PT_S390_PGSTE: return "S390_PGSTE";
3852     default:            return NULL;
3853     }
3854 }
3855
3856 static const char *
3857 get_mips_segment_type (unsigned long type)
3858 {
3859   switch (type)
3860     {
3861     case PT_MIPS_REGINFO:   return "REGINFO";
3862     case PT_MIPS_RTPROC:    return "RTPROC";
3863     case PT_MIPS_OPTIONS:   return "OPTIONS";
3864     case PT_MIPS_ABIFLAGS:  return "ABIFLAGS";
3865     default:                return NULL;
3866     }
3867 }
3868
3869 static const char *
3870 get_parisc_segment_type (unsigned long type)
3871 {
3872   switch (type)
3873     {
3874     case PT_HP_TLS:             return "HP_TLS";
3875     case PT_HP_CORE_NONE:       return "HP_CORE_NONE";
3876     case PT_HP_CORE_VERSION:    return "HP_CORE_VERSION";
3877     case PT_HP_CORE_KERNEL:     return "HP_CORE_KERNEL";
3878     case PT_HP_CORE_COMM:       return "HP_CORE_COMM";
3879     case PT_HP_CORE_PROC:       return "HP_CORE_PROC";
3880     case PT_HP_CORE_LOADABLE:   return "HP_CORE_LOADABLE";
3881     case PT_HP_CORE_STACK:      return "HP_CORE_STACK";
3882     case PT_HP_CORE_SHM:        return "HP_CORE_SHM";
3883     case PT_HP_CORE_MMF:        return "HP_CORE_MMF";
3884     case PT_HP_PARALLEL:        return "HP_PARALLEL";
3885     case PT_HP_FASTBIND:        return "HP_FASTBIND";
3886     case PT_HP_OPT_ANNOT:       return "HP_OPT_ANNOT";
3887     case PT_HP_HSL_ANNOT:       return "HP_HSL_ANNOT";
3888     case PT_HP_STACK:           return "HP_STACK";
3889     case PT_HP_CORE_UTSNAME:    return "HP_CORE_UTSNAME";
3890     case PT_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
3891     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
3892     case PT_PARISC_WEAKORDER:   return "PARISC_WEAKORDER";
3893     default:                    return NULL;
3894     }
3895 }
3896
3897 static const char *
3898 get_ia64_segment_type (unsigned long type)
3899 {
3900   switch (type)
3901     {
3902     case PT_IA_64_ARCHEXT:      return "IA_64_ARCHEXT";
3903     case PT_IA_64_UNWIND:       return "IA_64_UNWIND";
3904     case PT_HP_TLS:             return "HP_TLS";
3905     case PT_IA_64_HP_OPT_ANOT:  return "HP_OPT_ANNOT";
3906     case PT_IA_64_HP_HSL_ANOT:  return "HP_HSL_ANNOT";
3907     case PT_IA_64_HP_STACK:     return "HP_STACK";
3908     default:                    return NULL;
3909     }
3910 }
3911
3912 static const char *
3913 get_tic6x_segment_type (unsigned long type)
3914 {
3915   switch (type)
3916     {
3917     case PT_C6000_PHATTR:  return "C6000_PHATTR";
3918     default:               return NULL;
3919     }
3920 }
3921
3922 static const char *
3923 get_solaris_segment_type (unsigned long type)
3924 {
3925   switch (type)
3926     {
3927     case 0x6464e550: return "PT_SUNW_UNWIND";
3928     case 0x6474e550: return "PT_SUNW_EH_FRAME";
3929     case 0x6ffffff7: return "PT_LOSUNW";
3930     case 0x6ffffffa: return "PT_SUNWBSS";
3931     case 0x6ffffffb: return "PT_SUNWSTACK";
3932     case 0x6ffffffc: return "PT_SUNWDTRACE";
3933     case 0x6ffffffd: return "PT_SUNWCAP";
3934     case 0x6fffffff: return "PT_HISUNW";
3935     default:         return NULL;
3936     }
3937 }
3938
3939 static const char *
3940 get_segment_type (Filedata * filedata, unsigned long p_type)
3941 {
3942   static char buff[32];
3943
3944   switch (p_type)
3945     {
3946     case PT_NULL:       return "NULL";
3947     case PT_LOAD:       return "LOAD";
3948     case PT_DYNAMIC:    return "DYNAMIC";
3949     case PT_INTERP:     return "INTERP";
3950     case PT_NOTE:       return "NOTE";
3951     case PT_SHLIB:      return "SHLIB";
3952     case PT_PHDR:       return "PHDR";
3953     case PT_TLS:        return "TLS";
3954     case PT_GNU_EH_FRAME: return "GNU_EH_FRAME";
3955     case PT_GNU_STACK:  return "GNU_STACK";
3956     case PT_GNU_RELRO:  return "GNU_RELRO";
3957     case PT_GNU_PROPERTY: return "GNU_PROPERTY";
3958
3959     default:
3960       if (p_type >= PT_GNU_MBIND_LO && p_type <= PT_GNU_MBIND_HI)
3961         {
3962           sprintf (buff, "GNU_MBIND+%#lx",
3963                    p_type - PT_GNU_MBIND_LO);
3964         }
3965       else if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3966         {
3967           const char * result;
3968
3969           switch (filedata->file_header.e_machine)
3970             {
3971             case EM_AARCH64:
3972               result = get_aarch64_segment_type (p_type);
3973               break;
3974             case EM_ARM:
3975               result = get_arm_segment_type (p_type);
3976               break;
3977             case EM_MIPS:
3978             case EM_MIPS_RS3_LE:
3979               result = get_mips_segment_type (p_type);
3980               break;
3981             case EM_PARISC:
3982               result = get_parisc_segment_type (p_type);
3983               break;
3984             case EM_IA_64:
3985               result = get_ia64_segment_type (p_type);
3986               break;
3987             case EM_TI_C6000:
3988               result = get_tic6x_segment_type (p_type);
3989               break;
3990             case EM_S390:
3991             case EM_S390_OLD:
3992               result = get_s390_segment_type (p_type);
3993               break;
3994             default:
3995               result = NULL;
3996               break;
3997             }
3998
3999           if (result != NULL)
4000             return result;
4001
4002           sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
4003         }
4004       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
4005         {
4006           const char * result;
4007
4008           switch (filedata->file_header.e_machine)
4009             {
4010             case EM_PARISC:
4011               result = get_parisc_segment_type (p_type);
4012               break;
4013             case EM_IA_64:
4014               result = get_ia64_segment_type (p_type);
4015               break;
4016             default:
4017               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4018                 result = get_solaris_segment_type (p_type);
4019               else
4020                 result = NULL;
4021               break;
4022             }
4023
4024           if (result != NULL)
4025             return result;
4026
4027           sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
4028         }
4029       else
4030         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
4031
4032       return buff;
4033     }
4034 }
4035
4036 static const char *
4037 get_arc_section_type_name (unsigned int sh_type)
4038 {
4039   switch (sh_type)
4040     {
4041     case SHT_ARC_ATTRIBUTES:      return "ARC_ATTRIBUTES";
4042     default:
4043       break;
4044     }
4045   return NULL;
4046 }
4047
4048 static const char *
4049 get_mips_section_type_name (unsigned int sh_type)
4050 {
4051   switch (sh_type)
4052     {
4053     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
4054     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
4055     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
4056     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
4057     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
4058     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
4059     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
4060     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
4061     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
4062     case SHT_MIPS_RELD:          return "MIPS_RELD";
4063     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
4064     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
4065     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
4066     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
4067     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
4068     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
4069     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
4070     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
4071     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
4072     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
4073     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
4074     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
4075     case SHT_MIPS_LINE:          return "MIPS_LINE";
4076     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
4077     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
4078     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
4079     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
4080     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
4081     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
4082     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
4083     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
4084     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
4085     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
4086     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
4087     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
4088     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
4089     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
4090     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
4091     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
4092     case SHT_MIPS_ABIFLAGS:      return "MIPS_ABIFLAGS";
4093     default:
4094       break;
4095     }
4096   return NULL;
4097 }
4098
4099 static const char *
4100 get_parisc_section_type_name (unsigned int sh_type)
4101 {
4102   switch (sh_type)
4103     {
4104     case SHT_PARISC_EXT:        return "PARISC_EXT";
4105     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
4106     case SHT_PARISC_DOC:        return "PARISC_DOC";
4107     case SHT_PARISC_ANNOT:      return "PARISC_ANNOT";
4108     case SHT_PARISC_SYMEXTN:    return "PARISC_SYMEXTN";
4109     case SHT_PARISC_STUBS:      return "PARISC_STUBS";
4110     case SHT_PARISC_DLKM:       return "PARISC_DLKM";
4111     default:                    return NULL;
4112     }
4113 }
4114
4115 static const char *
4116 get_ia64_section_type_name (Filedata * filedata, unsigned int sh_type)
4117 {
4118   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
4119   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
4120     return get_osabi_name (filedata, (sh_type & 0x00FF0000) >> 16);
4121
4122   switch (sh_type)
4123     {
4124     case SHT_IA_64_EXT:                return "IA_64_EXT";
4125     case SHT_IA_64_UNWIND:             return "IA_64_UNWIND";
4126     case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
4127     case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
4128     case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
4129     case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
4130     case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
4131     case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
4132     case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
4133     case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
4134     default:
4135       break;
4136     }
4137   return NULL;
4138 }
4139
4140 static const char *
4141 get_x86_64_section_type_name (unsigned int sh_type)
4142 {
4143   switch (sh_type)
4144     {
4145     case SHT_X86_64_UNWIND:     return "X86_64_UNWIND";
4146     default:                    return NULL;
4147     }
4148 }
4149
4150 static const char *
4151 get_aarch64_section_type_name (unsigned int sh_type)
4152 {
4153   switch (sh_type)
4154     {
4155     case SHT_AARCH64_ATTRIBUTES: return "AARCH64_ATTRIBUTES";
4156     default:                     return NULL;
4157     }
4158 }
4159
4160 static const char *
4161 get_arm_section_type_name (unsigned int sh_type)
4162 {
4163   switch (sh_type)
4164     {
4165     case SHT_ARM_EXIDX:           return "ARM_EXIDX";
4166     case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
4167     case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
4168     case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
4169     case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
4170     default:                      return NULL;
4171     }
4172 }
4173
4174 static const char *
4175 get_tic6x_section_type_name (unsigned int sh_type)
4176 {
4177   switch (sh_type)
4178     {
4179     case SHT_C6000_UNWIND:      return "C6000_UNWIND";
4180     case SHT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
4181     case SHT_C6000_ATTRIBUTES:  return "C6000_ATTRIBUTES";
4182     case SHT_TI_ICODE:          return "TI_ICODE";
4183     case SHT_TI_XREF:           return "TI_XREF";
4184     case SHT_TI_HANDLER:        return "TI_HANDLER";
4185     case SHT_TI_INITINFO:       return "TI_INITINFO";
4186     case SHT_TI_PHATTRS:        return "TI_PHATTRS";
4187     default:                    return NULL;
4188     }
4189 }
4190
4191 static const char *
4192 get_msp430x_section_type_name (unsigned int sh_type)
4193 {
4194   switch (sh_type)
4195     {
4196     case SHT_MSP430_SEC_FLAGS:    return "MSP430_SEC_FLAGS";
4197     case SHT_MSP430_SYM_ALIASES:  return "MSP430_SYM_ALIASES";
4198     case SHT_MSP430_ATTRIBUTES:   return "MSP430_ATTRIBUTES";
4199     default:                      return NULL;
4200     }
4201 }
4202
4203 static const char *
4204 get_nfp_section_type_name (unsigned int sh_type)
4205 {
4206   switch (sh_type)
4207     {
4208     case SHT_NFP_MECONFIG:      return "NFP_MECONFIG";
4209     case SHT_NFP_INITREG:       return "NFP_INITREG";
4210     case SHT_NFP_UDEBUG:        return "NFP_UDEBUG";
4211     default:                    return NULL;
4212     }
4213 }
4214
4215 static const char *
4216 get_v850_section_type_name (unsigned int sh_type)
4217 {
4218   switch (sh_type)
4219     {
4220     case SHT_V850_SCOMMON:  return "V850 Small Common";
4221     case SHT_V850_TCOMMON:  return "V850 Tiny Common";
4222     case SHT_V850_ZCOMMON:  return "V850 Zero Common";
4223     case SHT_RENESAS_IOP:   return "RENESAS IOP";
4224     case SHT_RENESAS_INFO:  return "RENESAS INFO";
4225     default:                return NULL;
4226     }
4227 }
4228
4229 static const char *
4230 get_riscv_section_type_name (unsigned int sh_type)
4231 {
4232   switch (sh_type)
4233     {
4234     case SHT_RISCV_ATTRIBUTES:  return "RISCV_ATTRIBUTES";
4235     default: return NULL;
4236     }
4237 }
4238
4239 static const char *
4240 get_section_type_name (Filedata * filedata, unsigned int sh_type)
4241 {
4242   static char buff[32];
4243   const char * result;
4244
4245   switch (sh_type)
4246     {
4247     case SHT_NULL:              return "NULL";
4248     case SHT_PROGBITS:          return "PROGBITS";
4249     case SHT_SYMTAB:            return "SYMTAB";
4250     case SHT_STRTAB:            return "STRTAB";
4251     case SHT_RELA:              return "RELA";
4252     case SHT_HASH:              return "HASH";
4253     case SHT_DYNAMIC:           return "DYNAMIC";
4254     case SHT_NOTE:              return "NOTE";
4255     case SHT_NOBITS:            return "NOBITS";
4256     case SHT_REL:               return "REL";
4257     case SHT_SHLIB:             return "SHLIB";
4258     case SHT_DYNSYM:            return "DYNSYM";
4259     case SHT_INIT_ARRAY:        return "INIT_ARRAY";
4260     case SHT_FINI_ARRAY:        return "FINI_ARRAY";
4261     case SHT_PREINIT_ARRAY:     return "PREINIT_ARRAY";
4262     case SHT_GNU_HASH:          return "GNU_HASH";
4263     case SHT_GROUP:             return "GROUP";
4264     case SHT_SYMTAB_SHNDX:      return "SYMTAB SECTION INDICES";
4265     case SHT_GNU_verdef:        return "VERDEF";
4266     case SHT_GNU_verneed:       return "VERNEED";
4267     case SHT_GNU_versym:        return "VERSYM";
4268     case 0x6ffffff0:            return "VERSYM";
4269     case 0x6ffffffc:            return "VERDEF";
4270     case 0x7ffffffd:            return "AUXILIARY";
4271     case 0x7fffffff:            return "FILTER";
4272     case SHT_GNU_LIBLIST:       return "GNU_LIBLIST";
4273
4274     default:
4275       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4276         {
4277           switch (filedata->file_header.e_machine)
4278             {
4279             case EM_ARC:
4280             case EM_ARC_COMPACT:
4281             case EM_ARC_COMPACT2:
4282               result = get_arc_section_type_name (sh_type);
4283               break;
4284             case EM_MIPS:
4285             case EM_MIPS_RS3_LE:
4286               result = get_mips_section_type_name (sh_type);
4287               break;
4288             case EM_PARISC:
4289               result = get_parisc_section_type_name (sh_type);
4290               break;
4291             case EM_IA_64:
4292               result = get_ia64_section_type_name (filedata, sh_type);
4293               break;
4294             case EM_X86_64:
4295             case EM_L1OM:
4296             case EM_K1OM:
4297               result = get_x86_64_section_type_name (sh_type);
4298               break;
4299             case EM_AARCH64:
4300               result = get_aarch64_section_type_name (sh_type);
4301               break;
4302             case EM_ARM:
4303               result = get_arm_section_type_name (sh_type);
4304               break;
4305             case EM_TI_C6000:
4306               result = get_tic6x_section_type_name (sh_type);
4307               break;
4308             case EM_MSP430:
4309               result = get_msp430x_section_type_name (sh_type);
4310               break;
4311             case EM_NFP:
4312               result = get_nfp_section_type_name (sh_type);
4313               break;
4314             case EM_V800:
4315             case EM_V850:
4316             case EM_CYGNUS_V850:
4317               result = get_v850_section_type_name (sh_type);
4318               break;
4319             case EM_RISCV:
4320               result = get_riscv_section_type_name (sh_type);
4321               break;
4322             default:
4323               result = NULL;
4324               break;
4325             }
4326
4327           if (result != NULL)
4328             return result;
4329
4330           sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4331         }
4332       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4333         {
4334           switch (filedata->file_header.e_machine)
4335             {
4336             case EM_IA_64:
4337               result = get_ia64_section_type_name (filedata, sh_type);
4338               break;
4339             default:
4340               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4341                 result = get_solaris_section_type (sh_type);
4342               else
4343                 {
4344                   switch (sh_type)
4345                     {
4346                     case SHT_GNU_INCREMENTAL_INPUTS: result = "GNU_INCREMENTAL_INPUTS"; break;
4347                     case SHT_GNU_ATTRIBUTES: result = "GNU_ATTRIBUTES"; break;
4348                     case SHT_GNU_HASH: result = "GNU_HASH"; break;
4349                     case SHT_GNU_LIBLIST: result = "GNU_LIBLIST"; break;
4350                     default:
4351                       result = NULL;
4352                       break;
4353                     }
4354                 }
4355               break;
4356             }
4357
4358           if (result != NULL)
4359             return result;
4360
4361           sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4362         }
4363       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4364         {
4365           switch (filedata->file_header.e_machine)
4366             {
4367             case EM_V800:
4368             case EM_V850:
4369             case EM_CYGNUS_V850:
4370               result = get_v850_section_type_name (sh_type);
4371               break;
4372             default:
4373               result = NULL;
4374               break;
4375             }
4376
4377           if (result != NULL)
4378             return result;
4379
4380           sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4381         }
4382       else
4383         /* This message is probably going to be displayed in a 15
4384            character wide field, so put the hex value first.  */
4385         snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4386
4387       return buff;
4388     }
4389 }
4390
4391 #define OPTION_DEBUG_DUMP       512
4392 #define OPTION_DYN_SYMS         513
4393 #define OPTION_DWARF_DEPTH      514
4394 #define OPTION_DWARF_START      515
4395 #define OPTION_DWARF_CHECK      516
4396
4397 static struct option options[] =
4398 {
4399   {"all",              no_argument, 0, 'a'},
4400   {"file-header",      no_argument, 0, 'h'},
4401   {"program-headers",  no_argument, 0, 'l'},
4402   {"headers",          no_argument, 0, 'e'},
4403   {"histogram",        no_argument, 0, 'I'},
4404   {"segments",         no_argument, 0, 'l'},
4405   {"sections",         no_argument, 0, 'S'},
4406   {"section-headers",  no_argument, 0, 'S'},
4407   {"section-groups",   no_argument, 0, 'g'},
4408   {"section-details",  no_argument, 0, 't'},
4409   {"full-section-name",no_argument, 0, 'N'},
4410   {"symbols",          no_argument, 0, 's'},
4411   {"syms",             no_argument, 0, 's'},
4412   {"dyn-syms",         no_argument, 0, OPTION_DYN_SYMS},
4413   {"relocs",           no_argument, 0, 'r'},
4414   {"notes",            no_argument, 0, 'n'},
4415   {"dynamic",          no_argument, 0, 'd'},
4416   {"arch-specific",    no_argument, 0, 'A'},
4417   {"version-info",     no_argument, 0, 'V'},
4418   {"use-dynamic",      no_argument, 0, 'D'},
4419   {"unwind",           no_argument, 0, 'u'},
4420   {"archive-index",    no_argument, 0, 'c'},
4421   {"hex-dump",         required_argument, 0, 'x'},
4422   {"relocated-dump",   required_argument, 0, 'R'},
4423   {"string-dump",      required_argument, 0, 'p'},
4424   {"decompress",       no_argument, 0, 'z'},
4425 #ifdef SUPPORT_DISASSEMBLY
4426   {"instruction-dump", required_argument, 0, 'i'},
4427 #endif
4428   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
4429
4430   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
4431   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
4432   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
4433
4434   {"version",          no_argument, 0, 'v'},
4435   {"wide",             no_argument, 0, 'W'},
4436   {"help",             no_argument, 0, 'H'},
4437   {0,                  no_argument, 0, 0}
4438 };
4439
4440 static void
4441 usage (FILE * stream)
4442 {
4443   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4444   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4445   fprintf (stream, _(" Options are:\n\
4446   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4447   -h --file-header       Display the ELF file header\n\
4448   -l --program-headers   Display the program headers\n\
4449      --segments          An alias for --program-headers\n\
4450   -S --section-headers   Display the sections' header\n\
4451      --sections          An alias for --section-headers\n\
4452   -g --section-groups    Display the section groups\n\
4453   -t --section-details   Display the section details\n\
4454   -e --headers           Equivalent to: -h -l -S\n\
4455   -s --syms              Display the symbol table\n\
4456      --symbols           An alias for --syms\n\
4457   --dyn-syms             Display the dynamic symbol table\n\
4458   -n --notes             Display the core notes (if present)\n\
4459   -r --relocs            Display the relocations (if present)\n\
4460   -u --unwind            Display the unwind info (if present)\n\
4461   -d --dynamic           Display the dynamic section (if present)\n\
4462   -V --version-info      Display the version sections (if present)\n\
4463   -A --arch-specific     Display architecture specific information (if any)\n\
4464   -c --archive-index     Display the symbol/file index in an archive\n\
4465   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
4466   -x --hex-dump=<number|name>\n\
4467                          Dump the contents of section <number|name> as bytes\n\
4468   -p --string-dump=<number|name>\n\
4469                          Dump the contents of section <number|name> as strings\n\
4470   -R --relocated-dump=<number|name>\n\
4471                          Dump the contents of section <number|name> as relocated bytes\n\
4472   -z --decompress        Decompress section before dumping it\n\
4473   -w[lLiaprmfFsoRtUuTgAckK] or\n\
4474   --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4475                =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4476                =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4477                =addr,=cu_index,=links,=follow-links]\n\
4478                          Display the contents of DWARF debug sections\n"));
4479   fprintf (stream, _("\
4480   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
4481   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
4482                          or deeper\n"));
4483 #ifdef SUPPORT_DISASSEMBLY
4484   fprintf (stream, _("\
4485   -i --instruction-dump=<number|name>\n\
4486                          Disassemble the contents of section <number|name>\n"));
4487 #endif
4488   fprintf (stream, _("\
4489   -I --histogram         Display histogram of bucket list lengths\n\
4490   -W --wide              Allow output width to exceed 80 characters\n\
4491   @<file>                Read options from <file>\n\
4492   -H --help              Display this information\n\
4493   -v --version           Display the version number of readelf\n"));
4494
4495   if (REPORT_BUGS_TO[0] && stream == stdout)
4496     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4497
4498   exit (stream == stdout ? 0 : 1);
4499 }
4500
4501 /* Record the fact that the user wants the contents of section number
4502    SECTION to be displayed using the method(s) encoded as flags bits
4503    in TYPE.  Note, TYPE can be zero if we are creating the array for
4504    the first time.  */
4505
4506 static void
4507 request_dump_bynumber (Filedata * filedata, unsigned int section, dump_type type)
4508 {
4509   if (section >= filedata->num_dump_sects)
4510     {
4511       dump_type * new_dump_sects;
4512
4513       new_dump_sects = (dump_type *) calloc (section + 1,
4514                                              sizeof (* new_dump_sects));
4515
4516       if (new_dump_sects == NULL)
4517         error (_("Out of memory allocating dump request table.\n"));
4518       else
4519         {
4520           if (filedata->dump_sects)
4521             {
4522               /* Copy current flag settings.  */
4523               memcpy (new_dump_sects, filedata->dump_sects,
4524                       filedata->num_dump_sects * sizeof (* new_dump_sects));
4525
4526               free (filedata->dump_sects);
4527             }
4528
4529           filedata->dump_sects = new_dump_sects;
4530           filedata->num_dump_sects = section + 1;
4531         }
4532     }
4533
4534   if (filedata->dump_sects)
4535     filedata->dump_sects[section] |= type;
4536 }
4537
4538 /* Request a dump by section name.  */
4539
4540 static void
4541 request_dump_byname (const char * section, dump_type type)
4542 {
4543   struct dump_list_entry * new_request;
4544
4545   new_request = (struct dump_list_entry *)
4546       malloc (sizeof (struct dump_list_entry));
4547   if (!new_request)
4548     error (_("Out of memory allocating dump request table.\n"));
4549
4550   new_request->name = strdup (section);
4551   if (!new_request->name)
4552     error (_("Out of memory allocating dump request table.\n"));
4553
4554   new_request->type = type;
4555
4556   new_request->next = dump_sects_byname;
4557   dump_sects_byname = new_request;
4558 }
4559
4560 static inline void
4561 request_dump (Filedata * filedata, dump_type type)
4562 {
4563   int section;
4564   char * cp;
4565
4566   do_dump++;
4567   section = strtoul (optarg, & cp, 0);
4568
4569   if (! *cp && section >= 0)
4570     request_dump_bynumber (filedata, section, type);
4571   else
4572     request_dump_byname (optarg, type);
4573 }
4574
4575 static void
4576 parse_args (Filedata * filedata, int argc, char ** argv)
4577 {
4578   int c;
4579
4580   if (argc < 2)
4581     usage (stderr);
4582
4583   while ((c = getopt_long
4584           (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4585     {
4586       switch (c)
4587         {
4588         case 0:
4589           /* Long options.  */
4590           break;
4591         case 'H':
4592           usage (stdout);
4593           break;
4594
4595         case 'a':
4596           do_syms = TRUE;
4597           do_reloc = TRUE;
4598           do_unwind = TRUE;
4599           do_dynamic = TRUE;
4600           do_header = TRUE;
4601           do_sections = TRUE;
4602           do_section_groups = TRUE;
4603           do_segments = TRUE;
4604           do_version = TRUE;
4605           do_histogram = TRUE;
4606           do_arch = TRUE;
4607           do_notes = TRUE;
4608           break;
4609         case 'g':
4610           do_section_groups = TRUE;
4611           break;
4612         case 't':
4613         case 'N':
4614           do_sections = TRUE;
4615           do_section_details = TRUE;
4616           break;
4617         case 'e':
4618           do_header = TRUE;
4619           do_sections = TRUE;
4620           do_segments = TRUE;
4621           break;
4622         case 'A':
4623           do_arch = TRUE;
4624           break;
4625         case 'D':
4626           do_using_dynamic = TRUE;
4627           break;
4628         case 'r':
4629           do_reloc = TRUE;
4630           break;
4631         case 'u':
4632           do_unwind = TRUE;
4633           break;
4634         case 'h':
4635           do_header = TRUE;
4636           break;
4637         case 'l':
4638           do_segments = TRUE;
4639           break;
4640         case 's':
4641           do_syms = TRUE;
4642           break;
4643         case 'S':
4644           do_sections = TRUE;
4645           break;
4646         case 'd':
4647           do_dynamic = TRUE;
4648           break;
4649         case 'I':
4650           do_histogram = TRUE;
4651           break;
4652         case 'n':
4653           do_notes = TRUE;
4654           break;
4655         case 'c':
4656           do_archive_index = TRUE;
4657           break;
4658         case 'x':
4659           request_dump (filedata, HEX_DUMP);
4660           break;
4661         case 'p':
4662           request_dump (filedata, STRING_DUMP);
4663           break;
4664         case 'R':
4665           request_dump (filedata, RELOC_DUMP);
4666           break;
4667         case 'z':
4668           decompress_dumps = TRUE;
4669           break;
4670         case 'w':
4671           do_dump = TRUE;
4672           if (optarg == 0)
4673             {
4674               do_debugging = TRUE;
4675               dwarf_select_sections_all ();
4676             }
4677           else
4678             {
4679               do_debugging = FALSE;
4680               dwarf_select_sections_by_letters (optarg);
4681             }
4682           break;
4683         case OPTION_DEBUG_DUMP:
4684           do_dump = TRUE;
4685           if (optarg == 0)
4686             do_debugging = TRUE;
4687           else
4688             {
4689               do_debugging = FALSE;
4690               dwarf_select_sections_by_names (optarg);
4691             }
4692           break;
4693         case OPTION_DWARF_DEPTH:
4694           {
4695             char *cp;
4696
4697             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4698           }
4699           break;
4700         case OPTION_DWARF_START:
4701           {
4702             char *cp;
4703
4704             dwarf_start_die = strtoul (optarg, & cp, 0);
4705           }
4706           break;
4707         case OPTION_DWARF_CHECK:
4708           dwarf_check = TRUE;
4709           break;
4710         case OPTION_DYN_SYMS:
4711           do_dyn_syms = TRUE;
4712           break;
4713 #ifdef SUPPORT_DISASSEMBLY
4714         case 'i':
4715           request_dump (filedata, DISASS_DUMP);
4716           break;
4717 #endif
4718         case 'v':
4719           print_version (program_name);
4720           break;
4721         case 'V':
4722           do_version = TRUE;
4723           break;
4724         case 'W':
4725           do_wide = TRUE;
4726           break;
4727         default:
4728           /* xgettext:c-format */
4729           error (_("Invalid option '-%c'\n"), c);
4730           /* Fall through.  */
4731         case '?':
4732           usage (stderr);
4733         }
4734     }
4735
4736   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4737       && !do_segments && !do_header && !do_dump && !do_version
4738       && !do_histogram && !do_debugging && !do_arch && !do_notes
4739       && !do_section_groups && !do_archive_index
4740       && !do_dyn_syms)
4741     usage (stderr);
4742 }
4743
4744 static const char *
4745 get_elf_class (unsigned int elf_class)
4746 {
4747   static char buff[32];
4748
4749   switch (elf_class)
4750     {
4751     case ELFCLASSNONE: return _("none");
4752     case ELFCLASS32:   return "ELF32";
4753     case ELFCLASS64:   return "ELF64";
4754     default:
4755       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4756       return buff;
4757     }
4758 }
4759
4760 static const char *
4761 get_data_encoding (unsigned int encoding)
4762 {
4763   static char buff[32];
4764
4765   switch (encoding)
4766     {
4767     case ELFDATANONE: return _("none");
4768     case ELFDATA2LSB: return _("2's complement, little endian");
4769     case ELFDATA2MSB: return _("2's complement, big endian");
4770     default:
4771       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4772       return buff;
4773     }
4774 }
4775
4776 /* Decode the data held in 'filedata->file_header'.  */
4777
4778 static bfd_boolean
4779 process_file_header (Filedata * filedata)
4780 {
4781   Elf_Internal_Ehdr * header = & filedata->file_header;
4782
4783   if (   header->e_ident[EI_MAG0] != ELFMAG0
4784       || header->e_ident[EI_MAG1] != ELFMAG1
4785       || header->e_ident[EI_MAG2] != ELFMAG2
4786       || header->e_ident[EI_MAG3] != ELFMAG3)
4787     {
4788       error
4789         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4790       return FALSE;
4791     }
4792
4793   init_dwarf_regnames (header->e_machine);
4794
4795   if (do_header)
4796     {
4797       unsigned i;
4798
4799       printf (_("ELF Header:\n"));
4800       printf (_("  Magic:   "));
4801       for (i = 0; i < EI_NIDENT; i++)
4802         printf ("%2.2x ", header->e_ident[i]);
4803       printf ("\n");
4804       printf (_("  Class:                             %s\n"),
4805               get_elf_class (header->e_ident[EI_CLASS]));
4806       printf (_("  Data:                              %s\n"),
4807               get_data_encoding (header->e_ident[EI_DATA]));
4808       printf (_("  Version:                           %d%s\n"),
4809               header->e_ident[EI_VERSION],
4810               (header->e_ident[EI_VERSION] == EV_CURRENT
4811                ? _(" (current)")
4812                : (header->e_ident[EI_VERSION] != EV_NONE
4813                   ? _(" <unknown>")
4814                   : "")));
4815       printf (_("  OS/ABI:                            %s\n"),
4816               get_osabi_name (filedata, header->e_ident[EI_OSABI]));
4817       printf (_("  ABI Version:                       %d\n"),
4818               header->e_ident[EI_ABIVERSION]);
4819       printf (_("  Type:                              %s\n"),
4820               get_file_type (header->e_type));
4821       printf (_("  Machine:                           %s\n"),
4822               get_machine_name (header->e_machine));
4823       printf (_("  Version:                           0x%lx\n"),
4824               header->e_version);
4825
4826       printf (_("  Entry point address:               "));
4827       print_vma (header->e_entry, PREFIX_HEX);
4828       printf (_("\n  Start of program headers:          "));
4829       print_vma (header->e_phoff, DEC);
4830       printf (_(" (bytes into file)\n  Start of section headers:          "));
4831       print_vma (header->e_shoff, DEC);
4832       printf (_(" (bytes into file)\n"));
4833
4834       printf (_("  Flags:                             0x%lx%s\n"),
4835               header->e_flags,
4836               get_machine_flags (filedata, header->e_flags, header->e_machine));
4837       printf (_("  Size of this header:               %u (bytes)\n"),
4838               header->e_ehsize);
4839       printf (_("  Size of program headers:           %u (bytes)\n"),
4840               header->e_phentsize);
4841       printf (_("  Number of program headers:         %u"),
4842               header->e_phnum);
4843       if (filedata->section_headers != NULL
4844           && header->e_phnum == PN_XNUM
4845           && filedata->section_headers[0].sh_info != 0)
4846         {
4847           header->e_phnum = filedata->section_headers[0].sh_info;
4848           printf (" (%u)", header->e_phnum);
4849         }
4850       putc ('\n', stdout);
4851       printf (_("  Size of section headers:           %u (bytes)\n"),
4852               header->e_shentsize);
4853       printf (_("  Number of section headers:         %u"),
4854               header->e_shnum);
4855       if (filedata->section_headers != NULL && header->e_shnum == SHN_UNDEF)
4856         {
4857           header->e_shnum = filedata->section_headers[0].sh_size;
4858           printf (" (%u)", header->e_shnum);
4859         }
4860       putc ('\n', stdout);
4861       printf (_("  Section header string table index: %u"),
4862               header->e_shstrndx);
4863       if (filedata->section_headers != NULL
4864           && header->e_shstrndx == (SHN_XINDEX & 0xffff))
4865         {
4866           header->e_shstrndx = filedata->section_headers[0].sh_link;
4867           printf (" (%u)", header->e_shstrndx);
4868         }
4869       if (header->e_shstrndx != SHN_UNDEF
4870           && header->e_shstrndx >= header->e_shnum)
4871         {
4872           header->e_shstrndx = SHN_UNDEF;
4873           printf (_(" <corrupt: out of range>"));
4874         }
4875       putc ('\n', stdout);
4876     }
4877
4878   if (filedata->section_headers != NULL)
4879     {
4880       if (header->e_phnum == PN_XNUM
4881           && filedata->section_headers[0].sh_info != 0)
4882         header->e_phnum = filedata->section_headers[0].sh_info;
4883       if (header->e_shnum == SHN_UNDEF)
4884         header->e_shnum = filedata->section_headers[0].sh_size;
4885       if (header->e_shstrndx == (SHN_XINDEX & 0xffff))
4886         header->e_shstrndx = filedata->section_headers[0].sh_link;
4887       if (header->e_shstrndx >= header->e_shnum)
4888         header->e_shstrndx = SHN_UNDEF;
4889       free (filedata->section_headers);
4890       filedata->section_headers = NULL;
4891     }
4892
4893   return TRUE;
4894 }
4895
4896 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4897    Returns TRUE upon success, FALSE otherwise.  Loads 32-bit headers.  */
4898
4899 static bfd_boolean
4900 get_32bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4901 {
4902   Elf32_External_Phdr * phdrs;
4903   Elf32_External_Phdr * external;
4904   Elf_Internal_Phdr *   internal;
4905   unsigned int i;
4906   unsigned int size = filedata->file_header.e_phentsize;
4907   unsigned int num  = filedata->file_header.e_phnum;
4908
4909   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4910   if (size == 0 || num == 0)
4911     return FALSE;
4912   if (size < sizeof * phdrs)
4913     {
4914       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4915       return FALSE;
4916     }
4917   if (size > sizeof * phdrs)
4918     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4919
4920   phdrs = (Elf32_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4921                                             size, num, _("program headers"));
4922   if (phdrs == NULL)
4923     return FALSE;
4924
4925   for (i = 0, internal = pheaders, external = phdrs;
4926        i < filedata->file_header.e_phnum;
4927        i++, internal++, external++)
4928     {
4929       internal->p_type   = BYTE_GET (external->p_type);
4930       internal->p_offset = BYTE_GET (external->p_offset);
4931       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4932       internal->p_paddr  = BYTE_GET (external->p_paddr);
4933       internal->p_filesz = BYTE_GET (external->p_filesz);
4934       internal->p_memsz  = BYTE_GET (external->p_memsz);
4935       internal->p_flags  = BYTE_GET (external->p_flags);
4936       internal->p_align  = BYTE_GET (external->p_align);
4937     }
4938
4939   free (phdrs);
4940   return TRUE;
4941 }
4942
4943 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4944    Returns TRUE upon success, FALSE otherwise.  Loads 64-bit headers.  */
4945
4946 static bfd_boolean
4947 get_64bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4948 {
4949   Elf64_External_Phdr * phdrs;
4950   Elf64_External_Phdr * external;
4951   Elf_Internal_Phdr *   internal;
4952   unsigned int i;
4953   unsigned int size = filedata->file_header.e_phentsize;
4954   unsigned int num  = filedata->file_header.e_phnum;
4955
4956   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4957   if (size == 0 || num == 0)
4958     return FALSE;
4959   if (size < sizeof * phdrs)
4960     {
4961       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4962       return FALSE;
4963     }
4964   if (size > sizeof * phdrs)
4965     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4966
4967   phdrs = (Elf64_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4968                                             size, num, _("program headers"));
4969   if (!phdrs)
4970     return FALSE;
4971
4972   for (i = 0, internal = pheaders, external = phdrs;
4973        i < filedata->file_header.e_phnum;
4974        i++, internal++, external++)
4975     {
4976       internal->p_type   = BYTE_GET (external->p_type);
4977       internal->p_flags  = BYTE_GET (external->p_flags);
4978       internal->p_offset = BYTE_GET (external->p_offset);
4979       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4980       internal->p_paddr  = BYTE_GET (external->p_paddr);
4981       internal->p_filesz = BYTE_GET (external->p_filesz);
4982       internal->p_memsz  = BYTE_GET (external->p_memsz);
4983       internal->p_align  = BYTE_GET (external->p_align);
4984     }
4985
4986   free (phdrs);
4987   return TRUE;
4988 }
4989
4990 /* Returns TRUE if the program headers were read into `program_headers'.  */
4991
4992 static bfd_boolean
4993 get_program_headers (Filedata * filedata)
4994 {
4995   Elf_Internal_Phdr * phdrs;
4996
4997   /* Check cache of prior read.  */
4998   if (filedata->program_headers != NULL)
4999     return TRUE;
5000
5001   /* Be kind to memory checkers by looking for
5002      e_phnum values which we know must be invalid.  */
5003   if (filedata->file_header.e_phnum
5004       * (is_32bit_elf ? sizeof (Elf32_External_Phdr) : sizeof (Elf64_External_Phdr))
5005       >= filedata->file_size)
5006     {
5007       error (_("Too many program headers - %#x - the file is not that big\n"),
5008              filedata->file_header.e_phnum);
5009       return FALSE;
5010     }
5011
5012   phdrs = (Elf_Internal_Phdr *) cmalloc (filedata->file_header.e_phnum,
5013                                          sizeof (Elf_Internal_Phdr));
5014   if (phdrs == NULL)
5015     {
5016       error (_("Out of memory reading %u program headers\n"),
5017              filedata->file_header.e_phnum);
5018       return FALSE;
5019     }
5020
5021   if (is_32bit_elf
5022       ? get_32bit_program_headers (filedata, phdrs)
5023       : get_64bit_program_headers (filedata, phdrs))
5024     {
5025       filedata->program_headers = phdrs;
5026       return TRUE;
5027     }
5028
5029   free (phdrs);
5030   return FALSE;
5031 }
5032
5033 /* Returns TRUE if the program headers were loaded.  */
5034
5035 static bfd_boolean
5036 process_program_headers (Filedata * filedata)
5037 {
5038   Elf_Internal_Phdr * segment;
5039   unsigned int i;
5040   Elf_Internal_Phdr * previous_load = NULL;
5041
5042   if (filedata->file_header.e_phnum == 0)
5043     {
5044       /* PR binutils/12467.  */
5045       if (filedata->file_header.e_phoff != 0)
5046         {
5047           warn (_("possibly corrupt ELF header - it has a non-zero program"
5048                   " header offset, but no program headers\n"));
5049           return FALSE;
5050         }
5051       else if (do_segments)
5052         printf (_("\nThere are no program headers in this file.\n"));
5053       return TRUE;
5054     }
5055
5056   if (do_segments && !do_header)
5057     {
5058       printf (_("\nElf file type is %s\n"), get_file_type (filedata->file_header.e_type));
5059       printf (_("Entry point 0x%s\n"), bfd_vmatoa ("x", filedata->file_header.e_entry));
5060       printf (ngettext ("There is %d program header, starting at offset %s\n",
5061                         "There are %d program headers, starting at offset %s\n",
5062                         filedata->file_header.e_phnum),
5063               filedata->file_header.e_phnum,
5064               bfd_vmatoa ("u", filedata->file_header.e_phoff));
5065     }
5066
5067   if (! get_program_headers (filedata))
5068     return TRUE;
5069
5070   if (do_segments)
5071     {
5072       if (filedata->file_header.e_phnum > 1)
5073         printf (_("\nProgram Headers:\n"));
5074       else
5075         printf (_("\nProgram Headers:\n"));
5076
5077       if (is_32bit_elf)
5078         printf
5079           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
5080       else if (do_wide)
5081         printf
5082           (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
5083       else
5084         {
5085           printf
5086             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
5087           printf
5088             (_("                 FileSiz            MemSiz              Flags  Align\n"));
5089         }
5090     }
5091
5092   dynamic_addr = 0;
5093   dynamic_size = 0;
5094
5095   for (i = 0, segment = filedata->program_headers;
5096        i < filedata->file_header.e_phnum;
5097        i++, segment++)
5098     {
5099       if (do_segments)
5100         {
5101           printf ("  %-14.14s ", get_segment_type (filedata, segment->p_type));
5102
5103           if (is_32bit_elf)
5104             {
5105               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5106               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
5107               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
5108               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
5109               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
5110               printf ("%c%c%c ",
5111                       (segment->p_flags & PF_R ? 'R' : ' '),
5112                       (segment->p_flags & PF_W ? 'W' : ' '),
5113                       (segment->p_flags & PF_X ? 'E' : ' '));
5114               printf ("%#lx", (unsigned long) segment->p_align);
5115             }
5116           else if (do_wide)
5117             {
5118               if ((unsigned long) segment->p_offset == segment->p_offset)
5119                 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5120               else
5121                 {
5122                   print_vma (segment->p_offset, FULL_HEX);
5123                   putchar (' ');
5124                 }
5125
5126               print_vma (segment->p_vaddr, FULL_HEX);
5127               putchar (' ');
5128               print_vma (segment->p_paddr, FULL_HEX);
5129               putchar (' ');
5130
5131               if ((unsigned long) segment->p_filesz == segment->p_filesz)
5132                 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
5133               else
5134                 {
5135                   print_vma (segment->p_filesz, FULL_HEX);
5136                   putchar (' ');
5137                 }
5138
5139               if ((unsigned long) segment->p_memsz == segment->p_memsz)
5140                 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
5141               else
5142                 {
5143                   print_vma (segment->p_memsz, FULL_HEX);
5144                 }
5145
5146               printf (" %c%c%c ",
5147                       (segment->p_flags & PF_R ? 'R' : ' '),
5148                       (segment->p_flags & PF_W ? 'W' : ' '),
5149                       (segment->p_flags & PF_X ? 'E' : ' '));
5150
5151               if ((unsigned long) segment->p_align == segment->p_align)
5152                 printf ("%#lx", (unsigned long) segment->p_align);
5153               else
5154                 {
5155                   print_vma (segment->p_align, PREFIX_HEX);
5156                 }
5157             }
5158           else
5159             {
5160               print_vma (segment->p_offset, FULL_HEX);
5161               putchar (' ');
5162               print_vma (segment->p_vaddr, FULL_HEX);
5163               putchar (' ');
5164               print_vma (segment->p_paddr, FULL_HEX);
5165               printf ("\n                 ");
5166               print_vma (segment->p_filesz, FULL_HEX);
5167               putchar (' ');
5168               print_vma (segment->p_memsz, FULL_HEX);
5169               printf ("  %c%c%c    ",
5170                       (segment->p_flags & PF_R ? 'R' : ' '),
5171                       (segment->p_flags & PF_W ? 'W' : ' '),
5172                       (segment->p_flags & PF_X ? 'E' : ' '));
5173               print_vma (segment->p_align, PREFIX_HEX);
5174             }
5175
5176           putc ('\n', stdout);
5177         }
5178
5179       switch (segment->p_type)
5180         {
5181         case PT_LOAD:
5182 #if 0 /* Do not warn about out of order PT_LOAD segments.  Although officially
5183          required by the ELF standard, several programs, including the Linux
5184          kernel, make use of non-ordered segments.  */
5185           if (previous_load
5186               && previous_load->p_vaddr > segment->p_vaddr)
5187             error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
5188 #endif
5189           if (segment->p_memsz < segment->p_filesz)
5190             error (_("the segment's file size is larger than its memory size\n"));
5191           previous_load = segment;
5192           break;
5193
5194         case PT_PHDR:
5195           /* PR 20815 - Verify that the program header is loaded into memory.  */
5196           if (i > 0 && previous_load != NULL)
5197             error (_("the PHDR segment must occur before any LOAD segment\n"));
5198           if (filedata->file_header.e_machine != EM_PARISC)
5199             {
5200               unsigned int j;
5201
5202               for (j = 1; j < filedata->file_header.e_phnum; j++)
5203                 if (filedata->program_headers[j].p_vaddr <= segment->p_vaddr
5204                     && (filedata->program_headers[j].p_vaddr
5205                         + filedata->program_headers[j].p_memsz)
5206                     >= (segment->p_vaddr + segment->p_filesz))
5207                   break;
5208               if (j == filedata->file_header.e_phnum)
5209                 error (_("the PHDR segment is not covered by a LOAD segment\n"));
5210             }
5211           break;
5212
5213         case PT_DYNAMIC:
5214           if (dynamic_addr)
5215             error (_("more than one dynamic segment\n"));
5216
5217           /* By default, assume that the .dynamic section is the first
5218              section in the DYNAMIC segment.  */
5219           dynamic_addr = segment->p_offset;
5220           dynamic_size = segment->p_filesz;
5221
5222           /* Try to locate the .dynamic section. If there is
5223              a section header table, we can easily locate it.  */
5224           if (filedata->section_headers != NULL)
5225             {
5226               Elf_Internal_Shdr * sec;
5227
5228               sec = find_section (filedata, ".dynamic");
5229               if (sec == NULL || sec->sh_size == 0)
5230                 {
5231                   /* A corresponding .dynamic section is expected, but on
5232                      IA-64/OpenVMS it is OK for it to be missing.  */
5233                   if (!is_ia64_vms (filedata))
5234                     error (_("no .dynamic section in the dynamic segment\n"));
5235                   break;
5236                 }
5237
5238               if (sec->sh_type == SHT_NOBITS)
5239                 {
5240                   dynamic_size = 0;
5241                   break;
5242                 }
5243
5244               dynamic_addr = sec->sh_offset;
5245               dynamic_size = sec->sh_size;
5246
5247               if (dynamic_addr < segment->p_offset
5248                   || dynamic_addr > segment->p_offset + segment->p_filesz)
5249                 warn (_("the .dynamic section is not contained"
5250                         " within the dynamic segment\n"));
5251               else if (dynamic_addr > segment->p_offset)
5252                 warn (_("the .dynamic section is not the first section"
5253                         " in the dynamic segment.\n"));
5254             }
5255
5256           /* PR binutils/17512: Avoid corrupt dynamic section info in the
5257              segment.  Check this after matching against the section headers
5258              so we don't warn on debuginfo file (which have NOBITS .dynamic
5259              sections).  */
5260           if (dynamic_addr > filedata->file_size
5261               || dynamic_size > filedata->file_size - dynamic_addr)
5262             {
5263               error (_("the dynamic segment offset + size exceeds the size of the file\n"));
5264               dynamic_addr = dynamic_size = 0;
5265             }
5266           break;
5267
5268         case PT_INTERP:
5269           if (fseek (filedata->handle, archive_file_offset + (long) segment->p_offset,
5270                      SEEK_SET))
5271             error (_("Unable to find program interpreter name\n"));
5272           else
5273             {
5274               char fmt [32];
5275               int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
5276
5277               if (ret >= (int) sizeof (fmt) || ret < 0)
5278                 error (_("Internal error: failed to create format string to display program interpreter\n"));
5279
5280               program_interpreter[0] = 0;
5281               if (fscanf (filedata->handle, fmt, program_interpreter) <= 0)
5282                 error (_("Unable to read program interpreter name\n"));
5283
5284               if (do_segments)
5285                 printf (_("      [Requesting program interpreter: %s]\n"),
5286                     program_interpreter);
5287             }
5288           break;
5289         }
5290     }
5291
5292   if (do_segments
5293       && filedata->section_headers != NULL
5294       && filedata->string_table != NULL)
5295     {
5296       printf (_("\n Section to Segment mapping:\n"));
5297       printf (_("  Segment Sections...\n"));
5298
5299       for (i = 0; i < filedata->file_header.e_phnum; i++)
5300         {
5301           unsigned int j;
5302           Elf_Internal_Shdr * section;
5303
5304           segment = filedata->program_headers + i;
5305           section = filedata->section_headers + 1;
5306
5307           printf ("   %2.2d     ", i);
5308
5309           for (j = 1; j < filedata->file_header.e_shnum; j++, section++)
5310             {
5311               if (!ELF_TBSS_SPECIAL (section, segment)
5312                   && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
5313                 printf ("%s ", printable_section_name (filedata, section));
5314             }
5315
5316           putc ('\n',stdout);
5317         }
5318     }
5319
5320   return TRUE;
5321 }
5322
5323
5324 /* Find the file offset corresponding to VMA by using the program headers.  */
5325
5326 static long
5327 offset_from_vma (Filedata * filedata, bfd_vma vma, bfd_size_type size)
5328 {
5329   Elf_Internal_Phdr * seg;
5330
5331   if (! get_program_headers (filedata))
5332     {
5333       warn (_("Cannot interpret virtual addresses without program headers.\n"));
5334       return (long) vma;
5335     }
5336
5337   for (seg = filedata->program_headers;
5338        seg < filedata->program_headers + filedata->file_header.e_phnum;
5339        ++seg)
5340     {
5341       if (seg->p_type != PT_LOAD)
5342         continue;
5343
5344       if (vma >= (seg->p_vaddr & -seg->p_align)
5345           && vma + size <= seg->p_vaddr + seg->p_filesz)
5346         return vma - seg->p_vaddr + seg->p_offset;
5347     }
5348
5349   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
5350         (unsigned long) vma);
5351   return (long) vma;
5352 }
5353
5354
5355 /* Allocate memory and load the sections headers into FILEDATA->filedata->section_headers.
5356    If PROBE is true, this is just a probe and we do not generate any error
5357    messages if the load fails.  */
5358
5359 static bfd_boolean
5360 get_32bit_section_headers (Filedata * filedata, bfd_boolean probe)
5361 {
5362   Elf32_External_Shdr * shdrs;
5363   Elf_Internal_Shdr *   internal;
5364   unsigned int          i;
5365   unsigned int          size = filedata->file_header.e_shentsize;
5366   unsigned int          num = probe ? 1 : filedata->file_header.e_shnum;
5367
5368   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5369   if (size == 0 || num == 0)
5370     return FALSE;
5371   if (size < sizeof * shdrs)
5372     {
5373       if (! probe)
5374         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5375       return FALSE;
5376     }
5377   if (!probe && size > sizeof * shdrs)
5378     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5379
5380   shdrs = (Elf32_External_Shdr *) get_data (NULL, filedata, filedata->file_header.e_shoff,
5381                                             size, num,
5382                                             probe ? NULL : _("section headers"));
5383   if (shdrs == NULL)
5384     return FALSE;
5385
5386   free (filedata->section_headers);
5387   filedata->section_headers = (Elf_Internal_Shdr *)
5388     cmalloc (num, sizeof (Elf_Internal_Shdr));
5389   if (filedata->section_headers == NULL)
5390     {
5391       if (!probe)
5392         error (_("Out of memory reading %u section headers\n"), num);
5393       free (shdrs);
5394       return FALSE;
5395     }
5396
5397   for (i = 0, internal = filedata->section_headers;
5398        i < num;
5399        i++, internal++)
5400     {
5401       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5402       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5403       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5404       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5405       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5406       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5407       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5408       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5409       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5410       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5411       if (!probe && internal->sh_link > num)
5412         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5413       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5414         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5415     }
5416
5417   free (shdrs);
5418   return TRUE;
5419 }
5420
5421 /* Like get_32bit_section_headers, except that it fetches 64-bit headers.  */
5422
5423 static bfd_boolean
5424 get_64bit_section_headers (Filedata * filedata, bfd_boolean probe)
5425 {
5426   Elf64_External_Shdr *  shdrs;
5427   Elf_Internal_Shdr *    internal;
5428   unsigned int           i;
5429   unsigned int           size = filedata->file_header.e_shentsize;
5430   unsigned int           num = probe ? 1 : filedata->file_header.e_shnum;
5431
5432   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5433   if (size == 0 || num == 0)
5434     return FALSE;
5435
5436   if (size < sizeof * shdrs)
5437     {
5438       if (! probe)
5439         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5440       return FALSE;
5441     }
5442
5443   if (! probe && size > sizeof * shdrs)
5444     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5445
5446   shdrs = (Elf64_External_Shdr *) get_data (NULL, filedata,
5447                                             filedata->file_header.e_shoff,
5448                                             size, num,
5449                                             probe ? NULL : _("section headers"));
5450   if (shdrs == NULL)
5451     return FALSE;
5452
5453   free (filedata->section_headers);
5454   filedata->section_headers = (Elf_Internal_Shdr *)
5455     cmalloc (num, sizeof (Elf_Internal_Shdr));
5456   if (filedata->section_headers == NULL)
5457     {
5458       if (! probe)
5459         error (_("Out of memory reading %u section headers\n"), num);
5460       free (shdrs);
5461       return FALSE;
5462     }
5463
5464   for (i = 0, internal = filedata->section_headers;
5465        i < num;
5466        i++, internal++)
5467     {
5468       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5469       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5470       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5471       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5472       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5473       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5474       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5475       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5476       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5477       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5478       if (!probe && internal->sh_link > num)
5479         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5480       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5481         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5482     }
5483
5484   free (shdrs);
5485   return TRUE;
5486 }
5487
5488 static Elf_Internal_Sym *
5489 get_32bit_elf_symbols (Filedata *           filedata,
5490                        Elf_Internal_Shdr *  section,
5491                        unsigned long *      num_syms_return)
5492 {
5493   unsigned long number = 0;
5494   Elf32_External_Sym * esyms = NULL;
5495   Elf_External_Sym_Shndx * shndx = NULL;
5496   Elf_Internal_Sym * isyms = NULL;
5497   Elf_Internal_Sym * psym;
5498   unsigned int j;
5499   elf_section_list * entry;
5500
5501   if (section->sh_size == 0)
5502     {
5503       if (num_syms_return != NULL)
5504         * num_syms_return = 0;
5505       return NULL;
5506     }
5507
5508   /* Run some sanity checks first.  */
5509   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5510     {
5511       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5512              printable_section_name (filedata, section),
5513              (unsigned long) section->sh_entsize);
5514       goto exit_point;
5515     }
5516
5517   if (section->sh_size > filedata->file_size)
5518     {
5519       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5520              printable_section_name (filedata, section),
5521              (unsigned long) section->sh_size);
5522       goto exit_point;
5523     }
5524
5525   number = section->sh_size / section->sh_entsize;
5526
5527   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5528     {
5529       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5530              (unsigned long) section->sh_size,
5531              printable_section_name (filedata, section),
5532              (unsigned long) section->sh_entsize);
5533       goto exit_point;
5534     }
5535
5536   esyms = (Elf32_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5537                                            section->sh_size, _("symbols"));
5538   if (esyms == NULL)
5539     goto exit_point;
5540
5541   shndx = NULL;
5542   for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5543     {
5544       if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5545         continue;
5546
5547       if (shndx != NULL)
5548         {
5549           error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5550           free (shndx);
5551         }
5552
5553       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5554                                                    entry->hdr->sh_offset,
5555                                                    1, entry->hdr->sh_size,
5556                                                    _("symbol table section indices"));
5557       if (shndx == NULL)
5558         goto exit_point;
5559
5560       /* PR17531: file: heap-buffer-overflow */
5561       if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5562         {
5563           error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5564                  printable_section_name (filedata, entry->hdr),
5565                  (unsigned long) entry->hdr->sh_size,
5566                  (unsigned long) section->sh_size);
5567           goto exit_point;
5568         }
5569     }
5570
5571   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5572
5573   if (isyms == NULL)
5574     {
5575       error (_("Out of memory reading %lu symbols\n"),
5576              (unsigned long) number);
5577       goto exit_point;
5578     }
5579
5580   for (j = 0, psym = isyms; j < number; j++, psym++)
5581     {
5582       psym->st_name  = BYTE_GET (esyms[j].st_name);
5583       psym->st_value = BYTE_GET (esyms[j].st_value);
5584       psym->st_size  = BYTE_GET (esyms[j].st_size);
5585       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5586       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5587         psym->st_shndx
5588           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5589       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5590         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5591       psym->st_info  = BYTE_GET (esyms[j].st_info);
5592       psym->st_other = BYTE_GET (esyms[j].st_other);
5593     }
5594
5595  exit_point:
5596   free (shndx);
5597   free (esyms);
5598
5599   if (num_syms_return != NULL)
5600     * num_syms_return = isyms == NULL ? 0 : number;
5601
5602   return isyms;
5603 }
5604
5605 static Elf_Internal_Sym *
5606 get_64bit_elf_symbols (Filedata *           filedata,
5607                        Elf_Internal_Shdr *  section,
5608                        unsigned long *      num_syms_return)
5609 {
5610   unsigned long number = 0;
5611   Elf64_External_Sym * esyms = NULL;
5612   Elf_External_Sym_Shndx * shndx = NULL;
5613   Elf_Internal_Sym * isyms = NULL;
5614   Elf_Internal_Sym * psym;
5615   unsigned int j;
5616   elf_section_list * entry;
5617
5618   if (section->sh_size == 0)
5619     {
5620       if (num_syms_return != NULL)
5621         * num_syms_return = 0;
5622       return NULL;
5623     }
5624
5625   /* Run some sanity checks first.  */
5626   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5627     {
5628       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5629              printable_section_name (filedata, section),
5630              (unsigned long) section->sh_entsize);
5631       goto exit_point;
5632     }
5633
5634   if (section->sh_size > filedata->file_size)
5635     {
5636       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5637              printable_section_name (filedata, section),
5638              (unsigned long) section->sh_size);
5639       goto exit_point;
5640     }
5641
5642   number = section->sh_size / section->sh_entsize;
5643
5644   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5645     {
5646       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5647              (unsigned long) section->sh_size,
5648              printable_section_name (filedata, section),
5649              (unsigned long) section->sh_entsize);
5650       goto exit_point;
5651     }
5652
5653   esyms = (Elf64_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5654                                            section->sh_size, _("symbols"));
5655   if (!esyms)
5656     goto exit_point;
5657
5658   shndx = NULL;
5659   for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5660     {
5661       if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5662         continue;
5663
5664       if (shndx != NULL)
5665         {
5666           error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5667           free (shndx);
5668         }
5669
5670       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5671                                                    entry->hdr->sh_offset,
5672                                                    1, entry->hdr->sh_size,
5673                                                    _("symbol table section indices"));
5674       if (shndx == NULL)
5675         goto exit_point;
5676
5677       /* PR17531: file: heap-buffer-overflow */
5678       if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5679         {
5680           error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5681                  printable_section_name (filedata, entry->hdr),
5682                  (unsigned long) entry->hdr->sh_size,
5683                  (unsigned long) section->sh_size);
5684           goto exit_point;
5685         }
5686     }
5687
5688   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5689
5690   if (isyms == NULL)
5691     {
5692       error (_("Out of memory reading %lu symbols\n"),
5693              (unsigned long) number);
5694       goto exit_point;
5695     }
5696
5697   for (j = 0, psym = isyms; j < number; j++, psym++)
5698     {
5699       psym->st_name  = BYTE_GET (esyms[j].st_name);
5700       psym->st_info  = BYTE_GET (esyms[j].st_info);
5701       psym->st_other = BYTE_GET (esyms[j].st_other);
5702       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5703
5704       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5705         psym->st_shndx
5706           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5707       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5708         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5709
5710       psym->st_value = BYTE_GET (esyms[j].st_value);
5711       psym->st_size  = BYTE_GET (esyms[j].st_size);
5712     }
5713
5714  exit_point:
5715   free (shndx);
5716   free (esyms);
5717
5718   if (num_syms_return != NULL)
5719     * num_syms_return = isyms == NULL ? 0 : number;
5720
5721   return isyms;
5722 }
5723
5724 static const char *
5725 get_elf_section_flags (Filedata * filedata, bfd_vma sh_flags)
5726 {
5727   static char buff[1024];
5728   char * p = buff;
5729   unsigned int field_size = is_32bit_elf ? 8 : 16;
5730   signed int sindex;
5731   unsigned int size = sizeof (buff) - (field_size + 4 + 1);
5732   bfd_vma os_flags = 0;
5733   bfd_vma proc_flags = 0;
5734   bfd_vma unknown_flags = 0;
5735   static const struct
5736     {
5737       const char * str;
5738       unsigned int len;
5739     }
5740   flags [] =
5741     {
5742       /*  0 */ { STRING_COMMA_LEN ("WRITE") },
5743       /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
5744       /*  2 */ { STRING_COMMA_LEN ("EXEC") },
5745       /*  3 */ { STRING_COMMA_LEN ("MERGE") },
5746       /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
5747       /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
5748       /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5749       /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5750       /*  8 */ { STRING_COMMA_LEN ("GROUP") },
5751       /*  9 */ { STRING_COMMA_LEN ("TLS") },
5752       /* IA-64 specific.  */
5753       /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5754       /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5755       /* IA-64 OpenVMS specific.  */
5756       /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5757       /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5758       /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5759       /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5760       /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5761       /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5762       /* Generic.  */
5763       /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5764       /* SPARC specific.  */
5765       /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5766       /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5767       /* ARM specific.  */
5768       /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5769       /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5770       /* 23 */ { STRING_COMMA_LEN ("COMDEF") },
5771       /* GNU specific.  */
5772       /* 24 */ { STRING_COMMA_LEN ("GNU_MBIND") },
5773       /* VLE specific.  */
5774       /* 25 */ { STRING_COMMA_LEN ("VLE") },
5775     };
5776
5777   if (do_section_details)
5778     {
5779       sprintf (buff, "[%*.*lx]: ",
5780                field_size, field_size, (unsigned long) sh_flags);
5781       p += field_size + 4;
5782     }
5783
5784   while (sh_flags)
5785     {
5786       bfd_vma flag;
5787
5788       flag = sh_flags & - sh_flags;
5789       sh_flags &= ~ flag;
5790
5791       if (do_section_details)
5792         {
5793           switch (flag)
5794             {
5795             case SHF_WRITE:             sindex = 0; break;
5796             case SHF_ALLOC:             sindex = 1; break;
5797             case SHF_EXECINSTR:         sindex = 2; break;
5798             case SHF_MERGE:             sindex = 3; break;
5799             case SHF_STRINGS:           sindex = 4; break;
5800             case SHF_INFO_LINK:         sindex = 5; break;
5801             case SHF_LINK_ORDER:        sindex = 6; break;
5802             case SHF_OS_NONCONFORMING:  sindex = 7; break;
5803             case SHF_GROUP:             sindex = 8; break;
5804             case SHF_TLS:               sindex = 9; break;
5805             case SHF_EXCLUDE:           sindex = 18; break;
5806             case SHF_COMPRESSED:        sindex = 20; break;
5807             case SHF_GNU_MBIND:         sindex = 24; break;
5808
5809             default:
5810               sindex = -1;
5811               switch (filedata->file_header.e_machine)
5812                 {
5813                 case EM_IA_64:
5814                   if (flag == SHF_IA_64_SHORT)
5815                     sindex = 10;
5816                   else if (flag == SHF_IA_64_NORECOV)
5817                     sindex = 11;
5818 #ifdef BFD64
5819                   else if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5820                     switch (flag)
5821                       {
5822                       case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
5823                       case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
5824                       case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
5825                       case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
5826                       case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5827                       case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
5828                       default:                        break;
5829                       }
5830 #endif
5831                   break;
5832
5833                 case EM_386:
5834                 case EM_IAMCU:
5835                 case EM_X86_64:
5836                 case EM_L1OM:
5837                 case EM_K1OM:
5838                 case EM_OLD_SPARCV9:
5839                 case EM_SPARC32PLUS:
5840                 case EM_SPARCV9:
5841                 case EM_SPARC:
5842                   if (flag == SHF_ORDERED)
5843                     sindex = 19;
5844                   break;
5845
5846                 case EM_ARM:
5847                   switch (flag)
5848                     {
5849                     case SHF_ENTRYSECT: sindex = 21; break;
5850                     case SHF_ARM_PURECODE: sindex = 22; break;
5851                     case SHF_COMDEF: sindex = 23; break;
5852                     default: break;
5853                     }
5854                   break;
5855                 case EM_PPC:
5856                   if (flag == SHF_PPC_VLE)
5857                     sindex = 25;
5858                   break;
5859
5860                 default:
5861                   break;
5862                 }
5863             }
5864
5865           if (sindex != -1)
5866             {
5867               if (p != buff + field_size + 4)
5868                 {
5869                   if (size < (10 + 2))
5870                     {
5871                       warn (_("Internal error: not enough buffer room for section flag info"));
5872                       return _("<unknown>");
5873                     }
5874                   size -= 2;
5875                   *p++ = ',';
5876                   *p++ = ' ';
5877                 }
5878
5879               size -= flags [sindex].len;
5880               p = stpcpy (p, flags [sindex].str);
5881             }
5882           else if (flag & SHF_MASKOS)
5883             os_flags |= flag;
5884           else if (flag & SHF_MASKPROC)
5885             proc_flags |= flag;
5886           else
5887             unknown_flags |= flag;
5888         }
5889       else
5890         {
5891           switch (flag)
5892             {
5893             case SHF_WRITE:             *p = 'W'; break;
5894             case SHF_ALLOC:             *p = 'A'; break;
5895             case SHF_EXECINSTR:         *p = 'X'; break;
5896             case SHF_MERGE:             *p = 'M'; break;
5897             case SHF_STRINGS:           *p = 'S'; break;
5898             case SHF_INFO_LINK:         *p = 'I'; break;
5899             case SHF_LINK_ORDER:        *p = 'L'; break;
5900             case SHF_OS_NONCONFORMING:  *p = 'O'; break;
5901             case SHF_GROUP:             *p = 'G'; break;
5902             case SHF_TLS:               *p = 'T'; break;
5903             case SHF_EXCLUDE:           *p = 'E'; break;
5904             case SHF_COMPRESSED:        *p = 'C'; break;
5905             case SHF_GNU_MBIND:         *p = 'D'; break;
5906
5907             default:
5908               if ((filedata->file_header.e_machine == EM_X86_64
5909                    || filedata->file_header.e_machine == EM_L1OM
5910                    || filedata->file_header.e_machine == EM_K1OM)
5911                   && flag == SHF_X86_64_LARGE)
5912                 *p = 'l';
5913               else if (filedata->file_header.e_machine == EM_ARM
5914                        && flag == SHF_ARM_PURECODE)
5915                   *p = 'y';
5916               else if (filedata->file_header.e_machine == EM_PPC
5917                        && flag == SHF_PPC_VLE)
5918                   *p = 'v';
5919               else if (flag & SHF_MASKOS)
5920                 {
5921                   *p = 'o';
5922                   sh_flags &= ~ SHF_MASKOS;
5923                 }
5924               else if (flag & SHF_MASKPROC)
5925                 {
5926                   *p = 'p';
5927                   sh_flags &= ~ SHF_MASKPROC;
5928                 }
5929               else
5930                 *p = 'x';
5931               break;
5932             }
5933           p++;
5934         }
5935     }
5936
5937   if (do_section_details)
5938     {
5939       if (os_flags)
5940         {
5941           size -= 5 + field_size;
5942           if (p != buff + field_size + 4)
5943             {
5944               if (size < (2 + 1))
5945                 {
5946                   warn (_("Internal error: not enough buffer room for section flag info"));
5947                   return _("<unknown>");
5948                 }
5949               size -= 2;
5950               *p++ = ',';
5951               *p++ = ' ';
5952             }
5953           sprintf (p, "OS (%*.*lx)", field_size, field_size,
5954                    (unsigned long) os_flags);
5955           p += 5 + field_size;
5956         }
5957       if (proc_flags)
5958         {
5959           size -= 7 + field_size;
5960           if (p != buff + field_size + 4)
5961             {
5962               if (size < (2 + 1))
5963                 {
5964                   warn (_("Internal error: not enough buffer room for section flag info"));
5965                   return _("<unknown>");
5966                 }
5967               size -= 2;
5968               *p++ = ',';
5969               *p++ = ' ';
5970             }
5971           sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5972                    (unsigned long) proc_flags);
5973           p += 7 + field_size;
5974         }
5975       if (unknown_flags)
5976         {
5977           size -= 10 + field_size;
5978           if (p != buff + field_size + 4)
5979             {
5980               if (size < (2 + 1))
5981                 {
5982                   warn (_("Internal error: not enough buffer room for section flag info"));
5983                   return _("<unknown>");
5984                 }
5985               size -= 2;
5986               *p++ = ',';
5987               *p++ = ' ';
5988             }
5989           sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5990                    (unsigned long) unknown_flags);
5991           p += 10 + field_size;
5992         }
5993     }
5994
5995   *p = '\0';
5996   return buff;
5997 }
5998
5999 static unsigned int
6000 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf, bfd_size_type size)
6001 {
6002   if (is_32bit_elf)
6003     {
6004       Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
6005
6006       if (size < sizeof (* echdr))
6007         {
6008           error (_("Compressed section is too small even for a compression header\n"));
6009           return 0;
6010         }
6011
6012       chdr->ch_type = BYTE_GET (echdr->ch_type);
6013       chdr->ch_size = BYTE_GET (echdr->ch_size);
6014       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
6015       return sizeof (*echdr);
6016     }
6017   else
6018     {
6019       Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
6020
6021       if (size < sizeof (* echdr))
6022         {
6023           error (_("Compressed section is too small even for a compression header\n"));
6024           return 0;
6025         }
6026
6027       chdr->ch_type = BYTE_GET (echdr->ch_type);
6028       chdr->ch_size = BYTE_GET (echdr->ch_size);
6029       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
6030       return sizeof (*echdr);
6031     }
6032 }
6033
6034 static bfd_boolean
6035 process_section_headers (Filedata * filedata)
6036 {
6037   Elf_Internal_Shdr * section;
6038   unsigned int i;
6039
6040   filedata->section_headers = NULL;
6041
6042   if (filedata->file_header.e_shnum == 0)
6043     {
6044       /* PR binutils/12467.  */
6045       if (filedata->file_header.e_shoff != 0)
6046         {
6047           warn (_("possibly corrupt ELF file header - it has a non-zero"
6048                   " section header offset, but no section headers\n"));
6049           return FALSE;
6050         }
6051       else if (do_sections)
6052         printf (_("\nThere are no sections in this file.\n"));
6053
6054       return TRUE;
6055     }
6056
6057   if (do_sections && !do_header)
6058     printf (ngettext ("There is %d section header, "
6059                       "starting at offset 0x%lx:\n",
6060                       "There are %d section headers, "
6061                       "starting at offset 0x%lx:\n",
6062                       filedata->file_header.e_shnum),
6063             filedata->file_header.e_shnum,
6064             (unsigned long) filedata->file_header.e_shoff);
6065
6066   if (is_32bit_elf)
6067     {
6068       if (! get_32bit_section_headers (filedata, FALSE))
6069         return FALSE;
6070     }
6071   else
6072     {
6073       if (! get_64bit_section_headers (filedata, FALSE))
6074         return FALSE;
6075     }
6076
6077   /* Read in the string table, so that we have names to display.  */
6078   if (filedata->file_header.e_shstrndx != SHN_UNDEF
6079        && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
6080     {
6081       section = filedata->section_headers + filedata->file_header.e_shstrndx;
6082
6083       if (section->sh_size != 0)
6084         {
6085           filedata->string_table = (char *) get_data (NULL, filedata, section->sh_offset,
6086                                                       1, section->sh_size,
6087                                                       _("string table"));
6088
6089           filedata->string_table_length = filedata->string_table != NULL ? section->sh_size : 0;
6090         }
6091     }
6092
6093   /* Scan the sections for the dynamic symbol table
6094      and dynamic string table and debug sections.  */
6095   dynamic_symbols = NULL;
6096   dynamic_strings = NULL;
6097   dynamic_syminfo = NULL;
6098   symtab_shndx_list = NULL;
6099
6100   eh_addr_size = is_32bit_elf ? 4 : 8;
6101   switch (filedata->file_header.e_machine)
6102     {
6103     case EM_MIPS:
6104     case EM_MIPS_RS3_LE:
6105       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
6106          FDE addresses.  However, the ABI also has a semi-official ILP32
6107          variant for which the normal FDE address size rules apply.
6108
6109          GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
6110          section, where XX is the size of longs in bits.  Unfortunately,
6111          earlier compilers provided no way of distinguishing ILP32 objects
6112          from LP64 objects, so if there's any doubt, we should assume that
6113          the official LP64 form is being used.  */
6114       if ((filedata->file_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
6115           && find_section (filedata, ".gcc_compiled_long32") == NULL)
6116         eh_addr_size = 8;
6117       break;
6118
6119     case EM_H8_300:
6120     case EM_H8_300H:
6121       switch (filedata->file_header.e_flags & EF_H8_MACH)
6122         {
6123         case E_H8_MACH_H8300:
6124         case E_H8_MACH_H8300HN:
6125         case E_H8_MACH_H8300SN:
6126         case E_H8_MACH_H8300SXN:
6127           eh_addr_size = 2;
6128           break;
6129         case E_H8_MACH_H8300H:
6130         case E_H8_MACH_H8300S:
6131         case E_H8_MACH_H8300SX:
6132           eh_addr_size = 4;
6133           break;
6134         }
6135       break;
6136
6137     case EM_M32C_OLD:
6138     case EM_M32C:
6139       switch (filedata->file_header.e_flags & EF_M32C_CPU_MASK)
6140         {
6141         case EF_M32C_CPU_M16C:
6142           eh_addr_size = 2;
6143           break;
6144         }
6145       break;
6146     }
6147
6148 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64)                \
6149   do                                                                    \
6150     {                                                                   \
6151       bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64;  \
6152       if (section->sh_entsize != expected_entsize)                      \
6153         {                                                               \
6154           char buf[40];                                                 \
6155           sprintf_vma (buf, section->sh_entsize);                       \
6156           /* Note: coded this way so that there is a single string for  \
6157              translation.  */ \
6158           error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
6159           error (_("(Using the expected size of %u for the rest of this dump)\n"), \
6160                    (unsigned) expected_entsize);                        \
6161           section->sh_entsize = expected_entsize;                       \
6162         }                                                               \
6163     }                                                                   \
6164   while (0)
6165
6166 #define CHECK_ENTSIZE(section, i, type)                                 \
6167   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),         \
6168                         sizeof (Elf64_External_##type))
6169
6170   for (i = 0, section = filedata->section_headers;
6171        i < filedata->file_header.e_shnum;
6172        i++, section++)
6173     {
6174       char * name = SECTION_NAME (section);
6175
6176       if (section->sh_type == SHT_DYNSYM)
6177         {
6178           if (dynamic_symbols != NULL)
6179             {
6180               error (_("File contains multiple dynamic symbol tables\n"));
6181               continue;
6182             }
6183
6184           CHECK_ENTSIZE (section, i, Sym);
6185           dynamic_symbols = GET_ELF_SYMBOLS (filedata, section, & num_dynamic_syms);
6186         }
6187       else if (section->sh_type == SHT_STRTAB
6188                && streq (name, ".dynstr"))
6189         {
6190           if (dynamic_strings != NULL)
6191             {
6192               error (_("File contains multiple dynamic string tables\n"));
6193               continue;
6194             }
6195
6196           dynamic_strings = (char *) get_data (NULL, filedata, section->sh_offset,
6197                                                1, section->sh_size,
6198                                                _("dynamic strings"));
6199           dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
6200         }
6201       else if (section->sh_type == SHT_SYMTAB_SHNDX)
6202         {
6203           elf_section_list * entry = xmalloc (sizeof * entry);
6204
6205           entry->hdr = section;
6206           entry->next = symtab_shndx_list;
6207           symtab_shndx_list = entry;
6208         }
6209       else if (section->sh_type == SHT_SYMTAB)
6210         CHECK_ENTSIZE (section, i, Sym);
6211       else if (section->sh_type == SHT_GROUP)
6212         CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
6213       else if (section->sh_type == SHT_REL)
6214         CHECK_ENTSIZE (section, i, Rel);
6215       else if (section->sh_type == SHT_RELA)
6216         CHECK_ENTSIZE (section, i, Rela);
6217       else if ((do_debugging || do_debug_info || do_debug_abbrevs
6218                 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
6219                 || do_debug_aranges || do_debug_frames || do_debug_macinfo
6220                 || do_debug_str || do_debug_loc || do_debug_ranges
6221                 || do_debug_addr || do_debug_cu_index || do_debug_links)
6222                && (const_strneq (name, ".debug_")
6223                    || const_strneq (name, ".zdebug_")))
6224         {
6225           if (name[1] == 'z')
6226             name += sizeof (".zdebug_") - 1;
6227           else
6228             name += sizeof (".debug_") - 1;
6229
6230           if (do_debugging
6231               || (do_debug_info     && const_strneq (name, "info"))
6232               || (do_debug_info     && const_strneq (name, "types"))
6233               || (do_debug_abbrevs  && const_strneq (name, "abbrev"))
6234               || (do_debug_lines    && strcmp (name, "line") == 0)
6235               || (do_debug_lines    && const_strneq (name, "line."))
6236               || (do_debug_pubnames && const_strneq (name, "pubnames"))
6237               || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
6238               || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
6239               || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
6240               || (do_debug_aranges  && const_strneq (name, "aranges"))
6241               || (do_debug_ranges   && const_strneq (name, "ranges"))
6242               || (do_debug_ranges   && const_strneq (name, "rnglists"))
6243               || (do_debug_frames   && const_strneq (name, "frame"))
6244               || (do_debug_macinfo  && const_strneq (name, "macinfo"))
6245               || (do_debug_macinfo  && const_strneq (name, "macro"))
6246               || (do_debug_str      && const_strneq (name, "str"))
6247               || (do_debug_loc      && const_strneq (name, "loc"))
6248               || (do_debug_loc      && const_strneq (name, "loclists"))
6249               || (do_debug_addr     && const_strneq (name, "addr"))
6250               || (do_debug_cu_index && const_strneq (name, "cu_index"))
6251               || (do_debug_cu_index && const_strneq (name, "tu_index"))
6252               )
6253             request_dump_bynumber (filedata, i, DEBUG_DUMP);
6254         }
6255       /* Linkonce section to be combined with .debug_info at link time.  */
6256       else if ((do_debugging || do_debug_info)
6257                && const_strneq (name, ".gnu.linkonce.wi."))
6258         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6259       else if (do_debug_frames && streq (name, ".eh_frame"))
6260         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6261       else if (do_gdb_index && (streq (name, ".gdb_index")
6262                                 || streq (name, ".debug_names")))
6263         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6264       /* Trace sections for Itanium VMS.  */
6265       else if ((do_debugging || do_trace_info || do_trace_abbrevs
6266                 || do_trace_aranges)
6267                && const_strneq (name, ".trace_"))
6268         {
6269           name += sizeof (".trace_") - 1;
6270
6271           if (do_debugging
6272               || (do_trace_info     && streq (name, "info"))
6273               || (do_trace_abbrevs  && streq (name, "abbrev"))
6274               || (do_trace_aranges  && streq (name, "aranges"))
6275               )
6276             request_dump_bynumber (filedata, i, DEBUG_DUMP);
6277         }
6278       else if ((do_debugging || do_debug_links)
6279                && (const_strneq (name, ".gnu_debuglink")
6280                    || const_strneq (name, ".gnu_debugaltlink")))
6281         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6282     }
6283
6284   if (! do_sections)
6285     return TRUE;
6286
6287   if (filedata->file_header.e_shnum > 1)
6288     printf (_("\nSection Headers:\n"));
6289   else
6290     printf (_("\nSection Header:\n"));
6291
6292   if (is_32bit_elf)
6293     {
6294       if (do_section_details)
6295         {
6296           printf (_("  [Nr] Name\n"));
6297           printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
6298         }
6299       else
6300         printf
6301           (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
6302     }
6303   else if (do_wide)
6304     {
6305       if (do_section_details)
6306         {
6307           printf (_("  [Nr] Name\n"));
6308           printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
6309         }
6310       else
6311         printf
6312           (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
6313     }
6314   else
6315     {
6316       if (do_section_details)
6317         {
6318           printf (_("  [Nr] Name\n"));
6319           printf (_("       Type              Address          Offset            Link\n"));
6320           printf (_("       Size              EntSize          Info              Align\n"));
6321         }
6322       else
6323         {
6324           printf (_("  [Nr] Name              Type             Address           Offset\n"));
6325           printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
6326         }
6327     }
6328
6329   if (do_section_details)
6330     printf (_("       Flags\n"));
6331
6332   for (i = 0, section = filedata->section_headers;
6333        i < filedata->file_header.e_shnum;
6334        i++, section++)
6335     {
6336       /* Run some sanity checks on the section header.  */
6337
6338       /* Check the sh_link field.  */
6339       switch (section->sh_type)
6340         {
6341         case SHT_REL:
6342         case SHT_RELA:
6343           if (section->sh_link == 0
6344               && (filedata->file_header.e_type == ET_EXEC
6345                   || filedata->file_header.e_type == ET_DYN))
6346             /* A dynamic relocation section where all entries use a
6347                zero symbol index need not specify a symtab section.  */
6348             break;
6349           /* Fall through.  */
6350         case SHT_SYMTAB_SHNDX:
6351         case SHT_GROUP:
6352         case SHT_HASH:
6353         case SHT_GNU_HASH:
6354         case SHT_GNU_versym:
6355           if (section->sh_link == 0
6356               || section->sh_link >= filedata->file_header.e_shnum
6357               || (filedata->section_headers[section->sh_link].sh_type != SHT_SYMTAB
6358                   && filedata->section_headers[section->sh_link].sh_type != SHT_DYNSYM))
6359             warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6360                   i, section->sh_link);
6361           break;
6362
6363         case SHT_DYNAMIC:
6364         case SHT_SYMTAB:
6365         case SHT_DYNSYM:
6366         case SHT_GNU_verneed:
6367         case SHT_GNU_verdef:
6368         case SHT_GNU_LIBLIST:
6369           if (section->sh_link == 0
6370               || section->sh_link >= filedata->file_header.e_shnum
6371               || filedata->section_headers[section->sh_link].sh_type != SHT_STRTAB)
6372             warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6373                   i, section->sh_link);
6374           break;
6375
6376         case SHT_INIT_ARRAY:
6377         case SHT_FINI_ARRAY:
6378         case SHT_PREINIT_ARRAY:
6379           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6380             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6381                   i, section->sh_link);
6382           break;
6383
6384         default:
6385           /* FIXME: Add support for target specific section types.  */
6386 #if 0     /* Currently we do not check other section types as there are too
6387              many special cases.  Stab sections for example have a type
6388              of SHT_PROGBITS but an sh_link field that links to the .stabstr
6389              section.  */
6390           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6391             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6392                   i, section->sh_link);
6393 #endif
6394           break;
6395         }
6396
6397       /* Check the sh_info field.  */
6398       switch (section->sh_type)
6399         {
6400         case SHT_REL:
6401         case SHT_RELA:
6402           if (section->sh_info == 0
6403               && (filedata->file_header.e_type == ET_EXEC
6404                   || filedata->file_header.e_type == ET_DYN))
6405             /* Dynamic relocations apply to segments, so they do not
6406                need to specify the section they relocate.  */
6407             break;
6408           if (section->sh_info == 0
6409               || section->sh_info >= filedata->file_header.e_shnum
6410               || (filedata->section_headers[section->sh_info].sh_type != SHT_PROGBITS
6411                   && filedata->section_headers[section->sh_info].sh_type != SHT_NOBITS
6412                   && filedata->section_headers[section->sh_info].sh_type != SHT_NOTE
6413                   && filedata->section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
6414                   && filedata->section_headers[section->sh_info].sh_type != SHT_FINI_ARRAY
6415                   && filedata->section_headers[section->sh_info].sh_type != SHT_PREINIT_ARRAY
6416                   /* FIXME: Are other section types valid ?  */
6417                   && filedata->section_headers[section->sh_info].sh_type < SHT_LOOS))
6418             warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6419                   i, section->sh_info);
6420           break;
6421
6422         case SHT_DYNAMIC:
6423         case SHT_HASH:
6424         case SHT_SYMTAB_SHNDX:
6425         case SHT_INIT_ARRAY:
6426         case SHT_FINI_ARRAY:
6427         case SHT_PREINIT_ARRAY:
6428           if (section->sh_info != 0)
6429             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6430                   i, section->sh_info);
6431           break;
6432
6433         case SHT_GROUP:
6434         case SHT_SYMTAB:
6435         case SHT_DYNSYM:
6436           /* A symbol index - we assume that it is valid.  */
6437           break;
6438
6439         default:
6440           /* FIXME: Add support for target specific section types.  */
6441           if (section->sh_type == SHT_NOBITS)
6442             /* NOBITS section headers with non-zero sh_info fields can be
6443                created when a binary is stripped of everything but its debug
6444                information.  The stripped sections have their headers
6445                preserved but their types set to SHT_NOBITS.  So do not check
6446                this type of section.  */
6447             ;
6448           else if (section->sh_flags & SHF_INFO_LINK)
6449             {
6450               if (section->sh_info < 1 || section->sh_info >= filedata->file_header.e_shnum)
6451                 warn (_("[%2u]: Expected link to another section in info field"), i);
6452             }
6453           else if (section->sh_type < SHT_LOOS
6454                    && (section->sh_flags & SHF_GNU_MBIND) == 0
6455                    && section->sh_info != 0)
6456             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6457                   i, section->sh_info);
6458           break;
6459         }
6460
6461       /* Check the sh_size field.  */
6462       if (section->sh_size > filedata->file_size
6463           && section->sh_type != SHT_NOBITS
6464           && section->sh_type != SHT_NULL
6465           && section->sh_type < SHT_LOOS)
6466         warn (_("Size of section %u is larger than the entire file!\n"), i);
6467
6468       printf ("  [%2u] ", i);
6469       if (do_section_details)
6470         printf ("%s\n      ", printable_section_name (filedata, section));
6471       else
6472         print_symbol (-17, SECTION_NAME (section));
6473
6474       printf (do_wide ? " %-15s " : " %-15.15s ",
6475               get_section_type_name (filedata, section->sh_type));
6476
6477       if (is_32bit_elf)
6478         {
6479           const char * link_too_big = NULL;
6480
6481           print_vma (section->sh_addr, LONG_HEX);
6482
6483           printf ( " %6.6lx %6.6lx %2.2lx",
6484                    (unsigned long) section->sh_offset,
6485                    (unsigned long) section->sh_size,
6486                    (unsigned long) section->sh_entsize);
6487
6488           if (do_section_details)
6489             fputs ("  ", stdout);
6490           else
6491             printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6492
6493           if (section->sh_link >= filedata->file_header.e_shnum)
6494             {
6495               link_too_big = "";
6496               /* The sh_link value is out of range.  Normally this indicates
6497                  an error but it can have special values in Solaris binaries.  */
6498               switch (filedata->file_header.e_machine)
6499                 {
6500                 case EM_386:
6501                 case EM_IAMCU:
6502                 case EM_X86_64:
6503                 case EM_L1OM:
6504                 case EM_K1OM:
6505                 case EM_OLD_SPARCV9:
6506                 case EM_SPARC32PLUS:
6507                 case EM_SPARCV9:
6508                 case EM_SPARC:
6509                   if (section->sh_link == (SHN_BEFORE & 0xffff))
6510                     link_too_big = "BEFORE";
6511                   else if (section->sh_link == (SHN_AFTER & 0xffff))
6512                     link_too_big = "AFTER";
6513                   break;
6514                 default:
6515                   break;
6516                 }
6517             }
6518
6519           if (do_section_details)
6520             {
6521               if (link_too_big != NULL && * link_too_big)
6522                 printf ("<%s> ", link_too_big);
6523               else
6524                 printf ("%2u ", section->sh_link);
6525               printf ("%3u %2lu\n", section->sh_info,
6526                       (unsigned long) section->sh_addralign);
6527             }
6528           else
6529             printf ("%2u %3u %2lu\n",
6530                     section->sh_link,
6531                     section->sh_info,
6532                     (unsigned long) section->sh_addralign);
6533
6534           if (link_too_big && ! * link_too_big)
6535             warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6536                   i, section->sh_link);
6537         }
6538       else if (do_wide)
6539         {
6540           print_vma (section->sh_addr, LONG_HEX);
6541
6542           if ((long) section->sh_offset == section->sh_offset)
6543             printf (" %6.6lx", (unsigned long) section->sh_offset);
6544           else
6545             {
6546               putchar (' ');
6547               print_vma (section->sh_offset, LONG_HEX);
6548             }
6549
6550           if ((unsigned long) section->sh_size == section->sh_size)
6551             printf (" %6.6lx", (unsigned long) section->sh_size);
6552           else
6553             {
6554               putchar (' ');
6555               print_vma (section->sh_size, LONG_HEX);
6556             }
6557
6558           if ((unsigned long) section->sh_entsize == section->sh_entsize)
6559             printf (" %2.2lx", (unsigned long) section->sh_entsize);
6560           else
6561             {
6562               putchar (' ');
6563               print_vma (section->sh_entsize, LONG_HEX);
6564             }
6565
6566           if (do_section_details)
6567             fputs ("  ", stdout);
6568           else
6569             printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6570
6571           printf ("%2u %3u ", section->sh_link, section->sh_info);
6572
6573           if ((unsigned long) section->sh_addralign == section->sh_addralign)
6574             printf ("%2lu\n", (unsigned long) section->sh_addralign);
6575           else
6576             {
6577               print_vma (section->sh_addralign, DEC);
6578               putchar ('\n');
6579             }
6580         }
6581       else if (do_section_details)
6582         {
6583           putchar (' ');
6584           print_vma (section->sh_addr, LONG_HEX);
6585           if ((long) section->sh_offset == section->sh_offset)
6586             printf ("  %16.16lx", (unsigned long) section->sh_offset);
6587           else
6588             {
6589               printf ("  ");
6590               print_vma (section->sh_offset, LONG_HEX);
6591             }
6592           printf ("  %u\n       ", section->sh_link);
6593           print_vma (section->sh_size, LONG_HEX);
6594           putchar (' ');
6595           print_vma (section->sh_entsize, LONG_HEX);
6596
6597           printf ("  %-16u  %lu\n",
6598                   section->sh_info,
6599                   (unsigned long) section->sh_addralign);
6600         }
6601       else
6602         {
6603           putchar (' ');
6604           print_vma (section->sh_addr, LONG_HEX);
6605           if ((long) section->sh_offset == section->sh_offset)
6606             printf ("  %8.8lx", (unsigned long) section->sh_offset);
6607           else
6608             {
6609               printf ("  ");
6610               print_vma (section->sh_offset, LONG_HEX);
6611             }
6612           printf ("\n       ");
6613           print_vma (section->sh_size, LONG_HEX);
6614           printf ("  ");
6615           print_vma (section->sh_entsize, LONG_HEX);
6616
6617           printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6618
6619           printf ("     %2u   %3u     %lu\n",
6620                   section->sh_link,
6621                   section->sh_info,
6622                   (unsigned long) section->sh_addralign);
6623         }
6624
6625       if (do_section_details)
6626         {
6627           printf ("       %s\n", get_elf_section_flags (filedata, section->sh_flags));
6628           if ((section->sh_flags & SHF_COMPRESSED) != 0)
6629             {
6630               /* Minimum section size is 12 bytes for 32-bit compression
6631                  header + 12 bytes for compressed data header.  */
6632               unsigned char buf[24];
6633
6634               assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6635               if (get_data (&buf, filedata, section->sh_offset, 1,
6636                             sizeof (buf), _("compression header")))
6637                 {
6638                   Elf_Internal_Chdr chdr;
6639
6640                   (void) get_compression_header (&chdr, buf, sizeof (buf));
6641
6642                   if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6643                     printf ("       ZLIB, ");
6644                   else
6645                     printf (_("       [<unknown>: 0x%x], "),
6646                             chdr.ch_type);
6647                   print_vma (chdr.ch_size, LONG_HEX);
6648                   printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6649                 }
6650             }
6651         }
6652     }
6653
6654   if (!do_section_details)
6655     {
6656       /* The ordering of the letters shown here matches the ordering of the
6657          corresponding SHF_xxx values, and hence the order in which these
6658          letters will be displayed to the user.  */
6659       printf (_("Key to Flags:\n\
6660   W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6661   L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6662   C (compressed), x (unknown), o (OS specific), E (exclude),\n  "));
6663       if (filedata->file_header.e_machine == EM_X86_64
6664           || filedata->file_header.e_machine == EM_L1OM
6665           || filedata->file_header.e_machine == EM_K1OM)
6666         printf (_("l (large), "));
6667       else if (filedata->file_header.e_machine == EM_ARM)
6668         printf (_("y (purecode), "));
6669       else if (filedata->file_header.e_machine == EM_PPC)
6670         printf (_("v (VLE), "));
6671       printf ("p (processor specific)\n");
6672     }
6673
6674   return TRUE;
6675 }
6676
6677 static const char *
6678 get_group_flags (unsigned int flags)
6679 {
6680   static char buff[128];
6681
6682   if (flags == 0)
6683     return "";
6684   else if (flags == GRP_COMDAT)
6685     return "COMDAT ";
6686
6687   snprintf (buff, 14, _("[0x%x: "), flags);
6688
6689   flags &= ~ GRP_COMDAT;
6690   if (flags & GRP_MASKOS)
6691     {
6692       strcat (buff, "<OS specific>");
6693       flags &= ~ GRP_MASKOS;
6694     }
6695
6696   if (flags & GRP_MASKPROC)
6697     {
6698       strcat (buff, "<PROC specific>");
6699       flags &= ~ GRP_MASKPROC;
6700     }
6701
6702   if (flags)
6703     strcat (buff, "<unknown>");
6704
6705   strcat (buff, "]");
6706   return buff;
6707 }
6708
6709 static bfd_boolean
6710 process_section_groups (Filedata * filedata)
6711 {
6712   Elf_Internal_Shdr * section;
6713   unsigned int i;
6714   struct group * group;
6715   Elf_Internal_Shdr * symtab_sec;
6716   Elf_Internal_Shdr * strtab_sec;
6717   Elf_Internal_Sym * symtab;
6718   unsigned long num_syms;
6719   char * strtab;
6720   size_t strtab_size;
6721
6722   /* Don't process section groups unless needed.  */
6723   if (!do_unwind && !do_section_groups)
6724     return TRUE;
6725
6726   if (filedata->file_header.e_shnum == 0)
6727     {
6728       if (do_section_groups)
6729         printf (_("\nThere are no sections to group in this file.\n"));
6730
6731       return TRUE;
6732     }
6733
6734   if (filedata->section_headers == NULL)
6735     {
6736       error (_("Section headers are not available!\n"));
6737       /* PR 13622: This can happen with a corrupt ELF header.  */
6738       return FALSE;
6739     }
6740
6741   section_headers_groups = (struct group **) calloc (filedata->file_header.e_shnum,
6742                                                      sizeof (struct group *));
6743
6744   if (section_headers_groups == NULL)
6745     {
6746       error (_("Out of memory reading %u section group headers\n"),
6747              filedata->file_header.e_shnum);
6748       return FALSE;
6749     }
6750
6751   /* Scan the sections for the group section.  */
6752   group_count = 0;
6753   for (i = 0, section = filedata->section_headers;
6754        i < filedata->file_header.e_shnum;
6755        i++, section++)
6756     if (section->sh_type == SHT_GROUP)
6757       group_count++;
6758
6759   if (group_count == 0)
6760     {
6761       if (do_section_groups)
6762         printf (_("\nThere are no section groups in this file.\n"));
6763
6764       return TRUE;
6765     }
6766
6767   section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6768
6769   if (section_groups == NULL)
6770     {
6771       error (_("Out of memory reading %lu groups\n"),
6772              (unsigned long) group_count);
6773       return FALSE;
6774     }
6775
6776   symtab_sec = NULL;
6777   strtab_sec = NULL;
6778   symtab = NULL;
6779   num_syms = 0;
6780   strtab = NULL;
6781   strtab_size = 0;
6782   for (i = 0, section = filedata->section_headers, group = section_groups;
6783        i < filedata->file_header.e_shnum;
6784        i++, section++)
6785     {
6786       if (section->sh_type == SHT_GROUP)
6787         {
6788           const char * name = printable_section_name (filedata, section);
6789           const char * group_name;
6790           unsigned char * start;
6791           unsigned char * indices;
6792           unsigned int entry, j, size;
6793           Elf_Internal_Shdr * sec;
6794           Elf_Internal_Sym * sym;
6795
6796           /* Get the symbol table.  */
6797           if (section->sh_link >= filedata->file_header.e_shnum
6798               || ((sec = filedata->section_headers + section->sh_link)->sh_type
6799                   != SHT_SYMTAB))
6800             {
6801               error (_("Bad sh_link in group section `%s'\n"), name);
6802               continue;
6803             }
6804
6805           if (symtab_sec != sec)
6806             {
6807               symtab_sec = sec;
6808               if (symtab)
6809                 free (symtab);
6810               symtab = GET_ELF_SYMBOLS (filedata, symtab_sec, & num_syms);
6811             }
6812
6813           if (symtab == NULL)
6814             {
6815               error (_("Corrupt header in group section `%s'\n"), name);
6816               continue;
6817             }
6818
6819           if (section->sh_info >= num_syms)
6820             {
6821               error (_("Bad sh_info in group section `%s'\n"), name);
6822               continue;
6823             }
6824
6825           sym = symtab + section->sh_info;
6826
6827           if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6828             {
6829               if (sym->st_shndx == 0
6830                   || sym->st_shndx >= filedata->file_header.e_shnum)
6831                 {
6832                   error (_("Bad sh_info in group section `%s'\n"), name);
6833                   continue;
6834                 }
6835
6836               group_name = SECTION_NAME (filedata->section_headers + sym->st_shndx);
6837               strtab_sec = NULL;
6838               if (strtab)
6839                 free (strtab);
6840               strtab = NULL;
6841               strtab_size = 0;
6842             }
6843           else
6844             {
6845               /* Get the string table.  */
6846               if (symtab_sec->sh_link >= filedata->file_header.e_shnum)
6847                 {
6848                   strtab_sec = NULL;
6849                   if (strtab)
6850                     free (strtab);
6851                   strtab = NULL;
6852                   strtab_size = 0;
6853                 }
6854               else if (strtab_sec
6855                        != (sec = filedata->section_headers + symtab_sec->sh_link))
6856                 {
6857                   strtab_sec = sec;
6858                   if (strtab)
6859                     free (strtab);
6860
6861                   strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
6862                                               1, strtab_sec->sh_size,
6863                                               _("string table"));
6864                   strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6865                 }
6866               group_name = sym->st_name < strtab_size
6867                 ? strtab + sym->st_name : _("<corrupt>");
6868             }
6869
6870           /* PR 17531: file: loop.  */
6871           if (section->sh_entsize > section->sh_size)
6872             {
6873               error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6874                      printable_section_name (filedata, section),
6875                      (unsigned long) section->sh_entsize,
6876                      (unsigned long) section->sh_size);
6877               break;
6878             }
6879
6880           start = (unsigned char *) get_data (NULL, filedata, section->sh_offset,
6881                                               1, section->sh_size,
6882                                               _("section data"));
6883           if (start == NULL)
6884             continue;
6885
6886           indices = start;
6887           size = (section->sh_size / section->sh_entsize) - 1;
6888           entry = byte_get (indices, 4);
6889           indices += 4;
6890
6891           if (do_section_groups)
6892             {
6893               printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6894                       get_group_flags (entry), i, name, group_name, size);
6895
6896               printf (_("   [Index]    Name\n"));
6897             }
6898
6899           group->group_index = i;
6900
6901           for (j = 0; j < size; j++)
6902             {
6903               struct group_list * g;
6904
6905               entry = byte_get (indices, 4);
6906               indices += 4;
6907
6908               if (entry >= filedata->file_header.e_shnum)
6909                 {
6910                   static unsigned num_group_errors = 0;
6911
6912                   if (num_group_errors ++ < 10)
6913                     {
6914                       error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6915                              entry, i, filedata->file_header.e_shnum - 1);
6916                       if (num_group_errors == 10)
6917                         warn (_("Further error messages about overlarge group section indices suppressed\n"));
6918                     }
6919                   continue;
6920                 }
6921
6922               if (section_headers_groups [entry] != NULL)
6923                 {
6924                   if (entry)
6925                     {
6926                       static unsigned num_errs = 0;
6927
6928                       if (num_errs ++ < 10)
6929                         {
6930                           error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6931                                  entry, i,
6932                                  section_headers_groups [entry]->group_index);
6933                           if (num_errs == 10)
6934                             warn (_("Further error messages about already contained group sections suppressed\n"));
6935                         }
6936                       continue;
6937                     }
6938                   else
6939                     {
6940                       /* Intel C/C++ compiler may put section 0 in a
6941                          section group.  We just warn it the first time
6942                          and ignore it afterwards.  */
6943                       static bfd_boolean warned = FALSE;
6944                       if (!warned)
6945                         {
6946                           error (_("section 0 in group section [%5u]\n"),
6947                                  section_headers_groups [entry]->group_index);
6948                           warned = TRUE;
6949                         }
6950                     }
6951                 }
6952
6953               section_headers_groups [entry] = group;
6954
6955               if (do_section_groups)
6956                 {
6957                   sec = filedata->section_headers + entry;
6958                   printf ("   [%5u]   %s\n", entry, printable_section_name (filedata, sec));
6959                 }
6960
6961               g = (struct group_list *) xmalloc (sizeof (struct group_list));
6962               g->section_index = entry;
6963               g->next = group->root;
6964               group->root = g;
6965             }
6966
6967           if (start)
6968             free (start);
6969
6970           group++;
6971         }
6972     }
6973
6974   if (symtab)
6975     free (symtab);
6976   if (strtab)
6977     free (strtab);
6978   return TRUE;
6979 }
6980
6981 /* Data used to display dynamic fixups.  */
6982
6983 struct ia64_vms_dynfixup
6984 {
6985   bfd_vma needed_ident;         /* Library ident number.  */
6986   bfd_vma needed;               /* Index in the dstrtab of the library name.  */
6987   bfd_vma fixup_needed;         /* Index of the library.  */
6988   bfd_vma fixup_rela_cnt;       /* Number of fixups.  */
6989   bfd_vma fixup_rela_off;       /* Fixups offset in the dynamic segment.  */
6990 };
6991
6992 /* Data used to display dynamic relocations.  */
6993
6994 struct ia64_vms_dynimgrela
6995 {
6996   bfd_vma img_rela_cnt;         /* Number of relocations.  */
6997   bfd_vma img_rela_off;         /* Reloc offset in the dynamic segment.  */
6998 };
6999
7000 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
7001    library).  */
7002
7003 static bfd_boolean
7004 dump_ia64_vms_dynamic_fixups (Filedata *                  filedata,
7005                               struct ia64_vms_dynfixup *  fixup,
7006                               const char *                strtab,
7007                               unsigned int                strtab_sz)
7008 {
7009   Elf64_External_VMS_IMAGE_FIXUP * imfs;
7010   long i;
7011   const char * lib_name;
7012
7013   imfs = get_data (NULL, filedata, dynamic_addr + fixup->fixup_rela_off,
7014                    1, fixup->fixup_rela_cnt * sizeof (*imfs),
7015                    _("dynamic section image fixups"));
7016   if (!imfs)
7017     return FALSE;
7018
7019   if (fixup->needed < strtab_sz)
7020     lib_name = strtab + fixup->needed;
7021   else
7022     {
7023       warn (_("corrupt library name index of 0x%lx found in dynamic entry"),
7024             (unsigned long) fixup->needed);
7025       lib_name = "???";
7026     }
7027   printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
7028           (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
7029   printf
7030     (_("Seg Offset           Type                             SymVec DataType\n"));
7031
7032   for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
7033     {
7034       unsigned int type;
7035       const char *rtype;
7036
7037       printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
7038       printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
7039       type = BYTE_GET (imfs [i].type);
7040       rtype = elf_ia64_reloc_type (type);
7041       if (rtype == NULL)
7042         printf (" 0x%08x                       ", type);
7043       else
7044         printf (" %-32s ", rtype);
7045       printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
7046       printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
7047     }
7048
7049   free (imfs);
7050   return TRUE;
7051 }
7052
7053 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
7054
7055 static bfd_boolean
7056 dump_ia64_vms_dynamic_relocs (Filedata * filedata, struct ia64_vms_dynimgrela *imgrela)
7057 {
7058   Elf64_External_VMS_IMAGE_RELA *imrs;
7059   long i;
7060
7061   imrs = get_data (NULL, filedata, dynamic_addr + imgrela->img_rela_off,
7062                    1, imgrela->img_rela_cnt * sizeof (*imrs),
7063                    _("dynamic section image relocations"));
7064   if (!imrs)
7065     return FALSE;
7066
7067   printf (_("\nImage relocs\n"));
7068   printf
7069     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
7070
7071   for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
7072     {
7073       unsigned int type;
7074       const char *rtype;
7075
7076       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
7077       printf ("%08" BFD_VMA_FMT "x ",
7078               (bfd_vma) BYTE_GET (imrs [i].rela_offset));
7079       type = BYTE_GET (imrs [i].type);
7080       rtype = elf_ia64_reloc_type (type);
7081       if (rtype == NULL)
7082         printf ("0x%08x                      ", type);
7083       else
7084         printf ("%-31s ", rtype);
7085       print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
7086       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
7087       printf ("%08" BFD_VMA_FMT "x\n",
7088               (bfd_vma) BYTE_GET (imrs [i].sym_offset));
7089     }
7090
7091   free (imrs);
7092   return TRUE;
7093 }
7094
7095 /* Display IA-64 OpenVMS dynamic relocations and fixups.  */
7096
7097 static bfd_boolean
7098 process_ia64_vms_dynamic_relocs (Filedata * filedata)
7099 {
7100   struct ia64_vms_dynfixup fixup;
7101   struct ia64_vms_dynimgrela imgrela;
7102   Elf_Internal_Dyn *entry;
7103   bfd_vma strtab_off = 0;
7104   bfd_vma strtab_sz = 0;
7105   char *strtab = NULL;
7106   bfd_boolean res = TRUE;
7107
7108   memset (&fixup, 0, sizeof (fixup));
7109   memset (&imgrela, 0, sizeof (imgrela));
7110
7111   /* Note: the order of the entries is specified by the OpenVMS specs.  */
7112   for (entry = dynamic_section;
7113        entry < dynamic_section + dynamic_nent;
7114        entry++)
7115     {
7116       switch (entry->d_tag)
7117         {
7118         case DT_IA_64_VMS_STRTAB_OFFSET:
7119           strtab_off = entry->d_un.d_val;
7120           break;
7121         case DT_STRSZ:
7122           strtab_sz = entry->d_un.d_val;
7123           if (strtab == NULL)
7124             strtab = get_data (NULL, filedata, dynamic_addr + strtab_off,
7125                                1, strtab_sz, _("dynamic string section"));
7126           break;
7127
7128         case DT_IA_64_VMS_NEEDED_IDENT:
7129           fixup.needed_ident = entry->d_un.d_val;
7130           break;
7131         case DT_NEEDED:
7132           fixup.needed = entry->d_un.d_val;
7133           break;
7134         case DT_IA_64_VMS_FIXUP_NEEDED:
7135           fixup.fixup_needed = entry->d_un.d_val;
7136           break;
7137         case DT_IA_64_VMS_FIXUP_RELA_CNT:
7138           fixup.fixup_rela_cnt = entry->d_un.d_val;
7139           break;
7140         case DT_IA_64_VMS_FIXUP_RELA_OFF:
7141           fixup.fixup_rela_off = entry->d_un.d_val;
7142           if (! dump_ia64_vms_dynamic_fixups (filedata, &fixup, strtab, strtab_sz))
7143             res = FALSE;
7144           break;
7145         case DT_IA_64_VMS_IMG_RELA_CNT:
7146           imgrela.img_rela_cnt = entry->d_un.d_val;
7147           break;
7148         case DT_IA_64_VMS_IMG_RELA_OFF:
7149           imgrela.img_rela_off = entry->d_un.d_val;
7150           if (! dump_ia64_vms_dynamic_relocs (filedata, &imgrela))
7151             res = FALSE;
7152           break;
7153
7154         default:
7155           break;
7156         }
7157     }
7158
7159   if (strtab != NULL)
7160     free (strtab);
7161
7162   return res;
7163 }
7164
7165 static struct
7166 {
7167   const char * name;
7168   int reloc;
7169   int size;
7170   int rela;
7171 }
7172   dynamic_relocations [] =
7173 {
7174   { "REL", DT_REL, DT_RELSZ, FALSE },
7175   { "RELA", DT_RELA, DT_RELASZ, TRUE },
7176   { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
7177 };
7178
7179 /* Process the reloc section.  */
7180
7181 static bfd_boolean
7182 process_relocs (Filedata * filedata)
7183 {
7184   unsigned long rel_size;
7185   unsigned long rel_offset;
7186
7187   if (!do_reloc)
7188     return TRUE;
7189
7190   if (do_using_dynamic)
7191     {
7192       int          is_rela;
7193       const char * name;
7194       bfd_boolean  has_dynamic_reloc;
7195       unsigned int i;
7196
7197       has_dynamic_reloc = FALSE;
7198
7199       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7200         {
7201           is_rela = dynamic_relocations [i].rela;
7202           name = dynamic_relocations [i].name;
7203           rel_size = dynamic_info [dynamic_relocations [i].size];
7204           rel_offset = dynamic_info [dynamic_relocations [i].reloc];
7205
7206           if (rel_size)
7207             has_dynamic_reloc = TRUE;
7208
7209           if (is_rela == UNKNOWN)
7210             {
7211               if (dynamic_relocations [i].reloc == DT_JMPREL)
7212                 switch (dynamic_info[DT_PLTREL])
7213                   {
7214                   case DT_REL:
7215                     is_rela = FALSE;
7216                     break;
7217                   case DT_RELA:
7218                     is_rela = TRUE;
7219                     break;
7220                   }
7221             }
7222
7223           if (rel_size)
7224             {
7225               printf
7226                 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
7227                  name, rel_offset, rel_size);
7228
7229               dump_relocations (filedata,
7230                                 offset_from_vma (filedata, rel_offset, rel_size),
7231                                 rel_size,
7232                                 dynamic_symbols, num_dynamic_syms,
7233                                 dynamic_strings, dynamic_strings_length,
7234                                 is_rela, TRUE /* is_dynamic */);
7235             }
7236         }
7237
7238       if (is_ia64_vms (filedata))
7239         if (process_ia64_vms_dynamic_relocs (filedata))
7240           has_dynamic_reloc = TRUE;
7241
7242       if (! has_dynamic_reloc)
7243         printf (_("\nThere are no dynamic relocations in this file.\n"));
7244     }
7245   else
7246     {
7247       Elf_Internal_Shdr * section;
7248       unsigned long i;
7249       bfd_boolean found = FALSE;
7250
7251       for (i = 0, section = filedata->section_headers;
7252            i < filedata->file_header.e_shnum;
7253            i++, section++)
7254         {
7255           if (   section->sh_type != SHT_RELA
7256               && section->sh_type != SHT_REL)
7257             continue;
7258
7259           rel_offset = section->sh_offset;
7260           rel_size   = section->sh_size;
7261
7262           if (rel_size)
7263             {
7264               Elf_Internal_Shdr * strsec;
7265               int is_rela;
7266               unsigned long num_rela;
7267
7268               printf (_("\nRelocation section "));
7269
7270               if (filedata->string_table == NULL)
7271                 printf ("%d", section->sh_name);
7272               else
7273                 printf ("'%s'", printable_section_name (filedata, section));
7274
7275               num_rela = rel_size / section->sh_entsize;
7276               printf (ngettext (" at offset 0x%lx contains %lu entry:\n",
7277                                 " at offset 0x%lx contains %lu entries:\n",
7278                                 num_rela),
7279                       rel_offset, num_rela);
7280
7281               is_rela = section->sh_type == SHT_RELA;
7282
7283               if (section->sh_link != 0
7284                   && section->sh_link < filedata->file_header.e_shnum)
7285                 {
7286                   Elf_Internal_Shdr * symsec;
7287                   Elf_Internal_Sym *  symtab;
7288                   unsigned long nsyms;
7289                   unsigned long strtablen = 0;
7290                   char * strtab = NULL;
7291
7292                   symsec = filedata->section_headers + section->sh_link;
7293                   if (symsec->sh_type != SHT_SYMTAB
7294                       && symsec->sh_type != SHT_DYNSYM)
7295                     continue;
7296
7297                   symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
7298
7299                   if (symtab == NULL)
7300                     continue;
7301
7302                   if (symsec->sh_link != 0
7303                       && symsec->sh_link < filedata->file_header.e_shnum)
7304                     {
7305                       strsec = filedata->section_headers + symsec->sh_link;
7306
7307                       strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7308                                                   1, strsec->sh_size,
7309                                                   _("string table"));
7310                       strtablen = strtab == NULL ? 0 : strsec->sh_size;
7311                     }
7312
7313                   dump_relocations (filedata, rel_offset, rel_size,
7314                                     symtab, nsyms, strtab, strtablen,
7315                                     is_rela,
7316                                     symsec->sh_type == SHT_DYNSYM);
7317                   if (strtab)
7318                     free (strtab);
7319                   free (symtab);
7320                 }
7321               else
7322                 dump_relocations (filedata, rel_offset, rel_size,
7323                                   NULL, 0, NULL, 0, is_rela,
7324                                   FALSE /* is_dynamic */);
7325
7326               found = TRUE;
7327             }
7328         }
7329
7330       if (! found)
7331         {
7332           /* Users sometimes forget the -D option, so try to be helpful.  */
7333           for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7334             {
7335               if (dynamic_info [dynamic_relocations [i].size])
7336                 {
7337                   printf (_("\nThere are no static relocations in this file."));
7338                   printf (_("\nTo see the dynamic relocations add --use-dynamic to the command line.\n"));
7339
7340                   break;
7341                 }
7342             }
7343           if (i == ARRAY_SIZE (dynamic_relocations))
7344             printf (_("\nThere are no relocations in this file.\n"));
7345         }
7346     }
7347
7348   return TRUE;
7349 }
7350
7351 /* An absolute address consists of a section and an offset.  If the
7352    section is NULL, the offset itself is the address, otherwise, the
7353    address equals to LOAD_ADDRESS(section) + offset.  */
7354
7355 struct absaddr
7356 {
7357   unsigned short section;
7358   bfd_vma offset;
7359 };
7360
7361 #define ABSADDR(a) \
7362   ((a).section \
7363    ? filedata->section_headers [(a).section].sh_addr + (a).offset \
7364    : (a).offset)
7365
7366 /* Find the nearest symbol at or below ADDR.  Returns the symbol
7367    name, if found, and the offset from the symbol to ADDR.  */
7368
7369 static void
7370 find_symbol_for_address (Filedata *          filedata,
7371                          Elf_Internal_Sym *  symtab,
7372                          unsigned long       nsyms,
7373                          const char *        strtab,
7374                          unsigned long       strtab_size,
7375                          struct absaddr      addr,
7376                          const char **       symname,
7377                          bfd_vma *           offset)
7378 {
7379   bfd_vma dist = 0x100000;
7380   Elf_Internal_Sym * sym;
7381   Elf_Internal_Sym * beg;
7382   Elf_Internal_Sym * end;
7383   Elf_Internal_Sym * best = NULL;
7384
7385   REMOVE_ARCH_BITS (addr.offset);
7386   beg = symtab;
7387   end = symtab + nsyms;
7388
7389   while (beg < end)
7390     {
7391       bfd_vma value;
7392
7393       sym = beg + (end - beg) / 2;
7394
7395       value = sym->st_value;
7396       REMOVE_ARCH_BITS (value);
7397
7398       if (sym->st_name != 0
7399           && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
7400           && addr.offset >= value
7401           && addr.offset - value < dist)
7402         {
7403           best = sym;
7404           dist = addr.offset - value;
7405           if (!dist)
7406             break;
7407         }
7408
7409       if (addr.offset < value)
7410         end = sym;
7411       else
7412         beg = sym + 1;
7413     }
7414
7415   if (best)
7416     {
7417       *symname = (best->st_name >= strtab_size
7418                   ? _("<corrupt>") : strtab + best->st_name);
7419       *offset = dist;
7420       return;
7421     }
7422
7423   *symname = NULL;
7424   *offset = addr.offset;
7425 }
7426
7427 static /* signed */ int
7428 symcmp (const void *p, const void *q)
7429 {
7430   Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7431   Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7432
7433   return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7434 }
7435
7436 /* Process the unwind section.  */
7437
7438 #include "unwind-ia64.h"
7439
7440 struct ia64_unw_table_entry
7441 {
7442   struct absaddr start;
7443   struct absaddr end;
7444   struct absaddr info;
7445 };
7446
7447 struct ia64_unw_aux_info
7448 {
7449   struct ia64_unw_table_entry * table;          /* Unwind table.  */
7450   unsigned long                 table_len;      /* Length of unwind table.  */
7451   unsigned char *               info;           /* Unwind info.  */
7452   unsigned long                 info_size;      /* Size of unwind info.  */
7453   bfd_vma                       info_addr;      /* Starting address of unwind info.  */
7454   bfd_vma                       seg_base;       /* Starting address of segment.  */
7455   Elf_Internal_Sym *            symtab;         /* The symbol table.  */
7456   unsigned long                 nsyms;          /* Number of symbols.  */
7457   Elf_Internal_Sym *            funtab;         /* Sorted table of STT_FUNC symbols.  */
7458   unsigned long                 nfuns;          /* Number of entries in funtab.  */
7459   char *                        strtab;         /* The string table.  */
7460   unsigned long                 strtab_size;    /* Size of string table.  */
7461 };
7462
7463 static bfd_boolean
7464 dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
7465 {
7466   struct ia64_unw_table_entry * tp;
7467   unsigned long j, nfuns;
7468   int in_body;
7469   bfd_boolean res = TRUE;
7470
7471   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7472   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7473     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7474       aux->funtab[nfuns++] = aux->symtab[j];
7475   aux->nfuns = nfuns;
7476   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7477
7478   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7479     {
7480       bfd_vma stamp;
7481       bfd_vma offset;
7482       const unsigned char * dp;
7483       const unsigned char * head;
7484       const unsigned char * end;
7485       const char * procname;
7486
7487       find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7488                                aux->strtab_size, tp->start, &procname, &offset);
7489
7490       fputs ("\n<", stdout);
7491
7492       if (procname)
7493         {
7494           fputs (procname, stdout);
7495
7496           if (offset)
7497             printf ("+%lx", (unsigned long) offset);
7498         }
7499
7500       fputs (">: [", stdout);
7501       print_vma (tp->start.offset, PREFIX_HEX);
7502       fputc ('-', stdout);
7503       print_vma (tp->end.offset, PREFIX_HEX);
7504       printf ("], info at +0x%lx\n",
7505               (unsigned long) (tp->info.offset - aux->seg_base));
7506
7507       /* PR 17531: file: 86232b32.  */
7508       if (aux->info == NULL)
7509         continue;
7510
7511       /* PR 17531: file: 0997b4d1.  */
7512       if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7513         {
7514           warn (_("Invalid offset %lx in table entry %ld\n"),
7515                 (long) tp->info.offset, (long) (tp - aux->table));
7516           res = FALSE;
7517           continue;
7518         }
7519
7520       head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
7521       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7522
7523       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7524               (unsigned) UNW_VER (stamp),
7525               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7526               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7527               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7528               (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7529
7530       if (UNW_VER (stamp) != 1)
7531         {
7532           printf (_("\tUnknown version.\n"));
7533           continue;
7534         }
7535
7536       in_body = 0;
7537       end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7538       /* PR 17531: file: 16ceda89.  */
7539       if (end > aux->info + aux->info_size)
7540         end = aux->info + aux->info_size;
7541       for (dp = head + 8; dp < end;)
7542         dp = unw_decode (dp, in_body, & in_body, end);
7543     }
7544
7545   free (aux->funtab);
7546
7547   return res;
7548 }
7549
7550 static bfd_boolean
7551 slurp_ia64_unwind_table (Filedata *                  filedata,
7552                          struct ia64_unw_aux_info *  aux,
7553                          Elf_Internal_Shdr *         sec)
7554 {
7555   unsigned long size, nrelas, i;
7556   Elf_Internal_Phdr * seg;
7557   struct ia64_unw_table_entry * tep;
7558   Elf_Internal_Shdr * relsec;
7559   Elf_Internal_Rela * rela;
7560   Elf_Internal_Rela * rp;
7561   unsigned char * table;
7562   unsigned char * tp;
7563   Elf_Internal_Sym * sym;
7564   const char * relname;
7565
7566   aux->table_len = 0;
7567
7568   /* First, find the starting address of the segment that includes
7569      this section: */
7570
7571   if (filedata->file_header.e_phnum)
7572     {
7573       if (! get_program_headers (filedata))
7574           return FALSE;
7575
7576       for (seg = filedata->program_headers;
7577            seg < filedata->program_headers + filedata->file_header.e_phnum;
7578            ++seg)
7579         {
7580           if (seg->p_type != PT_LOAD)
7581             continue;
7582
7583           if (sec->sh_addr >= seg->p_vaddr
7584               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7585             {
7586               aux->seg_base = seg->p_vaddr;
7587               break;
7588             }
7589         }
7590     }
7591
7592   /* Second, build the unwind table from the contents of the unwind section:  */
7593   size = sec->sh_size;
7594   table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7595                                       _("unwind table"));
7596   if (!table)
7597     return FALSE;
7598
7599   aux->table_len = size / (3 * eh_addr_size);
7600   aux->table = (struct ia64_unw_table_entry *)
7601     xcmalloc (aux->table_len, sizeof (aux->table[0]));
7602   tep = aux->table;
7603
7604   for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7605     {
7606       tep->start.section = SHN_UNDEF;
7607       tep->end.section   = SHN_UNDEF;
7608       tep->info.section  = SHN_UNDEF;
7609       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7610       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7611       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7612       tep->start.offset += aux->seg_base;
7613       tep->end.offset   += aux->seg_base;
7614       tep->info.offset  += aux->seg_base;
7615     }
7616   free (table);
7617
7618   /* Third, apply any relocations to the unwind table:  */
7619   for (relsec = filedata->section_headers;
7620        relsec < filedata->section_headers + filedata->file_header.e_shnum;
7621        ++relsec)
7622     {
7623       if (relsec->sh_type != SHT_RELA
7624           || relsec->sh_info >= filedata->file_header.e_shnum
7625           || filedata->section_headers + relsec->sh_info != sec)
7626         continue;
7627
7628       if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
7629                               & rela, & nrelas))
7630         {
7631           free (aux->table);
7632           aux->table = NULL;
7633           aux->table_len = 0;
7634           return FALSE;
7635         }
7636
7637       for (rp = rela; rp < rela + nrelas; ++rp)
7638         {
7639           unsigned int sym_ndx;
7640           unsigned int r_type = get_reloc_type (filedata, rp->r_info);
7641           relname = elf_ia64_reloc_type (r_type);
7642
7643           /* PR 17531: file: 9fa67536.  */
7644           if (relname == NULL)
7645             {
7646               warn (_("Skipping unknown relocation type: %u\n"), r_type);
7647               continue;
7648             }
7649
7650           if (! const_strneq (relname, "R_IA64_SEGREL"))
7651             {
7652               warn (_("Skipping unexpected relocation type: %s\n"), relname);
7653               continue;
7654             }
7655
7656           i = rp->r_offset / (3 * eh_addr_size);
7657
7658           /* PR 17531: file: 5bc8d9bf.  */
7659           if (i >= aux->table_len)
7660             {
7661               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7662               continue;
7663             }
7664
7665           sym_ndx = get_reloc_symindex (rp->r_info);
7666           if (sym_ndx >= aux->nsyms)
7667             {
7668               warn (_("Skipping reloc with invalid symbol index: %u\n"),
7669                     sym_ndx);
7670               continue;
7671             }
7672           sym = aux->symtab + sym_ndx;
7673
7674           switch (rp->r_offset / eh_addr_size % 3)
7675             {
7676             case 0:
7677               aux->table[i].start.section = sym->st_shndx;
7678               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
7679               break;
7680             case 1:
7681               aux->table[i].end.section   = sym->st_shndx;
7682               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
7683               break;
7684             case 2:
7685               aux->table[i].info.section  = sym->st_shndx;
7686               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
7687               break;
7688             default:
7689               break;
7690             }
7691         }
7692
7693       free (rela);
7694     }
7695
7696   return TRUE;
7697 }
7698
7699 static bfd_boolean
7700 ia64_process_unwind (Filedata * filedata)
7701 {
7702   Elf_Internal_Shdr * sec;
7703   Elf_Internal_Shdr * unwsec = NULL;
7704   Elf_Internal_Shdr * strsec;
7705   unsigned long i, unwcount = 0, unwstart = 0;
7706   struct ia64_unw_aux_info aux;
7707   bfd_boolean res = TRUE;
7708
7709   memset (& aux, 0, sizeof (aux));
7710
7711   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
7712     {
7713       if (sec->sh_type == SHT_SYMTAB
7714           && sec->sh_link < filedata->file_header.e_shnum)
7715         {
7716           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
7717
7718           strsec = filedata->section_headers + sec->sh_link;
7719           if (aux.strtab != NULL)
7720             {
7721               error (_("Multiple auxillary string tables encountered\n"));
7722               free (aux.strtab);
7723               res = FALSE;
7724             }
7725           aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7726                                           1, strsec->sh_size,
7727                                           _("string table"));
7728           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7729         }
7730       else if (sec->sh_type == SHT_IA_64_UNWIND)
7731         unwcount++;
7732     }
7733
7734   if (!unwcount)
7735     printf (_("\nThere are no unwind sections in this file.\n"));
7736
7737   while (unwcount-- > 0)
7738     {
7739       char * suffix;
7740       size_t len, len2;
7741
7742       for (i = unwstart, sec = filedata->section_headers + unwstart, unwsec = NULL;
7743            i < filedata->file_header.e_shnum; ++i, ++sec)
7744         if (sec->sh_type == SHT_IA_64_UNWIND)
7745           {
7746             unwsec = sec;
7747             break;
7748           }
7749       /* We have already counted the number of SHT_IA64_UNWIND
7750          sections so the loop above should never fail.  */
7751       assert (unwsec != NULL);
7752
7753       unwstart = i + 1;
7754       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7755
7756       if ((unwsec->sh_flags & SHF_GROUP) != 0)
7757         {
7758           /* We need to find which section group it is in.  */
7759           struct group_list * g;
7760
7761           if (section_headers_groups == NULL
7762               || section_headers_groups [i] == NULL)
7763             i = filedata->file_header.e_shnum;
7764           else
7765             {
7766               g = section_headers_groups [i]->root;
7767
7768               for (; g != NULL; g = g->next)
7769                 {
7770                   sec = filedata->section_headers + g->section_index;
7771
7772                   if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7773                     break;
7774                 }
7775
7776               if (g == NULL)
7777                 i = filedata->file_header.e_shnum;
7778             }
7779         }
7780       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7781         {
7782           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
7783           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7784           suffix = SECTION_NAME (unwsec) + len;
7785           for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7786                ++i, ++sec)
7787             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7788                 && streq (SECTION_NAME (sec) + len2, suffix))
7789               break;
7790         }
7791       else
7792         {
7793           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7794              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
7795           len = sizeof (ELF_STRING_ia64_unwind) - 1;
7796           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7797           suffix = "";
7798           if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7799             suffix = SECTION_NAME (unwsec) + len;
7800           for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7801                ++i, ++sec)
7802             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7803                 && streq (SECTION_NAME (sec) + len2, suffix))
7804               break;
7805         }
7806
7807       if (i == filedata->file_header.e_shnum)
7808         {
7809           printf (_("\nCould not find unwind info section for "));
7810
7811           if (filedata->string_table == NULL)
7812             printf ("%d", unwsec->sh_name);
7813           else
7814             printf ("'%s'", printable_section_name (filedata, unwsec));
7815         }
7816       else
7817         {
7818           aux.info_addr = sec->sh_addr;
7819           aux.info = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1,
7820                                                  sec->sh_size,
7821                                                  _("unwind info"));
7822           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7823
7824           printf (_("\nUnwind section "));
7825
7826           if (filedata->string_table == NULL)
7827             printf ("%d", unwsec->sh_name);
7828           else
7829             printf ("'%s'", printable_section_name (filedata, unwsec));
7830
7831           printf (_(" at offset 0x%lx contains %lu entries:\n"),
7832                   (unsigned long) unwsec->sh_offset,
7833                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7834
7835           if (slurp_ia64_unwind_table (filedata, & aux, unwsec)
7836               && aux.table_len > 0)
7837             dump_ia64_unwind (filedata, & aux);
7838
7839           if (aux.table)
7840             free ((char *) aux.table);
7841           if (aux.info)
7842             free ((char *) aux.info);
7843           aux.table = NULL;
7844           aux.info = NULL;
7845         }
7846     }
7847
7848   if (aux.symtab)
7849     free (aux.symtab);
7850   if (aux.strtab)
7851     free ((char *) aux.strtab);
7852
7853   return res;
7854 }
7855
7856 struct hppa_unw_table_entry
7857 {
7858   struct absaddr start;
7859   struct absaddr end;
7860   unsigned int Cannot_unwind:1;                 /* 0 */
7861   unsigned int Millicode:1;                     /* 1 */
7862   unsigned int Millicode_save_sr0:1;            /* 2 */
7863   unsigned int Region_description:2;            /* 3..4 */
7864   unsigned int reserved1:1;                     /* 5 */
7865   unsigned int Entry_SR:1;                      /* 6 */
7866   unsigned int Entry_FR:4;     /* Number saved     7..10 */
7867   unsigned int Entry_GR:5;     /* Number saved     11..15 */
7868   unsigned int Args_stored:1;                   /* 16 */
7869   unsigned int Variable_Frame:1;                /* 17 */
7870   unsigned int Separate_Package_Body:1;         /* 18 */
7871   unsigned int Frame_Extension_Millicode:1;     /* 19 */
7872   unsigned int Stack_Overflow_Check:1;          /* 20 */
7873   unsigned int Two_Instruction_SP_Increment:1;  /* 21 */
7874   unsigned int Ada_Region:1;                    /* 22 */
7875   unsigned int cxx_info:1;                      /* 23 */
7876   unsigned int cxx_try_catch:1;                 /* 24 */
7877   unsigned int sched_entry_seq:1;               /* 25 */
7878   unsigned int reserved2:1;                     /* 26 */
7879   unsigned int Save_SP:1;                       /* 27 */
7880   unsigned int Save_RP:1;                       /* 28 */
7881   unsigned int Save_MRP_in_frame:1;             /* 29 */
7882   unsigned int extn_ptr_defined:1;              /* 30 */
7883   unsigned int Cleanup_defined:1;               /* 31 */
7884
7885   unsigned int MPE_XL_interrupt_marker:1;       /* 0 */
7886   unsigned int HP_UX_interrupt_marker:1;        /* 1 */
7887   unsigned int Large_frame:1;                   /* 2 */
7888   unsigned int Pseudo_SP_Set:1;                 /* 3 */
7889   unsigned int reserved4:1;                     /* 4 */
7890   unsigned int Total_frame_size:27;             /* 5..31 */
7891 };
7892
7893 struct hppa_unw_aux_info
7894 {
7895   struct hppa_unw_table_entry *  table;         /* Unwind table.  */
7896   unsigned long                  table_len;     /* Length of unwind table.  */
7897   bfd_vma                        seg_base;      /* Starting address of segment.  */
7898   Elf_Internal_Sym *             symtab;        /* The symbol table.  */
7899   unsigned long                  nsyms;         /* Number of symbols.  */
7900   Elf_Internal_Sym *             funtab;        /* Sorted table of STT_FUNC symbols.  */
7901   unsigned long                  nfuns;         /* Number of entries in funtab.  */
7902   char *                         strtab;        /* The string table.  */
7903   unsigned long                  strtab_size;   /* Size of string table.  */
7904 };
7905
7906 static bfd_boolean
7907 dump_hppa_unwind (Filedata * filedata, struct hppa_unw_aux_info * aux)
7908 {
7909   struct hppa_unw_table_entry * tp;
7910   unsigned long j, nfuns;
7911   bfd_boolean res = TRUE;
7912
7913   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7914   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7915     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7916       aux->funtab[nfuns++] = aux->symtab[j];
7917   aux->nfuns = nfuns;
7918   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7919
7920   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7921     {
7922       bfd_vma offset;
7923       const char * procname;
7924
7925       find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7926                                aux->strtab_size, tp->start, &procname,
7927                                &offset);
7928
7929       fputs ("\n<", stdout);
7930
7931       if (procname)
7932         {
7933           fputs (procname, stdout);
7934
7935           if (offset)
7936             printf ("+%lx", (unsigned long) offset);
7937         }
7938
7939       fputs (">: [", stdout);
7940       print_vma (tp->start.offset, PREFIX_HEX);
7941       fputc ('-', stdout);
7942       print_vma (tp->end.offset, PREFIX_HEX);
7943       printf ("]\n\t");
7944
7945 #define PF(_m) if (tp->_m) printf (#_m " ");
7946 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7947       PF(Cannot_unwind);
7948       PF(Millicode);
7949       PF(Millicode_save_sr0);
7950       /* PV(Region_description);  */
7951       PF(Entry_SR);
7952       PV(Entry_FR);
7953       PV(Entry_GR);
7954       PF(Args_stored);
7955       PF(Variable_Frame);
7956       PF(Separate_Package_Body);
7957       PF(Frame_Extension_Millicode);
7958       PF(Stack_Overflow_Check);
7959       PF(Two_Instruction_SP_Increment);
7960       PF(Ada_Region);
7961       PF(cxx_info);
7962       PF(cxx_try_catch);
7963       PF(sched_entry_seq);
7964       PF(Save_SP);
7965       PF(Save_RP);
7966       PF(Save_MRP_in_frame);
7967       PF(extn_ptr_defined);
7968       PF(Cleanup_defined);
7969       PF(MPE_XL_interrupt_marker);
7970       PF(HP_UX_interrupt_marker);
7971       PF(Large_frame);
7972       PF(Pseudo_SP_Set);
7973       PV(Total_frame_size);
7974 #undef PF
7975 #undef PV
7976     }
7977
7978   printf ("\n");
7979
7980   free (aux->funtab);
7981
7982   return res;
7983 }
7984
7985 static bfd_boolean
7986 slurp_hppa_unwind_table (Filedata *                  filedata,
7987                          struct hppa_unw_aux_info *  aux,
7988                          Elf_Internal_Shdr *         sec)
7989 {
7990   unsigned long size, unw_ent_size, nentries, nrelas, i;
7991   Elf_Internal_Phdr * seg;
7992   struct hppa_unw_table_entry * tep;
7993   Elf_Internal_Shdr * relsec;
7994   Elf_Internal_Rela * rela;
7995   Elf_Internal_Rela * rp;
7996   unsigned char * table;
7997   unsigned char * tp;
7998   Elf_Internal_Sym * sym;
7999   const char * relname;
8000
8001   /* First, find the starting address of the segment that includes
8002      this section.  */
8003   if (filedata->file_header.e_phnum)
8004     {
8005       if (! get_program_headers (filedata))
8006         return FALSE;
8007
8008       for (seg = filedata->program_headers;
8009            seg < filedata->program_headers + filedata->file_header.e_phnum;
8010            ++seg)
8011         {
8012           if (seg->p_type != PT_LOAD)
8013             continue;
8014
8015           if (sec->sh_addr >= seg->p_vaddr
8016               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
8017             {
8018               aux->seg_base = seg->p_vaddr;
8019               break;
8020             }
8021         }
8022     }
8023
8024   /* Second, build the unwind table from the contents of the unwind
8025      section.  */
8026   size = sec->sh_size;
8027   table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
8028                                       _("unwind table"));
8029   if (!table)
8030     return FALSE;
8031
8032   unw_ent_size = 16;
8033   nentries = size / unw_ent_size;
8034   size = unw_ent_size * nentries;
8035
8036   tep = aux->table = (struct hppa_unw_table_entry *)
8037       xcmalloc (nentries, sizeof (aux->table[0]));
8038
8039   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
8040     {
8041       unsigned int tmp1, tmp2;
8042
8043       tep->start.section = SHN_UNDEF;
8044       tep->end.section   = SHN_UNDEF;
8045
8046       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
8047       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
8048       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
8049       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
8050
8051       tep->start.offset += aux->seg_base;
8052       tep->end.offset   += aux->seg_base;
8053
8054       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
8055       tep->Millicode = (tmp1 >> 30) & 0x1;
8056       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
8057       tep->Region_description = (tmp1 >> 27) & 0x3;
8058       tep->reserved1 = (tmp1 >> 26) & 0x1;
8059       tep->Entry_SR = (tmp1 >> 25) & 0x1;
8060       tep->Entry_FR = (tmp1 >> 21) & 0xf;
8061       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
8062       tep->Args_stored = (tmp1 >> 15) & 0x1;
8063       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
8064       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
8065       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
8066       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
8067       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
8068       tep->Ada_Region = (tmp1 >> 9) & 0x1;
8069       tep->cxx_info = (tmp1 >> 8) & 0x1;
8070       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
8071       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
8072       tep->reserved2 = (tmp1 >> 5) & 0x1;
8073       tep->Save_SP = (tmp1 >> 4) & 0x1;
8074       tep->Save_RP = (tmp1 >> 3) & 0x1;
8075       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
8076       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
8077       tep->Cleanup_defined = tmp1 & 0x1;
8078
8079       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
8080       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
8081       tep->Large_frame = (tmp2 >> 29) & 0x1;
8082       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
8083       tep->reserved4 = (tmp2 >> 27) & 0x1;
8084       tep->Total_frame_size = tmp2 & 0x7ffffff;
8085     }
8086   free (table);
8087
8088   /* Third, apply any relocations to the unwind table.  */
8089   for (relsec = filedata->section_headers;
8090        relsec < filedata->section_headers + filedata->file_header.e_shnum;
8091        ++relsec)
8092     {
8093       if (relsec->sh_type != SHT_RELA
8094           || relsec->sh_info >= filedata->file_header.e_shnum
8095           || filedata->section_headers + relsec->sh_info != sec)
8096         continue;
8097
8098       if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
8099                               & rela, & nrelas))
8100         return FALSE;
8101
8102       for (rp = rela; rp < rela + nrelas; ++rp)
8103         {
8104           unsigned int sym_ndx;
8105           unsigned int r_type = get_reloc_type (filedata, rp->r_info);
8106           relname = elf_hppa_reloc_type (r_type);
8107
8108           if (relname == NULL)
8109             {
8110               warn (_("Skipping unknown relocation type: %u\n"), r_type);
8111               continue;
8112             }
8113
8114           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
8115           if (! const_strneq (relname, "R_PARISC_SEGREL"))
8116             {
8117               warn (_("Skipping unexpected relocation type: %s\n"), relname);
8118               continue;
8119             }
8120
8121           i = rp->r_offset / unw_ent_size;
8122           if (i >= aux->table_len)
8123             {
8124               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
8125               continue;
8126             }
8127
8128           sym_ndx = get_reloc_symindex (rp->r_info);
8129           if (sym_ndx >= aux->nsyms)
8130             {
8131               warn (_("Skipping reloc with invalid symbol index: %u\n"),
8132                     sym_ndx);
8133               continue;
8134             }
8135           sym = aux->symtab + sym_ndx;
8136
8137           switch ((rp->r_offset % unw_ent_size) / 4)
8138             {
8139             case 0:
8140               aux->table[i].start.section = sym->st_shndx;
8141               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
8142               break;
8143             case 1:
8144               aux->table[i].end.section   = sym->st_shndx;
8145               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
8146               break;
8147             default:
8148               break;
8149             }
8150         }
8151
8152       free (rela);
8153     }
8154
8155   aux->table_len = nentries;
8156
8157   return TRUE;
8158 }
8159
8160 static bfd_boolean
8161 hppa_process_unwind (Filedata * filedata)
8162 {
8163   struct hppa_unw_aux_info aux;
8164   Elf_Internal_Shdr * unwsec = NULL;
8165   Elf_Internal_Shdr * strsec;
8166   Elf_Internal_Shdr * sec;
8167   unsigned long i;
8168   bfd_boolean res = TRUE;
8169
8170   if (filedata->string_table == NULL)
8171     return FALSE;
8172
8173   memset (& aux, 0, sizeof (aux));
8174
8175   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8176     {
8177       if (sec->sh_type == SHT_SYMTAB
8178           && sec->sh_link < filedata->file_header.e_shnum)
8179         {
8180           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
8181
8182           strsec = filedata->section_headers + sec->sh_link;
8183           if (aux.strtab != NULL)
8184             {
8185               error (_("Multiple auxillary string tables encountered\n"));
8186               free (aux.strtab);
8187               res = FALSE;
8188             }
8189           aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
8190                                           1, strsec->sh_size,
8191                                           _("string table"));
8192           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8193         }
8194       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8195         unwsec = sec;
8196     }
8197
8198   if (!unwsec)
8199     printf (_("\nThere are no unwind sections in this file.\n"));
8200
8201   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8202     {
8203       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8204         {
8205           unsigned long num_unwind = sec->sh_size / 16;
8206
8207           printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
8208                             "contains %lu entry:\n",
8209                             "\nUnwind section '%s' at offset 0x%lx "
8210                             "contains %lu entries:\n",
8211                             num_unwind),
8212                   printable_section_name (filedata, sec),
8213                   (unsigned long) sec->sh_offset,
8214                   num_unwind);
8215
8216           if (! slurp_hppa_unwind_table (filedata, &aux, sec))
8217             res = FALSE;
8218
8219           if (res && aux.table_len > 0)
8220             {
8221               if (! dump_hppa_unwind (filedata, &aux))
8222                 res = FALSE;
8223             }
8224
8225           if (aux.table)
8226             free ((char *) aux.table);
8227           aux.table = NULL;
8228         }
8229     }
8230
8231   if (aux.symtab)
8232     free (aux.symtab);
8233   if (aux.strtab)
8234     free ((char *) aux.strtab);
8235
8236   return res;
8237 }
8238
8239 struct arm_section
8240 {
8241   unsigned char *      data;            /* The unwind data.  */
8242   Elf_Internal_Shdr *  sec;             /* The cached unwind section header.  */
8243   Elf_Internal_Rela *  rela;            /* The cached relocations for this section.  */
8244   unsigned long        nrelas;          /* The number of relocations.  */
8245   unsigned int         rel_type;        /* REL or RELA ?  */
8246   Elf_Internal_Rela *  next_rela;       /* Cyclic pointer to the next reloc to process.  */
8247 };
8248
8249 struct arm_unw_aux_info
8250 {
8251   Filedata *          filedata;         /* The file containing the unwind sections.  */
8252   Elf_Internal_Sym *  symtab;           /* The file's symbol table.  */
8253   unsigned long       nsyms;            /* Number of symbols.  */
8254   Elf_Internal_Sym *  funtab;           /* Sorted table of STT_FUNC symbols.  */
8255   unsigned long       nfuns;            /* Number of these symbols.  */
8256   char *              strtab;           /* The file's string table.  */
8257   unsigned long       strtab_size;      /* Size of string table.  */
8258 };
8259
8260 static const char *
8261 arm_print_vma_and_name (Filedata *                 filedata,
8262                         struct arm_unw_aux_info *  aux,
8263                         bfd_vma                    fn,
8264                         struct absaddr             addr)
8265 {
8266   const char *procname;
8267   bfd_vma sym_offset;
8268
8269   if (addr.section == SHN_UNDEF)
8270     addr.offset = fn;
8271
8272   find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
8273                            aux->strtab_size, addr, &procname,
8274                            &sym_offset);
8275
8276   print_vma (fn, PREFIX_HEX);
8277
8278   if (procname)
8279     {
8280       fputs (" <", stdout);
8281       fputs (procname, stdout);
8282
8283       if (sym_offset)
8284         printf ("+0x%lx", (unsigned long) sym_offset);
8285       fputc ('>', stdout);
8286     }
8287
8288   return procname;
8289 }
8290
8291 static void
8292 arm_free_section (struct arm_section *arm_sec)
8293 {
8294   if (arm_sec->data != NULL)
8295     free (arm_sec->data);
8296
8297   if (arm_sec->rela != NULL)
8298     free (arm_sec->rela);
8299 }
8300
8301 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
8302       cached section and install SEC instead.
8303    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
8304       and return its valued in * WORDP, relocating if necessary.
8305    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
8306       relocation's offset in ADDR.
8307    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
8308       into the string table of the symbol associated with the reloc.  If no
8309       reloc was applied store -1 there.
8310    5) Return TRUE upon success, FALSE otherwise.  */
8311
8312 static bfd_boolean
8313 get_unwind_section_word (Filedata *                 filedata,
8314                          struct arm_unw_aux_info *  aux,
8315                          struct arm_section *       arm_sec,
8316                          Elf_Internal_Shdr *        sec,
8317                          bfd_vma                    word_offset,
8318                          unsigned int *             wordp,
8319                          struct absaddr *           addr,
8320                          bfd_vma *                  sym_name)
8321 {
8322   Elf_Internal_Rela *rp;
8323   Elf_Internal_Sym *sym;
8324   const char * relname;
8325   unsigned int word;
8326   bfd_boolean wrapped;
8327
8328   if (sec == NULL || arm_sec == NULL)
8329     return FALSE;
8330
8331   addr->section = SHN_UNDEF;
8332   addr->offset = 0;
8333
8334   if (sym_name != NULL)
8335     *sym_name = (bfd_vma) -1;
8336
8337   /* If necessary, update the section cache.  */
8338   if (sec != arm_sec->sec)
8339     {
8340       Elf_Internal_Shdr *relsec;
8341
8342       arm_free_section (arm_sec);
8343
8344       arm_sec->sec = sec;
8345       arm_sec->data = get_data (NULL, aux->filedata, sec->sh_offset, 1,
8346                                 sec->sh_size, _("unwind data"));
8347       arm_sec->rela = NULL;
8348       arm_sec->nrelas = 0;
8349
8350       for (relsec = filedata->section_headers;
8351            relsec < filedata->section_headers + filedata->file_header.e_shnum;
8352            ++relsec)
8353         {
8354           if (relsec->sh_info >= filedata->file_header.e_shnum
8355               || filedata->section_headers + relsec->sh_info != sec
8356               /* PR 15745: Check the section type as well.  */
8357               || (relsec->sh_type != SHT_REL
8358                   && relsec->sh_type != SHT_RELA))
8359             continue;
8360
8361           arm_sec->rel_type = relsec->sh_type;
8362           if (relsec->sh_type == SHT_REL)
8363             {
8364               if (!slurp_rel_relocs (aux->filedata, relsec->sh_offset,
8365                                      relsec->sh_size,
8366                                      & arm_sec->rela, & arm_sec->nrelas))
8367                 return FALSE;
8368             }
8369           else /* relsec->sh_type == SHT_RELA */
8370             {
8371               if (!slurp_rela_relocs (aux->filedata, relsec->sh_offset,
8372                                       relsec->sh_size,
8373                                       & arm_sec->rela, & arm_sec->nrelas))
8374                 return FALSE;
8375             }
8376           break;
8377         }
8378
8379       arm_sec->next_rela = arm_sec->rela;
8380     }
8381
8382   /* If there is no unwind data we can do nothing.  */
8383   if (arm_sec->data == NULL)
8384     return FALSE;
8385
8386   /* If the offset is invalid then fail.  */
8387   if (/* PR 21343 *//* PR 18879 */
8388       sec->sh_size < 4
8389       || word_offset > (sec->sh_size - 4)
8390       || ((bfd_signed_vma) word_offset) < 0)
8391     return FALSE;
8392
8393   /* Get the word at the required offset.  */
8394   word = byte_get (arm_sec->data + word_offset, 4);
8395
8396   /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128.  */
8397   if (arm_sec->rela == NULL)
8398     {
8399       * wordp = word;
8400       return TRUE;
8401     }
8402
8403   /* Look through the relocs to find the one that applies to the provided offset.  */
8404   wrapped = FALSE;
8405   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
8406     {
8407       bfd_vma prelval, offset;
8408
8409       if (rp->r_offset > word_offset && !wrapped)
8410         {
8411           rp = arm_sec->rela;
8412           wrapped = TRUE;
8413         }
8414       if (rp->r_offset > word_offset)
8415         break;
8416
8417       if (rp->r_offset & 3)
8418         {
8419           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8420                 (unsigned long) rp->r_offset);
8421           continue;
8422         }
8423
8424       if (rp->r_offset < word_offset)
8425         continue;
8426
8427       /* PR 17531: file: 027-161405-0.004  */
8428       if (aux->symtab == NULL)
8429         continue;
8430
8431       if (arm_sec->rel_type == SHT_REL)
8432         {
8433           offset = word & 0x7fffffff;
8434           if (offset & 0x40000000)
8435             offset |= ~ (bfd_vma) 0x7fffffff;
8436         }
8437       else if (arm_sec->rel_type == SHT_RELA)
8438         offset = rp->r_addend;
8439       else
8440         {
8441           error (_("Unknown section relocation type %d encountered\n"),
8442                  arm_sec->rel_type);
8443           break;
8444         }
8445
8446       /* PR 17531 file: 027-1241568-0.004.  */
8447       if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8448         {
8449           error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8450                  (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8451           break;
8452         }
8453
8454       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
8455       offset += sym->st_value;
8456       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8457
8458       /* Check that we are processing the expected reloc type.  */
8459       if (filedata->file_header.e_machine == EM_ARM)
8460         {
8461           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
8462           if (relname == NULL)
8463             {
8464               warn (_("Skipping unknown ARM relocation type: %d\n"),
8465                     (int) ELF32_R_TYPE (rp->r_info));
8466               continue;
8467             }
8468
8469           if (streq (relname, "R_ARM_NONE"))
8470               continue;
8471
8472           if (! streq (relname, "R_ARM_PREL31"))
8473             {
8474               warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
8475               continue;
8476             }
8477         }
8478       else if (filedata->file_header.e_machine == EM_TI_C6000)
8479         {
8480           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
8481           if (relname == NULL)
8482             {
8483               warn (_("Skipping unknown C6000 relocation type: %d\n"),
8484                     (int) ELF32_R_TYPE (rp->r_info));
8485               continue;
8486             }
8487
8488           if (streq (relname, "R_C6000_NONE"))
8489             continue;
8490
8491           if (! streq (relname, "R_C6000_PREL31"))
8492             {
8493               warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
8494               continue;
8495             }
8496
8497           prelval >>= 1;
8498         }
8499       else
8500         {
8501           /* This function currently only supports ARM and TI unwinders.  */
8502           warn (_("Only TI and ARM unwinders are currently supported\n"));
8503           break;
8504         }
8505
8506       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8507       addr->section = sym->st_shndx;
8508       addr->offset = offset;
8509
8510       if (sym_name)
8511         * sym_name = sym->st_name;
8512       break;
8513     }
8514
8515   *wordp = word;
8516   arm_sec->next_rela = rp;
8517
8518   return TRUE;
8519 }
8520
8521 static const char *tic6x_unwind_regnames[16] =
8522 {
8523   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8524   "A14", "A13", "A12", "A11", "A10",
8525   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8526 };
8527
8528 static void
8529 decode_tic6x_unwind_regmask (unsigned int mask)
8530 {
8531   int i;
8532
8533   for (i = 12; mask; mask >>= 1, i--)
8534     {
8535       if (mask & 1)
8536         {
8537           fputs (tic6x_unwind_regnames[i], stdout);
8538           if (mask > 1)
8539             fputs (", ", stdout);
8540         }
8541     }
8542 }
8543
8544 #define ADVANCE                                                 \
8545   if (remaining == 0 && more_words)                             \
8546     {                                                           \
8547       data_offset += 4;                                         \
8548       if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec,     \
8549                                      data_offset, & word, & addr, NULL))        \
8550         return FALSE;                                           \
8551       remaining = 4;                                            \
8552       more_words--;                                             \
8553     }                                                           \
8554
8555 #define GET_OP(OP)                      \
8556   ADVANCE;                              \
8557   if (remaining)                        \
8558     {                                   \
8559       remaining--;                      \
8560       (OP) = word >> 24;                \
8561       word <<= 8;                       \
8562     }                                   \
8563   else                                  \
8564     {                                   \
8565       printf (_("[Truncated opcode]\n"));       \
8566       return FALSE;                     \
8567     }                                   \
8568   printf ("0x%02x ", OP)
8569
8570 static bfd_boolean
8571 decode_arm_unwind_bytecode (Filedata *                 filedata,
8572                             struct arm_unw_aux_info *  aux,
8573                             unsigned int               word,
8574                             unsigned int               remaining,
8575                             unsigned int               more_words,
8576                             bfd_vma                    data_offset,
8577                             Elf_Internal_Shdr *        data_sec,
8578                             struct arm_section *       data_arm_sec)
8579 {
8580   struct absaddr addr;
8581   bfd_boolean res = TRUE;
8582
8583   /* Decode the unwinding instructions.  */
8584   while (1)
8585     {
8586       unsigned int op, op2;
8587
8588       ADVANCE;
8589       if (remaining == 0)
8590         break;
8591       remaining--;
8592       op = word >> 24;
8593       word <<= 8;
8594
8595       printf ("  0x%02x ", op);
8596
8597       if ((op & 0xc0) == 0x00)
8598         {
8599           int offset = ((op & 0x3f) << 2) + 4;
8600
8601           printf ("     vsp = vsp + %d", offset);
8602         }
8603       else if ((op & 0xc0) == 0x40)
8604         {
8605           int offset = ((op & 0x3f) << 2) + 4;
8606
8607           printf ("     vsp = vsp - %d", offset);
8608         }
8609       else if ((op & 0xf0) == 0x80)
8610         {
8611           GET_OP (op2);
8612           if (op == 0x80 && op2 == 0)
8613             printf (_("Refuse to unwind"));
8614           else
8615             {
8616               unsigned int mask = ((op & 0x0f) << 8) | op2;
8617               bfd_boolean first = TRUE;
8618               int i;
8619
8620               printf ("pop {");
8621               for (i = 0; i < 12; i++)
8622                 if (mask & (1 << i))
8623                   {
8624                     if (first)
8625                       first = FALSE;
8626                     else
8627                       printf (", ");
8628                     printf ("r%d", 4 + i);
8629                   }
8630               printf ("}");
8631             }
8632         }
8633       else if ((op & 0xf0) == 0x90)
8634         {
8635           if (op == 0x9d || op == 0x9f)
8636             printf (_("     [Reserved]"));
8637           else
8638             printf ("     vsp = r%d", op & 0x0f);
8639         }
8640       else if ((op & 0xf0) == 0xa0)
8641         {
8642           int end = 4 + (op & 0x07);
8643           bfd_boolean first = TRUE;
8644           int i;
8645
8646           printf ("     pop {");
8647           for (i = 4; i <= end; i++)
8648             {
8649               if (first)
8650                 first = FALSE;
8651               else
8652                 printf (", ");
8653               printf ("r%d", i);
8654             }
8655           if (op & 0x08)
8656             {
8657               if (!first)
8658                 printf (", ");
8659               printf ("r14");
8660             }
8661           printf ("}");
8662         }
8663       else if (op == 0xb0)
8664         printf (_("     finish"));
8665       else if (op == 0xb1)
8666         {
8667           GET_OP (op2);
8668           if (op2 == 0 || (op2 & 0xf0) != 0)
8669             printf (_("[Spare]"));
8670           else
8671             {
8672               unsigned int mask = op2 & 0x0f;
8673               bfd_boolean first = TRUE;
8674               int i;
8675
8676               printf ("pop {");
8677               for (i = 0; i < 12; i++)
8678                 if (mask & (1 << i))
8679                   {
8680                     if (first)
8681                       first = FALSE;
8682                     else
8683                       printf (", ");
8684                     printf ("r%d", i);
8685                   }
8686               printf ("}");
8687             }
8688         }
8689       else if (op == 0xb2)
8690         {
8691           unsigned char buf[9];
8692           unsigned int i, len;
8693           unsigned long offset;
8694
8695           for (i = 0; i < sizeof (buf); i++)
8696             {
8697               GET_OP (buf[i]);
8698               if ((buf[i] & 0x80) == 0)
8699                 break;
8700             }
8701           if (i == sizeof (buf))
8702             {
8703               error (_("corrupt change to vsp"));
8704               res = FALSE;
8705             }
8706           else
8707             {
8708               offset = read_uleb128 (buf, &len, buf + i + 1);
8709               assert (len == i + 1);
8710               offset = offset * 4 + 0x204;
8711               printf ("vsp = vsp + %ld", offset);
8712             }
8713         }
8714       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8715         {
8716           unsigned int first, last;
8717
8718           GET_OP (op2);
8719           first = op2 >> 4;
8720           last = op2 & 0x0f;
8721           if (op == 0xc8)
8722             first = first + 16;
8723           printf ("pop {D%d", first);
8724           if (last)
8725             printf ("-D%d", first + last);
8726           printf ("}");
8727         }
8728       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8729         {
8730           unsigned int count = op & 0x07;
8731
8732           printf ("pop {D8");
8733           if (count)
8734             printf ("-D%d", 8 + count);
8735           printf ("}");
8736         }
8737       else if (op >= 0xc0 && op <= 0xc5)
8738         {
8739           unsigned int count = op & 0x07;
8740
8741           printf ("     pop {wR10");
8742           if (count)
8743             printf ("-wR%d", 10 + count);
8744           printf ("}");
8745         }
8746       else if (op == 0xc6)
8747         {
8748           unsigned int first, last;
8749
8750           GET_OP (op2);
8751           first = op2 >> 4;
8752           last = op2 & 0x0f;
8753           printf ("pop {wR%d", first);
8754           if (last)
8755             printf ("-wR%d", first + last);
8756           printf ("}");
8757         }
8758       else if (op == 0xc7)
8759         {
8760           GET_OP (op2);
8761           if (op2 == 0 || (op2 & 0xf0) != 0)
8762             printf (_("[Spare]"));
8763           else
8764             {
8765               unsigned int mask = op2 & 0x0f;
8766               bfd_boolean first = TRUE;
8767               int i;
8768
8769               printf ("pop {");
8770               for (i = 0; i < 4; i++)
8771                 if (mask & (1 << i))
8772                   {
8773                     if (first)
8774                       first = FALSE;
8775                     else
8776                       printf (", ");
8777                     printf ("wCGR%d", i);
8778                   }
8779               printf ("}");
8780             }
8781         }
8782       else
8783         {
8784           printf (_("     [unsupported opcode]"));
8785           res = FALSE;
8786         }
8787
8788       printf ("\n");
8789     }
8790
8791   return res;
8792 }
8793
8794 static bfd_boolean
8795 decode_tic6x_unwind_bytecode (Filedata *                 filedata,
8796                               struct arm_unw_aux_info *  aux,
8797                               unsigned int               word,
8798                               unsigned int               remaining,
8799                               unsigned int               more_words,
8800                               bfd_vma                    data_offset,
8801                               Elf_Internal_Shdr *        data_sec,
8802                               struct arm_section *       data_arm_sec)
8803 {
8804   struct absaddr addr;
8805
8806   /* Decode the unwinding instructions.  */
8807   while (1)
8808     {
8809       unsigned int op, op2;
8810
8811       ADVANCE;
8812       if (remaining == 0)
8813         break;
8814       remaining--;
8815       op = word >> 24;
8816       word <<= 8;
8817
8818       printf ("  0x%02x ", op);
8819
8820       if ((op & 0xc0) == 0x00)
8821         {
8822           int offset = ((op & 0x3f) << 3) + 8;
8823           printf ("     sp = sp + %d", offset);
8824         }
8825       else if ((op & 0xc0) == 0x80)
8826         {
8827           GET_OP (op2);
8828           if (op == 0x80 && op2 == 0)
8829             printf (_("Refuse to unwind"));
8830           else
8831             {
8832               unsigned int mask = ((op & 0x1f) << 8) | op2;
8833               if (op & 0x20)
8834                 printf ("pop compact {");
8835               else
8836                 printf ("pop {");
8837
8838               decode_tic6x_unwind_regmask (mask);
8839               printf("}");
8840             }
8841         }
8842       else if ((op & 0xf0) == 0xc0)
8843         {
8844           unsigned int reg;
8845           unsigned int nregs;
8846           unsigned int i;
8847           const char *name;
8848           struct
8849           {
8850             unsigned int offset;
8851             unsigned int reg;
8852           } regpos[16];
8853
8854           /* Scan entire instruction first so that GET_OP output is not
8855              interleaved with disassembly.  */
8856           nregs = 0;
8857           for (i = 0; nregs < (op & 0xf); i++)
8858             {
8859               GET_OP (op2);
8860               reg = op2 >> 4;
8861               if (reg != 0xf)
8862                 {
8863                   regpos[nregs].offset = i * 2;
8864                   regpos[nregs].reg = reg;
8865                   nregs++;
8866                 }
8867
8868               reg = op2 & 0xf;
8869               if (reg != 0xf)
8870                 {
8871                   regpos[nregs].offset = i * 2 + 1;
8872                   regpos[nregs].reg = reg;
8873                   nregs++;
8874                 }
8875             }
8876
8877           printf (_("pop frame {"));
8878           if (nregs == 0)
8879             {
8880               printf (_("*corrupt* - no registers specified"));
8881             }
8882           else
8883             {
8884               reg = nregs - 1;
8885               for (i = i * 2; i > 0; i--)
8886                 {
8887                   if (regpos[reg].offset == i - 1)
8888                     {
8889                       name = tic6x_unwind_regnames[regpos[reg].reg];
8890                       if (reg > 0)
8891                         reg--;
8892                     }
8893                   else
8894                     name = _("[pad]");
8895
8896                   fputs (name, stdout);
8897                   if (i > 1)
8898                     printf (", ");
8899                 }
8900             }
8901
8902           printf ("}");
8903         }
8904       else if (op == 0xd0)
8905         printf ("     MOV FP, SP");
8906       else if (op == 0xd1)
8907         printf ("     __c6xabi_pop_rts");
8908       else if (op == 0xd2)
8909         {
8910           unsigned char buf[9];
8911           unsigned int i, len;
8912           unsigned long offset;
8913
8914           for (i = 0; i < sizeof (buf); i++)
8915             {
8916               GET_OP (buf[i]);
8917               if ((buf[i] & 0x80) == 0)
8918                 break;
8919             }
8920           /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2.  */
8921           if (i == sizeof (buf))
8922             {
8923               warn (_("Corrupt stack pointer adjustment detected\n"));
8924               return FALSE;
8925             }
8926
8927           offset = read_uleb128 (buf, &len, buf + i + 1);
8928           assert (len == i + 1);
8929           offset = offset * 8 + 0x408;
8930           printf (_("sp = sp + %ld"), offset);
8931         }
8932       else if ((op & 0xf0) == 0xe0)
8933         {
8934           if ((op & 0x0f) == 7)
8935             printf ("     RETURN");
8936           else
8937             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8938         }
8939       else
8940         {
8941           printf (_("     [unsupported opcode]"));
8942         }
8943       putchar ('\n');
8944     }
8945
8946   return TRUE;
8947 }
8948
8949 static bfd_vma
8950 arm_expand_prel31 (Filedata * filedata, bfd_vma word, bfd_vma where)
8951 {
8952   bfd_vma offset;
8953
8954   offset = word & 0x7fffffff;
8955   if (offset & 0x40000000)
8956     offset |= ~ (bfd_vma) 0x7fffffff;
8957
8958   if (filedata->file_header.e_machine == EM_TI_C6000)
8959     offset <<= 1;
8960
8961   return offset + where;
8962 }
8963
8964 static bfd_boolean
8965 decode_arm_unwind (Filedata *                 filedata,
8966                    struct arm_unw_aux_info *  aux,
8967                    unsigned int               word,
8968                    unsigned int               remaining,
8969                    bfd_vma                    data_offset,
8970                    Elf_Internal_Shdr *        data_sec,
8971                    struct arm_section *       data_arm_sec)
8972 {
8973   int per_index;
8974   unsigned int more_words = 0;
8975   struct absaddr addr;
8976   bfd_vma sym_name = (bfd_vma) -1;
8977   bfd_boolean res = TRUE;
8978
8979   if (remaining == 0)
8980     {
8981       /* Fetch the first word.
8982          Note - when decoding an object file the address extracted
8983          here will always be 0.  So we also pass in the sym_name
8984          parameter so that we can find the symbol associated with
8985          the personality routine.  */
8986       if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, data_offset,
8987                                      & word, & addr, & sym_name))
8988         return FALSE;
8989
8990       remaining = 4;
8991     }
8992
8993   if ((word & 0x80000000) == 0)
8994     {
8995       /* Expand prel31 for personality routine.  */
8996       bfd_vma fn;
8997       const char *procname;
8998
8999       fn = arm_expand_prel31 (filedata, word, data_sec->sh_addr + data_offset);
9000       printf (_("  Personality routine: "));
9001       if (fn == 0
9002           && addr.section == SHN_UNDEF && addr.offset == 0
9003           && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
9004         {
9005           procname = aux->strtab + sym_name;
9006           print_vma (fn, PREFIX_HEX);
9007           if (procname)
9008             {
9009               fputs (" <", stdout);
9010               fputs (procname, stdout);
9011               fputc ('>', stdout);
9012             }
9013         }
9014       else
9015         procname = arm_print_vma_and_name (filedata, aux, fn, addr);
9016       fputc ('\n', stdout);
9017
9018       /* The GCC personality routines use the standard compact
9019          encoding, starting with one byte giving the number of
9020          words.  */
9021       if (procname != NULL
9022           && (const_strneq (procname, "__gcc_personality_v0")
9023               || const_strneq (procname, "__gxx_personality_v0")
9024               || const_strneq (procname, "__gcj_personality_v0")
9025               || const_strneq (procname, "__gnu_objc_personality_v0")))
9026         {
9027           remaining = 0;
9028           more_words = 1;
9029           ADVANCE;
9030           if (!remaining)
9031             {
9032               printf (_("  [Truncated data]\n"));
9033               return FALSE;
9034             }
9035           more_words = word >> 24;
9036           word <<= 8;
9037           remaining--;
9038           per_index = -1;
9039         }
9040       else
9041         return TRUE;
9042     }
9043   else
9044     {
9045       /* ARM EHABI Section 6.3:
9046
9047          An exception-handling table entry for the compact model looks like:
9048
9049            31 30-28 27-24 23-0
9050            -- ----- ----- ----
9051             1   0   index Data for personalityRoutine[index]    */
9052
9053       if (filedata->file_header.e_machine == EM_ARM
9054           && (word & 0x70000000))
9055         {
9056           warn (_("Corrupt ARM compact model table entry: %x \n"), word);
9057           res = FALSE;
9058         }
9059
9060       per_index = (word >> 24) & 0x7f;
9061       printf (_("  Compact model index: %d\n"), per_index);
9062       if (per_index == 0)
9063         {
9064           more_words = 0;
9065           word <<= 8;
9066           remaining--;
9067         }
9068       else if (per_index < 3)
9069         {
9070           more_words = (word >> 16) & 0xff;
9071           word <<= 16;
9072           remaining -= 2;
9073         }
9074     }
9075
9076   switch (filedata->file_header.e_machine)
9077     {
9078     case EM_ARM:
9079       if (per_index < 3)
9080         {
9081           if (! decode_arm_unwind_bytecode (filedata, aux, word, remaining, more_words,
9082                                             data_offset, data_sec, data_arm_sec))
9083             res = FALSE;
9084         }
9085       else
9086         {
9087           warn (_("Unknown ARM compact model index encountered\n"));
9088           printf (_("  [reserved]\n"));
9089           res = FALSE;
9090         }
9091       break;
9092
9093     case EM_TI_C6000:
9094       if (per_index < 3)
9095         {
9096           if (! decode_tic6x_unwind_bytecode (filedata, aux, word, remaining, more_words,
9097                                               data_offset, data_sec, data_arm_sec))
9098             res = FALSE;
9099         }
9100       else if (per_index < 5)
9101         {
9102           if (((word >> 17) & 0x7f) == 0x7f)
9103             printf (_("  Restore stack from frame pointer\n"));
9104           else
9105             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
9106           printf (_("  Registers restored: "));
9107           if (per_index == 4)
9108             printf (" (compact) ");
9109           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
9110           putchar ('\n');
9111           printf (_("  Return register: %s\n"),
9112                   tic6x_unwind_regnames[word & 0xf]);
9113         }
9114       else
9115         printf (_("  [reserved (%d)]\n"), per_index);
9116       break;
9117
9118     default:
9119       error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
9120              filedata->file_header.e_machine);
9121       res = FALSE;
9122     }
9123
9124   /* Decode the descriptors.  Not implemented.  */
9125
9126   return res;
9127 }
9128
9129 static bfd_boolean
9130 dump_arm_unwind (Filedata *                 filedata,
9131                  struct arm_unw_aux_info *  aux,
9132                  Elf_Internal_Shdr *        exidx_sec)
9133 {
9134   struct arm_section exidx_arm_sec, extab_arm_sec;
9135   unsigned int i, exidx_len;
9136   unsigned long j, nfuns;
9137   bfd_boolean res = TRUE;
9138
9139   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
9140   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
9141   exidx_len = exidx_sec->sh_size / 8;
9142
9143   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
9144   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
9145     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
9146       aux->funtab[nfuns++] = aux->symtab[j];
9147   aux->nfuns = nfuns;
9148   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
9149
9150   for (i = 0; i < exidx_len; i++)
9151     {
9152       unsigned int exidx_fn, exidx_entry;
9153       struct absaddr fn_addr, entry_addr;
9154       bfd_vma fn;
9155
9156       fputc ('\n', stdout);
9157
9158       if (! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9159                                      8 * i, & exidx_fn, & fn_addr, NULL)
9160           || ! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9161                                         8 * i + 4, & exidx_entry, & entry_addr, NULL))
9162         {
9163           free (aux->funtab);
9164           arm_free_section (& exidx_arm_sec);
9165           arm_free_section (& extab_arm_sec);
9166           return FALSE;
9167         }
9168
9169       /* ARM EHABI, Section 5:
9170          An index table entry consists of 2 words.
9171          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
9172       if (exidx_fn & 0x80000000)
9173         {
9174           warn (_("corrupt index table entry: %x\n"), exidx_fn);
9175           res = FALSE;
9176         }
9177
9178       fn = arm_expand_prel31 (filedata, exidx_fn, exidx_sec->sh_addr + 8 * i);
9179
9180       arm_print_vma_and_name (filedata, aux, fn, fn_addr);
9181       fputs (": ", stdout);
9182
9183       if (exidx_entry == 1)
9184         {
9185           print_vma (exidx_entry, PREFIX_HEX);
9186           fputs (" [cantunwind]\n", stdout);
9187         }
9188       else if (exidx_entry & 0x80000000)
9189         {
9190           print_vma (exidx_entry, PREFIX_HEX);
9191           fputc ('\n', stdout);
9192           decode_arm_unwind (filedata, aux, exidx_entry, 4, 0, NULL, NULL);
9193         }
9194       else
9195         {
9196           bfd_vma table, table_offset = 0;
9197           Elf_Internal_Shdr *table_sec;
9198
9199           fputs ("@", stdout);
9200           table = arm_expand_prel31 (filedata, exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
9201           print_vma (table, PREFIX_HEX);
9202           printf ("\n");
9203
9204           /* Locate the matching .ARM.extab.  */
9205           if (entry_addr.section != SHN_UNDEF
9206               && entry_addr.section < filedata->file_header.e_shnum)
9207             {
9208               table_sec = filedata->section_headers + entry_addr.section;
9209               table_offset = entry_addr.offset;
9210               /* PR 18879 */
9211               if (table_offset > table_sec->sh_size
9212                   || ((bfd_signed_vma) table_offset) < 0)
9213                 {
9214                   warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
9215                         (unsigned long) table_offset,
9216                         printable_section_name (filedata, table_sec));
9217                   res = FALSE;
9218                   continue;
9219                 }
9220             }
9221           else
9222             {
9223               table_sec = find_section_by_address (filedata, table);
9224               if (table_sec != NULL)
9225                 table_offset = table - table_sec->sh_addr;
9226             }
9227
9228           if (table_sec == NULL)
9229             {
9230               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
9231                     (unsigned long) table);
9232               res = FALSE;
9233               continue;
9234             }
9235
9236           if (! decode_arm_unwind (filedata, aux, 0, 0, table_offset, table_sec,
9237                                    &extab_arm_sec))
9238             res = FALSE;
9239         }
9240     }
9241
9242   printf ("\n");
9243
9244   free (aux->funtab);
9245   arm_free_section (&exidx_arm_sec);
9246   arm_free_section (&extab_arm_sec);
9247
9248   return res;
9249 }
9250
9251 /* Used for both ARM and C6X unwinding tables.  */
9252
9253 static bfd_boolean
9254 arm_process_unwind (Filedata * filedata)
9255 {
9256   struct arm_unw_aux_info aux;
9257   Elf_Internal_Shdr *unwsec = NULL;
9258   Elf_Internal_Shdr *strsec;
9259   Elf_Internal_Shdr *sec;
9260   unsigned long i;
9261   unsigned int sec_type;
9262   bfd_boolean res = TRUE;
9263
9264   switch (filedata->file_header.e_machine)
9265     {
9266     case EM_ARM:
9267       sec_type = SHT_ARM_EXIDX;
9268       break;
9269
9270     case EM_TI_C6000:
9271       sec_type = SHT_C6000_UNWIND;
9272       break;
9273
9274     default:
9275       error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
9276              filedata->file_header.e_machine);
9277       return FALSE;
9278     }
9279
9280   if (filedata->string_table == NULL)
9281     return FALSE;
9282
9283   memset (& aux, 0, sizeof (aux));
9284   aux.filedata = filedata;
9285
9286   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9287     {
9288       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < filedata->file_header.e_shnum)
9289         {
9290           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
9291
9292           strsec = filedata->section_headers + sec->sh_link;
9293
9294           /* PR binutils/17531 file: 011-12666-0.004.  */
9295           if (aux.strtab != NULL)
9296             {
9297               error (_("Multiple string tables found in file.\n"));
9298               free (aux.strtab);
9299               res = FALSE;
9300             }
9301           aux.strtab = get_data (NULL, filedata, strsec->sh_offset,
9302                                  1, strsec->sh_size, _("string table"));
9303           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
9304         }
9305       else if (sec->sh_type == sec_type)
9306         unwsec = sec;
9307     }
9308
9309   if (unwsec == NULL)
9310     printf (_("\nThere are no unwind sections in this file.\n"));
9311   else
9312     for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9313       {
9314         if (sec->sh_type == sec_type)
9315           {
9316             unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size);
9317             printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
9318                               "contains %lu entry:\n",
9319                               "\nUnwind section '%s' at offset 0x%lx "
9320                               "contains %lu entries:\n",
9321                               num_unwind),
9322                     printable_section_name (filedata, sec),
9323                     (unsigned long) sec->sh_offset,
9324                     num_unwind);
9325
9326             if (! dump_arm_unwind (filedata, &aux, sec))
9327               res = FALSE;
9328           }
9329       }
9330
9331   if (aux.symtab)
9332     free (aux.symtab);
9333   if (aux.strtab)
9334     free ((char *) aux.strtab);
9335
9336   return res;
9337 }
9338
9339 static bfd_boolean
9340 process_unwind (Filedata * filedata)
9341 {
9342   struct unwind_handler
9343   {
9344     unsigned int machtype;
9345     bfd_boolean (* handler)(Filedata *);
9346   } handlers[] =
9347   {
9348     { EM_ARM, arm_process_unwind },
9349     { EM_IA_64, ia64_process_unwind },
9350     { EM_PARISC, hppa_process_unwind },
9351     { EM_TI_C6000, arm_process_unwind },
9352     { 0, NULL }
9353   };
9354   int i;
9355
9356   if (!do_unwind)
9357     return TRUE;
9358
9359   for (i = 0; handlers[i].handler != NULL; i++)
9360     if (filedata->file_header.e_machine == handlers[i].machtype)
9361       return handlers[i].handler (filedata);
9362
9363   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
9364           get_machine_name (filedata->file_header.e_machine));
9365   return TRUE;
9366 }
9367
9368 static void
9369 dynamic_section_aarch64_val (Elf_Internal_Dyn * entry)
9370 {
9371   switch (entry->d_tag)
9372     {
9373     case DT_AARCH64_BTI_PLT:
9374     case DT_AARCH64_PAC_PLT:
9375       break;
9376     default:
9377       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9378       break;
9379     }
9380   putchar ('\n');
9381 }
9382
9383 static void
9384 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
9385 {
9386   switch (entry->d_tag)
9387     {
9388     case DT_MIPS_FLAGS:
9389       if (entry->d_un.d_val == 0)
9390         printf (_("NONE"));
9391       else
9392         {
9393           static const char * opts[] =
9394           {
9395             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
9396             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
9397             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
9398             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
9399             "RLD_ORDER_SAFE"
9400           };
9401           unsigned int cnt;
9402           bfd_boolean first = TRUE;
9403
9404           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
9405             if (entry->d_un.d_val & (1 << cnt))
9406               {
9407                 printf ("%s%s", first ? "" : " ", opts[cnt]);
9408                 first = FALSE;
9409               }
9410         }
9411       break;
9412
9413     case DT_MIPS_IVERSION:
9414       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9415         printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
9416       else
9417         {
9418           char buf[40];
9419           sprintf_vma (buf, entry->d_un.d_ptr);
9420           /* Note: coded this way so that there is a single string for translation.  */
9421           printf (_("<corrupt: %s>"), buf);
9422         }
9423       break;
9424
9425     case DT_MIPS_TIME_STAMP:
9426       {
9427         char timebuf[128];
9428         struct tm * tmp;
9429         time_t atime = entry->d_un.d_val;
9430
9431         tmp = gmtime (&atime);
9432         /* PR 17531: file: 6accc532.  */
9433         if (tmp == NULL)
9434           snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
9435         else
9436           snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
9437                     tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9438                     tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9439         printf (_("Time Stamp: %s"), timebuf);
9440       }
9441       break;
9442
9443     case DT_MIPS_RLD_VERSION:
9444     case DT_MIPS_LOCAL_GOTNO:
9445     case DT_MIPS_CONFLICTNO:
9446     case DT_MIPS_LIBLISTNO:
9447     case DT_MIPS_SYMTABNO:
9448     case DT_MIPS_UNREFEXTNO:
9449     case DT_MIPS_HIPAGENO:
9450     case DT_MIPS_DELTA_CLASS_NO:
9451     case DT_MIPS_DELTA_INSTANCE_NO:
9452     case DT_MIPS_DELTA_RELOC_NO:
9453     case DT_MIPS_DELTA_SYM_NO:
9454     case DT_MIPS_DELTA_CLASSSYM_NO:
9455     case DT_MIPS_COMPACT_SIZE:
9456       print_vma (entry->d_un.d_val, DEC);
9457       break;
9458
9459     default:
9460       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9461     }
9462     putchar ('\n');
9463 }
9464
9465 static void
9466 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
9467 {
9468   switch (entry->d_tag)
9469     {
9470     case DT_HP_DLD_FLAGS:
9471       {
9472         static struct
9473         {
9474           long int bit;
9475           const char * str;
9476         }
9477         flags[] =
9478         {
9479           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
9480           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
9481           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
9482           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
9483           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
9484           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
9485           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9486           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9487           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9488           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
9489           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9490           { DT_HP_GST, "HP_GST" },
9491           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9492           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9493           { DT_HP_NODELETE, "HP_NODELETE" },
9494           { DT_HP_GROUP, "HP_GROUP" },
9495           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
9496         };
9497         bfd_boolean first = TRUE;
9498         size_t cnt;
9499         bfd_vma val = entry->d_un.d_val;
9500
9501         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
9502           if (val & flags[cnt].bit)
9503             {
9504               if (! first)
9505                 putchar (' ');
9506               fputs (flags[cnt].str, stdout);
9507               first = FALSE;
9508               val ^= flags[cnt].bit;
9509             }
9510
9511         if (val != 0 || first)
9512           {
9513             if (! first)
9514               putchar (' ');
9515             print_vma (val, HEX);
9516           }
9517       }
9518       break;
9519
9520     default:
9521       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9522       break;
9523     }
9524   putchar ('\n');
9525 }
9526
9527 #ifdef BFD64
9528
9529 /* VMS vs Unix time offset and factor.  */
9530
9531 #define VMS_EPOCH_OFFSET 35067168000000000LL
9532 #define VMS_GRANULARITY_FACTOR 10000000
9533
9534 /* Display a VMS time in a human readable format.  */
9535
9536 static void
9537 print_vms_time (bfd_int64_t vmstime)
9538 {
9539   struct tm *tm;
9540   time_t unxtime;
9541
9542   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9543   tm = gmtime (&unxtime);
9544   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9545           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9546           tm->tm_hour, tm->tm_min, tm->tm_sec);
9547 }
9548 #endif /* BFD64 */
9549
9550 static void
9551 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
9552 {
9553   switch (entry->d_tag)
9554     {
9555     case DT_IA_64_PLT_RESERVE:
9556       /* First 3 slots reserved.  */
9557       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9558       printf (" -- ");
9559       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
9560       break;
9561
9562     case DT_IA_64_VMS_LINKTIME:
9563 #ifdef BFD64
9564       print_vms_time (entry->d_un.d_val);
9565 #endif
9566       break;
9567
9568     case DT_IA_64_VMS_LNKFLAGS:
9569       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9570       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9571         printf (" CALL_DEBUG");
9572       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9573         printf (" NOP0BUFS");
9574       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9575         printf (" P0IMAGE");
9576       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9577         printf (" MKTHREADS");
9578       if (entry->d_un.d_val & VMS_LF_UPCALLS)
9579         printf (" UPCALLS");
9580       if (entry->d_un.d_val & VMS_LF_IMGSTA)
9581         printf (" IMGSTA");
9582       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9583         printf (" INITIALIZE");
9584       if (entry->d_un.d_val & VMS_LF_MAIN)
9585         printf (" MAIN");
9586       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9587         printf (" EXE_INIT");
9588       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9589         printf (" TBK_IN_IMG");
9590       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9591         printf (" DBG_IN_IMG");
9592       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9593         printf (" TBK_IN_DSF");
9594       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9595         printf (" DBG_IN_DSF");
9596       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9597         printf (" SIGNATURES");
9598       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9599         printf (" REL_SEG_OFF");
9600       break;
9601
9602     default:
9603       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9604       break;
9605     }
9606   putchar ('\n');
9607 }
9608
9609 static bfd_boolean
9610 get_32bit_dynamic_section (Filedata * filedata)
9611 {
9612   Elf32_External_Dyn * edyn;
9613   Elf32_External_Dyn * ext;
9614   Elf_Internal_Dyn * entry;
9615
9616   edyn = (Elf32_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9617                                           dynamic_size, _("dynamic section"));
9618   if (!edyn)
9619     return FALSE;
9620
9621   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9622      might not have the luxury of section headers.  Look for the DT_NULL
9623      terminator to determine the number of entries.  */
9624   for (ext = edyn, dynamic_nent = 0;
9625        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9626        ext++)
9627     {
9628       dynamic_nent++;
9629       if (BYTE_GET (ext->d_tag) == DT_NULL)
9630         break;
9631     }
9632
9633   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9634                                                   sizeof (* entry));
9635   if (dynamic_section == NULL)
9636     {
9637       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9638              (unsigned long) dynamic_nent);
9639       free (edyn);
9640       return FALSE;
9641     }
9642
9643   for (ext = edyn, entry = dynamic_section;
9644        entry < dynamic_section + dynamic_nent;
9645        ext++, entry++)
9646     {
9647       entry->d_tag      = BYTE_GET (ext->d_tag);
9648       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9649     }
9650
9651   free (edyn);
9652
9653   return TRUE;
9654 }
9655
9656 static bfd_boolean
9657 get_64bit_dynamic_section (Filedata * filedata)
9658 {
9659   Elf64_External_Dyn * edyn;
9660   Elf64_External_Dyn * ext;
9661   Elf_Internal_Dyn * entry;
9662
9663   /* Read in the data.  */
9664   edyn = (Elf64_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9665                                           dynamic_size, _("dynamic section"));
9666   if (!edyn)
9667     return FALSE;
9668
9669   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9670      might not have the luxury of section headers.  Look for the DT_NULL
9671      terminator to determine the number of entries.  */
9672   for (ext = edyn, dynamic_nent = 0;
9673        /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer.  */
9674        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9675        ext++)
9676     {
9677       dynamic_nent++;
9678       if (BYTE_GET (ext->d_tag) == DT_NULL)
9679         break;
9680     }
9681
9682   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9683                                                   sizeof (* entry));
9684   if (dynamic_section == NULL)
9685     {
9686       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9687              (unsigned long) dynamic_nent);
9688       free (edyn);
9689       return FALSE;
9690     }
9691
9692   /* Convert from external to internal formats.  */
9693   for (ext = edyn, entry = dynamic_section;
9694        entry < dynamic_section + dynamic_nent;
9695        ext++, entry++)
9696     {
9697       entry->d_tag      = BYTE_GET (ext->d_tag);
9698       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9699     }
9700
9701   free (edyn);
9702
9703   return TRUE;
9704 }
9705
9706 static void
9707 print_dynamic_flags (bfd_vma flags)
9708 {
9709   bfd_boolean first = TRUE;
9710
9711   while (flags)
9712     {
9713       bfd_vma flag;
9714
9715       flag = flags & - flags;
9716       flags &= ~ flag;
9717
9718       if (first)
9719         first = FALSE;
9720       else
9721         putc (' ', stdout);
9722
9723       switch (flag)
9724         {
9725         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
9726         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
9727         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
9728         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
9729         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
9730         default:                fputs (_("unknown"), stdout); break;
9731         }
9732     }
9733   puts ("");
9734 }
9735
9736 /* Parse and display the contents of the dynamic section.  */
9737
9738 static bfd_boolean
9739 process_dynamic_section (Filedata * filedata)
9740 {
9741   Elf_Internal_Dyn * entry;
9742
9743   if (dynamic_size == 0)
9744     {
9745       if (do_dynamic)
9746         printf (_("\nThere is no dynamic section in this file.\n"));
9747
9748       return TRUE;
9749     }
9750
9751   if (is_32bit_elf)
9752     {
9753       if (! get_32bit_dynamic_section (filedata))
9754         return FALSE;
9755     }
9756   else
9757     {
9758       if (! get_64bit_dynamic_section (filedata))
9759         return FALSE;
9760     }
9761
9762   /* Find the appropriate symbol table.  */
9763   if (dynamic_symbols == NULL)
9764     {
9765       for (entry = dynamic_section;
9766            entry < dynamic_section + dynamic_nent;
9767            ++entry)
9768         {
9769           Elf_Internal_Shdr section;
9770
9771           if (entry->d_tag != DT_SYMTAB)
9772             continue;
9773
9774           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9775
9776           /* Since we do not know how big the symbol table is,
9777              we default to reading in the entire file (!) and
9778              processing that.  This is overkill, I know, but it
9779              should work.  */
9780           section.sh_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9781           if ((bfd_size_type) section.sh_offset > filedata->file_size)
9782             {
9783               /* See PR 21379 for a reproducer.  */
9784               error (_("Invalid DT_SYMTAB entry: %lx"), (long) section.sh_offset);
9785               return FALSE;
9786             }
9787
9788           if (archive_file_offset != 0)
9789             section.sh_size = archive_file_size - section.sh_offset;
9790           else
9791             section.sh_size = filedata->file_size - section.sh_offset;
9792
9793           if (is_32bit_elf)
9794             section.sh_entsize = sizeof (Elf32_External_Sym);
9795           else
9796             section.sh_entsize = sizeof (Elf64_External_Sym);
9797           section.sh_name = filedata->string_table_length;
9798
9799           if (dynamic_symbols != NULL)
9800             {
9801               error (_("Multiple dynamic symbol table sections found\n"));
9802               free (dynamic_symbols);
9803             }
9804           dynamic_symbols = GET_ELF_SYMBOLS (filedata, &section, & num_dynamic_syms);
9805           if (num_dynamic_syms < 1)
9806             {
9807               error (_("Unable to determine the number of symbols to load\n"));
9808               continue;
9809             }
9810         }
9811     }
9812
9813   /* Similarly find a string table.  */
9814   if (dynamic_strings == NULL)
9815     {
9816       for (entry = dynamic_section;
9817            entry < dynamic_section + dynamic_nent;
9818            ++entry)
9819         {
9820           unsigned long offset;
9821           long str_tab_len;
9822
9823           if (entry->d_tag != DT_STRTAB)
9824             continue;
9825
9826           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9827
9828           /* Since we do not know how big the string table is,
9829              we default to reading in the entire file (!) and
9830              processing that.  This is overkill, I know, but it
9831              should work.  */
9832
9833           offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9834
9835           if (archive_file_offset != 0)
9836             str_tab_len = archive_file_size - offset;
9837           else
9838             str_tab_len = filedata->file_size - offset;
9839
9840           if (str_tab_len < 1)
9841             {
9842               error
9843                 (_("Unable to determine the length of the dynamic string table\n"));
9844               continue;
9845             }
9846
9847           if (dynamic_strings != NULL)
9848             {
9849               error (_("Multiple dynamic string tables found\n"));
9850               free (dynamic_strings);
9851             }
9852
9853           dynamic_strings = (char *) get_data (NULL, filedata, offset, 1,
9854                                                str_tab_len,
9855                                                _("dynamic string table"));
9856           dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9857         }
9858     }
9859
9860   /* And find the syminfo section if available.  */
9861   if (dynamic_syminfo == NULL)
9862     {
9863       unsigned long syminsz = 0;
9864
9865       for (entry = dynamic_section;
9866            entry < dynamic_section + dynamic_nent;
9867            ++entry)
9868         {
9869           if (entry->d_tag == DT_SYMINENT)
9870             {
9871               /* Note: these braces are necessary to avoid a syntax
9872                  error from the SunOS4 C compiler.  */
9873               /* PR binutils/17531: A corrupt file can trigger this test.
9874                  So do not use an assert, instead generate an error message.  */
9875               if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9876                 error (_("Bad value (%d) for SYMINENT entry\n"),
9877                        (int) entry->d_un.d_val);
9878             }
9879           else if (entry->d_tag == DT_SYMINSZ)
9880             syminsz = entry->d_un.d_val;
9881           else if (entry->d_tag == DT_SYMINFO)
9882             dynamic_syminfo_offset = offset_from_vma (filedata, entry->d_un.d_val,
9883                                                       syminsz);
9884         }
9885
9886       if (dynamic_syminfo_offset != 0 && syminsz != 0)
9887         {
9888           Elf_External_Syminfo * extsyminfo;
9889           Elf_External_Syminfo * extsym;
9890           Elf_Internal_Syminfo * syminfo;
9891
9892           /* There is a syminfo section.  Read the data.  */
9893           extsyminfo = (Elf_External_Syminfo *)
9894               get_data (NULL, filedata, dynamic_syminfo_offset, 1, syminsz,
9895                         _("symbol information"));
9896           if (!extsyminfo)
9897             return FALSE;
9898
9899           if (dynamic_syminfo != NULL)
9900             {
9901               error (_("Multiple dynamic symbol information sections found\n"));
9902               free (dynamic_syminfo);
9903             }
9904           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9905           if (dynamic_syminfo == NULL)
9906             {
9907               error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9908                      (unsigned long) syminsz);
9909               return FALSE;
9910             }
9911
9912           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9913           for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9914                syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9915                ++syminfo, ++extsym)
9916             {
9917               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9918               syminfo->si_flags = BYTE_GET (extsym->si_flags);
9919             }
9920
9921           free (extsyminfo);
9922         }
9923     }
9924
9925   if (do_dynamic && dynamic_addr)
9926     printf (ngettext ("\nDynamic section at offset 0x%lx "
9927                       "contains %lu entry:\n",
9928                       "\nDynamic section at offset 0x%lx "
9929                       "contains %lu entries:\n",
9930                       dynamic_nent),
9931             dynamic_addr, (unsigned long) dynamic_nent);
9932   if (do_dynamic)
9933     printf (_("  Tag        Type                         Name/Value\n"));
9934
9935   for (entry = dynamic_section;
9936        entry < dynamic_section + dynamic_nent;
9937        entry++)
9938     {
9939       if (do_dynamic)
9940         {
9941           const char * dtype;
9942
9943           putchar (' ');
9944           print_vma (entry->d_tag, FULL_HEX);
9945           dtype = get_dynamic_type (filedata, entry->d_tag);
9946           printf (" (%s)%*s", dtype,
9947                   ((is_32bit_elf ? 27 : 19) - (int) strlen (dtype)), " ");
9948         }
9949
9950       switch (entry->d_tag)
9951         {
9952         case DT_FLAGS:
9953           if (do_dynamic)
9954             print_dynamic_flags (entry->d_un.d_val);
9955           break;
9956
9957         case DT_AUXILIARY:
9958         case DT_FILTER:
9959         case DT_CONFIG:
9960         case DT_DEPAUDIT:
9961         case DT_AUDIT:
9962           if (do_dynamic)
9963             {
9964               switch (entry->d_tag)
9965                 {
9966                 case DT_AUXILIARY:
9967                   printf (_("Auxiliary library"));
9968                   break;
9969
9970                 case DT_FILTER:
9971                   printf (_("Filter library"));
9972                   break;
9973
9974                 case DT_CONFIG:
9975                   printf (_("Configuration file"));
9976                   break;
9977
9978                 case DT_DEPAUDIT:
9979                   printf (_("Dependency audit library"));
9980                   break;
9981
9982                 case DT_AUDIT:
9983                   printf (_("Audit library"));
9984                   break;
9985                 }
9986
9987               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9988                 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9989               else
9990                 {
9991                   printf (": ");
9992                   print_vma (entry->d_un.d_val, PREFIX_HEX);
9993                   putchar ('\n');
9994                 }
9995             }
9996           break;
9997
9998         case DT_FEATURE:
9999           if (do_dynamic)
10000             {
10001               printf (_("Flags:"));
10002
10003               if (entry->d_un.d_val == 0)
10004                 printf (_(" None\n"));
10005               else
10006                 {
10007                   unsigned long int val = entry->d_un.d_val;
10008
10009                   if (val & DTF_1_PARINIT)
10010                     {
10011                       printf (" PARINIT");
10012                       val ^= DTF_1_PARINIT;
10013                     }
10014                   if (val & DTF_1_CONFEXP)
10015                     {
10016                       printf (" CONFEXP");
10017                       val ^= DTF_1_CONFEXP;
10018                     }
10019                   if (val != 0)
10020                     printf (" %lx", val);
10021                   puts ("");
10022                 }
10023             }
10024           break;
10025
10026         case DT_POSFLAG_1:
10027           if (do_dynamic)
10028             {
10029               printf (_("Flags:"));
10030
10031               if (entry->d_un.d_val == 0)
10032                 printf (_(" None\n"));
10033               else
10034                 {
10035                   unsigned long int val = entry->d_un.d_val;
10036
10037                   if (val & DF_P1_LAZYLOAD)
10038                     {
10039                       printf (" LAZYLOAD");
10040                       val ^= DF_P1_LAZYLOAD;
10041                     }
10042                   if (val & DF_P1_GROUPPERM)
10043                     {
10044                       printf (" GROUPPERM");
10045                       val ^= DF_P1_GROUPPERM;
10046                     }
10047                   if (val != 0)
10048                     printf (" %lx", val);
10049                   puts ("");
10050                 }
10051             }
10052           break;
10053
10054         case DT_FLAGS_1:
10055           if (do_dynamic)
10056             {
10057               printf (_("Flags:"));
10058               if (entry->d_un.d_val == 0)
10059                 printf (_(" None\n"));
10060               else
10061                 {
10062                   unsigned long int val = entry->d_un.d_val;
10063
10064                   if (val & DF_1_NOW)
10065                     {
10066                       printf (" NOW");
10067                       val ^= DF_1_NOW;
10068                     }
10069                   if (val & DF_1_GLOBAL)
10070                     {
10071                       printf (" GLOBAL");
10072                       val ^= DF_1_GLOBAL;
10073                     }
10074                   if (val & DF_1_GROUP)
10075                     {
10076                       printf (" GROUP");
10077                       val ^= DF_1_GROUP;
10078                     }
10079                   if (val & DF_1_NODELETE)
10080                     {
10081                       printf (" NODELETE");
10082                       val ^= DF_1_NODELETE;
10083                     }
10084                   if (val & DF_1_LOADFLTR)
10085                     {
10086                       printf (" LOADFLTR");
10087                       val ^= DF_1_LOADFLTR;
10088                     }
10089                   if (val & DF_1_INITFIRST)
10090                     {
10091                       printf (" INITFIRST");
10092                       val ^= DF_1_INITFIRST;
10093                     }
10094                   if (val & DF_1_NOOPEN)
10095                     {
10096                       printf (" NOOPEN");
10097                       val ^= DF_1_NOOPEN;
10098                     }
10099                   if (val & DF_1_ORIGIN)
10100                     {
10101                       printf (" ORIGIN");
10102                       val ^= DF_1_ORIGIN;
10103                     }
10104                   if (val & DF_1_DIRECT)
10105                     {
10106                       printf (" DIRECT");
10107                       val ^= DF_1_DIRECT;
10108                     }
10109                   if (val & DF_1_TRANS)
10110                     {
10111                       printf (" TRANS");
10112                       val ^= DF_1_TRANS;
10113                     }
10114                   if (val & DF_1_INTERPOSE)
10115                     {
10116                       printf (" INTERPOSE");
10117                       val ^= DF_1_INTERPOSE;
10118                     }
10119                   if (val & DF_1_NODEFLIB)
10120                     {
10121                       printf (" NODEFLIB");
10122                       val ^= DF_1_NODEFLIB;
10123                     }
10124                   if (val & DF_1_NODUMP)
10125                     {
10126                       printf (" NODUMP");
10127                       val ^= DF_1_NODUMP;
10128                     }
10129                   if (val & DF_1_CONFALT)
10130                     {
10131                       printf (" CONFALT");
10132                       val ^= DF_1_CONFALT;
10133                     }
10134                   if (val & DF_1_ENDFILTEE)
10135                     {
10136                       printf (" ENDFILTEE");
10137                       val ^= DF_1_ENDFILTEE;
10138                     }
10139                   if (val & DF_1_DISPRELDNE)
10140                     {
10141                       printf (" DISPRELDNE");
10142                       val ^= DF_1_DISPRELDNE;
10143                     }
10144                   if (val & DF_1_DISPRELPND)
10145                     {
10146                       printf (" DISPRELPND");
10147                       val ^= DF_1_DISPRELPND;
10148                     }
10149                   if (val & DF_1_NODIRECT)
10150                     {
10151                       printf (" NODIRECT");
10152                       val ^= DF_1_NODIRECT;
10153                     }
10154                   if (val & DF_1_IGNMULDEF)
10155                     {
10156                       printf (" IGNMULDEF");
10157                       val ^= DF_1_IGNMULDEF;
10158                     }
10159                   if (val & DF_1_NOKSYMS)
10160                     {
10161                       printf (" NOKSYMS");
10162                       val ^= DF_1_NOKSYMS;
10163                     }
10164                   if (val & DF_1_NOHDR)
10165                     {
10166                       printf (" NOHDR");
10167                       val ^= DF_1_NOHDR;
10168                     }
10169                   if (val & DF_1_EDITED)
10170                     {
10171                       printf (" EDITED");
10172                       val ^= DF_1_EDITED;
10173                     }
10174                   if (val & DF_1_NORELOC)
10175                     {
10176                       printf (" NORELOC");
10177                       val ^= DF_1_NORELOC;
10178                     }
10179                   if (val & DF_1_SYMINTPOSE)
10180                     {
10181                       printf (" SYMINTPOSE");
10182                       val ^= DF_1_SYMINTPOSE;
10183                     }
10184                   if (val & DF_1_GLOBAUDIT)
10185                     {
10186                       printf (" GLOBAUDIT");
10187                       val ^= DF_1_GLOBAUDIT;
10188                     }
10189                   if (val & DF_1_SINGLETON)
10190                     {
10191                       printf (" SINGLETON");
10192                       val ^= DF_1_SINGLETON;
10193                     }
10194                   if (val & DF_1_STUB)
10195                     {
10196                       printf (" STUB");
10197                       val ^= DF_1_STUB;
10198                     }
10199                   if (val & DF_1_PIE)
10200                     {
10201                       printf (" PIE");
10202                       val ^= DF_1_PIE;
10203                     }
10204                   if (val & DF_1_KMOD)
10205                     {
10206                       printf (" KMOD");
10207                       val ^= DF_1_KMOD;
10208                     }
10209                   if (val & DF_1_WEAKFILTER)
10210                     {
10211                       printf (" WEAKFILTER");
10212                       val ^= DF_1_WEAKFILTER;
10213                     }
10214                   if (val & DF_1_NOCOMMON)
10215                     {
10216                       printf (" NOCOMMON");
10217                       val ^= DF_1_NOCOMMON;
10218                     }
10219                   if (val != 0)
10220                     printf (" %lx", val);
10221                   puts ("");
10222                 }
10223             }
10224           break;
10225
10226         case DT_PLTREL:
10227           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10228           if (do_dynamic)
10229             puts (get_dynamic_type (filedata, entry->d_un.d_val));
10230           break;
10231
10232         case DT_NULL    :
10233         case DT_NEEDED  :
10234         case DT_PLTGOT  :
10235         case DT_HASH    :
10236         case DT_STRTAB  :
10237         case DT_SYMTAB  :
10238         case DT_RELA    :
10239         case DT_INIT    :
10240         case DT_FINI    :
10241         case DT_SONAME  :
10242         case DT_RPATH   :
10243         case DT_SYMBOLIC:
10244         case DT_REL     :
10245         case DT_DEBUG   :
10246         case DT_TEXTREL :
10247         case DT_JMPREL  :
10248         case DT_RUNPATH :
10249           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10250
10251           if (do_dynamic)
10252             {
10253               char * name;
10254
10255               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
10256                 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10257               else
10258                 name = NULL;
10259
10260               if (name)
10261                 {
10262                   switch (entry->d_tag)
10263                     {
10264                     case DT_NEEDED:
10265                       printf (_("Shared library: [%s]"), name);
10266
10267                       if (streq (name, program_interpreter))
10268                         printf (_(" program interpreter"));
10269                       break;
10270
10271                     case DT_SONAME:
10272                       printf (_("Library soname: [%s]"), name);
10273                       break;
10274
10275                     case DT_RPATH:
10276                       printf (_("Library rpath: [%s]"), name);
10277                       break;
10278
10279                     case DT_RUNPATH:
10280                       printf (_("Library runpath: [%s]"), name);
10281                       break;
10282
10283                     default:
10284                       print_vma (entry->d_un.d_val, PREFIX_HEX);
10285                       break;
10286                     }
10287                 }
10288               else
10289                 print_vma (entry->d_un.d_val, PREFIX_HEX);
10290
10291               putchar ('\n');
10292             }
10293           break;
10294
10295         case DT_PLTRELSZ:
10296         case DT_RELASZ  :
10297         case DT_STRSZ   :
10298         case DT_RELSZ   :
10299         case DT_RELAENT :
10300         case DT_SYMENT  :
10301         case DT_RELENT  :
10302           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10303           /* Fall through.  */
10304         case DT_PLTPADSZ:
10305         case DT_MOVEENT :
10306         case DT_MOVESZ  :
10307         case DT_INIT_ARRAYSZ:
10308         case DT_FINI_ARRAYSZ:
10309         case DT_GNU_CONFLICTSZ:
10310         case DT_GNU_LIBLISTSZ:
10311           if (do_dynamic)
10312             {
10313               print_vma (entry->d_un.d_val, UNSIGNED);
10314               printf (_(" (bytes)\n"));
10315             }
10316           break;
10317
10318         case DT_VERDEFNUM:
10319         case DT_VERNEEDNUM:
10320         case DT_RELACOUNT:
10321         case DT_RELCOUNT:
10322           if (do_dynamic)
10323             {
10324               print_vma (entry->d_un.d_val, UNSIGNED);
10325               putchar ('\n');
10326             }
10327           break;
10328
10329         case DT_SYMINSZ:
10330         case DT_SYMINENT:
10331         case DT_SYMINFO:
10332         case DT_USED:
10333         case DT_INIT_ARRAY:
10334         case DT_FINI_ARRAY:
10335           if (do_dynamic)
10336             {
10337               if (entry->d_tag == DT_USED
10338                   && VALID_DYNAMIC_NAME (entry->d_un.d_val))
10339                 {
10340                   char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10341
10342                   if (*name)
10343                     {
10344                       printf (_("Not needed object: [%s]\n"), name);
10345                       break;
10346                     }
10347                 }
10348
10349               print_vma (entry->d_un.d_val, PREFIX_HEX);
10350               putchar ('\n');
10351             }
10352           break;
10353
10354         case DT_BIND_NOW:
10355           /* The value of this entry is ignored.  */
10356           if (do_dynamic)
10357             putchar ('\n');
10358           break;
10359
10360         case DT_GNU_PRELINKED:
10361           if (do_dynamic)
10362             {
10363               struct tm * tmp;
10364               time_t atime = entry->d_un.d_val;
10365
10366               tmp = gmtime (&atime);
10367               /* PR 17533 file: 041-1244816-0.004.  */
10368               if (tmp == NULL)
10369                 printf (_("<corrupt time val: %lx"),
10370                         (unsigned long) atime);
10371               else
10372                 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
10373                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
10374                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
10375
10376             }
10377           break;
10378
10379         case DT_GNU_HASH:
10380           dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
10381           if (do_dynamic)
10382             {
10383               print_vma (entry->d_un.d_val, PREFIX_HEX);
10384               putchar ('\n');
10385             }
10386           break;
10387
10388         default:
10389           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
10390             version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
10391               entry->d_un.d_val;
10392
10393           if (do_dynamic)
10394             {
10395               switch (filedata->file_header.e_machine)
10396                 {
10397                 case EM_AARCH64:
10398                   dynamic_section_aarch64_val (entry);
10399                   break;
10400                 case EM_MIPS:
10401                 case EM_MIPS_RS3_LE:
10402                   dynamic_section_mips_val (entry);
10403                   break;
10404                 case EM_PARISC:
10405                   dynamic_section_parisc_val (entry);
10406                   break;
10407                 case EM_IA_64:
10408                   dynamic_section_ia64_val (entry);
10409                   break;
10410                 default:
10411                   print_vma (entry->d_un.d_val, PREFIX_HEX);
10412                   putchar ('\n');
10413                 }
10414             }
10415           break;
10416         }
10417     }
10418
10419   return TRUE;
10420 }
10421
10422 static char *
10423 get_ver_flags (unsigned int flags)
10424 {
10425   static char buff[128];
10426
10427   buff[0] = 0;
10428
10429   if (flags == 0)
10430     return _("none");
10431
10432   if (flags & VER_FLG_BASE)
10433     strcat (buff, "BASE");
10434
10435   if (flags & VER_FLG_WEAK)
10436     {
10437       if (flags & VER_FLG_BASE)
10438         strcat (buff, " | ");
10439
10440       strcat (buff, "WEAK");
10441     }
10442
10443   if (flags & VER_FLG_INFO)
10444     {
10445       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
10446         strcat (buff, " | ");
10447
10448       strcat (buff, "INFO");
10449     }
10450
10451   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10452     {
10453       if (flags & (VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10454         strcat (buff, " | ");
10455
10456       strcat (buff, _("<unknown>"));
10457     }
10458
10459   return buff;
10460 }
10461
10462 /* Display the contents of the version sections.  */
10463
10464 static bfd_boolean
10465 process_version_sections (Filedata * filedata)
10466 {
10467   Elf_Internal_Shdr * section;
10468   unsigned i;
10469   bfd_boolean found = FALSE;
10470
10471   if (! do_version)
10472     return TRUE;
10473
10474   for (i = 0, section = filedata->section_headers;
10475        i < filedata->file_header.e_shnum;
10476        i++, section++)
10477     {
10478       switch (section->sh_type)
10479         {
10480         case SHT_GNU_verdef:
10481           {
10482             Elf_External_Verdef * edefs;
10483             unsigned long idx;
10484             unsigned long cnt;
10485             char * endbuf;
10486
10487             found = TRUE;
10488
10489             printf (ngettext ("\nVersion definition section '%s' "
10490                               "contains %u entry:\n",
10491                               "\nVersion definition section '%s' "
10492                               "contains %u entries:\n",
10493                               section->sh_info),
10494                     printable_section_name (filedata, section),
10495                     section->sh_info);
10496
10497             printf (_("  Addr: 0x"));
10498             printf_vma (section->sh_addr);
10499             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10500                     (unsigned long) section->sh_offset, section->sh_link,
10501                     printable_section_name_from_index (filedata, section->sh_link));
10502
10503             edefs = (Elf_External_Verdef *)
10504                 get_data (NULL, filedata, section->sh_offset, 1,section->sh_size,
10505                           _("version definition section"));
10506             if (!edefs)
10507               break;
10508             endbuf = (char *) edefs + section->sh_size;
10509
10510             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10511               {
10512                 char * vstart;
10513                 Elf_External_Verdef * edef;
10514                 Elf_Internal_Verdef ent;
10515                 Elf_External_Verdaux * eaux;
10516                 Elf_Internal_Verdaux aux;
10517                 unsigned long isum;
10518                 int j;
10519
10520                 vstart = ((char *) edefs) + idx;
10521                 if (vstart + sizeof (*edef) > endbuf)
10522                   break;
10523
10524                 edef = (Elf_External_Verdef *) vstart;
10525
10526                 ent.vd_version = BYTE_GET (edef->vd_version);
10527                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
10528                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
10529                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
10530                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
10531                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
10532                 ent.vd_next    = BYTE_GET (edef->vd_next);
10533
10534                 printf (_("  %#06lx: Rev: %d  Flags: %s"),
10535                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
10536
10537                 printf (_("  Index: %d  Cnt: %d  "),
10538                         ent.vd_ndx, ent.vd_cnt);
10539
10540                 /* Check for overflow.  */
10541                 if (ent.vd_aux > (size_t) (endbuf - vstart))
10542                   break;
10543
10544                 vstart += ent.vd_aux;
10545
10546                 if (vstart + sizeof (*eaux) > endbuf)
10547                   break;
10548                 eaux = (Elf_External_Verdaux *) vstart;
10549
10550                 aux.vda_name = BYTE_GET (eaux->vda_name);
10551                 aux.vda_next = BYTE_GET (eaux->vda_next);
10552
10553                 if (VALID_DYNAMIC_NAME (aux.vda_name))
10554                   printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
10555                 else
10556                   printf (_("Name index: %ld\n"), aux.vda_name);
10557
10558                 isum = idx + ent.vd_aux;
10559
10560                 for (j = 1; j < ent.vd_cnt; j++)
10561                   {
10562                     if (aux.vda_next < sizeof (*eaux)
10563                         && !(j == ent.vd_cnt - 1 && aux.vda_next == 0))
10564                       {
10565                         warn (_("Invalid vda_next field of %lx\n"),
10566                               aux.vda_next);
10567                         j = ent.vd_cnt;
10568                         break;
10569                       }
10570                     /* Check for overflow.  */
10571                     if (aux.vda_next > (size_t) (endbuf - vstart))
10572                       break;
10573
10574                     isum   += aux.vda_next;
10575                     vstart += aux.vda_next;
10576
10577                     if (vstart + sizeof (*eaux) > endbuf)
10578                       break;
10579                     eaux = (Elf_External_Verdaux *) vstart;
10580
10581                     aux.vda_name = BYTE_GET (eaux->vda_name);
10582                     aux.vda_next = BYTE_GET (eaux->vda_next);
10583
10584                     if (VALID_DYNAMIC_NAME (aux.vda_name))
10585                       printf (_("  %#06lx: Parent %d: %s\n"),
10586                               isum, j, GET_DYNAMIC_NAME (aux.vda_name));
10587                     else
10588                       printf (_("  %#06lx: Parent %d, name index: %ld\n"),
10589                               isum, j, aux.vda_name);
10590                   }
10591
10592                 if (j < ent.vd_cnt)
10593                   printf (_("  Version def aux past end of section\n"));
10594
10595                 /* PR 17531:
10596                    file: id:000001,src:000172+005151,op:splice,rep:2.  */
10597                 if (ent.vd_next < sizeof (*edef)
10598                     && !(cnt == section->sh_info - 1 && ent.vd_next == 0))
10599                   {
10600                     warn (_("Invalid vd_next field of %lx\n"), ent.vd_next);
10601                     cnt = section->sh_info;
10602                     break;
10603                   }
10604                 if (ent.vd_next > (size_t) (endbuf - ((char *) edefs + idx)))
10605                   break;
10606
10607                 idx += ent.vd_next;
10608               }
10609
10610             if (cnt < section->sh_info)
10611               printf (_("  Version definition past end of section\n"));
10612
10613             free (edefs);
10614           }
10615           break;
10616
10617         case SHT_GNU_verneed:
10618           {
10619             Elf_External_Verneed * eneed;
10620             unsigned long idx;
10621             unsigned long cnt;
10622             char * endbuf;
10623
10624             found = TRUE;
10625
10626             printf (ngettext ("\nVersion needs section '%s' "
10627                               "contains %u entry:\n",
10628                               "\nVersion needs section '%s' "
10629                               "contains %u entries:\n",
10630                               section->sh_info),
10631                     printable_section_name (filedata, section), section->sh_info);
10632
10633             printf (_(" Addr: 0x"));
10634             printf_vma (section->sh_addr);
10635             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10636                     (unsigned long) section->sh_offset, section->sh_link,
10637                     printable_section_name_from_index (filedata, section->sh_link));
10638
10639             eneed = (Elf_External_Verneed *) get_data (NULL, filedata,
10640                                                        section->sh_offset, 1,
10641                                                        section->sh_size,
10642                                                        _("Version Needs section"));
10643             if (!eneed)
10644               break;
10645             endbuf = (char *) eneed + section->sh_size;
10646
10647             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10648               {
10649                 Elf_External_Verneed * entry;
10650                 Elf_Internal_Verneed ent;
10651                 unsigned long isum;
10652                 int j;
10653                 char * vstart;
10654
10655                 vstart = ((char *) eneed) + idx;
10656                 if (vstart + sizeof (*entry) > endbuf)
10657                   break;
10658
10659                 entry = (Elf_External_Verneed *) vstart;
10660
10661                 ent.vn_version = BYTE_GET (entry->vn_version);
10662                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
10663                 ent.vn_file    = BYTE_GET (entry->vn_file);
10664                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
10665                 ent.vn_next    = BYTE_GET (entry->vn_next);
10666
10667                 printf (_("  %#06lx: Version: %d"), idx, ent.vn_version);
10668
10669                 if (VALID_DYNAMIC_NAME (ent.vn_file))
10670                   printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
10671                 else
10672                   printf (_("  File: %lx"), ent.vn_file);
10673
10674                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
10675
10676                 /* Check for overflow.  */
10677                 if (ent.vn_aux > (size_t) (endbuf - vstart))
10678                   break;
10679                 vstart += ent.vn_aux;
10680
10681                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10682                   {
10683                     Elf_External_Vernaux * eaux;
10684                     Elf_Internal_Vernaux aux;
10685
10686                     if (vstart + sizeof (*eaux) > endbuf)
10687                       break;
10688                     eaux = (Elf_External_Vernaux *) vstart;
10689
10690                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
10691                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
10692                     aux.vna_other = BYTE_GET (eaux->vna_other);
10693                     aux.vna_name  = BYTE_GET (eaux->vna_name);
10694                     aux.vna_next  = BYTE_GET (eaux->vna_next);
10695
10696                     if (VALID_DYNAMIC_NAME (aux.vna_name))
10697                       printf (_("  %#06lx:   Name: %s"),
10698                               isum, GET_DYNAMIC_NAME (aux.vna_name));
10699                     else
10700                       printf (_("  %#06lx:   Name index: %lx"),
10701                               isum, aux.vna_name);
10702
10703                     printf (_("  Flags: %s  Version: %d\n"),
10704                             get_ver_flags (aux.vna_flags), aux.vna_other);
10705
10706                     if (aux.vna_next < sizeof (*eaux)
10707                         && !(j == ent.vn_cnt - 1 && aux.vna_next == 0))
10708                       {
10709                         warn (_("Invalid vna_next field of %lx\n"),
10710                               aux.vna_next);
10711                         j = ent.vn_cnt;
10712                         break;
10713                       }
10714                     /* Check for overflow.  */
10715                     if (aux.vna_next > (size_t) (endbuf - vstart))
10716                       break;
10717                     isum   += aux.vna_next;
10718                     vstart += aux.vna_next;
10719                   }
10720
10721                 if (j < ent.vn_cnt)
10722                   warn (_("Missing Version Needs auxillary information\n"));
10723
10724                 if (ent.vn_next < sizeof (*entry)
10725                     && !(cnt == section->sh_info - 1 && ent.vn_next == 0))
10726                   {
10727                     warn (_("Invalid vn_next field of %lx\n"), ent.vn_next);
10728                     cnt = section->sh_info;
10729                     break;
10730                   }
10731                 if (ent.vn_next > (size_t) (endbuf - ((char *) eneed + idx)))
10732                   break;
10733                 idx += ent.vn_next;
10734               }
10735
10736             if (cnt < section->sh_info)
10737               warn (_("Missing Version Needs information\n"));
10738
10739             free (eneed);
10740           }
10741           break;
10742
10743         case SHT_GNU_versym:
10744           {
10745             Elf_Internal_Shdr * link_section;
10746             size_t total;
10747             unsigned int cnt;
10748             unsigned char * edata;
10749             unsigned short * data;
10750             char * strtab;
10751             Elf_Internal_Sym * symbols;
10752             Elf_Internal_Shdr * string_sec;
10753             unsigned long num_syms;
10754             long off;
10755
10756             if (section->sh_link >= filedata->file_header.e_shnum)
10757               break;
10758
10759             link_section = filedata->section_headers + section->sh_link;
10760             total = section->sh_size / sizeof (Elf_External_Versym);
10761
10762             if (link_section->sh_link >= filedata->file_header.e_shnum)
10763               break;
10764
10765             found = TRUE;
10766
10767             symbols = GET_ELF_SYMBOLS (filedata, link_section, & num_syms);
10768             if (symbols == NULL)
10769               break;
10770
10771             string_sec = filedata->section_headers + link_section->sh_link;
10772
10773             strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
10774                                         string_sec->sh_size,
10775                                         _("version string table"));
10776             if (!strtab)
10777               {
10778                 free (symbols);
10779                 break;
10780               }
10781
10782             printf (ngettext ("\nVersion symbols section '%s' "
10783                               "contains %lu entry:\n",
10784                               "\nVersion symbols section '%s' "
10785                               "contains %lu entries:\n",
10786                               total),
10787                     printable_section_name (filedata, section), (unsigned long) total);
10788
10789             printf (_(" Addr: "));
10790             printf_vma (section->sh_addr);
10791             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10792                     (unsigned long) section->sh_offset, section->sh_link,
10793                     printable_section_name (filedata, link_section));
10794
10795             off = offset_from_vma (filedata,
10796                                    version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10797                                    total * sizeof (short));
10798             edata = (unsigned char *) get_data (NULL, filedata, off, total,
10799                                                 sizeof (short),
10800                                                 _("version symbol data"));
10801             if (!edata)
10802               {
10803                 free (strtab);
10804                 free (symbols);
10805                 break;
10806               }
10807
10808             data = (short unsigned int *) cmalloc (total, sizeof (short));
10809
10810             for (cnt = total; cnt --;)
10811               data[cnt] = byte_get (edata + cnt * sizeof (short),
10812                                     sizeof (short));
10813
10814             free (edata);
10815
10816             for (cnt = 0; cnt < total; cnt += 4)
10817               {
10818                 int j, nn;
10819                 char *name;
10820                 char *invalid = _("*invalid*");
10821
10822                 printf ("  %03x:", cnt);
10823
10824                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10825                   switch (data[cnt + j])
10826                     {
10827                     case 0:
10828                       fputs (_("   0 (*local*)    "), stdout);
10829                       break;
10830
10831                     case 1:
10832                       fputs (_("   1 (*global*)   "), stdout);
10833                       break;
10834
10835                     default:
10836                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10837                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10838
10839                       /* If this index value is greater than the size of the symbols
10840                          array, break to avoid an out-of-bounds read.  */
10841                       if ((unsigned long)(cnt + j) >= num_syms)
10842                         {
10843                           warn (_("invalid index into symbol array\n"));
10844                           break;
10845                         }
10846
10847                       name = NULL;
10848                       if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10849                         {
10850                           Elf_Internal_Verneed ivn;
10851                           unsigned long offset;
10852
10853                           offset = offset_from_vma
10854                             (filedata, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10855                              sizeof (Elf_External_Verneed));
10856
10857                           do
10858                             {
10859                               Elf_Internal_Vernaux ivna;
10860                               Elf_External_Verneed evn;
10861                               Elf_External_Vernaux evna;
10862                               unsigned long a_off;
10863
10864                               if (get_data (&evn, filedata, offset, sizeof (evn), 1,
10865                                             _("version need")) == NULL)
10866                                 break;
10867
10868                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10869                               ivn.vn_next = BYTE_GET (evn.vn_next);
10870
10871                               a_off = offset + ivn.vn_aux;
10872
10873                               do
10874                                 {
10875                                   if (get_data (&evna, filedata, a_off, sizeof (evna),
10876                                                 1, _("version need aux (2)")) == NULL)
10877                                     {
10878                                       ivna.vna_next  = 0;
10879                                       ivna.vna_other = 0;
10880                                     }
10881                                   else
10882                                     {
10883                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
10884                                       ivna.vna_other = BYTE_GET (evna.vna_other);
10885                                     }
10886
10887                                   a_off += ivna.vna_next;
10888                                 }
10889                               while (ivna.vna_other != data[cnt + j]
10890                                      && ivna.vna_next != 0);
10891
10892                               if (ivna.vna_other == data[cnt + j])
10893                                 {
10894                                   ivna.vna_name = BYTE_GET (evna.vna_name);
10895
10896                                   if (ivna.vna_name >= string_sec->sh_size)
10897                                     name = invalid;
10898                                   else
10899                                     name = strtab + ivna.vna_name;
10900                                   break;
10901                                 }
10902
10903                               offset += ivn.vn_next;
10904                             }
10905                           while (ivn.vn_next);
10906                         }
10907
10908                       if (data[cnt + j] != 0x8001
10909                           && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10910                         {
10911                           Elf_Internal_Verdef ivd;
10912                           Elf_External_Verdef evd;
10913                           unsigned long offset;
10914
10915                           offset = offset_from_vma
10916                             (filedata, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10917                              sizeof evd);
10918
10919                           do
10920                             {
10921                               if (get_data (&evd, filedata, offset, sizeof (evd), 1,
10922                                             _("version def")) == NULL)
10923                                 {
10924                                   ivd.vd_next = 0;
10925                                   /* PR 17531: file: 046-1082287-0.004.  */
10926                                   ivd.vd_ndx  = (data[cnt + j] & VERSYM_VERSION) + 1;
10927                                   break;
10928                                 }
10929                               else
10930                                 {
10931                                   ivd.vd_next = BYTE_GET (evd.vd_next);
10932                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
10933                                 }
10934
10935                               offset += ivd.vd_next;
10936                             }
10937                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10938                                  && ivd.vd_next != 0);
10939
10940                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10941                             {
10942                               Elf_External_Verdaux evda;
10943                               Elf_Internal_Verdaux ivda;
10944
10945                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
10946
10947                               if (get_data (&evda, filedata,
10948                                             offset - ivd.vd_next + ivd.vd_aux,
10949                                             sizeof (evda), 1,
10950                                             _("version def aux")) == NULL)
10951                                 break;
10952
10953                               ivda.vda_name = BYTE_GET (evda.vda_name);
10954
10955                               if (ivda.vda_name >= string_sec->sh_size)
10956                                 name = invalid;
10957                               else if (name != NULL && name != invalid)
10958                                 name = _("*both*");
10959                               else
10960                                 name = strtab + ivda.vda_name;
10961                             }
10962                         }
10963                       if (name != NULL)
10964                         nn += printf ("(%s%-*s",
10965                                       name,
10966                                       12 - (int) strlen (name),
10967                                       ")");
10968
10969                       if (nn < 18)
10970                         printf ("%*c", 18 - nn, ' ');
10971                     }
10972
10973                 putchar ('\n');
10974               }
10975
10976             free (data);
10977             free (strtab);
10978             free (symbols);
10979           }
10980           break;
10981
10982         default:
10983           break;
10984         }
10985     }
10986
10987   if (! found)
10988     printf (_("\nNo version information found in this file.\n"));
10989
10990   return TRUE;
10991 }
10992
10993 static const char *
10994 get_symbol_binding (Filedata * filedata, unsigned int binding)
10995 {
10996   static char buff[32];
10997
10998   switch (binding)
10999     {
11000     case STB_LOCAL:     return "LOCAL";
11001     case STB_GLOBAL:    return "GLOBAL";
11002     case STB_WEAK:      return "WEAK";
11003     default:
11004       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
11005         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
11006                   binding);
11007       else if (binding >= STB_LOOS && binding <= STB_HIOS)
11008         {
11009           if (binding == STB_GNU_UNIQUE
11010               && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
11011                   /* GNU is still using the default value 0.  */
11012                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
11013             return "UNIQUE";
11014           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
11015         }
11016       else
11017         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
11018       return buff;
11019     }
11020 }
11021
11022 static const char *
11023 get_symbol_type (Filedata * filedata, unsigned int type)
11024 {
11025   static char buff[32];
11026
11027   switch (type)
11028     {
11029     case STT_NOTYPE:    return "NOTYPE";
11030     case STT_OBJECT:    return "OBJECT";
11031     case STT_FUNC:      return "FUNC";
11032     case STT_SECTION:   return "SECTION";
11033     case STT_FILE:      return "FILE";
11034     case STT_COMMON:    return "COMMON";
11035     case STT_TLS:       return "TLS";
11036     case STT_RELC:      return "RELC";
11037     case STT_SRELC:     return "SRELC";
11038     default:
11039       if (type >= STT_LOPROC && type <= STT_HIPROC)
11040         {
11041           if (filedata->file_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
11042             return "THUMB_FUNC";
11043
11044           if (filedata->file_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
11045             return "REGISTER";
11046
11047           if (filedata->file_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
11048             return "PARISC_MILLI";
11049
11050           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
11051         }
11052       else if (type >= STT_LOOS && type <= STT_HIOS)
11053         {
11054           if (filedata->file_header.e_machine == EM_PARISC)
11055             {
11056               if (type == STT_HP_OPAQUE)
11057                 return "HP_OPAQUE";
11058               if (type == STT_HP_STUB)
11059                 return "HP_STUB";
11060             }
11061
11062           if (type == STT_GNU_IFUNC
11063               && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
11064                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
11065                   /* GNU is still using the default value 0.  */
11066                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
11067             return "IFUNC";
11068
11069           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
11070         }
11071       else
11072         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
11073       return buff;
11074     }
11075 }
11076
11077 static const char *
11078 get_symbol_visibility (unsigned int visibility)
11079 {
11080   switch (visibility)
11081     {
11082     case STV_DEFAULT:   return "DEFAULT";
11083     case STV_INTERNAL:  return "INTERNAL";
11084     case STV_HIDDEN:    return "HIDDEN";
11085     case STV_PROTECTED: return "PROTECTED";
11086     default:
11087       error (_("Unrecognized visibility value: %u"), visibility);
11088       return _("<unknown>");
11089     }
11090 }
11091
11092 static const char *
11093 get_solaris_symbol_visibility (unsigned int visibility)
11094 {
11095   switch (visibility)
11096     {
11097     case 4: return "EXPORTED";
11098     case 5: return "SINGLETON";
11099     case 6: return "ELIMINATE";
11100     default: return get_symbol_visibility (visibility);
11101     }
11102 }
11103
11104 static const char *
11105 get_mips_symbol_other (unsigned int other)
11106 {
11107   switch (other)
11108     {
11109     case STO_OPTIONAL:      return "OPTIONAL";
11110     case STO_MIPS_PLT:      return "MIPS PLT";
11111     case STO_MIPS_PIC:      return "MIPS PIC";
11112     case STO_MICROMIPS:     return "MICROMIPS";
11113     case STO_MICROMIPS | STO_MIPS_PIC:      return "MICROMIPS, MIPS PIC";
11114     case STO_MIPS16:        return "MIPS16";
11115     default:                return NULL;
11116     }
11117 }
11118
11119 static const char *
11120 get_ia64_symbol_other (Filedata * filedata, unsigned int other)
11121 {
11122   if (is_ia64_vms (filedata))
11123     {
11124       static char res[32];
11125
11126       res[0] = 0;
11127
11128       /* Function types is for images and .STB files only.  */
11129       switch (filedata->file_header.e_type)
11130         {
11131         case ET_DYN:
11132         case ET_EXEC:
11133           switch (VMS_ST_FUNC_TYPE (other))
11134             {
11135             case VMS_SFT_CODE_ADDR:
11136               strcat (res, " CA");
11137               break;
11138             case VMS_SFT_SYMV_IDX:
11139               strcat (res, " VEC");
11140               break;
11141             case VMS_SFT_FD:
11142               strcat (res, " FD");
11143               break;
11144             case VMS_SFT_RESERVE:
11145               strcat (res, " RSV");
11146               break;
11147             default:
11148               warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
11149                     VMS_ST_FUNC_TYPE (other));
11150               strcat (res, " <unknown>");
11151               break;
11152             }
11153           break;
11154         default:
11155           break;
11156         }
11157       switch (VMS_ST_LINKAGE (other))
11158         {
11159         case VMS_STL_IGNORE:
11160           strcat (res, " IGN");
11161           break;
11162         case VMS_STL_RESERVE:
11163           strcat (res, " RSV");
11164           break;
11165         case VMS_STL_STD:
11166           strcat (res, " STD");
11167           break;
11168         case VMS_STL_LNK:
11169           strcat (res, " LNK");
11170           break;
11171         default:
11172           warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
11173                 VMS_ST_LINKAGE (other));
11174           strcat (res, " <unknown>");
11175           break;
11176         }
11177
11178       if (res[0] != 0)
11179         return res + 1;
11180       else
11181         return res;
11182     }
11183   return NULL;
11184 }
11185
11186 static const char *
11187 get_ppc64_symbol_other (unsigned int other)
11188 {
11189   if ((other & ~STO_PPC64_LOCAL_MASK) != 0)
11190     return NULL;
11191
11192   other >>= STO_PPC64_LOCAL_BIT;
11193   if (other <= 6)
11194     {
11195       static char buf[32];
11196       if (other >= 2)
11197         other = ppc64_decode_local_entry (other);
11198       snprintf (buf, sizeof buf, _("<localentry>: %d"), other);
11199       return buf;
11200     }
11201   return NULL;
11202 }
11203
11204 static const char *
11205 get_symbol_other (Filedata * filedata, unsigned int other)
11206 {
11207   const char * result = NULL;
11208   static char buff [32];
11209
11210   if (other == 0)
11211     return "";
11212
11213   switch (filedata->file_header.e_machine)
11214     {
11215     case EM_MIPS:
11216       result = get_mips_symbol_other (other);
11217       break;
11218     case EM_IA_64:
11219       result = get_ia64_symbol_other (filedata, other);
11220       break;
11221     case EM_PPC64:
11222       result = get_ppc64_symbol_other (other);
11223       break;
11224     default:
11225       result = NULL;
11226       break;
11227     }
11228
11229   if (result)
11230     return result;
11231
11232   snprintf (buff, sizeof buff, _("<other>: %x"), other);
11233   return buff;
11234 }
11235
11236 static const char *
11237 get_symbol_index_type (Filedata * filedata, unsigned int type)
11238 {
11239   static char buff[32];
11240
11241   switch (type)
11242     {
11243     case SHN_UNDEF:     return "UND";
11244     case SHN_ABS:       return "ABS";
11245     case SHN_COMMON:    return "COM";
11246     default:
11247       if (type == SHN_IA_64_ANSI_COMMON
11248           && filedata->file_header.e_machine == EM_IA_64
11249           && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
11250         return "ANSI_COM";
11251       else if ((filedata->file_header.e_machine == EM_X86_64
11252                 || filedata->file_header.e_machine == EM_L1OM
11253                 || filedata->file_header.e_machine == EM_K1OM)
11254                && type == SHN_X86_64_LCOMMON)
11255         return "LARGE_COM";
11256       else if ((type == SHN_MIPS_SCOMMON
11257                 && filedata->file_header.e_machine == EM_MIPS)
11258                || (type == SHN_TIC6X_SCOMMON
11259                    && filedata->file_header.e_machine == EM_TI_C6000))
11260         return "SCOM";
11261       else if (type == SHN_MIPS_SUNDEFINED
11262                && filedata->file_header.e_machine == EM_MIPS)
11263         return "SUND";
11264       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
11265         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
11266       else if (type >= SHN_LOOS && type <= SHN_HIOS)
11267         sprintf (buff, "OS [0x%04x]", type & 0xffff);
11268       else if (type >= SHN_LORESERVE)
11269         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
11270       else if (type >= filedata->file_header.e_shnum)
11271         sprintf (buff, _("bad section index[%3d]"), type);
11272       else
11273         sprintf (buff, "%3d", type);
11274       break;
11275     }
11276
11277   return buff;
11278 }
11279
11280 static bfd_vma *
11281 get_dynamic_data (Filedata * filedata, bfd_size_type number, unsigned int ent_size)
11282 {
11283   unsigned char * e_data;
11284   bfd_vma * i_data;
11285
11286   /* If the size_t type is smaller than the bfd_size_type, eg because
11287      you are building a 32-bit tool on a 64-bit host, then make sure
11288      that when (number) is cast to (size_t) no information is lost.  */
11289   if (sizeof (size_t) < sizeof (bfd_size_type)
11290       && (bfd_size_type) ((size_t) number) != number)
11291     {
11292       error (_("Size truncation prevents reading %s elements of size %u\n"),
11293              bfd_vmatoa ("u", number), ent_size);
11294       return NULL;
11295     }
11296
11297   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
11298      attempting to allocate memory when the read is bound to fail.  */
11299   if (ent_size * number > filedata->file_size)
11300     {
11301       error (_("Invalid number of dynamic entries: %s\n"),
11302              bfd_vmatoa ("u", number));
11303       return NULL;
11304     }
11305
11306   e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
11307   if (e_data == NULL)
11308     {
11309       error (_("Out of memory reading %s dynamic entries\n"),
11310              bfd_vmatoa ("u", number));
11311       return NULL;
11312     }
11313
11314   if (fread (e_data, ent_size, (size_t) number, filedata->handle) != number)
11315     {
11316       error (_("Unable to read in %s bytes of dynamic data\n"),
11317              bfd_vmatoa ("u", number * ent_size));
11318       free (e_data);
11319       return NULL;
11320     }
11321
11322   i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
11323   if (i_data == NULL)
11324     {
11325       error (_("Out of memory allocating space for %s dynamic entries\n"),
11326              bfd_vmatoa ("u", number));
11327       free (e_data);
11328       return NULL;
11329     }
11330
11331   while (number--)
11332     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
11333
11334   free (e_data);
11335
11336   return i_data;
11337 }
11338
11339 static void
11340 print_dynamic_symbol (Filedata * filedata, bfd_vma si, unsigned long hn)
11341 {
11342   Elf_Internal_Sym * psym;
11343   int n;
11344
11345   n = print_vma (si, DEC_5);
11346   if (n < 5)
11347     fputs (&"     "[n], stdout);
11348   printf (" %3lu: ", hn);
11349
11350   if (dynamic_symbols == NULL || si >= num_dynamic_syms)
11351     {
11352       printf (_("<No info available for dynamic symbol number %lu>\n"),
11353               (unsigned long) si);
11354       return;
11355     }
11356
11357   psym = dynamic_symbols + si;
11358   print_vma (psym->st_value, LONG_HEX);
11359   putchar (' ');
11360   print_vma (psym->st_size, DEC_5);
11361
11362   printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11363   printf (" %-6s",  get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11364
11365   if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11366     printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11367   else
11368     {
11369       unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11370
11371       printf (" %-7s",  get_symbol_visibility (vis));
11372       /* Check to see if any other bits in the st_other field are set.
11373          Note - displaying this information disrupts the layout of the
11374          table being generated, but for the moment this case is very
11375          rare.  */
11376       if (psym->st_other ^ vis)
11377         printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11378     }
11379
11380   printf (" %3.3s ", get_symbol_index_type (filedata, psym->st_shndx));
11381   if (VALID_DYNAMIC_NAME (psym->st_name))
11382     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11383   else
11384     printf (_(" <corrupt: %14ld>"), psym->st_name);
11385   putchar ('\n');
11386 }
11387
11388 static const char *
11389 get_symbol_version_string (Filedata *                   filedata,
11390                            bfd_boolean                  is_dynsym,
11391                            const char *                 strtab,
11392                            unsigned long int            strtab_size,
11393                            unsigned int                 si,
11394                            Elf_Internal_Sym *           psym,
11395                            enum versioned_symbol_info * sym_info,
11396                            unsigned short *             vna_other)
11397 {
11398   unsigned char data[2];
11399   unsigned short vers_data;
11400   unsigned long offset;
11401   unsigned short max_vd_ndx;
11402
11403   if (!is_dynsym
11404       || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
11405     return NULL;
11406
11407   offset = offset_from_vma (filedata, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
11408                             sizeof data + si * sizeof (vers_data));
11409
11410   if (get_data (&data, filedata, offset + si * sizeof (vers_data),
11411                 sizeof (data), 1, _("version data")) == NULL)
11412     return NULL;
11413
11414   vers_data = byte_get (data, 2);
11415
11416   if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data == 0)
11417     return NULL;
11418
11419   max_vd_ndx = 0;
11420
11421   /* Usually we'd only see verdef for defined symbols, and verneed for
11422      undefined symbols.  However, symbols defined by the linker in
11423      .dynbss for variables copied from a shared library in order to
11424      avoid text relocations are defined yet have verneed.  We could
11425      use a heuristic to detect the special case, for example, check
11426      for verneed first on symbols defined in SHT_NOBITS sections, but
11427      it is simpler and more reliable to just look for both verdef and
11428      verneed.  .dynbss might not be mapped to a SHT_NOBITS section.  */
11429
11430   if (psym->st_shndx != SHN_UNDEF
11431       && vers_data != 0x8001
11432       && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
11433     {
11434       Elf_Internal_Verdef ivd;
11435       Elf_Internal_Verdaux ivda;
11436       Elf_External_Verdaux evda;
11437       unsigned long off;
11438
11439       off = offset_from_vma (filedata,
11440                              version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
11441                              sizeof (Elf_External_Verdef));
11442
11443       do
11444         {
11445           Elf_External_Verdef evd;
11446
11447           if (get_data (&evd, filedata, off, sizeof (evd), 1,
11448                         _("version def")) == NULL)
11449             {
11450               ivd.vd_ndx = 0;
11451               ivd.vd_aux = 0;
11452               ivd.vd_next = 0;
11453               ivd.vd_flags = 0;
11454             }
11455           else
11456             {
11457               ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
11458               ivd.vd_aux = BYTE_GET (evd.vd_aux);
11459               ivd.vd_next = BYTE_GET (evd.vd_next);
11460               ivd.vd_flags = BYTE_GET (evd.vd_flags);
11461             }
11462
11463           if ((ivd.vd_ndx & VERSYM_VERSION) > max_vd_ndx)
11464             max_vd_ndx = ivd.vd_ndx & VERSYM_VERSION;
11465
11466           off += ivd.vd_next;
11467         }
11468       while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
11469
11470       if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
11471         {
11472           if (ivd.vd_ndx == 1 && ivd.vd_flags == VER_FLG_BASE) 
11473             return NULL;
11474
11475           off -= ivd.vd_next;
11476           off += ivd.vd_aux;
11477
11478           if (get_data (&evda, filedata, off, sizeof (evda), 1,
11479                         _("version def aux")) != NULL)
11480             {
11481               ivda.vda_name = BYTE_GET (evda.vda_name);
11482
11483               if (psym->st_name != ivda.vda_name)
11484                 {
11485                   *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
11486                                ? symbol_hidden : symbol_public);
11487                   return (ivda.vda_name < strtab_size
11488                           ? strtab + ivda.vda_name : _("<corrupt>"));
11489                 }
11490             }
11491         }
11492     }
11493
11494   if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
11495     {
11496       Elf_External_Verneed evn;
11497       Elf_Internal_Verneed ivn;
11498       Elf_Internal_Vernaux ivna;
11499
11500       offset = offset_from_vma (filedata,
11501                                 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
11502                                 sizeof evn);
11503       do
11504         {
11505           unsigned long vna_off;
11506
11507           if (get_data (&evn, filedata, offset, sizeof (evn), 1,
11508                         _("version need")) == NULL)
11509             {
11510               ivna.vna_next = 0;
11511               ivna.vna_other = 0;
11512               ivna.vna_name = 0;
11513               break;
11514             }
11515
11516           ivn.vn_aux  = BYTE_GET (evn.vn_aux);
11517           ivn.vn_next = BYTE_GET (evn.vn_next);
11518
11519           vna_off = offset + ivn.vn_aux;
11520
11521           do
11522             {
11523               Elf_External_Vernaux evna;
11524
11525               if (get_data (&evna, filedata, vna_off, sizeof (evna), 1,
11526                             _("version need aux (3)")) == NULL)
11527                 {
11528                   ivna.vna_next = 0;
11529                   ivna.vna_other = 0;
11530                   ivna.vna_name = 0;
11531                 }
11532               else
11533                 {
11534                   ivna.vna_other = BYTE_GET (evna.vna_other);
11535                   ivna.vna_next  = BYTE_GET (evna.vna_next);
11536                   ivna.vna_name  = BYTE_GET (evna.vna_name);
11537                 }
11538
11539               vna_off += ivna.vna_next;
11540             }
11541           while (ivna.vna_other != vers_data && ivna.vna_next != 0);
11542
11543           if (ivna.vna_other == vers_data)
11544             break;
11545
11546           offset += ivn.vn_next;
11547         }
11548       while (ivn.vn_next != 0);
11549
11550       if (ivna.vna_other == vers_data)
11551         {
11552           *sym_info = symbol_undefined;
11553           *vna_other = ivna.vna_other;
11554           return (ivna.vna_name < strtab_size
11555                   ? strtab + ivna.vna_name : _("<corrupt>"));
11556         }
11557       else if ((max_vd_ndx || (vers_data & VERSYM_VERSION) != 1)
11558                && (vers_data & VERSYM_VERSION) > max_vd_ndx)
11559         return _("<corrupt>");
11560     }
11561   return NULL;
11562 }
11563
11564 /* Dump the symbol table.  */
11565 static bfd_boolean
11566 process_symbol_table (Filedata * filedata)
11567 {
11568   Elf_Internal_Shdr * section;
11569   bfd_size_type nbuckets = 0;
11570   bfd_size_type nchains = 0;
11571   bfd_vma * buckets = NULL;
11572   bfd_vma * chains = NULL;
11573   bfd_vma ngnubuckets = 0;
11574   bfd_vma * gnubuckets = NULL;
11575   bfd_vma * gnuchains = NULL;
11576   bfd_vma gnusymidx = 0;
11577   bfd_size_type ngnuchains = 0;
11578
11579   if (!do_syms && !do_dyn_syms && !do_histogram)
11580     return TRUE;
11581
11582   if (dynamic_info[DT_HASH]
11583       && (do_histogram
11584           || (do_using_dynamic
11585               && !do_dyn_syms
11586               && dynamic_strings != NULL)))
11587     {
11588       unsigned char nb[8];
11589       unsigned char nc[8];
11590       unsigned int hash_ent_size = 4;
11591
11592       if ((filedata->file_header.e_machine == EM_ALPHA
11593            || filedata->file_header.e_machine == EM_S390
11594            || filedata->file_header.e_machine == EM_S390_OLD)
11595           && filedata->file_header.e_ident[EI_CLASS] == ELFCLASS64)
11596         hash_ent_size = 8;
11597
11598       if (fseek (filedata->handle,
11599                  (archive_file_offset
11600                   + offset_from_vma (filedata, dynamic_info[DT_HASH],
11601                                      sizeof nb + sizeof nc)),
11602                  SEEK_SET))
11603         {
11604           error (_("Unable to seek to start of dynamic information\n"));
11605           goto no_hash;
11606         }
11607
11608       if (fread (nb, hash_ent_size, 1, filedata->handle) != 1)
11609         {
11610           error (_("Failed to read in number of buckets\n"));
11611           goto no_hash;
11612         }
11613
11614       if (fread (nc, hash_ent_size, 1, filedata->handle) != 1)
11615         {
11616           error (_("Failed to read in number of chains\n"));
11617           goto no_hash;
11618         }
11619
11620       nbuckets = byte_get (nb, hash_ent_size);
11621       nchains  = byte_get (nc, hash_ent_size);
11622
11623       buckets = get_dynamic_data (filedata, nbuckets, hash_ent_size);
11624       chains  = get_dynamic_data (filedata, nchains, hash_ent_size);
11625
11626     no_hash:
11627       if (buckets == NULL || chains == NULL)
11628         {
11629           if (do_using_dynamic)
11630             return FALSE;
11631           free (buckets);
11632           free (chains);
11633           buckets = NULL;
11634           chains = NULL;
11635           nbuckets = 0;
11636           nchains = 0;
11637         }
11638     }
11639
11640   if (dynamic_info_DT_GNU_HASH
11641       && (do_histogram
11642           || (do_using_dynamic
11643               && !do_dyn_syms
11644               && dynamic_strings != NULL)))
11645     {
11646       unsigned char nb[16];
11647       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11648       bfd_vma buckets_vma;
11649
11650       if (fseek (filedata->handle,
11651                  (archive_file_offset
11652                   + offset_from_vma (filedata, dynamic_info_DT_GNU_HASH,
11653                                      sizeof nb)),
11654                  SEEK_SET))
11655         {
11656           error (_("Unable to seek to start of dynamic information\n"));
11657           goto no_gnu_hash;
11658         }
11659
11660       if (fread (nb, 16, 1, filedata->handle) != 1)
11661         {
11662           error (_("Failed to read in number of buckets\n"));
11663           goto no_gnu_hash;
11664         }
11665
11666       ngnubuckets = byte_get (nb, 4);
11667       gnusymidx = byte_get (nb + 4, 4);
11668       bitmaskwords = byte_get (nb + 8, 4);
11669       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
11670       if (is_32bit_elf)
11671         buckets_vma += bitmaskwords * 4;
11672       else
11673         buckets_vma += bitmaskwords * 8;
11674
11675       if (fseek (filedata->handle,
11676                  (archive_file_offset
11677                   + offset_from_vma (filedata, buckets_vma, 4)),
11678                  SEEK_SET))
11679         {
11680           error (_("Unable to seek to start of dynamic information\n"));
11681           goto no_gnu_hash;
11682         }
11683
11684       gnubuckets = get_dynamic_data (filedata, ngnubuckets, 4);
11685
11686       if (gnubuckets == NULL)
11687         goto no_gnu_hash;
11688
11689       for (i = 0; i < ngnubuckets; i++)
11690         if (gnubuckets[i] != 0)
11691           {
11692             if (gnubuckets[i] < gnusymidx)
11693               return FALSE;
11694
11695             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11696               maxchain = gnubuckets[i];
11697           }
11698
11699       if (maxchain == 0xffffffff)
11700         goto no_gnu_hash;
11701
11702       maxchain -= gnusymidx;
11703
11704       if (fseek (filedata->handle,
11705                  (archive_file_offset
11706                   + offset_from_vma (filedata, buckets_vma
11707                                            + 4 * (ngnubuckets + maxchain), 4)),
11708                  SEEK_SET))
11709         {
11710           error (_("Unable to seek to start of dynamic information\n"));
11711           goto no_gnu_hash;
11712         }
11713
11714       do
11715         {
11716           if (fread (nb, 4, 1, filedata->handle) != 1)
11717             {
11718               error (_("Failed to determine last chain length\n"));
11719               goto no_gnu_hash;
11720             }
11721
11722           if (maxchain + 1 == 0)
11723             goto no_gnu_hash;
11724
11725           ++maxchain;
11726         }
11727       while ((byte_get (nb, 4) & 1) == 0);
11728
11729       if (fseek (filedata->handle,
11730                  (archive_file_offset
11731                   + offset_from_vma (filedata, buckets_vma + 4 * ngnubuckets, 4)),
11732                  SEEK_SET))
11733         {
11734           error (_("Unable to seek to start of dynamic information\n"));
11735           goto no_gnu_hash;
11736         }
11737
11738       gnuchains = get_dynamic_data (filedata, maxchain, 4);
11739       ngnuchains = maxchain;
11740
11741     no_gnu_hash:
11742       if (gnuchains == NULL)
11743         {
11744           free (gnubuckets);
11745           gnubuckets = NULL;
11746           ngnubuckets = 0;
11747           if (do_using_dynamic)
11748             return FALSE;
11749         }
11750     }
11751
11752   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11753       && do_syms
11754       && do_using_dynamic
11755       && dynamic_strings != NULL
11756       && dynamic_symbols != NULL)
11757     {
11758       unsigned long hn;
11759
11760       if (dynamic_info[DT_HASH])
11761         {
11762           bfd_vma si;
11763           char *visited;
11764
11765           printf (_("\nSymbol table for image:\n"));
11766           if (is_32bit_elf)
11767             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11768           else
11769             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11770
11771           visited = xcmalloc (nchains, 1);
11772           memset (visited, 0, nchains);
11773           for (hn = 0; hn < nbuckets; hn++)
11774             {
11775               for (si = buckets[hn]; si > 0; si = chains[si])
11776                 {
11777                   print_dynamic_symbol (filedata, si, hn);
11778                   if (si >= nchains || visited[si])
11779                     {
11780                       error (_("histogram chain is corrupt\n"));
11781                       break;
11782                     }
11783                   visited[si] = 1;
11784                 }
11785             }
11786           free (visited);
11787         }
11788
11789       if (dynamic_info_DT_GNU_HASH)
11790         {
11791           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11792           if (is_32bit_elf)
11793             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11794           else
11795             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11796
11797           for (hn = 0; hn < ngnubuckets; ++hn)
11798             if (gnubuckets[hn] != 0)
11799               {
11800                 bfd_vma si = gnubuckets[hn];
11801                 bfd_vma off = si - gnusymidx;
11802
11803                 do
11804                   {
11805                     print_dynamic_symbol (filedata, si, hn);
11806                     si++;
11807                   }
11808                 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11809               }
11810         }
11811     }
11812   else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11813            && filedata->section_headers != NULL)
11814     {
11815       unsigned int i;
11816
11817       for (i = 0, section = filedata->section_headers;
11818            i < filedata->file_header.e_shnum;
11819            i++, section++)
11820         {
11821           unsigned int si;
11822           char * strtab = NULL;
11823           unsigned long int strtab_size = 0;
11824           Elf_Internal_Sym * symtab;
11825           Elf_Internal_Sym * psym;
11826           unsigned long num_syms;
11827
11828           if ((section->sh_type != SHT_SYMTAB
11829                && section->sh_type != SHT_DYNSYM)
11830               || (!do_syms
11831                   && section->sh_type == SHT_SYMTAB))
11832             continue;
11833
11834           if (section->sh_entsize == 0)
11835             {
11836               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11837                       printable_section_name (filedata, section));
11838               continue;
11839             }
11840
11841           num_syms = section->sh_size / section->sh_entsize;
11842           printf (ngettext ("\nSymbol table '%s' contains %lu entry:\n",
11843                             "\nSymbol table '%s' contains %lu entries:\n",
11844                             num_syms),
11845                   printable_section_name (filedata, section),
11846                   num_syms);
11847
11848           if (is_32bit_elf)
11849             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
11850           else
11851             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
11852
11853           symtab = GET_ELF_SYMBOLS (filedata, section, & num_syms);
11854           if (symtab == NULL)
11855             continue;
11856
11857           if (section->sh_link == filedata->file_header.e_shstrndx)
11858             {
11859               strtab = filedata->string_table;
11860               strtab_size = filedata->string_table_length;
11861             }
11862           else if (section->sh_link < filedata->file_header.e_shnum)
11863             {
11864               Elf_Internal_Shdr * string_sec;
11865
11866               string_sec = filedata->section_headers + section->sh_link;
11867
11868               strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset,
11869                                           1, string_sec->sh_size,
11870                                           _("string table"));
11871               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11872             }
11873
11874           for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11875             {
11876               const char *version_string;
11877               enum versioned_symbol_info sym_info;
11878               unsigned short vna_other;
11879
11880               printf ("%6d: ", si);
11881               print_vma (psym->st_value, LONG_HEX);
11882               putchar (' ');
11883               print_vma (psym->st_size, DEC_5);
11884               printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11885               printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11886               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11887                 printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11888               else
11889                 {
11890                   unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11891
11892                   printf (" %-7s", get_symbol_visibility (vis));
11893                   /* Check to see if any other bits in the st_other field are set.
11894                      Note - displaying this information disrupts the layout of the
11895                      table being generated, but for the moment this case is very rare.  */
11896                   if (psym->st_other ^ vis)
11897                     printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11898                 }
11899               printf (" %4s ", get_symbol_index_type (filedata, psym->st_shndx));
11900               print_symbol (25, psym->st_name < strtab_size
11901                             ? strtab + psym->st_name : _("<corrupt>"));
11902
11903               version_string
11904                 = get_symbol_version_string (filedata,
11905                                              section->sh_type == SHT_DYNSYM,
11906                                              strtab, strtab_size, si,
11907                                              psym, &sym_info, &vna_other);
11908               if (version_string)
11909                 {
11910                   if (sym_info == symbol_undefined)
11911                     printf ("@%s (%d)", version_string, vna_other);
11912                   else
11913                     printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11914                             version_string);
11915                 }
11916
11917               putchar ('\n');
11918
11919               if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
11920                   && si >= section->sh_info
11921                   /* Irix 5 and 6 MIPS binaries are known to ignore this requirement.  */
11922                   && filedata->file_header.e_machine != EM_MIPS
11923                   /* Solaris binaries have been found to violate this requirement as
11924                      well.  Not sure if this is a bug or an ABI requirement.  */
11925                   && filedata->file_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
11926                 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11927                       si, printable_section_name (filedata, section), section->sh_info);
11928             }
11929
11930           free (symtab);
11931           if (strtab != filedata->string_table)
11932             free (strtab);
11933         }
11934     }
11935   else if (do_syms)
11936     printf
11937       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11938
11939   if (do_histogram && buckets != NULL)
11940     {
11941       unsigned long * lengths;
11942       unsigned long * counts;
11943       unsigned long hn;
11944       bfd_vma si;
11945       unsigned long maxlength = 0;
11946       unsigned long nzero_counts = 0;
11947       unsigned long nsyms = 0;
11948       char *visited;
11949
11950       printf (ngettext ("\nHistogram for bucket list length "
11951                         "(total of %lu bucket):\n",
11952                         "\nHistogram for bucket list length "
11953                         "(total of %lu buckets):\n",
11954                         (unsigned long) nbuckets),
11955               (unsigned long) nbuckets);
11956
11957       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11958       if (lengths == NULL)
11959         {
11960           error (_("Out of memory allocating space for histogram buckets\n"));
11961           return FALSE;
11962         }
11963       visited = xcmalloc (nchains, 1);
11964       memset (visited, 0, nchains);
11965
11966       printf (_(" Length  Number     %% of total  Coverage\n"));
11967       for (hn = 0; hn < nbuckets; ++hn)
11968         {
11969           for (si = buckets[hn]; si > 0; si = chains[si])
11970             {
11971               ++nsyms;
11972               if (maxlength < ++lengths[hn])
11973                 ++maxlength;
11974               if (si >= nchains || visited[si])
11975                 {
11976                   error (_("histogram chain is corrupt\n"));
11977                   break;
11978                 }
11979               visited[si] = 1;
11980             }
11981         }
11982       free (visited);
11983
11984       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11985       if (counts == NULL)
11986         {
11987           free (lengths);
11988           error (_("Out of memory allocating space for histogram counts\n"));
11989           return FALSE;
11990         }
11991
11992       for (hn = 0; hn < nbuckets; ++hn)
11993         ++counts[lengths[hn]];
11994
11995       if (nbuckets > 0)
11996         {
11997           unsigned long i;
11998           printf ("      0  %-10lu (%5.1f%%)\n",
11999                   counts[0], (counts[0] * 100.0) / nbuckets);
12000           for (i = 1; i <= maxlength; ++i)
12001             {
12002               nzero_counts += counts[i] * i;
12003               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
12004                       i, counts[i], (counts[i] * 100.0) / nbuckets,
12005                       (nzero_counts * 100.0) / nsyms);
12006             }
12007         }
12008
12009       free (counts);
12010       free (lengths);
12011     }
12012
12013   if (buckets != NULL)
12014     {
12015       free (buckets);
12016       free (chains);
12017     }
12018
12019   if (do_histogram && gnubuckets != NULL)
12020     {
12021       unsigned long * lengths;
12022       unsigned long * counts;
12023       unsigned long hn;
12024       unsigned long maxlength = 0;
12025       unsigned long nzero_counts = 0;
12026       unsigned long nsyms = 0;
12027
12028       printf (ngettext ("\nHistogram for `.gnu.hash' bucket list length "
12029                         "(total of %lu bucket):\n",
12030                         "\nHistogram for `.gnu.hash' bucket list length "
12031                         "(total of %lu buckets):\n",
12032                         (unsigned long) ngnubuckets),
12033               (unsigned long) ngnubuckets);
12034
12035       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
12036       if (lengths == NULL)
12037         {
12038           error (_("Out of memory allocating space for gnu histogram buckets\n"));
12039           return FALSE;
12040         }
12041
12042       printf (_(" Length  Number     %% of total  Coverage\n"));
12043
12044       for (hn = 0; hn < ngnubuckets; ++hn)
12045         if (gnubuckets[hn] != 0)
12046           {
12047             bfd_vma off, length = 1;
12048
12049             for (off = gnubuckets[hn] - gnusymidx;
12050                  /* PR 17531 file: 010-77222-0.004.  */
12051                  off < ngnuchains && (gnuchains[off] & 1) == 0;
12052                  ++off)
12053               ++length;
12054             lengths[hn] = length;
12055             if (length > maxlength)
12056               maxlength = length;
12057             nsyms += length;
12058           }
12059
12060       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
12061       if (counts == NULL)
12062         {
12063           free (lengths);
12064           error (_("Out of memory allocating space for gnu histogram counts\n"));
12065           return FALSE;
12066         }
12067
12068       for (hn = 0; hn < ngnubuckets; ++hn)
12069         ++counts[lengths[hn]];
12070
12071       if (ngnubuckets > 0)
12072         {
12073           unsigned long j;
12074           printf ("      0  %-10lu (%5.1f%%)\n",
12075                   counts[0], (counts[0] * 100.0) / ngnubuckets);
12076           for (j = 1; j <= maxlength; ++j)
12077             {
12078               nzero_counts += counts[j] * j;
12079               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
12080                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
12081                       (nzero_counts * 100.0) / nsyms);
12082             }
12083         }
12084
12085       free (counts);
12086       free (lengths);
12087       free (gnubuckets);
12088       free (gnuchains);
12089     }
12090
12091   return TRUE;
12092 }
12093
12094 static bfd_boolean
12095 process_syminfo (Filedata * filedata ATTRIBUTE_UNUSED)
12096 {
12097   unsigned int i;
12098
12099   if (dynamic_syminfo == NULL
12100       || !do_dynamic)
12101     /* No syminfo, this is ok.  */
12102     return TRUE;
12103
12104   /* There better should be a dynamic symbol section.  */
12105   if (dynamic_symbols == NULL || dynamic_strings == NULL)
12106     return FALSE;
12107
12108   if (dynamic_addr)
12109     printf (ngettext ("\nDynamic info segment at offset 0x%lx "
12110                       "contains %d entry:\n",
12111                       "\nDynamic info segment at offset 0x%lx "
12112                       "contains %d entries:\n",
12113                       dynamic_syminfo_nent),
12114             dynamic_syminfo_offset, dynamic_syminfo_nent);
12115
12116   printf (_(" Num: Name                           BoundTo     Flags\n"));
12117   for (i = 0; i < dynamic_syminfo_nent; ++i)
12118     {
12119       unsigned short int flags = dynamic_syminfo[i].si_flags;
12120
12121       printf ("%4d: ", i);
12122       if (i >= num_dynamic_syms)
12123         printf (_("<corrupt index>"));
12124       else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
12125         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
12126       else
12127         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
12128       putchar (' ');
12129
12130       switch (dynamic_syminfo[i].si_boundto)
12131         {
12132         case SYMINFO_BT_SELF:
12133           fputs ("SELF       ", stdout);
12134           break;
12135         case SYMINFO_BT_PARENT:
12136           fputs ("PARENT     ", stdout);
12137           break;
12138         default:
12139           if (dynamic_syminfo[i].si_boundto > 0
12140               && dynamic_syminfo[i].si_boundto < dynamic_nent
12141               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
12142             {
12143               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
12144               putchar (' ' );
12145             }
12146           else
12147             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
12148           break;
12149         }
12150
12151       if (flags & SYMINFO_FLG_DIRECT)
12152         printf (" DIRECT");
12153       if (flags & SYMINFO_FLG_PASSTHRU)
12154         printf (" PASSTHRU");
12155       if (flags & SYMINFO_FLG_COPY)
12156         printf (" COPY");
12157       if (flags & SYMINFO_FLG_LAZYLOAD)
12158         printf (" LAZYLOAD");
12159
12160       puts ("");
12161     }
12162
12163   return TRUE;
12164 }
12165
12166 #define IN_RANGE(START,END,ADDR,OFF)            \
12167   (((ADDR) >= (START)) && ((ADDR) + (OFF) < (END)))
12168
12169 /* Check to see if the given reloc needs to be handled in a target specific
12170    manner.  If so then process the reloc and return TRUE otherwise return
12171    FALSE.
12172
12173    If called with reloc == NULL, then this is a signal that reloc processing
12174    for the current section has finished, and any saved state should be
12175    discarded.  */
12176
12177 static bfd_boolean
12178 target_specific_reloc_handling (Filedata *           filedata,
12179                                 Elf_Internal_Rela *  reloc,
12180                                 unsigned char *      start,
12181                                 unsigned char *      end,
12182                                 Elf_Internal_Sym *   symtab,
12183                                 unsigned long        num_syms)
12184 {
12185   unsigned int reloc_type = 0;
12186   unsigned long sym_index = 0;
12187
12188   if (reloc)
12189     {
12190       reloc_type = get_reloc_type (filedata, reloc->r_info);
12191       sym_index = get_reloc_symindex (reloc->r_info);
12192     }
12193
12194   switch (filedata->file_header.e_machine)
12195     {
12196     case EM_MSP430:
12197     case EM_MSP430_OLD:
12198       {
12199         static Elf_Internal_Sym * saved_sym = NULL;
12200
12201         if (reloc == NULL)
12202           {
12203             saved_sym = NULL;
12204             return TRUE;
12205           }
12206
12207         switch (reloc_type)
12208           {
12209           case 10: /* R_MSP430_SYM_DIFF */
12210             if (uses_msp430x_relocs (filedata))
12211               break;
12212             /* Fall through.  */
12213           case 21: /* R_MSP430X_SYM_DIFF */
12214             /* PR 21139.  */
12215             if (sym_index >= num_syms)
12216               error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
12217                      sym_index);
12218             else
12219               saved_sym = symtab + sym_index;
12220             return TRUE;
12221
12222           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
12223           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
12224             goto handle_sym_diff;
12225
12226           case 5: /* R_MSP430_16_BYTE */
12227           case 9: /* R_MSP430_8 */
12228             if (uses_msp430x_relocs (filedata))
12229               break;
12230             goto handle_sym_diff;
12231
12232           case 2: /* R_MSP430_ABS16 */
12233           case 15: /* R_MSP430X_ABS16 */
12234             if (! uses_msp430x_relocs (filedata))
12235               break;
12236             goto handle_sym_diff;
12237
12238           handle_sym_diff:
12239             if (saved_sym != NULL)
12240               {
12241                 int reloc_size = reloc_type == 1 ? 4 : 2;
12242                 bfd_vma value;
12243
12244                 if (sym_index >= num_syms)
12245                   error (_("MSP430 reloc contains invalid symbol index %lu\n"),
12246                          sym_index);
12247                 else
12248                   {
12249                     value = reloc->r_addend + (symtab[sym_index].st_value
12250                                                - saved_sym->st_value);
12251
12252                     if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12253                       byte_put (start + reloc->r_offset, value, reloc_size);
12254                     else
12255                       /* PR 21137 */
12256                       error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
12257                              (long) reloc->r_offset);
12258                   }
12259
12260                 saved_sym = NULL;
12261                 return TRUE;
12262               }
12263             break;
12264
12265           default:
12266             if (saved_sym != NULL)
12267               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
12268             break;
12269           }
12270         break;
12271       }
12272
12273     case EM_MN10300:
12274     case EM_CYGNUS_MN10300:
12275       {
12276         static Elf_Internal_Sym * saved_sym = NULL;
12277
12278         if (reloc == NULL)
12279           {
12280             saved_sym = NULL;
12281             return TRUE;
12282           }
12283
12284         switch (reloc_type)
12285           {
12286           case 34: /* R_MN10300_ALIGN */
12287             return TRUE;
12288           case 33: /* R_MN10300_SYM_DIFF */
12289             if (sym_index >= num_syms)
12290               error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
12291                      sym_index);
12292             else
12293               saved_sym = symtab + sym_index;
12294             return TRUE;
12295
12296           case 1: /* R_MN10300_32 */
12297           case 2: /* R_MN10300_16 */
12298             if (saved_sym != NULL)
12299               {
12300                 int reloc_size = reloc_type == 1 ? 4 : 2;
12301                 bfd_vma value;
12302
12303                 if (sym_index >= num_syms)
12304                   error (_("MN10300 reloc contains invalid symbol index %lu\n"),
12305                          sym_index);
12306                 else
12307                   {
12308                     value = reloc->r_addend + (symtab[sym_index].st_value
12309                                                - saved_sym->st_value);
12310
12311                     if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12312                       byte_put (start + reloc->r_offset, value, reloc_size);
12313                     else
12314                       error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
12315                              (long) reloc->r_offset);
12316                   }
12317
12318                 saved_sym = NULL;
12319                 return TRUE;
12320               }
12321             break;
12322           default:
12323             if (saved_sym != NULL)
12324               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
12325             break;
12326           }
12327         break;
12328       }
12329
12330     case EM_RL78:
12331       {
12332         static bfd_vma saved_sym1 = 0;
12333         static bfd_vma saved_sym2 = 0;
12334         static bfd_vma value;
12335
12336         if (reloc == NULL)
12337           {
12338             saved_sym1 = saved_sym2 = 0;
12339             return TRUE;
12340           }
12341
12342         switch (reloc_type)
12343           {
12344           case 0x80: /* R_RL78_SYM.  */
12345             saved_sym1 = saved_sym2;
12346             if (sym_index >= num_syms)
12347               error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
12348                      sym_index);
12349             else
12350               {
12351                 saved_sym2 = symtab[sym_index].st_value;
12352                 saved_sym2 += reloc->r_addend;
12353               }
12354             return TRUE;
12355
12356           case 0x83: /* R_RL78_OPsub.  */
12357             value = saved_sym1 - saved_sym2;
12358             saved_sym2 = saved_sym1 = 0;
12359             return TRUE;
12360             break;
12361
12362           case 0x41: /* R_RL78_ABS32.  */
12363             if (IN_RANGE (start, end, start + reloc->r_offset, 4))
12364               byte_put (start + reloc->r_offset, value, 4);
12365             else
12366               error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12367                      (long) reloc->r_offset);
12368             value = 0;
12369             return TRUE;
12370
12371           case 0x43: /* R_RL78_ABS16.  */
12372             if (IN_RANGE (start, end, start + reloc->r_offset, 2))
12373               byte_put (start + reloc->r_offset, value, 2);
12374             else
12375               error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12376                      (long) reloc->r_offset);
12377             value = 0;
12378             return TRUE;
12379
12380           default:
12381             break;
12382           }
12383         break;
12384       }
12385     }
12386
12387   return FALSE;
12388 }
12389
12390 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
12391    DWARF debug sections.  This is a target specific test.  Note - we do not
12392    go through the whole including-target-headers-multiple-times route, (as
12393    we have already done with <elf/h8.h>) because this would become very
12394    messy and even then this function would have to contain target specific
12395    information (the names of the relocs instead of their numeric values).
12396    FIXME: This is not the correct way to solve this problem.  The proper way
12397    is to have target specific reloc sizing and typing functions created by
12398    the reloc-macros.h header, in the same way that it already creates the
12399    reloc naming functions.  */
12400
12401 static bfd_boolean
12402 is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12403 {
12404   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12405   switch (filedata->file_header.e_machine)
12406     {
12407     case EM_386:
12408     case EM_IAMCU:
12409       return reloc_type == 1; /* R_386_32.  */
12410     case EM_68K:
12411       return reloc_type == 1; /* R_68K_32.  */
12412     case EM_860:
12413       return reloc_type == 1; /* R_860_32.  */
12414     case EM_960:
12415       return reloc_type == 2; /* R_960_32.  */
12416     case EM_AARCH64:
12417       return (reloc_type == 258
12418               || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
12419     case EM_BPF:
12420       return reloc_type == 11; /* R_BPF_DATA_32 */
12421     case EM_ADAPTEVA_EPIPHANY:
12422       return reloc_type == 3;
12423     case EM_ALPHA:
12424       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
12425     case EM_ARC:
12426       return reloc_type == 1; /* R_ARC_32.  */
12427     case EM_ARC_COMPACT:
12428     case EM_ARC_COMPACT2:
12429       return reloc_type == 4; /* R_ARC_32.  */
12430     case EM_ARM:
12431       return reloc_type == 2; /* R_ARM_ABS32 */
12432     case EM_AVR_OLD:
12433     case EM_AVR:
12434       return reloc_type == 1;
12435     case EM_BLACKFIN:
12436       return reloc_type == 0x12; /* R_byte4_data.  */
12437     case EM_CRIS:
12438       return reloc_type == 3; /* R_CRIS_32.  */
12439     case EM_CR16:
12440       return reloc_type == 3; /* R_CR16_NUM32.  */
12441     case EM_CRX:
12442       return reloc_type == 15; /* R_CRX_NUM32.  */
12443     case EM_CSKY:
12444       return reloc_type == 1; /* R_CKCORE_ADDR32.  */
12445     case EM_CYGNUS_FRV:
12446       return reloc_type == 1;
12447     case EM_CYGNUS_D10V:
12448     case EM_D10V:
12449       return reloc_type == 6; /* R_D10V_32.  */
12450     case EM_CYGNUS_D30V:
12451     case EM_D30V:
12452       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
12453     case EM_DLX:
12454       return reloc_type == 3; /* R_DLX_RELOC_32.  */
12455     case EM_CYGNUS_FR30:
12456     case EM_FR30:
12457       return reloc_type == 3; /* R_FR30_32.  */
12458     case EM_FT32:
12459       return reloc_type == 1; /* R_FT32_32.  */
12460     case EM_H8S:
12461     case EM_H8_300:
12462     case EM_H8_300H:
12463       return reloc_type == 1; /* R_H8_DIR32.  */
12464     case EM_IA_64:
12465       return (reloc_type == 0x64    /* R_IA64_SECREL32MSB.  */
12466               || reloc_type == 0x65 /* R_IA64_SECREL32LSB.  */
12467               || reloc_type == 0x24 /* R_IA64_DIR32MSB.  */
12468               || reloc_type == 0x25 /* R_IA64_DIR32LSB.  */);
12469     case EM_IP2K_OLD:
12470     case EM_IP2K:
12471       return reloc_type == 2; /* R_IP2K_32.  */
12472     case EM_IQ2000:
12473       return reloc_type == 2; /* R_IQ2000_32.  */
12474     case EM_LATTICEMICO32:
12475       return reloc_type == 3; /* R_LM32_32.  */
12476     case EM_M32C_OLD:
12477     case EM_M32C:
12478       return reloc_type == 3; /* R_M32C_32.  */
12479     case EM_M32R:
12480       return reloc_type == 34; /* R_M32R_32_RELA.  */
12481     case EM_68HC11:
12482     case EM_68HC12:
12483       return reloc_type == 6; /* R_M68HC11_32.  */
12484     case EM_S12Z:
12485       return reloc_type == 7 || /* R_S12Z_EXT32 */
12486         reloc_type == 6;        /* R_S12Z_CW32.  */
12487     case EM_MCORE:
12488       return reloc_type == 1; /* R_MCORE_ADDR32.  */
12489     case EM_CYGNUS_MEP:
12490       return reloc_type == 4; /* R_MEP_32.  */
12491     case EM_METAG:
12492       return reloc_type == 2; /* R_METAG_ADDR32.  */
12493     case EM_MICROBLAZE:
12494       return reloc_type == 1; /* R_MICROBLAZE_32.  */
12495     case EM_MIPS:
12496       return reloc_type == 2; /* R_MIPS_32.  */
12497     case EM_MMIX:
12498       return reloc_type == 4; /* R_MMIX_32.  */
12499     case EM_CYGNUS_MN10200:
12500     case EM_MN10200:
12501       return reloc_type == 1; /* R_MN10200_32.  */
12502     case EM_CYGNUS_MN10300:
12503     case EM_MN10300:
12504       return reloc_type == 1; /* R_MN10300_32.  */
12505     case EM_MOXIE:
12506       return reloc_type == 1; /* R_MOXIE_32.  */
12507     case EM_MSP430_OLD:
12508     case EM_MSP430:
12509       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
12510     case EM_MT:
12511       return reloc_type == 2; /* R_MT_32.  */
12512     case EM_NDS32:
12513       return reloc_type == 20; /* R_NDS32_RELA.  */
12514     case EM_ALTERA_NIOS2:
12515       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
12516     case EM_NIOS32:
12517       return reloc_type == 1; /* R_NIOS_32.  */
12518     case EM_OR1K:
12519       return reloc_type == 1; /* R_OR1K_32.  */
12520     case EM_PARISC:
12521       return (reloc_type == 1 /* R_PARISC_DIR32.  */          
12522               || reloc_type == 2 /* R_PARISC_DIR21L.  */
12523               || reloc_type == 41); /* R_PARISC_SECREL32.  */
12524     case EM_PJ:
12525     case EM_PJ_OLD:
12526       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
12527     case EM_PPC64:
12528       return reloc_type == 1; /* R_PPC64_ADDR32.  */
12529     case EM_PPC:
12530       return reloc_type == 1; /* R_PPC_ADDR32.  */
12531     case EM_TI_PRU:
12532       return reloc_type == 11; /* R_PRU_BFD_RELOC_32.  */
12533     case EM_RISCV:
12534       return reloc_type == 1; /* R_RISCV_32.  */
12535     case EM_RL78:
12536       return reloc_type == 1; /* R_RL78_DIR32.  */
12537     case EM_RX:
12538       return reloc_type == 1; /* R_RX_DIR32.  */
12539     case EM_S370:
12540       return reloc_type == 1; /* R_I370_ADDR31.  */
12541     case EM_S390_OLD:
12542     case EM_S390:
12543       return reloc_type == 4; /* R_S390_32.  */
12544     case EM_SCORE:
12545       return reloc_type == 8; /* R_SCORE_ABS32.  */
12546     case EM_SH:
12547       return reloc_type == 1; /* R_SH_DIR32.  */
12548     case EM_SPARC32PLUS:
12549     case EM_SPARCV9:
12550     case EM_SPARC:
12551       return reloc_type == 3 /* R_SPARC_32.  */
12552         || reloc_type == 23; /* R_SPARC_UA32.  */
12553     case EM_SPU:
12554       return reloc_type == 6; /* R_SPU_ADDR32 */
12555     case EM_TI_C6000:
12556       return reloc_type == 1; /* R_C6000_ABS32.  */
12557     case EM_TILEGX:
12558       return reloc_type == 2; /* R_TILEGX_32.  */
12559     case EM_TILEPRO:
12560       return reloc_type == 1; /* R_TILEPRO_32.  */
12561     case EM_CYGNUS_V850:
12562     case EM_V850:
12563       return reloc_type == 6; /* R_V850_ABS32.  */
12564     case EM_V800:
12565       return reloc_type == 0x33; /* R_V810_WORD.  */
12566     case EM_VAX:
12567       return reloc_type == 1; /* R_VAX_32.  */
12568     case EM_VISIUM:
12569       return reloc_type == 3;  /* R_VISIUM_32. */
12570     case EM_WEBASSEMBLY:
12571       return reloc_type == 1;  /* R_WASM32_32.  */
12572     case EM_X86_64:
12573     case EM_L1OM:
12574     case EM_K1OM:
12575       return reloc_type == 10; /* R_X86_64_32.  */
12576     case EM_XC16X:
12577     case EM_C166:
12578       return reloc_type == 3; /* R_XC16C_ABS_32.  */
12579     case EM_XGATE:
12580       return reloc_type == 4; /* R_XGATE_32.  */
12581     case EM_XSTORMY16:
12582       return reloc_type == 1; /* R_XSTROMY16_32.  */
12583     case EM_XTENSA_OLD:
12584     case EM_XTENSA:
12585       return reloc_type == 1; /* R_XTENSA_32.  */
12586     default:
12587       {
12588         static unsigned int prev_warn = 0;
12589
12590         /* Avoid repeating the same warning multiple times.  */
12591         if (prev_warn != filedata->file_header.e_machine)
12592           error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
12593                  filedata->file_header.e_machine);
12594         prev_warn = filedata->file_header.e_machine;
12595         return FALSE;
12596       }
12597     }
12598 }
12599
12600 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12601    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
12602
12603 static bfd_boolean
12604 is_32bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12605 {
12606   switch (filedata->file_header.e_machine)
12607   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12608     {
12609     case EM_386:
12610     case EM_IAMCU:
12611       return reloc_type == 2;  /* R_386_PC32.  */
12612     case EM_68K:
12613       return reloc_type == 4;  /* R_68K_PC32.  */
12614     case EM_AARCH64:
12615       return reloc_type == 261; /* R_AARCH64_PREL32 */
12616     case EM_ADAPTEVA_EPIPHANY:
12617       return reloc_type == 6;
12618     case EM_ALPHA:
12619       return reloc_type == 10; /* R_ALPHA_SREL32.  */
12620     case EM_ARC_COMPACT:
12621     case EM_ARC_COMPACT2:
12622       return reloc_type == 49; /* R_ARC_32_PCREL.  */
12623     case EM_ARM:
12624       return reloc_type == 3;  /* R_ARM_REL32 */
12625     case EM_AVR_OLD:
12626     case EM_AVR:
12627       return reloc_type == 36; /* R_AVR_32_PCREL.  */
12628     case EM_MICROBLAZE:
12629       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
12630     case EM_OR1K:
12631       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
12632     case EM_PARISC:
12633       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
12634     case EM_PPC:
12635       return reloc_type == 26; /* R_PPC_REL32.  */
12636     case EM_PPC64:
12637       return reloc_type == 26; /* R_PPC64_REL32.  */
12638     case EM_RISCV:
12639       return reloc_type == 57;  /* R_RISCV_32_PCREL.  */
12640     case EM_S390_OLD:
12641     case EM_S390:
12642       return reloc_type == 5;  /* R_390_PC32.  */
12643     case EM_SH:
12644       return reloc_type == 2;  /* R_SH_REL32.  */
12645     case EM_SPARC32PLUS:
12646     case EM_SPARCV9:
12647     case EM_SPARC:
12648       return reloc_type == 6;  /* R_SPARC_DISP32.  */
12649     case EM_SPU:
12650       return reloc_type == 13; /* R_SPU_REL32.  */
12651     case EM_TILEGX:
12652       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
12653     case EM_TILEPRO:
12654       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
12655     case EM_VISIUM:
12656       return reloc_type == 6;  /* R_VISIUM_32_PCREL */
12657     case EM_X86_64:
12658     case EM_L1OM:
12659     case EM_K1OM:
12660       return reloc_type == 2;  /* R_X86_64_PC32.  */
12661     case EM_XTENSA_OLD:
12662     case EM_XTENSA:
12663       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
12664     default:
12665       /* Do not abort or issue an error message here.  Not all targets use
12666          pc-relative 32-bit relocs in their DWARF debug information and we
12667          have already tested for target coverage in is_32bit_abs_reloc.  A
12668          more helpful warning message will be generated by apply_relocations
12669          anyway, so just return.  */
12670       return FALSE;
12671     }
12672 }
12673
12674 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12675    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
12676
12677 static bfd_boolean
12678 is_64bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12679 {
12680   switch (filedata->file_header.e_machine)
12681     {
12682     case EM_AARCH64:
12683       return reloc_type == 257; /* R_AARCH64_ABS64.  */
12684     case EM_ALPHA:
12685       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
12686     case EM_IA_64:
12687       return (reloc_type == 0x26    /* R_IA64_DIR64MSB.  */
12688               || reloc_type == 0x27 /* R_IA64_DIR64LSB.  */);
12689     case EM_PARISC:
12690       return reloc_type == 80; /* R_PARISC_DIR64.  */
12691     case EM_PPC64:
12692       return reloc_type == 38; /* R_PPC64_ADDR64.  */
12693     case EM_RISCV:
12694       return reloc_type == 2; /* R_RISCV_64.  */
12695     case EM_SPARC32PLUS:
12696     case EM_SPARCV9:
12697     case EM_SPARC:
12698       return reloc_type == 32 /* R_SPARC_64.  */
12699         || reloc_type == 54; /* R_SPARC_UA64.  */
12700     case EM_X86_64:
12701     case EM_L1OM:
12702     case EM_K1OM:
12703       return reloc_type == 1; /* R_X86_64_64.  */
12704     case EM_S390_OLD:
12705     case EM_S390:
12706       return reloc_type == 22;  /* R_S390_64.  */
12707     case EM_TILEGX:
12708       return reloc_type == 1; /* R_TILEGX_64.  */
12709     case EM_MIPS:
12710       return reloc_type == 18;  /* R_MIPS_64.  */
12711     default:
12712       return FALSE;
12713     }
12714 }
12715
12716 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12717    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
12718
12719 static bfd_boolean
12720 is_64bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12721 {
12722   switch (filedata->file_header.e_machine)
12723     {
12724     case EM_AARCH64:
12725       return reloc_type == 260; /* R_AARCH64_PREL64.  */
12726     case EM_ALPHA:
12727       return reloc_type == 11; /* R_ALPHA_SREL64.  */
12728     case EM_IA_64:
12729       return (reloc_type == 0x4e    /* R_IA64_PCREL64MSB.  */
12730               || reloc_type == 0x4f /* R_IA64_PCREL64LSB.  */);
12731     case EM_PARISC:
12732       return reloc_type == 72; /* R_PARISC_PCREL64.  */
12733     case EM_PPC64:
12734       return reloc_type == 44; /* R_PPC64_REL64.  */
12735     case EM_SPARC32PLUS:
12736     case EM_SPARCV9:
12737     case EM_SPARC:
12738       return reloc_type == 46; /* R_SPARC_DISP64.  */
12739     case EM_X86_64:
12740     case EM_L1OM:
12741     case EM_K1OM:
12742       return reloc_type == 24; /* R_X86_64_PC64.  */
12743     case EM_S390_OLD:
12744     case EM_S390:
12745       return reloc_type == 23;  /* R_S390_PC64.  */
12746     case EM_TILEGX:
12747       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
12748     default:
12749       return FALSE;
12750     }
12751 }
12752
12753 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12754    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
12755
12756 static bfd_boolean
12757 is_24bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12758 {
12759   switch (filedata->file_header.e_machine)
12760     {
12761     case EM_CYGNUS_MN10200:
12762     case EM_MN10200:
12763       return reloc_type == 4; /* R_MN10200_24.  */
12764     case EM_FT32:
12765       return reloc_type == 5; /* R_FT32_20.  */
12766     default:
12767       return FALSE;
12768     }
12769 }
12770
12771 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12772    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
12773
12774 static bfd_boolean
12775 is_16bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12776 {
12777   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12778   switch (filedata->file_header.e_machine)
12779     {
12780     case EM_ARC:
12781     case EM_ARC_COMPACT:
12782     case EM_ARC_COMPACT2:
12783       return reloc_type == 2; /* R_ARC_16.  */
12784     case EM_ADAPTEVA_EPIPHANY:
12785       return reloc_type == 5;
12786     case EM_AVR_OLD:
12787     case EM_AVR:
12788       return reloc_type == 4; /* R_AVR_16.  */
12789     case EM_CYGNUS_D10V:
12790     case EM_D10V:
12791       return reloc_type == 3; /* R_D10V_16.  */
12792     case EM_FT32:
12793       return reloc_type == 2; /* R_FT32_16.  */
12794     case EM_H8S:
12795     case EM_H8_300:
12796     case EM_H8_300H:
12797       return reloc_type == R_H8_DIR16;
12798     case EM_IP2K_OLD:
12799     case EM_IP2K:
12800       return reloc_type == 1; /* R_IP2K_16.  */
12801     case EM_M32C_OLD:
12802     case EM_M32C:
12803       return reloc_type == 1; /* R_M32C_16 */
12804     case EM_CYGNUS_MN10200:
12805     case EM_MN10200:
12806       return reloc_type == 2; /* R_MN10200_16.  */
12807     case EM_CYGNUS_MN10300:
12808     case EM_MN10300:
12809       return reloc_type == 2; /* R_MN10300_16.  */
12810     case EM_MSP430:
12811       if (uses_msp430x_relocs (filedata))
12812         return reloc_type == 2; /* R_MSP430_ABS16.  */
12813       /* Fall through.  */
12814     case EM_MSP430_OLD:
12815       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
12816     case EM_NDS32:
12817       return reloc_type == 19; /* R_NDS32_RELA.  */
12818     case EM_ALTERA_NIOS2:
12819       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
12820     case EM_NIOS32:
12821       return reloc_type == 9; /* R_NIOS_16.  */
12822     case EM_OR1K:
12823       return reloc_type == 2; /* R_OR1K_16.  */
12824     case EM_RISCV:
12825       return reloc_type == 55; /* R_RISCV_SET16.  */
12826     case EM_TI_PRU:
12827       return reloc_type == 8; /* R_PRU_BFD_RELOC_16.  */
12828     case EM_TI_C6000:
12829       return reloc_type == 2; /* R_C6000_ABS16.  */
12830     case EM_VISIUM:
12831       return reloc_type == 2; /* R_VISIUM_16. */
12832     case EM_XC16X:
12833     case EM_C166:
12834       return reloc_type == 2; /* R_XC16C_ABS_16.  */
12835     case EM_XGATE:
12836       return reloc_type == 3; /* R_XGATE_16.  */
12837     default:
12838       return FALSE;
12839     }
12840 }
12841
12842 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12843    a 8-bit absolute RELA relocation used in DWARF debug sections.  */
12844
12845 static bfd_boolean
12846 is_8bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12847 {
12848   switch (filedata->file_header.e_machine)
12849     {
12850     case EM_RISCV:
12851       return reloc_type == 54; /* R_RISCV_SET8.  */
12852     default:
12853       return FALSE;
12854     }
12855 }
12856
12857 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12858    a 6-bit absolute RELA relocation used in DWARF debug sections.  */
12859
12860 static bfd_boolean
12861 is_6bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12862 {
12863   switch (filedata->file_header.e_machine)
12864     {
12865     case EM_RISCV:
12866       return reloc_type == 53; /* R_RISCV_SET6.  */
12867     default:
12868       return FALSE;
12869     }
12870 }
12871
12872 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12873    a 32-bit inplace add RELA relocation used in DWARF debug sections.  */
12874
12875 static bfd_boolean
12876 is_32bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12877 {
12878   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12879   switch (filedata->file_header.e_machine)
12880     {
12881     case EM_RISCV:
12882       return reloc_type == 35; /* R_RISCV_ADD32.  */
12883     default:
12884       return FALSE;
12885     }
12886 }
12887
12888 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12889    a 32-bit inplace sub RELA relocation used in DWARF debug sections.  */
12890
12891 static bfd_boolean
12892 is_32bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12893 {
12894   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12895   switch (filedata->file_header.e_machine)
12896     {
12897     case EM_RISCV:
12898       return reloc_type == 39; /* R_RISCV_SUB32.  */
12899     default:
12900       return FALSE;
12901     }
12902 }
12903
12904 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12905    a 64-bit inplace add RELA relocation used in DWARF debug sections.  */
12906
12907 static bfd_boolean
12908 is_64bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12909 {
12910   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12911   switch (filedata->file_header.e_machine)
12912     {
12913     case EM_RISCV:
12914       return reloc_type == 36; /* R_RISCV_ADD64.  */
12915     default:
12916       return FALSE;
12917     }
12918 }
12919
12920 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12921    a 64-bit inplace sub RELA relocation used in DWARF debug sections.  */
12922
12923 static bfd_boolean
12924 is_64bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12925 {
12926   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12927   switch (filedata->file_header.e_machine)
12928     {
12929     case EM_RISCV:
12930       return reloc_type == 40; /* R_RISCV_SUB64.  */
12931     default:
12932       return FALSE;
12933     }
12934 }
12935
12936 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12937    a 16-bit inplace add RELA relocation used in DWARF debug sections.  */
12938
12939 static bfd_boolean
12940 is_16bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12941 {
12942   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12943   switch (filedata->file_header.e_machine)
12944     {
12945     case EM_RISCV:
12946       return reloc_type == 34; /* R_RISCV_ADD16.  */
12947     default:
12948       return FALSE;
12949     }
12950 }
12951
12952 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12953    a 16-bit inplace sub RELA relocation used in DWARF debug sections.  */
12954
12955 static bfd_boolean
12956 is_16bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12957 {
12958   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12959   switch (filedata->file_header.e_machine)
12960     {
12961     case EM_RISCV:
12962       return reloc_type == 38; /* R_RISCV_SUB16.  */
12963     default:
12964       return FALSE;
12965     }
12966 }
12967
12968 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12969    a 8-bit inplace add RELA relocation used in DWARF debug sections.  */
12970
12971 static bfd_boolean
12972 is_8bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12973 {
12974   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12975   switch (filedata->file_header.e_machine)
12976     {
12977     case EM_RISCV:
12978       return reloc_type == 33; /* R_RISCV_ADD8.  */
12979     default:
12980       return FALSE;
12981     }
12982 }
12983
12984 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12985    a 8-bit inplace sub RELA relocation used in DWARF debug sections.  */
12986
12987 static bfd_boolean
12988 is_8bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12989 {
12990   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12991   switch (filedata->file_header.e_machine)
12992     {
12993     case EM_RISCV:
12994       return reloc_type == 37; /* R_RISCV_SUB8.  */
12995     default:
12996       return FALSE;
12997     }
12998 }
12999
13000 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13001    a 6-bit inplace sub RELA relocation used in DWARF debug sections.  */
13002
13003 static bfd_boolean
13004 is_6bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
13005 {
13006   switch (filedata->file_header.e_machine)
13007     {
13008     case EM_RISCV:
13009       return reloc_type == 52; /* R_RISCV_SUB6.  */
13010     default:
13011       return FALSE;
13012     }
13013 }
13014
13015 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
13016    relocation entries (possibly formerly used for SHT_GROUP sections).  */
13017
13018 static bfd_boolean
13019 is_none_reloc (Filedata * filedata, unsigned int reloc_type)
13020 {
13021   switch (filedata->file_header.e_machine)
13022     {
13023     case EM_386:     /* R_386_NONE.  */
13024     case EM_68K:     /* R_68K_NONE.  */
13025     case EM_ADAPTEVA_EPIPHANY:
13026     case EM_ALPHA:   /* R_ALPHA_NONE.  */
13027     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
13028     case EM_ARC:     /* R_ARC_NONE.  */
13029     case EM_ARC_COMPACT2: /* R_ARC_NONE.  */
13030     case EM_ARC_COMPACT: /* R_ARC_NONE.  */
13031     case EM_ARM:     /* R_ARM_NONE.  */
13032     case EM_C166:    /* R_XC16X_NONE.  */
13033     case EM_CRIS:    /* R_CRIS_NONE.  */
13034     case EM_FT32:    /* R_FT32_NONE.  */
13035     case EM_IA_64:   /* R_IA64_NONE.  */
13036     case EM_K1OM:    /* R_X86_64_NONE.  */
13037     case EM_L1OM:    /* R_X86_64_NONE.  */
13038     case EM_M32R:    /* R_M32R_NONE.  */
13039     case EM_MIPS:    /* R_MIPS_NONE.  */
13040     case EM_MN10300: /* R_MN10300_NONE.  */
13041     case EM_MOXIE:   /* R_MOXIE_NONE.  */
13042     case EM_NIOS32:  /* R_NIOS_NONE.  */
13043     case EM_OR1K:    /* R_OR1K_NONE. */
13044     case EM_PARISC:  /* R_PARISC_NONE.  */
13045     case EM_PPC64:   /* R_PPC64_NONE.  */
13046     case EM_PPC:     /* R_PPC_NONE.  */
13047     case EM_RISCV:   /* R_RISCV_NONE.  */
13048     case EM_S390:    /* R_390_NONE.  */
13049     case EM_S390_OLD:
13050     case EM_SH:      /* R_SH_NONE.  */
13051     case EM_SPARC32PLUS:
13052     case EM_SPARC:   /* R_SPARC_NONE.  */
13053     case EM_SPARCV9:
13054     case EM_TILEGX:  /* R_TILEGX_NONE.  */
13055     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
13056     case EM_TI_C6000:/* R_C6000_NONE.  */
13057     case EM_X86_64:  /* R_X86_64_NONE.  */
13058     case EM_XC16X:
13059     case EM_WEBASSEMBLY: /* R_WASM32_NONE.  */
13060       return reloc_type == 0;
13061
13062     case EM_AARCH64:
13063       return reloc_type == 0 || reloc_type == 256;
13064     case EM_AVR_OLD:
13065     case EM_AVR:
13066       return (reloc_type == 0 /* R_AVR_NONE.  */
13067               || reloc_type == 30 /* R_AVR_DIFF8.  */
13068               || reloc_type == 31 /* R_AVR_DIFF16.  */
13069               || reloc_type == 32 /* R_AVR_DIFF32.  */);
13070     case EM_METAG:
13071       return reloc_type == 3; /* R_METAG_NONE.  */
13072     case EM_NDS32:
13073       return (reloc_type == 0       /* R_XTENSA_NONE.  */
13074               || reloc_type == 204  /* R_NDS32_DIFF8.  */
13075               || reloc_type == 205  /* R_NDS32_DIFF16.  */
13076               || reloc_type == 206  /* R_NDS32_DIFF32.  */
13077               || reloc_type == 207  /* R_NDS32_ULEB128.  */);
13078     case EM_TI_PRU:
13079       return (reloc_type == 0       /* R_PRU_NONE.  */
13080               || reloc_type == 65   /* R_PRU_DIFF8.  */
13081               || reloc_type == 66   /* R_PRU_DIFF16.  */
13082               || reloc_type == 67   /* R_PRU_DIFF32.  */);
13083     case EM_XTENSA_OLD:
13084     case EM_XTENSA:
13085       return (reloc_type == 0      /* R_XTENSA_NONE.  */
13086               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
13087               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
13088               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
13089     }
13090   return FALSE;
13091 }
13092
13093 /* Returns TRUE if there is a relocation against
13094    section NAME at OFFSET bytes.  */
13095
13096 bfd_boolean
13097 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
13098 {
13099   Elf_Internal_Rela * relocs;
13100   Elf_Internal_Rela * rp;
13101
13102   if (dsec == NULL || dsec->reloc_info == NULL)
13103     return FALSE;
13104
13105   relocs = (Elf_Internal_Rela *) dsec->reloc_info;
13106
13107   for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
13108     if (rp->r_offset == offset)
13109       return TRUE;
13110
13111    return FALSE;
13112 }
13113
13114 /* Apply relocations to a section.
13115    Returns TRUE upon success, FALSE otherwise.
13116    If RELOCS_RETURN is non-NULL then it is set to point to the loaded relocs.
13117    It is then the caller's responsibility to free them.  NUM_RELOCS_RETURN
13118    will be set to the number of relocs loaded.
13119
13120    Note: So far support has been added only for those relocations
13121    which can be found in debug sections. FIXME: Add support for
13122    more relocations ?  */
13123
13124 static bfd_boolean
13125 apply_relocations (Filedata *                 filedata,
13126                    const Elf_Internal_Shdr *  section,
13127                    unsigned char *            start,
13128                    bfd_size_type              size,
13129                    void **                    relocs_return,
13130                    unsigned long *            num_relocs_return)
13131 {
13132   Elf_Internal_Shdr * relsec;
13133   unsigned char * end = start + size;
13134
13135   if (relocs_return != NULL)
13136     {
13137       * (Elf_Internal_Rela **) relocs_return = NULL;
13138       * num_relocs_return = 0;
13139     }
13140
13141   if (filedata->file_header.e_type != ET_REL)
13142     /* No relocs to apply.  */
13143     return TRUE;
13144
13145   /* Find the reloc section associated with the section.  */
13146   for (relsec = filedata->section_headers;
13147        relsec < filedata->section_headers + filedata->file_header.e_shnum;
13148        ++relsec)
13149     {
13150       bfd_boolean is_rela;
13151       unsigned long num_relocs;
13152       Elf_Internal_Rela * relocs;
13153       Elf_Internal_Rela * rp;
13154       Elf_Internal_Shdr * symsec;
13155       Elf_Internal_Sym * symtab;
13156       unsigned long num_syms;
13157       Elf_Internal_Sym * sym;
13158
13159       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13160           || relsec->sh_info >= filedata->file_header.e_shnum
13161           || filedata->section_headers + relsec->sh_info != section
13162           || relsec->sh_size == 0
13163           || relsec->sh_link >= filedata->file_header.e_shnum)
13164         continue;
13165
13166       is_rela = relsec->sh_type == SHT_RELA;
13167
13168       if (is_rela)
13169         {
13170           if (!slurp_rela_relocs (filedata, relsec->sh_offset,
13171                                   relsec->sh_size, & relocs, & num_relocs))
13172             return FALSE;
13173         }
13174       else
13175         {
13176           if (!slurp_rel_relocs (filedata, relsec->sh_offset,
13177                                  relsec->sh_size, & relocs, & num_relocs))
13178             return FALSE;
13179         }
13180
13181       /* SH uses RELA but uses in place value instead of the addend field.  */
13182       if (filedata->file_header.e_machine == EM_SH)
13183         is_rela = FALSE;
13184
13185       symsec = filedata->section_headers + relsec->sh_link;
13186       if (symsec->sh_type != SHT_SYMTAB
13187           && symsec->sh_type != SHT_DYNSYM)
13188         return FALSE;
13189       symtab = GET_ELF_SYMBOLS (filedata, symsec, & num_syms);
13190
13191       for (rp = relocs; rp < relocs + num_relocs; ++rp)
13192         {
13193           bfd_vma         addend;
13194           unsigned int    reloc_type;
13195           unsigned int    reloc_size;
13196           bfd_boolean     reloc_inplace = FALSE;
13197           bfd_boolean     reloc_subtract = FALSE;
13198           unsigned char * rloc;
13199           unsigned long   sym_index;
13200
13201           reloc_type = get_reloc_type (filedata, rp->r_info);
13202
13203           if (target_specific_reloc_handling (filedata, rp, start, end, symtab, num_syms))
13204             continue;
13205           else if (is_none_reloc (filedata, reloc_type))
13206             continue;
13207           else if (is_32bit_abs_reloc (filedata, reloc_type)
13208                    || is_32bit_pcrel_reloc (filedata, reloc_type))
13209             reloc_size = 4;
13210           else if (is_64bit_abs_reloc (filedata, reloc_type)
13211                    || is_64bit_pcrel_reloc (filedata, reloc_type))
13212             reloc_size = 8;
13213           else if (is_24bit_abs_reloc (filedata, reloc_type))
13214             reloc_size = 3;
13215           else if (is_16bit_abs_reloc (filedata, reloc_type))
13216             reloc_size = 2;
13217           else if (is_8bit_abs_reloc (filedata, reloc_type)
13218                    || is_6bit_abs_reloc (filedata, reloc_type))
13219             reloc_size = 1;
13220           else if ((reloc_subtract = is_32bit_inplace_sub_reloc (filedata,
13221                                                                  reloc_type))
13222                    || is_32bit_inplace_add_reloc (filedata, reloc_type))
13223             {
13224               reloc_size = 4;
13225               reloc_inplace = TRUE;
13226             }
13227           else if ((reloc_subtract = is_64bit_inplace_sub_reloc (filedata,
13228                                                                  reloc_type))
13229                    || is_64bit_inplace_add_reloc (filedata, reloc_type))
13230             {
13231               reloc_size = 8;
13232               reloc_inplace = TRUE;
13233             }
13234           else if ((reloc_subtract = is_16bit_inplace_sub_reloc (filedata,
13235                                                                  reloc_type))
13236                    || is_16bit_inplace_add_reloc (filedata, reloc_type))
13237             {
13238               reloc_size = 2;
13239               reloc_inplace = TRUE;
13240             }
13241           else if ((reloc_subtract = is_8bit_inplace_sub_reloc (filedata,
13242                                                                 reloc_type))
13243                    || is_8bit_inplace_add_reloc (filedata, reloc_type))
13244             {
13245               reloc_size = 1;
13246               reloc_inplace = TRUE;
13247             }
13248           else if ((reloc_subtract = is_6bit_inplace_sub_reloc (filedata,
13249                                                                 reloc_type)))
13250             {
13251               reloc_size = 1;
13252               reloc_inplace = TRUE;
13253             }
13254           else
13255             {
13256               static unsigned int prev_reloc = 0;
13257
13258               if (reloc_type != prev_reloc)
13259                 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
13260                       reloc_type, printable_section_name (filedata, section));
13261               prev_reloc = reloc_type;
13262               continue;
13263             }
13264
13265           rloc = start + rp->r_offset;
13266           if ((rloc + reloc_size) > end || (rloc < start))
13267             {
13268               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
13269                     (unsigned long) rp->r_offset,
13270                     printable_section_name (filedata, section));
13271               continue;
13272             }
13273
13274           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
13275           if (sym_index >= num_syms)
13276             {
13277               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
13278                     sym_index, printable_section_name (filedata, section));
13279               continue;
13280             }
13281           sym = symtab + sym_index;
13282
13283           /* If the reloc has a symbol associated with it,
13284              make sure that it is of an appropriate type.
13285
13286              Relocations against symbols without type can happen.
13287              Gcc -feliminate-dwarf2-dups may generate symbols
13288              without type for debug info.
13289
13290              Icc generates relocations against function symbols
13291              instead of local labels.
13292
13293              Relocations against object symbols can happen, eg when
13294              referencing a global array.  For an example of this see
13295              the _clz.o binary in libgcc.a.  */
13296           if (sym != symtab
13297               && ELF_ST_TYPE (sym->st_info) != STT_COMMON
13298               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
13299             {
13300               warn (_("skipping unexpected symbol type %s in section %s relocation %ld\n"),
13301                     get_symbol_type (filedata, ELF_ST_TYPE (sym->st_info)),
13302                     printable_section_name (filedata, relsec),
13303                     (long int)(rp - relocs));
13304               continue;
13305             }
13306
13307           addend = 0;
13308           if (is_rela)
13309             addend += rp->r_addend;
13310           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
13311              partial_inplace.  */
13312           if (!is_rela
13313               || (filedata->file_header.e_machine == EM_XTENSA
13314                   && reloc_type == 1)
13315               || ((filedata->file_header.e_machine == EM_PJ
13316                    || filedata->file_header.e_machine == EM_PJ_OLD)
13317                   && reloc_type == 1)
13318               || ((filedata->file_header.e_machine == EM_D30V
13319                    || filedata->file_header.e_machine == EM_CYGNUS_D30V)
13320                   && reloc_type == 12)
13321               || reloc_inplace)
13322             {
13323               if (is_6bit_inplace_sub_reloc (filedata, reloc_type))
13324                 addend += byte_get (rloc, reloc_size) & 0x3f;
13325               else
13326                 addend += byte_get (rloc, reloc_size);
13327             }
13328
13329           if (is_32bit_pcrel_reloc (filedata, reloc_type)
13330               || is_64bit_pcrel_reloc (filedata, reloc_type))
13331             {
13332               /* On HPPA, all pc-relative relocations are biased by 8.  */
13333               if (filedata->file_header.e_machine == EM_PARISC)
13334                 addend -= 8;
13335               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
13336                         reloc_size);
13337             }
13338           else if (is_6bit_abs_reloc (filedata, reloc_type)
13339                    || is_6bit_inplace_sub_reloc (filedata, reloc_type))
13340             {
13341               if (reloc_subtract)
13342                 addend -= sym->st_value;
13343               else
13344                 addend += sym->st_value;
13345               addend = (addend & 0x3f) | (byte_get (rloc, reloc_size) & 0xc0);
13346               byte_put (rloc, addend, reloc_size);
13347             }
13348           else if (reloc_subtract)
13349             byte_put (rloc, addend - sym->st_value, reloc_size);
13350           else
13351             byte_put (rloc, addend + sym->st_value, reloc_size);
13352         }
13353
13354       free (symtab);
13355       /* Let the target specific reloc processing code know that
13356          we have finished with these relocs.  */
13357       target_specific_reloc_handling (filedata, NULL, NULL, NULL, NULL, 0);
13358
13359       if (relocs_return)
13360         {
13361           * (Elf_Internal_Rela **) relocs_return = relocs;
13362           * num_relocs_return = num_relocs;
13363         }
13364       else
13365         free (relocs);
13366
13367       break;
13368     }
13369
13370   return TRUE;
13371 }
13372
13373 #ifdef SUPPORT_DISASSEMBLY
13374 static bfd_boolean
13375 disassemble_section (Elf_Internal_Shdr * section, Filedata * filedata)
13376 {
13377   printf (_("\nAssembly dump of section %s\n"), printable_section_name (filedata, section));
13378
13379   /* FIXME: XXX -- to be done --- XXX */
13380
13381   return TRUE;
13382 }
13383 #endif
13384
13385 /* Reads in the contents of SECTION from FILE, returning a pointer
13386    to a malloc'ed buffer or NULL if something went wrong.  */
13387
13388 static char *
13389 get_section_contents (Elf_Internal_Shdr * section, Filedata * filedata)
13390 {
13391   bfd_size_type num_bytes = section->sh_size;
13392
13393   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
13394     {
13395       printf (_("Section '%s' has no data to dump.\n"),
13396               printable_section_name (filedata, section));
13397       return NULL;
13398     }
13399
13400   return  (char *) get_data (NULL, filedata, section->sh_offset, 1, num_bytes,
13401                              _("section contents"));
13402 }
13403
13404 /* Uncompresses a section that was compressed using zlib, in place.  */
13405
13406 static bfd_boolean
13407 uncompress_section_contents (unsigned char **   buffer,
13408                              dwarf_size_type    uncompressed_size,
13409                              dwarf_size_type *  size)
13410 {
13411   dwarf_size_type compressed_size = *size;
13412   unsigned char * compressed_buffer = *buffer;
13413   unsigned char * uncompressed_buffer;
13414   z_stream strm;
13415   int rc;
13416
13417   /* It is possible the section consists of several compressed
13418      buffers concatenated together, so we uncompress in a loop.  */
13419   /* PR 18313: The state field in the z_stream structure is supposed
13420      to be invisible to the user (ie us), but some compilers will
13421      still complain about it being used without initialisation.  So
13422      we first zero the entire z_stream structure and then set the fields
13423      that we need.  */
13424   memset (& strm, 0, sizeof strm);
13425   strm.avail_in = compressed_size;
13426   strm.next_in = (Bytef *) compressed_buffer;
13427   strm.avail_out = uncompressed_size;
13428   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
13429
13430   rc = inflateInit (& strm);
13431   while (strm.avail_in > 0)
13432     {
13433       if (rc != Z_OK)
13434         goto fail;
13435       strm.next_out = ((Bytef *) uncompressed_buffer
13436                        + (uncompressed_size - strm.avail_out));
13437       rc = inflate (&strm, Z_FINISH);
13438       if (rc != Z_STREAM_END)
13439         goto fail;
13440       rc = inflateReset (& strm);
13441     }
13442   rc = inflateEnd (& strm);
13443   if (rc != Z_OK
13444       || strm.avail_out != 0)
13445     goto fail;
13446
13447   *buffer = uncompressed_buffer;
13448   *size = uncompressed_size;
13449   return TRUE;
13450
13451  fail:
13452   free (uncompressed_buffer);
13453   /* Indicate decompression failure.  */
13454   *buffer = NULL;
13455   return FALSE;
13456 }
13457
13458 static bfd_boolean
13459 dump_section_as_strings (Elf_Internal_Shdr * section, Filedata * filedata)
13460 {
13461   Elf_Internal_Shdr *  relsec;
13462   bfd_size_type        num_bytes;
13463   unsigned char *      data;
13464   unsigned char *      end;
13465   unsigned char *      real_start;
13466   unsigned char *      start;
13467   bfd_boolean          some_strings_shown;
13468
13469   real_start = start = (unsigned char *) get_section_contents (section, filedata);
13470   if (start == NULL)
13471     /* PR 21820: Do not fail if the section was empty.  */
13472     return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13473
13474   num_bytes = section->sh_size;
13475
13476   printf (_("\nString dump of section '%s':\n"), printable_section_name (filedata, section));
13477
13478   if (decompress_dumps)
13479     {
13480       dwarf_size_type new_size = num_bytes;
13481       dwarf_size_type uncompressed_size = 0;
13482
13483       if ((section->sh_flags & SHF_COMPRESSED) != 0)
13484         {
13485           Elf_Internal_Chdr chdr;
13486           unsigned int compression_header_size
13487             = get_compression_header (& chdr, (unsigned char *) start,
13488                                       num_bytes);
13489
13490           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13491             {
13492               warn (_("section '%s' has unsupported compress type: %d\n"),
13493                     printable_section_name (filedata, section), chdr.ch_type);
13494               return FALSE;
13495             }
13496           uncompressed_size = chdr.ch_size;
13497           start += compression_header_size;
13498           new_size -= compression_header_size;
13499         }
13500       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13501         {
13502           /* Read the zlib header.  In this case, it should be "ZLIB"
13503              followed by the uncompressed section size, 8 bytes in
13504              big-endian order.  */
13505           uncompressed_size = start[4]; uncompressed_size <<= 8;
13506           uncompressed_size += start[5]; uncompressed_size <<= 8;
13507           uncompressed_size += start[6]; uncompressed_size <<= 8;
13508           uncompressed_size += start[7]; uncompressed_size <<= 8;
13509           uncompressed_size += start[8]; uncompressed_size <<= 8;
13510           uncompressed_size += start[9]; uncompressed_size <<= 8;
13511           uncompressed_size += start[10]; uncompressed_size <<= 8;
13512           uncompressed_size += start[11];
13513           start += 12;
13514           new_size -= 12;
13515         }
13516
13517       if (uncompressed_size)
13518         {
13519           if (uncompress_section_contents (& start,
13520                                            uncompressed_size, & new_size))
13521             num_bytes = new_size;
13522           else
13523             {
13524               error (_("Unable to decompress section %s\n"),
13525                      printable_section_name (filedata, section));
13526               return FALSE;
13527             }
13528         }
13529       else
13530         start = real_start;
13531     }
13532
13533   /* If the section being dumped has relocations against it the user might
13534      be expecting these relocations to have been applied.  Check for this
13535      case and issue a warning message in order to avoid confusion.
13536      FIXME: Maybe we ought to have an option that dumps a section with
13537      relocs applied ?  */
13538   for (relsec = filedata->section_headers;
13539        relsec < filedata->section_headers + filedata->file_header.e_shnum;
13540        ++relsec)
13541     {
13542       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13543           || relsec->sh_info >= filedata->file_header.e_shnum
13544           || filedata->section_headers + relsec->sh_info != section
13545           || relsec->sh_size == 0
13546           || relsec->sh_link >= filedata->file_header.e_shnum)
13547         continue;
13548
13549       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13550       break;
13551     }
13552
13553   data = start;
13554   end  = start + num_bytes;
13555   some_strings_shown = FALSE;
13556
13557   while (data < end)
13558     {
13559       while (!ISPRINT (* data))
13560         if (++ data >= end)
13561           break;
13562
13563       if (data < end)
13564         {
13565           size_t maxlen = end - data;
13566
13567 #ifndef __MSVCRT__
13568           /* PR 11128: Use two separate invocations in order to work
13569              around bugs in the Solaris 8 implementation of printf.  */
13570           printf ("  [%6tx]  ", data - start);
13571 #else
13572           printf ("  [%6Ix]  ", (size_t) (data - start));
13573 #endif
13574           if (maxlen > 0)
13575             {
13576               print_symbol ((int) maxlen, (const char *) data);
13577               putchar ('\n');
13578               data += strnlen ((const char *) data, maxlen);
13579             }
13580           else
13581             {
13582               printf (_("<corrupt>\n"));
13583               data = end;
13584             }
13585           some_strings_shown = TRUE;
13586         }
13587     }
13588
13589   if (! some_strings_shown)
13590     printf (_("  No strings found in this section."));
13591
13592   free (real_start);
13593
13594   putchar ('\n');
13595   return TRUE;
13596 }
13597
13598 static bfd_boolean
13599 dump_section_as_bytes (Elf_Internal_Shdr *  section,
13600                        Filedata *           filedata,
13601                        bfd_boolean          relocate)
13602 {
13603   Elf_Internal_Shdr * relsec;
13604   bfd_size_type       bytes;
13605   bfd_size_type       section_size;
13606   bfd_vma             addr;
13607   unsigned char *     data;
13608   unsigned char *     real_start;
13609   unsigned char *     start;
13610
13611   real_start = start = (unsigned char *) get_section_contents (section, filedata);
13612   if (start == NULL)
13613     /* PR 21820: Do not fail if the section was empty.  */
13614     return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13615
13616   section_size = section->sh_size;
13617
13618   printf (_("\nHex dump of section '%s':\n"), printable_section_name (filedata, section));
13619
13620   if (decompress_dumps)
13621     {
13622       dwarf_size_type new_size = section_size;
13623       dwarf_size_type uncompressed_size = 0;
13624
13625       if ((section->sh_flags & SHF_COMPRESSED) != 0)
13626         {
13627           Elf_Internal_Chdr chdr;
13628           unsigned int compression_header_size
13629             = get_compression_header (& chdr, start, section_size);
13630
13631           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13632             {
13633               warn (_("section '%s' has unsupported compress type: %d\n"),
13634                     printable_section_name (filedata, section), chdr.ch_type);
13635               return FALSE;
13636             }
13637           uncompressed_size = chdr.ch_size;
13638           start += compression_header_size;
13639           new_size -= compression_header_size;
13640         }
13641       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13642         {
13643           /* Read the zlib header.  In this case, it should be "ZLIB"
13644              followed by the uncompressed section size, 8 bytes in
13645              big-endian order.  */
13646           uncompressed_size = start[4]; uncompressed_size <<= 8;
13647           uncompressed_size += start[5]; uncompressed_size <<= 8;
13648           uncompressed_size += start[6]; uncompressed_size <<= 8;
13649           uncompressed_size += start[7]; uncompressed_size <<= 8;
13650           uncompressed_size += start[8]; uncompressed_size <<= 8;
13651           uncompressed_size += start[9]; uncompressed_size <<= 8;
13652           uncompressed_size += start[10]; uncompressed_size <<= 8;
13653           uncompressed_size += start[11];
13654           start += 12;
13655           new_size -= 12;
13656         }
13657
13658       if (uncompressed_size)
13659         {
13660           if (uncompress_section_contents (& start, uncompressed_size,
13661                                            & new_size))
13662             {
13663               section_size = new_size;
13664             }
13665           else
13666             {
13667               error (_("Unable to decompress section %s\n"),
13668                      printable_section_name (filedata, section));
13669               /* FIXME: Print the section anyway ?  */
13670               return FALSE;
13671             }
13672         }
13673       else
13674         start = real_start;
13675     }
13676
13677   if (relocate)
13678     {
13679       if (! apply_relocations (filedata, section, start, section_size, NULL, NULL))
13680         return FALSE;
13681     }
13682   else
13683     {
13684       /* If the section being dumped has relocations against it the user might
13685          be expecting these relocations to have been applied.  Check for this
13686          case and issue a warning message in order to avoid confusion.
13687          FIXME: Maybe we ought to have an option that dumps a section with
13688          relocs applied ?  */
13689       for (relsec = filedata->section_headers;
13690            relsec < filedata->section_headers + filedata->file_header.e_shnum;
13691            ++relsec)
13692         {
13693           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13694               || relsec->sh_info >= filedata->file_header.e_shnum
13695               || filedata->section_headers + relsec->sh_info != section
13696               || relsec->sh_size == 0
13697               || relsec->sh_link >= filedata->file_header.e_shnum)
13698             continue;
13699
13700           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13701           break;
13702         }
13703     }
13704
13705   addr = section->sh_addr;
13706   bytes = section_size;
13707   data = start;
13708
13709   while (bytes)
13710     {
13711       int j;
13712       int k;
13713       int lbytes;
13714
13715       lbytes = (bytes > 16 ? 16 : bytes);
13716
13717       printf ("  0x%8.8lx ", (unsigned long) addr);
13718
13719       for (j = 0; j < 16; j++)
13720         {
13721           if (j < lbytes)
13722             printf ("%2.2x", data[j]);
13723           else
13724             printf ("  ");
13725
13726           if ((j & 3) == 3)
13727             printf (" ");
13728         }
13729
13730       for (j = 0; j < lbytes; j++)
13731         {
13732           k = data[j];
13733           if (k >= ' ' && k < 0x7f)
13734             printf ("%c", k);
13735           else
13736             printf (".");
13737         }
13738
13739       putchar ('\n');
13740
13741       data  += lbytes;
13742       addr  += lbytes;
13743       bytes -= lbytes;
13744     }
13745
13746   free (real_start);
13747
13748   putchar ('\n');
13749   return TRUE;
13750 }
13751
13752 static bfd_boolean
13753 load_specific_debug_section (enum dwarf_section_display_enum  debug,
13754                              const Elf_Internal_Shdr *        sec,
13755                              void *                           data)
13756 {
13757   struct dwarf_section * section = &debug_displays [debug].section;
13758   char buf [64];
13759   Filedata * filedata = (Filedata *) data;
13760   
13761   if (section->start != NULL)
13762     {
13763       /* If it is already loaded, do nothing.  */
13764       if (streq (section->filename, filedata->file_name))
13765         return TRUE;
13766       free (section->start);
13767     }
13768
13769   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
13770   section->address = sec->sh_addr;
13771   section->user_data = NULL;
13772   section->filename = filedata->file_name;
13773   section->start = (unsigned char *) get_data (NULL, filedata,
13774                                                sec->sh_offset, 1,
13775                                                sec->sh_size, buf);
13776   if (section->start == NULL)
13777     section->size = 0;
13778   else
13779     {
13780       unsigned char *start = section->start;
13781       dwarf_size_type size = sec->sh_size;
13782       dwarf_size_type uncompressed_size = 0;
13783
13784       if ((sec->sh_flags & SHF_COMPRESSED) != 0)
13785         {
13786           Elf_Internal_Chdr chdr;
13787           unsigned int compression_header_size;
13788
13789           if (size < (is_32bit_elf
13790                       ? sizeof (Elf32_External_Chdr)
13791                       : sizeof (Elf64_External_Chdr)))
13792             {
13793               warn (_("compressed section %s is too small to contain a compression header"),
13794                     section->name);
13795               return FALSE;
13796             }
13797
13798           compression_header_size = get_compression_header (&chdr, start, size);
13799
13800           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13801             {
13802               warn (_("section '%s' has unsupported compress type: %d\n"),
13803                     section->name, chdr.ch_type);
13804               return FALSE;
13805             }
13806           uncompressed_size = chdr.ch_size;
13807           start += compression_header_size;
13808           size -= compression_header_size;
13809         }
13810       else if (size > 12 && streq ((char *) start, "ZLIB"))
13811         {
13812           /* Read the zlib header.  In this case, it should be "ZLIB"
13813              followed by the uncompressed section size, 8 bytes in
13814              big-endian order.  */
13815           uncompressed_size = start[4]; uncompressed_size <<= 8;
13816           uncompressed_size += start[5]; uncompressed_size <<= 8;
13817           uncompressed_size += start[6]; uncompressed_size <<= 8;
13818           uncompressed_size += start[7]; uncompressed_size <<= 8;
13819           uncompressed_size += start[8]; uncompressed_size <<= 8;
13820           uncompressed_size += start[9]; uncompressed_size <<= 8;
13821           uncompressed_size += start[10]; uncompressed_size <<= 8;
13822           uncompressed_size += start[11];
13823           start += 12;
13824           size -= 12;
13825         }
13826
13827       if (uncompressed_size)
13828         {
13829           if (uncompress_section_contents (&start, uncompressed_size,
13830                                            &size))
13831             {
13832               /* Free the compressed buffer, update the section buffer
13833                  and the section size if uncompress is successful.  */
13834               free (section->start);
13835               section->start = start;
13836             }
13837           else
13838             {
13839               error (_("Unable to decompress section %s\n"),
13840                      printable_section_name (filedata, sec));
13841               return FALSE;
13842             }
13843         }
13844
13845       section->size = size;
13846     }
13847
13848   if (section->start == NULL)
13849     return FALSE;
13850
13851   if (debug_displays [debug].relocate)
13852     {
13853       if (! apply_relocations (filedata, sec, section->start, section->size,
13854                                & section->reloc_info, & section->num_relocs))
13855         return FALSE;
13856     }
13857   else
13858     {
13859       section->reloc_info = NULL;
13860       section->num_relocs = 0;
13861     }
13862
13863   return TRUE;
13864 }
13865
13866 /* If this is not NULL, load_debug_section will only look for sections
13867    within the list of sections given here.  */
13868 static unsigned int * section_subset = NULL;
13869
13870 bfd_boolean
13871 load_debug_section (enum dwarf_section_display_enum debug, void * data)
13872 {
13873   struct dwarf_section * section = &debug_displays [debug].section;
13874   Elf_Internal_Shdr * sec;
13875   Filedata * filedata = (Filedata *) data;
13876
13877   /* Without section headers we cannot find any sections.  */
13878   if (filedata->section_headers == NULL)
13879     return FALSE;
13880
13881   if (filedata->string_table == NULL
13882       && filedata->file_header.e_shstrndx != SHN_UNDEF
13883       && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
13884     {
13885       Elf_Internal_Shdr * strs;
13886
13887       /* Read in the string table, so that we have section names to scan.  */
13888       strs = filedata->section_headers + filedata->file_header.e_shstrndx;
13889
13890       if (strs != NULL && strs->sh_size != 0)
13891         {
13892           filedata->string_table
13893             = (char *) get_data (NULL, filedata, strs->sh_offset,
13894                                  1, strs->sh_size, _("string table"));
13895
13896           filedata->string_table_length
13897             = filedata->string_table != NULL ? strs->sh_size : 0;
13898         }
13899     }
13900
13901   /* Locate the debug section.  */
13902   sec = find_section_in_set (filedata, section->uncompressed_name, section_subset);
13903   if (sec != NULL)
13904     section->name = section->uncompressed_name;
13905   else
13906     {
13907       sec = find_section_in_set (filedata, section->compressed_name, section_subset);
13908       if (sec != NULL)
13909         section->name = section->compressed_name;
13910     }
13911   if (sec == NULL)
13912     return FALSE;
13913
13914   /* If we're loading from a subset of sections, and we've loaded
13915      a section matching this name before, it's likely that it's a
13916      different one.  */
13917   if (section_subset != NULL)
13918     free_debug_section (debug);
13919
13920   return load_specific_debug_section (debug, sec, data);
13921 }
13922
13923 void
13924 free_debug_section (enum dwarf_section_display_enum debug)
13925 {
13926   struct dwarf_section * section = &debug_displays [debug].section;
13927
13928   if (section->start == NULL)
13929     return;
13930
13931   free ((char *) section->start);
13932   section->start = NULL;
13933   section->address = 0;
13934   section->size = 0;
13935 }
13936
13937 static bfd_boolean
13938 display_debug_section (int shndx, Elf_Internal_Shdr * section, Filedata * filedata)
13939 {
13940   char * name = SECTION_NAME (section);
13941   const char * print_name = printable_section_name (filedata, section);
13942   bfd_size_type length;
13943   bfd_boolean result = TRUE;
13944   int i;
13945
13946   length = section->sh_size;
13947   if (length == 0)
13948     {
13949       printf (_("\nSection '%s' has no debugging data.\n"), print_name);
13950       return TRUE;
13951     }
13952   if (section->sh_type == SHT_NOBITS)
13953     {
13954       /* There is no point in dumping the contents of a debugging section
13955          which has the NOBITS type - the bits in the file will be random.
13956          This can happen when a file containing a .eh_frame section is
13957          stripped with the --only-keep-debug command line option.  */
13958       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
13959               print_name);
13960       return FALSE;
13961     }
13962
13963   if (const_strneq (name, ".gnu.linkonce.wi."))
13964     name = ".debug_info";
13965
13966   /* See if we know how to display the contents of this section.  */
13967   for (i = 0; i < max; i++)
13968     {
13969       enum dwarf_section_display_enum  id = (enum dwarf_section_display_enum) i;
13970       struct dwarf_section_display *   display = debug_displays + i;
13971       struct dwarf_section *           sec = & display->section;
13972
13973       if (streq (sec->uncompressed_name, name)
13974           || (id == line && const_strneq (name, ".debug_line."))
13975           || streq (sec->compressed_name, name))
13976         {
13977           bfd_boolean secondary = (section != find_section (filedata, name));
13978
13979           if (secondary)
13980             free_debug_section (id);
13981
13982           if (i == line && const_strneq (name, ".debug_line."))
13983             sec->name = name;
13984           else if (streq (sec->uncompressed_name, name))
13985             sec->name = sec->uncompressed_name;
13986           else
13987             sec->name = sec->compressed_name;
13988
13989           if (load_specific_debug_section (id, section, filedata))
13990             {
13991               /* If this debug section is part of a CU/TU set in a .dwp file,
13992                  restrict load_debug_section to the sections in that set.  */
13993               section_subset = find_cu_tu_set (filedata, shndx);
13994
13995               result &= display->display (sec, filedata);
13996
13997               section_subset = NULL;
13998
13999               if (secondary || (id != info && id != abbrev))
14000                 free_debug_section (id);
14001             }
14002           break;
14003         }
14004     }
14005
14006   if (i == max)
14007     {
14008       printf (_("Unrecognized debug section: %s\n"), print_name);
14009       result = FALSE;
14010     }
14011
14012   return result;
14013 }
14014
14015 /* Set DUMP_SECTS for all sections where dumps were requested
14016    based on section name.  */
14017
14018 static void
14019 initialise_dumps_byname (Filedata * filedata)
14020 {
14021   struct dump_list_entry * cur;
14022
14023   for (cur = dump_sects_byname; cur; cur = cur->next)
14024     {
14025       unsigned int i;
14026       bfd_boolean any = FALSE;
14027
14028       for (i = 0; i < filedata->file_header.e_shnum; i++)
14029         if (streq (SECTION_NAME (filedata->section_headers + i), cur->name))
14030           {
14031             request_dump_bynumber (filedata, i, cur->type);
14032             any = TRUE;
14033           }
14034
14035       if (!any)
14036         warn (_("Section '%s' was not dumped because it does not exist!\n"),
14037               cur->name);
14038     }
14039 }
14040
14041 static bfd_boolean
14042 process_section_contents (Filedata * filedata)
14043 {
14044   Elf_Internal_Shdr * section;
14045   unsigned int i;
14046   bfd_boolean res = TRUE;
14047
14048   if (! do_dump)
14049     return TRUE;
14050
14051   initialise_dumps_byname (filedata);
14052
14053   for (i = 0, section = filedata->section_headers;
14054        i < filedata->file_header.e_shnum && i < filedata->num_dump_sects;
14055        i++, section++)
14056     {
14057       dump_type dump = filedata->dump_sects[i];
14058
14059 #ifdef SUPPORT_DISASSEMBLY
14060       if (dump & DISASS_DUMP)
14061         {
14062           if (! disassemble_section (section, filedata))
14063             res = FALSE;
14064         }
14065 #endif
14066       if (dump & HEX_DUMP)
14067         {
14068           if (! dump_section_as_bytes (section, filedata, FALSE))
14069             res = FALSE;
14070         }
14071
14072       if (dump & RELOC_DUMP)
14073         {
14074           if (! dump_section_as_bytes (section, filedata, TRUE))
14075             res = FALSE;
14076         }
14077
14078       if (dump & STRING_DUMP)
14079         {
14080           if (! dump_section_as_strings (section, filedata))
14081             res = FALSE;
14082         }
14083
14084       if (dump & DEBUG_DUMP)
14085         {
14086           if (! display_debug_section (i, section, filedata))
14087             res = FALSE;
14088         }
14089     }
14090
14091   /* Check to see if the user requested a
14092      dump of a section that does not exist.  */
14093   while (i < filedata->num_dump_sects)
14094     {
14095       if (filedata->dump_sects[i])
14096         {
14097           warn (_("Section %d was not dumped because it does not exist!\n"), i);
14098           res = FALSE;
14099         }
14100       i++;
14101     }
14102
14103   return res;
14104 }
14105
14106 static void
14107 process_mips_fpe_exception (int mask)
14108 {
14109   if (mask)
14110     {
14111       bfd_boolean first = TRUE;
14112
14113       if (mask & OEX_FPU_INEX)
14114         fputs ("INEX", stdout), first = FALSE;
14115       if (mask & OEX_FPU_UFLO)
14116         printf ("%sUFLO", first ? "" : "|"), first = FALSE;
14117       if (mask & OEX_FPU_OFLO)
14118         printf ("%sOFLO", first ? "" : "|"), first = FALSE;
14119       if (mask & OEX_FPU_DIV0)
14120         printf ("%sDIV0", first ? "" : "|"), first = FALSE;
14121       if (mask & OEX_FPU_INVAL)
14122         printf ("%sINVAL", first ? "" : "|");
14123     }
14124   else
14125     fputs ("0", stdout);
14126 }
14127
14128 /* Display's the value of TAG at location P.  If TAG is
14129    greater than 0 it is assumed to be an unknown tag, and
14130    a message is printed to this effect.  Otherwise it is
14131    assumed that a message has already been printed.
14132
14133    If the bottom bit of TAG is set it assumed to have a
14134    string value, otherwise it is assumed to have an integer
14135    value.
14136
14137    Returns an updated P pointing to the first unread byte
14138    beyond the end of TAG's value.
14139
14140    Reads at or beyond END will not be made.  */
14141
14142 static unsigned char *
14143 display_tag_value (signed int tag,
14144                    unsigned char * p,
14145                    const unsigned char * const end)
14146 {
14147   unsigned long val;
14148
14149   if (tag > 0)
14150     printf ("  Tag_unknown_%d: ", tag);
14151
14152   if (p >= end)
14153     {
14154       warn (_("<corrupt tag>\n"));
14155     }
14156   else if (tag & 1)
14157     {
14158       /* PR 17531 file: 027-19978-0.004.  */
14159       size_t maxlen = (end - p) - 1;
14160
14161       putchar ('"');
14162       if (maxlen > 0)
14163         {
14164           print_symbol ((int) maxlen, (const char *) p);
14165           p += strnlen ((char *) p, maxlen) + 1;
14166         }
14167       else
14168         {
14169           printf (_("<corrupt string tag>"));
14170           p = (unsigned char *) end;
14171         }
14172       printf ("\"\n");
14173     }
14174   else
14175     {
14176       unsigned int len;
14177
14178       val = read_uleb128 (p, &len, end);
14179       p += len;
14180       printf ("%ld (0x%lx)\n", val, val);
14181     }
14182
14183   assert (p <= end);
14184   return p;
14185 }
14186
14187 /* ARC ABI attributes section.  */
14188
14189 static unsigned char *
14190 display_arc_attribute (unsigned char * p,
14191                        const unsigned char * const end)
14192 {
14193   unsigned int tag;
14194   unsigned int len;
14195   unsigned int val;
14196
14197   tag = read_uleb128 (p, &len, end);
14198   p += len;
14199
14200   switch (tag)
14201     {
14202     case Tag_ARC_PCS_config:
14203       val = read_uleb128 (p, &len, end);
14204       p += len;
14205       printf ("  Tag_ARC_PCS_config: ");
14206       switch (val)
14207         {
14208         case 0:
14209           printf (_("Absent/Non standard\n"));
14210           break;
14211         case 1:
14212           printf (_("Bare metal/mwdt\n"));
14213           break;
14214         case 2:
14215           printf (_("Bare metal/newlib\n"));
14216           break;
14217         case 3:
14218           printf (_("Linux/uclibc\n"));
14219           break;
14220         case 4:
14221           printf (_("Linux/glibc\n"));
14222           break;
14223         default:
14224           printf (_("Unknown\n"));
14225           break;
14226         }
14227       break;
14228
14229     case Tag_ARC_CPU_base:
14230       val = read_uleb128 (p, &len, end);
14231       p += len;
14232       printf ("  Tag_ARC_CPU_base: ");
14233       switch (val)
14234         {
14235         default:
14236         case TAG_CPU_NONE:
14237           printf (_("Absent\n"));
14238           break;
14239         case TAG_CPU_ARC6xx:
14240           printf ("ARC6xx\n");
14241           break;
14242         case TAG_CPU_ARC7xx:
14243           printf ("ARC7xx\n");
14244           break;
14245         case TAG_CPU_ARCEM:
14246           printf ("ARCEM\n");
14247           break;
14248         case TAG_CPU_ARCHS:
14249           printf ("ARCHS\n");
14250           break;
14251         }
14252       break;
14253
14254     case Tag_ARC_CPU_variation:
14255       val = read_uleb128 (p, &len, end);
14256       p += len;
14257       printf ("  Tag_ARC_CPU_variation: ");
14258       switch (val)
14259         {
14260         default:
14261           if (val > 0 && val < 16)
14262               printf ("Core%d\n", val);
14263           else
14264               printf ("Unknown\n");
14265           break;
14266
14267         case 0:
14268           printf (_("Absent\n"));
14269           break;
14270         }
14271       break;
14272
14273     case Tag_ARC_CPU_name:
14274       printf ("  Tag_ARC_CPU_name: ");
14275       p = display_tag_value (-1, p, end);
14276       break;
14277
14278     case Tag_ARC_ABI_rf16:
14279       val = read_uleb128 (p, &len, end);
14280       p += len;
14281       printf ("  Tag_ARC_ABI_rf16: %s\n", val ? _("yes") : _("no"));
14282       break;
14283
14284     case Tag_ARC_ABI_osver:
14285       val = read_uleb128 (p, &len, end);
14286       p += len;
14287       printf ("  Tag_ARC_ABI_osver: v%d\n", val);
14288       break;
14289
14290     case Tag_ARC_ABI_pic:
14291     case Tag_ARC_ABI_sda:
14292       val = read_uleb128 (p, &len, end);
14293       p += len;
14294       printf (tag == Tag_ARC_ABI_sda ? "  Tag_ARC_ABI_sda: "
14295               : "  Tag_ARC_ABI_pic: ");
14296       switch (val)
14297         {
14298         case 0:
14299           printf (_("Absent\n"));
14300           break;
14301         case 1:
14302           printf ("MWDT\n");
14303           break;
14304         case 2:
14305           printf ("GNU\n");
14306           break;
14307         default:
14308           printf (_("Unknown\n"));
14309           break;
14310         }
14311       break;
14312
14313     case Tag_ARC_ABI_tls:
14314       val = read_uleb128 (p, &len, end);
14315       p += len;
14316       printf ("  Tag_ARC_ABI_tls: %s\n", val ? "r25": "none");
14317       break;
14318
14319     case Tag_ARC_ABI_enumsize:
14320       val = read_uleb128 (p, &len, end);
14321       p += len;
14322       printf ("  Tag_ARC_ABI_enumsize: %s\n", val ? _("default") :
14323               _("smallest"));
14324       break;
14325
14326     case Tag_ARC_ABI_exceptions:
14327       val = read_uleb128 (p, &len, end);
14328       p += len;
14329       printf ("  Tag_ARC_ABI_exceptions: %s\n", val ? _("OPTFP")
14330               : _("default"));
14331       break;
14332
14333     case Tag_ARC_ABI_double_size:
14334       val = read_uleb128 (p, &len, end);
14335       p += len;
14336       printf ("  Tag_ARC_ABI_double_size: %d\n", val);
14337       break;
14338
14339     case Tag_ARC_ISA_config:
14340       printf ("  Tag_ARC_ISA_config: ");
14341       p = display_tag_value (-1, p, end);
14342       break;
14343
14344     case Tag_ARC_ISA_apex:
14345       printf ("  Tag_ARC_ISA_apex: ");
14346       p = display_tag_value (-1, p, end);
14347       break;
14348
14349     case Tag_ARC_ISA_mpy_option:
14350       val = read_uleb128 (p, &len, end);
14351       p += len;
14352       printf ("  Tag_ARC_ISA_mpy_option: %d\n", val);
14353       break;
14354
14355     case Tag_ARC_ATR_version:
14356       val = read_uleb128 (p, &len, end);
14357       p += len;
14358       printf ("  Tag_ARC_ATR_version: %d\n", val);
14359       break;
14360
14361     default:
14362       return display_tag_value (tag & 1, p, end);
14363     }
14364
14365   return p;
14366 }
14367
14368 /* ARM EABI attributes section.  */
14369 typedef struct
14370 {
14371   unsigned int tag;
14372   const char * name;
14373   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
14374   unsigned int type;
14375   const char ** table;
14376 } arm_attr_public_tag;
14377
14378 static const char * arm_attr_tag_CPU_arch[] =
14379   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
14380    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "v8-R", "v8-M.baseline",
14381    "v8-M.mainline", "", "", "", "v8.1-M.mainline"};
14382 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
14383 static const char * arm_attr_tag_THUMB_ISA_use[] =
14384   {"No", "Thumb-1", "Thumb-2", "Yes"};
14385 static const char * arm_attr_tag_FP_arch[] =
14386   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
14387    "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
14388 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
14389 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
14390   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
14391    "NEON for ARMv8.1"};
14392 static const char * arm_attr_tag_PCS_config[] =
14393   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
14394    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
14395 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
14396   {"V6", "SB", "TLS", "Unused"};
14397 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
14398   {"Absolute", "PC-relative", "SB-relative", "None"};
14399 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
14400   {"Absolute", "PC-relative", "None"};
14401 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
14402   {"None", "direct", "GOT-indirect"};
14403 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
14404   {"None", "??? 1", "2", "??? 3", "4"};
14405 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
14406 static const char * arm_attr_tag_ABI_FP_denormal[] =
14407   {"Unused", "Needed", "Sign only"};
14408 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
14409 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
14410 static const char * arm_attr_tag_ABI_FP_number_model[] =
14411   {"Unused", "Finite", "RTABI", "IEEE 754"};
14412 static const char * arm_attr_tag_ABI_enum_size[] =
14413   {"Unused", "small", "int", "forced to int"};
14414 static const char * arm_attr_tag_ABI_HardFP_use[] =
14415   {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
14416 static const char * arm_attr_tag_ABI_VFP_args[] =
14417   {"AAPCS", "VFP registers", "custom", "compatible"};
14418 static const char * arm_attr_tag_ABI_WMMX_args[] =
14419   {"AAPCS", "WMMX registers", "custom"};
14420 static const char * arm_attr_tag_ABI_optimization_goals[] =
14421   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14422     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
14423 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
14424   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14425     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
14426 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
14427 static const char * arm_attr_tag_FP_HP_extension[] =
14428   {"Not Allowed", "Allowed"};
14429 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
14430   {"None", "IEEE 754", "Alternative Format"};
14431 static const char * arm_attr_tag_DSP_extension[] =
14432   {"Follow architecture", "Allowed"};
14433 static const char * arm_attr_tag_MPextension_use[] =
14434   {"Not Allowed", "Allowed"};
14435 static const char * arm_attr_tag_DIV_use[] =
14436   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
14437     "Allowed in v7-A with integer division extension"};
14438 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
14439 static const char * arm_attr_tag_Virtualization_use[] =
14440   {"Not Allowed", "TrustZone", "Virtualization Extensions",
14441     "TrustZone and Virtualization Extensions"};
14442 static const char * arm_attr_tag_MPextension_use_legacy[] =
14443   {"Not Allowed", "Allowed"};
14444
14445 static const char * arm_attr_tag_MVE_arch[] =
14446   {"No MVE", "MVE Integer only", "MVE Integer and FP"};
14447
14448 #define LOOKUP(id, name) \
14449   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
14450 static arm_attr_public_tag arm_attr_public_tags[] =
14451 {
14452   {4, "CPU_raw_name", 1, NULL},
14453   {5, "CPU_name", 1, NULL},
14454   LOOKUP(6, CPU_arch),
14455   {7, "CPU_arch_profile", 0, NULL},
14456   LOOKUP(8, ARM_ISA_use),
14457   LOOKUP(9, THUMB_ISA_use),
14458   LOOKUP(10, FP_arch),
14459   LOOKUP(11, WMMX_arch),
14460   LOOKUP(12, Advanced_SIMD_arch),
14461   LOOKUP(13, PCS_config),
14462   LOOKUP(14, ABI_PCS_R9_use),
14463   LOOKUP(15, ABI_PCS_RW_data),
14464   LOOKUP(16, ABI_PCS_RO_data),
14465   LOOKUP(17, ABI_PCS_GOT_use),
14466   LOOKUP(18, ABI_PCS_wchar_t),
14467   LOOKUP(19, ABI_FP_rounding),
14468   LOOKUP(20, ABI_FP_denormal),
14469   LOOKUP(21, ABI_FP_exceptions),
14470   LOOKUP(22, ABI_FP_user_exceptions),
14471   LOOKUP(23, ABI_FP_number_model),
14472   {24, "ABI_align_needed", 0, NULL},
14473   {25, "ABI_align_preserved", 0, NULL},
14474   LOOKUP(26, ABI_enum_size),
14475   LOOKUP(27, ABI_HardFP_use),
14476   LOOKUP(28, ABI_VFP_args),
14477   LOOKUP(29, ABI_WMMX_args),
14478   LOOKUP(30, ABI_optimization_goals),
14479   LOOKUP(31, ABI_FP_optimization_goals),
14480   {32, "compatibility", 0, NULL},
14481   LOOKUP(34, CPU_unaligned_access),
14482   LOOKUP(36, FP_HP_extension),
14483   LOOKUP(38, ABI_FP_16bit_format),
14484   LOOKUP(42, MPextension_use),
14485   LOOKUP(44, DIV_use),
14486   LOOKUP(46, DSP_extension),
14487   LOOKUP(48, MVE_arch),
14488   {64, "nodefaults", 0, NULL},
14489   {65, "also_compatible_with", 0, NULL},
14490   LOOKUP(66, T2EE_use),
14491   {67, "conformance", 1, NULL},
14492   LOOKUP(68, Virtualization_use),
14493   LOOKUP(70, MPextension_use_legacy)
14494 };
14495 #undef LOOKUP
14496
14497 static unsigned char *
14498 display_arm_attribute (unsigned char * p,
14499                        const unsigned char * const end)
14500 {
14501   unsigned int tag;
14502   unsigned int len;
14503   unsigned int val;
14504   arm_attr_public_tag * attr;
14505   unsigned i;
14506   unsigned int type;
14507
14508   tag = read_uleb128 (p, &len, end);
14509   p += len;
14510   attr = NULL;
14511   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
14512     {
14513       if (arm_attr_public_tags[i].tag == tag)
14514         {
14515           attr = &arm_attr_public_tags[i];
14516           break;
14517         }
14518     }
14519
14520   if (attr)
14521     {
14522       printf ("  Tag_%s: ", attr->name);
14523       switch (attr->type)
14524         {
14525         case 0:
14526           switch (tag)
14527             {
14528             case 7: /* Tag_CPU_arch_profile.  */
14529               val = read_uleb128 (p, &len, end);
14530               p += len;
14531               switch (val)
14532                 {
14533                 case 0: printf (_("None\n")); break;
14534                 case 'A': printf (_("Application\n")); break;
14535                 case 'R': printf (_("Realtime\n")); break;
14536                 case 'M': printf (_("Microcontroller\n")); break;
14537                 case 'S': printf (_("Application or Realtime\n")); break;
14538                 default: printf ("??? (%d)\n", val); break;
14539                 }
14540               break;
14541
14542             case 24: /* Tag_align_needed.  */
14543               val = read_uleb128 (p, &len, end);
14544               p += len;
14545               switch (val)
14546                 {
14547                 case 0: printf (_("None\n")); break;
14548                 case 1: printf (_("8-byte\n")); break;
14549                 case 2: printf (_("4-byte\n")); break;
14550                 case 3: printf ("??? 3\n"); break;
14551                 default:
14552                   if (val <= 12)
14553                     printf (_("8-byte and up to %d-byte extended\n"),
14554                             1 << val);
14555                   else
14556                     printf ("??? (%d)\n", val);
14557                   break;
14558                 }
14559               break;
14560
14561             case 25: /* Tag_align_preserved.  */
14562               val = read_uleb128 (p, &len, end);
14563               p += len;
14564               switch (val)
14565                 {
14566                 case 0: printf (_("None\n")); break;
14567                 case 1: printf (_("8-byte, except leaf SP\n")); break;
14568                 case 2: printf (_("8-byte\n")); break;
14569                 case 3: printf ("??? 3\n"); break;
14570                 default:
14571                   if (val <= 12)
14572                     printf (_("8-byte and up to %d-byte extended\n"),
14573                             1 << val);
14574                   else
14575                     printf ("??? (%d)\n", val);
14576                   break;
14577                 }
14578               break;
14579
14580             case 32: /* Tag_compatibility.  */
14581               {
14582                 val = read_uleb128 (p, &len, end);
14583                 p += len;
14584                 printf (_("flag = %d, vendor = "), val);
14585                 if (p < end - 1)
14586                   {
14587                     size_t maxlen = (end - p) - 1;
14588
14589                     print_symbol ((int) maxlen, (const char *) p);
14590                     p += strnlen ((char *) p, maxlen) + 1;
14591                   }
14592                 else
14593                   {
14594                     printf (_("<corrupt>"));
14595                     p = (unsigned char *) end;
14596                   }
14597                 putchar ('\n');
14598               }
14599               break;
14600
14601             case 64: /* Tag_nodefaults.  */
14602               /* PR 17531: file: 001-505008-0.01.  */
14603               if (p < end)
14604                 p++;
14605               printf (_("True\n"));
14606               break;
14607
14608             case 65: /* Tag_also_compatible_with.  */
14609               val = read_uleb128 (p, &len, end);
14610               p += len;
14611               if (val == 6 /* Tag_CPU_arch.  */)
14612                 {
14613                   val = read_uleb128 (p, &len, end);
14614                   p += len;
14615                   if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
14616                     printf ("??? (%d)\n", val);
14617                   else
14618                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
14619                 }
14620               else
14621                 printf ("???\n");
14622               while (p < end && *(p++) != '\0' /* NUL terminator.  */)
14623                 ;
14624               break;
14625
14626             default:
14627               printf (_("<unknown: %d>\n"), tag);
14628               break;
14629             }
14630           return p;
14631
14632         case 1:
14633           return display_tag_value (-1, p, end);
14634         case 2:
14635           return display_tag_value (0, p, end);
14636
14637         default:
14638           assert (attr->type & 0x80);
14639           val = read_uleb128 (p, &len, end);
14640           p += len;
14641           type = attr->type & 0x7f;
14642           if (val >= type)
14643             printf ("??? (%d)\n", val);
14644           else
14645             printf ("%s\n", attr->table[val]);
14646           return p;
14647         }
14648     }
14649
14650   return display_tag_value (tag, p, end);
14651 }
14652
14653 static unsigned char *
14654 display_gnu_attribute (unsigned char * p,
14655                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const),
14656                        const unsigned char * const end)
14657 {
14658   int tag;
14659   unsigned int len;
14660   unsigned int val;
14661
14662   tag = read_uleb128 (p, &len, end);
14663   p += len;
14664
14665   /* Tag_compatibility is the only generic GNU attribute defined at
14666      present.  */
14667   if (tag == 32)
14668     {
14669       val = read_uleb128 (p, &len, end);
14670       p += len;
14671
14672       printf (_("flag = %d, vendor = "), val);
14673       if (p == end)
14674         {
14675           printf (_("<corrupt>\n"));
14676           warn (_("corrupt vendor attribute\n"));
14677         }
14678       else
14679         {
14680           if (p < end - 1)
14681             {
14682               size_t maxlen = (end - p) - 1;
14683
14684               print_symbol ((int) maxlen, (const char *) p);
14685               p += strnlen ((char *) p, maxlen) + 1;
14686             }
14687           else
14688             {
14689               printf (_("<corrupt>"));
14690               p = (unsigned char *) end;
14691             }
14692           putchar ('\n');
14693         }
14694       return p;
14695     }
14696
14697   if ((tag & 2) == 0 && display_proc_gnu_attribute)
14698     return display_proc_gnu_attribute (p, tag, end);
14699
14700   return display_tag_value (tag, p, end);
14701 }
14702
14703 static unsigned char *
14704 display_power_gnu_attribute (unsigned char * p,
14705                              unsigned int tag,
14706                              const unsigned char * const end)
14707 {
14708   unsigned int len;
14709   unsigned int val;
14710
14711   if (tag == Tag_GNU_Power_ABI_FP)
14712     {
14713       val = read_uleb128 (p, &len, end);
14714       p += len;
14715       printf ("  Tag_GNU_Power_ABI_FP: ");
14716       if (len == 0)
14717         {
14718           printf (_("<corrupt>\n"));
14719           return p;
14720         }
14721
14722       if (val > 15)
14723         printf ("(%#x), ", val);
14724
14725       switch (val & 3)
14726         {
14727         case 0:
14728           printf (_("unspecified hard/soft float, "));
14729           break;
14730         case 1:
14731           printf (_("hard float, "));
14732           break;
14733         case 2:
14734           printf (_("soft float, "));
14735           break;
14736         case 3:
14737           printf (_("single-precision hard float, "));
14738           break;
14739         }
14740
14741       switch (val & 0xC)
14742         {
14743         case 0:
14744           printf (_("unspecified long double\n"));
14745           break;
14746         case 4:
14747           printf (_("128-bit IBM long double\n"));
14748           break;
14749         case 8:
14750           printf (_("64-bit long double\n"));
14751           break;
14752         case 12:
14753           printf (_("128-bit IEEE long double\n"));
14754           break;
14755         }
14756       return p;
14757     }
14758
14759   if (tag == Tag_GNU_Power_ABI_Vector)
14760     {
14761       val = read_uleb128 (p, &len, end);
14762       p += len;
14763       printf ("  Tag_GNU_Power_ABI_Vector: ");
14764       if (len == 0)
14765         {
14766           printf (_("<corrupt>\n"));
14767           return p;
14768         }
14769
14770       if (val > 3)
14771         printf ("(%#x), ", val);
14772
14773       switch (val & 3)
14774         {
14775         case 0:
14776           printf (_("unspecified\n"));
14777           break;
14778         case 1:
14779           printf (_("generic\n"));
14780           break;
14781         case 2:
14782           printf ("AltiVec\n");
14783           break;
14784         case 3:
14785           printf ("SPE\n");
14786           break;
14787         }
14788       return p;
14789     }
14790
14791   if (tag == Tag_GNU_Power_ABI_Struct_Return)
14792     {
14793       val = read_uleb128 (p, &len, end);
14794       p += len;
14795       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
14796       if (len == 0)
14797         {
14798           printf (_("<corrupt>\n"));
14799           return p;
14800         }
14801
14802       if (val > 2)
14803         printf ("(%#x), ", val);
14804
14805       switch (val & 3)
14806         {
14807         case 0:
14808           printf (_("unspecified\n"));
14809           break;
14810         case 1:
14811           printf ("r3/r4\n");
14812           break;
14813         case 2:
14814           printf (_("memory\n"));
14815           break;
14816         case 3:
14817           printf ("???\n");
14818           break;
14819         }
14820       return p;
14821     }
14822
14823   return display_tag_value (tag & 1, p, end);
14824 }
14825
14826 static unsigned char *
14827 display_s390_gnu_attribute (unsigned char * p,
14828                             unsigned int tag,
14829                             const unsigned char * const end)
14830 {
14831   unsigned int len;
14832   int val;
14833
14834   if (tag == Tag_GNU_S390_ABI_Vector)
14835     {
14836       val = read_uleb128 (p, &len, end);
14837       p += len;
14838       printf ("  Tag_GNU_S390_ABI_Vector: ");
14839
14840       switch (val)
14841         {
14842         case 0:
14843           printf (_("any\n"));
14844           break;
14845         case 1:
14846           printf (_("software\n"));
14847           break;
14848         case 2:
14849           printf (_("hardware\n"));
14850           break;
14851         default:
14852           printf ("??? (%d)\n", val);
14853           break;
14854         }
14855       return p;
14856    }
14857
14858   return display_tag_value (tag & 1, p, end);
14859 }
14860
14861 static void
14862 display_sparc_hwcaps (unsigned int mask)
14863 {
14864   if (mask)
14865     {
14866       bfd_boolean first = TRUE;
14867
14868       if (mask & ELF_SPARC_HWCAP_MUL32)
14869         fputs ("mul32", stdout), first = FALSE;
14870       if (mask & ELF_SPARC_HWCAP_DIV32)
14871         printf ("%sdiv32", first ? "" : "|"), first = FALSE;
14872       if (mask & ELF_SPARC_HWCAP_FSMULD)
14873         printf ("%sfsmuld", first ? "" : "|"), first = FALSE;
14874       if (mask & ELF_SPARC_HWCAP_V8PLUS)
14875         printf ("%sv8plus", first ? "" : "|"), first = FALSE;
14876       if (mask & ELF_SPARC_HWCAP_POPC)
14877         printf ("%spopc", first ? "" : "|"), first = FALSE;
14878       if (mask & ELF_SPARC_HWCAP_VIS)
14879         printf ("%svis", first ? "" : "|"), first = FALSE;
14880       if (mask & ELF_SPARC_HWCAP_VIS2)
14881         printf ("%svis2", first ? "" : "|"), first = FALSE;
14882       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
14883         printf ("%sASIBlkInit", first ? "" : "|"), first = FALSE;
14884       if (mask & ELF_SPARC_HWCAP_FMAF)
14885         printf ("%sfmaf", first ? "" : "|"), first = FALSE;
14886       if (mask & ELF_SPARC_HWCAP_VIS3)
14887         printf ("%svis3", first ? "" : "|"), first = FALSE;
14888       if (mask & ELF_SPARC_HWCAP_HPC)
14889         printf ("%shpc", first ? "" : "|"), first = FALSE;
14890       if (mask & ELF_SPARC_HWCAP_RANDOM)
14891         printf ("%srandom", first ? "" : "|"), first = FALSE;
14892       if (mask & ELF_SPARC_HWCAP_TRANS)
14893         printf ("%strans", first ? "" : "|"), first = FALSE;
14894       if (mask & ELF_SPARC_HWCAP_FJFMAU)
14895         printf ("%sfjfmau", first ? "" : "|"), first = FALSE;
14896       if (mask & ELF_SPARC_HWCAP_IMA)
14897         printf ("%sima", first ? "" : "|"), first = FALSE;
14898       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
14899         printf ("%scspare", first ? "" : "|"), first = FALSE;
14900     }
14901   else
14902     fputc ('0', stdout);
14903   fputc ('\n', stdout);
14904 }
14905
14906 static void
14907 display_sparc_hwcaps2 (unsigned int mask)
14908 {
14909   if (mask)
14910     {
14911       bfd_boolean first = TRUE;
14912
14913       if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
14914         fputs ("fjathplus", stdout), first = FALSE;
14915       if (mask & ELF_SPARC_HWCAP2_VIS3B)
14916         printf ("%svis3b", first ? "" : "|"), first = FALSE;
14917       if (mask & ELF_SPARC_HWCAP2_ADP)
14918         printf ("%sadp", first ? "" : "|"), first = FALSE;
14919       if (mask & ELF_SPARC_HWCAP2_SPARC5)
14920         printf ("%ssparc5", first ? "" : "|"), first = FALSE;
14921       if (mask & ELF_SPARC_HWCAP2_MWAIT)
14922         printf ("%smwait", first ? "" : "|"), first = FALSE;
14923       if (mask & ELF_SPARC_HWCAP2_XMPMUL)
14924         printf ("%sxmpmul", first ? "" : "|"), first = FALSE;
14925       if (mask & ELF_SPARC_HWCAP2_XMONT)
14926         printf ("%sxmont2", first ? "" : "|"), first = FALSE;
14927       if (mask & ELF_SPARC_HWCAP2_NSEC)
14928         printf ("%snsec", first ? "" : "|"), first = FALSE;
14929       if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
14930         printf ("%sfjathhpc", first ? "" : "|"), first = FALSE;
14931       if (mask & ELF_SPARC_HWCAP2_FJDES)
14932         printf ("%sfjdes", first ? "" : "|"), first = FALSE;
14933       if (mask & ELF_SPARC_HWCAP2_FJAES)
14934         printf ("%sfjaes", first ? "" : "|"), first = FALSE;
14935     }
14936   else
14937     fputc ('0', stdout);
14938   fputc ('\n', stdout);
14939 }
14940
14941 static unsigned char *
14942 display_sparc_gnu_attribute (unsigned char * p,
14943                              unsigned int tag,
14944                              const unsigned char * const end)
14945 {
14946   unsigned int len;
14947   int val;
14948
14949   if (tag == Tag_GNU_Sparc_HWCAPS)
14950     {
14951       val = read_uleb128 (p, &len, end);
14952       p += len;
14953       printf ("  Tag_GNU_Sparc_HWCAPS: ");
14954       display_sparc_hwcaps (val);
14955       return p;
14956     }
14957   if (tag == Tag_GNU_Sparc_HWCAPS2)
14958     {
14959       val = read_uleb128 (p, &len, end);
14960       p += len;
14961       printf ("  Tag_GNU_Sparc_HWCAPS2: ");
14962       display_sparc_hwcaps2 (val);
14963       return p;
14964     }
14965
14966   return display_tag_value (tag, p, end);
14967 }
14968
14969 static void
14970 print_mips_fp_abi_value (unsigned int val)
14971 {
14972   switch (val)
14973     {
14974     case Val_GNU_MIPS_ABI_FP_ANY:
14975       printf (_("Hard or soft float\n"));
14976       break;
14977     case Val_GNU_MIPS_ABI_FP_DOUBLE:
14978       printf (_("Hard float (double precision)\n"));
14979       break;
14980     case Val_GNU_MIPS_ABI_FP_SINGLE:
14981       printf (_("Hard float (single precision)\n"));
14982       break;
14983     case Val_GNU_MIPS_ABI_FP_SOFT:
14984       printf (_("Soft float\n"));
14985       break;
14986     case Val_GNU_MIPS_ABI_FP_OLD_64:
14987       printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
14988       break;
14989     case Val_GNU_MIPS_ABI_FP_XX:
14990       printf (_("Hard float (32-bit CPU, Any FPU)\n"));
14991       break;
14992     case Val_GNU_MIPS_ABI_FP_64:
14993       printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
14994       break;
14995     case Val_GNU_MIPS_ABI_FP_64A:
14996       printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
14997       break;
14998     case Val_GNU_MIPS_ABI_FP_NAN2008:
14999       printf (_("NaN 2008 compatibility\n"));
15000       break;
15001     default:
15002       printf ("??? (%d)\n", val);
15003       break;
15004     }
15005 }
15006
15007 static unsigned char *
15008 display_mips_gnu_attribute (unsigned char * p,
15009                             unsigned int tag,
15010                             const unsigned char * const end)
15011 {
15012   if (tag == Tag_GNU_MIPS_ABI_FP)
15013     {
15014       unsigned int len;
15015       unsigned int val;
15016
15017       val = read_uleb128 (p, &len, end);
15018       p += len;
15019       printf ("  Tag_GNU_MIPS_ABI_FP: ");
15020
15021       print_mips_fp_abi_value (val);
15022
15023       return p;
15024    }
15025
15026   if (tag == Tag_GNU_MIPS_ABI_MSA)
15027     {
15028       unsigned int len;
15029       unsigned int val;
15030
15031       val = read_uleb128 (p, &len, end);
15032       p += len;
15033       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
15034
15035       switch (val)
15036         {
15037         case Val_GNU_MIPS_ABI_MSA_ANY:
15038           printf (_("Any MSA or not\n"));
15039           break;
15040         case Val_GNU_MIPS_ABI_MSA_128:
15041           printf (_("128-bit MSA\n"));
15042           break;
15043         default:
15044           printf ("??? (%d)\n", val);
15045           break;
15046         }
15047       return p;
15048     }
15049
15050   return display_tag_value (tag & 1, p, end);
15051 }
15052
15053 static unsigned char *
15054 display_tic6x_attribute (unsigned char * p,
15055                          const unsigned char * const end)
15056 {
15057   unsigned int tag;
15058   unsigned int len;
15059   int val;
15060
15061   tag = read_uleb128 (p, &len, end);
15062   p += len;
15063
15064   switch (tag)
15065     {
15066     case Tag_ISA:
15067       val = read_uleb128 (p, &len, end);
15068       p += len;
15069       printf ("  Tag_ISA: ");
15070
15071       switch (val)
15072         {
15073         case C6XABI_Tag_ISA_none:
15074           printf (_("None\n"));
15075           break;
15076         case C6XABI_Tag_ISA_C62X:
15077           printf ("C62x\n");
15078           break;
15079         case C6XABI_Tag_ISA_C67X:
15080           printf ("C67x\n");
15081           break;
15082         case C6XABI_Tag_ISA_C67XP:
15083           printf ("C67x+\n");
15084           break;
15085         case C6XABI_Tag_ISA_C64X:
15086           printf ("C64x\n");
15087           break;
15088         case C6XABI_Tag_ISA_C64XP:
15089           printf ("C64x+\n");
15090           break;
15091         case C6XABI_Tag_ISA_C674X:
15092           printf ("C674x\n");
15093           break;
15094         default:
15095           printf ("??? (%d)\n", val);
15096           break;
15097         }
15098       return p;
15099
15100     case Tag_ABI_wchar_t:
15101       val = read_uleb128 (p, &len, end);
15102       p += len;
15103       printf ("  Tag_ABI_wchar_t: ");
15104       switch (val)
15105         {
15106         case 0:
15107           printf (_("Not used\n"));
15108           break;
15109         case 1:
15110           printf (_("2 bytes\n"));
15111           break;
15112         case 2:
15113           printf (_("4 bytes\n"));
15114           break;
15115         default:
15116           printf ("??? (%d)\n", val);
15117           break;
15118         }
15119       return p;
15120
15121     case Tag_ABI_stack_align_needed:
15122       val = read_uleb128 (p, &len, end);
15123       p += len;
15124       printf ("  Tag_ABI_stack_align_needed: ");
15125       switch (val)
15126         {
15127         case 0:
15128           printf (_("8-byte\n"));
15129           break;
15130         case 1:
15131           printf (_("16-byte\n"));
15132           break;
15133         default:
15134           printf ("??? (%d)\n", val);
15135           break;
15136         }
15137       return p;
15138
15139     case Tag_ABI_stack_align_preserved:
15140       val = read_uleb128 (p, &len, end);
15141       p += len;
15142       printf ("  Tag_ABI_stack_align_preserved: ");
15143       switch (val)
15144         {
15145         case 0:
15146           printf (_("8-byte\n"));
15147           break;
15148         case 1:
15149           printf (_("16-byte\n"));
15150           break;
15151         default:
15152           printf ("??? (%d)\n", val);
15153           break;
15154         }
15155       return p;
15156
15157     case Tag_ABI_DSBT:
15158       val = read_uleb128 (p, &len, end);
15159       p += len;
15160       printf ("  Tag_ABI_DSBT: ");
15161       switch (val)
15162         {
15163         case 0:
15164           printf (_("DSBT addressing not used\n"));
15165           break;
15166         case 1:
15167           printf (_("DSBT addressing used\n"));
15168           break;
15169         default:
15170           printf ("??? (%d)\n", val);
15171           break;
15172         }
15173       return p;
15174
15175     case Tag_ABI_PID:
15176       val = read_uleb128 (p, &len, end);
15177       p += len;
15178       printf ("  Tag_ABI_PID: ");
15179       switch (val)
15180         {
15181         case 0:
15182           printf (_("Data addressing position-dependent\n"));
15183           break;
15184         case 1:
15185           printf (_("Data addressing position-independent, GOT near DP\n"));
15186           break;
15187         case 2:
15188           printf (_("Data addressing position-independent, GOT far from DP\n"));
15189           break;
15190         default:
15191           printf ("??? (%d)\n", val);
15192           break;
15193         }
15194       return p;
15195
15196     case Tag_ABI_PIC:
15197       val = read_uleb128 (p, &len, end);
15198       p += len;
15199       printf ("  Tag_ABI_PIC: ");
15200       switch (val)
15201         {
15202         case 0:
15203           printf (_("Code addressing position-dependent\n"));
15204           break;
15205         case 1:
15206           printf (_("Code addressing position-independent\n"));
15207           break;
15208         default:
15209           printf ("??? (%d)\n", val);
15210           break;
15211         }
15212       return p;
15213
15214     case Tag_ABI_array_object_alignment:
15215       val = read_uleb128 (p, &len, end);
15216       p += len;
15217       printf ("  Tag_ABI_array_object_alignment: ");
15218       switch (val)
15219         {
15220         case 0:
15221           printf (_("8-byte\n"));
15222           break;
15223         case 1:
15224           printf (_("4-byte\n"));
15225           break;
15226         case 2:
15227           printf (_("16-byte\n"));
15228           break;
15229         default:
15230           printf ("??? (%d)\n", val);
15231           break;
15232         }
15233       return p;
15234
15235     case Tag_ABI_array_object_align_expected:
15236       val = read_uleb128 (p, &len, end);
15237       p += len;
15238       printf ("  Tag_ABI_array_object_align_expected: ");
15239       switch (val)
15240         {
15241         case 0:
15242           printf (_("8-byte\n"));
15243           break;
15244         case 1:
15245           printf (_("4-byte\n"));
15246           break;
15247         case 2:
15248           printf (_("16-byte\n"));
15249           break;
15250         default:
15251           printf ("??? (%d)\n", val);
15252           break;
15253         }
15254       return p;
15255
15256     case Tag_ABI_compatibility:
15257       {
15258         val = read_uleb128 (p, &len, end);
15259         p += len;
15260         printf ("  Tag_ABI_compatibility: ");
15261         printf (_("flag = %d, vendor = "), val);
15262         if (p < end - 1)
15263           {
15264             size_t maxlen = (end - p) - 1;
15265
15266             print_symbol ((int) maxlen, (const char *) p);
15267             p += strnlen ((char *) p, maxlen) + 1;
15268           }
15269         else
15270           {
15271             printf (_("<corrupt>"));
15272             p = (unsigned char *) end;
15273           }
15274         putchar ('\n');
15275         return p;
15276       }
15277
15278     case Tag_ABI_conformance:
15279       {
15280         printf ("  Tag_ABI_conformance: \"");
15281         if (p < end - 1)
15282           {
15283             size_t maxlen = (end - p) - 1;
15284
15285             print_symbol ((int) maxlen, (const char *) p);
15286             p += strnlen ((char *) p, maxlen) + 1;
15287           }
15288         else
15289           {
15290             printf (_("<corrupt>"));
15291             p = (unsigned char *) end;
15292           }
15293         printf ("\"\n");
15294         return p;
15295       }
15296     }
15297
15298   return display_tag_value (tag, p, end);
15299 }
15300
15301 static void
15302 display_raw_attribute (unsigned char * p, unsigned char const * const end)
15303 {
15304   unsigned long addr = 0;
15305   size_t bytes = end - p;
15306
15307   assert (end >= p);
15308   while (bytes)
15309     {
15310       int j;
15311       int k;
15312       int lbytes = (bytes > 16 ? 16 : bytes);
15313
15314       printf ("  0x%8.8lx ", addr);
15315
15316       for (j = 0; j < 16; j++)
15317         {
15318           if (j < lbytes)
15319             printf ("%2.2x", p[j]);
15320           else
15321             printf ("  ");
15322
15323           if ((j & 3) == 3)
15324             printf (" ");
15325         }
15326
15327       for (j = 0; j < lbytes; j++)
15328         {
15329           k = p[j];
15330           if (k >= ' ' && k < 0x7f)
15331             printf ("%c", k);
15332           else
15333             printf (".");
15334         }
15335
15336       putchar ('\n');
15337
15338       p  += lbytes;
15339       bytes -= lbytes;
15340       addr += lbytes;
15341     }
15342
15343   putchar ('\n');
15344 }
15345
15346 static unsigned char *
15347 display_msp430x_attribute (unsigned char * p,
15348                            const unsigned char * const end)
15349 {
15350   unsigned int len;
15351   unsigned int val;
15352   unsigned int tag;
15353
15354   tag = read_uleb128 (p, & len, end);
15355   p += len;
15356
15357   switch (tag)
15358     {
15359     case OFBA_MSPABI_Tag_ISA:
15360       val = read_uleb128 (p, &len, end);
15361       p += len;
15362       printf ("  Tag_ISA: ");
15363       switch (val)
15364         {
15365         case 0: printf (_("None\n")); break;
15366         case 1: printf (_("MSP430\n")); break;
15367         case 2: printf (_("MSP430X\n")); break;
15368         default: printf ("??? (%d)\n", val); break;
15369         }
15370       break;
15371
15372     case OFBA_MSPABI_Tag_Code_Model:
15373       val = read_uleb128 (p, &len, end);
15374       p += len;
15375       printf ("  Tag_Code_Model: ");
15376       switch (val)
15377         {
15378         case 0: printf (_("None\n")); break;
15379         case 1: printf (_("Small\n")); break;
15380         case 2: printf (_("Large\n")); break;
15381         default: printf ("??? (%d)\n", val); break;
15382         }
15383       break;
15384
15385     case OFBA_MSPABI_Tag_Data_Model:
15386       val = read_uleb128 (p, &len, end);
15387       p += len;
15388       printf ("  Tag_Data_Model: ");
15389       switch (val)
15390         {
15391         case 0: printf (_("None\n")); break;
15392         case 1: printf (_("Small\n")); break;
15393         case 2: printf (_("Large\n")); break;
15394         case 3: printf (_("Restricted Large\n")); break;
15395         default: printf ("??? (%d)\n", val); break;
15396         }
15397       break;
15398
15399     default:
15400       printf (_("  <unknown tag %d>: "), tag);
15401
15402       if (tag & 1)
15403         {
15404           putchar ('"');
15405           if (p < end - 1)
15406             {
15407               size_t maxlen = (end - p) - 1;
15408
15409               print_symbol ((int) maxlen, (const char *) p);
15410               p += strnlen ((char *) p, maxlen) + 1;
15411             }
15412           else
15413             {
15414               printf (_("<corrupt>"));
15415               p = (unsigned char *) end;
15416             }
15417           printf ("\"\n");
15418         }
15419       else
15420         {
15421           val = read_uleb128 (p, &len, end);
15422           p += len;
15423           printf ("%d (0x%x)\n", val, val);
15424         }
15425       break;
15426    }
15427
15428   assert (p <= end);
15429   return p;
15430 }
15431
15432 struct riscv_attr_tag_t {
15433   const char *name;
15434   int tag;
15435 };
15436
15437 static struct riscv_attr_tag_t riscv_attr_tag[] =
15438 {
15439 #define T(tag) {"Tag_RISCV_" #tag, Tag_RISCV_##tag}
15440   T(arch),
15441   T(priv_spec),
15442   T(priv_spec_minor),
15443   T(priv_spec_revision),
15444   T(unaligned_access),
15445   T(stack_align),
15446 #undef T
15447 };
15448
15449 static unsigned char *
15450 display_riscv_attribute (unsigned char *p,
15451                          const unsigned char * const end)
15452 {
15453   unsigned int len;
15454   int val;
15455   int tag;
15456   struct riscv_attr_tag_t *attr = NULL;
15457   unsigned i;
15458
15459   tag = read_uleb128 (p, &len, end);
15460   p += len;
15461
15462   /* Find the name of attribute. */
15463   for (i = 0; i < ARRAY_SIZE (riscv_attr_tag); i++)
15464     {
15465       if (riscv_attr_tag[i].tag == tag)
15466         {
15467           attr = &riscv_attr_tag[i];
15468           break;
15469         }
15470     }
15471
15472   if (attr)
15473     printf ("  %s: ", attr->name);
15474   else
15475     return display_tag_value (tag, p, end);
15476
15477   switch (tag)
15478     {
15479     case Tag_RISCV_priv_spec:
15480     case Tag_RISCV_priv_spec_minor:
15481     case Tag_RISCV_priv_spec_revision:
15482       val = read_uleb128 (p, &len, end);
15483       p += len;
15484       printf (_("%d\n"), val);
15485       break;
15486     case Tag_RISCV_unaligned_access:
15487       val = read_uleb128 (p, &len, end);
15488       p += len;
15489       switch (val)
15490         {
15491         case 0:
15492           printf (_("No unaligned access\n"));
15493           break;
15494         case 1:
15495           printf (_("Unaligned access\n"));
15496           break;
15497         }
15498       break;
15499     case Tag_RISCV_stack_align:
15500       val = read_uleb128 (p, &len, end);
15501       p += len;
15502       printf (_("%d-bytes\n"), val);
15503       break;
15504     case Tag_RISCV_arch:
15505       p = display_tag_value (-1, p, end);
15506       break;
15507     default:
15508       return display_tag_value (tag, p, end);
15509     }
15510
15511   return p;
15512 }
15513
15514 static bfd_boolean
15515 process_attributes (Filedata * filedata,
15516                     const char * public_name,
15517                     unsigned int proc_type,
15518                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
15519                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const))
15520 {
15521   Elf_Internal_Shdr * sect;
15522   unsigned i;
15523   bfd_boolean res = TRUE;
15524
15525   /* Find the section header so that we get the size.  */
15526   for (i = 0, sect = filedata->section_headers;
15527        i < filedata->file_header.e_shnum;
15528        i++, sect++)
15529     {
15530       unsigned char * contents;
15531       unsigned char * p;
15532
15533       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
15534         continue;
15535
15536       contents = (unsigned char *) get_data (NULL, filedata, sect->sh_offset, 1,
15537                                              sect->sh_size, _("attributes"));
15538       if (contents == NULL)
15539         {
15540           res = FALSE;
15541           continue;
15542         }
15543
15544       p = contents;
15545       /* The first character is the version of the attributes.
15546          Currently only version 1, (aka 'A') is recognised here.  */
15547       if (*p != 'A')
15548         {
15549           printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p);
15550           res = FALSE;
15551         }
15552       else
15553         {
15554           bfd_vma section_len;
15555
15556           section_len = sect->sh_size - 1;
15557           p++;
15558
15559           while (section_len > 0)
15560             {
15561               bfd_vma attr_len;
15562               unsigned int namelen;
15563               bfd_boolean public_section;
15564               bfd_boolean gnu_section;
15565
15566               if (section_len <= 4)
15567                 {
15568                   error (_("Tag section ends prematurely\n"));
15569                   res = FALSE;
15570                   break;
15571                 }
15572               attr_len = byte_get (p, 4);
15573               p += 4;
15574
15575               if (attr_len > section_len)
15576                 {
15577                   error (_("Bad attribute length (%u > %u)\n"),
15578                           (unsigned) attr_len, (unsigned) section_len);
15579                   attr_len = section_len;
15580                   res = FALSE;
15581                 }
15582               /* PR 17531: file: 001-101425-0.004  */
15583               else if (attr_len < 5)
15584                 {
15585                   error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
15586                   res = FALSE;
15587                   break;
15588                 }
15589
15590               section_len -= attr_len;
15591               attr_len -= 4;
15592
15593               namelen = strnlen ((char *) p, attr_len) + 1;
15594               if (namelen == 0 || namelen >= attr_len)
15595                 {
15596                   error (_("Corrupt attribute section name\n"));
15597                   res = FALSE;
15598                   break;
15599                 }
15600
15601               printf (_("Attribute Section: "));
15602               print_symbol (INT_MAX, (const char *) p);
15603               putchar ('\n');
15604
15605               if (public_name && streq ((char *) p, public_name))
15606                 public_section = TRUE;
15607               else
15608                 public_section = FALSE;
15609
15610               if (streq ((char *) p, "gnu"))
15611                 gnu_section = TRUE;
15612               else
15613                 gnu_section = FALSE;
15614
15615               p += namelen;
15616               attr_len -= namelen;
15617
15618               while (attr_len > 0 && p < contents + sect->sh_size)
15619                 {
15620                   int tag;
15621                   int val;
15622                   bfd_vma size;
15623                   unsigned char * end;
15624
15625                   /* PR binutils/17531: Safe handling of corrupt files.  */
15626                   if (attr_len < 6)
15627                     {
15628                       error (_("Unused bytes at end of section\n"));
15629                       res = FALSE;
15630                       section_len = 0;
15631                       break;
15632                     }
15633
15634                   tag = *(p++);
15635                   size = byte_get (p, 4);
15636                   if (size > attr_len)
15637                     {
15638                       error (_("Bad subsection length (%u > %u)\n"),
15639                               (unsigned) size, (unsigned) attr_len);
15640                       res = FALSE;
15641                       size = attr_len;
15642                     }
15643                   /* PR binutils/17531: Safe handling of corrupt files.  */
15644                   if (size < 6)
15645                     {
15646                       error (_("Bad subsection length (%u < 6)\n"),
15647                               (unsigned) size);
15648                       res = FALSE;
15649                       section_len = 0;
15650                       break;
15651                     }
15652
15653                   attr_len -= size;
15654                   end = p + size - 1;
15655                   assert (end <= contents + sect->sh_size);
15656                   p += 4;
15657
15658                   switch (tag)
15659                     {
15660                     case 1:
15661                       printf (_("File Attributes\n"));
15662                       break;
15663                     case 2:
15664                       printf (_("Section Attributes:"));
15665                       goto do_numlist;
15666                     case 3:
15667                       printf (_("Symbol Attributes:"));
15668                       /* Fall through.  */
15669                     do_numlist:
15670                       for (;;)
15671                         {
15672                           unsigned int j;
15673
15674                           val = read_uleb128 (p, &j, end);
15675                           p += j;
15676                           if (val == 0)
15677                             break;
15678                           printf (" %d", val);
15679                         }
15680                       printf ("\n");
15681                       break;
15682                     default:
15683                       printf (_("Unknown tag: %d\n"), tag);
15684                       public_section = FALSE;
15685                       break;
15686                     }
15687
15688                   if (public_section && display_pub_attribute != NULL)
15689                     {
15690                       while (p < end)
15691                         p = display_pub_attribute (p, end);
15692                       assert (p == end);
15693                     }
15694                   else if (gnu_section && display_proc_gnu_attribute != NULL)
15695                     {
15696                       while (p < end)
15697                         p = display_gnu_attribute (p,
15698                                                    display_proc_gnu_attribute,
15699                                                    end);
15700                       assert (p == end);
15701                     }
15702                   else if (p < end)
15703                     {
15704                       printf (_("  Unknown attribute:\n"));
15705                       display_raw_attribute (p, end);
15706                       p = end;
15707                     }
15708                   else
15709                     attr_len = 0;
15710                 }
15711             }
15712         }
15713
15714       free (contents);
15715     }
15716
15717   return res;
15718 }
15719
15720 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
15721    Print the Address, Access and Initial fields of an entry at VMA ADDR
15722    and return the VMA of the next entry, or -1 if there was a problem.
15723    Does not read from DATA_END or beyond.  */
15724
15725 static bfd_vma
15726 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
15727                       unsigned char * data_end)
15728 {
15729   printf ("  ");
15730   print_vma (addr, LONG_HEX);
15731   printf (" ");
15732   if (addr < pltgot + 0xfff0)
15733     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
15734   else
15735     printf ("%10s", "");
15736   printf (" ");
15737   if (data == NULL)
15738     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15739   else
15740     {
15741       bfd_vma entry;
15742       unsigned char * from = data + addr - pltgot;
15743
15744       if (from + (is_32bit_elf ? 4 : 8) > data_end)
15745         {
15746           warn (_("MIPS GOT entry extends beyond the end of available data\n"));
15747           printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
15748           return (bfd_vma) -1;
15749         }
15750       else
15751         {
15752           entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15753           print_vma (entry, LONG_HEX);
15754         }
15755     }
15756   return addr + (is_32bit_elf ? 4 : 8);
15757 }
15758
15759 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
15760    PLTGOT.  Print the Address and Initial fields of an entry at VMA
15761    ADDR and return the VMA of the next entry.  */
15762
15763 static bfd_vma
15764 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
15765 {
15766   printf ("  ");
15767   print_vma (addr, LONG_HEX);
15768   printf (" ");
15769   if (data == NULL)
15770     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15771   else
15772     {
15773       bfd_vma entry;
15774
15775       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15776       print_vma (entry, LONG_HEX);
15777     }
15778   return addr + (is_32bit_elf ? 4 : 8);
15779 }
15780
15781 static void
15782 print_mips_ases (unsigned int mask)
15783 {
15784   if (mask & AFL_ASE_DSP)
15785     fputs ("\n\tDSP ASE", stdout);
15786   if (mask & AFL_ASE_DSPR2)
15787     fputs ("\n\tDSP R2 ASE", stdout);
15788   if (mask & AFL_ASE_DSPR3)
15789     fputs ("\n\tDSP R3 ASE", stdout);
15790   if (mask & AFL_ASE_EVA)
15791     fputs ("\n\tEnhanced VA Scheme", stdout);
15792   if (mask & AFL_ASE_MCU)
15793     fputs ("\n\tMCU (MicroController) ASE", stdout);
15794   if (mask & AFL_ASE_MDMX)
15795     fputs ("\n\tMDMX ASE", stdout);
15796   if (mask & AFL_ASE_MIPS3D)
15797     fputs ("\n\tMIPS-3D ASE", stdout);
15798   if (mask & AFL_ASE_MT)
15799     fputs ("\n\tMT ASE", stdout);
15800   if (mask & AFL_ASE_SMARTMIPS)
15801     fputs ("\n\tSmartMIPS ASE", stdout);
15802   if (mask & AFL_ASE_VIRT)
15803     fputs ("\n\tVZ ASE", stdout);
15804   if (mask & AFL_ASE_MSA)
15805     fputs ("\n\tMSA ASE", stdout);
15806   if (mask & AFL_ASE_MIPS16)
15807     fputs ("\n\tMIPS16 ASE", stdout);
15808   if (mask & AFL_ASE_MICROMIPS)
15809     fputs ("\n\tMICROMIPS ASE", stdout);
15810   if (mask & AFL_ASE_XPA)
15811     fputs ("\n\tXPA ASE", stdout);
15812   if (mask & AFL_ASE_MIPS16E2)
15813     fputs ("\n\tMIPS16e2 ASE", stdout);
15814   if (mask & AFL_ASE_CRC)
15815     fputs ("\n\tCRC ASE", stdout);
15816   if (mask & AFL_ASE_GINV)
15817     fputs ("\n\tGINV ASE", stdout);
15818   if (mask & AFL_ASE_LOONGSON_MMI)
15819     fputs ("\n\tLoongson MMI ASE", stdout);
15820   if (mask & AFL_ASE_LOONGSON_CAM)
15821     fputs ("\n\tLoongson CAM ASE", stdout);
15822   if (mask & AFL_ASE_LOONGSON_EXT)
15823     fputs ("\n\tLoongson EXT ASE", stdout);
15824   if (mask & AFL_ASE_LOONGSON_EXT2)
15825     fputs ("\n\tLoongson EXT2 ASE", stdout);
15826   if (mask == 0)
15827     fprintf (stdout, "\n\t%s", _("None"));
15828   else if ((mask & ~AFL_ASE_MASK) != 0)
15829     fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
15830 }
15831
15832 static void
15833 print_mips_isa_ext (unsigned int isa_ext)
15834 {
15835   switch (isa_ext)
15836     {
15837     case 0:
15838       fputs (_("None"), stdout);
15839       break;
15840     case AFL_EXT_XLR:
15841       fputs ("RMI XLR", stdout);
15842       break;
15843     case AFL_EXT_OCTEON3:
15844       fputs ("Cavium Networks Octeon3", stdout);
15845       break;
15846     case AFL_EXT_OCTEON2:
15847       fputs ("Cavium Networks Octeon2", stdout);
15848       break;
15849     case AFL_EXT_OCTEONP:
15850       fputs ("Cavium Networks OcteonP", stdout);
15851       break;
15852     case AFL_EXT_OCTEON:
15853       fputs ("Cavium Networks Octeon", stdout);
15854       break;
15855     case AFL_EXT_5900:
15856       fputs ("Toshiba R5900", stdout);
15857       break;
15858     case AFL_EXT_4650:
15859       fputs ("MIPS R4650", stdout);
15860       break;
15861     case AFL_EXT_4010:
15862       fputs ("LSI R4010", stdout);
15863       break;
15864     case AFL_EXT_4100:
15865       fputs ("NEC VR4100", stdout);
15866       break;
15867     case AFL_EXT_3900:
15868       fputs ("Toshiba R3900", stdout);
15869       break;
15870     case AFL_EXT_10000:
15871       fputs ("MIPS R10000", stdout);
15872       break;
15873     case AFL_EXT_SB1:
15874       fputs ("Broadcom SB-1", stdout);
15875       break;
15876     case AFL_EXT_4111:
15877       fputs ("NEC VR4111/VR4181", stdout);
15878       break;
15879     case AFL_EXT_4120:
15880       fputs ("NEC VR4120", stdout);
15881       break;
15882     case AFL_EXT_5400:
15883       fputs ("NEC VR5400", stdout);
15884       break;
15885     case AFL_EXT_5500:
15886       fputs ("NEC VR5500", stdout);
15887       break;
15888     case AFL_EXT_LOONGSON_2E:
15889       fputs ("ST Microelectronics Loongson 2E", stdout);
15890       break;
15891     case AFL_EXT_LOONGSON_2F:
15892       fputs ("ST Microelectronics Loongson 2F", stdout);
15893       break;
15894     case AFL_EXT_INTERAPTIV_MR2:
15895       fputs ("Imagination interAptiv MR2", stdout);
15896       break;
15897     default:
15898       fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
15899     }
15900 }
15901
15902 static signed int
15903 get_mips_reg_size (int reg_size)
15904 {
15905   return (reg_size == AFL_REG_NONE) ? 0
15906          : (reg_size == AFL_REG_32) ? 32
15907          : (reg_size == AFL_REG_64) ? 64
15908          : (reg_size == AFL_REG_128) ? 128
15909          : -1;
15910 }
15911
15912 static bfd_boolean
15913 process_mips_specific (Filedata * filedata)
15914 {
15915   Elf_Internal_Dyn * entry;
15916   Elf_Internal_Shdr *sect = NULL;
15917   size_t liblist_offset = 0;
15918   size_t liblistno = 0;
15919   size_t conflictsno = 0;
15920   size_t options_offset = 0;
15921   size_t conflicts_offset = 0;
15922   size_t pltrelsz = 0;
15923   size_t pltrel = 0;
15924   bfd_vma pltgot = 0;
15925   bfd_vma mips_pltgot = 0;
15926   bfd_vma jmprel = 0;
15927   bfd_vma local_gotno = 0;
15928   bfd_vma gotsym = 0;
15929   bfd_vma symtabno = 0;
15930   bfd_boolean res = TRUE;
15931
15932   if (! process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
15933                             display_mips_gnu_attribute))
15934     res = FALSE;
15935
15936   sect = find_section (filedata, ".MIPS.abiflags");
15937
15938   if (sect != NULL)
15939     {
15940       Elf_External_ABIFlags_v0 *abiflags_ext;
15941       Elf_Internal_ABIFlags_v0 abiflags_in;
15942
15943       if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
15944         {
15945           error (_("Corrupt MIPS ABI Flags section.\n"));
15946           res = FALSE;
15947         }
15948       else
15949         {
15950           abiflags_ext = get_data (NULL, filedata, sect->sh_offset, 1,
15951                                    sect->sh_size, _("MIPS ABI Flags section"));
15952           if (abiflags_ext)
15953             {
15954               abiflags_in.version = BYTE_GET (abiflags_ext->version);
15955               abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
15956               abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
15957               abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
15958               abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
15959               abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
15960               abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
15961               abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
15962               abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
15963               abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
15964               abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
15965
15966               printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
15967               printf ("\nISA: MIPS%d", abiflags_in.isa_level);
15968               if (abiflags_in.isa_rev > 1)
15969                 printf ("r%d", abiflags_in.isa_rev);
15970               printf ("\nGPR size: %d",
15971                       get_mips_reg_size (abiflags_in.gpr_size));
15972               printf ("\nCPR1 size: %d",
15973                       get_mips_reg_size (abiflags_in.cpr1_size));
15974               printf ("\nCPR2 size: %d",
15975                       get_mips_reg_size (abiflags_in.cpr2_size));
15976               fputs ("\nFP ABI: ", stdout);
15977               print_mips_fp_abi_value (abiflags_in.fp_abi);
15978               fputs ("ISA Extension: ", stdout);
15979               print_mips_isa_ext (abiflags_in.isa_ext);
15980               fputs ("\nASEs:", stdout);
15981               print_mips_ases (abiflags_in.ases);
15982               printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
15983               printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
15984               fputc ('\n', stdout);
15985               free (abiflags_ext);
15986             }
15987         }
15988     }
15989
15990   /* We have a lot of special sections.  Thanks SGI!  */
15991   if (dynamic_section == NULL)
15992     {
15993       /* No dynamic information available.  See if there is static GOT.  */
15994       sect = find_section (filedata, ".got");
15995       if (sect != NULL)
15996         {
15997           unsigned char *data_end;
15998           unsigned char *data;
15999           bfd_vma ent, end;
16000           int addr_size;
16001
16002           pltgot = sect->sh_addr;
16003
16004           ent = pltgot;
16005           addr_size = (is_32bit_elf ? 4 : 8);
16006           end = pltgot + sect->sh_size;
16007
16008           data = (unsigned char *) get_data (NULL, filedata, sect->sh_offset,
16009                                              end - pltgot, 1,
16010                                              _("Global Offset Table data"));
16011           /* PR 12855: Null data is handled gracefully throughout.  */
16012           data_end = data + (end - pltgot);
16013
16014           printf (_("\nStatic GOT:\n"));
16015           printf (_(" Canonical gp value: "));
16016           print_vma (ent + 0x7ff0, LONG_HEX);
16017           printf ("\n\n");
16018
16019           /* In a dynamic binary GOT[0] is reserved for the dynamic
16020              loader to store the lazy resolver pointer, however in
16021              a static binary it may well have been omitted and GOT
16022              reduced to a table of addresses.
16023              PR 21344: Check for the entry being fully available
16024              before fetching it.  */
16025           if (data
16026               && data + ent - pltgot + addr_size <= data_end
16027               && byte_get (data + ent - pltgot, addr_size) == 0)
16028             {
16029               printf (_(" Reserved entries:\n"));
16030               printf (_("  %*s %10s %*s\n"),
16031                       addr_size * 2, _("Address"), _("Access"),
16032                       addr_size * 2, _("Value"));
16033               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16034               printf ("\n");
16035               if (ent == (bfd_vma) -1)
16036                 goto sgot_print_fail;
16037
16038               /* Check for the MSB of GOT[1] being set, identifying a
16039                  GNU object.  This entry will be used by some runtime
16040                  loaders, to store the module pointer.  Otherwise this
16041                  is an ordinary local entry.
16042                  PR 21344: Check for the entry being fully available
16043                  before fetching it.  */
16044               if (data
16045                   && data + ent - pltgot + addr_size <= data_end
16046                   && (byte_get (data + ent - pltgot, addr_size)
16047                       >> (addr_size * 8 - 1)) != 0)
16048                 {
16049                   ent = print_mips_got_entry (data, pltgot, ent, data_end);
16050                   printf ("\n");
16051                   if (ent == (bfd_vma) -1)
16052                     goto sgot_print_fail;
16053                 }
16054               printf ("\n");
16055             }
16056
16057           if (data != NULL && ent < end)
16058             {
16059               printf (_(" Local entries:\n"));
16060               printf ("  %*s %10s %*s\n",
16061                       addr_size * 2, _("Address"), _("Access"),
16062                       addr_size * 2, _("Value"));
16063               while (ent < end)
16064                 {
16065                   ent = print_mips_got_entry (data, pltgot, ent, data_end);
16066                   printf ("\n");
16067                   if (ent == (bfd_vma) -1)
16068                     goto sgot_print_fail;
16069                 }
16070               printf ("\n");
16071             }
16072
16073         sgot_print_fail:
16074           if (data)
16075             free (data);
16076         }
16077       return res;
16078     }
16079
16080   for (entry = dynamic_section;
16081        /* PR 17531 file: 012-50589-0.004.  */
16082        entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
16083        ++entry)
16084     switch (entry->d_tag)
16085       {
16086       case DT_MIPS_LIBLIST:
16087         liblist_offset
16088           = offset_from_vma (filedata, entry->d_un.d_val,
16089                              liblistno * sizeof (Elf32_External_Lib));
16090         break;
16091       case DT_MIPS_LIBLISTNO:
16092         liblistno = entry->d_un.d_val;
16093         break;
16094       case DT_MIPS_OPTIONS:
16095         options_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
16096         break;
16097       case DT_MIPS_CONFLICT:
16098         conflicts_offset
16099           = offset_from_vma (filedata, entry->d_un.d_val,
16100                              conflictsno * sizeof (Elf32_External_Conflict));
16101         break;
16102       case DT_MIPS_CONFLICTNO:
16103         conflictsno = entry->d_un.d_val;
16104         break;
16105       case DT_PLTGOT:
16106         pltgot = entry->d_un.d_ptr;
16107         break;
16108       case DT_MIPS_LOCAL_GOTNO:
16109         local_gotno = entry->d_un.d_val;
16110         break;
16111       case DT_MIPS_GOTSYM:
16112         gotsym = entry->d_un.d_val;
16113         break;
16114       case DT_MIPS_SYMTABNO:
16115         symtabno = entry->d_un.d_val;
16116         break;
16117       case DT_MIPS_PLTGOT:
16118         mips_pltgot = entry->d_un.d_ptr;
16119         break;
16120       case DT_PLTREL:
16121         pltrel = entry->d_un.d_val;
16122         break;
16123       case DT_PLTRELSZ:
16124         pltrelsz = entry->d_un.d_val;
16125         break;
16126       case DT_JMPREL:
16127         jmprel = entry->d_un.d_ptr;
16128         break;
16129       default:
16130         break;
16131       }
16132
16133   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
16134     {
16135       Elf32_External_Lib * elib;
16136       size_t cnt;
16137
16138       elib = (Elf32_External_Lib *) get_data (NULL, filedata, liblist_offset,
16139                                               liblistno,
16140                                               sizeof (Elf32_External_Lib),
16141                                               _("liblist section data"));
16142       if (elib)
16143         {
16144           printf (ngettext ("\nSection '.liblist' contains %lu entry:\n",
16145                             "\nSection '.liblist' contains %lu entries:\n",
16146                             (unsigned long) liblistno),
16147                   (unsigned long) liblistno);
16148           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
16149                  stdout);
16150
16151           for (cnt = 0; cnt < liblistno; ++cnt)
16152             {
16153               Elf32_Lib liblist;
16154               time_t atime;
16155               char timebuf[128];
16156               struct tm * tmp;
16157
16158               liblist.l_name = BYTE_GET (elib[cnt].l_name);
16159               atime = BYTE_GET (elib[cnt].l_time_stamp);
16160               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16161               liblist.l_version = BYTE_GET (elib[cnt].l_version);
16162               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16163
16164               tmp = gmtime (&atime);
16165               snprintf (timebuf, sizeof (timebuf),
16166                         "%04u-%02u-%02uT%02u:%02u:%02u",
16167                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16168                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16169
16170               printf ("%3lu: ", (unsigned long) cnt);
16171               if (VALID_DYNAMIC_NAME (liblist.l_name))
16172                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
16173               else
16174                 printf (_("<corrupt: %9ld>"), liblist.l_name);
16175               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
16176                       liblist.l_version);
16177
16178               if (liblist.l_flags == 0)
16179                 puts (_(" NONE"));
16180               else
16181                 {
16182                   static const struct
16183                   {
16184                     const char * name;
16185                     int bit;
16186                   }
16187                   l_flags_vals[] =
16188                   {
16189                     { " EXACT_MATCH", LL_EXACT_MATCH },
16190                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
16191                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
16192                     { " EXPORTS", LL_EXPORTS },
16193                     { " DELAY_LOAD", LL_DELAY_LOAD },
16194                     { " DELTA", LL_DELTA }
16195                   };
16196                   int flags = liblist.l_flags;
16197                   size_t fcnt;
16198
16199                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
16200                     if ((flags & l_flags_vals[fcnt].bit) != 0)
16201                       {
16202                         fputs (l_flags_vals[fcnt].name, stdout);
16203                         flags ^= l_flags_vals[fcnt].bit;
16204                       }
16205                   if (flags != 0)
16206                     printf (" %#x", (unsigned int) flags);
16207
16208                   puts ("");
16209                 }
16210             }
16211
16212           free (elib);
16213         }
16214       else
16215         res = FALSE;
16216     }
16217
16218   if (options_offset != 0)
16219     {
16220       Elf_External_Options * eopt;
16221       Elf_Internal_Options * iopt;
16222       Elf_Internal_Options * option;
16223       size_t offset;
16224       int cnt;
16225       sect = filedata->section_headers;
16226
16227       /* Find the section header so that we get the size.  */
16228       sect = find_section_by_type (filedata, SHT_MIPS_OPTIONS);
16229       /* PR 17533 file: 012-277276-0.004.  */
16230       if (sect == NULL)
16231         {
16232           error (_("No MIPS_OPTIONS header found\n"));
16233           return FALSE;
16234         }
16235       /* PR 24243  */
16236       if (sect->sh_size < sizeof (* eopt))
16237         {
16238           error (_("The MIPS options section is too small.\n"));
16239           return FALSE;
16240         }
16241
16242       eopt = (Elf_External_Options *) get_data (NULL, filedata, options_offset, 1,
16243                                                 sect->sh_size, _("options"));
16244       if (eopt)
16245         {
16246           iopt = (Elf_Internal_Options *)
16247               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
16248           if (iopt == NULL)
16249             {
16250               error (_("Out of memory allocating space for MIPS options\n"));
16251               return FALSE;
16252             }
16253
16254           offset = cnt = 0;
16255           option = iopt;
16256
16257           while (offset <= sect->sh_size - sizeof (* eopt))
16258             {
16259               Elf_External_Options * eoption;
16260
16261               eoption = (Elf_External_Options *) ((char *) eopt + offset);
16262
16263               option->kind = BYTE_GET (eoption->kind);
16264               option->size = BYTE_GET (eoption->size);
16265               option->section = BYTE_GET (eoption->section);
16266               option->info = BYTE_GET (eoption->info);
16267
16268               /* PR 17531: file: ffa0fa3b.  */
16269               if (option->size < sizeof (* eopt)
16270                   || offset + option->size > sect->sh_size)
16271                 {
16272                   error (_("Invalid size (%u) for MIPS option\n"), option->size);
16273                   return FALSE;
16274                 }
16275               offset += option->size;
16276
16277               ++option;
16278               ++cnt;
16279             }
16280
16281           printf (ngettext ("\nSection '%s' contains %d entry:\n",
16282                             "\nSection '%s' contains %d entries:\n",
16283                             cnt),
16284                   printable_section_name (filedata, sect), cnt);
16285
16286           option = iopt;
16287           offset = 0;
16288
16289           while (cnt-- > 0)
16290             {
16291               size_t len;
16292
16293               switch (option->kind)
16294                 {
16295                 case ODK_NULL:
16296                   /* This shouldn't happen.  */
16297                   printf (" NULL       %d %lx", option->section, option->info);
16298                   break;
16299                 case ODK_REGINFO:
16300                   printf (" REGINFO    ");
16301                   if (filedata->file_header.e_machine == EM_MIPS)
16302                     {
16303                       /* 32bit form.  */
16304                       Elf32_External_RegInfo * ereg;
16305                       Elf32_RegInfo reginfo;
16306
16307                       ereg = (Elf32_External_RegInfo *) (option + 1);
16308                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
16309                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16310                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16311                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16312                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16313                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
16314
16315                       printf ("GPR %08lx  GP 0x%lx\n",
16316                               reginfo.ri_gprmask,
16317                               (unsigned long) reginfo.ri_gp_value);
16318                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
16319                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16320                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16321                     }
16322                   else
16323                     {
16324                       /* 64 bit form.  */
16325                       Elf64_External_RegInfo * ereg;
16326                       Elf64_Internal_RegInfo reginfo;
16327
16328                       ereg = (Elf64_External_RegInfo *) (option + 1);
16329                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
16330                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16331                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16332                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16333                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16334                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
16335
16336                       printf ("GPR %08lx  GP 0x",
16337                               reginfo.ri_gprmask);
16338                       printf_vma (reginfo.ri_gp_value);
16339                       printf ("\n");
16340
16341                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
16342                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16343                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16344                     }
16345                   ++option;
16346                   continue;
16347                 case ODK_EXCEPTIONS:
16348                   fputs (" EXCEPTIONS fpe_min(", stdout);
16349                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
16350                   fputs (") fpe_max(", stdout);
16351                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
16352                   fputs (")", stdout);
16353
16354                   if (option->info & OEX_PAGE0)
16355                     fputs (" PAGE0", stdout);
16356                   if (option->info & OEX_SMM)
16357                     fputs (" SMM", stdout);
16358                   if (option->info & OEX_FPDBUG)
16359                     fputs (" FPDBUG", stdout);
16360                   if (option->info & OEX_DISMISS)
16361                     fputs (" DISMISS", stdout);
16362                   break;
16363                 case ODK_PAD:
16364                   fputs (" PAD       ", stdout);
16365                   if (option->info & OPAD_PREFIX)
16366                     fputs (" PREFIX", stdout);
16367                   if (option->info & OPAD_POSTFIX)
16368                     fputs (" POSTFIX", stdout);
16369                   if (option->info & OPAD_SYMBOL)
16370                     fputs (" SYMBOL", stdout);
16371                   break;
16372                 case ODK_HWPATCH:
16373                   fputs (" HWPATCH   ", stdout);
16374                   if (option->info & OHW_R4KEOP)
16375                     fputs (" R4KEOP", stdout);
16376                   if (option->info & OHW_R8KPFETCH)
16377                     fputs (" R8KPFETCH", stdout);
16378                   if (option->info & OHW_R5KEOP)
16379                     fputs (" R5KEOP", stdout);
16380                   if (option->info & OHW_R5KCVTL)
16381                     fputs (" R5KCVTL", stdout);
16382                   break;
16383                 case ODK_FILL:
16384                   fputs (" FILL       ", stdout);
16385                   /* XXX Print content of info word?  */
16386                   break;
16387                 case ODK_TAGS:
16388                   fputs (" TAGS       ", stdout);
16389                   /* XXX Print content of info word?  */
16390                   break;
16391                 case ODK_HWAND:
16392                   fputs (" HWAND     ", stdout);
16393                   if (option->info & OHWA0_R4KEOP_CHECKED)
16394                     fputs (" R4KEOP_CHECKED", stdout);
16395                   if (option->info & OHWA0_R4KEOP_CLEAN)
16396                     fputs (" R4KEOP_CLEAN", stdout);
16397                   break;
16398                 case ODK_HWOR:
16399                   fputs (" HWOR      ", stdout);
16400                   if (option->info & OHWA0_R4KEOP_CHECKED)
16401                     fputs (" R4KEOP_CHECKED", stdout);
16402                   if (option->info & OHWA0_R4KEOP_CLEAN)
16403                     fputs (" R4KEOP_CLEAN", stdout);
16404                   break;
16405                 case ODK_GP_GROUP:
16406                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
16407                           option->info & OGP_GROUP,
16408                           (option->info & OGP_SELF) >> 16);
16409                   break;
16410                 case ODK_IDENT:
16411                   printf (" IDENT     %#06lx  self-contained %#06lx",
16412                           option->info & OGP_GROUP,
16413                           (option->info & OGP_SELF) >> 16);
16414                   break;
16415                 default:
16416                   /* This shouldn't happen.  */
16417                   printf (" %3d ???     %d %lx",
16418                           option->kind, option->section, option->info);
16419                   break;
16420                 }
16421
16422               len = sizeof (* eopt);
16423               while (len < option->size)
16424                 {
16425                   unsigned char datum = * ((unsigned char *) eopt + offset + len);
16426
16427                   if (ISPRINT (datum))
16428                     printf ("%c", datum);
16429                   else
16430                     printf ("\\%03o", datum);
16431                   len ++;
16432                 }
16433               fputs ("\n", stdout);
16434
16435               offset += option->size;
16436               ++option;
16437             }
16438
16439           free (eopt);
16440         }
16441       else
16442         res = FALSE;
16443     }
16444
16445   if (conflicts_offset != 0 && conflictsno != 0)
16446     {
16447       Elf32_Conflict * iconf;
16448       size_t cnt;
16449
16450       if (dynamic_symbols == NULL)
16451         {
16452           error (_("conflict list found without a dynamic symbol table\n"));
16453           return FALSE;
16454         }
16455
16456       /* PR 21345 - print a slightly more helpful error message
16457          if we are sure that the cmalloc will fail.  */
16458       if (conflictsno * sizeof (* iconf) > filedata->file_size)
16459         {
16460           error (_("Overlarge number of conflicts detected: %lx\n"),
16461                  (long) conflictsno);
16462           return FALSE;
16463         }
16464
16465       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
16466       if (iconf == NULL)
16467         {
16468           error (_("Out of memory allocating space for dynamic conflicts\n"));
16469           return FALSE;
16470         }
16471
16472       if (is_32bit_elf)
16473         {
16474           Elf32_External_Conflict * econf32;
16475
16476           econf32 = (Elf32_External_Conflict *)
16477               get_data (NULL, filedata, conflicts_offset, conflictsno,
16478                         sizeof (* econf32), _("conflict"));
16479           if (!econf32)
16480             return FALSE;
16481
16482           for (cnt = 0; cnt < conflictsno; ++cnt)
16483             iconf[cnt] = BYTE_GET (econf32[cnt]);
16484
16485           free (econf32);
16486         }
16487       else
16488         {
16489           Elf64_External_Conflict * econf64;
16490
16491           econf64 = (Elf64_External_Conflict *)
16492               get_data (NULL, filedata, conflicts_offset, conflictsno,
16493                         sizeof (* econf64), _("conflict"));
16494           if (!econf64)
16495             return FALSE;
16496
16497           for (cnt = 0; cnt < conflictsno; ++cnt)
16498             iconf[cnt] = BYTE_GET (econf64[cnt]);
16499
16500           free (econf64);
16501         }
16502
16503       printf (ngettext ("\nSection '.conflict' contains %lu entry:\n",
16504                         "\nSection '.conflict' contains %lu entries:\n",
16505                         (unsigned long) conflictsno),
16506               (unsigned long) conflictsno);
16507       puts (_("  Num:    Index       Value  Name"));
16508
16509       for (cnt = 0; cnt < conflictsno; ++cnt)
16510         {
16511           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
16512
16513           if (iconf[cnt] >= num_dynamic_syms)
16514             printf (_("<corrupt symbol index>"));
16515           else
16516             {
16517               Elf_Internal_Sym * psym;
16518
16519               psym = & dynamic_symbols[iconf[cnt]];
16520               print_vma (psym->st_value, FULL_HEX);
16521               putchar (' ');
16522               if (VALID_DYNAMIC_NAME (psym->st_name))
16523                 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
16524               else
16525                 printf (_("<corrupt: %14ld>"), psym->st_name);
16526             }
16527           putchar ('\n');
16528         }
16529
16530       free (iconf);
16531     }
16532
16533   if (pltgot != 0 && local_gotno != 0)
16534     {
16535       bfd_vma ent, local_end, global_end;
16536       size_t i, offset;
16537       unsigned char * data;
16538       unsigned char * data_end;
16539       int addr_size;
16540
16541       ent = pltgot;
16542       addr_size = (is_32bit_elf ? 4 : 8);
16543       local_end = pltgot + local_gotno * addr_size;
16544
16545       /* PR binutils/17533 file: 012-111227-0.004  */
16546       if (symtabno < gotsym)
16547         {
16548           error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
16549                  (unsigned long) gotsym, (unsigned long) symtabno);
16550           return FALSE;
16551         }
16552
16553       global_end = local_end + (symtabno - gotsym) * addr_size;
16554       /* PR 17531: file: 54c91a34.  */
16555       if (global_end < local_end)
16556         {
16557           error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
16558           return FALSE;
16559         }
16560
16561       offset = offset_from_vma (filedata, pltgot, global_end - pltgot);
16562       data = (unsigned char *) get_data (NULL, filedata, offset,
16563                                          global_end - pltgot, 1,
16564                                          _("Global Offset Table data"));
16565       /* PR 12855: Null data is handled gracefully throughout.  */
16566       data_end = data + (global_end - pltgot);
16567
16568       printf (_("\nPrimary GOT:\n"));
16569       printf (_(" Canonical gp value: "));
16570       print_vma (pltgot + 0x7ff0, LONG_HEX);
16571       printf ("\n\n");
16572
16573       printf (_(" Reserved entries:\n"));
16574       printf (_("  %*s %10s %*s Purpose\n"),
16575               addr_size * 2, _("Address"), _("Access"),
16576               addr_size * 2, _("Initial"));
16577       ent = print_mips_got_entry (data, pltgot, ent, data_end);
16578       printf (_(" Lazy resolver\n"));
16579       if (ent == (bfd_vma) -1)
16580         goto got_print_fail;
16581
16582       /* Check for the MSB of GOT[1] being set, denoting a GNU object.
16583          This entry will be used by some runtime loaders, to store the
16584          module pointer.  Otherwise this is an ordinary local entry.
16585          PR 21344: Check for the entry being fully available before
16586          fetching it.  */
16587       if (data
16588           && data + ent - pltgot + addr_size <= data_end
16589           && (byte_get (data + ent - pltgot, addr_size)
16590               >> (addr_size * 8 - 1)) != 0)
16591         {
16592           ent = print_mips_got_entry (data, pltgot, ent, data_end);
16593           printf (_(" Module pointer (GNU extension)\n"));
16594           if (ent == (bfd_vma) -1)
16595             goto got_print_fail;
16596         }
16597       printf ("\n");
16598
16599       if (data != NULL && ent < local_end)
16600         {
16601           printf (_(" Local entries:\n"));
16602           printf ("  %*s %10s %*s\n",
16603                   addr_size * 2, _("Address"), _("Access"),
16604                   addr_size * 2, _("Initial"));
16605           while (ent < local_end)
16606             {
16607               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16608               printf ("\n");
16609               if (ent == (bfd_vma) -1)
16610                 goto got_print_fail;
16611             }
16612           printf ("\n");
16613         }
16614
16615       if (data != NULL && gotsym < symtabno)
16616         {
16617           int sym_width;
16618
16619           printf (_(" Global entries:\n"));
16620           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
16621                   addr_size * 2, _("Address"),
16622                   _("Access"),
16623                   addr_size * 2, _("Initial"),
16624                   addr_size * 2, _("Sym.Val."),
16625                   _("Type"),
16626                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
16627                   _("Ndx"), _("Name"));
16628
16629           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
16630
16631           for (i = gotsym; i < symtabno; i++)
16632             {
16633               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16634               printf (" ");
16635
16636               if (dynamic_symbols == NULL)
16637                 printf (_("<no dynamic symbols>"));
16638               else if (i < num_dynamic_syms)
16639                 {
16640                   Elf_Internal_Sym * psym = dynamic_symbols + i;
16641
16642                   print_vma (psym->st_value, LONG_HEX);
16643                   printf (" %-7s %3s ",
16644                           get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16645                           get_symbol_index_type (filedata, psym->st_shndx));
16646
16647                   if (VALID_DYNAMIC_NAME (psym->st_name))
16648                     print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16649                   else
16650                     printf (_("<corrupt: %14ld>"), psym->st_name);
16651                 }
16652               else
16653                 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
16654                         (unsigned long) i);
16655
16656               printf ("\n");
16657               if (ent == (bfd_vma) -1)
16658                 break;
16659             }
16660           printf ("\n");
16661         }
16662
16663     got_print_fail:
16664       if (data)
16665         free (data);
16666     }
16667
16668   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
16669     {
16670       bfd_vma ent, end;
16671       size_t offset, rel_offset;
16672       unsigned long count, i;
16673       unsigned char * data;
16674       int addr_size, sym_width;
16675       Elf_Internal_Rela * rels;
16676
16677       rel_offset = offset_from_vma (filedata, jmprel, pltrelsz);
16678       if (pltrel == DT_RELA)
16679         {
16680           if (!slurp_rela_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16681             return FALSE;
16682         }
16683       else
16684         {
16685           if (!slurp_rel_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16686             return FALSE;
16687         }
16688
16689       ent = mips_pltgot;
16690       addr_size = (is_32bit_elf ? 4 : 8);
16691       end = mips_pltgot + (2 + count) * addr_size;
16692
16693       offset = offset_from_vma (filedata, mips_pltgot, end - mips_pltgot);
16694       data = (unsigned char *) get_data (NULL, filedata, offset, end - mips_pltgot,
16695                                          1, _("Procedure Linkage Table data"));
16696       if (data == NULL)
16697         return FALSE;
16698
16699       printf ("\nPLT GOT:\n\n");
16700       printf (_(" Reserved entries:\n"));
16701       printf (_("  %*s %*s Purpose\n"),
16702               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
16703       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16704       printf (_(" PLT lazy resolver\n"));
16705       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16706       printf (_(" Module pointer\n"));
16707       printf ("\n");
16708
16709       printf (_(" Entries:\n"));
16710       printf ("  %*s %*s %*s %-7s %3s %s\n",
16711               addr_size * 2, _("Address"),
16712               addr_size * 2, _("Initial"),
16713               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
16714       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
16715       for (i = 0; i < count; i++)
16716         {
16717           unsigned long idx = get_reloc_symindex (rels[i].r_info);
16718
16719           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16720           printf (" ");
16721
16722           if (idx >= num_dynamic_syms)
16723             printf (_("<corrupt symbol index: %lu>"), idx);
16724           else
16725             {
16726               Elf_Internal_Sym * psym = dynamic_symbols + idx;
16727
16728               print_vma (psym->st_value, LONG_HEX);
16729               printf (" %-7s %3s ",
16730                       get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16731                       get_symbol_index_type (filedata, psym->st_shndx));
16732               if (VALID_DYNAMIC_NAME (psym->st_name))
16733                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16734               else
16735                 printf (_("<corrupt: %14ld>"), psym->st_name);
16736             }
16737           printf ("\n");
16738         }
16739       printf ("\n");
16740
16741       if (data)
16742         free (data);
16743       free (rels);
16744     }
16745
16746   return res;
16747 }
16748
16749 static bfd_boolean
16750 process_nds32_specific (Filedata * filedata)
16751 {
16752   Elf_Internal_Shdr *sect = NULL;
16753
16754   sect = find_section (filedata, ".nds32_e_flags");
16755   if (sect != NULL)
16756     {
16757       unsigned int *flag;
16758
16759       printf ("\nNDS32 elf flags section:\n");
16760       flag = get_data (NULL, filedata, sect->sh_offset, 1,
16761                        sect->sh_size, _("NDS32 elf flags section"));
16762
16763       if (! flag)
16764         return FALSE;
16765
16766       switch ((*flag) & 0x3)
16767         {
16768         case 0:
16769           printf ("(VEC_SIZE):\tNo entry.\n");
16770           break;
16771         case 1:
16772           printf ("(VEC_SIZE):\t4 bytes\n");
16773           break;
16774         case 2:
16775           printf ("(VEC_SIZE):\t16 bytes\n");
16776           break;
16777         case 3:
16778           printf ("(VEC_SIZE):\treserved\n");
16779           break;
16780         }
16781     }
16782
16783   return TRUE;
16784 }
16785
16786 static bfd_boolean
16787 process_gnu_liblist (Filedata * filedata)
16788 {
16789   Elf_Internal_Shdr * section;
16790   Elf_Internal_Shdr * string_sec;
16791   Elf32_External_Lib * elib;
16792   char * strtab;
16793   size_t strtab_size;
16794   size_t cnt;
16795   unsigned long num_liblist;
16796   unsigned i;
16797   bfd_boolean res = TRUE;
16798
16799   if (! do_arch)
16800     return TRUE;
16801
16802   for (i = 0, section = filedata->section_headers;
16803        i < filedata->file_header.e_shnum;
16804        i++, section++)
16805     {
16806       switch (section->sh_type)
16807         {
16808         case SHT_GNU_LIBLIST:
16809           if (section->sh_link >= filedata->file_header.e_shnum)
16810             break;
16811
16812           elib = (Elf32_External_Lib *)
16813               get_data (NULL, filedata, section->sh_offset, 1, section->sh_size,
16814                         _("liblist section data"));
16815
16816           if (elib == NULL)
16817             {
16818               res = FALSE;
16819               break;
16820             }
16821
16822           string_sec = filedata->section_headers + section->sh_link;
16823           strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
16824                                       string_sec->sh_size,
16825                                       _("liblist string table"));
16826           if (strtab == NULL
16827               || section->sh_entsize != sizeof (Elf32_External_Lib))
16828             {
16829               free (elib);
16830               free (strtab);
16831               res = FALSE;
16832               break;
16833             }
16834           strtab_size = string_sec->sh_size;
16835
16836           num_liblist = section->sh_size / sizeof (Elf32_External_Lib);
16837           printf (ngettext ("\nLibrary list section '%s' contains %lu entries:\n",
16838                             "\nLibrary list section '%s' contains %lu entries:\n",
16839                             num_liblist),
16840                   printable_section_name (filedata, section),
16841                   num_liblist);
16842
16843           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
16844
16845           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
16846                ++cnt)
16847             {
16848               Elf32_Lib liblist;
16849               time_t atime;
16850               char timebuf[128];
16851               struct tm * tmp;
16852
16853               liblist.l_name = BYTE_GET (elib[cnt].l_name);
16854               atime = BYTE_GET (elib[cnt].l_time_stamp);
16855               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16856               liblist.l_version = BYTE_GET (elib[cnt].l_version);
16857               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16858
16859               tmp = gmtime (&atime);
16860               snprintf (timebuf, sizeof (timebuf),
16861                         "%04u-%02u-%02uT%02u:%02u:%02u",
16862                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16863                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16864
16865               printf ("%3lu: ", (unsigned long) cnt);
16866               if (do_wide)
16867                 printf ("%-20s", liblist.l_name < strtab_size
16868                         ? strtab + liblist.l_name : _("<corrupt>"));
16869               else
16870                 printf ("%-20.20s", liblist.l_name < strtab_size
16871                         ? strtab + liblist.l_name : _("<corrupt>"));
16872               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
16873                       liblist.l_version, liblist.l_flags);
16874             }
16875
16876           free (elib);
16877           free (strtab);
16878         }
16879     }
16880
16881   return res;
16882 }
16883
16884 static const char *
16885 get_note_type (Filedata * filedata, unsigned e_type)
16886 {
16887   static char buff[64];
16888
16889   if (filedata->file_header.e_type == ET_CORE)
16890     switch (e_type)
16891       {
16892       case NT_AUXV:
16893         return _("NT_AUXV (auxiliary vector)");
16894       case NT_PRSTATUS:
16895         return _("NT_PRSTATUS (prstatus structure)");
16896       case NT_FPREGSET:
16897         return _("NT_FPREGSET (floating point registers)");
16898       case NT_PRPSINFO:
16899         return _("NT_PRPSINFO (prpsinfo structure)");
16900       case NT_TASKSTRUCT:
16901         return _("NT_TASKSTRUCT (task structure)");
16902       case NT_PRXFPREG:
16903         return _("NT_PRXFPREG (user_xfpregs structure)");
16904       case NT_PPC_VMX:
16905         return _("NT_PPC_VMX (ppc Altivec registers)");
16906       case NT_PPC_VSX:
16907         return _("NT_PPC_VSX (ppc VSX registers)");
16908       case NT_PPC_TAR:
16909         return _("NT_PPC_TAR (ppc TAR register)");
16910       case NT_PPC_PPR:
16911         return _("NT_PPC_PPR (ppc PPR register)");
16912       case NT_PPC_DSCR:
16913         return _("NT_PPC_DSCR (ppc DSCR register)");
16914       case NT_PPC_EBB:
16915         return _("NT_PPC_EBB (ppc EBB registers)");
16916       case NT_PPC_PMU:
16917         return _("NT_PPC_PMU (ppc PMU registers)");
16918       case NT_PPC_TM_CGPR:
16919         return _("NT_PPC_TM_CGPR (ppc checkpointed GPR registers)");
16920       case NT_PPC_TM_CFPR:
16921         return _("NT_PPC_TM_CFPR (ppc checkpointed floating point registers)");
16922       case NT_PPC_TM_CVMX:
16923         return _("NT_PPC_TM_CVMX (ppc checkpointed Altivec registers)");
16924       case NT_PPC_TM_CVSX:
16925         return _("NT_PPC_TM_CVSX (ppc checkpointed VSX registers)");
16926       case NT_PPC_TM_SPR:
16927         return _("NT_PPC_TM_SPR (ppc TM special purpose registers)");
16928       case NT_PPC_TM_CTAR:
16929         return _("NT_PPC_TM_CTAR (ppc checkpointed TAR register)");
16930       case NT_PPC_TM_CPPR:
16931         return _("NT_PPC_TM_CPPR (ppc checkpointed PPR register)");
16932       case NT_PPC_TM_CDSCR:
16933         return _("NT_PPC_TM_CDSCR (ppc checkpointed DSCR register)");
16934       case NT_386_TLS:
16935         return _("NT_386_TLS (x86 TLS information)");
16936       case NT_386_IOPERM:
16937         return _("NT_386_IOPERM (x86 I/O permissions)");
16938       case NT_X86_XSTATE:
16939         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
16940       case NT_S390_HIGH_GPRS:
16941         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
16942       case NT_S390_TIMER:
16943         return _("NT_S390_TIMER (s390 timer register)");
16944       case NT_S390_TODCMP:
16945         return _("NT_S390_TODCMP (s390 TOD comparator register)");
16946       case NT_S390_TODPREG:
16947         return _("NT_S390_TODPREG (s390 TOD programmable register)");
16948       case NT_S390_CTRS:
16949         return _("NT_S390_CTRS (s390 control registers)");
16950       case NT_S390_PREFIX:
16951         return _("NT_S390_PREFIX (s390 prefix register)");
16952       case NT_S390_LAST_BREAK:
16953         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
16954       case NT_S390_SYSTEM_CALL:
16955         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
16956       case NT_S390_TDB:
16957         return _("NT_S390_TDB (s390 transaction diagnostic block)");
16958       case NT_S390_VXRS_LOW:
16959         return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
16960       case NT_S390_VXRS_HIGH:
16961         return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
16962       case NT_S390_GS_CB:
16963         return _("NT_S390_GS_CB (s390 guarded-storage registers)");
16964       case NT_S390_GS_BC:
16965         return _("NT_S390_GS_BC (s390 guarded-storage broadcast control)");
16966       case NT_ARM_VFP:
16967         return _("NT_ARM_VFP (arm VFP registers)");
16968       case NT_ARM_TLS:
16969         return _("NT_ARM_TLS (AArch TLS registers)");
16970       case NT_ARM_HW_BREAK:
16971         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
16972       case NT_ARM_HW_WATCH:
16973         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
16974       case NT_PSTATUS:
16975         return _("NT_PSTATUS (pstatus structure)");
16976       case NT_FPREGS:
16977         return _("NT_FPREGS (floating point registers)");
16978       case NT_PSINFO:
16979         return _("NT_PSINFO (psinfo structure)");
16980       case NT_LWPSTATUS:
16981         return _("NT_LWPSTATUS (lwpstatus_t structure)");
16982       case NT_LWPSINFO:
16983         return _("NT_LWPSINFO (lwpsinfo_t structure)");
16984       case NT_WIN32PSTATUS:
16985         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
16986       case NT_SIGINFO:
16987         return _("NT_SIGINFO (siginfo_t data)");
16988       case NT_FILE:
16989         return _("NT_FILE (mapped files)");
16990       default:
16991         break;
16992       }
16993   else
16994     switch (e_type)
16995       {
16996       case NT_VERSION:
16997         return _("NT_VERSION (version)");
16998       case NT_ARCH:
16999         return _("NT_ARCH (architecture)");
17000       case NT_GNU_BUILD_ATTRIBUTE_OPEN:
17001         return _("OPEN");
17002       case NT_GNU_BUILD_ATTRIBUTE_FUNC:
17003         return _("func");
17004       default:
17005         break;
17006       }
17007
17008   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17009   return buff;
17010 }
17011
17012 static bfd_boolean
17013 print_core_note (Elf_Internal_Note *pnote)
17014 {
17015   unsigned int addr_size = is_32bit_elf ? 4 : 8;
17016   bfd_vma count, page_size;
17017   unsigned char *descdata, *filenames, *descend;
17018
17019   if (pnote->type != NT_FILE)
17020     {
17021       if (do_wide)
17022         printf ("\n");
17023       return TRUE;
17024     }
17025
17026 #ifndef BFD64
17027   if (!is_32bit_elf)
17028     {
17029       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
17030       /* Still "successful".  */
17031       return TRUE;
17032     }
17033 #endif
17034
17035   if (pnote->descsz < 2 * addr_size)
17036     {
17037       error (_("    Malformed note - too short for header\n"));
17038       return FALSE;
17039     }
17040
17041   descdata = (unsigned char *) pnote->descdata;
17042   descend = descdata + pnote->descsz;
17043
17044   if (descdata[pnote->descsz - 1] != '\0')
17045     {
17046       error (_("    Malformed note - does not end with \\0\n"));
17047       return FALSE;
17048     }
17049
17050   count = byte_get (descdata, addr_size);
17051   descdata += addr_size;
17052
17053   page_size = byte_get (descdata, addr_size);
17054   descdata += addr_size;
17055
17056   if (count > ((bfd_vma) -1 - 2 * addr_size) / (3 * addr_size)
17057       || pnote->descsz < 2 * addr_size + count * 3 * addr_size)
17058     {
17059       error (_("    Malformed note - too short for supplied file count\n"));
17060       return FALSE;
17061     }
17062
17063   printf (_("    Page size: "));
17064   print_vma (page_size, DEC);
17065   printf ("\n");
17066
17067   printf (_("    %*s%*s%*s\n"),
17068           (int) (2 + 2 * addr_size), _("Start"),
17069           (int) (4 + 2 * addr_size), _("End"),
17070           (int) (4 + 2 * addr_size), _("Page Offset"));
17071   filenames = descdata + count * 3 * addr_size;
17072   while (count-- > 0)
17073     {
17074       bfd_vma start, end, file_ofs;
17075
17076       if (filenames == descend)
17077         {
17078           error (_("    Malformed note - filenames end too early\n"));
17079           return FALSE;
17080         }
17081
17082       start = byte_get (descdata, addr_size);
17083       descdata += addr_size;
17084       end = byte_get (descdata, addr_size);
17085       descdata += addr_size;
17086       file_ofs = byte_get (descdata, addr_size);
17087       descdata += addr_size;
17088
17089       printf ("    ");
17090       print_vma (start, FULL_HEX);
17091       printf ("  ");
17092       print_vma (end, FULL_HEX);
17093       printf ("  ");
17094       print_vma (file_ofs, FULL_HEX);
17095       printf ("\n        %s\n", filenames);
17096
17097       filenames += 1 + strlen ((char *) filenames);
17098     }
17099
17100   return TRUE;
17101 }
17102
17103 static const char *
17104 get_gnu_elf_note_type (unsigned e_type)
17105 {
17106   /* NB/ Keep this switch statement in sync with print_gnu_note ().  */
17107   switch (e_type)
17108     {
17109     case NT_GNU_ABI_TAG:
17110       return _("NT_GNU_ABI_TAG (ABI version tag)");
17111     case NT_GNU_HWCAP:
17112       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
17113     case NT_GNU_BUILD_ID:
17114       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
17115     case NT_GNU_GOLD_VERSION:
17116       return _("NT_GNU_GOLD_VERSION (gold version)");
17117     case NT_GNU_PROPERTY_TYPE_0:
17118       return _("NT_GNU_PROPERTY_TYPE_0");
17119     case NT_GNU_BUILD_ATTRIBUTE_OPEN:
17120       return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
17121     case NT_GNU_BUILD_ATTRIBUTE_FUNC:
17122       return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
17123     default:
17124       {
17125         static char buff[64];
17126
17127         snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17128         return buff;
17129       }
17130     }
17131 }
17132
17133 static void
17134 decode_x86_compat_isa (unsigned int bitmask)
17135 {
17136   while (bitmask)
17137     {
17138       unsigned int bit = bitmask & (- bitmask);
17139
17140       bitmask &= ~ bit;
17141       switch (bit)
17142         {
17143         case GNU_PROPERTY_X86_COMPAT_ISA_1_486:
17144           printf ("i486");
17145           break;
17146         case GNU_PROPERTY_X86_COMPAT_ISA_1_586:
17147           printf ("586");
17148           break;
17149         case GNU_PROPERTY_X86_COMPAT_ISA_1_686:
17150           printf ("686");
17151           break;
17152         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE:
17153           printf ("SSE");
17154           break;
17155         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE2:
17156           printf ("SSE2");
17157           break;
17158         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE3:
17159           printf ("SSE3");
17160           break;
17161         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSSE3:
17162           printf ("SSSE3");
17163           break;
17164         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_1:
17165           printf ("SSE4_1");
17166           break;
17167         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_2:
17168           printf ("SSE4_2");
17169           break;
17170         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX:
17171           printf ("AVX");
17172           break;
17173         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX2:
17174           printf ("AVX2");
17175           break;
17176         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512F:
17177           printf ("AVX512F");
17178           break;
17179         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512CD:
17180           printf ("AVX512CD");
17181           break;
17182         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512ER:
17183           printf ("AVX512ER");
17184           break;
17185         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512PF:
17186           printf ("AVX512PF");
17187           break;
17188         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512VL:
17189           printf ("AVX512VL");
17190           break;
17191         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512DQ:
17192           printf ("AVX512DQ");
17193           break;
17194         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512BW:
17195           printf ("AVX512BW");
17196           break;
17197         default:
17198           printf (_("<unknown: %x>"), bit);
17199           break;
17200         }
17201       if (bitmask)
17202         printf (", ");
17203     }
17204 }
17205
17206 static void
17207 decode_x86_isa (unsigned int bitmask)
17208 {
17209   if (!bitmask)
17210     {
17211       printf (_("<None>"));
17212       return;
17213     }
17214
17215   while (bitmask)
17216     {
17217       unsigned int bit = bitmask & (- bitmask);
17218
17219       bitmask &= ~ bit;
17220       switch (bit)
17221         {
17222         case GNU_PROPERTY_X86_ISA_1_CMOV:
17223           printf ("CMOV");
17224           break;
17225         case GNU_PROPERTY_X86_ISA_1_SSE:
17226           printf ("SSE");
17227           break;
17228         case GNU_PROPERTY_X86_ISA_1_SSE2:
17229           printf ("SSE2");
17230           break;
17231         case GNU_PROPERTY_X86_ISA_1_SSE3:
17232           printf ("SSE3");
17233           break;
17234         case GNU_PROPERTY_X86_ISA_1_SSSE3:
17235           printf ("SSSE3");
17236           break;
17237         case GNU_PROPERTY_X86_ISA_1_SSE4_1:
17238           printf ("SSE4_1");
17239           break;
17240         case GNU_PROPERTY_X86_ISA_1_SSE4_2:
17241           printf ("SSE4_2");
17242           break;
17243         case GNU_PROPERTY_X86_ISA_1_AVX:
17244           printf ("AVX");
17245           break;
17246         case GNU_PROPERTY_X86_ISA_1_AVX2:
17247           printf ("AVX2");
17248           break;
17249         case GNU_PROPERTY_X86_ISA_1_FMA:
17250           printf ("FMA");
17251           break;
17252         case GNU_PROPERTY_X86_ISA_1_AVX512F:
17253           printf ("AVX512F");
17254           break;
17255         case GNU_PROPERTY_X86_ISA_1_AVX512CD:
17256           printf ("AVX512CD");
17257           break;
17258         case GNU_PROPERTY_X86_ISA_1_AVX512ER:
17259           printf ("AVX512ER");
17260           break;
17261         case GNU_PROPERTY_X86_ISA_1_AVX512PF:
17262           printf ("AVX512PF");
17263           break;
17264         case GNU_PROPERTY_X86_ISA_1_AVX512VL:
17265           printf ("AVX512VL");
17266           break;
17267         case GNU_PROPERTY_X86_ISA_1_AVX512DQ:
17268           printf ("AVX512DQ");
17269           break;
17270         case GNU_PROPERTY_X86_ISA_1_AVX512BW:
17271           printf ("AVX512BW");
17272           break;
17273         case GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS:
17274           printf ("AVX512_4FMAPS");
17275           break;
17276         case GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW:
17277           printf ("AVX512_4VNNIW");
17278           break;
17279         case GNU_PROPERTY_X86_ISA_1_AVX512_BITALG:
17280           printf ("AVX512_BITALG");
17281           break;
17282         case GNU_PROPERTY_X86_ISA_1_AVX512_IFMA:
17283           printf ("AVX512_IFMA");
17284           break;
17285         case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI:
17286           printf ("AVX512_VBMI");
17287           break;
17288         case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2:
17289           printf ("AVX512_VBMI2");
17290           break;
17291         case GNU_PROPERTY_X86_ISA_1_AVX512_VNNI:
17292           printf ("AVX512_VNNI");
17293           break;
17294         case GNU_PROPERTY_X86_ISA_1_AVX512_BF16:
17295           printf ("AVX512_BF16");
17296           break;
17297         default:
17298           printf (_("<unknown: %x>"), bit);
17299           break;
17300         }
17301       if (bitmask)
17302         printf (", ");
17303     }
17304 }
17305
17306 static void
17307 decode_x86_feature_1 (unsigned int bitmask)
17308 {
17309   if (!bitmask)
17310     {
17311       printf (_("<None>"));
17312       return;
17313     }
17314
17315   while (bitmask)
17316     {
17317       unsigned int bit = bitmask & (- bitmask);
17318
17319       bitmask &= ~ bit;
17320       switch (bit)
17321         {
17322         case GNU_PROPERTY_X86_FEATURE_1_IBT:
17323           printf ("IBT");
17324           break;
17325         case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
17326           printf ("SHSTK");
17327           break;
17328         default:
17329           printf (_("<unknown: %x>"), bit);
17330           break;
17331         }
17332       if (bitmask)
17333         printf (", ");
17334     }
17335 }
17336
17337 static void
17338 decode_x86_feature_2 (unsigned int bitmask)
17339 {
17340   if (!bitmask)
17341     {
17342       printf (_("<None>"));
17343       return;
17344     }
17345
17346   while (bitmask)
17347     {
17348       unsigned int bit = bitmask & (- bitmask);
17349
17350       bitmask &= ~ bit;
17351       switch (bit)
17352         {
17353         case GNU_PROPERTY_X86_FEATURE_2_X86:
17354           printf ("x86");
17355           break;
17356         case GNU_PROPERTY_X86_FEATURE_2_X87:
17357           printf ("x87");
17358           break;
17359         case GNU_PROPERTY_X86_FEATURE_2_MMX:
17360           printf ("MMX");
17361           break;
17362         case GNU_PROPERTY_X86_FEATURE_2_XMM:
17363           printf ("XMM");
17364           break;
17365         case GNU_PROPERTY_X86_FEATURE_2_YMM:
17366           printf ("YMM");
17367           break;
17368         case GNU_PROPERTY_X86_FEATURE_2_ZMM:
17369           printf ("ZMM");
17370           break;
17371         case GNU_PROPERTY_X86_FEATURE_2_FXSR:
17372           printf ("FXSR");
17373           break;
17374         case GNU_PROPERTY_X86_FEATURE_2_XSAVE:
17375           printf ("XSAVE");
17376           break;
17377         case GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT:
17378           printf ("XSAVEOPT");
17379           break;
17380         case GNU_PROPERTY_X86_FEATURE_2_XSAVEC:
17381           printf ("XSAVEC");
17382           break;
17383         default:
17384           printf (_("<unknown: %x>"), bit);
17385           break;
17386         }
17387       if (bitmask)
17388         printf (", ");
17389     }
17390 }
17391
17392 static void
17393 decode_aarch64_feature_1_and (unsigned int bitmask)
17394 {
17395   while (bitmask)
17396     {
17397       unsigned int bit = bitmask & (- bitmask);
17398
17399       bitmask &= ~ bit;
17400       switch (bit)
17401         {
17402         case GNU_PROPERTY_AARCH64_FEATURE_1_BTI:
17403           printf ("BTI");
17404           break;
17405
17406         case GNU_PROPERTY_AARCH64_FEATURE_1_PAC:
17407           printf ("PAC");
17408           break;
17409
17410         default:
17411           printf (_("<unknown: %x>"), bit);
17412           break;
17413         }
17414       if (bitmask)
17415         printf (", ");
17416     }
17417 }
17418
17419 static void
17420 print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
17421 {
17422   unsigned char * ptr = (unsigned char *) pnote->descdata;
17423   unsigned char * ptr_end = ptr + pnote->descsz;
17424   unsigned int    size = is_32bit_elf ? 4 : 8;
17425
17426   printf (_("      Properties: "));
17427
17428   if (pnote->descsz < 8 || (pnote->descsz % size) != 0)
17429     {
17430       printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz);
17431       return;
17432     }
17433
17434   while (ptr < ptr_end)
17435     {
17436       unsigned int j;
17437       unsigned int type;
17438       unsigned int datasz;
17439
17440       if ((size_t) (ptr_end - ptr) < 8)
17441         {
17442           printf (_("<corrupt descsz: %#lx>\n"), pnote->descsz);
17443           break;
17444         }
17445
17446       type = byte_get (ptr, 4);
17447       datasz = byte_get (ptr + 4, 4);
17448
17449       ptr += 8;
17450
17451       if (datasz > (size_t) (ptr_end - ptr))
17452         {
17453           printf (_("<corrupt type (%#x) datasz: %#x>\n"),
17454                   type, datasz);
17455           break;
17456         }
17457
17458       if (type >= GNU_PROPERTY_LOPROC && type <= GNU_PROPERTY_HIPROC)
17459         {
17460           if (filedata->file_header.e_machine == EM_X86_64
17461               || filedata->file_header.e_machine == EM_IAMCU
17462               || filedata->file_header.e_machine == EM_386)
17463             {
17464               unsigned int bitmask;
17465
17466               if (datasz == 4)
17467                 bitmask = byte_get (ptr, 4);
17468               else
17469                 bitmask = 0;
17470
17471               switch (type)
17472                 {
17473                 case GNU_PROPERTY_X86_ISA_1_USED:
17474                   if (datasz != 4)
17475                     printf (_("x86 ISA used: <corrupt length: %#x> "),
17476                             datasz);
17477                   else
17478                     {
17479                       printf ("x86 ISA used: ");
17480                       decode_x86_isa (bitmask);
17481                     }
17482                   goto next;
17483
17484                 case GNU_PROPERTY_X86_ISA_1_NEEDED:
17485                   if (datasz != 4)
17486                     printf (_("x86 ISA needed: <corrupt length: %#x> "),
17487                             datasz);
17488                   else
17489                     {
17490                       printf ("x86 ISA needed: ");
17491                       decode_x86_isa (bitmask);
17492                     }
17493                   goto next;
17494
17495                 case GNU_PROPERTY_X86_FEATURE_1_AND:
17496                   if (datasz != 4)
17497                     printf (_("x86 feature: <corrupt length: %#x> "),
17498                             datasz);
17499                   else
17500                     {
17501                       printf ("x86 feature: ");
17502                       decode_x86_feature_1 (bitmask);
17503                     }
17504                   goto next;
17505
17506                 case GNU_PROPERTY_X86_FEATURE_2_USED:
17507                   if (datasz != 4)
17508                     printf (_("x86 feature used: <corrupt length: %#x> "),
17509                             datasz);
17510                   else
17511                     {
17512                       printf ("x86 feature used: ");
17513                       decode_x86_feature_2 (bitmask);
17514                     }
17515                   goto next;
17516
17517                 case GNU_PROPERTY_X86_FEATURE_2_NEEDED:
17518                   if (datasz != 4)
17519                     printf (_("x86 feature needed: <corrupt length: %#x> "), datasz);
17520                   else
17521                     {
17522                       printf ("x86 feature needed: ");
17523                       decode_x86_feature_2 (bitmask);
17524                     }
17525                   goto next;
17526
17527                 case GNU_PROPERTY_X86_COMPAT_ISA_1_USED:
17528                   if (datasz != 4)
17529                     printf (_("x86 ISA used: <corrupt length: %#x> "),
17530                             datasz);
17531                   else
17532                     {
17533                       printf ("x86 ISA used: ");
17534                       decode_x86_compat_isa (bitmask);
17535                     }
17536                   goto next;
17537
17538                 case GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED:
17539                   if (datasz != 4)
17540                     printf (_("x86 ISA needed: <corrupt length: %#x> "),
17541                             datasz);
17542                   else
17543                     {
17544                       printf ("x86 ISA needed: ");
17545                       decode_x86_compat_isa (bitmask);
17546                     }
17547                   goto next;
17548
17549                 default:
17550                   break;
17551                 }
17552             }
17553           else if (filedata->file_header.e_machine == EM_AARCH64)
17554             {
17555               if (type == GNU_PROPERTY_AARCH64_FEATURE_1_AND)
17556                 {
17557                   printf ("AArch64 feature: ");
17558                   if (datasz != 4)
17559                     printf (_("<corrupt length: %#x> "), datasz);
17560                   else
17561                     decode_aarch64_feature_1_and (byte_get (ptr, 4));
17562                   goto next;
17563                 }
17564             }
17565         }
17566       else
17567         {
17568           switch (type)
17569             {
17570             case GNU_PROPERTY_STACK_SIZE:
17571               printf (_("stack size: "));
17572               if (datasz != size)
17573                 printf (_("<corrupt length: %#x> "), datasz);
17574               else
17575                 printf ("%#lx", (unsigned long) byte_get (ptr, size));
17576               goto next;
17577
17578             case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
17579               printf ("no copy on protected ");
17580               if (datasz)
17581                 printf (_("<corrupt length: %#x> "), datasz);
17582               goto next;
17583
17584             default:
17585               break;
17586             }
17587         }
17588
17589       if (type < GNU_PROPERTY_LOPROC)
17590         printf (_("<unknown type %#x data: "), type);
17591       else if (type < GNU_PROPERTY_LOUSER)
17592         printf (_("<procesor-specific type %#x data: "), type);
17593       else
17594         printf (_("<application-specific type %#x data: "), type);
17595       for (j = 0; j < datasz; ++j)
17596         printf ("%02x ", ptr[j] & 0xff);
17597       printf (">");
17598
17599 next:
17600       ptr += ((datasz + (size - 1)) & ~ (size - 1));
17601       if (ptr == ptr_end)
17602         break;
17603
17604       if (do_wide)
17605         printf (", ");
17606       else
17607         printf ("\n\t");
17608     }
17609
17610   printf ("\n");
17611 }
17612
17613 static bfd_boolean
17614 print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
17615 {
17616   /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type ().  */
17617   switch (pnote->type)
17618     {
17619     case NT_GNU_BUILD_ID:
17620       {
17621         unsigned long i;
17622
17623         printf (_("    Build ID: "));
17624         for (i = 0; i < pnote->descsz; ++i)
17625           printf ("%02x", pnote->descdata[i] & 0xff);
17626         printf ("\n");
17627       }
17628       break;
17629
17630     case NT_GNU_ABI_TAG:
17631       {
17632         unsigned long os, major, minor, subminor;
17633         const char *osname;
17634
17635         /* PR 17531: file: 030-599401-0.004.  */
17636         if (pnote->descsz < 16)
17637           {
17638             printf (_("    <corrupt GNU_ABI_TAG>\n"));
17639             break;
17640           }
17641
17642         os = byte_get ((unsigned char *) pnote->descdata, 4);
17643         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17644         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
17645         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
17646
17647         switch (os)
17648           {
17649           case GNU_ABI_TAG_LINUX:
17650             osname = "Linux";
17651             break;
17652           case GNU_ABI_TAG_HURD:
17653             osname = "Hurd";
17654             break;
17655           case GNU_ABI_TAG_SOLARIS:
17656             osname = "Solaris";
17657             break;
17658           case GNU_ABI_TAG_FREEBSD:
17659             osname = "FreeBSD";
17660             break;
17661           case GNU_ABI_TAG_NETBSD:
17662             osname = "NetBSD";
17663             break;
17664           case GNU_ABI_TAG_SYLLABLE:
17665             osname = "Syllable";
17666             break;
17667           case GNU_ABI_TAG_NACL:
17668             osname = "NaCl";
17669             break;
17670           default:
17671             osname = "Unknown";
17672             break;
17673           }
17674
17675         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
17676                 major, minor, subminor);
17677       }
17678       break;
17679
17680     case NT_GNU_GOLD_VERSION:
17681       {
17682         unsigned long i;
17683
17684         printf (_("    Version: "));
17685         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
17686           printf ("%c", pnote->descdata[i]);
17687         printf ("\n");
17688       }
17689       break;
17690
17691     case NT_GNU_HWCAP:
17692       {
17693         unsigned long num_entries, mask;
17694
17695         /* Hardware capabilities information.  Word 0 is the number of entries.
17696            Word 1 is a bitmask of enabled entries.  The rest of the descriptor
17697            is a series of entries, where each entry is a single byte followed
17698            by a nul terminated string.  The byte gives the bit number to test
17699            if enabled in the bitmask.  */
17700         printf (_("      Hardware Capabilities: "));
17701         if (pnote->descsz < 8)
17702           {
17703             error (_("<corrupt GNU_HWCAP>\n"));
17704             return FALSE;
17705           }
17706         num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
17707         mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17708         printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
17709         /* FIXME: Add code to display the entries... */
17710       }
17711       break;
17712
17713     case NT_GNU_PROPERTY_TYPE_0:
17714       print_gnu_property_note (filedata, pnote);
17715       break;
17716       
17717     default:
17718       /* Handle unrecognised types.  An error message should have already been
17719          created by get_gnu_elf_note_type(), so all that we need to do is to
17720          display the data.  */
17721       {
17722         unsigned long i;
17723
17724         printf (_("    Description data: "));
17725         for (i = 0; i < pnote->descsz; ++i)
17726           printf ("%02x ", pnote->descdata[i] & 0xff);
17727         printf ("\n");
17728       }
17729       break;
17730     }
17731
17732   return TRUE;
17733 }
17734
17735 static const char *
17736 get_v850_elf_note_type (enum v850_notes n_type)
17737 {
17738   static char buff[64];
17739
17740   switch (n_type)
17741     {
17742     case V850_NOTE_ALIGNMENT:  return _("Alignment of 8-byte objects");
17743     case V850_NOTE_DATA_SIZE:  return _("Sizeof double and long double");
17744     case V850_NOTE_FPU_INFO:   return _("Type of FPU support needed");
17745     case V850_NOTE_SIMD_INFO:  return _("Use of SIMD instructions");
17746     case V850_NOTE_CACHE_INFO: return _("Use of cache");
17747     case V850_NOTE_MMU_INFO:   return _("Use of MMU");
17748     default:
17749       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
17750       return buff;
17751     }
17752 }
17753
17754 static bfd_boolean
17755 print_v850_note (Elf_Internal_Note * pnote)
17756 {
17757   unsigned int val;
17758
17759   if (pnote->descsz != 4)
17760     return FALSE;
17761
17762   val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
17763
17764   if (val == 0)
17765     {
17766       printf (_("not set\n"));
17767       return TRUE;
17768     }
17769
17770   switch (pnote->type)
17771     {
17772     case V850_NOTE_ALIGNMENT:
17773       switch (val)
17774         {
17775         case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return TRUE;
17776         case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return TRUE;
17777         }
17778       break;
17779
17780     case V850_NOTE_DATA_SIZE:
17781       switch (val)
17782         {
17783         case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return TRUE;
17784         case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return TRUE;
17785         }
17786       break;
17787
17788     case V850_NOTE_FPU_INFO:
17789       switch (val)
17790         {
17791         case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return TRUE;
17792         case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return TRUE;
17793         }
17794       break;
17795
17796     case V850_NOTE_MMU_INFO:
17797     case V850_NOTE_CACHE_INFO:
17798     case V850_NOTE_SIMD_INFO:
17799       if (val == EF_RH850_SIMD)
17800         {
17801           printf (_("yes\n"));
17802           return TRUE;
17803         }
17804       break;
17805
17806     default:
17807       /* An 'unknown note type' message will already have been displayed.  */
17808       break;
17809     }
17810
17811   printf (_("unknown value: %x\n"), val);
17812   return FALSE;
17813 }
17814
17815 static bfd_boolean
17816 process_netbsd_elf_note (Elf_Internal_Note * pnote)
17817 {
17818   unsigned int version;
17819
17820   switch (pnote->type)
17821     {
17822     case NT_NETBSD_IDENT:
17823       version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
17824       if ((version / 10000) % 100)
17825         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
17826                 version, version / 100000000, (version / 1000000) % 100,
17827                 (version / 10000) % 100 > 26 ? "Z" : "",
17828                 'A' + (version / 10000) % 26);
17829       else
17830         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
17831                 version, version / 100000000, (version / 1000000) % 100,
17832                 (version / 100) % 100);
17833       return TRUE;
17834
17835     case NT_NETBSD_MARCH:
17836       printf ("  NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
17837               pnote->descdata);
17838       return TRUE;
17839
17840     default:
17841       printf ("  NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
17842               pnote->type);
17843       return FALSE;
17844     }
17845 }
17846
17847 static const char *
17848 get_freebsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17849 {
17850   switch (e_type)
17851     {
17852     case NT_FREEBSD_THRMISC:
17853       return _("NT_THRMISC (thrmisc structure)");
17854     case NT_FREEBSD_PROCSTAT_PROC:
17855       return _("NT_PROCSTAT_PROC (proc data)");
17856     case NT_FREEBSD_PROCSTAT_FILES:
17857       return _("NT_PROCSTAT_FILES (files data)");
17858     case NT_FREEBSD_PROCSTAT_VMMAP:
17859       return _("NT_PROCSTAT_VMMAP (vmmap data)");
17860     case NT_FREEBSD_PROCSTAT_GROUPS:
17861       return _("NT_PROCSTAT_GROUPS (groups data)");
17862     case NT_FREEBSD_PROCSTAT_UMASK:
17863       return _("NT_PROCSTAT_UMASK (umask data)");
17864     case NT_FREEBSD_PROCSTAT_RLIMIT:
17865       return _("NT_PROCSTAT_RLIMIT (rlimit data)");
17866     case NT_FREEBSD_PROCSTAT_OSREL:
17867       return _("NT_PROCSTAT_OSREL (osreldate data)");
17868     case NT_FREEBSD_PROCSTAT_PSSTRINGS:
17869       return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
17870     case NT_FREEBSD_PROCSTAT_AUXV:
17871       return _("NT_PROCSTAT_AUXV (auxv data)");
17872     case NT_FREEBSD_PTLWPINFO:
17873       return _("NT_PTLWPINFO (ptrace_lwpinfo structure)");
17874     }
17875   return get_note_type (filedata, e_type);
17876 }
17877
17878 static const char *
17879 get_netbsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17880 {
17881   static char buff[64];
17882
17883   if (e_type == NT_NETBSDCORE_PROCINFO)
17884     return _("NetBSD procinfo structure");
17885
17886   /* As of Jan 2002 there are no other machine-independent notes
17887      defined for NetBSD core files.  If the note type is less
17888      than the start of the machine-dependent note types, we don't
17889      understand it.  */
17890
17891   if (e_type < NT_NETBSDCORE_FIRSTMACH)
17892     {
17893       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17894       return buff;
17895     }
17896
17897   switch (filedata->file_header.e_machine)
17898     {
17899     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
17900        and PT_GETFPREGS == mach+2.  */
17901
17902     case EM_OLD_ALPHA:
17903     case EM_ALPHA:
17904     case EM_SPARC:
17905     case EM_SPARC32PLUS:
17906     case EM_SPARCV9:
17907       switch (e_type)
17908         {
17909         case NT_NETBSDCORE_FIRSTMACH + 0:
17910           return _("PT_GETREGS (reg structure)");
17911         case NT_NETBSDCORE_FIRSTMACH + 2:
17912           return _("PT_GETFPREGS (fpreg structure)");
17913         default:
17914           break;
17915         }
17916       break;
17917
17918     /* On all other arch's, PT_GETREGS == mach+1 and
17919        PT_GETFPREGS == mach+3.  */
17920     default:
17921       switch (e_type)
17922         {
17923         case NT_NETBSDCORE_FIRSTMACH + 1:
17924           return _("PT_GETREGS (reg structure)");
17925         case NT_NETBSDCORE_FIRSTMACH + 3:
17926           return _("PT_GETFPREGS (fpreg structure)");
17927         default:
17928           break;
17929         }
17930     }
17931
17932   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
17933             e_type - NT_NETBSDCORE_FIRSTMACH);
17934   return buff;
17935 }
17936
17937 static const char *
17938 get_stapsdt_note_type (unsigned e_type)
17939 {
17940   static char buff[64];
17941
17942   switch (e_type)
17943     {
17944     case NT_STAPSDT:
17945       return _("NT_STAPSDT (SystemTap probe descriptors)");
17946
17947     default:
17948       break;
17949     }
17950
17951   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17952   return buff;
17953 }
17954
17955 static bfd_boolean
17956 print_stapsdt_note (Elf_Internal_Note *pnote)
17957 {
17958   size_t len, maxlen;
17959   unsigned long addr_size = is_32bit_elf ? 4 : 8;
17960   char *data = pnote->descdata;
17961   char *data_end = pnote->descdata + pnote->descsz;
17962   bfd_vma pc, base_addr, semaphore;
17963   char *provider, *probe, *arg_fmt;
17964
17965   if (pnote->descsz < (addr_size * 3))
17966     goto stapdt_note_too_small;
17967
17968   pc = byte_get ((unsigned char *) data, addr_size);
17969   data += addr_size;
17970
17971   base_addr = byte_get ((unsigned char *) data, addr_size);
17972   data += addr_size;
17973
17974   semaphore = byte_get ((unsigned char *) data, addr_size);
17975   data += addr_size;
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       provider = 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       probe = data;
17996       data += len + 1;
17997     }
17998   else
17999     goto stapdt_note_too_small;
18000   
18001   if (data >= data_end)
18002     goto stapdt_note_too_small;
18003   maxlen = data_end - data;
18004   len = strnlen (data, maxlen);
18005   if (len < maxlen)
18006     {
18007       arg_fmt = data;
18008       data += len + 1;
18009     }
18010   else
18011     goto stapdt_note_too_small;
18012
18013   printf (_("    Provider: %s\n"), provider);
18014   printf (_("    Name: %s\n"), probe);
18015   printf (_("    Location: "));
18016   print_vma (pc, FULL_HEX);
18017   printf (_(", Base: "));
18018   print_vma (base_addr, FULL_HEX);
18019   printf (_(", Semaphore: "));
18020   print_vma (semaphore, FULL_HEX);
18021   printf ("\n");
18022   printf (_("    Arguments: %s\n"), arg_fmt);
18023
18024   return data == data_end;
18025
18026  stapdt_note_too_small:
18027   printf (_("  <corrupt - note is too small>\n"));
18028   error (_("corrupt stapdt note - the data size is too small\n"));
18029   return FALSE;
18030 }
18031
18032 static const char *
18033 get_ia64_vms_note_type (unsigned e_type)
18034 {
18035   static char buff[64];
18036
18037   switch (e_type)
18038     {
18039     case NT_VMS_MHD:
18040       return _("NT_VMS_MHD (module header)");
18041     case NT_VMS_LNM:
18042       return _("NT_VMS_LNM (language name)");
18043     case NT_VMS_SRC:
18044       return _("NT_VMS_SRC (source files)");
18045     case NT_VMS_TITLE:
18046       return "NT_VMS_TITLE";
18047     case NT_VMS_EIDC:
18048       return _("NT_VMS_EIDC (consistency check)");
18049     case NT_VMS_FPMODE:
18050       return _("NT_VMS_FPMODE (FP mode)");
18051     case NT_VMS_LINKTIME:
18052       return "NT_VMS_LINKTIME";
18053     case NT_VMS_IMGNAM:
18054       return _("NT_VMS_IMGNAM (image name)");
18055     case NT_VMS_IMGID:
18056       return _("NT_VMS_IMGID (image id)");
18057     case NT_VMS_LINKID:
18058       return _("NT_VMS_LINKID (link id)");
18059     case NT_VMS_IMGBID:
18060       return _("NT_VMS_IMGBID (build id)");
18061     case NT_VMS_GSTNAM:
18062       return _("NT_VMS_GSTNAM (sym table name)");
18063     case NT_VMS_ORIG_DYN:
18064       return "NT_VMS_ORIG_DYN";
18065     case NT_VMS_PATCHTIME:
18066       return "NT_VMS_PATCHTIME";
18067     default:
18068       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
18069       return buff;
18070     }
18071 }
18072
18073 static bfd_boolean
18074 print_ia64_vms_note (Elf_Internal_Note * pnote)
18075 {
18076   int maxlen = pnote->descsz;
18077
18078   if (maxlen < 2 || (unsigned long) maxlen != pnote->descsz)
18079     goto desc_size_fail;
18080
18081   switch (pnote->type)
18082     {
18083     case NT_VMS_MHD:
18084       if (maxlen <= 36)
18085         goto desc_size_fail;
18086
18087       int l = (int) strnlen (pnote->descdata + 34, maxlen - 34);
18088
18089       printf (_("    Creation date  : %.17s\n"), pnote->descdata);
18090       printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
18091       if (l + 34 < maxlen)
18092         {
18093           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
18094           if (l + 35 < maxlen)
18095             printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
18096           else
18097             printf (_("    Module version : <missing>\n"));
18098         }
18099       else
18100         {
18101           printf (_("    Module name    : <missing>\n"));
18102           printf (_("    Module version : <missing>\n"));
18103         }
18104       break;
18105
18106     case NT_VMS_LNM:
18107       printf (_("   Language: %.*s\n"), maxlen, pnote->descdata);
18108       break;
18109
18110 #ifdef BFD64
18111     case NT_VMS_FPMODE:
18112       printf (_("   Floating Point mode: "));
18113       if (maxlen < 8)
18114         goto desc_size_fail;
18115       /* FIXME: Generate an error if descsz > 8 ?  */
18116
18117       printf ("0x%016" BFD_VMA_FMT "x\n",
18118               (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
18119       break;
18120
18121     case NT_VMS_LINKTIME:
18122       printf (_("   Link time: "));
18123       if (maxlen < 8)
18124         goto desc_size_fail;
18125       /* FIXME: Generate an error if descsz > 8 ?  */
18126
18127       print_vms_time
18128         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
18129       printf ("\n");
18130       break;
18131
18132     case NT_VMS_PATCHTIME:
18133       printf (_("   Patch time: "));
18134       if (maxlen < 8)
18135         goto desc_size_fail;
18136       /* FIXME: Generate an error if descsz > 8 ?  */
18137
18138       print_vms_time
18139         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
18140       printf ("\n");
18141       break;
18142
18143     case NT_VMS_ORIG_DYN:
18144       if (maxlen < 34)
18145         goto desc_size_fail;
18146
18147       printf (_("   Major id: %u,  minor id: %u\n"),
18148               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
18149               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
18150       printf (_("   Last modified  : "));
18151       print_vms_time
18152         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
18153       printf (_("\n   Link flags  : "));
18154       printf ("0x%016" BFD_VMA_FMT "x\n",
18155               (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
18156       printf (_("   Header flags: 0x%08x\n"),
18157               (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
18158       printf (_("   Image id    : %.*s\n"), maxlen - 32, pnote->descdata + 32);
18159       break;
18160 #endif
18161
18162     case NT_VMS_IMGNAM:
18163       printf (_("    Image name: %.*s\n"), maxlen, pnote->descdata);
18164       break;
18165
18166     case NT_VMS_GSTNAM:
18167       printf (_("    Global symbol table name: %.*s\n"), maxlen, pnote->descdata);
18168       break;
18169
18170     case NT_VMS_IMGID:
18171       printf (_("    Image id: %.*s\n"), maxlen, pnote->descdata);
18172       break;
18173
18174     case NT_VMS_LINKID:
18175       printf (_("    Linker id: %.*s\n"), maxlen, pnote->descdata);
18176       break;
18177
18178     default:
18179       return FALSE;
18180     }
18181
18182   return TRUE;
18183
18184  desc_size_fail:
18185   printf (_("  <corrupt - data size is too small>\n"));
18186   error (_("corrupt IA64 note: data size is too small\n"));
18187   return FALSE;
18188 }
18189
18190 /* Find the symbol associated with a build attribute that is attached
18191    to address OFFSET.  If PNAME is non-NULL then store the name of
18192    the symbol (if found) in the provided pointer,  Returns NULL if a
18193    symbol could not be found.  */
18194
18195 static Elf_Internal_Sym *
18196 get_symbol_for_build_attribute (Filedata *       filedata,
18197                                 unsigned long    offset,
18198                                 bfd_boolean      is_open_attr,
18199                                 const char **    pname)
18200 {
18201   static Filedata *         saved_filedata = NULL;
18202   static char *             strtab;
18203   static unsigned long      strtablen;
18204   static Elf_Internal_Sym * symtab;
18205   static unsigned long      nsyms;
18206   Elf_Internal_Sym *        saved_sym = NULL;
18207   Elf_Internal_Sym *        sym;
18208
18209   if (filedata->section_headers != NULL
18210       && (saved_filedata == NULL || filedata != saved_filedata))
18211     {
18212       Elf_Internal_Shdr * symsec;
18213
18214       /* Load the symbol and string sections.  */
18215       for (symsec = filedata->section_headers;
18216            symsec < filedata->section_headers + filedata->file_header.e_shnum;
18217            symsec ++)
18218         {
18219           if (symsec->sh_type == SHT_SYMTAB)
18220             {
18221               symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
18222
18223               if (symsec->sh_link < filedata->file_header.e_shnum)
18224                 {
18225                   Elf_Internal_Shdr * strtab_sec = filedata->section_headers + symsec->sh_link;
18226
18227                   strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
18228                                               1, strtab_sec->sh_size,
18229                                               _("string table"));
18230                   strtablen = strtab != NULL ? strtab_sec->sh_size : 0;
18231                 }
18232             }
18233         }
18234       saved_filedata = filedata;
18235     }
18236
18237   if (symtab == NULL || strtab == NULL)
18238     return NULL;
18239
18240   /* Find a symbol whose value matches offset.  */
18241   for (sym = symtab; sym < symtab + nsyms; sym ++)
18242     if (sym->st_value == offset)
18243       {
18244         if (sym->st_name >= strtablen)
18245           /* Huh ?  This should not happen.  */
18246           continue;
18247
18248         if (strtab[sym->st_name] == 0)
18249           continue;
18250
18251         /* The AArch64 and ARM architectures define mapping symbols
18252            (eg $d, $x, $t) which we want to ignore.  */
18253         if (strtab[sym->st_name] == '$'
18254             && strtab[sym->st_name + 1] != 0
18255             && strtab[sym->st_name + 2] == 0)
18256           continue;
18257
18258         if (is_open_attr)
18259           {
18260             /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
18261                and FILE or OBJECT symbols over NOTYPE symbols.  We skip
18262                FUNC symbols entirely.  */
18263             switch (ELF_ST_TYPE (sym->st_info))
18264               {
18265               case STT_OBJECT:
18266               case STT_FILE:
18267                 saved_sym = sym;
18268                 if (sym->st_size)
18269                   {
18270                     /* If the symbol has a size associated
18271                        with it then we can stop searching.  */
18272                     sym = symtab + nsyms;
18273                   }
18274                 continue;
18275
18276               case STT_FUNC:
18277                 /* Ignore function symbols.  */
18278                 continue;
18279
18280               default:
18281                 break;
18282               }
18283
18284             switch (ELF_ST_BIND (sym->st_info))
18285               {
18286               case STB_GLOBAL:
18287                 if (saved_sym == NULL
18288                     || ELF_ST_TYPE (saved_sym->st_info) != STT_OBJECT)
18289                   saved_sym = sym;
18290                 break;
18291
18292               case STB_LOCAL:
18293                 if (saved_sym == NULL)
18294                   saved_sym = sym;
18295                 break;
18296
18297               default:
18298                 break;
18299               }
18300           }
18301         else
18302           {
18303             if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
18304               continue;
18305
18306             saved_sym = sym;
18307             break;
18308           }
18309       }
18310
18311   if (saved_sym && pname)
18312     * pname = strtab + saved_sym->st_name;
18313
18314   return saved_sym;
18315 }
18316
18317 /* Returns true iff addr1 and addr2 are in the same section.  */
18318
18319 static bfd_boolean
18320 same_section (Filedata * filedata, unsigned long addr1, unsigned long addr2)
18321 {
18322   Elf_Internal_Shdr * a1;
18323   Elf_Internal_Shdr * a2;
18324
18325   a1 = find_section_by_address (filedata, addr1);
18326   a2 = find_section_by_address (filedata, addr2);
18327   
18328   return a1 == a2 && a1 != NULL;
18329 }
18330
18331 static bfd_boolean
18332 print_gnu_build_attribute_description (Elf_Internal_Note *  pnote,
18333                                        Filedata *           filedata)
18334 {
18335   static unsigned long  global_offset = 0;
18336   static unsigned long  global_end = 0;
18337   static unsigned long  func_offset = 0;
18338   static unsigned long  func_end = 0;
18339
18340   Elf_Internal_Sym *    sym;
18341   const char *          name;
18342   unsigned long         start;
18343   unsigned long         end;
18344   bfd_boolean           is_open_attr = pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN;
18345
18346   switch (pnote->descsz)
18347     {
18348     case 0:
18349       /* A zero-length description means that the range of
18350          the previous note of the same type should be used.  */
18351       if (is_open_attr)
18352         {
18353           if (global_end > global_offset)
18354             printf (_("    Applies to region from %#lx to %#lx\n"),
18355                     global_offset, global_end);
18356           else
18357             printf (_("    Applies to region from %#lx\n"), global_offset);
18358         }
18359       else
18360         {
18361           if (func_end > func_offset)
18362             printf (_("    Applies to region from %#lx to %#lx\n"), func_offset, func_end);
18363           else
18364             printf (_("    Applies to region from %#lx\n"), func_offset);
18365         }
18366       return TRUE;
18367
18368     case 4:
18369       start = byte_get ((unsigned char *) pnote->descdata, 4);
18370       end = 0;
18371       break;
18372
18373     case 8:
18374       if (is_32bit_elf)
18375         {
18376           /* FIXME: We should check that version 3+ notes are being used here...  */
18377           start = byte_get ((unsigned char *) pnote->descdata, 4);
18378           end = byte_get ((unsigned char *) pnote->descdata + 4, 4);
18379         }
18380       else
18381         {
18382           start = byte_get ((unsigned char *) pnote->descdata, 8);
18383           end = 0;
18384         }
18385       break;
18386
18387     case 16:
18388       start = byte_get ((unsigned char *) pnote->descdata, 8);
18389       end = byte_get ((unsigned char *) pnote->descdata + 8, 8);
18390       break;
18391       
18392     default:
18393       error (_("    <invalid description size: %lx>\n"), pnote->descsz);
18394       printf (_("    <invalid descsz>"));
18395       return FALSE;
18396     }
18397
18398   name = NULL;
18399   sym = get_symbol_for_build_attribute (filedata, start, is_open_attr, & name);
18400   /* As of version 5 of the annobin plugin, filename symbols are biased by 2
18401      in order to avoid them being confused with the start address of the
18402      first function in the file...  */
18403   if (sym == NULL && is_open_attr)
18404     sym = get_symbol_for_build_attribute (filedata, start + 2, is_open_attr,
18405                                           & name);
18406
18407   if (end == 0 && sym != NULL && sym->st_size > 0)
18408     end = start + sym->st_size;
18409
18410   if (is_open_attr)
18411     {
18412       /* FIXME: Need to properly allow for section alignment.
18413          16 is just the alignment used on x86_64.  */
18414       if (global_end > 0
18415           && start > BFD_ALIGN (global_end, 16)
18416           /* Build notes are not guaranteed to be organised in order of
18417              increasing address, but we should find the all of the notes
18418              for one section in the same place.  */
18419           && same_section (filedata, start, global_end))
18420         warn (_("Gap in build notes detected from %#lx to %#lx\n"),
18421               global_end + 1, start - 1);
18422
18423       printf (_("    Applies to region from %#lx"), start);
18424       global_offset = start;
18425
18426       if (end)
18427         {
18428           printf (_(" to %#lx"), end);
18429           global_end = end;
18430         }
18431     }
18432   else
18433     {
18434       printf (_("    Applies to region from %#lx"), start);
18435       func_offset = start;
18436
18437       if (end)
18438         {
18439           printf (_(" to %#lx"), end);
18440           func_end = end;
18441         }
18442     }
18443
18444   if (sym && name)
18445     printf (_(" (%s)"), name);
18446
18447   printf ("\n");
18448   return TRUE;
18449 }
18450
18451 static bfd_boolean
18452 print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
18453 {
18454   static const char string_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_STRING, 0 };
18455   static const char number_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC, 0 };
18456   static const char bool_expected [3] = { GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE, GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE, 0 };
18457   char         name_type;
18458   char         name_attribute;
18459   const char * expected_types;
18460   const char * name = pnote->namedata;
18461   const char * text;
18462   signed int   left;
18463
18464   if (name == NULL || pnote->namesz < 2)
18465     {
18466       error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
18467       print_symbol (-20, _("  <corrupt name>"));
18468       return FALSE;
18469     }
18470
18471   if (do_wide)
18472     left = 28;
18473   else
18474     left = 20;
18475
18476   /* Version 2 of the spec adds a "GA" prefix to the name field.  */
18477   if (name[0] == 'G' && name[1] == 'A')
18478     {
18479       if (pnote->namesz < 4)
18480         {
18481           error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
18482           print_symbol (-20, _("  <corrupt name>"));
18483           return FALSE;
18484         }
18485
18486       printf ("GA");
18487       name += 2;
18488       left -= 2;
18489     }
18490
18491   switch ((name_type = * name))
18492     {
18493     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18494     case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
18495     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
18496     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
18497       printf ("%c", * name);
18498       left --;
18499       break;
18500     default:
18501       error (_("unrecognised attribute type in name field: %d\n"), name_type);
18502       print_symbol (-20, _("<unknown name type>"));
18503       return FALSE;
18504     }
18505
18506   ++ name;
18507   text = NULL;
18508
18509   switch ((name_attribute = * name))
18510     {
18511     case GNU_BUILD_ATTRIBUTE_VERSION:
18512       text = _("<version>");
18513       expected_types = string_expected;
18514       ++ name;
18515       break;
18516     case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18517       text = _("<stack prot>");
18518       expected_types = "!+*";
18519       ++ name;
18520       break;
18521     case GNU_BUILD_ATTRIBUTE_RELRO:
18522       text = _("<relro>");
18523       expected_types = bool_expected;
18524       ++ name;
18525       break;
18526     case GNU_BUILD_ATTRIBUTE_STACK_SIZE:
18527       text = _("<stack size>");
18528       expected_types = number_expected;
18529       ++ name;
18530       break;
18531     case GNU_BUILD_ATTRIBUTE_TOOL:
18532       text = _("<tool>");
18533       expected_types = string_expected;
18534       ++ name;
18535       break;
18536     case GNU_BUILD_ATTRIBUTE_ABI:
18537       text = _("<ABI>");
18538       expected_types = "$*";
18539       ++ name;
18540       break;
18541     case GNU_BUILD_ATTRIBUTE_PIC:
18542       text = _("<PIC>");
18543       expected_types = number_expected;
18544       ++ name;
18545       break;
18546     case GNU_BUILD_ATTRIBUTE_SHORT_ENUM:
18547       text = _("<short enum>");
18548       expected_types = bool_expected;
18549       ++ name;
18550       break;
18551     default:
18552       if (ISPRINT (* name))
18553         {
18554           int len = strnlen (name, pnote->namesz - (name - pnote->namedata)) + 1;
18555
18556           if (len > left && ! do_wide)
18557             len = left;
18558           printf ("%.*s:", len, name);
18559           left -= len;
18560           name += len;
18561         }
18562       else
18563         {
18564           static char tmpbuf [128];
18565
18566           error (_("unrecognised byte in name field: %d\n"), * name);
18567           sprintf (tmpbuf, _("<unknown:_%d>"), * name);
18568           text = tmpbuf;
18569           name ++;
18570         }
18571       expected_types = "*$!+";
18572       break;
18573     }
18574
18575   if (text)
18576     left -= printf ("%s", text);
18577
18578   if (strchr (expected_types, name_type) == NULL)
18579     warn (_("attribute does not have an expected type (%c)\n"), name_type);
18580
18581   if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
18582     {
18583       error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
18584              (unsigned long) pnote->namesz,
18585              (long) (name - pnote->namedata));
18586       return FALSE;
18587     }
18588
18589   if (left < 1 && ! do_wide)
18590     return TRUE;
18591
18592   switch (name_type)
18593     {
18594     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18595       {
18596         unsigned int        bytes;
18597         unsigned long long  val = 0;
18598         unsigned int        shift = 0;
18599         char *              decoded = NULL;
18600
18601         bytes = pnote->namesz - (name - pnote->namedata);
18602         if (bytes > 0)
18603           /* The -1 is because the name field is always 0 terminated, and we
18604              want to be able to ensure that the shift in the while loop below
18605              will not overflow.  */
18606           -- bytes;
18607
18608         if (bytes > sizeof (val))
18609           {
18610             error (_("corrupt numeric name field: too many bytes in the value: %x\n"),
18611                    bytes);
18612             bytes = sizeof (val);
18613           }
18614         /* We do not bother to warn if bytes == 0 as this can
18615            happen with some early versions of the gcc plugin.  */
18616
18617         while (bytes --)
18618           {
18619             unsigned long byte = (* name ++) & 0xff;
18620
18621             val |= byte << shift;
18622             shift += 8;
18623           }
18624
18625         switch (name_attribute)
18626           {
18627           case GNU_BUILD_ATTRIBUTE_PIC:
18628             switch (val)
18629               {
18630               case 0: decoded = "static"; break;
18631               case 1: decoded = "pic"; break;
18632               case 2: decoded = "PIC"; break;
18633               case 3: decoded = "pie"; break;
18634               case 4: decoded = "PIE"; break;
18635               default: break;
18636               }
18637             break;
18638           case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18639             switch (val)
18640               {
18641                 /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c.  */
18642               case 0: decoded = "off"; break;
18643               case 1: decoded = "on"; break;
18644               case 2: decoded = "all"; break;
18645               case 3: decoded = "strong"; break;
18646               case 4: decoded = "explicit"; break;
18647               default: break;
18648               }
18649             break;
18650           default:
18651             break;
18652           }
18653
18654         if (decoded != NULL)
18655           {
18656             print_symbol (-left, decoded);
18657             left = 0;
18658           }
18659         else if (val == 0)
18660           {
18661             printf ("0x0");
18662             left -= 3;
18663           }
18664         else
18665           {
18666             if (do_wide)
18667               left -= printf ("0x%llx", val);
18668             else
18669               left -= printf ("0x%-.*llx", left, val);
18670           }
18671       }
18672       break;
18673     case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
18674       left -= print_symbol (- left, name);
18675       break;
18676     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
18677       left -= print_symbol (- left, "true");
18678       break;
18679     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
18680       left -= print_symbol (- left, "false");
18681       break;
18682     }
18683
18684   if (do_wide && left > 0)
18685     printf ("%-*s", left, " ");
18686     
18687   return TRUE;
18688 }
18689
18690 /* Note that by the ELF standard, the name field is already null byte
18691    terminated, and namesz includes the terminating null byte.
18692    I.E. the value of namesz for the name "FSF" is 4.
18693
18694    If the value of namesz is zero, there is no name present.  */
18695
18696 static bfd_boolean
18697 process_note (Elf_Internal_Note *  pnote,
18698               Filedata *           filedata)
18699 {
18700   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
18701   const char * nt;
18702
18703   if (pnote->namesz == 0)
18704     /* If there is no note name, then use the default set of
18705        note type strings.  */
18706     nt = get_note_type (filedata, pnote->type);
18707
18708   else if (const_strneq (pnote->namedata, "GNU"))
18709     /* GNU-specific object file notes.  */
18710     nt = get_gnu_elf_note_type (pnote->type);
18711
18712   else if (const_strneq (pnote->namedata, "FreeBSD"))
18713     /* FreeBSD-specific core file notes.  */
18714     nt = get_freebsd_elfcore_note_type (filedata, pnote->type);
18715
18716   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
18717     /* NetBSD-specific core file notes.  */
18718     nt = get_netbsd_elfcore_note_type (filedata, pnote->type);
18719
18720   else if (const_strneq (pnote->namedata, "NetBSD"))
18721     /* NetBSD-specific core file notes.  */
18722     return process_netbsd_elf_note (pnote);
18723
18724   else if (strneq (pnote->namedata, "SPU/", 4))
18725     {
18726       /* SPU-specific core file notes.  */
18727       nt = pnote->namedata + 4;
18728       name = "SPU";
18729     }
18730
18731   else if (const_strneq (pnote->namedata, "IPF/VMS"))
18732     /* VMS/ia64-specific file notes.  */
18733     nt = get_ia64_vms_note_type (pnote->type);
18734
18735   else if (const_strneq (pnote->namedata, "stapsdt"))
18736     nt = get_stapsdt_note_type (pnote->type);
18737
18738   else
18739     /* Don't recognize this note name; just use the default set of
18740        note type strings.  */
18741     nt = get_note_type (filedata, pnote->type);
18742
18743   printf ("  ");
18744
18745   if (((const_strneq (pnote->namedata, "GA")
18746         && strchr ("*$!+", pnote->namedata[2]) != NULL)
18747        || strchr ("*$!+", pnote->namedata[0]) != NULL)
18748       && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18749           || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
18750     print_gnu_build_attribute_name (pnote);
18751   else
18752     print_symbol (-20, name);
18753
18754   if (do_wide)
18755     printf (" 0x%08lx\t%s\t", pnote->descsz, nt);
18756   else
18757     printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
18758
18759   if (const_strneq (pnote->namedata, "IPF/VMS"))
18760     return print_ia64_vms_note (pnote);
18761   else if (const_strneq (pnote->namedata, "GNU"))
18762     return print_gnu_note (filedata, pnote);
18763   else if (const_strneq (pnote->namedata, "stapsdt"))
18764     return print_stapsdt_note (pnote);
18765   else if (const_strneq (pnote->namedata, "CORE"))
18766     return print_core_note (pnote);
18767   else if (((const_strneq (pnote->namedata, "GA")
18768              && strchr ("*$!+", pnote->namedata[2]) != NULL)
18769             || strchr ("*$!+", pnote->namedata[0]) != NULL)
18770            && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18771                || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
18772     return print_gnu_build_attribute_description (pnote, filedata);
18773
18774   if (pnote->descsz)
18775     {
18776       unsigned long i;
18777
18778       printf (_("   description data: "));
18779       for (i = 0; i < pnote->descsz; i++)
18780         printf ("%02x ", pnote->descdata[i]);
18781       if (!do_wide)
18782         printf ("\n");
18783     }
18784
18785   if (do_wide)
18786     printf ("\n");
18787
18788   return TRUE;
18789 }
18790
18791 static bfd_boolean
18792 process_notes_at (Filedata *           filedata,
18793                   Elf_Internal_Shdr *  section,
18794                   bfd_vma              offset,
18795                   bfd_vma              length,
18796                   bfd_vma              align)
18797 {
18798   Elf_External_Note * pnotes;
18799   Elf_External_Note * external;
18800   char *              end;
18801   bfd_boolean         res = TRUE;
18802
18803   if (length <= 0)
18804     return FALSE;
18805
18806   if (section)
18807     {
18808       pnotes = (Elf_External_Note *) get_section_contents (section, filedata);
18809       if (pnotes)
18810         {
18811           if (! apply_relocations (filedata, section, (unsigned char *) pnotes, length, NULL, NULL))
18812             return FALSE;
18813         }
18814     }
18815   else
18816     pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18817                                              _("notes"));
18818
18819   if (pnotes == NULL)
18820     return FALSE;
18821
18822   external = pnotes;
18823
18824   if (section)
18825     printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (filedata, section));
18826   else
18827     printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
18828             (unsigned long) offset, (unsigned long) length);
18829
18830   /* NB: Some note sections may have alignment value of 0 or 1.  gABI
18831      specifies that notes should be aligned to 4 bytes in 32-bit
18832      objects and to 8 bytes in 64-bit objects.  As a Linux extension,
18833      we also support 4 byte alignment in 64-bit objects.  If section
18834      alignment is less than 4, we treate alignment as 4 bytes.   */
18835   if (align < 4)
18836     align = 4;
18837   else if (align != 4 && align != 8)
18838     {
18839       warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
18840             (long) align);
18841       return FALSE;
18842     }
18843
18844   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
18845
18846   end = (char *) pnotes + length;
18847   while ((char *) external < end)
18848     {
18849       Elf_Internal_Note inote;
18850       size_t min_notesz;
18851       char * next;
18852       char * temp = NULL;
18853       size_t data_remaining = end - (char *) external;
18854
18855       if (!is_ia64_vms (filedata))
18856         {
18857           /* PR binutils/15191
18858              Make sure that there is enough data to read.  */
18859           min_notesz = offsetof (Elf_External_Note, name);
18860           if (data_remaining < min_notesz)
18861             {
18862               warn (ngettext ("Corrupt note: only %ld byte remains, "
18863                               "not enough for a full note\n",
18864                               "Corrupt note: only %ld bytes remain, "
18865                               "not enough for a full note\n",
18866                               data_remaining),
18867                     (long) data_remaining);
18868               break;
18869             }
18870           data_remaining -= min_notesz;
18871
18872           inote.type     = BYTE_GET (external->type);
18873           inote.namesz   = BYTE_GET (external->namesz);
18874           inote.namedata = external->name;
18875           inote.descsz   = BYTE_GET (external->descsz);
18876           inote.descdata = ((char *) external
18877                             + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
18878           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
18879           next = ((char *) external
18880                   + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
18881         }
18882       else
18883         {
18884           Elf64_External_VMS_Note *vms_external;
18885
18886           /* PR binutils/15191
18887              Make sure that there is enough data to read.  */
18888           min_notesz = offsetof (Elf64_External_VMS_Note, name);
18889           if (data_remaining < min_notesz)
18890             {
18891               warn (ngettext ("Corrupt note: only %ld byte remains, "
18892                               "not enough for a full note\n",
18893                               "Corrupt note: only %ld bytes remain, "
18894                               "not enough for a full note\n",
18895                               data_remaining),
18896                     (long) data_remaining);
18897               break;
18898             }
18899           data_remaining -= min_notesz;
18900
18901           vms_external = (Elf64_External_VMS_Note *) external;
18902           inote.type     = BYTE_GET (vms_external->type);
18903           inote.namesz   = BYTE_GET (vms_external->namesz);
18904           inote.namedata = vms_external->name;
18905           inote.descsz   = BYTE_GET (vms_external->descsz);
18906           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
18907           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
18908           next = inote.descdata + align_power (inote.descsz, 3);
18909         }
18910
18911       /* PR 17531: file: 3443835e.  */
18912       /* PR 17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4.  */
18913       if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
18914           || (size_t) (inote.descdata - inote.namedata) > data_remaining
18915           || (size_t) (next - inote.descdata) < inote.descsz
18916           || ((size_t) (next - inote.descdata)
18917               > data_remaining - (size_t) (inote.descdata - inote.namedata)))
18918         {
18919           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
18920                 (unsigned long) ((char *) external - (char *) pnotes));
18921           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
18922                 inote.type, inote.namesz, inote.descsz, (int) align);
18923           break;
18924         }
18925
18926       external = (Elf_External_Note *) next;
18927
18928       /* Verify that name is null terminated.  It appears that at least
18929          one version of Linux (RedHat 6.0) generates corefiles that don't
18930          comply with the ELF spec by failing to include the null byte in
18931          namesz.  */
18932       if (inote.namesz > 0 && inote.namedata[inote.namesz - 1] != '\0')
18933         {
18934           if ((size_t) (inote.descdata - inote.namedata) == inote.namesz)
18935             {
18936               temp = (char *) malloc (inote.namesz + 1);
18937               if (temp == NULL)
18938                 {
18939                   error (_("Out of memory allocating space for inote name\n"));
18940                   res = FALSE;
18941                   break;
18942                 }
18943
18944               memcpy (temp, inote.namedata, inote.namesz);
18945               inote.namedata = temp;
18946             }
18947           inote.namedata[inote.namesz] = 0;
18948         }
18949
18950       if (! process_note (& inote, filedata))
18951         res = FALSE;
18952
18953       if (temp != NULL)
18954         {
18955           free (temp);
18956           temp = NULL;
18957         }
18958     }
18959
18960   free (pnotes);
18961
18962   return res;
18963 }
18964
18965 static bfd_boolean
18966 process_corefile_note_segments (Filedata * filedata)
18967 {
18968   Elf_Internal_Phdr * segment;
18969   unsigned int i;
18970   bfd_boolean res = TRUE;
18971
18972   if (! get_program_headers (filedata))
18973     return TRUE;
18974
18975   for (i = 0, segment = filedata->program_headers;
18976        i < filedata->file_header.e_phnum;
18977        i++, segment++)
18978     {
18979       if (segment->p_type == PT_NOTE)
18980         if (! process_notes_at (filedata, NULL,
18981                                 (bfd_vma) segment->p_offset,
18982                                 (bfd_vma) segment->p_filesz,
18983                                 (bfd_vma) segment->p_align))
18984           res = FALSE;
18985     }
18986
18987   return res;
18988 }
18989
18990 static bfd_boolean
18991 process_v850_notes (Filedata * filedata, bfd_vma offset, bfd_vma length)
18992 {
18993   Elf_External_Note * pnotes;
18994   Elf_External_Note * external;
18995   char * end;
18996   bfd_boolean res = TRUE;
18997
18998   if (length <= 0)
18999     return FALSE;
19000
19001   pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
19002                                            _("v850 notes"));
19003   if (pnotes == NULL)
19004     return FALSE;
19005
19006   external = pnotes;
19007   end = (char*) pnotes + length;
19008
19009   printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
19010           (unsigned long) offset, (unsigned long) length);
19011
19012   while ((char *) external + sizeof (Elf_External_Note) < end)
19013     {
19014       Elf_External_Note * next;
19015       Elf_Internal_Note inote;
19016
19017       inote.type     = BYTE_GET (external->type);
19018       inote.namesz   = BYTE_GET (external->namesz);
19019       inote.namedata = external->name;
19020       inote.descsz   = BYTE_GET (external->descsz);
19021       inote.descdata = inote.namedata + align_power (inote.namesz, 2);
19022       inote.descpos  = offset + (inote.descdata - (char *) pnotes);
19023
19024       if (inote.descdata < (char *) pnotes || inote.descdata >= end)
19025         {
19026           warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
19027           inote.descdata = inote.namedata;
19028           inote.namesz   = 0;
19029         }
19030
19031       next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
19032
19033       if (   ((char *) next > end)
19034           || ((char *) next <  (char *) pnotes))
19035         {
19036           warn (_("corrupt descsz found in note at offset 0x%lx\n"),
19037                 (unsigned long) ((char *) external - (char *) pnotes));
19038           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
19039                 inote.type, inote.namesz, inote.descsz);
19040           break;
19041         }
19042
19043       external = next;
19044
19045       /* Prevent out-of-bounds indexing.  */
19046       if (   inote.namedata + inote.namesz > end
19047           || inote.namedata + inote.namesz < inote.namedata)
19048         {
19049           warn (_("corrupt namesz found in note at offset 0x%lx\n"),
19050                 (unsigned long) ((char *) external - (char *) pnotes));
19051           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
19052                 inote.type, inote.namesz, inote.descsz);
19053           break;
19054         }
19055
19056       printf ("  %s: ", get_v850_elf_note_type (inote.type));
19057
19058       if (! print_v850_note (& inote))
19059         {
19060           res = FALSE;
19061           printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
19062                   inote.namesz, inote.descsz);
19063         }
19064     }
19065
19066   free (pnotes);
19067
19068   return res;
19069 }
19070
19071 static bfd_boolean
19072 process_note_sections (Filedata * filedata)
19073 {
19074   Elf_Internal_Shdr * section;
19075   unsigned long i;
19076   unsigned int n = 0;
19077   bfd_boolean res = TRUE;
19078
19079   for (i = 0, section = filedata->section_headers;
19080        i < filedata->file_header.e_shnum && section != NULL;
19081        i++, section++)
19082     {
19083       if (section->sh_type == SHT_NOTE)
19084         {
19085           if (! process_notes_at (filedata, section,
19086                                   (bfd_vma) section->sh_offset,
19087                                   (bfd_vma) section->sh_size,
19088                                   (bfd_vma) section->sh_addralign))
19089             res = FALSE;
19090           n++;
19091         }
19092
19093       if ((   filedata->file_header.e_machine == EM_V800
19094            || filedata->file_header.e_machine == EM_V850
19095            || filedata->file_header.e_machine == EM_CYGNUS_V850)
19096           && section->sh_type == SHT_RENESAS_INFO)
19097         {
19098           if (! process_v850_notes (filedata,
19099                                     (bfd_vma) section->sh_offset,
19100                                     (bfd_vma) section->sh_size))
19101             res = FALSE;
19102           n++;
19103         }
19104     }
19105
19106   if (n == 0)
19107     /* Try processing NOTE segments instead.  */
19108     return process_corefile_note_segments (filedata);
19109
19110   return res;
19111 }
19112
19113 static bfd_boolean
19114 process_notes (Filedata * filedata)
19115 {
19116   /* If we have not been asked to display the notes then do nothing.  */
19117   if (! do_notes)
19118     return TRUE;
19119
19120   if (filedata->file_header.e_type != ET_CORE)
19121     return process_note_sections (filedata);
19122
19123   /* No program headers means no NOTE segment.  */
19124   if (filedata->file_header.e_phnum > 0)
19125     return process_corefile_note_segments (filedata);
19126
19127   printf (_("No note segments present in the core file.\n"));
19128   return TRUE;
19129 }
19130
19131 static unsigned char *
19132 display_public_gnu_attributes (unsigned char * start,
19133                                const unsigned char * const end)
19134 {
19135   printf (_("  Unknown GNU attribute: %s\n"), start);
19136
19137   start += strnlen ((char *) start, end - start);
19138   display_raw_attribute (start, end);
19139
19140   return (unsigned char *) end;
19141 }
19142
19143 static unsigned char *
19144 display_generic_attribute (unsigned char * start,
19145                            unsigned int tag,
19146                            const unsigned char * const end)
19147 {
19148   if (tag == 0)
19149     return (unsigned char *) end;
19150
19151   return display_tag_value (tag, start, end);
19152 }
19153
19154 static bfd_boolean
19155 process_arch_specific (Filedata * filedata)
19156 {
19157   if (! do_arch)
19158     return TRUE;
19159
19160   switch (filedata->file_header.e_machine)
19161     {
19162     case EM_ARC:
19163     case EM_ARC_COMPACT:
19164     case EM_ARC_COMPACT2:
19165       return process_attributes (filedata, "ARC", SHT_ARC_ATTRIBUTES,
19166                                  display_arc_attribute,
19167                                  display_generic_attribute);
19168     case EM_ARM:
19169       return process_attributes (filedata, "aeabi", SHT_ARM_ATTRIBUTES,
19170                                  display_arm_attribute,
19171                                  display_generic_attribute);
19172
19173     case EM_MIPS:
19174     case EM_MIPS_RS3_LE:
19175       return process_mips_specific (filedata);
19176
19177     case EM_MSP430:
19178      return process_attributes (filedata, "mspabi", SHT_MSP430_ATTRIBUTES,
19179                                 display_msp430x_attribute,
19180                                 display_generic_attribute);
19181
19182     case EM_RISCV:
19183      return process_attributes (filedata, "riscv", SHT_RISCV_ATTRIBUTES,
19184                                 display_riscv_attribute,
19185                                 display_generic_attribute);
19186
19187     case EM_NDS32:
19188       return process_nds32_specific (filedata);
19189
19190     case EM_PPC:
19191     case EM_PPC64:
19192       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19193                                  display_power_gnu_attribute);
19194
19195     case EM_S390:
19196     case EM_S390_OLD:
19197       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19198                                  display_s390_gnu_attribute);
19199
19200     case EM_SPARC:
19201     case EM_SPARC32PLUS:
19202     case EM_SPARCV9:
19203       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19204                                  display_sparc_gnu_attribute);
19205
19206     case EM_TI_C6000:
19207       return process_attributes (filedata, "c6xabi", SHT_C6000_ATTRIBUTES,
19208                                  display_tic6x_attribute,
19209                                  display_generic_attribute);
19210
19211     default:
19212       return process_attributes (filedata, "gnu", SHT_GNU_ATTRIBUTES,
19213                                  display_public_gnu_attributes,
19214                                  display_generic_attribute);
19215     }
19216 }
19217
19218 static bfd_boolean
19219 get_file_header (Filedata * filedata)
19220 {
19221   /* Read in the identity array.  */
19222   if (fread (filedata->file_header.e_ident, EI_NIDENT, 1, filedata->handle) != 1)
19223     return FALSE;
19224
19225   /* Determine how to read the rest of the header.  */
19226   switch (filedata->file_header.e_ident[EI_DATA])
19227     {
19228     default:
19229     case ELFDATANONE:
19230     case ELFDATA2LSB:
19231       byte_get = byte_get_little_endian;
19232       byte_put = byte_put_little_endian;
19233       break;
19234     case ELFDATA2MSB:
19235       byte_get = byte_get_big_endian;
19236       byte_put = byte_put_big_endian;
19237       break;
19238     }
19239
19240   /* For now we only support 32 bit and 64 bit ELF files.  */
19241   is_32bit_elf = (filedata->file_header.e_ident[EI_CLASS] != ELFCLASS64);
19242
19243   /* Read in the rest of the header.  */
19244   if (is_32bit_elf)
19245     {
19246       Elf32_External_Ehdr ehdr32;
19247
19248       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, filedata->handle) != 1)
19249         return FALSE;
19250
19251       filedata->file_header.e_type      = BYTE_GET (ehdr32.e_type);
19252       filedata->file_header.e_machine   = BYTE_GET (ehdr32.e_machine);
19253       filedata->file_header.e_version   = BYTE_GET (ehdr32.e_version);
19254       filedata->file_header.e_entry     = BYTE_GET (ehdr32.e_entry);
19255       filedata->file_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
19256       filedata->file_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
19257       filedata->file_header.e_flags     = BYTE_GET (ehdr32.e_flags);
19258       filedata->file_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
19259       filedata->file_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
19260       filedata->file_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
19261       filedata->file_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
19262       filedata->file_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
19263       filedata->file_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
19264     }
19265   else
19266     {
19267       Elf64_External_Ehdr ehdr64;
19268
19269       /* If we have been compiled with sizeof (bfd_vma) == 4, then
19270          we will not be able to cope with the 64bit data found in
19271          64 ELF files.  Detect this now and abort before we start
19272          overwriting things.  */
19273       if (sizeof (bfd_vma) < 8)
19274         {
19275           error (_("This instance of readelf has been built without support for a\n\
19276 64 bit data type and so it cannot read 64 bit ELF files.\n"));
19277           return FALSE;
19278         }
19279
19280       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, filedata->handle) != 1)
19281         return FALSE;
19282
19283       filedata->file_header.e_type      = BYTE_GET (ehdr64.e_type);
19284       filedata->file_header.e_machine   = BYTE_GET (ehdr64.e_machine);
19285       filedata->file_header.e_version   = BYTE_GET (ehdr64.e_version);
19286       filedata->file_header.e_entry     = BYTE_GET (ehdr64.e_entry);
19287       filedata->file_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
19288       filedata->file_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
19289       filedata->file_header.e_flags     = BYTE_GET (ehdr64.e_flags);
19290       filedata->file_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
19291       filedata->file_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
19292       filedata->file_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
19293       filedata->file_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
19294       filedata->file_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
19295       filedata->file_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
19296     }
19297
19298   if (filedata->file_header.e_shoff)
19299     {
19300       /* There may be some extensions in the first section header.  Don't
19301          bomb if we can't read it.  */
19302       if (is_32bit_elf)
19303         get_32bit_section_headers (filedata, TRUE);
19304       else
19305         get_64bit_section_headers (filedata, TRUE);
19306     }
19307
19308   return TRUE;
19309 }
19310
19311 static void
19312 close_file (Filedata * filedata)
19313 {
19314   if (filedata)
19315     {
19316       if (filedata->handle)
19317         fclose (filedata->handle);
19318       free (filedata);
19319     }
19320 }
19321
19322 void
19323 close_debug_file (void * data)
19324 {
19325   close_file ((Filedata *) data);
19326 }
19327
19328 static Filedata *
19329 open_file (const char * pathname)
19330 {
19331   struct stat  statbuf;
19332   Filedata *   filedata = NULL;
19333
19334   if (stat (pathname, & statbuf) < 0
19335       || ! S_ISREG (statbuf.st_mode))
19336     goto fail;
19337
19338   filedata = calloc (1, sizeof * filedata);
19339   if (filedata == NULL)
19340     goto fail;
19341
19342   filedata->handle = fopen (pathname, "rb");
19343   if (filedata->handle == NULL)
19344     goto fail;
19345
19346   filedata->file_size = (bfd_size_type) statbuf.st_size;
19347   filedata->file_name = pathname;
19348
19349   if (! get_file_header (filedata))
19350     goto fail;
19351
19352   if (filedata->file_header.e_shoff)
19353     {
19354       bfd_boolean res;
19355
19356       /* Read the section headers again, this time for real.  */
19357       if (is_32bit_elf)
19358         res = get_32bit_section_headers (filedata, FALSE);
19359       else
19360         res = get_64bit_section_headers (filedata, FALSE);
19361
19362       if (!res)
19363         goto fail;
19364     }
19365
19366   return filedata;
19367
19368  fail:
19369   if (filedata)
19370     {
19371       if (filedata->handle)
19372         fclose (filedata->handle);
19373       free (filedata);
19374     }
19375   return NULL;
19376 }
19377
19378 void *
19379 open_debug_file (const char * pathname)
19380 {
19381   return open_file (pathname);
19382 }
19383
19384 /* Process one ELF object file according to the command line options.
19385    This file may actually be stored in an archive.  The file is
19386    positioned at the start of the ELF object.  Returns TRUE if no
19387    problems were encountered, FALSE otherwise.  */
19388
19389 static bfd_boolean
19390 process_object (Filedata * filedata)
19391 {
19392   bfd_boolean  have_separate_files;
19393   unsigned int i;
19394   bfd_boolean res = TRUE;
19395
19396   if (! get_file_header (filedata))
19397     {
19398       error (_("%s: Failed to read file header\n"), filedata->file_name);
19399       return FALSE;
19400     }
19401
19402   /* Initialise per file variables.  */
19403   for (i = ARRAY_SIZE (version_info); i--;)
19404     version_info[i] = 0;
19405
19406   for (i = ARRAY_SIZE (dynamic_info); i--;)
19407     dynamic_info[i] = 0;
19408   dynamic_info_DT_GNU_HASH = 0;
19409
19410   /* Process the file.  */
19411   if (show_name)
19412     printf (_("\nFile: %s\n"), filedata->file_name);
19413
19414   /* Initialise the dump_sects array from the cmdline_dump_sects array.
19415      Note we do this even if cmdline_dump_sects is empty because we
19416      must make sure that the dump_sets array is zeroed out before each
19417      object file is processed.  */
19418   if (filedata->num_dump_sects > cmdline.num_dump_sects)
19419     memset (filedata->dump_sects, 0, filedata->num_dump_sects * sizeof (* filedata->dump_sects));
19420
19421   if (cmdline.num_dump_sects > 0)
19422     {
19423       if (filedata->num_dump_sects == 0)
19424         /* A sneaky way of allocating the dump_sects array.  */
19425         request_dump_bynumber (filedata, cmdline.num_dump_sects, 0);
19426
19427       assert (filedata->num_dump_sects >= cmdline.num_dump_sects);
19428       memcpy (filedata->dump_sects, cmdline.dump_sects,
19429               cmdline.num_dump_sects * sizeof (* filedata->dump_sects));
19430     }
19431
19432   if (! process_file_header (filedata))
19433     return FALSE;
19434
19435   if (! process_section_headers (filedata))
19436     {
19437       /* Without loaded section headers we cannot process lots of things.  */
19438       do_unwind = do_version = do_dump = do_arch = FALSE;
19439
19440       if (! do_using_dynamic)
19441         do_syms = do_dyn_syms = do_reloc = FALSE;
19442     }
19443
19444   if (! process_section_groups (filedata))
19445     /* Without loaded section groups we cannot process unwind.  */
19446     do_unwind = FALSE;
19447
19448   if (process_program_headers (filedata))
19449     process_dynamic_section (filedata);
19450   else
19451     res = FALSE;
19452
19453   if (! process_relocs (filedata))
19454     res = FALSE;
19455
19456   if (! process_unwind (filedata))
19457     res = FALSE;
19458
19459   if (! process_symbol_table (filedata))
19460     res = FALSE;
19461
19462   if (! process_syminfo (filedata))
19463     res = FALSE;
19464
19465   if (! process_version_sections (filedata))
19466     res = FALSE;
19467
19468   if (filedata->file_header.e_shstrndx != SHN_UNDEF)
19469     have_separate_files = load_separate_debug_files (filedata, filedata->file_name);
19470   else
19471     have_separate_files = FALSE;
19472
19473   if (! process_section_contents (filedata))
19474     res = FALSE;
19475
19476   if (have_separate_files)
19477     {
19478       separate_info * d;
19479
19480       for (d = first_separate_info; d != NULL; d = d->next)
19481         {
19482           if (! process_section_headers (d->handle))
19483             res = FALSE;
19484           else if (! process_section_contents (d->handle))
19485             res = FALSE;
19486         }
19487
19488       /* The file handles are closed by the call to free_debug_memory() below.  */
19489     }
19490
19491   if (! process_notes (filedata))
19492     res = FALSE;
19493
19494   if (! process_gnu_liblist (filedata))
19495     res = FALSE;
19496
19497   if (! process_arch_specific (filedata))
19498     res = FALSE;
19499
19500   free (filedata->program_headers);
19501   filedata->program_headers = NULL;
19502
19503   free (filedata->section_headers);
19504   filedata->section_headers = NULL;
19505
19506   free (filedata->string_table);
19507   filedata->string_table = NULL;
19508   filedata->string_table_length = 0;
19509
19510   if (dynamic_strings)
19511     {
19512       free (dynamic_strings);
19513       dynamic_strings = NULL;
19514       dynamic_strings_length = 0;
19515     }
19516
19517   if (dynamic_symbols)
19518     {
19519       free (dynamic_symbols);
19520       dynamic_symbols = NULL;
19521       num_dynamic_syms = 0;
19522     }
19523
19524   if (dynamic_syminfo)
19525     {
19526       free (dynamic_syminfo);
19527       dynamic_syminfo = NULL;
19528     }
19529
19530   if (dynamic_section)
19531     {
19532       free (dynamic_section);
19533       dynamic_section = NULL;
19534     }
19535
19536   if (section_headers_groups)
19537     {
19538       free (section_headers_groups);
19539       section_headers_groups = NULL;
19540     }
19541
19542   if (section_groups)
19543     {
19544       struct group_list * g;
19545       struct group_list * next;
19546
19547       for (i = 0; i < group_count; i++)
19548         {
19549           for (g = section_groups [i].root; g != NULL; g = next)
19550             {
19551               next = g->next;
19552               free (g);
19553             }
19554         }
19555
19556       free (section_groups);
19557       section_groups = NULL;
19558     }
19559
19560   free_debug_memory ();
19561
19562   return res;
19563 }
19564
19565 /* Process an ELF archive.
19566    On entry the file is positioned just after the ARMAG string.
19567    Returns TRUE upon success, FALSE otherwise.  */
19568
19569 static bfd_boolean
19570 process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
19571 {
19572   struct archive_info arch;
19573   struct archive_info nested_arch;
19574   size_t got;
19575   bfd_boolean ret = TRUE;
19576
19577   show_name = TRUE;
19578
19579   /* The ARCH structure is used to hold information about this archive.  */
19580   arch.file_name = NULL;
19581   arch.file = NULL;
19582   arch.index_array = NULL;
19583   arch.sym_table = NULL;
19584   arch.longnames = NULL;
19585
19586   /* The NESTED_ARCH structure is used as a single-item cache of information
19587      about a nested archive (when members of a thin archive reside within
19588      another regular archive file).  */
19589   nested_arch.file_name = NULL;
19590   nested_arch.file = NULL;
19591   nested_arch.index_array = NULL;
19592   nested_arch.sym_table = NULL;
19593   nested_arch.longnames = NULL;
19594
19595   if (setup_archive (&arch, filedata->file_name, filedata->handle,
19596                      is_thin_archive, do_archive_index) != 0)
19597     {
19598       ret = FALSE;
19599       goto out;
19600     }
19601
19602   if (do_archive_index)
19603     {
19604       if (arch.sym_table == NULL)
19605         error (_("%s: unable to dump the index as none was found\n"), filedata->file_name);
19606       else
19607         {
19608           unsigned long i, l;
19609           unsigned long current_pos;
19610
19611           printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
19612                   filedata->file_name, (unsigned long) arch.index_num, arch.sym_size);
19613
19614           current_pos = ftell (filedata->handle);
19615
19616           for (i = l = 0; i < arch.index_num; i++)
19617             {
19618               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
19619                 {
19620                   char * member_name;
19621
19622                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
19623
19624                   if (member_name != NULL)
19625                     {
19626                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
19627
19628                       if (qualified_name != NULL)
19629                         {
19630                           printf (_("Contents of binary %s at offset "), qualified_name);
19631                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
19632                           putchar ('\n');
19633                           free (qualified_name);
19634                         }
19635                     }
19636                 }
19637
19638               if (l >= arch.sym_size)
19639                 {
19640                   error (_("%s: end of the symbol table reached before the end of the index\n"),
19641                          filedata->file_name);
19642                   ret = FALSE;
19643                   break;
19644                 }
19645               /* PR 17531: file: 0b6630b2.  */
19646               printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
19647               l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
19648             }
19649
19650           if (arch.uses_64bit_indices)
19651             l = (l + 7) & ~ 7;
19652           else
19653             l += l & 1;
19654
19655           if (l < arch.sym_size)
19656             {
19657               error (ngettext ("%s: %ld byte remains in the symbol table, "
19658                                "but without corresponding entries in "
19659                                "the index table\n",
19660                                "%s: %ld bytes remain in the symbol table, "
19661                                "but without corresponding entries in "
19662                                "the index table\n",
19663                                arch.sym_size - l),
19664                      filedata->file_name, arch.sym_size - l);
19665               ret = FALSE;
19666             }
19667
19668           if (fseek (filedata->handle, current_pos, SEEK_SET) != 0)
19669             {
19670               error (_("%s: failed to seek back to start of object files in the archive\n"),
19671                      filedata->file_name);
19672               ret = FALSE;
19673               goto out;
19674             }
19675         }
19676
19677       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
19678           && !do_segments && !do_header && !do_dump && !do_version
19679           && !do_histogram && !do_debugging && !do_arch && !do_notes
19680           && !do_section_groups && !do_dyn_syms)
19681         {
19682           ret = TRUE; /* Archive index only.  */
19683           goto out;
19684         }
19685     }
19686
19687   while (1)
19688     {
19689       char * name;
19690       size_t namelen;
19691       char * qualified_name;
19692
19693       /* Read the next archive header.  */
19694       if (fseek (filedata->handle, arch.next_arhdr_offset, SEEK_SET) != 0)
19695         {
19696           error (_("%s: failed to seek to next archive header\n"), arch.file_name);
19697           return FALSE;
19698         }
19699       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, filedata->handle);
19700       if (got != sizeof arch.arhdr)
19701         {
19702           if (got == 0)
19703             break;
19704           /* PR 24049 - we cannot use filedata->file_name as this will
19705              have already been freed.  */
19706           error (_("%s: failed to read archive header\n"), arch.file_name);
19707             
19708           ret = FALSE;
19709           break;
19710         }
19711       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
19712         {
19713           error (_("%s: did not find a valid archive header\n"), arch.file_name);
19714           ret = FALSE;
19715           break;
19716         }
19717
19718       arch.next_arhdr_offset += sizeof arch.arhdr;
19719
19720       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
19721       if (archive_file_size & 01)
19722         ++archive_file_size;
19723
19724       name = get_archive_member_name (&arch, &nested_arch);
19725       if (name == NULL)
19726         {
19727           error (_("%s: bad archive file name\n"), arch.file_name);
19728           ret = FALSE;
19729           break;
19730         }
19731       namelen = strlen (name);
19732
19733       qualified_name = make_qualified_name (&arch, &nested_arch, name);
19734       if (qualified_name == NULL)
19735         {
19736           error (_("%s: bad archive file name\n"), arch.file_name);
19737           ret = FALSE;
19738           break;
19739         }
19740
19741       if (is_thin_archive && arch.nested_member_origin == 0)
19742         {
19743           /* This is a proxy for an external member of a thin archive.  */
19744           Filedata * member_filedata;
19745           char * member_file_name = adjust_relative_path
19746             (filedata->file_name, name, namelen);
19747
19748           if (member_file_name == NULL)
19749             {
19750               ret = FALSE;
19751               break;
19752             }
19753
19754           member_filedata = open_file (member_file_name);
19755           if (member_filedata == NULL)
19756             {
19757               error (_("Input file '%s' is not readable.\n"), member_file_name);
19758               free (member_file_name);
19759               ret = FALSE;
19760               break;
19761             }
19762
19763           archive_file_offset = arch.nested_member_origin;
19764           member_filedata->file_name = qualified_name;
19765
19766           if (! process_object (member_filedata))
19767             ret = FALSE;
19768
19769           close_file (member_filedata);
19770           free (member_file_name);
19771         }
19772       else if (is_thin_archive)
19773         {
19774           Filedata thin_filedata;
19775
19776           memset (&thin_filedata, 0, sizeof (thin_filedata));
19777
19778           /* PR 15140: Allow for corrupt thin archives.  */
19779           if (nested_arch.file == NULL)
19780             {
19781               error (_("%s: contains corrupt thin archive: %s\n"),
19782                      qualified_name, name);
19783               ret = FALSE;
19784               break;
19785             }
19786
19787           /* This is a proxy for a member of a nested archive.  */
19788           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
19789
19790           /* The nested archive file will have been opened and setup by
19791              get_archive_member_name.  */
19792           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
19793             {
19794               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
19795               ret = FALSE;
19796               break;
19797             }
19798
19799           thin_filedata.handle = nested_arch.file;
19800           thin_filedata.file_name = qualified_name;
19801           
19802           if (! process_object (& thin_filedata))
19803             ret = FALSE;
19804         }
19805       else
19806         {
19807           archive_file_offset = arch.next_arhdr_offset;
19808           arch.next_arhdr_offset += archive_file_size;
19809
19810           filedata->file_name = qualified_name;
19811           if (! process_object (filedata))
19812             ret = FALSE;
19813         }
19814
19815       if (filedata->dump_sects != NULL)
19816         {
19817           free (filedata->dump_sects);
19818           filedata->dump_sects = NULL;
19819           filedata->num_dump_sects = 0;
19820         }
19821
19822       free (qualified_name);
19823     }
19824
19825  out:
19826   if (nested_arch.file != NULL)
19827     fclose (nested_arch.file);
19828   release_archive (&nested_arch);
19829   release_archive (&arch);
19830
19831   return ret;
19832 }
19833
19834 static bfd_boolean
19835 process_file (char * file_name)
19836 {
19837   Filedata * filedata = NULL;
19838   struct stat statbuf;
19839   char armag[SARMAG];
19840   bfd_boolean ret = TRUE;
19841
19842   if (stat (file_name, &statbuf) < 0)
19843     {
19844       if (errno == ENOENT)
19845         error (_("'%s': No such file\n"), file_name);
19846       else
19847         error (_("Could not locate '%s'.  System error message: %s\n"),
19848                file_name, strerror (errno));
19849       return FALSE;
19850     }
19851
19852   if (! S_ISREG (statbuf.st_mode))
19853     {
19854       error (_("'%s' is not an ordinary file\n"), file_name);
19855       return FALSE;
19856     }
19857
19858   filedata = calloc (1, sizeof * filedata);
19859   if (filedata == NULL)
19860     {
19861       error (_("Out of memory allocating file data structure\n"));
19862       return FALSE;
19863     }
19864
19865   filedata->file_name = file_name;
19866   filedata->handle = fopen (file_name, "rb");
19867   if (filedata->handle == NULL)
19868     {
19869       error (_("Input file '%s' is not readable.\n"), file_name);
19870       free (filedata);
19871       return FALSE;
19872     }
19873
19874   if (fread (armag, SARMAG, 1, filedata->handle) != 1)
19875     {
19876       error (_("%s: Failed to read file's magic number\n"), file_name);
19877       fclose (filedata->handle);
19878       free (filedata);
19879       return FALSE;
19880     }
19881
19882   filedata->file_size = (bfd_size_type) statbuf.st_size;
19883
19884   if (memcmp (armag, ARMAG, SARMAG) == 0)
19885     {
19886       if (! process_archive (filedata, FALSE))
19887         ret = FALSE;
19888     }
19889   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
19890     {
19891       if ( ! process_archive (filedata, TRUE))
19892         ret = FALSE;
19893     }
19894   else
19895     {
19896       if (do_archive_index)
19897         error (_("File %s is not an archive so its index cannot be displayed.\n"),
19898                file_name);
19899
19900       rewind (filedata->handle);
19901       archive_file_size = archive_file_offset = 0;
19902
19903       if (! process_object (filedata))
19904         ret = FALSE;
19905     }
19906
19907   fclose (filedata->handle);
19908   free (filedata);
19909
19910   return ret;
19911 }
19912
19913 #ifdef SUPPORT_DISASSEMBLY
19914 /* Needed by the i386 disassembler.  For extra credit, someone could
19915    fix this so that we insert symbolic addresses here, esp for GOT/PLT
19916    symbols.  */
19917
19918 void
19919 print_address (unsigned int addr, FILE * outfile)
19920 {
19921   fprintf (outfile,"0x%8.8x", addr);
19922 }
19923
19924 /* Needed by the i386 disassembler.  */
19925
19926 void
19927 db_task_printsym (unsigned int addr)
19928 {
19929   print_address (addr, stderr);
19930 }
19931 #endif
19932
19933 int
19934 main (int argc, char ** argv)
19935 {
19936   int err;
19937
19938 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
19939   setlocale (LC_MESSAGES, "");
19940 #endif
19941 #if defined (HAVE_SETLOCALE)
19942   setlocale (LC_CTYPE, "");
19943 #endif
19944   bindtextdomain (PACKAGE, LOCALEDIR);
19945   textdomain (PACKAGE);
19946
19947   expandargv (&argc, &argv);
19948
19949   cmdline.file_name = "<cmdline>";
19950   parse_args (& cmdline, argc, argv);
19951
19952   if (optind < (argc - 1))
19953     show_name = TRUE;
19954   else if (optind >= argc)
19955     {
19956       warn (_("Nothing to do.\n"));
19957       usage (stderr);
19958     }
19959
19960   err = FALSE;
19961   while (optind < argc)
19962     if (! process_file (argv[optind++]))
19963       err = TRUE;
19964
19965   if (cmdline.dump_sects != NULL)
19966     free (cmdline.dump_sects);
19967
19968   return err ? EXIT_FAILURE : EXIT_SUCCESS;
19969 }