]> Git Repo - binutils.git/blob - binutils/readelf.c
Update year range in copyright notice of binutils files
[binutils.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2    Copyright (C) 1998-2021 Free Software Foundation, Inc.
3
4    Originally developed by Eric Youngdale <[email protected]>
5    Modifications by Nick Clifton <[email protected]>
6
7    This file is part of GNU Binutils.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22    02110-1301, USA.  */
23 \f
24 /* The difference between readelf and objdump:
25
26   Both programs are capable of displaying the contents of ELF format files,
27   so why does the binutils project have two file dumpers ?
28
29   The reason is that objdump sees an ELF file through a BFD filter of the
30   world; if BFD has a bug where, say, it disagrees about a machine constant
31   in e_flags, then the odds are good that it will remain internally
32   consistent.  The linker sees it the BFD way, objdump sees it the BFD way,
33   GAS sees it the BFD way.  There was need for a tool to go find out what
34   the file actually says.
35
36   This is why the readelf program does not link against the BFD library - it
37   exists as an independent program to help verify the correct working of BFD.
38
39   There is also the case that readelf can provide more information about an
40   ELF file than is provided by objdump.  In particular it can display DWARF
41   debugging information which (at the moment) objdump cannot.  */
42 \f
43 #include "sysdep.h"
44 #include <assert.h>
45 #include <time.h>
46 #include <zlib.h>
47 #ifdef HAVE_WCHAR_H
48 #include <wchar.h>
49 #endif
50
51 #if __GNUC__ >= 2
52 /* Define BFD64 here, even if our default architecture is 32 bit ELF
53    as this will allow us to read in and parse 64bit and 32bit ELF files.
54    Only do this if we believe that the compiler can support a 64 bit
55    data type.  For now we only rely on GCC being able to do this.  */
56 #define BFD64
57 #endif
58
59 #include "bfd.h"
60 #include "bucomm.h"
61 #include "elfcomm.h"
62 #include "dwarf.h"
63 #include "ctf-api.h"
64 #include "demangle.h"
65
66 #include "elf/common.h"
67 #include "elf/external.h"
68 #include "elf/internal.h"
69
70
71 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
72    we can obtain the H8 reloc numbers.  We need these for the
73    get_reloc_size() function.  We include h8.h again after defining
74    RELOC_MACROS_GEN_FUNC so that we get the naming function as well.  */
75
76 #include "elf/h8.h"
77 #undef _ELF_H8_H
78
79 /* Undo the effects of #including reloc-macros.h.  */
80
81 #undef START_RELOC_NUMBERS
82 #undef RELOC_NUMBER
83 #undef FAKE_RELOC
84 #undef EMPTY_RELOC
85 #undef END_RELOC_NUMBERS
86 #undef _RELOC_MACROS_H
87
88 /* The following headers use the elf/reloc-macros.h file to
89    automatically generate relocation recognition functions
90    such as elf_mips_reloc_type()  */
91
92 #define RELOC_MACROS_GEN_FUNC
93
94 #include "elf/aarch64.h"
95 #include "elf/alpha.h"
96 #include "elf/arc.h"
97 #include "elf/arm.h"
98 #include "elf/avr.h"
99 #include "elf/bfin.h"
100 #include "elf/cr16.h"
101 #include "elf/cris.h"
102 #include "elf/crx.h"
103 #include "elf/csky.h"
104 #include "elf/d10v.h"
105 #include "elf/d30v.h"
106 #include "elf/dlx.h"
107 #include "elf/bpf.h"
108 #include "elf/epiphany.h"
109 #include "elf/fr30.h"
110 #include "elf/frv.h"
111 #include "elf/ft32.h"
112 #include "elf/h8.h"
113 #include "elf/hppa.h"
114 #include "elf/i386.h"
115 #include "elf/i370.h"
116 #include "elf/i860.h"
117 #include "elf/i960.h"
118 #include "elf/ia64.h"
119 #include "elf/ip2k.h"
120 #include "elf/lm32.h"
121 #include "elf/iq2000.h"
122 #include "elf/m32c.h"
123 #include "elf/m32r.h"
124 #include "elf/m68k.h"
125 #include "elf/m68hc11.h"
126 #include "elf/s12z.h"
127 #include "elf/mcore.h"
128 #include "elf/mep.h"
129 #include "elf/metag.h"
130 #include "elf/microblaze.h"
131 #include "elf/mips.h"
132 #include "elf/mmix.h"
133 #include "elf/mn10200.h"
134 #include "elf/mn10300.h"
135 #include "elf/moxie.h"
136 #include "elf/mt.h"
137 #include "elf/msp430.h"
138 #include "elf/nds32.h"
139 #include "elf/nfp.h"
140 #include "elf/nios2.h"
141 #include "elf/or1k.h"
142 #include "elf/pj.h"
143 #include "elf/ppc.h"
144 #include "elf/ppc64.h"
145 #include "elf/pru.h"
146 #include "elf/riscv.h"
147 #include "elf/rl78.h"
148 #include "elf/rx.h"
149 #include "elf/s390.h"
150 #include "elf/score.h"
151 #include "elf/sh.h"
152 #include "elf/sparc.h"
153 #include "elf/spu.h"
154 #include "elf/tic6x.h"
155 #include "elf/tilegx.h"
156 #include "elf/tilepro.h"
157 #include "elf/v850.h"
158 #include "elf/vax.h"
159 #include "elf/visium.h"
160 #include "elf/wasm32.h"
161 #include "elf/x86-64.h"
162 #include "elf/xc16x.h"
163 #include "elf/xgate.h"
164 #include "elf/xstormy16.h"
165 #include "elf/xtensa.h"
166 #include "elf/z80.h"
167
168 #include "getopt.h"
169 #include "libiberty.h"
170 #include "safe-ctype.h"
171 #include "filenames.h"
172
173 #ifndef offsetof
174 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
175 #endif
176
177 typedef struct elf_section_list
178 {
179   Elf_Internal_Shdr *        hdr;
180   struct elf_section_list *  next;
181 } elf_section_list;
182
183 /* Flag bits indicating particular types of dump.  */
184 #define HEX_DUMP        (1 << 0)        /* The -x command line switch.  */
185 #define DISASS_DUMP     (1 << 1)        /* The -i command line switch.  */
186 #define DEBUG_DUMP      (1 << 2)        /* The -w command line switch.  */
187 #define STRING_DUMP     (1 << 3)        /* The -p command line switch.  */
188 #define RELOC_DUMP      (1 << 4)        /* The -R command line switch.  */
189 #define CTF_DUMP        (1 << 5)        /* The --ctf command line switch.  */
190
191 typedef unsigned char dump_type;
192
193 /* A linked list of the section names for which dumps were requested.  */
194 struct dump_list_entry
195 {
196   char *                    name;
197   dump_type                 type;
198   struct dump_list_entry *  next;
199 };
200
201 /* A dynamic array of flags indicating for which sections a dump
202    has been requested via command line switches.  */
203 struct dump_data
204 {
205   dump_type *          dump_sects;
206   unsigned int         num_dump_sects;
207 };
208
209 static struct dump_data cmdline;
210
211 static struct dump_list_entry * dump_sects_byname;
212
213 char * program_name = "readelf";
214
215 static bfd_boolean show_name = FALSE;
216 static bfd_boolean do_dynamic = FALSE;
217 static bfd_boolean do_syms = FALSE;
218 static bfd_boolean do_dyn_syms = FALSE;
219 static bfd_boolean do_lto_syms = FALSE;
220 static bfd_boolean do_reloc = FALSE;
221 static bfd_boolean do_sections = FALSE;
222 static bfd_boolean do_section_groups = FALSE;
223 static bfd_boolean do_section_details = FALSE;
224 static bfd_boolean do_segments = FALSE;
225 static bfd_boolean do_unwind = FALSE;
226 static bfd_boolean do_using_dynamic = FALSE;
227 static bfd_boolean do_header = FALSE;
228 static bfd_boolean do_dump = FALSE;
229 static bfd_boolean do_version = FALSE;
230 static bfd_boolean do_histogram = FALSE;
231 static bfd_boolean do_debugging = FALSE;
232 static bfd_boolean do_ctf = FALSE;
233 static bfd_boolean do_arch = FALSE;
234 static bfd_boolean do_notes = FALSE;
235 static bfd_boolean do_archive_index = FALSE;
236 static bfd_boolean check_all = FALSE;
237 static bfd_boolean is_32bit_elf = FALSE;
238 static bfd_boolean decompress_dumps = FALSE;
239 static bfd_boolean do_not_show_symbol_truncation = FALSE;
240 static bfd_boolean do_demangle = FALSE; /* Pretty print C++ symbol names.  */
241 static int demangle_flags = DMGL_ANSI | DMGL_PARAMS;
242
243 static char *dump_ctf_parent_name;
244 static char *dump_ctf_symtab_name;
245 static char *dump_ctf_strtab_name;
246
247 struct group_list
248 {
249   struct group_list *  next;
250   unsigned int         section_index;
251 };
252
253 struct group
254 {
255   struct group_list *  root;
256   unsigned int         group_index;
257 };
258
259 typedef struct filedata
260 {
261   const char *         file_name;
262   FILE *               handle;
263   bfd_size_type        file_size;
264   Elf_Internal_Ehdr    file_header;
265   Elf_Internal_Shdr *  section_headers;
266   Elf_Internal_Phdr *  program_headers;
267   char *               string_table;
268   unsigned long        string_table_length;
269   unsigned long        archive_file_offset;
270   unsigned long        archive_file_size;
271   unsigned long        dynamic_addr;
272   bfd_size_type        dynamic_size;
273   size_t               dynamic_nent;
274   Elf_Internal_Dyn *   dynamic_section;
275   Elf_Internal_Shdr *  dynamic_strtab_section;
276   char *               dynamic_strings;
277   unsigned long        dynamic_strings_length;
278   Elf_Internal_Shdr *  dynamic_symtab_section;
279   unsigned long        num_dynamic_syms;
280   Elf_Internal_Sym *   dynamic_symbols;
281   bfd_vma              version_info[16];
282   unsigned int         dynamic_syminfo_nent;
283   Elf_Internal_Syminfo * dynamic_syminfo;
284   unsigned long        dynamic_syminfo_offset;
285   bfd_size_type        nbuckets;
286   bfd_size_type        nchains;
287   bfd_vma *            buckets;
288   bfd_vma *            chains;
289   bfd_size_type        ngnubuckets;
290   bfd_size_type        ngnuchains;
291   bfd_vma *            gnubuckets;
292   bfd_vma *            gnuchains;
293   bfd_vma *            mipsxlat;
294   bfd_vma              gnusymidx;
295   char                 program_interpreter[PATH_MAX];
296   bfd_vma              dynamic_info[DT_ENCODING];
297   bfd_vma              dynamic_info_DT_GNU_HASH;
298   bfd_vma              dynamic_info_DT_MIPS_XHASH;
299   elf_section_list *   symtab_shndx_list;
300   size_t               group_count;
301   struct group *       section_groups;
302   struct group **      section_headers_groups;
303   /* A dynamic array of flags indicating for which sections a dump of
304      some kind has been requested.  It is reset on a per-object file
305      basis and then initialised from the cmdline_dump_sects array,
306      the results of interpreting the -w switch, and the
307      dump_sects_byname list.  */
308   struct dump_data     dump;
309 } Filedata;
310
311 /* How to print a vma value.  */
312 typedef enum print_mode
313 {
314   HEX,
315   DEC,
316   DEC_5,
317   UNSIGNED,
318   PREFIX_HEX,
319   FULL_HEX,
320   LONG_HEX
321 }
322 print_mode;
323
324 /* Versioned symbol info.  */
325 enum versioned_symbol_info
326 {
327   symbol_undefined,
328   symbol_hidden,
329   symbol_public
330 };
331
332 static const char * get_symbol_version_string
333   (Filedata *, bfd_boolean, const char *, unsigned long, unsigned,
334    Elf_Internal_Sym *, enum versioned_symbol_info *, unsigned short *);
335
336 #define UNKNOWN -1
337
338 #define SECTION_NAME(X) \
339   (filedata->string_table + (X)->sh_name)
340
341 #define SECTION_NAME_VALID(X) \
342   ((X) != NULL                                                          \
343    && filedata->string_table != NULL                                    \
344    && (X)->sh_name < filedata->string_table_length)
345
346 #define SECTION_NAME_PRINT(X) \
347   ((X) == NULL ? _("<none>")                                            \
348    : filedata->string_table == NULL ? _("<no-strings>")                 \
349    : (X)->sh_name >= filedata->string_table_length ? _("<corrupt>")     \
350    : filedata->string_table + (X)->sh_name)
351
352 #define DT_VERSIONTAGIDX(tag)   (DT_VERNEEDNUM - (tag)) /* Reverse order!  */
353
354 #define GET_ELF_SYMBOLS(file, section, sym_count)                       \
355   (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count)      \
356    : get_64bit_elf_symbols (file, section, sym_count))
357
358 #define VALID_SYMBOL_NAME(strtab, strtab_size, offset) \
359    (strtab != NULL && offset < strtab_size)
360 #define VALID_DYNAMIC_NAME(filedata, offset) \
361   VALID_SYMBOL_NAME (filedata->dynamic_strings, \
362                      filedata->dynamic_strings_length, offset)
363 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
364    already been called and verified that the string exists.  */
365 #define GET_DYNAMIC_NAME(filedata, offset) \
366   (filedata->dynamic_strings + offset)
367
368 #define REMOVE_ARCH_BITS(ADDR)                  \
369   do                                            \
370     {                                           \
371       if (filedata->file_header.e_machine == EM_ARM)    \
372         (ADDR) &= ~1;                           \
373     }                                           \
374   while (0)
375
376 /* Get the correct GNU hash section name.  */
377 #define GNU_HASH_SECTION_NAME(filedata)         \
378   filedata->dynamic_info_DT_MIPS_XHASH ? ".MIPS.xhash" : ".gnu.hash"
379 \f
380 /* Print a BFD_VMA to an internal buffer, for use in error messages.
381    BFD_FMA_FMT can't be used in translated strings.  */
382
383 static const char *
384 bfd_vmatoa (char *fmtch, bfd_vma value)
385 {
386   /* bfd_vmatoa is used more then once in a printf call for output.
387      Cycle through an array of buffers.  */
388   static int buf_pos = 0;
389   static struct bfd_vmatoa_buf
390   {
391     char place[64];
392   } buf[4];
393   char *ret;
394   char fmt[32];
395
396   ret = buf[buf_pos++].place;
397   buf_pos %= ARRAY_SIZE (buf);
398
399   sprintf (fmt, "%%%s%s", BFD_VMA_FMT, fmtch);
400   snprintf (ret, sizeof (buf[0].place), fmt, value);
401   return ret;
402 }
403
404 /* Retrieve NMEMB structures, each SIZE bytes long from FILEDATA starting at
405    OFFSET + the offset of the current archive member, if we are examining an
406    archive.  Put the retrieved data into VAR, if it is not NULL.  Otherwise
407    allocate a buffer using malloc and fill that.  In either case return the
408    pointer to the start of the retrieved data or NULL if something went wrong.
409    If something does go wrong and REASON is not NULL then emit an error
410    message using REASON as part of the context.  */
411
412 static void *
413 get_data (void *         var,
414           Filedata *     filedata,
415           unsigned long  offset,
416           bfd_size_type  size,
417           bfd_size_type  nmemb,
418           const char *   reason)
419 {
420   void * mvar;
421   bfd_size_type amt = size * nmemb;
422
423   if (size == 0 || nmemb == 0)
424     return NULL;
425
426   /* If the size_t type is smaller than the bfd_size_type, eg because
427      you are building a 32-bit tool on a 64-bit host, then make sure
428      that when the sizes are cast to (size_t) no information is lost.  */
429   if ((size_t) size != size
430       || (size_t) nmemb != nmemb
431       || (size_t) amt != amt)
432     {
433       if (reason)
434         error (_("Size truncation prevents reading %s"
435                  " elements of size %s for %s\n"),
436                bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
437       return NULL;
438     }
439
440   /* Check for size overflow.  */
441   if (amt / size != nmemb || (size_t) amt + 1 == 0)
442     {
443       if (reason)
444         error (_("Size overflow prevents reading %s"
445                  " elements of size %s for %s\n"),
446                bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
447       return NULL;
448     }
449
450   /* Be kind to memory checkers (eg valgrind, address sanitizer) by not
451      attempting to allocate memory when the read is bound to fail.  */
452   if (filedata->archive_file_offset > filedata->file_size
453       || offset > filedata->file_size - filedata->archive_file_offset
454       || amt > filedata->file_size - filedata->archive_file_offset - offset)
455     {
456       if (reason)
457         error (_("Reading %s bytes extends past end of file for %s\n"),
458                bfd_vmatoa ("u", amt), reason);
459       return NULL;
460     }
461
462   if (fseek (filedata->handle, filedata->archive_file_offset + offset,
463              SEEK_SET))
464     {
465       if (reason)
466         error (_("Unable to seek to 0x%lx for %s\n"),
467                filedata->archive_file_offset + offset, reason);
468       return NULL;
469     }
470
471   mvar = var;
472   if (mvar == NULL)
473     {
474       /* + 1 so that we can '\0' terminate invalid string table sections.  */
475       mvar = malloc ((size_t) amt + 1);
476
477       if (mvar == NULL)
478         {
479           if (reason)
480             error (_("Out of memory allocating %s bytes for %s\n"),
481                    bfd_vmatoa ("u", amt), reason);
482           return NULL;
483         }
484
485       ((char *) mvar)[amt] = '\0';
486     }
487
488   if (fread (mvar, (size_t) size, (size_t) nmemb, filedata->handle) != nmemb)
489     {
490       if (reason)
491         error (_("Unable to read in %s bytes of %s\n"),
492                bfd_vmatoa ("u", amt), reason);
493       if (mvar != var)
494         free (mvar);
495       return NULL;
496     }
497
498   return mvar;
499 }
500
501 /* Print a VMA value in the MODE specified.
502    Returns the number of characters displayed.  */
503
504 static unsigned int
505 print_vma (bfd_vma vma, print_mode mode)
506 {
507   unsigned int nc = 0;
508
509   switch (mode)
510     {
511     case FULL_HEX:
512       nc = printf ("0x");
513       /* Fall through.  */
514     case LONG_HEX:
515 #ifdef BFD64
516       if (is_32bit_elf)
517         return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
518 #endif
519       printf_vma (vma);
520       return nc + 16;
521
522     case DEC_5:
523       if (vma <= 99999)
524         return printf ("%5" BFD_VMA_FMT "d", vma);
525       /* Fall through.  */
526     case PREFIX_HEX:
527       nc = printf ("0x");
528       /* Fall through.  */
529     case HEX:
530       return nc + printf ("%" BFD_VMA_FMT "x", vma);
531
532     case DEC:
533       return printf ("%" BFD_VMA_FMT "d", vma);
534
535     case UNSIGNED:
536       return printf ("%" BFD_VMA_FMT "u", vma);
537
538     default:
539       /* FIXME: Report unrecognised mode ?  */
540       return 0;
541     }
542 }
543
544 /* Display a symbol on stdout.  Handles the display of control characters and
545    multibye characters (assuming the host environment supports them).
546
547    Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
548
549    If truncation will happen and do_not_show_symbol_truncation is FALSE then display
550    abs(WIDTH) - 5 characters followed by "[...]".
551
552    If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
553    padding as necessary.
554
555    Returns the number of emitted characters.  */
556
557 static unsigned int
558 print_symbol (signed int width, const char * symbol)
559 {
560   bfd_boolean extra_padding = FALSE;
561   bfd_boolean do_dots = FALSE;
562   signed int num_printed = 0;
563 #ifdef HAVE_MBSTATE_T
564   mbstate_t state;
565 #endif
566   unsigned int width_remaining;
567   const void * alloced_symbol = NULL;
568
569   if (width < 0)
570     {
571       /* Keep the width positive.  This helps the code below.  */
572       width = - width;
573       extra_padding = TRUE;
574     }
575   else if (width == 0)
576     return 0;
577
578   if (do_wide)
579     /* Set the remaining width to a very large value.
580        This simplifies the code below.  */
581     width_remaining = INT_MAX;
582   else
583     {
584       width_remaining = width;
585       if (! do_not_show_symbol_truncation
586           && (int) strlen (symbol) > width)
587         {
588           width_remaining -= 5;
589           if ((int) width_remaining < 0)
590             width_remaining = 0;
591           do_dots = TRUE;
592         }
593     }
594
595 #ifdef HAVE_MBSTATE_T
596   /* Initialise the multibyte conversion state.  */
597   memset (& state, 0, sizeof (state));
598 #endif
599
600   if (do_demangle && *symbol)
601     {
602       const char * res = cplus_demangle (symbol, demangle_flags);
603
604       if (res != NULL)
605         alloced_symbol = symbol = res;
606     }
607
608   while (width_remaining)
609     {
610       size_t  n;
611       const char c = *symbol++;
612
613       if (c == 0)
614         break;
615
616       /* Do not print control characters directly as they can affect terminal
617          settings.  Such characters usually appear in the names generated
618          by the assembler for local labels.  */
619       if (ISCNTRL (c))
620         {
621           if (width_remaining < 2)
622             break;
623
624           printf ("^%c", c + 0x40);
625           width_remaining -= 2;
626           num_printed += 2;
627         }
628       else if (ISPRINT (c))
629         {
630           putchar (c);
631           width_remaining --;
632           num_printed ++;
633         }
634       else
635         {
636 #ifdef HAVE_MBSTATE_T
637           wchar_t w;
638 #endif
639           /* Let printf do the hard work of displaying multibyte characters.  */
640           printf ("%.1s", symbol - 1);
641           width_remaining --;
642           num_printed ++;
643
644 #ifdef HAVE_MBSTATE_T
645           /* Try to find out how many bytes made up the character that was
646              just printed.  Advance the symbol pointer past the bytes that
647              were displayed.  */
648           n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
649 #else
650           n = 1;
651 #endif
652           if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
653             symbol += (n - 1);
654         }
655     }
656
657   if (do_dots)
658     num_printed += printf ("[...]");
659
660   if (extra_padding && num_printed < width)
661     {
662       /* Fill in the remaining spaces.  */
663       printf ("%-*s", width - num_printed, " ");
664       num_printed = width;
665     }
666
667   free ((void *) alloced_symbol);
668   return num_printed;
669 }
670
671 /* Returns a pointer to a static buffer containing a printable version of
672    the given section's name.  Like print_symbol, except that it does not try
673    to print multibyte characters, it just interprets them as hex values.  */
674
675 static const char *
676 printable_section_name (Filedata * filedata, const Elf_Internal_Shdr * sec)
677 {
678 #define MAX_PRINT_SEC_NAME_LEN 128
679   static char  sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
680   const char * name = SECTION_NAME_PRINT (sec);
681   char *       buf = sec_name_buf;
682   char         c;
683   unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
684
685   while ((c = * name ++) != 0)
686     {
687       if (ISCNTRL (c))
688         {
689           if (remaining < 2)
690             break;
691
692           * buf ++ = '^';
693           * buf ++ = c + 0x40;
694           remaining -= 2;
695         }
696       else if (ISPRINT (c))
697         {
698           * buf ++ = c;
699           remaining -= 1;
700         }
701       else
702         {
703           static char hex[17] = "0123456789ABCDEF";
704
705           if (remaining < 4)
706             break;
707           * buf ++ = '<';
708           * buf ++ = hex[(c & 0xf0) >> 4];
709           * buf ++ = hex[c & 0x0f];
710           * buf ++ = '>';
711           remaining -= 4;
712         }
713
714       if (remaining == 0)
715         break;
716     }
717
718   * buf = 0;
719   return sec_name_buf;
720 }
721
722 static const char *
723 printable_section_name_from_index (Filedata * filedata, unsigned long ndx)
724 {
725   if (ndx >= filedata->file_header.e_shnum)
726     return _("<corrupt>");
727
728   return printable_section_name (filedata, filedata->section_headers + ndx);
729 }
730
731 /* Return a pointer to section NAME, or NULL if no such section exists.  */
732
733 static Elf_Internal_Shdr *
734 find_section (Filedata * filedata, const char * name)
735 {
736   unsigned int i;
737
738   if (filedata->section_headers == NULL)
739     return NULL;
740
741   for (i = 0; i < filedata->file_header.e_shnum; i++)
742     if (SECTION_NAME_VALID (filedata->section_headers + i)
743         && streq (SECTION_NAME (filedata->section_headers + i), name))
744       return filedata->section_headers + i;
745
746   return NULL;
747 }
748
749 /* Return a pointer to a section containing ADDR, or NULL if no such
750    section exists.  */
751
752 static Elf_Internal_Shdr *
753 find_section_by_address (Filedata * filedata, bfd_vma addr)
754 {
755   unsigned int i;
756
757   if (filedata->section_headers == NULL)
758     return NULL;
759
760   for (i = 0; i < filedata->file_header.e_shnum; i++)
761     {
762       Elf_Internal_Shdr *sec = filedata->section_headers + i;
763
764       if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
765         return sec;
766     }
767
768   return NULL;
769 }
770
771 static Elf_Internal_Shdr *
772 find_section_by_type (Filedata * filedata, unsigned int type)
773 {
774   unsigned int i;
775
776   if (filedata->section_headers == NULL)
777     return NULL;
778
779   for (i = 0; i < filedata->file_header.e_shnum; i++)
780     {
781       Elf_Internal_Shdr *sec = filedata->section_headers + i;
782
783       if (sec->sh_type == type)
784         return sec;
785     }
786
787   return NULL;
788 }
789
790 /* Return a pointer to section NAME, or NULL if no such section exists,
791    restricted to the list of sections given in SET.  */
792
793 static Elf_Internal_Shdr *
794 find_section_in_set (Filedata * filedata, const char * name, unsigned int * set)
795 {
796   unsigned int i;
797
798   if (filedata->section_headers == NULL)
799     return NULL;
800
801   if (set != NULL)
802     {
803       while ((i = *set++) > 0)
804         {
805           /* See PR 21156 for a reproducer.  */
806           if (i >= filedata->file_header.e_shnum)
807             continue; /* FIXME: Should we issue an error message ?  */
808
809           if (SECTION_NAME_VALID (filedata->section_headers + i)
810               && streq (SECTION_NAME (filedata->section_headers + i), name))
811             return filedata->section_headers + i;
812         }
813     }
814
815   return find_section (filedata, name);
816 }
817
818 /* Return TRUE if the current file is for IA-64 machine and OpenVMS ABI.
819    This OS has so many departures from the ELF standard that we test it at
820    many places.  */
821
822 static inline bfd_boolean
823 is_ia64_vms (Filedata * filedata)
824 {
825   return filedata->file_header.e_machine == EM_IA_64
826     && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
827 }
828
829 /* Guess the relocation size commonly used by the specific machines.  */
830
831 static bfd_boolean
832 guess_is_rela (unsigned int e_machine)
833 {
834   switch (e_machine)
835     {
836       /* Targets that use REL relocations.  */
837     case EM_386:
838     case EM_IAMCU:
839     case EM_960:
840     case EM_ARM:
841     case EM_D10V:
842     case EM_CYGNUS_D10V:
843     case EM_DLX:
844     case EM_MIPS:
845     case EM_MIPS_RS3_LE:
846     case EM_CYGNUS_M32R:
847     case EM_SCORE:
848     case EM_XGATE:
849     case EM_NFP:
850     case EM_BPF:
851       return FALSE;
852
853       /* Targets that use RELA relocations.  */
854     case EM_68K:
855     case EM_860:
856     case EM_AARCH64:
857     case EM_ADAPTEVA_EPIPHANY:
858     case EM_ALPHA:
859     case EM_ALTERA_NIOS2:
860     case EM_ARC:
861     case EM_ARC_COMPACT:
862     case EM_ARC_COMPACT2:
863     case EM_AVR:
864     case EM_AVR_OLD:
865     case EM_BLACKFIN:
866     case EM_CR16:
867     case EM_CRIS:
868     case EM_CRX:
869     case EM_CSKY:
870     case EM_D30V:
871     case EM_CYGNUS_D30V:
872     case EM_FR30:
873     case EM_FT32:
874     case EM_CYGNUS_FR30:
875     case EM_CYGNUS_FRV:
876     case EM_H8S:
877     case EM_H8_300:
878     case EM_H8_300H:
879     case EM_IA_64:
880     case EM_IP2K:
881     case EM_IP2K_OLD:
882     case EM_IQ2000:
883     case EM_LATTICEMICO32:
884     case EM_M32C_OLD:
885     case EM_M32C:
886     case EM_M32R:
887     case EM_MCORE:
888     case EM_CYGNUS_MEP:
889     case EM_METAG:
890     case EM_MMIX:
891     case EM_MN10200:
892     case EM_CYGNUS_MN10200:
893     case EM_MN10300:
894     case EM_CYGNUS_MN10300:
895     case EM_MOXIE:
896     case EM_MSP430:
897     case EM_MSP430_OLD:
898     case EM_MT:
899     case EM_NDS32:
900     case EM_NIOS32:
901     case EM_OR1K:
902     case EM_PPC64:
903     case EM_PPC:
904     case EM_TI_PRU:
905     case EM_RISCV:
906     case EM_RL78:
907     case EM_RX:
908     case EM_S390:
909     case EM_S390_OLD:
910     case EM_SH:
911     case EM_SPARC:
912     case EM_SPARC32PLUS:
913     case EM_SPARCV9:
914     case EM_SPU:
915     case EM_TI_C6000:
916     case EM_TILEGX:
917     case EM_TILEPRO:
918     case EM_V800:
919     case EM_V850:
920     case EM_CYGNUS_V850:
921     case EM_VAX:
922     case EM_VISIUM:
923     case EM_X86_64:
924     case EM_L1OM:
925     case EM_K1OM:
926     case EM_XSTORMY16:
927     case EM_XTENSA:
928     case EM_XTENSA_OLD:
929     case EM_MICROBLAZE:
930     case EM_MICROBLAZE_OLD:
931     case EM_WEBASSEMBLY:
932       return TRUE;
933
934     case EM_68HC05:
935     case EM_68HC08:
936     case EM_68HC11:
937     case EM_68HC16:
938     case EM_FX66:
939     case EM_ME16:
940     case EM_MMA:
941     case EM_NCPU:
942     case EM_NDR1:
943     case EM_PCP:
944     case EM_ST100:
945     case EM_ST19:
946     case EM_ST7:
947     case EM_ST9PLUS:
948     case EM_STARCORE:
949     case EM_SVX:
950     case EM_TINYJ:
951     default:
952       warn (_("Don't know about relocations on this machine architecture\n"));
953       return FALSE;
954     }
955 }
956
957 /* Load RELA type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
958    Returns TRUE upon success, FALSE otherwise.  If successful then a
959    pointer to a malloc'ed buffer containing the relocs is placed in *RELASP,
960    and the number of relocs loaded is placed in *NRELASP.  It is the caller's
961    responsibility to free the allocated buffer.  */
962
963 static bfd_boolean
964 slurp_rela_relocs (Filedata *            filedata,
965                    unsigned long         rel_offset,
966                    unsigned long         rel_size,
967                    Elf_Internal_Rela **  relasp,
968                    unsigned long *       nrelasp)
969 {
970   Elf_Internal_Rela * relas;
971   size_t nrelas;
972   unsigned int i;
973
974   if (is_32bit_elf)
975     {
976       Elf32_External_Rela * erelas;
977
978       erelas = (Elf32_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
979                                                  rel_size, _("32-bit relocation data"));
980       if (!erelas)
981         return FALSE;
982
983       nrelas = rel_size / sizeof (Elf32_External_Rela);
984
985       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
986                                              sizeof (Elf_Internal_Rela));
987
988       if (relas == NULL)
989         {
990           free (erelas);
991           error (_("out of memory parsing relocs\n"));
992           return FALSE;
993         }
994
995       for (i = 0; i < nrelas; i++)
996         {
997           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
998           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
999           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
1000         }
1001
1002       free (erelas);
1003     }
1004   else
1005     {
1006       Elf64_External_Rela * erelas;
1007
1008       erelas = (Elf64_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
1009                                                  rel_size, _("64-bit relocation data"));
1010       if (!erelas)
1011         return FALSE;
1012
1013       nrelas = rel_size / sizeof (Elf64_External_Rela);
1014
1015       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
1016                                              sizeof (Elf_Internal_Rela));
1017
1018       if (relas == NULL)
1019         {
1020           free (erelas);
1021           error (_("out of memory parsing relocs\n"));
1022           return FALSE;
1023         }
1024
1025       for (i = 0; i < nrelas; i++)
1026         {
1027           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
1028           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
1029           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
1030
1031           /* The #ifdef BFD64 below is to prevent a compile time
1032              warning.  We know that if we do not have a 64 bit data
1033              type that we will never execute this code anyway.  */
1034 #ifdef BFD64
1035           if (filedata->file_header.e_machine == EM_MIPS
1036               && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
1037             {
1038               /* In little-endian objects, r_info isn't really a
1039                  64-bit little-endian value: it has a 32-bit
1040                  little-endian symbol index followed by four
1041                  individual byte fields.  Reorder INFO
1042                  accordingly.  */
1043               bfd_vma inf = relas[i].r_info;
1044               inf = (((inf & 0xffffffff) << 32)
1045                       | ((inf >> 56) & 0xff)
1046                       | ((inf >> 40) & 0xff00)
1047                       | ((inf >> 24) & 0xff0000)
1048                       | ((inf >> 8) & 0xff000000));
1049               relas[i].r_info = inf;
1050             }
1051 #endif /* BFD64 */
1052         }
1053
1054       free (erelas);
1055     }
1056
1057   *relasp = relas;
1058   *nrelasp = nrelas;
1059   return TRUE;
1060 }
1061
1062 /* Load REL type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
1063    Returns TRUE upon success, FALSE otherwise.  If successful then a
1064    pointer to a malloc'ed buffer containing the relocs is placed in *RELSP,
1065    and the number of relocs loaded is placed in *NRELSP.  It is the caller's
1066    responsibility to free the allocated buffer.  */
1067
1068 static bfd_boolean
1069 slurp_rel_relocs (Filedata *            filedata,
1070                   unsigned long         rel_offset,
1071                   unsigned long         rel_size,
1072                   Elf_Internal_Rela **  relsp,
1073                   unsigned long *       nrelsp)
1074 {
1075   Elf_Internal_Rela * rels;
1076   size_t nrels;
1077   unsigned int i;
1078
1079   if (is_32bit_elf)
1080     {
1081       Elf32_External_Rel * erels;
1082
1083       erels = (Elf32_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1084                                                rel_size, _("32-bit relocation data"));
1085       if (!erels)
1086         return FALSE;
1087
1088       nrels = rel_size / sizeof (Elf32_External_Rel);
1089
1090       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1091
1092       if (rels == NULL)
1093         {
1094           free (erels);
1095           error (_("out of memory parsing relocs\n"));
1096           return FALSE;
1097         }
1098
1099       for (i = 0; i < nrels; i++)
1100         {
1101           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1102           rels[i].r_info   = BYTE_GET (erels[i].r_info);
1103           rels[i].r_addend = 0;
1104         }
1105
1106       free (erels);
1107     }
1108   else
1109     {
1110       Elf64_External_Rel * erels;
1111
1112       erels = (Elf64_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1113                                                rel_size, _("64-bit relocation data"));
1114       if (!erels)
1115         return FALSE;
1116
1117       nrels = rel_size / sizeof (Elf64_External_Rel);
1118
1119       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1120
1121       if (rels == NULL)
1122         {
1123           free (erels);
1124           error (_("out of memory parsing relocs\n"));
1125           return FALSE;
1126         }
1127
1128       for (i = 0; i < nrels; i++)
1129         {
1130           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1131           rels[i].r_info   = BYTE_GET (erels[i].r_info);
1132           rels[i].r_addend = 0;
1133
1134           /* The #ifdef BFD64 below is to prevent a compile time
1135              warning.  We know that if we do not have a 64 bit data
1136              type that we will never execute this code anyway.  */
1137 #ifdef BFD64
1138           if (filedata->file_header.e_machine == EM_MIPS
1139               && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
1140             {
1141               /* In little-endian objects, r_info isn't really a
1142                  64-bit little-endian value: it has a 32-bit
1143                  little-endian symbol index followed by four
1144                  individual byte fields.  Reorder INFO
1145                  accordingly.  */
1146               bfd_vma inf = rels[i].r_info;
1147               inf = (((inf & 0xffffffff) << 32)
1148                      | ((inf >> 56) & 0xff)
1149                      | ((inf >> 40) & 0xff00)
1150                      | ((inf >> 24) & 0xff0000)
1151                      | ((inf >> 8) & 0xff000000));
1152               rels[i].r_info = inf;
1153             }
1154 #endif /* BFD64 */
1155         }
1156
1157       free (erels);
1158     }
1159
1160   *relsp = rels;
1161   *nrelsp = nrels;
1162   return TRUE;
1163 }
1164
1165 /* Returns the reloc type extracted from the reloc info field.  */
1166
1167 static unsigned int
1168 get_reloc_type (Filedata * filedata, bfd_vma reloc_info)
1169 {
1170   if (is_32bit_elf)
1171     return ELF32_R_TYPE (reloc_info);
1172
1173   switch (filedata->file_header.e_machine)
1174     {
1175     case EM_MIPS:
1176       /* Note: We assume that reloc_info has already been adjusted for us.  */
1177       return ELF64_MIPS_R_TYPE (reloc_info);
1178
1179     case EM_SPARCV9:
1180       return ELF64_R_TYPE_ID (reloc_info);
1181
1182     default:
1183       return ELF64_R_TYPE (reloc_info);
1184     }
1185 }
1186
1187 /* Return the symbol index extracted from the reloc info field.  */
1188
1189 static bfd_vma
1190 get_reloc_symindex (bfd_vma reloc_info)
1191 {
1192   return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1193 }
1194
1195 static inline bfd_boolean
1196 uses_msp430x_relocs (Filedata * filedata)
1197 {
1198   return
1199     filedata->file_header.e_machine == EM_MSP430 /* Paranoia.  */
1200     /* GCC uses osabi == ELFOSBI_STANDALONE.  */
1201     && (((filedata->file_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1202         /* TI compiler uses ELFOSABI_NONE.  */
1203         || (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1204 }
1205
1206 /* Display the contents of the relocation data found at the specified
1207    offset.  */
1208
1209 static bfd_boolean
1210 dump_relocations (Filedata *          filedata,
1211                   unsigned long       rel_offset,
1212                   unsigned long       rel_size,
1213                   Elf_Internal_Sym *  symtab,
1214                   unsigned long       nsyms,
1215                   char *              strtab,
1216                   unsigned long       strtablen,
1217                   int                 is_rela,
1218                   bfd_boolean         is_dynsym)
1219 {
1220   unsigned long i;
1221   Elf_Internal_Rela * rels;
1222   bfd_boolean res = TRUE;
1223
1224   if (is_rela == UNKNOWN)
1225     is_rela = guess_is_rela (filedata->file_header.e_machine);
1226
1227   if (is_rela)
1228     {
1229       if (!slurp_rela_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1230         return FALSE;
1231     }
1232   else
1233     {
1234       if (!slurp_rel_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1235         return FALSE;
1236     }
1237
1238   if (is_32bit_elf)
1239     {
1240       if (is_rela)
1241         {
1242           if (do_wide)
1243             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name + Addend\n"));
1244           else
1245             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name + Addend\n"));
1246         }
1247       else
1248         {
1249           if (do_wide)
1250             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name\n"));
1251           else
1252             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name\n"));
1253         }
1254     }
1255   else
1256     {
1257       if (is_rela)
1258         {
1259           if (do_wide)
1260             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend\n"));
1261           else
1262             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name + Addend\n"));
1263         }
1264       else
1265         {
1266           if (do_wide)
1267             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name\n"));
1268           else
1269             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name\n"));
1270         }
1271     }
1272
1273   for (i = 0; i < rel_size; i++)
1274     {
1275       const char * rtype;
1276       bfd_vma offset;
1277       bfd_vma inf;
1278       bfd_vma symtab_index;
1279       bfd_vma type;
1280
1281       offset = rels[i].r_offset;
1282       inf    = rels[i].r_info;
1283
1284       type = get_reloc_type (filedata, inf);
1285       symtab_index = get_reloc_symindex  (inf);
1286
1287       if (is_32bit_elf)
1288         {
1289           printf ("%8.8lx  %8.8lx ",
1290                   (unsigned long) offset & 0xffffffff,
1291                   (unsigned long) inf & 0xffffffff);
1292         }
1293       else
1294         {
1295           printf (do_wide
1296                   ? "%16.16" BFD_VMA_FMT "x  %16.16" BFD_VMA_FMT "x "
1297                   : "%12.12" BFD_VMA_FMT "x  %12.12" BFD_VMA_FMT "x ",
1298                   offset, inf);
1299         }
1300
1301       switch (filedata->file_header.e_machine)
1302         {
1303         default:
1304           rtype = NULL;
1305           break;
1306
1307         case EM_AARCH64:
1308           rtype = elf_aarch64_reloc_type (type);
1309           break;
1310
1311         case EM_M32R:
1312         case EM_CYGNUS_M32R:
1313           rtype = elf_m32r_reloc_type (type);
1314           break;
1315
1316         case EM_386:
1317         case EM_IAMCU:
1318           rtype = elf_i386_reloc_type (type);
1319           break;
1320
1321         case EM_68HC11:
1322         case EM_68HC12:
1323           rtype = elf_m68hc11_reloc_type (type);
1324           break;
1325
1326         case EM_S12Z:
1327           rtype = elf_s12z_reloc_type (type);
1328           break;
1329
1330         case EM_68K:
1331           rtype = elf_m68k_reloc_type (type);
1332           break;
1333
1334         case EM_960:
1335           rtype = elf_i960_reloc_type (type);
1336           break;
1337
1338         case EM_AVR:
1339         case EM_AVR_OLD:
1340           rtype = elf_avr_reloc_type (type);
1341           break;
1342
1343         case EM_OLD_SPARCV9:
1344         case EM_SPARC32PLUS:
1345         case EM_SPARCV9:
1346         case EM_SPARC:
1347           rtype = elf_sparc_reloc_type (type);
1348           break;
1349
1350         case EM_SPU:
1351           rtype = elf_spu_reloc_type (type);
1352           break;
1353
1354         case EM_V800:
1355           rtype = v800_reloc_type (type);
1356           break;
1357         case EM_V850:
1358         case EM_CYGNUS_V850:
1359           rtype = v850_reloc_type (type);
1360           break;
1361
1362         case EM_D10V:
1363         case EM_CYGNUS_D10V:
1364           rtype = elf_d10v_reloc_type (type);
1365           break;
1366
1367         case EM_D30V:
1368         case EM_CYGNUS_D30V:
1369           rtype = elf_d30v_reloc_type (type);
1370           break;
1371
1372         case EM_DLX:
1373           rtype = elf_dlx_reloc_type (type);
1374           break;
1375
1376         case EM_SH:
1377           rtype = elf_sh_reloc_type (type);
1378           break;
1379
1380         case EM_MN10300:
1381         case EM_CYGNUS_MN10300:
1382           rtype = elf_mn10300_reloc_type (type);
1383           break;
1384
1385         case EM_MN10200:
1386         case EM_CYGNUS_MN10200:
1387           rtype = elf_mn10200_reloc_type (type);
1388           break;
1389
1390         case EM_FR30:
1391         case EM_CYGNUS_FR30:
1392           rtype = elf_fr30_reloc_type (type);
1393           break;
1394
1395         case EM_CYGNUS_FRV:
1396           rtype = elf_frv_reloc_type (type);
1397           break;
1398
1399         case EM_CSKY:
1400           rtype = elf_csky_reloc_type (type);
1401           break;
1402
1403         case EM_FT32:
1404           rtype = elf_ft32_reloc_type (type);
1405           break;
1406
1407         case EM_MCORE:
1408           rtype = elf_mcore_reloc_type (type);
1409           break;
1410
1411         case EM_MMIX:
1412           rtype = elf_mmix_reloc_type (type);
1413           break;
1414
1415         case EM_MOXIE:
1416           rtype = elf_moxie_reloc_type (type);
1417           break;
1418
1419         case EM_MSP430:
1420           if (uses_msp430x_relocs (filedata))
1421             {
1422               rtype = elf_msp430x_reloc_type (type);
1423               break;
1424             }
1425           /* Fall through.  */
1426         case EM_MSP430_OLD:
1427           rtype = elf_msp430_reloc_type (type);
1428           break;
1429
1430         case EM_NDS32:
1431           rtype = elf_nds32_reloc_type (type);
1432           break;
1433
1434         case EM_PPC:
1435           rtype = elf_ppc_reloc_type (type);
1436           break;
1437
1438         case EM_PPC64:
1439           rtype = elf_ppc64_reloc_type (type);
1440           break;
1441
1442         case EM_MIPS:
1443         case EM_MIPS_RS3_LE:
1444           rtype = elf_mips_reloc_type (type);
1445           break;
1446
1447         case EM_RISCV:
1448           rtype = elf_riscv_reloc_type (type);
1449           break;
1450
1451         case EM_ALPHA:
1452           rtype = elf_alpha_reloc_type (type);
1453           break;
1454
1455         case EM_ARM:
1456           rtype = elf_arm_reloc_type (type);
1457           break;
1458
1459         case EM_ARC:
1460         case EM_ARC_COMPACT:
1461         case EM_ARC_COMPACT2:
1462           rtype = elf_arc_reloc_type (type);
1463           break;
1464
1465         case EM_PARISC:
1466           rtype = elf_hppa_reloc_type (type);
1467           break;
1468
1469         case EM_H8_300:
1470         case EM_H8_300H:
1471         case EM_H8S:
1472           rtype = elf_h8_reloc_type (type);
1473           break;
1474
1475         case EM_OR1K:
1476           rtype = elf_or1k_reloc_type (type);
1477           break;
1478
1479         case EM_PJ:
1480         case EM_PJ_OLD:
1481           rtype = elf_pj_reloc_type (type);
1482           break;
1483         case EM_IA_64:
1484           rtype = elf_ia64_reloc_type (type);
1485           break;
1486
1487         case EM_CRIS:
1488           rtype = elf_cris_reloc_type (type);
1489           break;
1490
1491         case EM_860:
1492           rtype = elf_i860_reloc_type (type);
1493           break;
1494
1495         case EM_X86_64:
1496         case EM_L1OM:
1497         case EM_K1OM:
1498           rtype = elf_x86_64_reloc_type (type);
1499           break;
1500
1501         case EM_S370:
1502           rtype = i370_reloc_type (type);
1503           break;
1504
1505         case EM_S390_OLD:
1506         case EM_S390:
1507           rtype = elf_s390_reloc_type (type);
1508           break;
1509
1510         case EM_SCORE:
1511           rtype = elf_score_reloc_type (type);
1512           break;
1513
1514         case EM_XSTORMY16:
1515           rtype = elf_xstormy16_reloc_type (type);
1516           break;
1517
1518         case EM_CRX:
1519           rtype = elf_crx_reloc_type (type);
1520           break;
1521
1522         case EM_VAX:
1523           rtype = elf_vax_reloc_type (type);
1524           break;
1525
1526         case EM_VISIUM:
1527           rtype = elf_visium_reloc_type (type);
1528           break;
1529
1530         case EM_BPF:
1531           rtype = elf_bpf_reloc_type (type);
1532           break;
1533
1534         case EM_ADAPTEVA_EPIPHANY:
1535           rtype = elf_epiphany_reloc_type (type);
1536           break;
1537
1538         case EM_IP2K:
1539         case EM_IP2K_OLD:
1540           rtype = elf_ip2k_reloc_type (type);
1541           break;
1542
1543         case EM_IQ2000:
1544           rtype = elf_iq2000_reloc_type (type);
1545           break;
1546
1547         case EM_XTENSA_OLD:
1548         case EM_XTENSA:
1549           rtype = elf_xtensa_reloc_type (type);
1550           break;
1551
1552         case EM_LATTICEMICO32:
1553           rtype = elf_lm32_reloc_type (type);
1554           break;
1555
1556         case EM_M32C_OLD:
1557         case EM_M32C:
1558           rtype = elf_m32c_reloc_type (type);
1559           break;
1560
1561         case EM_MT:
1562           rtype = elf_mt_reloc_type (type);
1563           break;
1564
1565         case EM_BLACKFIN:
1566           rtype = elf_bfin_reloc_type (type);
1567           break;
1568
1569         case EM_CYGNUS_MEP:
1570           rtype = elf_mep_reloc_type (type);
1571           break;
1572
1573         case EM_CR16:
1574           rtype = elf_cr16_reloc_type (type);
1575           break;
1576
1577         case EM_MICROBLAZE:
1578         case EM_MICROBLAZE_OLD:
1579           rtype = elf_microblaze_reloc_type (type);
1580           break;
1581
1582         case EM_RL78:
1583           rtype = elf_rl78_reloc_type (type);
1584           break;
1585
1586         case EM_RX:
1587           rtype = elf_rx_reloc_type (type);
1588           break;
1589
1590         case EM_METAG:
1591           rtype = elf_metag_reloc_type (type);
1592           break;
1593
1594         case EM_XC16X:
1595         case EM_C166:
1596           rtype = elf_xc16x_reloc_type (type);
1597           break;
1598
1599         case EM_TI_C6000:
1600           rtype = elf_tic6x_reloc_type (type);
1601           break;
1602
1603         case EM_TILEGX:
1604           rtype = elf_tilegx_reloc_type (type);
1605           break;
1606
1607         case EM_TILEPRO:
1608           rtype = elf_tilepro_reloc_type (type);
1609           break;
1610
1611         case EM_WEBASSEMBLY:
1612           rtype = elf_wasm32_reloc_type (type);
1613           break;
1614
1615         case EM_XGATE:
1616           rtype = elf_xgate_reloc_type (type);
1617           break;
1618
1619         case EM_ALTERA_NIOS2:
1620           rtype = elf_nios2_reloc_type (type);
1621           break;
1622
1623         case EM_TI_PRU:
1624           rtype = elf_pru_reloc_type (type);
1625           break;
1626
1627         case EM_NFP:
1628           if (EF_NFP_MACH (filedata->file_header.e_flags) == E_NFP_MACH_3200)
1629             rtype = elf_nfp3200_reloc_type (type);
1630           else
1631             rtype = elf_nfp_reloc_type (type);
1632           break;
1633
1634         case EM_Z80:
1635           rtype = elf_z80_reloc_type (type);
1636           break;
1637         }
1638
1639       if (rtype == NULL)
1640         printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1641       else
1642         printf (do_wide ? "%-22s" : "%-17.17s", rtype);
1643
1644       if (filedata->file_header.e_machine == EM_ALPHA
1645           && rtype != NULL
1646           && streq (rtype, "R_ALPHA_LITUSE")
1647           && is_rela)
1648         {
1649           switch (rels[i].r_addend)
1650             {
1651             case LITUSE_ALPHA_ADDR:   rtype = "ADDR";   break;
1652             case LITUSE_ALPHA_BASE:   rtype = "BASE";   break;
1653             case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1654             case LITUSE_ALPHA_JSR:    rtype = "JSR";    break;
1655             case LITUSE_ALPHA_TLSGD:  rtype = "TLSGD";  break;
1656             case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1657             case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1658             default: rtype = NULL;
1659             }
1660
1661           if (rtype)
1662             printf (" (%s)", rtype);
1663           else
1664             {
1665               putchar (' ');
1666               printf (_("<unknown addend: %lx>"),
1667                       (unsigned long) rels[i].r_addend);
1668               res = FALSE;
1669             }
1670         }
1671       else if (symtab_index)
1672         {
1673           if (symtab == NULL || symtab_index >= nsyms)
1674             {
1675               error (_(" bad symbol index: %08lx in reloc\n"),
1676                      (unsigned long) symtab_index);
1677               res = FALSE;
1678             }
1679           else
1680             {
1681               Elf_Internal_Sym * psym;
1682               const char * version_string;
1683               enum versioned_symbol_info sym_info;
1684               unsigned short vna_other;
1685
1686               psym = symtab + symtab_index;
1687
1688               version_string
1689                 = get_symbol_version_string (filedata, is_dynsym,
1690                                              strtab, strtablen,
1691                                              symtab_index,
1692                                              psym,
1693                                              &sym_info,
1694                                              &vna_other);
1695
1696               printf (" ");
1697
1698               if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1699                 {
1700                   const char * name;
1701                   unsigned int len;
1702                   unsigned int width = is_32bit_elf ? 8 : 14;
1703
1704                   /* Relocations against GNU_IFUNC symbols do not use the value
1705                      of the symbol as the address to relocate against.  Instead
1706                      they invoke the function named by the symbol and use its
1707                      result as the address for relocation.
1708
1709                      To indicate this to the user, do not display the value of
1710                      the symbol in the "Symbols's Value" field.  Instead show
1711                      its name followed by () as a hint that the symbol is
1712                      invoked.  */
1713
1714                   if (strtab == NULL
1715                       || psym->st_name == 0
1716                       || psym->st_name >= strtablen)
1717                     name = "??";
1718                   else
1719                     name = strtab + psym->st_name;
1720
1721                   len = print_symbol (width, name);
1722                   if (version_string)
1723                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1724                             version_string);
1725                   printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1726                 }
1727               else
1728                 {
1729                   print_vma (psym->st_value, LONG_HEX);
1730
1731                   printf (is_32bit_elf ? "   " : " ");
1732                 }
1733
1734               if (psym->st_name == 0)
1735                 {
1736                   const char * sec_name = "<null>";
1737                   char name_buf[40];
1738
1739                   if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1740                     {
1741                       if (psym->st_shndx < filedata->file_header.e_shnum)
1742                         sec_name = SECTION_NAME_PRINT (filedata->section_headers
1743                                                        + psym->st_shndx);
1744                       else if (psym->st_shndx == SHN_ABS)
1745                         sec_name = "ABS";
1746                       else if (psym->st_shndx == SHN_COMMON)
1747                         sec_name = "COMMON";
1748                       else if ((filedata->file_header.e_machine == EM_MIPS
1749                                 && psym->st_shndx == SHN_MIPS_SCOMMON)
1750                                || (filedata->file_header.e_machine == EM_TI_C6000
1751                                    && psym->st_shndx == SHN_TIC6X_SCOMMON))
1752                         sec_name = "SCOMMON";
1753                       else if (filedata->file_header.e_machine == EM_MIPS
1754                                && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1755                         sec_name = "SUNDEF";
1756                       else if ((filedata->file_header.e_machine == EM_X86_64
1757                                 || filedata->file_header.e_machine == EM_L1OM
1758                                 || filedata->file_header.e_machine == EM_K1OM)
1759                                && psym->st_shndx == SHN_X86_64_LCOMMON)
1760                         sec_name = "LARGE_COMMON";
1761                       else if (filedata->file_header.e_machine == EM_IA_64
1762                                && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1763                                && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1764                         sec_name = "ANSI_COM";
1765                       else if (is_ia64_vms (filedata)
1766                                && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1767                         sec_name = "VMS_SYMVEC";
1768                       else
1769                         {
1770                           sprintf (name_buf, "<section 0x%x>",
1771                                    (unsigned int) psym->st_shndx);
1772                           sec_name = name_buf;
1773                         }
1774                     }
1775                   print_symbol (22, sec_name);
1776                 }
1777               else if (strtab == NULL)
1778                 printf (_("<string table index: %3ld>"), psym->st_name);
1779               else if (psym->st_name >= strtablen)
1780                 {
1781                   error (_("<corrupt string table index: %3ld>\n"),
1782                          psym->st_name);
1783                   res = FALSE;
1784                 }
1785               else
1786                 {
1787                   print_symbol (22, strtab + psym->st_name);
1788                   if (version_string)
1789                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1790                             version_string);
1791                 }
1792
1793               if (is_rela)
1794                 {
1795                   bfd_vma off = rels[i].r_addend;
1796
1797                   if ((bfd_signed_vma) off < 0)
1798                     printf (" - %" BFD_VMA_FMT "x", - off);
1799                   else
1800                     printf (" + %" BFD_VMA_FMT "x", off);
1801                 }
1802             }
1803         }
1804       else if (is_rela)
1805         {
1806           bfd_vma off = rels[i].r_addend;
1807
1808           printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1809           if ((bfd_signed_vma) off < 0)
1810             printf ("-%" BFD_VMA_FMT "x", - off);
1811           else
1812             printf ("%" BFD_VMA_FMT "x", off);
1813         }
1814
1815       if (filedata->file_header.e_machine == EM_SPARCV9
1816           && rtype != NULL
1817           && streq (rtype, "R_SPARC_OLO10"))
1818         printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1819
1820       putchar ('\n');
1821
1822 #ifdef BFD64
1823       if (! is_32bit_elf && filedata->file_header.e_machine == EM_MIPS)
1824         {
1825           bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1826           bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1827           const char * rtype2 = elf_mips_reloc_type (type2);
1828           const char * rtype3 = elf_mips_reloc_type (type3);
1829
1830           printf ("                    Type2: ");
1831
1832           if (rtype2 == NULL)
1833             printf (_("unrecognized: %-7lx"),
1834                     (unsigned long) type2 & 0xffffffff);
1835           else
1836             printf ("%-17.17s", rtype2);
1837
1838           printf ("\n                    Type3: ");
1839
1840           if (rtype3 == NULL)
1841             printf (_("unrecognized: %-7lx"),
1842                     (unsigned long) type3 & 0xffffffff);
1843           else
1844             printf ("%-17.17s", rtype3);
1845
1846           putchar ('\n');
1847         }
1848 #endif /* BFD64 */
1849     }
1850
1851   free (rels);
1852
1853   return res;
1854 }
1855
1856 static const char *
1857 get_aarch64_dynamic_type (unsigned long type)
1858 {
1859   switch (type)
1860     {
1861     case DT_AARCH64_BTI_PLT:  return "AARCH64_BTI_PLT";
1862     case DT_AARCH64_PAC_PLT:  return "AARCH64_PAC_PLT";
1863     case DT_AARCH64_VARIANT_PCS:  return "AARCH64_VARIANT_PCS";
1864     default:
1865       return NULL;
1866     }
1867 }
1868
1869 static const char *
1870 get_mips_dynamic_type (unsigned long type)
1871 {
1872   switch (type)
1873     {
1874     case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1875     case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1876     case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1877     case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1878     case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1879     case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1880     case DT_MIPS_MSYM: return "MIPS_MSYM";
1881     case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1882     case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1883     case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1884     case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1885     case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1886     case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1887     case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1888     case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1889     case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1890     case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1891     case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1892     case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1893     case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1894     case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1895     case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1896     case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1897     case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1898     case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1899     case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1900     case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1901     case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1902     case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1903     case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1904     case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1905     case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1906     case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1907     case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1908     case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1909     case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1910     case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1911     case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1912     case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1913     case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1914     case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1915     case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1916     case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1917     case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1918     case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1919     case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1920     case DT_MIPS_XHASH: return "MIPS_XHASH";
1921     default:
1922       return NULL;
1923     }
1924 }
1925
1926 static const char *
1927 get_sparc64_dynamic_type (unsigned long type)
1928 {
1929   switch (type)
1930     {
1931     case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1932     default:
1933       return NULL;
1934     }
1935 }
1936
1937 static const char *
1938 get_ppc_dynamic_type (unsigned long type)
1939 {
1940   switch (type)
1941     {
1942     case DT_PPC_GOT:    return "PPC_GOT";
1943     case DT_PPC_OPT:    return "PPC_OPT";
1944     default:
1945       return NULL;
1946     }
1947 }
1948
1949 static const char *
1950 get_ppc64_dynamic_type (unsigned long type)
1951 {
1952   switch (type)
1953     {
1954     case DT_PPC64_GLINK:  return "PPC64_GLINK";
1955     case DT_PPC64_OPD:    return "PPC64_OPD";
1956     case DT_PPC64_OPDSZ:  return "PPC64_OPDSZ";
1957     case DT_PPC64_OPT:    return "PPC64_OPT";
1958     default:
1959       return NULL;
1960     }
1961 }
1962
1963 static const char *
1964 get_parisc_dynamic_type (unsigned long type)
1965 {
1966   switch (type)
1967     {
1968     case DT_HP_LOAD_MAP:        return "HP_LOAD_MAP";
1969     case DT_HP_DLD_FLAGS:       return "HP_DLD_FLAGS";
1970     case DT_HP_DLD_HOOK:        return "HP_DLD_HOOK";
1971     case DT_HP_UX10_INIT:       return "HP_UX10_INIT";
1972     case DT_HP_UX10_INITSZ:     return "HP_UX10_INITSZ";
1973     case DT_HP_PREINIT:         return "HP_PREINIT";
1974     case DT_HP_PREINITSZ:       return "HP_PREINITSZ";
1975     case DT_HP_NEEDED:          return "HP_NEEDED";
1976     case DT_HP_TIME_STAMP:      return "HP_TIME_STAMP";
1977     case DT_HP_CHECKSUM:        return "HP_CHECKSUM";
1978     case DT_HP_GST_SIZE:        return "HP_GST_SIZE";
1979     case DT_HP_GST_VERSION:     return "HP_GST_VERSION";
1980     case DT_HP_GST_HASHVAL:     return "HP_GST_HASHVAL";
1981     case DT_HP_EPLTREL:         return "HP_GST_EPLTREL";
1982     case DT_HP_EPLTRELSZ:       return "HP_GST_EPLTRELSZ";
1983     case DT_HP_FILTERED:        return "HP_FILTERED";
1984     case DT_HP_FILTER_TLS:      return "HP_FILTER_TLS";
1985     case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1986     case DT_HP_LAZYLOAD:        return "HP_LAZYLOAD";
1987     case DT_HP_BIND_NOW_COUNT:  return "HP_BIND_NOW_COUNT";
1988     case DT_PLT:                return "PLT";
1989     case DT_PLT_SIZE:           return "PLT_SIZE";
1990     case DT_DLT:                return "DLT";
1991     case DT_DLT_SIZE:           return "DLT_SIZE";
1992     default:
1993       return NULL;
1994     }
1995 }
1996
1997 static const char *
1998 get_ia64_dynamic_type (unsigned long type)
1999 {
2000   switch (type)
2001     {
2002     case DT_IA_64_PLT_RESERVE:         return "IA_64_PLT_RESERVE";
2003     case DT_IA_64_VMS_SUBTYPE:         return "VMS_SUBTYPE";
2004     case DT_IA_64_VMS_IMGIOCNT:        return "VMS_IMGIOCNT";
2005     case DT_IA_64_VMS_LNKFLAGS:        return "VMS_LNKFLAGS";
2006     case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
2007     case DT_IA_64_VMS_IDENT:           return "VMS_IDENT";
2008     case DT_IA_64_VMS_NEEDED_IDENT:    return "VMS_NEEDED_IDENT";
2009     case DT_IA_64_VMS_IMG_RELA_CNT:    return "VMS_IMG_RELA_CNT";
2010     case DT_IA_64_VMS_SEG_RELA_CNT:    return "VMS_SEG_RELA_CNT";
2011     case DT_IA_64_VMS_FIXUP_RELA_CNT:  return "VMS_FIXUP_RELA_CNT";
2012     case DT_IA_64_VMS_FIXUP_NEEDED:    return "VMS_FIXUP_NEEDED";
2013     case DT_IA_64_VMS_SYMVEC_CNT:      return "VMS_SYMVEC_CNT";
2014     case DT_IA_64_VMS_XLATED:          return "VMS_XLATED";
2015     case DT_IA_64_VMS_STACKSIZE:       return "VMS_STACKSIZE";
2016     case DT_IA_64_VMS_UNWINDSZ:        return "VMS_UNWINDSZ";
2017     case DT_IA_64_VMS_UNWIND_CODSEG:   return "VMS_UNWIND_CODSEG";
2018     case DT_IA_64_VMS_UNWIND_INFOSEG:  return "VMS_UNWIND_INFOSEG";
2019     case DT_IA_64_VMS_LINKTIME:        return "VMS_LINKTIME";
2020     case DT_IA_64_VMS_SEG_NO:          return "VMS_SEG_NO";
2021     case DT_IA_64_VMS_SYMVEC_OFFSET:   return "VMS_SYMVEC_OFFSET";
2022     case DT_IA_64_VMS_SYMVEC_SEG:      return "VMS_SYMVEC_SEG";
2023     case DT_IA_64_VMS_UNWIND_OFFSET:   return "VMS_UNWIND_OFFSET";
2024     case DT_IA_64_VMS_UNWIND_SEG:      return "VMS_UNWIND_SEG";
2025     case DT_IA_64_VMS_STRTAB_OFFSET:   return "VMS_STRTAB_OFFSET";
2026     case DT_IA_64_VMS_SYSVER_OFFSET:   return "VMS_SYSVER_OFFSET";
2027     case DT_IA_64_VMS_IMG_RELA_OFF:    return "VMS_IMG_RELA_OFF";
2028     case DT_IA_64_VMS_SEG_RELA_OFF:    return "VMS_SEG_RELA_OFF";
2029     case DT_IA_64_VMS_FIXUP_RELA_OFF:  return "VMS_FIXUP_RELA_OFF";
2030     case DT_IA_64_VMS_PLTGOT_OFFSET:   return "VMS_PLTGOT_OFFSET";
2031     case DT_IA_64_VMS_PLTGOT_SEG:      return "VMS_PLTGOT_SEG";
2032     case DT_IA_64_VMS_FPMODE:          return "VMS_FPMODE";
2033     default:
2034       return NULL;
2035     }
2036 }
2037
2038 static const char *
2039 get_solaris_section_type (unsigned long type)
2040 {
2041   switch (type)
2042     {
2043     case 0x6fffffee: return "SUNW_ancillary";
2044     case 0x6fffffef: return "SUNW_capchain";
2045     case 0x6ffffff0: return "SUNW_capinfo";
2046     case 0x6ffffff1: return "SUNW_symsort";
2047     case 0x6ffffff2: return "SUNW_tlssort";
2048     case 0x6ffffff3: return "SUNW_LDYNSYM";
2049     case 0x6ffffff4: return "SUNW_dof";
2050     case 0x6ffffff5: return "SUNW_cap";
2051     case 0x6ffffff6: return "SUNW_SIGNATURE";
2052     case 0x6ffffff7: return "SUNW_ANNOTATE";
2053     case 0x6ffffff8: return "SUNW_DEBUGSTR";
2054     case 0x6ffffff9: return "SUNW_DEBUG";
2055     case 0x6ffffffa: return "SUNW_move";
2056     case 0x6ffffffb: return "SUNW_COMDAT";
2057     case 0x6ffffffc: return "SUNW_syminfo";
2058     case 0x6ffffffd: return "SUNW_verdef";
2059     case 0x6ffffffe: return "SUNW_verneed";
2060     case 0x6fffffff: return "SUNW_versym";
2061     case 0x70000000: return "SPARC_GOTDATA";
2062     default: return NULL;
2063     }
2064 }
2065
2066 static const char *
2067 get_alpha_dynamic_type (unsigned long type)
2068 {
2069   switch (type)
2070     {
2071     case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
2072     default: return NULL;
2073     }
2074 }
2075
2076 static const char *
2077 get_score_dynamic_type (unsigned long type)
2078 {
2079   switch (type)
2080     {
2081     case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
2082     case DT_SCORE_LOCAL_GOTNO:  return "SCORE_LOCAL_GOTNO";
2083     case DT_SCORE_SYMTABNO:     return "SCORE_SYMTABNO";
2084     case DT_SCORE_GOTSYM:       return "SCORE_GOTSYM";
2085     case DT_SCORE_UNREFEXTNO:   return "SCORE_UNREFEXTNO";
2086     case DT_SCORE_HIPAGENO:     return "SCORE_HIPAGENO";
2087     default:                    return NULL;
2088     }
2089 }
2090
2091 static const char *
2092 get_tic6x_dynamic_type (unsigned long type)
2093 {
2094   switch (type)
2095     {
2096     case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
2097     case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
2098     case DT_C6000_DSBT_BASE:   return "C6000_DSBT_BASE";
2099     case DT_C6000_DSBT_SIZE:   return "C6000_DSBT_SIZE";
2100     case DT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
2101     case DT_C6000_DSBT_INDEX:  return "C6000_DSBT_INDEX";
2102     default:                   return NULL;
2103     }
2104 }
2105
2106 static const char *
2107 get_nios2_dynamic_type (unsigned long type)
2108 {
2109   switch (type)
2110     {
2111     case DT_NIOS2_GP: return "NIOS2_GP";
2112     default:          return NULL;
2113     }
2114 }
2115
2116 static const char *
2117 get_solaris_dynamic_type (unsigned long type)
2118 {
2119   switch (type)
2120     {
2121     case 0x6000000d: return "SUNW_AUXILIARY";
2122     case 0x6000000e: return "SUNW_RTLDINF";
2123     case 0x6000000f: return "SUNW_FILTER";
2124     case 0x60000010: return "SUNW_CAP";
2125     case 0x60000011: return "SUNW_SYMTAB";
2126     case 0x60000012: return "SUNW_SYMSZ";
2127     case 0x60000013: return "SUNW_SORTENT";
2128     case 0x60000014: return "SUNW_SYMSORT";
2129     case 0x60000015: return "SUNW_SYMSORTSZ";
2130     case 0x60000016: return "SUNW_TLSSORT";
2131     case 0x60000017: return "SUNW_TLSSORTSZ";
2132     case 0x60000018: return "SUNW_CAPINFO";
2133     case 0x60000019: return "SUNW_STRPAD";
2134     case 0x6000001a: return "SUNW_CAPCHAIN";
2135     case 0x6000001b: return "SUNW_LDMACH";
2136     case 0x6000001d: return "SUNW_CAPCHAINENT";
2137     case 0x6000001f: return "SUNW_CAPCHAINSZ";
2138     case 0x60000021: return "SUNW_PARENT";
2139     case 0x60000023: return "SUNW_ASLR";
2140     case 0x60000025: return "SUNW_RELAX";
2141     case 0x60000029: return "SUNW_NXHEAP";
2142     case 0x6000002b: return "SUNW_NXSTACK";
2143
2144     case 0x70000001: return "SPARC_REGISTER";
2145     case 0x7ffffffd: return "AUXILIARY";
2146     case 0x7ffffffe: return "USED";
2147     case 0x7fffffff: return "FILTER";
2148
2149     default: return NULL;
2150     }
2151 }
2152
2153 static const char *
2154 get_dynamic_type (Filedata * filedata, unsigned long type)
2155 {
2156   static char buff[64];
2157
2158   switch (type)
2159     {
2160     case DT_NULL:       return "NULL";
2161     case DT_NEEDED:     return "NEEDED";
2162     case DT_PLTRELSZ:   return "PLTRELSZ";
2163     case DT_PLTGOT:     return "PLTGOT";
2164     case DT_HASH:       return "HASH";
2165     case DT_STRTAB:     return "STRTAB";
2166     case DT_SYMTAB:     return "SYMTAB";
2167     case DT_RELA:       return "RELA";
2168     case DT_RELASZ:     return "RELASZ";
2169     case DT_RELAENT:    return "RELAENT";
2170     case DT_STRSZ:      return "STRSZ";
2171     case DT_SYMENT:     return "SYMENT";
2172     case DT_INIT:       return "INIT";
2173     case DT_FINI:       return "FINI";
2174     case DT_SONAME:     return "SONAME";
2175     case DT_RPATH:      return "RPATH";
2176     case DT_SYMBOLIC:   return "SYMBOLIC";
2177     case DT_REL:        return "REL";
2178     case DT_RELSZ:      return "RELSZ";
2179     case DT_RELENT:     return "RELENT";
2180     case DT_PLTREL:     return "PLTREL";
2181     case DT_DEBUG:      return "DEBUG";
2182     case DT_TEXTREL:    return "TEXTREL";
2183     case DT_JMPREL:     return "JMPREL";
2184     case DT_BIND_NOW:   return "BIND_NOW";
2185     case DT_INIT_ARRAY: return "INIT_ARRAY";
2186     case DT_FINI_ARRAY: return "FINI_ARRAY";
2187     case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2188     case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
2189     case DT_RUNPATH:    return "RUNPATH";
2190     case DT_FLAGS:      return "FLAGS";
2191
2192     case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2193     case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
2194     case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX";
2195
2196     case DT_CHECKSUM:   return "CHECKSUM";
2197     case DT_PLTPADSZ:   return "PLTPADSZ";
2198     case DT_MOVEENT:    return "MOVEENT";
2199     case DT_MOVESZ:     return "MOVESZ";
2200     case DT_FEATURE:    return "FEATURE";
2201     case DT_POSFLAG_1:  return "POSFLAG_1";
2202     case DT_SYMINSZ:    return "SYMINSZ";
2203     case DT_SYMINENT:   return "SYMINENT"; /* aka VALRNGHI */
2204
2205     case DT_ADDRRNGLO:  return "ADDRRNGLO";
2206     case DT_CONFIG:     return "CONFIG";
2207     case DT_DEPAUDIT:   return "DEPAUDIT";
2208     case DT_AUDIT:      return "AUDIT";
2209     case DT_PLTPAD:     return "PLTPAD";
2210     case DT_MOVETAB:    return "MOVETAB";
2211     case DT_SYMINFO:    return "SYMINFO"; /* aka ADDRRNGHI */
2212
2213     case DT_VERSYM:     return "VERSYM";
2214
2215     case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2216     case DT_TLSDESC_PLT: return "TLSDESC_PLT";
2217     case DT_RELACOUNT:  return "RELACOUNT";
2218     case DT_RELCOUNT:   return "RELCOUNT";
2219     case DT_FLAGS_1:    return "FLAGS_1";
2220     case DT_VERDEF:     return "VERDEF";
2221     case DT_VERDEFNUM:  return "VERDEFNUM";
2222     case DT_VERNEED:    return "VERNEED";
2223     case DT_VERNEEDNUM: return "VERNEEDNUM";
2224
2225     case DT_AUXILIARY:  return "AUXILIARY";
2226     case DT_USED:       return "USED";
2227     case DT_FILTER:     return "FILTER";
2228
2229     case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2230     case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2231     case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2232     case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2233     case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
2234     case DT_GNU_HASH:   return "GNU_HASH";
2235     case DT_GNU_FLAGS_1: return "GNU_FLAGS_1";
2236
2237     default:
2238       if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2239         {
2240           const char * result;
2241
2242           switch (filedata->file_header.e_machine)
2243             {
2244             case EM_AARCH64:
2245               result = get_aarch64_dynamic_type (type);
2246               break;
2247             case EM_MIPS:
2248             case EM_MIPS_RS3_LE:
2249               result = get_mips_dynamic_type (type);
2250               break;
2251             case EM_SPARCV9:
2252               result = get_sparc64_dynamic_type (type);
2253               break;
2254             case EM_PPC:
2255               result = get_ppc_dynamic_type (type);
2256               break;
2257             case EM_PPC64:
2258               result = get_ppc64_dynamic_type (type);
2259               break;
2260             case EM_IA_64:
2261               result = get_ia64_dynamic_type (type);
2262               break;
2263             case EM_ALPHA:
2264               result = get_alpha_dynamic_type (type);
2265               break;
2266             case EM_SCORE:
2267               result = get_score_dynamic_type (type);
2268               break;
2269             case EM_TI_C6000:
2270               result = get_tic6x_dynamic_type (type);
2271               break;
2272             case EM_ALTERA_NIOS2:
2273               result = get_nios2_dynamic_type (type);
2274               break;
2275             default:
2276               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2277                 result = get_solaris_dynamic_type (type);
2278               else
2279                 result = NULL;
2280               break;
2281             }
2282
2283           if (result != NULL)
2284             return result;
2285
2286           snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2287         }
2288       else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2289                || (filedata->file_header.e_machine == EM_PARISC
2290                    && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2291         {
2292           const char * result;
2293
2294           switch (filedata->file_header.e_machine)
2295             {
2296             case EM_PARISC:
2297               result = get_parisc_dynamic_type (type);
2298               break;
2299             case EM_IA_64:
2300               result = get_ia64_dynamic_type (type);
2301               break;
2302             default:
2303               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2304                 result = get_solaris_dynamic_type (type);
2305               else
2306                 result = NULL;
2307               break;
2308             }
2309
2310           if (result != NULL)
2311             return result;
2312
2313           snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2314                     type);
2315         }
2316       else
2317         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2318
2319       return buff;
2320     }
2321 }
2322
2323 static char *
2324 get_file_type (unsigned e_type)
2325 {
2326   static char buff[64];
2327
2328   switch (e_type)
2329     {
2330     case ET_NONE: return _("NONE (None)");
2331     case ET_REL:  return _("REL (Relocatable file)");
2332     case ET_EXEC: return _("EXEC (Executable file)");
2333     case ET_DYN:  return _("DYN (Shared object file)");
2334     case ET_CORE: return _("CORE (Core file)");
2335
2336     default:
2337       if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2338         snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2339       else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2340         snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2341       else
2342         snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2343       return buff;
2344     }
2345 }
2346
2347 static char *
2348 get_machine_name (unsigned e_machine)
2349 {
2350   static char buff[64]; /* XXX */
2351
2352   switch (e_machine)
2353     {
2354       /* Please keep this switch table sorted by increasing EM_ value.  */
2355       /* 0 */
2356     case EM_NONE:               return _("None");
2357     case EM_M32:                return "WE32100";
2358     case EM_SPARC:              return "Sparc";
2359     case EM_386:                return "Intel 80386";
2360     case EM_68K:                return "MC68000";
2361     case EM_88K:                return "MC88000";
2362     case EM_IAMCU:              return "Intel MCU";
2363     case EM_860:                return "Intel 80860";
2364     case EM_MIPS:               return "MIPS R3000";
2365     case EM_S370:               return "IBM System/370";
2366       /* 10 */
2367     case EM_MIPS_RS3_LE:        return "MIPS R4000 big-endian";
2368     case EM_OLD_SPARCV9:        return "Sparc v9 (old)";
2369     case EM_PARISC:             return "HPPA";
2370     case EM_VPP550:             return "Fujitsu VPP500";
2371     case EM_SPARC32PLUS:        return "Sparc v8+" ;
2372     case EM_960:                return "Intel 80960";
2373     case EM_PPC:                return "PowerPC";
2374       /* 20 */
2375     case EM_PPC64:              return "PowerPC64";
2376     case EM_S390_OLD:
2377     case EM_S390:               return "IBM S/390";
2378     case EM_SPU:                return "SPU";
2379       /* 30 */
2380     case EM_V800:               return "Renesas V850 (using RH850 ABI)";
2381     case EM_FR20:               return "Fujitsu FR20";
2382     case EM_RH32:               return "TRW RH32";
2383     case EM_MCORE:              return "MCORE";
2384       /* 40 */
2385     case EM_ARM:                return "ARM";
2386     case EM_OLD_ALPHA:          return "Digital Alpha (old)";
2387     case EM_SH:                 return "Renesas / SuperH SH";
2388     case EM_SPARCV9:            return "Sparc v9";
2389     case EM_TRICORE:            return "Siemens Tricore";
2390     case EM_ARC:                return "ARC";
2391     case EM_H8_300:             return "Renesas H8/300";
2392     case EM_H8_300H:            return "Renesas H8/300H";
2393     case EM_H8S:                return "Renesas H8S";
2394     case EM_H8_500:             return "Renesas H8/500";
2395       /* 50 */
2396     case EM_IA_64:              return "Intel IA-64";
2397     case EM_MIPS_X:             return "Stanford MIPS-X";
2398     case EM_COLDFIRE:           return "Motorola Coldfire";
2399     case EM_68HC12:             return "Motorola MC68HC12 Microcontroller";
2400     case EM_MMA:                return "Fujitsu Multimedia Accelerator";
2401     case EM_PCP:                return "Siemens PCP";
2402     case EM_NCPU:               return "Sony nCPU embedded RISC processor";
2403     case EM_NDR1:               return "Denso NDR1 microprocesspr";
2404     case EM_STARCORE:           return "Motorola Star*Core processor";
2405     case EM_ME16:               return "Toyota ME16 processor";
2406       /* 60 */
2407     case EM_ST100:              return "STMicroelectronics ST100 processor";
2408     case EM_TINYJ:              return "Advanced Logic Corp. TinyJ embedded processor";
2409     case EM_X86_64:             return "Advanced Micro Devices X86-64";
2410     case EM_PDSP:               return "Sony DSP processor";
2411     case EM_PDP10:              return "Digital Equipment Corp. PDP-10";
2412     case EM_PDP11:              return "Digital Equipment Corp. PDP-11";
2413     case EM_FX66:               return "Siemens FX66 microcontroller";
2414     case EM_ST9PLUS:            return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2415     case EM_ST7:                return "STMicroelectronics ST7 8-bit microcontroller";
2416     case EM_68HC16:             return "Motorola MC68HC16 Microcontroller";
2417       /* 70 */
2418     case EM_68HC11:             return "Motorola MC68HC11 Microcontroller";
2419     case EM_68HC08:             return "Motorola MC68HC08 Microcontroller";
2420     case EM_68HC05:             return "Motorola MC68HC05 Microcontroller";
2421     case EM_SVX:                return "Silicon Graphics SVx";
2422     case EM_ST19:               return "STMicroelectronics ST19 8-bit microcontroller";
2423     case EM_VAX:                return "Digital VAX";
2424     case EM_CRIS:               return "Axis Communications 32-bit embedded processor";
2425     case EM_JAVELIN:            return "Infineon Technologies 32-bit embedded cpu";
2426     case EM_FIREPATH:           return "Element 14 64-bit DSP processor";
2427     case EM_ZSP:                return "LSI Logic's 16-bit DSP processor";
2428       /* 80 */
2429     case EM_MMIX:               return "Donald Knuth's educational 64-bit processor";
2430     case EM_HUANY:              return "Harvard Universitys's machine-independent object format";
2431     case EM_PRISM:              return "Vitesse Prism";
2432     case EM_AVR_OLD:
2433     case EM_AVR:                return "Atmel AVR 8-bit microcontroller";
2434     case EM_CYGNUS_FR30:
2435     case EM_FR30:               return "Fujitsu FR30";
2436     case EM_CYGNUS_D10V:
2437     case EM_D10V:               return "d10v";
2438     case EM_CYGNUS_D30V:
2439     case EM_D30V:               return "d30v";
2440     case EM_CYGNUS_V850:
2441     case EM_V850:               return "Renesas V850";
2442     case EM_CYGNUS_M32R:
2443     case EM_M32R:               return "Renesas M32R (formerly Mitsubishi M32r)";
2444     case EM_CYGNUS_MN10300:
2445     case EM_MN10300:            return "mn10300";
2446       /* 90 */
2447     case EM_CYGNUS_MN10200:
2448     case EM_MN10200:            return "mn10200";
2449     case EM_PJ:                 return "picoJava";
2450     case EM_OR1K:               return "OpenRISC 1000";
2451     case EM_ARC_COMPACT:        return "ARCompact";
2452     case EM_XTENSA_OLD:
2453     case EM_XTENSA:             return "Tensilica Xtensa Processor";
2454     case EM_VIDEOCORE:          return "Alphamosaic VideoCore processor";
2455     case EM_TMM_GPP:            return "Thompson Multimedia General Purpose Processor";
2456     case EM_NS32K:              return "National Semiconductor 32000 series";
2457     case EM_TPC:                return "Tenor Network TPC processor";
2458     case EM_SNP1K:              return "Trebia SNP 1000 processor";
2459       /* 100 */
2460     case EM_ST200:              return "STMicroelectronics ST200 microcontroller";
2461     case EM_IP2K_OLD:
2462     case EM_IP2K:               return "Ubicom IP2xxx 8-bit microcontrollers";
2463     case EM_MAX:                return "MAX Processor";
2464     case EM_CR:                 return "National Semiconductor CompactRISC";
2465     case EM_F2MC16:             return "Fujitsu F2MC16";
2466     case EM_MSP430:             return "Texas Instruments msp430 microcontroller";
2467     case EM_BLACKFIN:           return "Analog Devices Blackfin";
2468     case EM_SE_C33:             return "S1C33 Family of Seiko Epson processors";
2469     case EM_SEP:                return "Sharp embedded microprocessor";
2470     case EM_ARCA:               return "Arca RISC microprocessor";
2471       /* 110 */
2472     case EM_UNICORE:            return "Unicore";
2473     case EM_EXCESS:             return "eXcess 16/32/64-bit configurable embedded CPU";
2474     case EM_DXP:                return "Icera Semiconductor Inc. Deep Execution Processor";
2475     case EM_ALTERA_NIOS2:       return "Altera Nios II";
2476     case EM_CRX:                return "National Semiconductor CRX microprocessor";
2477     case EM_XGATE:              return "Motorola XGATE embedded processor";
2478     case EM_C166:
2479     case EM_XC16X:              return "Infineon Technologies xc16x";
2480     case EM_M16C:               return "Renesas M16C series microprocessors";
2481     case EM_DSPIC30F:           return "Microchip Technology dsPIC30F Digital Signal Controller";
2482     case EM_CE:                 return "Freescale Communication Engine RISC core";
2483       /* 120 */
2484     case EM_M32C:               return "Renesas M32c";
2485       /* 130 */
2486     case EM_TSK3000:            return "Altium TSK3000 core";
2487     case EM_RS08:               return "Freescale RS08 embedded processor";
2488     case EM_ECOG2:              return "Cyan Technology eCOG2 microprocessor";
2489     case EM_SCORE:              return "SUNPLUS S+Core";
2490     case EM_DSP24:              return "New Japan Radio (NJR) 24-bit DSP Processor";
2491     case EM_VIDEOCORE3:         return "Broadcom VideoCore III processor";
2492     case EM_LATTICEMICO32:      return "Lattice Mico32";
2493     case EM_SE_C17:             return "Seiko Epson C17 family";
2494       /* 140 */
2495     case EM_TI_C6000:           return "Texas Instruments TMS320C6000 DSP family";
2496     case EM_TI_C2000:           return "Texas Instruments TMS320C2000 DSP family";
2497     case EM_TI_C5500:           return "Texas Instruments TMS320C55x DSP family";
2498     case EM_TI_PRU:             return "TI PRU I/O processor";
2499       /* 160 */
2500     case EM_MMDSP_PLUS:         return "STMicroelectronics 64bit VLIW Data Signal Processor";
2501     case EM_CYPRESS_M8C:        return "Cypress M8C microprocessor";
2502     case EM_R32C:               return "Renesas R32C series microprocessors";
2503     case EM_TRIMEDIA:           return "NXP Semiconductors TriMedia architecture family";
2504     case EM_QDSP6:              return "QUALCOMM DSP6 Processor";
2505     case EM_8051:               return "Intel 8051 and variants";
2506     case EM_STXP7X:             return "STMicroelectronics STxP7x family";
2507     case EM_NDS32:              return "Andes Technology compact code size embedded RISC processor family";
2508     case EM_ECOG1X:             return "Cyan Technology eCOG1X family";
2509     case EM_MAXQ30:             return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2510       /* 170 */
2511     case EM_XIMO16:             return "New Japan Radio (NJR) 16-bit DSP Processor";
2512     case EM_MANIK:              return "M2000 Reconfigurable RISC Microprocessor";
2513     case EM_CRAYNV2:            return "Cray Inc. NV2 vector architecture";
2514     case EM_RX:                 return "Renesas RX";
2515     case EM_METAG:              return "Imagination Technologies Meta processor architecture";
2516     case EM_MCST_ELBRUS:        return "MCST Elbrus general purpose hardware architecture";
2517     case EM_ECOG16:             return "Cyan Technology eCOG16 family";
2518     case EM_CR16:
2519     case EM_MICROBLAZE:
2520     case EM_MICROBLAZE_OLD:     return "Xilinx MicroBlaze";
2521     case EM_ETPU:               return "Freescale Extended Time Processing Unit";
2522     case EM_SLE9X:              return "Infineon Technologies SLE9X core";
2523       /* 180 */
2524     case EM_L1OM:               return "Intel L1OM";
2525     case EM_K1OM:               return "Intel K1OM";
2526     case EM_INTEL182:           return "Intel (reserved)";
2527     case EM_AARCH64:            return "AArch64";
2528     case EM_ARM184:             return "ARM (reserved)";
2529     case EM_AVR32:              return "Atmel Corporation 32-bit microprocessor";
2530     case EM_STM8:               return "STMicroeletronics STM8 8-bit microcontroller";
2531     case EM_TILE64:             return "Tilera TILE64 multicore architecture family";
2532     case EM_TILEPRO:            return "Tilera TILEPro multicore architecture family";
2533       /* 190 */
2534     case EM_CUDA:               return "NVIDIA CUDA architecture";
2535     case EM_TILEGX:             return "Tilera TILE-Gx multicore architecture family";
2536     case EM_CLOUDSHIELD:        return "CloudShield architecture family";
2537     case EM_COREA_1ST:          return "KIPO-KAIST Core-A 1st generation processor family";
2538     case EM_COREA_2ND:          return "KIPO-KAIST Core-A 2nd generation processor family";
2539     case EM_ARC_COMPACT2:       return "ARCv2";
2540     case EM_OPEN8:              return "Open8 8-bit RISC soft processor core";
2541     case EM_RL78:               return "Renesas RL78";
2542     case EM_VIDEOCORE5:         return "Broadcom VideoCore V processor";
2543     case EM_78K0R:              return "Renesas 78K0R";
2544       /* 200 */
2545     case EM_56800EX:            return "Freescale 56800EX Digital Signal Controller (DSC)";
2546     case EM_BA1:                return "Beyond BA1 CPU architecture";
2547     case EM_BA2:                return "Beyond BA2 CPU architecture";
2548     case EM_XCORE:              return "XMOS xCORE processor family";
2549     case EM_MCHP_PIC:           return "Microchip 8-bit PIC(r) family";
2550       /* 210 */
2551     case EM_KM32:               return "KM211 KM32 32-bit processor";
2552     case EM_KMX32:              return "KM211 KMX32 32-bit processor";
2553     case EM_KMX16:              return "KM211 KMX16 16-bit processor";
2554     case EM_KMX8:               return "KM211 KMX8 8-bit processor";
2555     case EM_KVARC:              return "KM211 KVARC processor";
2556     case EM_CDP:                return "Paneve CDP architecture family";
2557     case EM_COGE:               return "Cognitive Smart Memory Processor";
2558     case EM_COOL:               return "Bluechip Systems CoolEngine";
2559     case EM_NORC:               return "Nanoradio Optimized RISC";
2560     case EM_CSR_KALIMBA:        return "CSR Kalimba architecture family";
2561       /* 220 */
2562     case EM_Z80:                return "Zilog Z80";
2563     case EM_VISIUM:             return "CDS VISIUMcore processor";
2564     case EM_FT32:               return "FTDI Chip FT32";
2565     case EM_MOXIE:              return "Moxie";
2566     case EM_AMDGPU:             return "AMD GPU";
2567       /* 230 (all reserved) */
2568       /* 240 */
2569     case EM_RISCV:              return "RISC-V";
2570     case EM_LANAI:              return "Lanai 32-bit processor";
2571     case EM_CEVA:               return "CEVA Processor Architecture Family";
2572     case EM_CEVA_X2:            return "CEVA X2 Processor Family";
2573     case EM_BPF:                return "Linux BPF";
2574     case EM_GRAPHCORE_IPU:      return "Graphcore Intelligent Processing Unit";
2575     case EM_IMG1:               return "Imagination Technologies";
2576       /* 250 */
2577     case EM_NFP:                return "Netronome Flow Processor";
2578     case EM_VE:                 return "NEC Vector Engine";
2579     case EM_CSKY:               return "C-SKY";
2580     case EM_ARC_COMPACT3_64:    return "Synopsys ARCv2.3 64-bit";
2581     case EM_MCS6502:            return "MOS Technology MCS 6502 processor";
2582     case EM_ARC_COMPACT3:       return "Synopsys ARCv2.3 32-bit";
2583     case EM_KVX:                return "Kalray VLIW core of the MPPA processor family";
2584     case EM_65816:              return "WDC 65816/65C816";
2585     case EM_LOONGARCH:          return "Loongson Loongarch";
2586     case EM_KF32:               return "ChipON KungFu32";
2587
2588       /* Large numbers...  */
2589     case EM_MT:                 return "Morpho Techologies MT processor";
2590     case EM_ALPHA:              return "Alpha";
2591     case EM_WEBASSEMBLY:        return "Web Assembly";
2592     case EM_DLX:                return "OpenDLX";
2593     case EM_XSTORMY16:          return "Sanyo XStormy16 CPU core";
2594     case EM_IQ2000:             return "Vitesse IQ2000";
2595     case EM_M32C_OLD:
2596     case EM_NIOS32:             return "Altera Nios";
2597     case EM_CYGNUS_MEP:         return "Toshiba MeP Media Engine";
2598     case EM_ADAPTEVA_EPIPHANY:  return "Adapteva EPIPHANY";
2599     case EM_CYGNUS_FRV:         return "Fujitsu FR-V";
2600     case EM_S12Z:               return "Freescale S12Z";
2601
2602     default:
2603       snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2604       return buff;
2605     }
2606 }
2607
2608 static void
2609 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2610 {
2611   /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2.  Some
2612      other compilers don't a specific architecture type in the e_flags, and
2613      instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2614      architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2615      architectures.
2616
2617      Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2618      but also sets a specific architecture type in the e_flags field.
2619
2620      However, when decoding the flags we don't worry if we see an
2621      unexpected pairing, for example EM_ARC_COMPACT machine type, with
2622      ARCEM architecture type.  */
2623
2624   switch (e_flags & EF_ARC_MACH_MSK)
2625     {
2626       /* We only expect these to occur for EM_ARC_COMPACT2.  */
2627     case EF_ARC_CPU_ARCV2EM:
2628       strcat (buf, ", ARC EM");
2629       break;
2630     case EF_ARC_CPU_ARCV2HS:
2631       strcat (buf, ", ARC HS");
2632       break;
2633
2634       /* We only expect these to occur for EM_ARC_COMPACT.  */
2635     case E_ARC_MACH_ARC600:
2636       strcat (buf, ", ARC600");
2637       break;
2638     case E_ARC_MACH_ARC601:
2639       strcat (buf, ", ARC601");
2640       break;
2641     case E_ARC_MACH_ARC700:
2642       strcat (buf, ", ARC700");
2643       break;
2644
2645       /* The only times we should end up here are (a) A corrupt ELF, (b) A
2646          new ELF with new architecture being read by an old version of
2647          readelf, or (c) An ELF built with non-GNU compiler that does not
2648          set the architecture in the e_flags.  */
2649     default:
2650       if (e_machine == EM_ARC_COMPACT)
2651         strcat (buf, ", Unknown ARCompact");
2652       else
2653         strcat (buf, ", Unknown ARC");
2654       break;
2655     }
2656
2657   switch (e_flags & EF_ARC_OSABI_MSK)
2658     {
2659     case E_ARC_OSABI_ORIG:
2660       strcat (buf, ", (ABI:legacy)");
2661       break;
2662     case E_ARC_OSABI_V2:
2663       strcat (buf, ", (ABI:v2)");
2664       break;
2665       /* Only upstream 3.9+ kernels will support ARCv2 ISA.  */
2666     case E_ARC_OSABI_V3:
2667       strcat (buf, ", v3 no-legacy-syscalls ABI");
2668       break;
2669     case E_ARC_OSABI_V4:
2670       strcat (buf, ", v4 ABI");
2671       break;
2672     default:
2673       strcat (buf, ", unrecognised ARC OSABI flag");
2674       break;
2675     }
2676 }
2677
2678 static void
2679 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2680 {
2681   unsigned eabi;
2682   bfd_boolean unknown = FALSE;
2683
2684   eabi = EF_ARM_EABI_VERSION (e_flags);
2685   e_flags &= ~ EF_ARM_EABIMASK;
2686
2687   /* Handle "generic" ARM flags.  */
2688   if (e_flags & EF_ARM_RELEXEC)
2689     {
2690       strcat (buf, ", relocatable executable");
2691       e_flags &= ~ EF_ARM_RELEXEC;
2692     }
2693
2694   if (e_flags & EF_ARM_PIC)
2695     {
2696       strcat (buf, ", position independent");
2697       e_flags &= ~ EF_ARM_PIC;
2698     }
2699
2700   /* Now handle EABI specific flags.  */
2701   switch (eabi)
2702     {
2703     default:
2704       strcat (buf, ", <unrecognized EABI>");
2705       if (e_flags)
2706         unknown = TRUE;
2707       break;
2708
2709     case EF_ARM_EABI_VER1:
2710       strcat (buf, ", Version1 EABI");
2711       while (e_flags)
2712         {
2713           unsigned flag;
2714
2715           /* Process flags one bit at a time.  */
2716           flag = e_flags & - e_flags;
2717           e_flags &= ~ flag;
2718
2719           switch (flag)
2720             {
2721             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2722               strcat (buf, ", sorted symbol tables");
2723               break;
2724
2725             default:
2726               unknown = TRUE;
2727               break;
2728             }
2729         }
2730       break;
2731
2732     case EF_ARM_EABI_VER2:
2733       strcat (buf, ", Version2 EABI");
2734       while (e_flags)
2735         {
2736           unsigned flag;
2737
2738           /* Process flags one bit at a time.  */
2739           flag = e_flags & - e_flags;
2740           e_flags &= ~ flag;
2741
2742           switch (flag)
2743             {
2744             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2745               strcat (buf, ", sorted symbol tables");
2746               break;
2747
2748             case EF_ARM_DYNSYMSUSESEGIDX:
2749               strcat (buf, ", dynamic symbols use segment index");
2750               break;
2751
2752             case EF_ARM_MAPSYMSFIRST:
2753               strcat (buf, ", mapping symbols precede others");
2754               break;
2755
2756             default:
2757               unknown = TRUE;
2758               break;
2759             }
2760         }
2761       break;
2762
2763     case EF_ARM_EABI_VER3:
2764       strcat (buf, ", Version3 EABI");
2765       break;
2766
2767     case EF_ARM_EABI_VER4:
2768       strcat (buf, ", Version4 EABI");
2769       while (e_flags)
2770         {
2771           unsigned flag;
2772
2773           /* Process flags one bit at a time.  */
2774           flag = e_flags & - e_flags;
2775           e_flags &= ~ flag;
2776
2777           switch (flag)
2778             {
2779             case EF_ARM_BE8:
2780               strcat (buf, ", BE8");
2781               break;
2782
2783             case EF_ARM_LE8:
2784               strcat (buf, ", LE8");
2785               break;
2786
2787             default:
2788               unknown = TRUE;
2789               break;
2790             }
2791         }
2792       break;
2793
2794     case EF_ARM_EABI_VER5:
2795       strcat (buf, ", Version5 EABI");
2796       while (e_flags)
2797         {
2798           unsigned flag;
2799
2800           /* Process flags one bit at a time.  */
2801           flag = e_flags & - e_flags;
2802           e_flags &= ~ flag;
2803
2804           switch (flag)
2805             {
2806             case EF_ARM_BE8:
2807               strcat (buf, ", BE8");
2808               break;
2809
2810             case EF_ARM_LE8:
2811               strcat (buf, ", LE8");
2812               break;
2813
2814             case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT.  */
2815               strcat (buf, ", soft-float ABI");
2816               break;
2817
2818             case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT.  */
2819               strcat (buf, ", hard-float ABI");
2820               break;
2821
2822             default:
2823               unknown = TRUE;
2824               break;
2825             }
2826         }
2827       break;
2828
2829     case EF_ARM_EABI_UNKNOWN:
2830       strcat (buf, ", GNU EABI");
2831       while (e_flags)
2832         {
2833           unsigned flag;
2834
2835           /* Process flags one bit at a time.  */
2836           flag = e_flags & - e_flags;
2837           e_flags &= ~ flag;
2838
2839           switch (flag)
2840             {
2841             case EF_ARM_INTERWORK:
2842               strcat (buf, ", interworking enabled");
2843               break;
2844
2845             case EF_ARM_APCS_26:
2846               strcat (buf, ", uses APCS/26");
2847               break;
2848
2849             case EF_ARM_APCS_FLOAT:
2850               strcat (buf, ", uses APCS/float");
2851               break;
2852
2853             case EF_ARM_PIC:
2854               strcat (buf, ", position independent");
2855               break;
2856
2857             case EF_ARM_ALIGN8:
2858               strcat (buf, ", 8 bit structure alignment");
2859               break;
2860
2861             case EF_ARM_NEW_ABI:
2862               strcat (buf, ", uses new ABI");
2863               break;
2864
2865             case EF_ARM_OLD_ABI:
2866               strcat (buf, ", uses old ABI");
2867               break;
2868
2869             case EF_ARM_SOFT_FLOAT:
2870               strcat (buf, ", software FP");
2871               break;
2872
2873             case EF_ARM_VFP_FLOAT:
2874               strcat (buf, ", VFP");
2875               break;
2876
2877             case EF_ARM_MAVERICK_FLOAT:
2878               strcat (buf, ", Maverick FP");
2879               break;
2880
2881             default:
2882               unknown = TRUE;
2883               break;
2884             }
2885         }
2886     }
2887
2888   if (unknown)
2889     strcat (buf,_(", <unknown>"));
2890 }
2891
2892 static void
2893 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2894 {
2895   --size; /* Leave space for null terminator.  */
2896
2897   switch (e_flags & EF_AVR_MACH)
2898     {
2899     case E_AVR_MACH_AVR1:
2900       strncat (buf, ", avr:1", size);
2901       break;
2902     case E_AVR_MACH_AVR2:
2903       strncat (buf, ", avr:2", size);
2904       break;
2905     case E_AVR_MACH_AVR25:
2906       strncat (buf, ", avr:25", size);
2907       break;
2908     case E_AVR_MACH_AVR3:
2909       strncat (buf, ", avr:3", size);
2910       break;
2911     case E_AVR_MACH_AVR31:
2912       strncat (buf, ", avr:31", size);
2913       break;
2914     case E_AVR_MACH_AVR35:
2915       strncat (buf, ", avr:35", size);
2916       break;
2917     case E_AVR_MACH_AVR4:
2918       strncat (buf, ", avr:4", size);
2919       break;
2920     case E_AVR_MACH_AVR5:
2921       strncat (buf, ", avr:5", size);
2922       break;
2923     case E_AVR_MACH_AVR51:
2924       strncat (buf, ", avr:51", size);
2925       break;
2926     case E_AVR_MACH_AVR6:
2927       strncat (buf, ", avr:6", size);
2928       break;
2929     case E_AVR_MACH_AVRTINY:
2930       strncat (buf, ", avr:100", size);
2931       break;
2932     case E_AVR_MACH_XMEGA1:
2933       strncat (buf, ", avr:101", size);
2934       break;
2935     case E_AVR_MACH_XMEGA2:
2936       strncat (buf, ", avr:102", size);
2937       break;
2938     case E_AVR_MACH_XMEGA3:
2939       strncat (buf, ", avr:103", size);
2940       break;
2941     case E_AVR_MACH_XMEGA4:
2942       strncat (buf, ", avr:104", size);
2943       break;
2944     case E_AVR_MACH_XMEGA5:
2945       strncat (buf, ", avr:105", size);
2946       break;
2947     case E_AVR_MACH_XMEGA6:
2948       strncat (buf, ", avr:106", size);
2949       break;
2950     case E_AVR_MACH_XMEGA7:
2951       strncat (buf, ", avr:107", size);
2952       break;
2953     default:
2954       strncat (buf, ", avr:<unknown>", size);
2955       break;
2956     }
2957
2958   size -= strlen (buf);
2959   if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2960     strncat (buf, ", link-relax", size);
2961 }
2962
2963 static void
2964 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2965 {
2966   unsigned abi;
2967   unsigned arch;
2968   unsigned config;
2969   unsigned version;
2970   bfd_boolean has_fpu = FALSE;
2971   unsigned int r = 0;
2972
2973   static const char *ABI_STRINGS[] =
2974   {
2975     "ABI v0", /* use r5 as return register; only used in N1213HC */
2976     "ABI v1", /* use r0 as return register */
2977     "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2978     "ABI v2fp", /* for FPU */
2979     "AABI",
2980     "ABI2 FP+"
2981   };
2982   static const char *VER_STRINGS[] =
2983   {
2984     "Andes ELF V1.3 or older",
2985     "Andes ELF V1.3.1",
2986     "Andes ELF V1.4"
2987   };
2988   static const char *ARCH_STRINGS[] =
2989   {
2990     "",
2991     "Andes Star v1.0",
2992     "Andes Star v2.0",
2993     "Andes Star v3.0",
2994     "Andes Star v3.0m"
2995   };
2996
2997   abi = EF_NDS_ABI & e_flags;
2998   arch = EF_NDS_ARCH & e_flags;
2999   config = EF_NDS_INST & e_flags;
3000   version = EF_NDS32_ELF_VERSION & e_flags;
3001
3002   memset (buf, 0, size);
3003
3004   switch (abi)
3005     {
3006     case E_NDS_ABI_V0:
3007     case E_NDS_ABI_V1:
3008     case E_NDS_ABI_V2:
3009     case E_NDS_ABI_V2FP:
3010     case E_NDS_ABI_AABI:
3011     case E_NDS_ABI_V2FP_PLUS:
3012       /* In case there are holes in the array.  */
3013       r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
3014       break;
3015
3016     default:
3017       r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
3018       break;
3019     }
3020
3021   switch (version)
3022     {
3023     case E_NDS32_ELF_VER_1_2:
3024     case E_NDS32_ELF_VER_1_3:
3025     case E_NDS32_ELF_VER_1_4:
3026       r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
3027       break;
3028
3029     default:
3030       r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
3031       break;
3032     }
3033
3034   if (E_NDS_ABI_V0 == abi)
3035     {
3036       /* OLD ABI; only used in N1213HC, has performance extension 1.  */
3037       r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
3038       if (arch == E_NDS_ARCH_STAR_V1_0)
3039         r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
3040       return;
3041     }
3042
3043   switch (arch)
3044     {
3045     case E_NDS_ARCH_STAR_V1_0:
3046     case E_NDS_ARCH_STAR_V2_0:
3047     case E_NDS_ARCH_STAR_V3_0:
3048     case E_NDS_ARCH_STAR_V3_M:
3049       r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
3050       break;
3051
3052     default:
3053       r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
3054       /* ARCH version determines how the e_flags are interpreted.
3055          If it is unknown, we cannot proceed.  */
3056       return;
3057     }
3058
3059   /* Newer ABI; Now handle architecture specific flags.  */
3060   if (arch == E_NDS_ARCH_STAR_V1_0)
3061     {
3062       if (config & E_NDS32_HAS_MFUSR_PC_INST)
3063         r += snprintf (buf + r, size -r, ", MFUSR_PC");
3064
3065       if (!(config & E_NDS32_HAS_NO_MAC_INST))
3066         r += snprintf (buf + r, size -r, ", MAC");
3067
3068       if (config & E_NDS32_HAS_DIV_INST)
3069         r += snprintf (buf + r, size -r, ", DIV");
3070
3071       if (config & E_NDS32_HAS_16BIT_INST)
3072         r += snprintf (buf + r, size -r, ", 16b");
3073     }
3074   else
3075     {
3076       if (config & E_NDS32_HAS_MFUSR_PC_INST)
3077         {
3078           if (version <= E_NDS32_ELF_VER_1_3)
3079             r += snprintf (buf + r, size -r, ", [B8]");
3080           else
3081             r += snprintf (buf + r, size -r, ", EX9");
3082         }
3083
3084       if (config & E_NDS32_HAS_MAC_DX_INST)
3085         r += snprintf (buf + r, size -r, ", MAC_DX");
3086
3087       if (config & E_NDS32_HAS_DIV_DX_INST)
3088         r += snprintf (buf + r, size -r, ", DIV_DX");
3089
3090       if (config & E_NDS32_HAS_16BIT_INST)
3091         {
3092           if (version <= E_NDS32_ELF_VER_1_3)
3093             r += snprintf (buf + r, size -r, ", 16b");
3094           else
3095             r += snprintf (buf + r, size -r, ", IFC");
3096         }
3097     }
3098
3099   if (config & E_NDS32_HAS_EXT_INST)
3100     r += snprintf (buf + r, size -r, ", PERF1");
3101
3102   if (config & E_NDS32_HAS_EXT2_INST)
3103     r += snprintf (buf + r, size -r, ", PERF2");
3104
3105   if (config & E_NDS32_HAS_FPU_INST)
3106     {
3107       has_fpu = TRUE;
3108       r += snprintf (buf + r, size -r, ", FPU_SP");
3109     }
3110
3111   if (config & E_NDS32_HAS_FPU_DP_INST)
3112     {
3113       has_fpu = TRUE;
3114       r += snprintf (buf + r, size -r, ", FPU_DP");
3115     }
3116
3117   if (config & E_NDS32_HAS_FPU_MAC_INST)
3118     {
3119       has_fpu = TRUE;
3120       r += snprintf (buf + r, size -r, ", FPU_MAC");
3121     }
3122
3123   if (has_fpu)
3124     {
3125       switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
3126         {
3127         case E_NDS32_FPU_REG_8SP_4DP:
3128           r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
3129           break;
3130         case E_NDS32_FPU_REG_16SP_8DP:
3131           r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
3132           break;
3133         case E_NDS32_FPU_REG_32SP_16DP:
3134           r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
3135           break;
3136         case E_NDS32_FPU_REG_32SP_32DP:
3137           r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
3138           break;
3139         }
3140     }
3141
3142   if (config & E_NDS32_HAS_AUDIO_INST)
3143     r += snprintf (buf + r, size -r, ", AUDIO");
3144
3145   if (config & E_NDS32_HAS_STRING_INST)
3146     r += snprintf (buf + r, size -r, ", STR");
3147
3148   if (config & E_NDS32_HAS_REDUCED_REGS)
3149     r += snprintf (buf + r, size -r, ", 16REG");
3150
3151   if (config & E_NDS32_HAS_VIDEO_INST)
3152     {
3153       if (version <= E_NDS32_ELF_VER_1_3)
3154         r += snprintf (buf + r, size -r, ", VIDEO");
3155       else
3156         r += snprintf (buf + r, size -r, ", SATURATION");
3157     }
3158
3159   if (config & E_NDS32_HAS_ENCRIPT_INST)
3160     r += snprintf (buf + r, size -r, ", ENCRP");
3161
3162   if (config & E_NDS32_HAS_L2C_INST)
3163     r += snprintf (buf + r, size -r, ", L2C");
3164 }
3165
3166 static char *
3167 get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine)
3168 {
3169   static char buf[1024];
3170
3171   buf[0] = '\0';
3172
3173   if (e_flags)
3174     {
3175       switch (e_machine)
3176         {
3177         default:
3178           break;
3179
3180         case EM_ARC_COMPACT2:
3181         case EM_ARC_COMPACT:
3182           decode_ARC_machine_flags (e_flags, e_machine, buf);
3183           break;
3184
3185         case EM_ARM:
3186           decode_ARM_machine_flags (e_flags, buf);
3187           break;
3188
3189         case EM_AVR:
3190           decode_AVR_machine_flags (e_flags, buf, sizeof buf);
3191           break;
3192
3193         case EM_BLACKFIN:
3194           if (e_flags & EF_BFIN_PIC)
3195             strcat (buf, ", PIC");
3196
3197           if (e_flags & EF_BFIN_FDPIC)
3198             strcat (buf, ", FDPIC");
3199
3200           if (e_flags & EF_BFIN_CODE_IN_L1)
3201             strcat (buf, ", code in L1");
3202
3203           if (e_flags & EF_BFIN_DATA_IN_L1)
3204             strcat (buf, ", data in L1");
3205
3206           break;
3207
3208         case EM_CYGNUS_FRV:
3209           switch (e_flags & EF_FRV_CPU_MASK)
3210             {
3211             case EF_FRV_CPU_GENERIC:
3212               break;
3213
3214             default:
3215               strcat (buf, ", fr???");
3216               break;
3217
3218             case EF_FRV_CPU_FR300:
3219               strcat (buf, ", fr300");
3220               break;
3221
3222             case EF_FRV_CPU_FR400:
3223               strcat (buf, ", fr400");
3224               break;
3225             case EF_FRV_CPU_FR405:
3226               strcat (buf, ", fr405");
3227               break;
3228
3229             case EF_FRV_CPU_FR450:
3230               strcat (buf, ", fr450");
3231               break;
3232
3233             case EF_FRV_CPU_FR500:
3234               strcat (buf, ", fr500");
3235               break;
3236             case EF_FRV_CPU_FR550:
3237               strcat (buf, ", fr550");
3238               break;
3239
3240             case EF_FRV_CPU_SIMPLE:
3241               strcat (buf, ", simple");
3242               break;
3243             case EF_FRV_CPU_TOMCAT:
3244               strcat (buf, ", tomcat");
3245               break;
3246             }
3247           break;
3248
3249         case EM_68K:
3250           if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
3251             strcat (buf, ", m68000");
3252           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3253             strcat (buf, ", cpu32");
3254           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
3255             strcat (buf, ", fido_a");
3256           else
3257             {
3258               char const * isa = _("unknown");
3259               char const * mac = _("unknown mac");
3260               char const * additional = NULL;
3261
3262               switch (e_flags & EF_M68K_CF_ISA_MASK)
3263                 {
3264                 case EF_M68K_CF_ISA_A_NODIV:
3265                   isa = "A";
3266                   additional = ", nodiv";
3267                   break;
3268                 case EF_M68K_CF_ISA_A:
3269                   isa = "A";
3270                   break;
3271                 case EF_M68K_CF_ISA_A_PLUS:
3272                   isa = "A+";
3273                   break;
3274                 case EF_M68K_CF_ISA_B_NOUSP:
3275                   isa = "B";
3276                   additional = ", nousp";
3277                   break;
3278                 case EF_M68K_CF_ISA_B:
3279                   isa = "B";
3280                   break;
3281                 case EF_M68K_CF_ISA_C:
3282                   isa = "C";
3283                   break;
3284                 case EF_M68K_CF_ISA_C_NODIV:
3285                   isa = "C";
3286                   additional = ", nodiv";
3287                   break;
3288                 }
3289               strcat (buf, ", cf, isa ");
3290               strcat (buf, isa);
3291               if (additional)
3292                 strcat (buf, additional);
3293               if (e_flags & EF_M68K_CF_FLOAT)
3294                 strcat (buf, ", float");
3295               switch (e_flags & EF_M68K_CF_MAC_MASK)
3296                 {
3297                 case 0:
3298                   mac = NULL;
3299                   break;
3300                 case EF_M68K_CF_MAC:
3301                   mac = "mac";
3302                   break;
3303                 case EF_M68K_CF_EMAC:
3304                   mac = "emac";
3305                   break;
3306                 case EF_M68K_CF_EMAC_B:
3307                   mac = "emac_b";
3308                   break;
3309                 }
3310               if (mac)
3311                 {
3312                   strcat (buf, ", ");
3313                   strcat (buf, mac);
3314                 }
3315             }
3316           break;
3317
3318         case EM_CYGNUS_MEP:
3319           switch (e_flags & EF_MEP_CPU_MASK)
3320             {
3321             case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3322             case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3323             case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3324             case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3325             case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3326             case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3327             default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3328             }
3329
3330           switch (e_flags & EF_MEP_COP_MASK)
3331             {
3332             case EF_MEP_COP_NONE: break;
3333             case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3334             case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3335             case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3336             case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3337             default: strcat (buf, _("<unknown MeP copro type>")); break;
3338             }
3339
3340           if (e_flags & EF_MEP_LIBRARY)
3341             strcat (buf, ", Built for Library");
3342
3343           if (e_flags & EF_MEP_INDEX_MASK)
3344             sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3345                      e_flags & EF_MEP_INDEX_MASK);
3346
3347           if (e_flags & ~ EF_MEP_ALL_FLAGS)
3348             sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3349                      e_flags & ~ EF_MEP_ALL_FLAGS);
3350           break;
3351
3352         case EM_PPC:
3353           if (e_flags & EF_PPC_EMB)
3354             strcat (buf, ", emb");
3355
3356           if (e_flags & EF_PPC_RELOCATABLE)
3357             strcat (buf, _(", relocatable"));
3358
3359           if (e_flags & EF_PPC_RELOCATABLE_LIB)
3360             strcat (buf, _(", relocatable-lib"));
3361           break;
3362
3363         case EM_PPC64:
3364           if (e_flags & EF_PPC64_ABI)
3365             {
3366               char abi[] = ", abiv0";
3367
3368               abi[6] += e_flags & EF_PPC64_ABI;
3369               strcat (buf, abi);
3370             }
3371           break;
3372
3373         case EM_V800:
3374           if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3375             strcat (buf, ", RH850 ABI");
3376
3377           if (e_flags & EF_V800_850E3)
3378             strcat (buf, ", V3 architecture");
3379
3380           if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3381             strcat (buf, ", FPU not used");
3382
3383           if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3384             strcat (buf, ", regmode: COMMON");
3385
3386           if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3387             strcat (buf, ", r4 not used");
3388
3389           if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3390             strcat (buf, ", r30 not used");
3391
3392           if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3393             strcat (buf, ", r5 not used");
3394
3395           if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3396             strcat (buf, ", r2 not used");
3397
3398           for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3399             {
3400               switch (e_flags & - e_flags)
3401                 {
3402                 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3403                 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3404                 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3405                 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3406                 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3407                 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3408                 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3409                 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3410                 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3411                 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3412                 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3413                 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3414                 default: break;
3415                 }
3416             }
3417           break;
3418
3419         case EM_V850:
3420         case EM_CYGNUS_V850:
3421           switch (e_flags & EF_V850_ARCH)
3422             {
3423             case E_V850E3V5_ARCH:
3424               strcat (buf, ", v850e3v5");
3425               break;
3426             case E_V850E2V3_ARCH:
3427               strcat (buf, ", v850e2v3");
3428               break;
3429             case E_V850E2_ARCH:
3430               strcat (buf, ", v850e2");
3431               break;
3432             case E_V850E1_ARCH:
3433               strcat (buf, ", v850e1");
3434               break;
3435             case E_V850E_ARCH:
3436               strcat (buf, ", v850e");
3437               break;
3438             case E_V850_ARCH:
3439               strcat (buf, ", v850");
3440               break;
3441             default:
3442               strcat (buf, _(", unknown v850 architecture variant"));
3443               break;
3444             }
3445           break;
3446
3447         case EM_M32R:
3448         case EM_CYGNUS_M32R:
3449           if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3450             strcat (buf, ", m32r");
3451           break;
3452
3453         case EM_MIPS:
3454         case EM_MIPS_RS3_LE:
3455           if (e_flags & EF_MIPS_NOREORDER)
3456             strcat (buf, ", noreorder");
3457
3458           if (e_flags & EF_MIPS_PIC)
3459             strcat (buf, ", pic");
3460
3461           if (e_flags & EF_MIPS_CPIC)
3462             strcat (buf, ", cpic");
3463
3464           if (e_flags & EF_MIPS_UCODE)
3465             strcat (buf, ", ugen_reserved");
3466
3467           if (e_flags & EF_MIPS_ABI2)
3468             strcat (buf, ", abi2");
3469
3470           if (e_flags & EF_MIPS_OPTIONS_FIRST)
3471             strcat (buf, ", odk first");
3472
3473           if (e_flags & EF_MIPS_32BITMODE)
3474             strcat (buf, ", 32bitmode");
3475
3476           if (e_flags & EF_MIPS_NAN2008)
3477             strcat (buf, ", nan2008");
3478
3479           if (e_flags & EF_MIPS_FP64)
3480             strcat (buf, ", fp64");
3481
3482           switch ((e_flags & EF_MIPS_MACH))
3483             {
3484             case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3485             case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3486             case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3487             case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3488             case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3489             case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3490             case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3491             case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3492             case E_MIPS_MACH_5900: strcat (buf, ", 5900"); break;
3493             case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
3494             case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3495             case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3496             case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3497             case E_MIPS_MACH_GS464: strcat (buf, ", gs464"); break;
3498             case E_MIPS_MACH_GS464E: strcat (buf, ", gs464e"); break;
3499             case E_MIPS_MACH_GS264E: strcat (buf, ", gs264e"); break;
3500             case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3501             case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3502             case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3503             case E_MIPS_MACH_XLR:  strcat (buf, ", xlr"); break;
3504             case E_MIPS_MACH_IAMR2:  strcat (buf, ", interaptiv-mr2"); break;
3505             case 0:
3506             /* We simply ignore the field in this case to avoid confusion:
3507                MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3508                extension.  */
3509               break;
3510             default: strcat (buf, _(", unknown CPU")); break;
3511             }
3512
3513           switch ((e_flags & EF_MIPS_ABI))
3514             {
3515             case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3516             case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3517             case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3518             case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3519             case 0:
3520             /* We simply ignore the field in this case to avoid confusion:
3521                MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3522                This means it is likely to be an o32 file, but not for
3523                sure.  */
3524               break;
3525             default: strcat (buf, _(", unknown ABI")); break;
3526             }
3527
3528           if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3529             strcat (buf, ", mdmx");
3530
3531           if (e_flags & EF_MIPS_ARCH_ASE_M16)
3532             strcat (buf, ", mips16");
3533
3534           if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3535             strcat (buf, ", micromips");
3536
3537           switch ((e_flags & EF_MIPS_ARCH))
3538             {
3539             case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3540             case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3541             case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3542             case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3543             case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3544             case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3545             case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3546             case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3547             case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3548             case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3549             case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3550             default: strcat (buf, _(", unknown ISA")); break;
3551             }
3552           break;
3553
3554         case EM_NDS32:
3555           decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3556           break;
3557
3558         case EM_NFP:
3559           switch (EF_NFP_MACH (e_flags))
3560             {
3561             case E_NFP_MACH_3200:
3562               strcat (buf, ", NFP-32xx");
3563               break;
3564             case E_NFP_MACH_6000:
3565               strcat (buf, ", NFP-6xxx");
3566               break;
3567             }
3568           break;
3569
3570         case EM_RISCV:
3571           if (e_flags & EF_RISCV_RVC)
3572             strcat (buf, ", RVC");
3573
3574           if (e_flags & EF_RISCV_RVE)
3575             strcat (buf, ", RVE");
3576
3577           switch (e_flags & EF_RISCV_FLOAT_ABI)
3578             {
3579             case EF_RISCV_FLOAT_ABI_SOFT:
3580               strcat (buf, ", soft-float ABI");
3581               break;
3582
3583             case EF_RISCV_FLOAT_ABI_SINGLE:
3584               strcat (buf, ", single-float ABI");
3585               break;
3586
3587             case EF_RISCV_FLOAT_ABI_DOUBLE:
3588               strcat (buf, ", double-float ABI");
3589               break;
3590
3591             case EF_RISCV_FLOAT_ABI_QUAD:
3592               strcat (buf, ", quad-float ABI");
3593               break;
3594             }
3595           break;
3596
3597         case EM_SH:
3598           switch ((e_flags & EF_SH_MACH_MASK))
3599             {
3600             case EF_SH1: strcat (buf, ", sh1"); break;
3601             case EF_SH2: strcat (buf, ", sh2"); break;
3602             case EF_SH3: strcat (buf, ", sh3"); break;
3603             case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3604             case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3605             case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3606             case EF_SH3E: strcat (buf, ", sh3e"); break;
3607             case EF_SH4: strcat (buf, ", sh4"); break;
3608             case EF_SH5: strcat (buf, ", sh5"); break;
3609             case EF_SH2E: strcat (buf, ", sh2e"); break;
3610             case EF_SH4A: strcat (buf, ", sh4a"); break;
3611             case EF_SH2A: strcat (buf, ", sh2a"); break;
3612             case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3613             case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3614             case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3615             case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3616             case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3617             case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3618             case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3619             case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3620             case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3621             default: strcat (buf, _(", unknown ISA")); break;
3622             }
3623
3624           if (e_flags & EF_SH_PIC)
3625             strcat (buf, ", pic");
3626
3627           if (e_flags & EF_SH_FDPIC)
3628             strcat (buf, ", fdpic");
3629           break;
3630
3631         case EM_OR1K:
3632           if (e_flags & EF_OR1K_NODELAY)
3633             strcat (buf, ", no delay");
3634           break;
3635
3636         case EM_SPARCV9:
3637           if (e_flags & EF_SPARC_32PLUS)
3638             strcat (buf, ", v8+");
3639
3640           if (e_flags & EF_SPARC_SUN_US1)
3641             strcat (buf, ", ultrasparcI");
3642
3643           if (e_flags & EF_SPARC_SUN_US3)
3644             strcat (buf, ", ultrasparcIII");
3645
3646           if (e_flags & EF_SPARC_HAL_R1)
3647             strcat (buf, ", halr1");
3648
3649           if (e_flags & EF_SPARC_LEDATA)
3650             strcat (buf, ", ledata");
3651
3652           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3653             strcat (buf, ", tso");
3654
3655           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3656             strcat (buf, ", pso");
3657
3658           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3659             strcat (buf, ", rmo");
3660           break;
3661
3662         case EM_PARISC:
3663           switch (e_flags & EF_PARISC_ARCH)
3664             {
3665             case EFA_PARISC_1_0:
3666               strcpy (buf, ", PA-RISC 1.0");
3667               break;
3668             case EFA_PARISC_1_1:
3669               strcpy (buf, ", PA-RISC 1.1");
3670               break;
3671             case EFA_PARISC_2_0:
3672               strcpy (buf, ", PA-RISC 2.0");
3673               break;
3674             default:
3675               break;
3676             }
3677           if (e_flags & EF_PARISC_TRAPNIL)
3678             strcat (buf, ", trapnil");
3679           if (e_flags & EF_PARISC_EXT)
3680             strcat (buf, ", ext");
3681           if (e_flags & EF_PARISC_LSB)
3682             strcat (buf, ", lsb");
3683           if (e_flags & EF_PARISC_WIDE)
3684             strcat (buf, ", wide");
3685           if (e_flags & EF_PARISC_NO_KABP)
3686             strcat (buf, ", no kabp");
3687           if (e_flags & EF_PARISC_LAZYSWAP)
3688             strcat (buf, ", lazyswap");
3689           break;
3690
3691         case EM_PJ:
3692         case EM_PJ_OLD:
3693           if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3694             strcat (buf, ", new calling convention");
3695
3696           if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3697             strcat (buf, ", gnu calling convention");
3698           break;
3699
3700         case EM_IA_64:
3701           if ((e_flags & EF_IA_64_ABI64))
3702             strcat (buf, ", 64-bit");
3703           else
3704             strcat (buf, ", 32-bit");
3705           if ((e_flags & EF_IA_64_REDUCEDFP))
3706             strcat (buf, ", reduced fp model");
3707           if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3708             strcat (buf, ", no function descriptors, constant gp");
3709           else if ((e_flags & EF_IA_64_CONS_GP))
3710             strcat (buf, ", constant gp");
3711           if ((e_flags & EF_IA_64_ABSOLUTE))
3712             strcat (buf, ", absolute");
3713           if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3714             {
3715               if ((e_flags & EF_IA_64_VMS_LINKAGES))
3716                 strcat (buf, ", vms_linkages");
3717               switch ((e_flags & EF_IA_64_VMS_COMCOD))
3718                 {
3719                 case EF_IA_64_VMS_COMCOD_SUCCESS:
3720                   break;
3721                 case EF_IA_64_VMS_COMCOD_WARNING:
3722                   strcat (buf, ", warning");
3723                   break;
3724                 case EF_IA_64_VMS_COMCOD_ERROR:
3725                   strcat (buf, ", error");
3726                   break;
3727                 case EF_IA_64_VMS_COMCOD_ABORT:
3728                   strcat (buf, ", abort");
3729                   break;
3730                 default:
3731                   warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3732                         e_flags & EF_IA_64_VMS_COMCOD);
3733                   strcat (buf, ", <unknown>");
3734                 }
3735             }
3736           break;
3737
3738         case EM_VAX:
3739           if ((e_flags & EF_VAX_NONPIC))
3740             strcat (buf, ", non-PIC");
3741           if ((e_flags & EF_VAX_DFLOAT))
3742             strcat (buf, ", D-Float");
3743           if ((e_flags & EF_VAX_GFLOAT))
3744             strcat (buf, ", G-Float");
3745           break;
3746
3747         case EM_VISIUM:
3748           if (e_flags & EF_VISIUM_ARCH_MCM)
3749             strcat (buf, ", mcm");
3750           else if (e_flags & EF_VISIUM_ARCH_MCM24)
3751             strcat (buf, ", mcm24");
3752           if (e_flags & EF_VISIUM_ARCH_GR6)
3753             strcat (buf, ", gr6");
3754           break;
3755
3756         case EM_RL78:
3757           switch (e_flags & E_FLAG_RL78_CPU_MASK)
3758             {
3759             case E_FLAG_RL78_ANY_CPU: break;
3760             case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3761             case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3762             case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3763             }
3764           if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3765             strcat (buf, ", 64-bit doubles");
3766           break;
3767
3768         case EM_RX:
3769           if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3770             strcat (buf, ", 64-bit doubles");
3771           if (e_flags & E_FLAG_RX_DSP)
3772             strcat (buf, ", dsp");
3773           if (e_flags & E_FLAG_RX_PID)
3774             strcat (buf, ", pid");
3775           if (e_flags & E_FLAG_RX_ABI)
3776             strcat (buf, ", RX ABI");
3777           if (e_flags & E_FLAG_RX_SINSNS_SET)
3778             strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3779                     ? ", uses String instructions" : ", bans String instructions");
3780           if (e_flags & E_FLAG_RX_V2)
3781             strcat (buf, ", V2");
3782           if (e_flags & E_FLAG_RX_V3)
3783             strcat (buf, ", V3");
3784           break;
3785
3786         case EM_S390:
3787           if (e_flags & EF_S390_HIGH_GPRS)
3788             strcat (buf, ", highgprs");
3789           break;
3790
3791         case EM_TI_C6000:
3792           if ((e_flags & EF_C6000_REL))
3793             strcat (buf, ", relocatable module");
3794           break;
3795
3796         case EM_MSP430:
3797           strcat (buf, _(": architecture variant: "));
3798           switch (e_flags & EF_MSP430_MACH)
3799             {
3800             case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3801             case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3802             case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3803             case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3804             case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3805             case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3806             case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3807             case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3808             case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3809             case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3810             case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3811             case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3812             case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3813             case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3814             case E_MSP430_MACH_MSP430X  : strcat (buf, "MSP430X"); break;
3815             default:
3816               strcat (buf, _(": unknown")); break;
3817             }
3818
3819           if (e_flags & ~ EF_MSP430_MACH)
3820             strcat (buf, _(": unknown extra flag bits also present"));
3821           break;
3822
3823         case EM_Z80:
3824           switch (e_flags & EF_Z80_MACH_MSK)
3825             {
3826             case EF_Z80_MACH_Z80: strcat (buf, ", Z80"); break;
3827             case EF_Z80_MACH_Z180: strcat (buf, ", Z180"); break;
3828             case EF_Z80_MACH_R800: strcat (buf, ", R800"); break;
3829             case EF_Z80_MACH_EZ80_Z80: strcat (buf, ", EZ80"); break;
3830             case EF_Z80_MACH_EZ80_ADL: strcat (buf, ", EZ80, ADL"); break;
3831             case EF_Z80_MACH_GBZ80: strcat (buf, ", GBZ80"); break;
3832             case EF_Z80_MACH_Z80N: strcat (buf, ", Z80N"); break;
3833             default:
3834               strcat (buf, _(", unknown")); break;
3835             }
3836           break;
3837         }
3838     }
3839
3840   return buf;
3841 }
3842
3843 static const char *
3844 get_osabi_name (Filedata * filedata, unsigned int osabi)
3845 {
3846   static char buff[32];
3847
3848   switch (osabi)
3849     {
3850     case ELFOSABI_NONE:         return "UNIX - System V";
3851     case ELFOSABI_HPUX:         return "UNIX - HP-UX";
3852     case ELFOSABI_NETBSD:       return "UNIX - NetBSD";
3853     case ELFOSABI_GNU:          return "UNIX - GNU";
3854     case ELFOSABI_SOLARIS:      return "UNIX - Solaris";
3855     case ELFOSABI_AIX:          return "UNIX - AIX";
3856     case ELFOSABI_IRIX:         return "UNIX - IRIX";
3857     case ELFOSABI_FREEBSD:      return "UNIX - FreeBSD";
3858     case ELFOSABI_TRU64:        return "UNIX - TRU64";
3859     case ELFOSABI_MODESTO:      return "Novell - Modesto";
3860     case ELFOSABI_OPENBSD:      return "UNIX - OpenBSD";
3861     case ELFOSABI_OPENVMS:      return "VMS - OpenVMS";
3862     case ELFOSABI_NSK:          return "HP - Non-Stop Kernel";
3863     case ELFOSABI_AROS:         return "AROS";
3864     case ELFOSABI_FENIXOS:      return "FenixOS";
3865     case ELFOSABI_CLOUDABI:     return "Nuxi CloudABI";
3866     case ELFOSABI_OPENVOS:      return "Stratus Technologies OpenVOS";
3867     default:
3868       if (osabi >= 64)
3869         switch (filedata->file_header.e_machine)
3870           {
3871           case EM_ARM:
3872             switch (osabi)
3873               {
3874               case ELFOSABI_ARM:        return "ARM";
3875               case ELFOSABI_ARM_FDPIC:  return "ARM FDPIC";
3876               default:
3877                 break;
3878               }
3879             break;
3880
3881           case EM_MSP430:
3882           case EM_MSP430_OLD:
3883           case EM_VISIUM:
3884             switch (osabi)
3885               {
3886               case ELFOSABI_STANDALONE: return _("Standalone App");
3887               default:
3888                 break;
3889               }
3890             break;
3891
3892           case EM_TI_C6000:
3893             switch (osabi)
3894               {
3895               case ELFOSABI_C6000_ELFABI:       return _("Bare-metal C6000");
3896               case ELFOSABI_C6000_LINUX:        return "Linux C6000";
3897               default:
3898                 break;
3899               }
3900             break;
3901
3902           default:
3903             break;
3904           }
3905       snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3906       return buff;
3907     }
3908 }
3909
3910 static const char *
3911 get_aarch64_segment_type (unsigned long type)
3912 {
3913   switch (type)
3914     {
3915     case PT_AARCH64_ARCHEXT:  return "AARCH64_ARCHEXT";
3916     default:                  return NULL;
3917     }
3918 }
3919
3920 static const char *
3921 get_arm_segment_type (unsigned long type)
3922 {
3923   switch (type)
3924     {
3925     case PT_ARM_EXIDX: return "EXIDX";
3926     default:           return NULL;
3927     }
3928 }
3929
3930 static const char *
3931 get_s390_segment_type (unsigned long type)
3932 {
3933   switch (type)
3934     {
3935     case PT_S390_PGSTE: return "S390_PGSTE";
3936     default:            return NULL;
3937     }
3938 }
3939
3940 static const char *
3941 get_mips_segment_type (unsigned long type)
3942 {
3943   switch (type)
3944     {
3945     case PT_MIPS_REGINFO:   return "REGINFO";
3946     case PT_MIPS_RTPROC:    return "RTPROC";
3947     case PT_MIPS_OPTIONS:   return "OPTIONS";
3948     case PT_MIPS_ABIFLAGS:  return "ABIFLAGS";
3949     default:                return NULL;
3950     }
3951 }
3952
3953 static const char *
3954 get_parisc_segment_type (unsigned long type)
3955 {
3956   switch (type)
3957     {
3958     case PT_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
3959     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
3960     case PT_PARISC_WEAKORDER:   return "PARISC_WEAKORDER";
3961     default:                    return NULL;
3962     }
3963 }
3964
3965 static const char *
3966 get_ia64_segment_type (unsigned long type)
3967 {
3968   switch (type)
3969     {
3970     case PT_IA_64_ARCHEXT:      return "IA_64_ARCHEXT";
3971     case PT_IA_64_UNWIND:       return "IA_64_UNWIND";
3972     default:                    return NULL;
3973     }
3974 }
3975
3976 static const char *
3977 get_tic6x_segment_type (unsigned long type)
3978 {
3979   switch (type)
3980     {
3981     case PT_C6000_PHATTR:  return "C6000_PHATTR";
3982     default:               return NULL;
3983     }
3984 }
3985
3986 static const char *
3987 get_hpux_segment_type (unsigned long type, unsigned e_machine)
3988 {
3989   if (e_machine == EM_PARISC)
3990     switch (type)
3991       {
3992       case PT_HP_TLS:           return "HP_TLS";
3993       case PT_HP_CORE_NONE:     return "HP_CORE_NONE";
3994       case PT_HP_CORE_VERSION:  return "HP_CORE_VERSION";
3995       case PT_HP_CORE_KERNEL:   return "HP_CORE_KERNEL";
3996       case PT_HP_CORE_COMM:     return "HP_CORE_COMM";
3997       case PT_HP_CORE_PROC:     return "HP_CORE_PROC";
3998       case PT_HP_CORE_LOADABLE: return "HP_CORE_LOADABLE";
3999       case PT_HP_CORE_STACK:    return "HP_CORE_STACK";
4000       case PT_HP_CORE_SHM:      return "HP_CORE_SHM";
4001       case PT_HP_CORE_MMF:      return "HP_CORE_MMF";
4002       case PT_HP_PARALLEL:      return "HP_PARALLEL";
4003       case PT_HP_FASTBIND:      return "HP_FASTBIND";
4004       case PT_HP_OPT_ANNOT:     return "HP_OPT_ANNOT";
4005       case PT_HP_HSL_ANNOT:     return "HP_HSL_ANNOT";
4006       case PT_HP_STACK:         return "HP_STACK";
4007       case PT_HP_CORE_UTSNAME:  return "HP_CORE_UTSNAME";
4008       default:                  return NULL;
4009       }
4010
4011   if (e_machine == EM_IA_64)
4012     switch (type)
4013       {
4014       case PT_HP_TLS:            return "HP_TLS";
4015       case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
4016       case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
4017       case PT_IA_64_HP_STACK:    return "HP_STACK";
4018       default:                   return NULL;
4019       }
4020
4021   return NULL;
4022 }
4023
4024 static const char *
4025 get_solaris_segment_type (unsigned long type)
4026 {
4027   switch (type)
4028     {
4029     case 0x6464e550: return "PT_SUNW_UNWIND";
4030     case 0x6474e550: return "PT_SUNW_EH_FRAME";
4031     case 0x6ffffff7: return "PT_LOSUNW";
4032     case 0x6ffffffa: return "PT_SUNWBSS";
4033     case 0x6ffffffb: return "PT_SUNWSTACK";
4034     case 0x6ffffffc: return "PT_SUNWDTRACE";
4035     case 0x6ffffffd: return "PT_SUNWCAP";
4036     case 0x6fffffff: return "PT_HISUNW";
4037     default:         return NULL;
4038     }
4039 }
4040
4041 static const char *
4042 get_segment_type (Filedata * filedata, unsigned long p_type)
4043 {
4044   static char buff[32];
4045
4046   switch (p_type)
4047     {
4048     case PT_NULL:       return "NULL";
4049     case PT_LOAD:       return "LOAD";
4050     case PT_DYNAMIC:    return "DYNAMIC";
4051     case PT_INTERP:     return "INTERP";
4052     case PT_NOTE:       return "NOTE";
4053     case PT_SHLIB:      return "SHLIB";
4054     case PT_PHDR:       return "PHDR";
4055     case PT_TLS:        return "TLS";
4056     case PT_GNU_EH_FRAME: return "GNU_EH_FRAME";
4057     case PT_GNU_STACK:  return "GNU_STACK";
4058     case PT_GNU_RELRO:  return "GNU_RELRO";
4059     case PT_GNU_PROPERTY: return "GNU_PROPERTY";
4060
4061     case PT_OPENBSD_RANDOMIZE: return "OPENBSD_RANDOMIZE";
4062     case PT_OPENBSD_WXNEEDED: return "OPENBSD_WXNEEDED";
4063     case PT_OPENBSD_BOOTDATA: return "OPENBSD_BOOTDATA";
4064
4065     default:
4066       if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
4067         {
4068           const char * result;
4069
4070           switch (filedata->file_header.e_machine)
4071             {
4072             case EM_AARCH64:
4073               result = get_aarch64_segment_type (p_type);
4074               break;
4075             case EM_ARM:
4076               result = get_arm_segment_type (p_type);
4077               break;
4078             case EM_MIPS:
4079             case EM_MIPS_RS3_LE:
4080               result = get_mips_segment_type (p_type);
4081               break;
4082             case EM_PARISC:
4083               result = get_parisc_segment_type (p_type);
4084               break;
4085             case EM_IA_64:
4086               result = get_ia64_segment_type (p_type);
4087               break;
4088             case EM_TI_C6000:
4089               result = get_tic6x_segment_type (p_type);
4090               break;
4091             case EM_S390:
4092             case EM_S390_OLD:
4093               result = get_s390_segment_type (p_type);
4094               break;
4095             default:
4096               result = NULL;
4097               break;
4098             }
4099
4100           if (result != NULL)
4101             return result;
4102
4103           sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
4104         }
4105       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
4106         {
4107           const char * result = NULL;
4108
4109           switch (filedata->file_header.e_ident[EI_OSABI])
4110             {
4111             case ELFOSABI_GNU:
4112             case ELFOSABI_FREEBSD:
4113               if (p_type >= PT_GNU_MBIND_LO && p_type <= PT_GNU_MBIND_HI)
4114                 {
4115                   sprintf (buff, "GNU_MBIND+%#lx", p_type - PT_GNU_MBIND_LO);
4116                   result = buff;
4117                 }
4118               break;
4119             case ELFOSABI_HPUX:
4120               result = get_hpux_segment_type (p_type,
4121                                               filedata->file_header.e_machine);
4122               break;
4123             case ELFOSABI_SOLARIS:
4124               result = get_solaris_segment_type (p_type);
4125               break;
4126             default:
4127               break;
4128             }
4129           if (result != NULL)
4130             return result;
4131
4132           sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
4133         }
4134       else
4135         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
4136
4137       return buff;
4138     }
4139 }
4140
4141 static const char *
4142 get_arc_section_type_name (unsigned int sh_type)
4143 {
4144   switch (sh_type)
4145     {
4146     case SHT_ARC_ATTRIBUTES:      return "ARC_ATTRIBUTES";
4147     default:
4148       break;
4149     }
4150   return NULL;
4151 }
4152
4153 static const char *
4154 get_mips_section_type_name (unsigned int sh_type)
4155 {
4156   switch (sh_type)
4157     {
4158     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
4159     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
4160     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
4161     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
4162     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
4163     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
4164     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
4165     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
4166     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
4167     case SHT_MIPS_RELD:          return "MIPS_RELD";
4168     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
4169     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
4170     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
4171     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
4172     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
4173     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
4174     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
4175     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
4176     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
4177     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
4178     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
4179     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
4180     case SHT_MIPS_LINE:          return "MIPS_LINE";
4181     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
4182     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
4183     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
4184     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
4185     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
4186     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
4187     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
4188     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
4189     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
4190     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
4191     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
4192     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
4193     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
4194     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
4195     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
4196     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
4197     case SHT_MIPS_ABIFLAGS:      return "MIPS_ABIFLAGS";
4198     case SHT_MIPS_XHASH:         return "MIPS_XHASH";
4199     default:
4200       break;
4201     }
4202   return NULL;
4203 }
4204
4205 static const char *
4206 get_parisc_section_type_name (unsigned int sh_type)
4207 {
4208   switch (sh_type)
4209     {
4210     case SHT_PARISC_EXT:        return "PARISC_EXT";
4211     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
4212     case SHT_PARISC_DOC:        return "PARISC_DOC";
4213     case SHT_PARISC_ANNOT:      return "PARISC_ANNOT";
4214     case SHT_PARISC_SYMEXTN:    return "PARISC_SYMEXTN";
4215     case SHT_PARISC_STUBS:      return "PARISC_STUBS";
4216     case SHT_PARISC_DLKM:       return "PARISC_DLKM";
4217     default:                    return NULL;
4218     }
4219 }
4220
4221 static const char *
4222 get_ia64_section_type_name (Filedata * filedata, unsigned int sh_type)
4223 {
4224   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
4225   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
4226     return get_osabi_name (filedata, (sh_type & 0x00FF0000) >> 16);
4227
4228   switch (sh_type)
4229     {
4230     case SHT_IA_64_EXT:                return "IA_64_EXT";
4231     case SHT_IA_64_UNWIND:             return "IA_64_UNWIND";
4232     case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
4233     case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
4234     case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
4235     case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
4236     case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
4237     case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
4238     case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
4239     case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
4240     default:
4241       break;
4242     }
4243   return NULL;
4244 }
4245
4246 static const char *
4247 get_x86_64_section_type_name (unsigned int sh_type)
4248 {
4249   switch (sh_type)
4250     {
4251     case SHT_X86_64_UNWIND:     return "X86_64_UNWIND";
4252     default:                    return NULL;
4253     }
4254 }
4255
4256 static const char *
4257 get_aarch64_section_type_name (unsigned int sh_type)
4258 {
4259   switch (sh_type)
4260     {
4261     case SHT_AARCH64_ATTRIBUTES: return "AARCH64_ATTRIBUTES";
4262     default:                     return NULL;
4263     }
4264 }
4265
4266 static const char *
4267 get_arm_section_type_name (unsigned int sh_type)
4268 {
4269   switch (sh_type)
4270     {
4271     case SHT_ARM_EXIDX:           return "ARM_EXIDX";
4272     case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
4273     case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
4274     case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
4275     case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
4276     default:                      return NULL;
4277     }
4278 }
4279
4280 static const char *
4281 get_tic6x_section_type_name (unsigned int sh_type)
4282 {
4283   switch (sh_type)
4284     {
4285     case SHT_C6000_UNWIND:      return "C6000_UNWIND";
4286     case SHT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
4287     case SHT_C6000_ATTRIBUTES:  return "C6000_ATTRIBUTES";
4288     case SHT_TI_ICODE:          return "TI_ICODE";
4289     case SHT_TI_XREF:           return "TI_XREF";
4290     case SHT_TI_HANDLER:        return "TI_HANDLER";
4291     case SHT_TI_INITINFO:       return "TI_INITINFO";
4292     case SHT_TI_PHATTRS:        return "TI_PHATTRS";
4293     default:                    return NULL;
4294     }
4295 }
4296
4297 static const char *
4298 get_msp430_section_type_name (unsigned int sh_type)
4299 {
4300   switch (sh_type)
4301     {
4302     case SHT_MSP430_SEC_FLAGS:    return "MSP430_SEC_FLAGS";
4303     case SHT_MSP430_SYM_ALIASES:  return "MSP430_SYM_ALIASES";
4304     case SHT_MSP430_ATTRIBUTES:   return "MSP430_ATTRIBUTES";
4305     default:                      return NULL;
4306     }
4307 }
4308
4309 static const char *
4310 get_nfp_section_type_name (unsigned int sh_type)
4311 {
4312   switch (sh_type)
4313     {
4314     case SHT_NFP_MECONFIG:      return "NFP_MECONFIG";
4315     case SHT_NFP_INITREG:       return "NFP_INITREG";
4316     case SHT_NFP_UDEBUG:        return "NFP_UDEBUG";
4317     default:                    return NULL;
4318     }
4319 }
4320
4321 static const char *
4322 get_v850_section_type_name (unsigned int sh_type)
4323 {
4324   switch (sh_type)
4325     {
4326     case SHT_V850_SCOMMON:  return "V850 Small Common";
4327     case SHT_V850_TCOMMON:  return "V850 Tiny Common";
4328     case SHT_V850_ZCOMMON:  return "V850 Zero Common";
4329     case SHT_RENESAS_IOP:   return "RENESAS IOP";
4330     case SHT_RENESAS_INFO:  return "RENESAS INFO";
4331     default:                return NULL;
4332     }
4333 }
4334
4335 static const char *
4336 get_riscv_section_type_name (unsigned int sh_type)
4337 {
4338   switch (sh_type)
4339     {
4340     case SHT_RISCV_ATTRIBUTES:  return "RISCV_ATTRIBUTES";
4341     default: return NULL;
4342     }
4343 }
4344
4345 static const char *
4346 get_csky_section_type_name (unsigned int sh_type)
4347 {
4348   switch (sh_type)
4349     {
4350     case SHT_CSKY_ATTRIBUTES:  return "CSKY_ATTRIBUTES";
4351     default:  return NULL;
4352     }
4353 }
4354
4355 static const char *
4356 get_section_type_name (Filedata * filedata, unsigned int sh_type)
4357 {
4358   static char buff[32];
4359   const char * result;
4360
4361   switch (sh_type)
4362     {
4363     case SHT_NULL:              return "NULL";
4364     case SHT_PROGBITS:          return "PROGBITS";
4365     case SHT_SYMTAB:            return "SYMTAB";
4366     case SHT_STRTAB:            return "STRTAB";
4367     case SHT_RELA:              return "RELA";
4368     case SHT_HASH:              return "HASH";
4369     case SHT_DYNAMIC:           return "DYNAMIC";
4370     case SHT_NOTE:              return "NOTE";
4371     case SHT_NOBITS:            return "NOBITS";
4372     case SHT_REL:               return "REL";
4373     case SHT_SHLIB:             return "SHLIB";
4374     case SHT_DYNSYM:            return "DYNSYM";
4375     case SHT_INIT_ARRAY:        return "INIT_ARRAY";
4376     case SHT_FINI_ARRAY:        return "FINI_ARRAY";
4377     case SHT_PREINIT_ARRAY:     return "PREINIT_ARRAY";
4378     case SHT_GNU_HASH:          return "GNU_HASH";
4379     case SHT_GROUP:             return "GROUP";
4380     case SHT_SYMTAB_SHNDX:      return "SYMTAB SECTION INDICES";
4381     case SHT_GNU_verdef:        return "VERDEF";
4382     case SHT_GNU_verneed:       return "VERNEED";
4383     case SHT_GNU_versym:        return "VERSYM";
4384     case 0x6ffffff0:            return "VERSYM";
4385     case 0x6ffffffc:            return "VERDEF";
4386     case 0x7ffffffd:            return "AUXILIARY";
4387     case 0x7fffffff:            return "FILTER";
4388     case SHT_GNU_LIBLIST:       return "GNU_LIBLIST";
4389
4390     default:
4391       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4392         {
4393           switch (filedata->file_header.e_machine)
4394             {
4395             case EM_ARC:
4396             case EM_ARC_COMPACT:
4397             case EM_ARC_COMPACT2:
4398               result = get_arc_section_type_name (sh_type);
4399               break;
4400             case EM_MIPS:
4401             case EM_MIPS_RS3_LE:
4402               result = get_mips_section_type_name (sh_type);
4403               break;
4404             case EM_PARISC:
4405               result = get_parisc_section_type_name (sh_type);
4406               break;
4407             case EM_IA_64:
4408               result = get_ia64_section_type_name (filedata, sh_type);
4409               break;
4410             case EM_X86_64:
4411             case EM_L1OM:
4412             case EM_K1OM:
4413               result = get_x86_64_section_type_name (sh_type);
4414               break;
4415             case EM_AARCH64:
4416               result = get_aarch64_section_type_name (sh_type);
4417               break;
4418             case EM_ARM:
4419               result = get_arm_section_type_name (sh_type);
4420               break;
4421             case EM_TI_C6000:
4422               result = get_tic6x_section_type_name (sh_type);
4423               break;
4424             case EM_MSP430:
4425               result = get_msp430_section_type_name (sh_type);
4426               break;
4427             case EM_NFP:
4428               result = get_nfp_section_type_name (sh_type);
4429               break;
4430             case EM_V800:
4431             case EM_V850:
4432             case EM_CYGNUS_V850:
4433               result = get_v850_section_type_name (sh_type);
4434               break;
4435             case EM_RISCV:
4436               result = get_riscv_section_type_name (sh_type);
4437               break;
4438             case EM_CSKY:
4439               result = get_csky_section_type_name (sh_type);
4440               break;
4441             default:
4442               result = NULL;
4443               break;
4444             }
4445
4446           if (result != NULL)
4447             return result;
4448
4449           sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4450         }
4451       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4452         {
4453           switch (filedata->file_header.e_machine)
4454             {
4455             case EM_IA_64:
4456               result = get_ia64_section_type_name (filedata, sh_type);
4457               break;
4458             default:
4459               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4460                 result = get_solaris_section_type (sh_type);
4461               else
4462                 {
4463                   switch (sh_type)
4464                     {
4465                     case SHT_GNU_INCREMENTAL_INPUTS: result = "GNU_INCREMENTAL_INPUTS"; break;
4466                     case SHT_GNU_ATTRIBUTES: result = "GNU_ATTRIBUTES"; break;
4467                     case SHT_GNU_HASH: result = "GNU_HASH"; break;
4468                     case SHT_GNU_LIBLIST: result = "GNU_LIBLIST"; break;
4469                     default:
4470                       result = NULL;
4471                       break;
4472                     }
4473                 }
4474               break;
4475             }
4476
4477           if (result != NULL)
4478             return result;
4479
4480           sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4481         }
4482       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4483         {
4484           switch (filedata->file_header.e_machine)
4485             {
4486             case EM_V800:
4487             case EM_V850:
4488             case EM_CYGNUS_V850:
4489               result = get_v850_section_type_name (sh_type);
4490               break;
4491             default:
4492               result = NULL;
4493               break;
4494             }
4495
4496           if (result != NULL)
4497             return result;
4498
4499           sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4500         }
4501       else
4502         /* This message is probably going to be displayed in a 15
4503            character wide field, so put the hex value first.  */
4504         snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4505
4506       return buff;
4507     }
4508 }
4509
4510 enum long_option_values
4511 {
4512   OPTION_DEBUG_DUMP = 512,
4513   OPTION_DYN_SYMS,
4514   OPTION_LTO_SYMS,
4515   OPTION_DWARF_DEPTH,
4516   OPTION_DWARF_START,
4517   OPTION_DWARF_CHECK,
4518   OPTION_CTF_DUMP,
4519   OPTION_CTF_PARENT,
4520   OPTION_CTF_SYMBOLS,
4521   OPTION_CTF_STRINGS,
4522   OPTION_WITH_SYMBOL_VERSIONS,
4523   OPTION_RECURSE_LIMIT,
4524   OPTION_NO_RECURSE_LIMIT,
4525   OPTION_NO_DEMANGLING
4526 };
4527
4528 static struct option options[] =
4529 {
4530  /* Note - This table is alpha-sorted on the 'val'
4531     field in order to make adding new options easier.  */
4532   {"arch-specific",    no_argument, 0, 'A'},
4533   {"all",              no_argument, 0, 'a'},
4534   {"demangle",         optional_argument, 0, 'C'},
4535   {"archive-index",    no_argument, 0, 'c'},
4536   {"use-dynamic",      no_argument, 0, 'D'},
4537   {"dynamic",          no_argument, 0, 'd'},
4538   {"headers",          no_argument, 0, 'e'},
4539   {"section-groups",   no_argument, 0, 'g'},
4540   {"help",             no_argument, 0, 'H'},
4541   {"file-header",      no_argument, 0, 'h'},
4542   {"histogram",        no_argument, 0, 'I'},
4543   {"lint",             no_argument, 0, 'L'},
4544   {"enable-checks",    no_argument, 0, 'L'},
4545   {"program-headers",  no_argument, 0, 'l'},
4546   {"segments",         no_argument, 0, 'l'},
4547   {"full-section-name",no_argument, 0, 'N'},
4548   {"notes",            no_argument, 0, 'n'},
4549   {"string-dump",      required_argument, 0, 'p'},
4550   {"relocated-dump",   required_argument, 0, 'R'},
4551   {"relocs",           no_argument, 0, 'r'},
4552   {"section-headers",  no_argument, 0, 'S'},
4553   {"sections",         no_argument, 0, 'S'},
4554   {"symbols",          no_argument, 0, 's'},
4555   {"syms",             no_argument, 0, 's'},
4556   {"silent-truncation",no_argument, 0, 'T'},
4557   {"section-details",  no_argument, 0, 't'},
4558   {"unwind",           no_argument, 0, 'u'},
4559   {"version-info",     no_argument, 0, 'V'},
4560   {"version",          no_argument, 0, 'v'},
4561   {"wide",             no_argument, 0, 'W'},
4562   {"hex-dump",         required_argument, 0, 'x'},
4563   {"decompress",       no_argument, 0, 'z'},
4564
4565   {"no-demangle",      no_argument, 0, OPTION_NO_DEMANGLING},
4566   {"recurse-limit",    no_argument, NULL, OPTION_RECURSE_LIMIT},
4567   {"no-recurse-limit", no_argument, NULL, OPTION_NO_RECURSE_LIMIT},
4568   {"no-recursion-limit", no_argument, NULL, OPTION_NO_RECURSE_LIMIT},
4569   {"dyn-syms",         no_argument, 0, OPTION_DYN_SYMS},
4570   {"lto-syms",         no_argument, 0, OPTION_LTO_SYMS},
4571   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
4572   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
4573   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
4574   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
4575 #ifdef ENABLE_LIBCTF
4576   {"ctf",              required_argument, 0, OPTION_CTF_DUMP},
4577   {"ctf-symbols",      required_argument, 0, OPTION_CTF_SYMBOLS},
4578   {"ctf-strings",      required_argument, 0, OPTION_CTF_STRINGS},
4579   {"ctf-parent",       required_argument, 0, OPTION_CTF_PARENT},
4580 #endif
4581
4582   {0,                  no_argument, 0, 0}
4583 };
4584
4585 static void
4586 usage (FILE * stream)
4587 {
4588   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4589   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4590   fprintf (stream, _(" Options are:\n\
4591   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4592   -h --file-header       Display the ELF file header\n\
4593   -l --program-headers   Display the program headers\n\
4594      --segments          An alias for --program-headers\n\
4595   -S --section-headers   Display the sections' header\n\
4596      --sections          An alias for --section-headers\n\
4597   -g --section-groups    Display the section groups\n\
4598   -t --section-details   Display the section details\n\
4599   -e --headers           Equivalent to: -h -l -S\n\
4600   -s --syms              Display the symbol table\n\
4601      --symbols           An alias for --syms\n\
4602      --dyn-syms          Display the dynamic symbol table\n\
4603      --lto-syms          Display LTO symbol tables\n\
4604   -C --demangle[=STYLE]  Decode low-level symbol names into user-level names\n\
4605                           The STYLE, if specified, can be `auto' (the default),\n\
4606                           `gnu', `lucid', `arm', `hp', `edg', `gnu-v3', `java'\n\
4607                           or `gnat'\n\
4608      --no-demangle       Do not demangle low-level symbol names.  (This is the default)\n\
4609      --recurse-limit     Enable a demangling recursion limit.  (This is the default)\n\
4610      --no-recurse-limit  Disable a demangling recursion limit\n\
4611   -n --notes             Display the core notes (if present)\n\
4612   -r --relocs            Display the relocations (if present)\n\
4613   -u --unwind            Display the unwind info (if present)\n\
4614   -d --dynamic           Display the dynamic section (if present)\n\
4615   -V --version-info      Display the version sections (if present)\n\
4616   -A --arch-specific     Display architecture specific information (if any)\n\
4617   -c --archive-index     Display the symbol/file index in an archive\n\
4618   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
4619   -L --lint|--enable-checks  Display warning messages for possible problems\n\
4620   -x --hex-dump=<number|name>\n\
4621                          Dump the contents of section <number|name> as bytes\n\
4622   -p --string-dump=<number|name>\n\
4623                          Dump the contents of section <number|name> as strings\n\
4624   -R --relocated-dump=<number|name>\n\
4625                          Dump the contents of section <number|name> as relocated bytes\n\
4626   -z --decompress        Decompress section before dumping it\n\
4627   -w[lLiaprmfFsoORtUuTgAckK] or\n\
4628   --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4629                =frames-interp,=str,=str-offsets,=loc,=Ranges,=pubtypes,\n\
4630                =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4631                =addr,=cu_index,=links,=follow-links]\n\
4632                          Display the contents of DWARF debug sections\n"));
4633   fprintf (stream, _("\
4634   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
4635   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
4636                          or deeper\n"));
4637 #ifdef ENABLE_LIBCTF
4638   fprintf (stream, _("\
4639   --ctf=<number|name>    Display CTF info from section <number|name>\n\
4640   --ctf-parent=<number|name>\n\
4641                          Use section <number|name> as the CTF parent\n\n\
4642   --ctf-symbols=<number|name>\n\
4643                          Use section <number|name> as the CTF external symtab\n\n\
4644   --ctf-strings=<number|name>\n\
4645                          Use section <number|name> as the CTF external strtab\n\n"));
4646 #endif
4647
4648 #ifdef SUPPORT_DISASSEMBLY
4649   fprintf (stream, _("\
4650   -i --instruction-dump=<number|name>\n\
4651                          Disassemble the contents of section <number|name>\n"));
4652 #endif
4653   fprintf (stream, _("\
4654   -I --histogram         Display histogram of bucket list lengths\n\
4655   -W --wide              Allow output width to exceed 80 characters\n\
4656   -T --silent-truncation If a symbol name is truncated, do not add a suffix [...]\n\
4657   @<file>                Read options from <file>\n\
4658   -H --help              Display this information\n\
4659   -v --version           Display the version number of readelf\n"));
4660
4661   if (REPORT_BUGS_TO[0] && stream == stdout)
4662     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4663
4664   exit (stream == stdout ? 0 : 1);
4665 }
4666
4667 /* Record the fact that the user wants the contents of section number
4668    SECTION to be displayed using the method(s) encoded as flags bits
4669    in TYPE.  Note, TYPE can be zero if we are creating the array for
4670    the first time.  */
4671
4672 static void
4673 request_dump_bynumber (struct dump_data *dumpdata,
4674                        unsigned int section, dump_type type)
4675 {
4676   if (section >= dumpdata->num_dump_sects)
4677     {
4678       dump_type * new_dump_sects;
4679
4680       new_dump_sects = (dump_type *) calloc (section + 1,
4681                                              sizeof (* new_dump_sects));
4682
4683       if (new_dump_sects == NULL)
4684         error (_("Out of memory allocating dump request table.\n"));
4685       else
4686         {
4687           if (dumpdata->dump_sects)
4688             {
4689               /* Copy current flag settings.  */
4690               memcpy (new_dump_sects, dumpdata->dump_sects,
4691                       dumpdata->num_dump_sects * sizeof (* new_dump_sects));
4692
4693               free (dumpdata->dump_sects);
4694             }
4695
4696           dumpdata->dump_sects = new_dump_sects;
4697           dumpdata->num_dump_sects = section + 1;
4698         }
4699     }
4700
4701   if (dumpdata->dump_sects)
4702     dumpdata->dump_sects[section] |= type;
4703 }
4704
4705 /* Request a dump by section name.  */
4706
4707 static void
4708 request_dump_byname (const char * section, dump_type type)
4709 {
4710   struct dump_list_entry * new_request;
4711
4712   new_request = (struct dump_list_entry *)
4713       malloc (sizeof (struct dump_list_entry));
4714   if (!new_request)
4715     error (_("Out of memory allocating dump request table.\n"));
4716
4717   new_request->name = strdup (section);
4718   if (!new_request->name)
4719     error (_("Out of memory allocating dump request table.\n"));
4720
4721   new_request->type = type;
4722
4723   new_request->next = dump_sects_byname;
4724   dump_sects_byname = new_request;
4725 }
4726
4727 static inline void
4728 request_dump (struct dump_data *dumpdata, dump_type type)
4729 {
4730   int section;
4731   char * cp;
4732
4733   do_dump++;
4734   section = strtoul (optarg, & cp, 0);
4735
4736   if (! *cp && section >= 0)
4737     request_dump_bynumber (dumpdata, section, type);
4738   else
4739     request_dump_byname (optarg, type);
4740 }
4741
4742 static void
4743 parse_args (struct dump_data *dumpdata, int argc, char ** argv)
4744 {
4745   int c;
4746
4747   if (argc < 2)
4748     usage (stderr);
4749
4750   while ((c = getopt_long
4751           (argc, argv, "ACDHILNR:STVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4752     {
4753       switch (c)
4754         {
4755         case 0:
4756           /* Long options.  */
4757           break;
4758         case 'H':
4759           usage (stdout);
4760           break;
4761
4762         case 'a':
4763           do_syms = TRUE;
4764           do_reloc = TRUE;
4765           do_unwind = TRUE;
4766           do_dynamic = TRUE;
4767           do_header = TRUE;
4768           do_sections = TRUE;
4769           do_section_groups = TRUE;
4770           do_segments = TRUE;
4771           do_version = TRUE;
4772           do_histogram = TRUE;
4773           do_arch = TRUE;
4774           do_notes = TRUE;
4775           break;
4776
4777         case 'g':
4778           do_section_groups = TRUE;
4779           break;
4780         case 't':
4781         case 'N':
4782           do_sections = TRUE;
4783           do_section_details = TRUE;
4784           break;
4785         case 'e':
4786           do_header = TRUE;
4787           do_sections = TRUE;
4788           do_segments = TRUE;
4789           break;
4790         case 'A':
4791           do_arch = TRUE;
4792           break;
4793         case 'D':
4794           do_using_dynamic = TRUE;
4795           break;
4796         case 'r':
4797           do_reloc = TRUE;
4798           break;
4799         case 'u':
4800           do_unwind = TRUE;
4801           break;
4802         case 'h':
4803           do_header = TRUE;
4804           break;
4805         case 'l':
4806           do_segments = TRUE;
4807           break;
4808         case 's':
4809           do_syms = TRUE;
4810           break;
4811         case 'S':
4812           do_sections = TRUE;
4813           break;
4814         case 'd':
4815           do_dynamic = TRUE;
4816           break;
4817         case 'I':
4818           do_histogram = TRUE;
4819           break;
4820         case 'n':
4821           do_notes = TRUE;
4822           break;
4823         case 'c':
4824           do_archive_index = TRUE;
4825           break;
4826         case 'L':
4827           do_checks = TRUE;
4828           break;
4829         case 'x':
4830           request_dump (dumpdata, HEX_DUMP);
4831           break;
4832         case 'p':
4833           request_dump (dumpdata, STRING_DUMP);
4834           break;
4835         case 'R':
4836           request_dump (dumpdata, RELOC_DUMP);
4837           break;
4838         case 'z':
4839           decompress_dumps = TRUE;
4840           break;
4841         case 'w':
4842           do_dump = TRUE;
4843           if (optarg == NULL)
4844             {
4845               do_debugging = TRUE;
4846               dwarf_select_sections_all ();
4847             }
4848           else
4849             {
4850               do_debugging = FALSE;
4851               dwarf_select_sections_by_letters (optarg);
4852             }
4853           break;
4854         case OPTION_DEBUG_DUMP:
4855           do_dump = TRUE;
4856           if (optarg == NULL)
4857             do_debugging = TRUE;
4858           else
4859             {
4860               do_debugging = FALSE;
4861               dwarf_select_sections_by_names (optarg);
4862             }
4863           break;
4864         case OPTION_DWARF_DEPTH:
4865           {
4866             char *cp;
4867
4868             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4869           }
4870           break;
4871         case OPTION_DWARF_START:
4872           {
4873             char *cp;
4874
4875             dwarf_start_die = strtoul (optarg, & cp, 0);
4876           }
4877           break;
4878         case OPTION_DWARF_CHECK:
4879           dwarf_check = TRUE;
4880           break;
4881         case OPTION_CTF_DUMP:
4882           do_ctf = TRUE;
4883           request_dump (dumpdata, CTF_DUMP);
4884           break;
4885         case OPTION_CTF_SYMBOLS:
4886           free (dump_ctf_symtab_name);
4887           dump_ctf_symtab_name = strdup (optarg);
4888           break;
4889         case OPTION_CTF_STRINGS:
4890           free (dump_ctf_strtab_name);
4891           dump_ctf_strtab_name = strdup (optarg);
4892           break;
4893         case OPTION_CTF_PARENT:
4894           free (dump_ctf_parent_name);
4895           dump_ctf_parent_name = strdup (optarg);
4896           break;
4897         case OPTION_DYN_SYMS:
4898           do_dyn_syms = TRUE;
4899           break;
4900         case OPTION_LTO_SYMS:
4901           do_lto_syms = TRUE;
4902           break;
4903 #ifdef SUPPORT_DISASSEMBLY
4904         case 'i':
4905           request_dump (dumpdata, DISASS_DUMP);
4906           break;
4907 #endif
4908         case 'v':
4909           print_version (program_name);
4910           break;
4911         case 'V':
4912           do_version = TRUE;
4913           break;
4914         case 'W':
4915           do_wide = TRUE;
4916           break;
4917         case 'T':
4918           do_not_show_symbol_truncation = TRUE;
4919           break;
4920         case 'C':
4921           do_demangle = TRUE;
4922           if (optarg != NULL)
4923             {
4924               enum demangling_styles style;
4925
4926               style = cplus_demangle_name_to_style (optarg);
4927               if (style == unknown_demangling)
4928                 error (_("unknown demangling style `%s'"), optarg);
4929
4930               cplus_demangle_set_style (style);
4931             }
4932           break;
4933         case OPTION_NO_DEMANGLING:
4934           do_demangle = FALSE;
4935           break;
4936         case OPTION_RECURSE_LIMIT:
4937           demangle_flags &= ~ DMGL_NO_RECURSE_LIMIT;
4938           break;
4939         case OPTION_NO_RECURSE_LIMIT:
4940           demangle_flags |= DMGL_NO_RECURSE_LIMIT;
4941           break;
4942         case OPTION_WITH_SYMBOL_VERSIONS:
4943           /* Ignored for backward compatibility.  */
4944           break;
4945
4946         default:
4947           /* xgettext:c-format */
4948           error (_("Invalid option '-%c'\n"), c);
4949           /* Fall through.  */
4950         case '?':
4951           usage (stderr);
4952         }
4953     }
4954
4955   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4956       && !do_segments && !do_header && !do_dump && !do_version
4957       && !do_histogram && !do_debugging && !do_arch && !do_notes
4958       && !do_section_groups && !do_archive_index
4959       && !do_dyn_syms && !do_lto_syms)
4960     {
4961       if (do_checks)
4962         {
4963           check_all = TRUE;
4964           do_dynamic = do_syms = do_reloc = do_unwind = do_sections = TRUE;
4965           do_segments = do_header = do_dump = do_version = TRUE;
4966           do_histogram = do_debugging = do_arch = do_notes = TRUE;
4967           do_section_groups = do_archive_index = do_dyn_syms = TRUE;
4968           do_lto_syms = TRUE;
4969         }
4970       else
4971         usage (stderr);
4972     }
4973 }
4974
4975 static const char *
4976 get_elf_class (unsigned int elf_class)
4977 {
4978   static char buff[32];
4979
4980   switch (elf_class)
4981     {
4982     case ELFCLASSNONE: return _("none");
4983     case ELFCLASS32:   return "ELF32";
4984     case ELFCLASS64:   return "ELF64";
4985     default:
4986       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4987       return buff;
4988     }
4989 }
4990
4991 static const char *
4992 get_data_encoding (unsigned int encoding)
4993 {
4994   static char buff[32];
4995
4996   switch (encoding)
4997     {
4998     case ELFDATANONE: return _("none");
4999     case ELFDATA2LSB: return _("2's complement, little endian");
5000     case ELFDATA2MSB: return _("2's complement, big endian");
5001     default:
5002       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
5003       return buff;
5004     }
5005 }
5006
5007 /* Decode the data held in 'filedata->file_header'.  */
5008
5009 static bfd_boolean
5010 process_file_header (Filedata * filedata)
5011 {
5012   Elf_Internal_Ehdr * header = & filedata->file_header;
5013
5014   if (   header->e_ident[EI_MAG0] != ELFMAG0
5015       || header->e_ident[EI_MAG1] != ELFMAG1
5016       || header->e_ident[EI_MAG2] != ELFMAG2
5017       || header->e_ident[EI_MAG3] != ELFMAG3)
5018     {
5019       error
5020         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
5021       return FALSE;
5022     }
5023
5024   init_dwarf_regnames_by_elf_machine_code (header->e_machine);
5025
5026   if (do_header)
5027     {
5028       unsigned i;
5029
5030       printf (_("ELF Header:\n"));
5031       printf (_("  Magic:   "));
5032       for (i = 0; i < EI_NIDENT; i++)
5033         printf ("%2.2x ", header->e_ident[i]);
5034       printf ("\n");
5035       printf (_("  Class:                             %s\n"),
5036               get_elf_class (header->e_ident[EI_CLASS]));
5037       printf (_("  Data:                              %s\n"),
5038               get_data_encoding (header->e_ident[EI_DATA]));
5039       printf (_("  Version:                           %d%s\n"),
5040               header->e_ident[EI_VERSION],
5041               (header->e_ident[EI_VERSION] == EV_CURRENT
5042                ? _(" (current)")
5043                : (header->e_ident[EI_VERSION] != EV_NONE
5044                   ? _(" <unknown>")
5045                   : "")));
5046       printf (_("  OS/ABI:                            %s\n"),
5047               get_osabi_name (filedata, header->e_ident[EI_OSABI]));
5048       printf (_("  ABI Version:                       %d\n"),
5049               header->e_ident[EI_ABIVERSION]);
5050       printf (_("  Type:                              %s\n"),
5051               get_file_type (header->e_type));
5052       printf (_("  Machine:                           %s\n"),
5053               get_machine_name (header->e_machine));
5054       printf (_("  Version:                           0x%lx\n"),
5055               header->e_version);
5056
5057       printf (_("  Entry point address:               "));
5058       print_vma (header->e_entry, PREFIX_HEX);
5059       printf (_("\n  Start of program headers:          "));
5060       print_vma (header->e_phoff, DEC);
5061       printf (_(" (bytes into file)\n  Start of section headers:          "));
5062       print_vma (header->e_shoff, DEC);
5063       printf (_(" (bytes into file)\n"));
5064
5065       printf (_("  Flags:                             0x%lx%s\n"),
5066               header->e_flags,
5067               get_machine_flags (filedata, header->e_flags, header->e_machine));
5068       printf (_("  Size of this header:               %u (bytes)\n"),
5069               header->e_ehsize);
5070       printf (_("  Size of program headers:           %u (bytes)\n"),
5071               header->e_phentsize);
5072       printf (_("  Number of program headers:         %u"),
5073               header->e_phnum);
5074       if (filedata->section_headers != NULL
5075           && header->e_phnum == PN_XNUM
5076           && filedata->section_headers[0].sh_info != 0)
5077         {
5078           header->e_phnum = filedata->section_headers[0].sh_info;
5079           printf (" (%u)", header->e_phnum);
5080         }
5081       putc ('\n', stdout);
5082       printf (_("  Size of section headers:           %u (bytes)\n"),
5083               header->e_shentsize);
5084       printf (_("  Number of section headers:         %u"),
5085               header->e_shnum);
5086       if (filedata->section_headers != NULL && header->e_shnum == SHN_UNDEF)
5087         {
5088           header->e_shnum = filedata->section_headers[0].sh_size;
5089           printf (" (%u)", header->e_shnum);
5090         }
5091       putc ('\n', stdout);
5092       printf (_("  Section header string table index: %u"),
5093               header->e_shstrndx);
5094       if (filedata->section_headers != NULL
5095           && header->e_shstrndx == (SHN_XINDEX & 0xffff))
5096         {
5097           header->e_shstrndx = filedata->section_headers[0].sh_link;
5098           printf (" (%u)", header->e_shstrndx);
5099         }
5100       if (header->e_shstrndx != SHN_UNDEF
5101           && header->e_shstrndx >= header->e_shnum)
5102         {
5103           header->e_shstrndx = SHN_UNDEF;
5104           printf (_(" <corrupt: out of range>"));
5105         }
5106       putc ('\n', stdout);
5107     }
5108
5109   if (filedata->section_headers != NULL)
5110     {
5111       if (header->e_phnum == PN_XNUM
5112           && filedata->section_headers[0].sh_info != 0)
5113         header->e_phnum = filedata->section_headers[0].sh_info;
5114       if (header->e_shnum == SHN_UNDEF)
5115         header->e_shnum = filedata->section_headers[0].sh_size;
5116       if (header->e_shstrndx == (SHN_XINDEX & 0xffff))
5117         header->e_shstrndx = filedata->section_headers[0].sh_link;
5118       if (header->e_shstrndx >= header->e_shnum)
5119         header->e_shstrndx = SHN_UNDEF;
5120       free (filedata->section_headers);
5121       filedata->section_headers = NULL;
5122     }
5123
5124   return TRUE;
5125 }
5126
5127 /* Read in the program headers from FILEDATA and store them in PHEADERS.
5128    Returns TRUE upon success, FALSE otherwise.  Loads 32-bit headers.  */
5129
5130 static bfd_boolean
5131 get_32bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
5132 {
5133   Elf32_External_Phdr * phdrs;
5134   Elf32_External_Phdr * external;
5135   Elf_Internal_Phdr *   internal;
5136   unsigned int i;
5137   unsigned int size = filedata->file_header.e_phentsize;
5138   unsigned int num  = filedata->file_header.e_phnum;
5139
5140   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5141   if (size == 0 || num == 0)
5142     return FALSE;
5143   if (size < sizeof * phdrs)
5144     {
5145       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
5146       return FALSE;
5147     }
5148   if (size > sizeof * phdrs)
5149     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
5150
5151   phdrs = (Elf32_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
5152                                             size, num, _("program headers"));
5153   if (phdrs == NULL)
5154     return FALSE;
5155
5156   for (i = 0, internal = pheaders, external = phdrs;
5157        i < filedata->file_header.e_phnum;
5158        i++, internal++, external++)
5159     {
5160       internal->p_type   = BYTE_GET (external->p_type);
5161       internal->p_offset = BYTE_GET (external->p_offset);
5162       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
5163       internal->p_paddr  = BYTE_GET (external->p_paddr);
5164       internal->p_filesz = BYTE_GET (external->p_filesz);
5165       internal->p_memsz  = BYTE_GET (external->p_memsz);
5166       internal->p_flags  = BYTE_GET (external->p_flags);
5167       internal->p_align  = BYTE_GET (external->p_align);
5168     }
5169
5170   free (phdrs);
5171   return TRUE;
5172 }
5173
5174 /* Read in the program headers from FILEDATA and store them in PHEADERS.
5175    Returns TRUE upon success, FALSE otherwise.  Loads 64-bit headers.  */
5176
5177 static bfd_boolean
5178 get_64bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
5179 {
5180   Elf64_External_Phdr * phdrs;
5181   Elf64_External_Phdr * external;
5182   Elf_Internal_Phdr *   internal;
5183   unsigned int i;
5184   unsigned int size = filedata->file_header.e_phentsize;
5185   unsigned int num  = filedata->file_header.e_phnum;
5186
5187   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5188   if (size == 0 || num == 0)
5189     return FALSE;
5190   if (size < sizeof * phdrs)
5191     {
5192       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
5193       return FALSE;
5194     }
5195   if (size > sizeof * phdrs)
5196     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
5197
5198   phdrs = (Elf64_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
5199                                             size, num, _("program headers"));
5200   if (!phdrs)
5201     return FALSE;
5202
5203   for (i = 0, internal = pheaders, external = phdrs;
5204        i < filedata->file_header.e_phnum;
5205        i++, internal++, external++)
5206     {
5207       internal->p_type   = BYTE_GET (external->p_type);
5208       internal->p_flags  = BYTE_GET (external->p_flags);
5209       internal->p_offset = BYTE_GET (external->p_offset);
5210       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
5211       internal->p_paddr  = BYTE_GET (external->p_paddr);
5212       internal->p_filesz = BYTE_GET (external->p_filesz);
5213       internal->p_memsz  = BYTE_GET (external->p_memsz);
5214       internal->p_align  = BYTE_GET (external->p_align);
5215     }
5216
5217   free (phdrs);
5218   return TRUE;
5219 }
5220
5221 /* Returns TRUE if the program headers were read into `program_headers'.  */
5222
5223 static bfd_boolean
5224 get_program_headers (Filedata * filedata)
5225 {
5226   Elf_Internal_Phdr * phdrs;
5227
5228   /* Check cache of prior read.  */
5229   if (filedata->program_headers != NULL)
5230     return TRUE;
5231
5232   /* Be kind to memory checkers by looking for
5233      e_phnum values which we know must be invalid.  */
5234   if (filedata->file_header.e_phnum
5235       * (is_32bit_elf ? sizeof (Elf32_External_Phdr) : sizeof (Elf64_External_Phdr))
5236       >= filedata->file_size)
5237     {
5238       error (_("Too many program headers - %#x - the file is not that big\n"),
5239              filedata->file_header.e_phnum);
5240       return FALSE;
5241     }
5242
5243   phdrs = (Elf_Internal_Phdr *) cmalloc (filedata->file_header.e_phnum,
5244                                          sizeof (Elf_Internal_Phdr));
5245   if (phdrs == NULL)
5246     {
5247       error (_("Out of memory reading %u program headers\n"),
5248              filedata->file_header.e_phnum);
5249       return FALSE;
5250     }
5251
5252   if (is_32bit_elf
5253       ? get_32bit_program_headers (filedata, phdrs)
5254       : get_64bit_program_headers (filedata, phdrs))
5255     {
5256       filedata->program_headers = phdrs;
5257       return TRUE;
5258     }
5259
5260   free (phdrs);
5261   return FALSE;
5262 }
5263
5264 /* Returns TRUE if the program headers were loaded.  */
5265
5266 static bfd_boolean
5267 process_program_headers (Filedata * filedata)
5268 {
5269   Elf_Internal_Phdr * segment;
5270   unsigned int i;
5271   Elf_Internal_Phdr * previous_load = NULL;
5272
5273   filedata->dynamic_addr = 0;
5274   filedata->dynamic_size = 0;
5275
5276   if (filedata->file_header.e_phnum == 0)
5277     {
5278       /* PR binutils/12467.  */
5279       if (filedata->file_header.e_phoff != 0)
5280         {
5281           warn (_("possibly corrupt ELF header - it has a non-zero program"
5282                   " header offset, but no program headers\n"));
5283           return FALSE;
5284         }
5285       else if (do_segments)
5286         printf (_("\nThere are no program headers in this file.\n"));
5287       return TRUE;
5288     }
5289
5290   if (do_segments && !do_header)
5291     {
5292       printf (_("\nElf file type is %s\n"), get_file_type (filedata->file_header.e_type));
5293       printf (_("Entry point 0x%s\n"), bfd_vmatoa ("x", filedata->file_header.e_entry));
5294       printf (ngettext ("There is %d program header, starting at offset %s\n",
5295                         "There are %d program headers, starting at offset %s\n",
5296                         filedata->file_header.e_phnum),
5297               filedata->file_header.e_phnum,
5298               bfd_vmatoa ("u", filedata->file_header.e_phoff));
5299     }
5300
5301   if (! get_program_headers (filedata))
5302     return TRUE;
5303
5304   if (do_segments)
5305     {
5306       if (filedata->file_header.e_phnum > 1)
5307         printf (_("\nProgram Headers:\n"));
5308       else
5309         printf (_("\nProgram Headers:\n"));
5310
5311       if (is_32bit_elf)
5312         printf
5313           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
5314       else if (do_wide)
5315         printf
5316           (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
5317       else
5318         {
5319           printf
5320             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
5321           printf
5322             (_("                 FileSiz            MemSiz              Flags  Align\n"));
5323         }
5324     }
5325
5326   for (i = 0, segment = filedata->program_headers;
5327        i < filedata->file_header.e_phnum;
5328        i++, segment++)
5329     {
5330       if (do_segments)
5331         {
5332           printf ("  %-14.14s ", get_segment_type (filedata, segment->p_type));
5333
5334           if (is_32bit_elf)
5335             {
5336               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5337               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
5338               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
5339               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
5340               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
5341               printf ("%c%c%c ",
5342                       (segment->p_flags & PF_R ? 'R' : ' '),
5343                       (segment->p_flags & PF_W ? 'W' : ' '),
5344                       (segment->p_flags & PF_X ? 'E' : ' '));
5345               printf ("%#lx", (unsigned long) segment->p_align);
5346             }
5347           else if (do_wide)
5348             {
5349               if ((unsigned long) segment->p_offset == segment->p_offset)
5350                 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5351               else
5352                 {
5353                   print_vma (segment->p_offset, FULL_HEX);
5354                   putchar (' ');
5355                 }
5356
5357               print_vma (segment->p_vaddr, FULL_HEX);
5358               putchar (' ');
5359               print_vma (segment->p_paddr, FULL_HEX);
5360               putchar (' ');
5361
5362               if ((unsigned long) segment->p_filesz == segment->p_filesz)
5363                 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
5364               else
5365                 {
5366                   print_vma (segment->p_filesz, FULL_HEX);
5367                   putchar (' ');
5368                 }
5369
5370               if ((unsigned long) segment->p_memsz == segment->p_memsz)
5371                 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
5372               else
5373                 {
5374                   print_vma (segment->p_memsz, FULL_HEX);
5375                 }
5376
5377               printf (" %c%c%c ",
5378                       (segment->p_flags & PF_R ? 'R' : ' '),
5379                       (segment->p_flags & PF_W ? 'W' : ' '),
5380                       (segment->p_flags & PF_X ? 'E' : ' '));
5381
5382               if ((unsigned long) segment->p_align == segment->p_align)
5383                 printf ("%#lx", (unsigned long) segment->p_align);
5384               else
5385                 {
5386                   print_vma (segment->p_align, PREFIX_HEX);
5387                 }
5388             }
5389           else
5390             {
5391               print_vma (segment->p_offset, FULL_HEX);
5392               putchar (' ');
5393               print_vma (segment->p_vaddr, FULL_HEX);
5394               putchar (' ');
5395               print_vma (segment->p_paddr, FULL_HEX);
5396               printf ("\n                 ");
5397               print_vma (segment->p_filesz, FULL_HEX);
5398               putchar (' ');
5399               print_vma (segment->p_memsz, FULL_HEX);
5400               printf ("  %c%c%c    ",
5401                       (segment->p_flags & PF_R ? 'R' : ' '),
5402                       (segment->p_flags & PF_W ? 'W' : ' '),
5403                       (segment->p_flags & PF_X ? 'E' : ' '));
5404               print_vma (segment->p_align, PREFIX_HEX);
5405             }
5406
5407           putc ('\n', stdout);
5408         }
5409
5410       switch (segment->p_type)
5411         {
5412         case PT_LOAD:
5413 #if 0 /* Do not warn about out of order PT_LOAD segments.  Although officially
5414          required by the ELF standard, several programs, including the Linux
5415          kernel, make use of non-ordered segments.  */
5416           if (previous_load
5417               && previous_load->p_vaddr > segment->p_vaddr)
5418             error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
5419 #endif
5420           if (segment->p_memsz < segment->p_filesz)
5421             error (_("the segment's file size is larger than its memory size\n"));
5422           previous_load = segment;
5423           break;
5424
5425         case PT_PHDR:
5426           /* PR 20815 - Verify that the program header is loaded into memory.  */
5427           if (i > 0 && previous_load != NULL)
5428             error (_("the PHDR segment must occur before any LOAD segment\n"));
5429           if (filedata->file_header.e_machine != EM_PARISC)
5430             {
5431               unsigned int j;
5432
5433               for (j = 1; j < filedata->file_header.e_phnum; j++)
5434                 {
5435                   Elf_Internal_Phdr *load = filedata->program_headers + j;
5436                   if (load->p_type == PT_LOAD
5437                       && load->p_offset <= segment->p_offset
5438                       && (load->p_offset + load->p_filesz
5439                           >= segment->p_offset + segment->p_filesz)
5440                       && load->p_vaddr <= segment->p_vaddr
5441                       && (load->p_vaddr + load->p_filesz
5442                           >= segment->p_vaddr + segment->p_filesz))
5443                     break;
5444                 }
5445               if (j == filedata->file_header.e_phnum)
5446                 error (_("the PHDR segment is not covered by a LOAD segment\n"));
5447             }
5448           break;
5449
5450         case PT_DYNAMIC:
5451           if (filedata->dynamic_addr)
5452             error (_("more than one dynamic segment\n"));
5453
5454           /* By default, assume that the .dynamic section is the first
5455              section in the DYNAMIC segment.  */
5456           filedata->dynamic_addr = segment->p_offset;
5457           filedata->dynamic_size = segment->p_filesz;
5458
5459           /* Try to locate the .dynamic section. If there is
5460              a section header table, we can easily locate it.  */
5461           if (filedata->section_headers != NULL)
5462             {
5463               Elf_Internal_Shdr * sec;
5464
5465               sec = find_section (filedata, ".dynamic");
5466               if (sec == NULL || sec->sh_size == 0)
5467                 {
5468                   /* A corresponding .dynamic section is expected, but on
5469                      IA-64/OpenVMS it is OK for it to be missing.  */
5470                   if (!is_ia64_vms (filedata))
5471                     error (_("no .dynamic section in the dynamic segment\n"));
5472                   break;
5473                 }
5474
5475               if (sec->sh_type == SHT_NOBITS)
5476                 {
5477                   filedata->dynamic_size = 0;
5478                   break;
5479                 }
5480
5481               filedata->dynamic_addr = sec->sh_offset;
5482               filedata->dynamic_size = sec->sh_size;
5483
5484               /* The PT_DYNAMIC segment, which is used by the run-time
5485                  loader,  should exactly match the .dynamic section.  */
5486               if (do_checks
5487                   && (filedata->dynamic_addr != segment->p_offset
5488                       || filedata->dynamic_size != segment->p_filesz))
5489                 warn (_("\
5490 the .dynamic section is not the same as the dynamic segment\n"));
5491             }
5492
5493           /* PR binutils/17512: Avoid corrupt dynamic section info in the
5494              segment.  Check this after matching against the section headers
5495              so we don't warn on debuginfo file (which have NOBITS .dynamic
5496              sections).  */
5497           if (filedata->dynamic_addr > filedata->file_size
5498               || (filedata->dynamic_size
5499                   > filedata->file_size - filedata->dynamic_addr))
5500             {
5501               error (_("the dynamic segment offset + size exceeds the size of the file\n"));
5502               filedata->dynamic_addr = filedata->dynamic_size = 0;
5503             }
5504           break;
5505
5506         case PT_INTERP:
5507           if (fseek (filedata->handle,
5508                      filedata->archive_file_offset + (long) segment->p_offset,
5509                      SEEK_SET))
5510             error (_("Unable to find program interpreter name\n"));
5511           else
5512             {
5513               char fmt [32];
5514               int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
5515
5516               if (ret >= (int) sizeof (fmt) || ret < 0)
5517                 error (_("Internal error: failed to create format string to display program interpreter\n"));
5518
5519               filedata->program_interpreter[0] = 0;
5520               if (fscanf (filedata->handle, fmt,
5521                           filedata->program_interpreter) <= 0)
5522                 error (_("Unable to read program interpreter name\n"));
5523
5524               if (do_segments)
5525                 printf (_("      [Requesting program interpreter: %s]\n"),
5526                     filedata->program_interpreter);
5527             }
5528           break;
5529         }
5530     }
5531
5532   if (do_segments
5533       && filedata->section_headers != NULL
5534       && filedata->string_table != NULL)
5535     {
5536       printf (_("\n Section to Segment mapping:\n"));
5537       printf (_("  Segment Sections...\n"));
5538
5539       for (i = 0; i < filedata->file_header.e_phnum; i++)
5540         {
5541           unsigned int j;
5542           Elf_Internal_Shdr * section;
5543
5544           segment = filedata->program_headers + i;
5545           section = filedata->section_headers + 1;
5546
5547           printf ("   %2.2d     ", i);
5548
5549           for (j = 1; j < filedata->file_header.e_shnum; j++, section++)
5550             {
5551               if (!ELF_TBSS_SPECIAL (section, segment)
5552                   && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
5553                 printf ("%s ", printable_section_name (filedata, section));
5554             }
5555
5556           putc ('\n',stdout);
5557         }
5558     }
5559
5560   return TRUE;
5561 }
5562
5563
5564 /* Find the file offset corresponding to VMA by using the program headers.  */
5565
5566 static long
5567 offset_from_vma (Filedata * filedata, bfd_vma vma, bfd_size_type size)
5568 {
5569   Elf_Internal_Phdr * seg;
5570
5571   if (! get_program_headers (filedata))
5572     {
5573       warn (_("Cannot interpret virtual addresses without program headers.\n"));
5574       return (long) vma;
5575     }
5576
5577   for (seg = filedata->program_headers;
5578        seg < filedata->program_headers + filedata->file_header.e_phnum;
5579        ++seg)
5580     {
5581       if (seg->p_type != PT_LOAD)
5582         continue;
5583
5584       if (vma >= (seg->p_vaddr & -seg->p_align)
5585           && vma + size <= seg->p_vaddr + seg->p_filesz)
5586         return vma - seg->p_vaddr + seg->p_offset;
5587     }
5588
5589   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
5590         (unsigned long) vma);
5591   return (long) vma;
5592 }
5593
5594
5595 /* Allocate memory and load the sections headers into FILEDATA->filedata->section_headers.
5596    If PROBE is true, this is just a probe and we do not generate any error
5597    messages if the load fails.  */
5598
5599 static bfd_boolean
5600 get_32bit_section_headers (Filedata * filedata, bfd_boolean probe)
5601 {
5602   Elf32_External_Shdr * shdrs;
5603   Elf_Internal_Shdr *   internal;
5604   unsigned int          i;
5605   unsigned int          size = filedata->file_header.e_shentsize;
5606   unsigned int          num = probe ? 1 : filedata->file_header.e_shnum;
5607
5608   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5609   if (size == 0 || num == 0)
5610     return FALSE;
5611   if (size < sizeof * shdrs)
5612     {
5613       if (! probe)
5614         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5615       return FALSE;
5616     }
5617   if (!probe && size > sizeof * shdrs)
5618     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5619
5620   shdrs = (Elf32_External_Shdr *) get_data (NULL, filedata, filedata->file_header.e_shoff,
5621                                             size, num,
5622                                             probe ? NULL : _("section headers"));
5623   if (shdrs == NULL)
5624     return FALSE;
5625
5626   free (filedata->section_headers);
5627   filedata->section_headers = (Elf_Internal_Shdr *)
5628     cmalloc (num, sizeof (Elf_Internal_Shdr));
5629   if (filedata->section_headers == NULL)
5630     {
5631       if (!probe)
5632         error (_("Out of memory reading %u section headers\n"), num);
5633       free (shdrs);
5634       return FALSE;
5635     }
5636
5637   for (i = 0, internal = filedata->section_headers;
5638        i < num;
5639        i++, internal++)
5640     {
5641       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5642       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5643       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5644       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5645       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5646       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5647       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5648       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5649       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5650       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5651       if (!probe && internal->sh_link > num)
5652         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5653       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5654         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5655     }
5656
5657   free (shdrs);
5658   return TRUE;
5659 }
5660
5661 /* Like get_32bit_section_headers, except that it fetches 64-bit headers.  */
5662
5663 static bfd_boolean
5664 get_64bit_section_headers (Filedata * filedata, bfd_boolean probe)
5665 {
5666   Elf64_External_Shdr *  shdrs;
5667   Elf_Internal_Shdr *    internal;
5668   unsigned int           i;
5669   unsigned int           size = filedata->file_header.e_shentsize;
5670   unsigned int           num = probe ? 1 : filedata->file_header.e_shnum;
5671
5672   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5673   if (size == 0 || num == 0)
5674     return FALSE;
5675
5676   if (size < sizeof * shdrs)
5677     {
5678       if (! probe)
5679         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5680       return FALSE;
5681     }
5682
5683   if (! probe && size > sizeof * shdrs)
5684     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5685
5686   shdrs = (Elf64_External_Shdr *) get_data (NULL, filedata,
5687                                             filedata->file_header.e_shoff,
5688                                             size, num,
5689                                             probe ? NULL : _("section headers"));
5690   if (shdrs == NULL)
5691     return FALSE;
5692
5693   free (filedata->section_headers);
5694   filedata->section_headers = (Elf_Internal_Shdr *)
5695     cmalloc (num, sizeof (Elf_Internal_Shdr));
5696   if (filedata->section_headers == NULL)
5697     {
5698       if (! probe)
5699         error (_("Out of memory reading %u section headers\n"), num);
5700       free (shdrs);
5701       return FALSE;
5702     }
5703
5704   for (i = 0, internal = filedata->section_headers;
5705        i < num;
5706        i++, internal++)
5707     {
5708       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5709       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5710       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5711       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5712       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5713       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5714       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5715       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5716       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5717       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5718       if (!probe && internal->sh_link > num)
5719         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5720       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5721         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5722     }
5723
5724   free (shdrs);
5725   return TRUE;
5726 }
5727
5728 static Elf_Internal_Sym *
5729 get_32bit_elf_symbols (Filedata *           filedata,
5730                        Elf_Internal_Shdr *  section,
5731                        unsigned long *      num_syms_return)
5732 {
5733   unsigned long number = 0;
5734   Elf32_External_Sym * esyms = NULL;
5735   Elf_External_Sym_Shndx * shndx = NULL;
5736   Elf_Internal_Sym * isyms = NULL;
5737   Elf_Internal_Sym * psym;
5738   unsigned int j;
5739   elf_section_list * entry;
5740
5741   if (section->sh_size == 0)
5742     {
5743       if (num_syms_return != NULL)
5744         * num_syms_return = 0;
5745       return NULL;
5746     }
5747
5748   /* Run some sanity checks first.  */
5749   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5750     {
5751       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5752              printable_section_name (filedata, section),
5753              (unsigned long) section->sh_entsize);
5754       goto exit_point;
5755     }
5756
5757   if (section->sh_size > filedata->file_size)
5758     {
5759       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5760              printable_section_name (filedata, section),
5761              (unsigned long) section->sh_size);
5762       goto exit_point;
5763     }
5764
5765   number = section->sh_size / section->sh_entsize;
5766
5767   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5768     {
5769       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5770              (unsigned long) section->sh_size,
5771              printable_section_name (filedata, section),
5772              (unsigned long) section->sh_entsize);
5773       goto exit_point;
5774     }
5775
5776   esyms = (Elf32_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5777                                            section->sh_size, _("symbols"));
5778   if (esyms == NULL)
5779     goto exit_point;
5780
5781   shndx = NULL;
5782   for (entry = filedata->symtab_shndx_list; entry != NULL; entry = entry->next)
5783     {
5784       if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5785         continue;
5786
5787       if (shndx != NULL)
5788         {
5789           error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5790           free (shndx);
5791         }
5792
5793       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5794                                                    entry->hdr->sh_offset,
5795                                                    1, entry->hdr->sh_size,
5796                                                    _("symbol table section indices"));
5797       if (shndx == NULL)
5798         goto exit_point;
5799
5800       /* PR17531: file: heap-buffer-overflow */
5801       if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5802         {
5803           error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5804                  printable_section_name (filedata, entry->hdr),
5805                  (unsigned long) entry->hdr->sh_size,
5806                  (unsigned long) section->sh_size);
5807           goto exit_point;
5808         }
5809     }
5810
5811   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5812
5813   if (isyms == NULL)
5814     {
5815       error (_("Out of memory reading %lu symbols\n"),
5816              (unsigned long) number);
5817       goto exit_point;
5818     }
5819
5820   for (j = 0, psym = isyms; j < number; j++, psym++)
5821     {
5822       psym->st_name  = BYTE_GET (esyms[j].st_name);
5823       psym->st_value = BYTE_GET (esyms[j].st_value);
5824       psym->st_size  = BYTE_GET (esyms[j].st_size);
5825       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5826       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5827         psym->st_shndx
5828           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5829       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5830         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5831       psym->st_info  = BYTE_GET (esyms[j].st_info);
5832       psym->st_other = BYTE_GET (esyms[j].st_other);
5833     }
5834
5835  exit_point:
5836   free (shndx);
5837   free (esyms);
5838
5839   if (num_syms_return != NULL)
5840     * num_syms_return = isyms == NULL ? 0 : number;
5841
5842   return isyms;
5843 }
5844
5845 static Elf_Internal_Sym *
5846 get_64bit_elf_symbols (Filedata *           filedata,
5847                        Elf_Internal_Shdr *  section,
5848                        unsigned long *      num_syms_return)
5849 {
5850   unsigned long number = 0;
5851   Elf64_External_Sym * esyms = NULL;
5852   Elf_External_Sym_Shndx * shndx = NULL;
5853   Elf_Internal_Sym * isyms = NULL;
5854   Elf_Internal_Sym * psym;
5855   unsigned int j;
5856   elf_section_list * entry;
5857
5858   if (section->sh_size == 0)
5859     {
5860       if (num_syms_return != NULL)
5861         * num_syms_return = 0;
5862       return NULL;
5863     }
5864
5865   /* Run some sanity checks first.  */
5866   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5867     {
5868       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5869              printable_section_name (filedata, section),
5870              (unsigned long) section->sh_entsize);
5871       goto exit_point;
5872     }
5873
5874   if (section->sh_size > filedata->file_size)
5875     {
5876       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5877              printable_section_name (filedata, section),
5878              (unsigned long) section->sh_size);
5879       goto exit_point;
5880     }
5881
5882   number = section->sh_size / section->sh_entsize;
5883
5884   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5885     {
5886       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5887              (unsigned long) section->sh_size,
5888              printable_section_name (filedata, section),
5889              (unsigned long) section->sh_entsize);
5890       goto exit_point;
5891     }
5892
5893   esyms = (Elf64_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5894                                            section->sh_size, _("symbols"));
5895   if (!esyms)
5896     goto exit_point;
5897
5898   shndx = NULL;
5899   for (entry = filedata->symtab_shndx_list; entry != NULL; entry = entry->next)
5900     {
5901       if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5902         continue;
5903
5904       if (shndx != NULL)
5905         {
5906           error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5907           free (shndx);
5908         }
5909
5910       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5911                                                    entry->hdr->sh_offset,
5912                                                    1, entry->hdr->sh_size,
5913                                                    _("symbol table section indices"));
5914       if (shndx == NULL)
5915         goto exit_point;
5916
5917       /* PR17531: file: heap-buffer-overflow */
5918       if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5919         {
5920           error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5921                  printable_section_name (filedata, entry->hdr),
5922                  (unsigned long) entry->hdr->sh_size,
5923                  (unsigned long) section->sh_size);
5924           goto exit_point;
5925         }
5926     }
5927
5928   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5929
5930   if (isyms == NULL)
5931     {
5932       error (_("Out of memory reading %lu symbols\n"),
5933              (unsigned long) number);
5934       goto exit_point;
5935     }
5936
5937   for (j = 0, psym = isyms; j < number; j++, psym++)
5938     {
5939       psym->st_name  = BYTE_GET (esyms[j].st_name);
5940       psym->st_info  = BYTE_GET (esyms[j].st_info);
5941       psym->st_other = BYTE_GET (esyms[j].st_other);
5942       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5943
5944       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5945         psym->st_shndx
5946           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5947       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5948         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5949
5950       psym->st_value = BYTE_GET (esyms[j].st_value);
5951       psym->st_size  = BYTE_GET (esyms[j].st_size);
5952     }
5953
5954  exit_point:
5955   free (shndx);
5956   free (esyms);
5957
5958   if (num_syms_return != NULL)
5959     * num_syms_return = isyms == NULL ? 0 : number;
5960
5961   return isyms;
5962 }
5963
5964 static const char *
5965 get_elf_section_flags (Filedata * filedata, bfd_vma sh_flags)
5966 {
5967   static char buff[1024];
5968   char * p = buff;
5969   unsigned int field_size = is_32bit_elf ? 8 : 16;
5970   signed int sindex;
5971   unsigned int size = sizeof (buff) - (field_size + 4 + 1);
5972   bfd_vma os_flags = 0;
5973   bfd_vma proc_flags = 0;
5974   bfd_vma unknown_flags = 0;
5975   static const struct
5976     {
5977       const char * str;
5978       unsigned int len;
5979     }
5980   flags [] =
5981     {
5982       /*  0 */ { STRING_COMMA_LEN ("WRITE") },
5983       /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
5984       /*  2 */ { STRING_COMMA_LEN ("EXEC") },
5985       /*  3 */ { STRING_COMMA_LEN ("MERGE") },
5986       /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
5987       /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
5988       /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5989       /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5990       /*  8 */ { STRING_COMMA_LEN ("GROUP") },
5991       /*  9 */ { STRING_COMMA_LEN ("TLS") },
5992       /* IA-64 specific.  */
5993       /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5994       /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5995       /* IA-64 OpenVMS specific.  */
5996       /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5997       /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5998       /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5999       /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
6000       /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
6001       /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
6002       /* Generic.  */
6003       /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
6004       /* SPARC specific.  */
6005       /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
6006       /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
6007       /* ARM specific.  */
6008       /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
6009       /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
6010       /* 23 */ { STRING_COMMA_LEN ("COMDEF") },
6011       /* GNU specific.  */
6012       /* 24 */ { STRING_COMMA_LEN ("GNU_MBIND") },
6013       /* VLE specific.  */
6014       /* 25 */ { STRING_COMMA_LEN ("VLE") },
6015       /* GNU specific.  */
6016       /* 26 */ { STRING_COMMA_LEN ("GNU_RETAIN") },
6017     };
6018
6019   if (do_section_details)
6020     {
6021       sprintf (buff, "[%*.*lx]: ",
6022                field_size, field_size, (unsigned long) sh_flags);
6023       p += field_size + 4;
6024     }
6025
6026   while (sh_flags)
6027     {
6028       bfd_vma flag;
6029
6030       flag = sh_flags & - sh_flags;
6031       sh_flags &= ~ flag;
6032
6033       if (do_section_details)
6034         {
6035           switch (flag)
6036             {
6037             case SHF_WRITE:             sindex = 0; break;
6038             case SHF_ALLOC:             sindex = 1; break;
6039             case SHF_EXECINSTR:         sindex = 2; break;
6040             case SHF_MERGE:             sindex = 3; break;
6041             case SHF_STRINGS:           sindex = 4; break;
6042             case SHF_INFO_LINK:         sindex = 5; break;
6043             case SHF_LINK_ORDER:        sindex = 6; break;
6044             case SHF_OS_NONCONFORMING:  sindex = 7; break;
6045             case SHF_GROUP:             sindex = 8; break;
6046             case SHF_TLS:               sindex = 9; break;
6047             case SHF_EXCLUDE:           sindex = 18; break;
6048             case SHF_COMPRESSED:        sindex = 20; break;
6049
6050             default:
6051               sindex = -1;
6052               switch (filedata->file_header.e_machine)
6053                 {
6054                 case EM_IA_64:
6055                   if (flag == SHF_IA_64_SHORT)
6056                     sindex = 10;
6057                   else if (flag == SHF_IA_64_NORECOV)
6058                     sindex = 11;
6059 #ifdef BFD64
6060                   else if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
6061                     switch (flag)
6062                       {
6063                       case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
6064                       case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
6065                       case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
6066                       case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
6067                       case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
6068                       case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
6069                       default:                        break;
6070                       }
6071 #endif
6072                   break;
6073
6074                 case EM_386:
6075                 case EM_IAMCU:
6076                 case EM_X86_64:
6077                 case EM_L1OM:
6078                 case EM_K1OM:
6079                 case EM_OLD_SPARCV9:
6080                 case EM_SPARC32PLUS:
6081                 case EM_SPARCV9:
6082                 case EM_SPARC:
6083                   if (flag == SHF_ORDERED)
6084                     sindex = 19;
6085                   break;
6086
6087                 case EM_ARM:
6088                   switch (flag)
6089                     {
6090                     case SHF_ENTRYSECT: sindex = 21; break;
6091                     case SHF_ARM_PURECODE: sindex = 22; break;
6092                     case SHF_COMDEF: sindex = 23; break;
6093                     default: break;
6094                     }
6095                   break;
6096                 case EM_PPC:
6097                   if (flag == SHF_PPC_VLE)
6098                     sindex = 25;
6099                   break;
6100                 default:
6101                   break;
6102                 }
6103
6104               switch (filedata->file_header.e_ident[EI_OSABI])
6105                 {
6106                 case ELFOSABI_GNU:
6107                 case ELFOSABI_FREEBSD:
6108                   if (flag == SHF_GNU_RETAIN)
6109                     sindex = 26;
6110                   /* Fall through */
6111                 case ELFOSABI_NONE:
6112                   if (flag == SHF_GNU_MBIND)
6113                     /* We should not recognize SHF_GNU_MBIND for
6114                        ELFOSABI_NONE, but binutils as of 2019-07-23 did
6115                        not set the EI_OSABI header byte.  */
6116                     sindex = 24;
6117                   break;
6118                 default:
6119                   break;
6120                 }
6121               break;
6122             }
6123
6124           if (sindex != -1)
6125             {
6126               if (p != buff + field_size + 4)
6127                 {
6128                   if (size < (10 + 2))
6129                     {
6130                       warn (_("Internal error: not enough buffer room for section flag info"));
6131                       return _("<unknown>");
6132                     }
6133                   size -= 2;
6134                   *p++ = ',';
6135                   *p++ = ' ';
6136                 }
6137
6138               size -= flags [sindex].len;
6139               p = stpcpy (p, flags [sindex].str);
6140             }
6141           else if (flag & SHF_MASKOS)
6142             os_flags |= flag;
6143           else if (flag & SHF_MASKPROC)
6144             proc_flags |= flag;
6145           else
6146             unknown_flags |= flag;
6147         }
6148       else
6149         {
6150           switch (flag)
6151             {
6152             case SHF_WRITE:             *p = 'W'; break;
6153             case SHF_ALLOC:             *p = 'A'; break;
6154             case SHF_EXECINSTR:         *p = 'X'; break;
6155             case SHF_MERGE:             *p = 'M'; break;
6156             case SHF_STRINGS:           *p = 'S'; break;
6157             case SHF_INFO_LINK:         *p = 'I'; break;
6158             case SHF_LINK_ORDER:        *p = 'L'; break;
6159             case SHF_OS_NONCONFORMING:  *p = 'O'; break;
6160             case SHF_GROUP:             *p = 'G'; break;
6161             case SHF_TLS:               *p = 'T'; break;
6162             case SHF_EXCLUDE:           *p = 'E'; break;
6163             case SHF_COMPRESSED:        *p = 'C'; break;
6164
6165             default:
6166               if ((filedata->file_header.e_machine == EM_X86_64
6167                    || filedata->file_header.e_machine == EM_L1OM
6168                    || filedata->file_header.e_machine == EM_K1OM)
6169                   && flag == SHF_X86_64_LARGE)
6170                 *p = 'l';
6171               else if (filedata->file_header.e_machine == EM_ARM
6172                        && flag == SHF_ARM_PURECODE)
6173                 *p = 'y';
6174               else if (filedata->file_header.e_machine == EM_PPC
6175                        && flag == SHF_PPC_VLE)
6176                 *p = 'v';
6177               else if (flag & SHF_MASKOS)
6178                 {
6179                   switch (filedata->file_header.e_ident[EI_OSABI])
6180                     {
6181                     case ELFOSABI_GNU:
6182                     case ELFOSABI_FREEBSD:
6183                       if (flag == SHF_GNU_RETAIN)
6184                         {
6185                           *p = 'R';
6186                           break;
6187                         }
6188                       /* Fall through */
6189                     case ELFOSABI_NONE:
6190                       if (flag == SHF_GNU_MBIND)
6191                         {
6192                           /* We should not recognize SHF_GNU_MBIND for
6193                              ELFOSABI_NONE, but binutils as of 2019-07-23 did
6194                              not set the EI_OSABI header byte.  */
6195                           *p = 'D';
6196                           break;
6197                         }
6198                       /* Fall through */
6199                     default:
6200                       *p = 'o';
6201                       sh_flags &= ~SHF_MASKOS;
6202                       break;
6203                     }
6204                 }
6205               else if (flag & SHF_MASKPROC)
6206                 {
6207                   *p = 'p';
6208                   sh_flags &= ~ SHF_MASKPROC;
6209                 }
6210               else
6211                 *p = 'x';
6212               break;
6213             }
6214           p++;
6215         }
6216     }
6217
6218   if (do_section_details)
6219     {
6220       if (os_flags)
6221         {
6222           size -= 5 + field_size;
6223           if (p != buff + field_size + 4)
6224             {
6225               if (size < (2 + 1))
6226                 {
6227                   warn (_("Internal error: not enough buffer room for section flag info"));
6228                   return _("<unknown>");
6229                 }
6230               size -= 2;
6231               *p++ = ',';
6232               *p++ = ' ';
6233             }
6234           sprintf (p, "OS (%*.*lx)", field_size, field_size,
6235                    (unsigned long) os_flags);
6236           p += 5 + field_size;
6237         }
6238       if (proc_flags)
6239         {
6240           size -= 7 + field_size;
6241           if (p != buff + field_size + 4)
6242             {
6243               if (size < (2 + 1))
6244                 {
6245                   warn (_("Internal error: not enough buffer room for section flag info"));
6246                   return _("<unknown>");
6247                 }
6248               size -= 2;
6249               *p++ = ',';
6250               *p++ = ' ';
6251             }
6252           sprintf (p, "PROC (%*.*lx)", field_size, field_size,
6253                    (unsigned long) proc_flags);
6254           p += 7 + field_size;
6255         }
6256       if (unknown_flags)
6257         {
6258           size -= 10 + field_size;
6259           if (p != buff + field_size + 4)
6260             {
6261               if (size < (2 + 1))
6262                 {
6263                   warn (_("Internal error: not enough buffer room for section flag info"));
6264                   return _("<unknown>");
6265                 }
6266               size -= 2;
6267               *p++ = ',';
6268               *p++ = ' ';
6269             }
6270           sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
6271                    (unsigned long) unknown_flags);
6272           p += 10 + field_size;
6273         }
6274     }
6275
6276   *p = '\0';
6277   return buff;
6278 }
6279
6280 static unsigned int ATTRIBUTE_WARN_UNUSED_RESULT
6281 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf, bfd_size_type size)
6282 {
6283   if (is_32bit_elf)
6284     {
6285       Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
6286
6287       if (size < sizeof (* echdr))
6288         {
6289           error (_("Compressed section is too small even for a compression header\n"));
6290           return 0;
6291         }
6292
6293       chdr->ch_type = BYTE_GET (echdr->ch_type);
6294       chdr->ch_size = BYTE_GET (echdr->ch_size);
6295       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
6296       return sizeof (*echdr);
6297     }
6298   else
6299     {
6300       Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
6301
6302       if (size < sizeof (* echdr))
6303         {
6304           error (_("Compressed section is too small even for a compression header\n"));
6305           return 0;
6306         }
6307
6308       chdr->ch_type = BYTE_GET (echdr->ch_type);
6309       chdr->ch_size = BYTE_GET (echdr->ch_size);
6310       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
6311       return sizeof (*echdr);
6312     }
6313 }
6314
6315 static bfd_boolean
6316 process_section_headers (Filedata * filedata)
6317 {
6318   Elf_Internal_Shdr * section;
6319   unsigned int i;
6320
6321   free (filedata->section_headers);
6322   filedata->section_headers = NULL;
6323   free (filedata->dynamic_symbols);
6324   filedata->dynamic_symbols = NULL;
6325   filedata->num_dynamic_syms = 0;
6326   free (filedata->dynamic_strings);
6327   filedata->dynamic_strings = NULL;
6328   filedata->dynamic_strings_length = 0;
6329   free (filedata->dynamic_syminfo);
6330   filedata->dynamic_syminfo = NULL;
6331   while (filedata->symtab_shndx_list != NULL)
6332     {
6333       elf_section_list *next = filedata->symtab_shndx_list->next;
6334       free (filedata->symtab_shndx_list);
6335       filedata->symtab_shndx_list = next;
6336     }
6337
6338   if (filedata->file_header.e_shnum == 0)
6339     {
6340       /* PR binutils/12467.  */
6341       if (filedata->file_header.e_shoff != 0)
6342         {
6343           warn (_("possibly corrupt ELF file header - it has a non-zero"
6344                   " section header offset, but no section headers\n"));
6345           return FALSE;
6346         }
6347       else if (do_sections)
6348         printf (_("\nThere are no sections in this file.\n"));
6349
6350       return TRUE;
6351     }
6352
6353   if (do_sections && !do_header)
6354     printf (ngettext ("There is %d section header, "
6355                       "starting at offset 0x%lx:\n",
6356                       "There are %d section headers, "
6357                       "starting at offset 0x%lx:\n",
6358                       filedata->file_header.e_shnum),
6359             filedata->file_header.e_shnum,
6360             (unsigned long) filedata->file_header.e_shoff);
6361
6362   if (is_32bit_elf)
6363     {
6364       if (! get_32bit_section_headers (filedata, FALSE))
6365         return FALSE;
6366     }
6367   else
6368     {
6369       if (! get_64bit_section_headers (filedata, FALSE))
6370         return FALSE;
6371     }
6372
6373   /* Read in the string table, so that we have names to display.  */
6374   if (filedata->file_header.e_shstrndx != SHN_UNDEF
6375        && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
6376     {
6377       section = filedata->section_headers + filedata->file_header.e_shstrndx;
6378
6379       if (section->sh_size != 0)
6380         {
6381           filedata->string_table = (char *) get_data (NULL, filedata, section->sh_offset,
6382                                                       1, section->sh_size,
6383                                                       _("string table"));
6384
6385           filedata->string_table_length = filedata->string_table != NULL ? section->sh_size : 0;
6386         }
6387     }
6388
6389   /* Scan the sections for the dynamic symbol table
6390      and dynamic string table and debug sections.  */
6391   eh_addr_size = is_32bit_elf ? 4 : 8;
6392   switch (filedata->file_header.e_machine)
6393     {
6394     case EM_MIPS:
6395     case EM_MIPS_RS3_LE:
6396       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
6397          FDE addresses.  However, the ABI also has a semi-official ILP32
6398          variant for which the normal FDE address size rules apply.
6399
6400          GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
6401          section, where XX is the size of longs in bits.  Unfortunately,
6402          earlier compilers provided no way of distinguishing ILP32 objects
6403          from LP64 objects, so if there's any doubt, we should assume that
6404          the official LP64 form is being used.  */
6405       if ((filedata->file_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
6406           && find_section (filedata, ".gcc_compiled_long32") == NULL)
6407         eh_addr_size = 8;
6408       break;
6409
6410     case EM_H8_300:
6411     case EM_H8_300H:
6412       switch (filedata->file_header.e_flags & EF_H8_MACH)
6413         {
6414         case E_H8_MACH_H8300:
6415         case E_H8_MACH_H8300HN:
6416         case E_H8_MACH_H8300SN:
6417         case E_H8_MACH_H8300SXN:
6418           eh_addr_size = 2;
6419           break;
6420         case E_H8_MACH_H8300H:
6421         case E_H8_MACH_H8300S:
6422         case E_H8_MACH_H8300SX:
6423           eh_addr_size = 4;
6424           break;
6425         }
6426       break;
6427
6428     case EM_M32C_OLD:
6429     case EM_M32C:
6430       switch (filedata->file_header.e_flags & EF_M32C_CPU_MASK)
6431         {
6432         case EF_M32C_CPU_M16C:
6433           eh_addr_size = 2;
6434           break;
6435         }
6436       break;
6437     }
6438
6439 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64)                \
6440   do                                                                    \
6441     {                                                                   \
6442       bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64;  \
6443       if (section->sh_entsize != expected_entsize)                      \
6444         {                                                               \
6445           char buf[40];                                                 \
6446           sprintf_vma (buf, section->sh_entsize);                       \
6447           /* Note: coded this way so that there is a single string for  \
6448              translation.  */ \
6449           error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
6450           error (_("(Using the expected size of %u for the rest of this dump)\n"), \
6451                    (unsigned) expected_entsize);                        \
6452           section->sh_entsize = expected_entsize;                       \
6453         }                                                               \
6454     }                                                                   \
6455   while (0)
6456
6457 #define CHECK_ENTSIZE(section, i, type)                                 \
6458   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),     \
6459                         sizeof (Elf64_External_##type))
6460
6461   for (i = 0, section = filedata->section_headers;
6462        i < filedata->file_header.e_shnum;
6463        i++, section++)
6464     {
6465       char * name = SECTION_NAME_PRINT (section);
6466
6467       /* Run some sanity checks on the headers and
6468          possibly fill in some file data as well.  */
6469       switch (section->sh_type)
6470         {
6471         case SHT_DYNSYM:
6472           if (filedata->dynamic_symbols != NULL)
6473             {
6474               error (_("File contains multiple dynamic symbol tables\n"));
6475               continue;
6476             }
6477
6478           CHECK_ENTSIZE (section, i, Sym);
6479           filedata->dynamic_symbols
6480             = GET_ELF_SYMBOLS (filedata, section, &filedata->num_dynamic_syms);
6481           filedata->dynamic_symtab_section = section;
6482           break;
6483
6484         case SHT_STRTAB:
6485           if (streq (name, ".dynstr"))
6486             {
6487               if (filedata->dynamic_strings != NULL)
6488                 {
6489                   error (_("File contains multiple dynamic string tables\n"));
6490                   continue;
6491                 }
6492
6493               filedata->dynamic_strings
6494                 = (char *) get_data (NULL, filedata, section->sh_offset,
6495                                      1, section->sh_size, _("dynamic strings"));
6496               filedata->dynamic_strings_length
6497                 = filedata->dynamic_strings == NULL ? 0 : section->sh_size;
6498               filedata->dynamic_strtab_section = section;
6499             }
6500           break;
6501
6502         case SHT_SYMTAB_SHNDX:
6503           {
6504             elf_section_list * entry = xmalloc (sizeof * entry);
6505
6506             entry->hdr = section;
6507             entry->next = filedata->symtab_shndx_list;
6508             filedata->symtab_shndx_list = entry;
6509           }
6510           break;
6511
6512         case SHT_SYMTAB:
6513           CHECK_ENTSIZE (section, i, Sym);
6514           break;
6515
6516         case SHT_GROUP:
6517           CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
6518           break;
6519
6520         case SHT_REL:
6521           CHECK_ENTSIZE (section, i, Rel);
6522           if (do_checks && section->sh_size == 0)
6523             warn (_("Section '%s': zero-sized relocation section\n"), name);
6524           break;
6525
6526         case SHT_RELA:
6527           CHECK_ENTSIZE (section, i, Rela);
6528           if (do_checks && section->sh_size == 0)
6529             warn (_("Section '%s': zero-sized relocation section\n"), name);
6530           break;
6531
6532         case SHT_NOTE:
6533         case SHT_PROGBITS:
6534           /* Having a zero sized section is not illegal according to the
6535              ELF standard, but it might be an indication that something
6536              is wrong.  So issue a warning if we are running in lint mode.  */
6537           if (do_checks && section->sh_size == 0)
6538             warn (_("Section '%s': has a size of zero - is this intended ?\n"), name);
6539           break;
6540
6541         default:
6542           break;
6543         }
6544
6545       if ((do_debugging || do_debug_info || do_debug_abbrevs
6546            || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
6547            || do_debug_aranges || do_debug_frames || do_debug_macinfo
6548            || do_debug_str || do_debug_str_offsets || do_debug_loc || do_debug_ranges
6549            || do_debug_addr || do_debug_cu_index || do_debug_links)
6550           && (const_strneq (name, ".debug_")
6551               || const_strneq (name, ".zdebug_")))
6552         {
6553           if (name[1] == 'z')
6554             name += sizeof (".zdebug_") - 1;
6555           else
6556             name += sizeof (".debug_") - 1;
6557
6558           if (do_debugging
6559               || (do_debug_info     && const_strneq (name, "info"))
6560               || (do_debug_info     && const_strneq (name, "types"))
6561               || (do_debug_abbrevs  && const_strneq (name, "abbrev"))
6562               || (do_debug_lines    && strcmp (name, "line") == 0)
6563               || (do_debug_lines    && const_strneq (name, "line."))
6564               || (do_debug_pubnames && const_strneq (name, "pubnames"))
6565               || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
6566               || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
6567               || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
6568               || (do_debug_aranges  && const_strneq (name, "aranges"))
6569               || (do_debug_ranges   && const_strneq (name, "ranges"))
6570               || (do_debug_ranges   && const_strneq (name, "rnglists"))
6571               || (do_debug_frames   && const_strneq (name, "frame"))
6572               || (do_debug_macinfo  && const_strneq (name, "macinfo"))
6573               || (do_debug_macinfo  && const_strneq (name, "macro"))
6574               || (do_debug_str      && const_strneq (name, "str"))
6575               || (do_debug_str_offsets && const_strneq (name, "str_offsets"))
6576               || (do_debug_loc      && const_strneq (name, "loc"))
6577               || (do_debug_loc      && const_strneq (name, "loclists"))
6578               || (do_debug_addr     && const_strneq (name, "addr"))
6579               || (do_debug_cu_index && const_strneq (name, "cu_index"))
6580               || (do_debug_cu_index && const_strneq (name, "tu_index"))
6581               )
6582             request_dump_bynumber (&filedata->dump, i, DEBUG_DUMP);
6583         }
6584       /* Linkonce section to be combined with .debug_info at link time.  */
6585       else if ((do_debugging || do_debug_info)
6586                && const_strneq (name, ".gnu.linkonce.wi."))
6587         request_dump_bynumber (&filedata->dump, i, DEBUG_DUMP);
6588       else if (do_debug_frames && streq (name, ".eh_frame"))
6589         request_dump_bynumber (&filedata->dump, i, DEBUG_DUMP);
6590       else if (do_gdb_index && (streq (name, ".gdb_index")
6591                                 || streq (name, ".debug_names")))
6592         request_dump_bynumber (&filedata->dump, i, DEBUG_DUMP);
6593       /* Trace sections for Itanium VMS.  */
6594       else if ((do_debugging || do_trace_info || do_trace_abbrevs
6595                 || do_trace_aranges)
6596                && const_strneq (name, ".trace_"))
6597         {
6598           name += sizeof (".trace_") - 1;
6599
6600           if (do_debugging
6601               || (do_trace_info     && streq (name, "info"))
6602               || (do_trace_abbrevs  && streq (name, "abbrev"))
6603               || (do_trace_aranges  && streq (name, "aranges"))
6604               )
6605             request_dump_bynumber (&filedata->dump, i, DEBUG_DUMP);
6606         }
6607       else if ((do_debugging || do_debug_links)
6608                && (const_strneq (name, ".gnu_debuglink")
6609                    || const_strneq (name, ".gnu_debugaltlink")))
6610         request_dump_bynumber (&filedata->dump, i, DEBUG_DUMP);
6611     }
6612
6613   if (! do_sections)
6614     return TRUE;
6615
6616   if (filedata->file_header.e_shnum > 1)
6617     printf (_("\nSection Headers:\n"));
6618   else
6619     printf (_("\nSection Header:\n"));
6620
6621   if (is_32bit_elf)
6622     {
6623       if (do_section_details)
6624         {
6625           printf (_("  [Nr] Name\n"));
6626           printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
6627         }
6628       else
6629         printf
6630           (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
6631     }
6632   else if (do_wide)
6633     {
6634       if (do_section_details)
6635         {
6636           printf (_("  [Nr] Name\n"));
6637           printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
6638         }
6639       else
6640         printf
6641           (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
6642     }
6643   else
6644     {
6645       if (do_section_details)
6646         {
6647           printf (_("  [Nr] Name\n"));
6648           printf (_("       Type              Address          Offset            Link\n"));
6649           printf (_("       Size              EntSize          Info              Align\n"));
6650         }
6651       else
6652         {
6653           printf (_("  [Nr] Name              Type             Address           Offset\n"));
6654           printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
6655         }
6656     }
6657
6658   if (do_section_details)
6659     printf (_("       Flags\n"));
6660
6661   for (i = 0, section = filedata->section_headers;
6662        i < filedata->file_header.e_shnum;
6663        i++, section++)
6664     {
6665       /* Run some sanity checks on the section header.  */
6666
6667       /* Check the sh_link field.  */
6668       switch (section->sh_type)
6669         {
6670         case SHT_REL:
6671         case SHT_RELA:
6672           if (section->sh_link == 0
6673               && (filedata->file_header.e_type == ET_EXEC
6674                   || filedata->file_header.e_type == ET_DYN))
6675             /* A dynamic relocation section where all entries use a
6676                zero symbol index need not specify a symtab section.  */
6677             break;
6678           /* Fall through.  */
6679         case SHT_SYMTAB_SHNDX:
6680         case SHT_GROUP:
6681         case SHT_HASH:
6682         case SHT_GNU_HASH:
6683         case SHT_GNU_versym:
6684           if (section->sh_link == 0
6685               || section->sh_link >= filedata->file_header.e_shnum
6686               || (filedata->section_headers[section->sh_link].sh_type != SHT_SYMTAB
6687                   && filedata->section_headers[section->sh_link].sh_type != SHT_DYNSYM))
6688             warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6689                   i, section->sh_link);
6690           break;
6691
6692         case SHT_DYNAMIC:
6693         case SHT_SYMTAB:
6694         case SHT_DYNSYM:
6695         case SHT_GNU_verneed:
6696         case SHT_GNU_verdef:
6697         case SHT_GNU_LIBLIST:
6698           if (section->sh_link == 0
6699               || section->sh_link >= filedata->file_header.e_shnum
6700               || filedata->section_headers[section->sh_link].sh_type != SHT_STRTAB)
6701             warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6702                   i, section->sh_link);
6703           break;
6704
6705         case SHT_INIT_ARRAY:
6706         case SHT_FINI_ARRAY:
6707         case SHT_PREINIT_ARRAY:
6708           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6709             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6710                   i, section->sh_link);
6711           break;
6712
6713         default:
6714           /* FIXME: Add support for target specific section types.  */
6715 #if 0     /* Currently we do not check other section types as there are too
6716              many special cases.  Stab sections for example have a type
6717              of SHT_PROGBITS but an sh_link field that links to the .stabstr
6718              section.  */
6719           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6720             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6721                   i, section->sh_link);
6722 #endif
6723           break;
6724         }
6725
6726       /* Check the sh_info field.  */
6727       switch (section->sh_type)
6728         {
6729         case SHT_REL:
6730         case SHT_RELA:
6731           if (section->sh_info == 0
6732               && (filedata->file_header.e_type == ET_EXEC
6733                   || filedata->file_header.e_type == ET_DYN))
6734             /* Dynamic relocations apply to segments, so they do not
6735                need to specify the section they relocate.  */
6736             break;
6737           if (section->sh_info == 0
6738               || section->sh_info >= filedata->file_header.e_shnum
6739               || (filedata->section_headers[section->sh_info].sh_type != SHT_PROGBITS
6740                   && filedata->section_headers[section->sh_info].sh_type != SHT_NOBITS
6741                   && filedata->section_headers[section->sh_info].sh_type != SHT_NOTE
6742                   && filedata->section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
6743                   && filedata->section_headers[section->sh_info].sh_type != SHT_FINI_ARRAY
6744                   && filedata->section_headers[section->sh_info].sh_type != SHT_PREINIT_ARRAY
6745                   /* FIXME: Are other section types valid ?  */
6746                   && filedata->section_headers[section->sh_info].sh_type < SHT_LOOS))
6747             warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6748                   i, section->sh_info);
6749           break;
6750
6751         case SHT_DYNAMIC:
6752         case SHT_HASH:
6753         case SHT_SYMTAB_SHNDX:
6754         case SHT_INIT_ARRAY:
6755         case SHT_FINI_ARRAY:
6756         case SHT_PREINIT_ARRAY:
6757           if (section->sh_info != 0)
6758             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6759                   i, section->sh_info);
6760           break;
6761
6762         case SHT_GROUP:
6763         case SHT_SYMTAB:
6764         case SHT_DYNSYM:
6765           /* A symbol index - we assume that it is valid.  */
6766           break;
6767
6768         default:
6769           /* FIXME: Add support for target specific section types.  */
6770           if (section->sh_type == SHT_NOBITS)
6771             /* NOBITS section headers with non-zero sh_info fields can be
6772                created when a binary is stripped of everything but its debug
6773                information.  The stripped sections have their headers
6774                preserved but their types set to SHT_NOBITS.  So do not check
6775                this type of section.  */
6776             ;
6777           else if (section->sh_flags & SHF_INFO_LINK)
6778             {
6779               if (section->sh_info < 1 || section->sh_info >= filedata->file_header.e_shnum)
6780                 warn (_("[%2u]: Expected link to another section in info field"), i);
6781             }
6782           else if (section->sh_type < SHT_LOOS
6783                    && (section->sh_flags & SHF_GNU_MBIND) == 0
6784                    && section->sh_info != 0)
6785             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6786                   i, section->sh_info);
6787           break;
6788         }
6789
6790       /* Check the sh_size field.  */
6791       if (section->sh_size > filedata->file_size
6792           && section->sh_type != SHT_NOBITS
6793           && section->sh_type != SHT_NULL
6794           && section->sh_type < SHT_LOOS)
6795         warn (_("Size of section %u is larger than the entire file!\n"), i);
6796
6797       printf ("  [%2u] ", i);
6798       if (do_section_details)
6799         printf ("%s\n      ", printable_section_name (filedata, section));
6800       else
6801         print_symbol (-17, SECTION_NAME_PRINT (section));
6802
6803       printf (do_wide ? " %-15s " : " %-15.15s ",
6804               get_section_type_name (filedata, section->sh_type));
6805
6806       if (is_32bit_elf)
6807         {
6808           const char * link_too_big = NULL;
6809
6810           print_vma (section->sh_addr, LONG_HEX);
6811
6812           printf ( " %6.6lx %6.6lx %2.2lx",
6813                    (unsigned long) section->sh_offset,
6814                    (unsigned long) section->sh_size,
6815                    (unsigned long) section->sh_entsize);
6816
6817           if (do_section_details)
6818             fputs ("  ", stdout);
6819           else
6820             printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6821
6822           if (section->sh_link >= filedata->file_header.e_shnum)
6823             {
6824               link_too_big = "";
6825               /* The sh_link value is out of range.  Normally this indicates
6826                  an error but it can have special values in Solaris binaries.  */
6827               switch (filedata->file_header.e_machine)
6828                 {
6829                 case EM_386:
6830                 case EM_IAMCU:
6831                 case EM_X86_64:
6832                 case EM_L1OM:
6833                 case EM_K1OM:
6834                 case EM_OLD_SPARCV9:
6835                 case EM_SPARC32PLUS:
6836                 case EM_SPARCV9:
6837                 case EM_SPARC:
6838                   if (section->sh_link == (SHN_BEFORE & 0xffff))
6839                     link_too_big = "BEFORE";
6840                   else if (section->sh_link == (SHN_AFTER & 0xffff))
6841                     link_too_big = "AFTER";
6842                   break;
6843                 default:
6844                   break;
6845                 }
6846             }
6847
6848           if (do_section_details)
6849             {
6850               if (link_too_big != NULL && * link_too_big)
6851                 printf ("<%s> ", link_too_big);
6852               else
6853                 printf ("%2u ", section->sh_link);
6854               printf ("%3u %2lu\n", section->sh_info,
6855                       (unsigned long) section->sh_addralign);
6856             }
6857           else
6858             printf ("%2u %3u %2lu\n",
6859                     section->sh_link,
6860                     section->sh_info,
6861                     (unsigned long) section->sh_addralign);
6862
6863           if (link_too_big && ! * link_too_big)
6864             warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6865                   i, section->sh_link);
6866         }
6867       else if (do_wide)
6868         {
6869           print_vma (section->sh_addr, LONG_HEX);
6870
6871           if ((long) section->sh_offset == section->sh_offset)
6872             printf (" %6.6lx", (unsigned long) section->sh_offset);
6873           else
6874             {
6875               putchar (' ');
6876               print_vma (section->sh_offset, LONG_HEX);
6877             }
6878
6879           if ((unsigned long) section->sh_size == section->sh_size)
6880             printf (" %6.6lx", (unsigned long) section->sh_size);
6881           else
6882             {
6883               putchar (' ');
6884               print_vma (section->sh_size, LONG_HEX);
6885             }
6886
6887           if ((unsigned long) section->sh_entsize == section->sh_entsize)
6888             printf (" %2.2lx", (unsigned long) section->sh_entsize);
6889           else
6890             {
6891               putchar (' ');
6892               print_vma (section->sh_entsize, LONG_HEX);
6893             }
6894
6895           if (do_section_details)
6896             fputs ("  ", stdout);
6897           else
6898             printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6899
6900           printf ("%2u %3u ", section->sh_link, section->sh_info);
6901
6902           if ((unsigned long) section->sh_addralign == section->sh_addralign)
6903             printf ("%2lu\n", (unsigned long) section->sh_addralign);
6904           else
6905             {
6906               print_vma (section->sh_addralign, DEC);
6907               putchar ('\n');
6908             }
6909         }
6910       else if (do_section_details)
6911         {
6912           putchar (' ');
6913           print_vma (section->sh_addr, LONG_HEX);
6914           if ((long) section->sh_offset == section->sh_offset)
6915             printf ("  %16.16lx", (unsigned long) section->sh_offset);
6916           else
6917             {
6918               printf ("  ");
6919               print_vma (section->sh_offset, LONG_HEX);
6920             }
6921           printf ("  %u\n       ", section->sh_link);
6922           print_vma (section->sh_size, LONG_HEX);
6923           putchar (' ');
6924           print_vma (section->sh_entsize, LONG_HEX);
6925
6926           printf ("  %-16u  %lu\n",
6927                   section->sh_info,
6928                   (unsigned long) section->sh_addralign);
6929         }
6930       else
6931         {
6932           putchar (' ');
6933           print_vma (section->sh_addr, LONG_HEX);
6934           if ((long) section->sh_offset == section->sh_offset)
6935             printf ("  %8.8lx", (unsigned long) section->sh_offset);
6936           else
6937             {
6938               printf ("  ");
6939               print_vma (section->sh_offset, LONG_HEX);
6940             }
6941           printf ("\n       ");
6942           print_vma (section->sh_size, LONG_HEX);
6943           printf ("  ");
6944           print_vma (section->sh_entsize, LONG_HEX);
6945
6946           printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6947
6948           printf ("     %2u   %3u     %lu\n",
6949                   section->sh_link,
6950                   section->sh_info,
6951                   (unsigned long) section->sh_addralign);
6952         }
6953
6954       if (do_section_details)
6955         {
6956           printf ("       %s\n", get_elf_section_flags (filedata, section->sh_flags));
6957           if ((section->sh_flags & SHF_COMPRESSED) != 0)
6958             {
6959               /* Minimum section size is 12 bytes for 32-bit compression
6960                  header + 12 bytes for compressed data header.  */
6961               unsigned char buf[24];
6962
6963               assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6964               if (get_data (&buf, filedata, section->sh_offset, 1,
6965                             sizeof (buf), _("compression header")))
6966                 {
6967                   Elf_Internal_Chdr chdr;
6968
6969                   if (get_compression_header (&chdr, buf, sizeof (buf)) == 0)
6970                     printf (_("       [<corrupt>]\n"));
6971                   else
6972                     {
6973                       if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6974                         printf ("       ZLIB, ");
6975                       else
6976                         printf (_("       [<unknown>: 0x%x], "),
6977                                 chdr.ch_type);
6978                       print_vma (chdr.ch_size, LONG_HEX);
6979                       printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6980                     }
6981                 }
6982             }
6983         }
6984     }
6985
6986   if (!do_section_details)
6987     {
6988       /* The ordering of the letters shown here matches the ordering of the
6989          corresponding SHF_xxx values, and hence the order in which these
6990          letters will be displayed to the user.  */
6991       printf (_("Key to Flags:\n\
6992   W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6993   L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6994   C (compressed), x (unknown), o (OS specific), E (exclude),\n  "));
6995       if (filedata->file_header.e_machine == EM_X86_64
6996           || filedata->file_header.e_machine == EM_L1OM
6997           || filedata->file_header.e_machine == EM_K1OM)
6998         printf (_("l (large), "));
6999       else if (filedata->file_header.e_machine == EM_ARM)
7000         printf (_("y (purecode), "));
7001       else if (filedata->file_header.e_machine == EM_PPC)
7002         printf (_("v (VLE), "));
7003       printf ("p (processor specific)\n");
7004     }
7005
7006   return TRUE;
7007 }
7008
7009 static bfd_boolean
7010 get_symtab (Filedata *filedata, Elf_Internal_Shdr *symsec,
7011             Elf_Internal_Sym **symtab, unsigned long *nsyms,
7012             char **strtab, unsigned long *strtablen)
7013 {
7014   *strtab = NULL;
7015   *strtablen = 0;
7016   *symtab = GET_ELF_SYMBOLS (filedata, symsec, nsyms);
7017
7018   if (*symtab == NULL)
7019     return FALSE;
7020
7021   if (symsec->sh_link != 0)
7022     {
7023       Elf_Internal_Shdr *strsec;
7024
7025       if (symsec->sh_link >= filedata->file_header.e_shnum)
7026         {
7027           error (_("Bad sh_link in symbol table section\n"));
7028           free (*symtab);
7029           *symtab = NULL;
7030           *nsyms = 0;
7031           return FALSE;
7032         }
7033
7034       strsec = filedata->section_headers + symsec->sh_link;
7035
7036       *strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7037                                    1, strsec->sh_size, _("string table"));
7038       if (*strtab == NULL)
7039         {
7040           free (*symtab);
7041           *symtab = NULL;
7042           *nsyms = 0;
7043           return FALSE;
7044         }
7045       *strtablen = strsec->sh_size;
7046     }
7047   return TRUE;
7048 }
7049
7050 static const char *
7051 get_group_flags (unsigned int flags)
7052 {
7053   static char buff[128];
7054
7055   if (flags == 0)
7056     return "";
7057   else if (flags == GRP_COMDAT)
7058     return "COMDAT ";
7059
7060   snprintf (buff, sizeof buff, "[0x%x: %s%s%s]",
7061             flags,
7062             flags & GRP_MASKOS ? _("<OS specific>") : "",
7063             flags & GRP_MASKPROC ? _("<PROC specific>") : "",
7064             (flags & ~(GRP_COMDAT | GRP_MASKOS | GRP_MASKPROC)
7065              ? _("<unknown>") : ""));
7066
7067   return buff;
7068 }
7069
7070 static bfd_boolean
7071 process_section_groups (Filedata * filedata)
7072 {
7073   Elf_Internal_Shdr * section;
7074   unsigned int i;
7075   struct group * group;
7076   Elf_Internal_Shdr * symtab_sec;
7077   Elf_Internal_Shdr * strtab_sec;
7078   Elf_Internal_Sym * symtab;
7079   unsigned long num_syms;
7080   char * strtab;
7081   size_t strtab_size;
7082
7083   /* Don't process section groups unless needed.  */
7084   if (!do_unwind && !do_section_groups)
7085     return TRUE;
7086
7087   if (filedata->file_header.e_shnum == 0)
7088     {
7089       if (do_section_groups)
7090         printf (_("\nThere are no sections to group in this file.\n"));
7091
7092       return TRUE;
7093     }
7094
7095   if (filedata->section_headers == NULL)
7096     {
7097       error (_("Section headers are not available!\n"));
7098       /* PR 13622: This can happen with a corrupt ELF header.  */
7099       return FALSE;
7100     }
7101
7102   filedata->section_headers_groups
7103     = (struct group **) calloc (filedata->file_header.e_shnum,
7104                                 sizeof (struct group *));
7105
7106   if (filedata->section_headers_groups == NULL)
7107     {
7108       error (_("Out of memory reading %u section group headers\n"),
7109              filedata->file_header.e_shnum);
7110       return FALSE;
7111     }
7112
7113   /* Scan the sections for the group section.  */
7114   filedata->group_count = 0;
7115   for (i = 0, section = filedata->section_headers;
7116        i < filedata->file_header.e_shnum;
7117        i++, section++)
7118     if (section->sh_type == SHT_GROUP)
7119       filedata->group_count++;
7120
7121   if (filedata->group_count == 0)
7122     {
7123       if (do_section_groups)
7124         printf (_("\nThere are no section groups in this file.\n"));
7125
7126       return TRUE;
7127     }
7128
7129   filedata->section_groups = (struct group *) calloc (filedata->group_count,
7130                                                       sizeof (struct group));
7131
7132   if (filedata->section_groups == NULL)
7133     {
7134       error (_("Out of memory reading %lu groups\n"),
7135              (unsigned long) filedata->group_count);
7136       return FALSE;
7137     }
7138
7139   symtab_sec = NULL;
7140   strtab_sec = NULL;
7141   symtab = NULL;
7142   num_syms = 0;
7143   strtab = NULL;
7144   strtab_size = 0;
7145   for (i = 0, section = filedata->section_headers, group = filedata->section_groups;
7146        i < filedata->file_header.e_shnum;
7147        i++, section++)
7148     {
7149       if (section->sh_type == SHT_GROUP)
7150         {
7151           const char * name = printable_section_name (filedata, section);
7152           const char * group_name;
7153           unsigned char * start;
7154           unsigned char * indices;
7155           unsigned int entry, j, size;
7156           Elf_Internal_Shdr * sec;
7157           Elf_Internal_Sym * sym;
7158
7159           /* Get the symbol table.  */
7160           if (section->sh_link >= filedata->file_header.e_shnum
7161               || ((sec = filedata->section_headers + section->sh_link)->sh_type
7162                   != SHT_SYMTAB))
7163             {
7164               error (_("Bad sh_link in group section `%s'\n"), name);
7165               continue;
7166             }
7167
7168           if (symtab_sec != sec)
7169             {
7170               symtab_sec = sec;
7171               free (symtab);
7172               symtab = GET_ELF_SYMBOLS (filedata, symtab_sec, & num_syms);
7173             }
7174
7175           if (symtab == NULL)
7176             {
7177               error (_("Corrupt header in group section `%s'\n"), name);
7178               continue;
7179             }
7180
7181           if (section->sh_info >= num_syms)
7182             {
7183               error (_("Bad sh_info in group section `%s'\n"), name);
7184               continue;
7185             }
7186
7187           sym = symtab + section->sh_info;
7188
7189           if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
7190             {
7191               if (sym->st_shndx == 0
7192                   || sym->st_shndx >= filedata->file_header.e_shnum)
7193                 {
7194                   error (_("Bad sh_info in group section `%s'\n"), name);
7195                   continue;
7196                 }
7197
7198               group_name = SECTION_NAME_PRINT (filedata->section_headers
7199                                                + sym->st_shndx);
7200               strtab_sec = NULL;
7201               free (strtab);
7202               strtab = NULL;
7203               strtab_size = 0;
7204             }
7205           else
7206             {
7207               /* Get the string table.  */
7208               if (symtab_sec->sh_link >= filedata->file_header.e_shnum)
7209                 {
7210                   strtab_sec = NULL;
7211                   free (strtab);
7212                   strtab = NULL;
7213                   strtab_size = 0;
7214                 }
7215               else if (strtab_sec
7216                        != (sec = filedata->section_headers + symtab_sec->sh_link))
7217                 {
7218                   strtab_sec = sec;
7219                   free (strtab);
7220
7221                   strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
7222                                               1, strtab_sec->sh_size,
7223                                               _("string table"));
7224                   strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
7225                 }
7226               group_name = sym->st_name < strtab_size
7227                 ? strtab + sym->st_name : _("<corrupt>");
7228             }
7229
7230           /* PR 17531: file: loop.  */
7231           if (section->sh_entsize > section->sh_size)
7232             {
7233               error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
7234                      printable_section_name (filedata, section),
7235                      (unsigned long) section->sh_entsize,
7236                      (unsigned long) section->sh_size);
7237               continue;
7238             }
7239
7240           start = (unsigned char *) get_data (NULL, filedata, section->sh_offset,
7241                                               1, section->sh_size,
7242                                               _("section data"));
7243           if (start == NULL)
7244             continue;
7245
7246           indices = start;
7247           size = (section->sh_size / section->sh_entsize) - 1;
7248           entry = byte_get (indices, 4);
7249           indices += 4;
7250
7251           if (do_section_groups)
7252             {
7253               printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
7254                       get_group_flags (entry), i, name, group_name, size);
7255
7256               printf (_("   [Index]    Name\n"));
7257             }
7258
7259           group->group_index = i;
7260
7261           for (j = 0; j < size; j++)
7262             {
7263               struct group_list * g;
7264
7265               entry = byte_get (indices, 4);
7266               indices += 4;
7267
7268               if (entry >= filedata->file_header.e_shnum)
7269                 {
7270                   static unsigned num_group_errors = 0;
7271
7272                   if (num_group_errors ++ < 10)
7273                     {
7274                       error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
7275                              entry, i, filedata->file_header.e_shnum - 1);
7276                       if (num_group_errors == 10)
7277                         warn (_("Further error messages about overlarge group section indices suppressed\n"));
7278                     }
7279                   continue;
7280                 }
7281
7282               if (filedata->section_headers_groups [entry] != NULL)
7283                 {
7284                   if (entry)
7285                     {
7286                       static unsigned num_errs = 0;
7287
7288                       if (num_errs ++ < 10)
7289                         {
7290                           error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
7291                                  entry, i,
7292                                  filedata->section_headers_groups [entry]->group_index);
7293                           if (num_errs == 10)
7294                             warn (_("Further error messages about already contained group sections suppressed\n"));
7295                         }
7296                       continue;
7297                     }
7298                   else
7299                     {
7300                       /* Intel C/C++ compiler may put section 0 in a
7301                          section group.  We just warn it the first time
7302                          and ignore it afterwards.  */
7303                       static bfd_boolean warned = FALSE;
7304                       if (!warned)
7305                         {
7306                           error (_("section 0 in group section [%5u]\n"),
7307                                  filedata->section_headers_groups [entry]->group_index);
7308                           warned = TRUE;
7309                         }
7310                     }
7311                 }
7312
7313               filedata->section_headers_groups [entry] = group;
7314
7315               if (do_section_groups)
7316                 {
7317                   sec = filedata->section_headers + entry;
7318                   printf ("   [%5u]   %s\n", entry, printable_section_name (filedata, sec));
7319                 }
7320
7321               g = (struct group_list *) xmalloc (sizeof (struct group_list));
7322               g->section_index = entry;
7323               g->next = group->root;
7324               group->root = g;
7325             }
7326
7327           free (start);
7328
7329           group++;
7330         }
7331     }
7332
7333   free (symtab);
7334   free (strtab);
7335   return TRUE;
7336 }
7337
7338 /* Data used to display dynamic fixups.  */
7339
7340 struct ia64_vms_dynfixup
7341 {
7342   bfd_vma needed_ident;         /* Library ident number.  */
7343   bfd_vma needed;               /* Index in the dstrtab of the library name.  */
7344   bfd_vma fixup_needed;         /* Index of the library.  */
7345   bfd_vma fixup_rela_cnt;       /* Number of fixups.  */
7346   bfd_vma fixup_rela_off;       /* Fixups offset in the dynamic segment.  */
7347 };
7348
7349 /* Data used to display dynamic relocations.  */
7350
7351 struct ia64_vms_dynimgrela
7352 {
7353   bfd_vma img_rela_cnt;         /* Number of relocations.  */
7354   bfd_vma img_rela_off;         /* Reloc offset in the dynamic segment.  */
7355 };
7356
7357 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
7358    library).  */
7359
7360 static bfd_boolean
7361 dump_ia64_vms_dynamic_fixups (Filedata *                  filedata,
7362                               struct ia64_vms_dynfixup *  fixup,
7363                               const char *                strtab,
7364                               unsigned int                strtab_sz)
7365 {
7366   Elf64_External_VMS_IMAGE_FIXUP * imfs;
7367   long i;
7368   const char * lib_name;
7369
7370   imfs = get_data (NULL, filedata,
7371                    filedata->dynamic_addr + fixup->fixup_rela_off,
7372                    sizeof (*imfs), fixup->fixup_rela_cnt,
7373                    _("dynamic section image fixups"));
7374   if (!imfs)
7375     return FALSE;
7376
7377   if (fixup->needed < strtab_sz)
7378     lib_name = strtab + fixup->needed;
7379   else
7380     {
7381       warn (_("corrupt library name index of 0x%lx found in dynamic entry"),
7382             (unsigned long) fixup->needed);
7383       lib_name = "???";
7384     }
7385
7386   printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
7387           (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
7388   printf
7389     (_("Seg Offset           Type                             SymVec DataType\n"));
7390
7391   for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
7392     {
7393       unsigned int type;
7394       const char *rtype;
7395
7396       printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
7397       printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
7398       type = BYTE_GET (imfs [i].type);
7399       rtype = elf_ia64_reloc_type (type);
7400       if (rtype == NULL)
7401         printf (" 0x%08x                       ", type);
7402       else
7403         printf (" %-32s ", rtype);
7404       printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
7405       printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
7406     }
7407
7408   free (imfs);
7409   return TRUE;
7410 }
7411
7412 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
7413
7414 static bfd_boolean
7415 dump_ia64_vms_dynamic_relocs (Filedata * filedata, struct ia64_vms_dynimgrela *imgrela)
7416 {
7417   Elf64_External_VMS_IMAGE_RELA *imrs;
7418   long i;
7419
7420   imrs = get_data (NULL, filedata,
7421                    filedata->dynamic_addr + imgrela->img_rela_off,
7422                    sizeof (*imrs), imgrela->img_rela_cnt,
7423                    _("dynamic section image relocations"));
7424   if (!imrs)
7425     return FALSE;
7426
7427   printf (_("\nImage relocs\n"));
7428   printf
7429     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
7430
7431   for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
7432     {
7433       unsigned int type;
7434       const char *rtype;
7435
7436       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
7437       printf ("%08" BFD_VMA_FMT "x ",
7438               (bfd_vma) BYTE_GET (imrs [i].rela_offset));
7439       type = BYTE_GET (imrs [i].type);
7440       rtype = elf_ia64_reloc_type (type);
7441       if (rtype == NULL)
7442         printf ("0x%08x                      ", type);
7443       else
7444         printf ("%-31s ", rtype);
7445       print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
7446       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
7447       printf ("%08" BFD_VMA_FMT "x\n",
7448               (bfd_vma) BYTE_GET (imrs [i].sym_offset));
7449     }
7450
7451   free (imrs);
7452   return TRUE;
7453 }
7454
7455 /* Display IA-64 OpenVMS dynamic relocations and fixups.  */
7456
7457 static bfd_boolean
7458 process_ia64_vms_dynamic_relocs (Filedata * filedata)
7459 {
7460   struct ia64_vms_dynfixup fixup;
7461   struct ia64_vms_dynimgrela imgrela;
7462   Elf_Internal_Dyn *entry;
7463   bfd_vma strtab_off = 0;
7464   bfd_vma strtab_sz = 0;
7465   char *strtab = NULL;
7466   bfd_boolean res = TRUE;
7467
7468   memset (&fixup, 0, sizeof (fixup));
7469   memset (&imgrela, 0, sizeof (imgrela));
7470
7471   /* Note: the order of the entries is specified by the OpenVMS specs.  */
7472   for (entry = filedata->dynamic_section;
7473        entry < filedata->dynamic_section + filedata->dynamic_nent;
7474        entry++)
7475     {
7476       switch (entry->d_tag)
7477         {
7478         case DT_IA_64_VMS_STRTAB_OFFSET:
7479           strtab_off = entry->d_un.d_val;
7480           break;
7481         case DT_STRSZ:
7482           strtab_sz = entry->d_un.d_val;
7483           if (strtab == NULL)
7484             strtab = get_data (NULL, filedata,
7485                                filedata->dynamic_addr + strtab_off,
7486                                1, strtab_sz, _("dynamic string section"));
7487           if (strtab == NULL)
7488             strtab_sz = 0;
7489           break;
7490
7491         case DT_IA_64_VMS_NEEDED_IDENT:
7492           fixup.needed_ident = entry->d_un.d_val;
7493           break;
7494         case DT_NEEDED:
7495           fixup.needed = entry->d_un.d_val;
7496           break;
7497         case DT_IA_64_VMS_FIXUP_NEEDED:
7498           fixup.fixup_needed = entry->d_un.d_val;
7499           break;
7500         case DT_IA_64_VMS_FIXUP_RELA_CNT:
7501           fixup.fixup_rela_cnt = entry->d_un.d_val;
7502           break;
7503         case DT_IA_64_VMS_FIXUP_RELA_OFF:
7504           fixup.fixup_rela_off = entry->d_un.d_val;
7505           if (! dump_ia64_vms_dynamic_fixups (filedata, &fixup, strtab, strtab_sz))
7506             res = FALSE;
7507           break;
7508         case DT_IA_64_VMS_IMG_RELA_CNT:
7509           imgrela.img_rela_cnt = entry->d_un.d_val;
7510           break;
7511         case DT_IA_64_VMS_IMG_RELA_OFF:
7512           imgrela.img_rela_off = entry->d_un.d_val;
7513           if (! dump_ia64_vms_dynamic_relocs (filedata, &imgrela))
7514             res = FALSE;
7515           break;
7516
7517         default:
7518           break;
7519         }
7520     }
7521
7522   free (strtab);
7523
7524   return res;
7525 }
7526
7527 static struct
7528 {
7529   const char * name;
7530   int reloc;
7531   int size;
7532   int rela;
7533 }
7534   dynamic_relocations [] =
7535 {
7536   { "REL", DT_REL, DT_RELSZ, FALSE },
7537   { "RELA", DT_RELA, DT_RELASZ, TRUE },
7538   { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
7539 };
7540
7541 /* Process the reloc section.  */
7542
7543 static bfd_boolean
7544 process_relocs (Filedata * filedata)
7545 {
7546   unsigned long rel_size;
7547   unsigned long rel_offset;
7548
7549   if (!do_reloc)
7550     return TRUE;
7551
7552   if (do_using_dynamic)
7553     {
7554       int          is_rela;
7555       const char * name;
7556       bfd_boolean  has_dynamic_reloc;
7557       unsigned int i;
7558
7559       has_dynamic_reloc = FALSE;
7560
7561       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7562         {
7563           is_rela = dynamic_relocations [i].rela;
7564           name = dynamic_relocations [i].name;
7565           rel_size = filedata->dynamic_info[dynamic_relocations [i].size];
7566           rel_offset = filedata->dynamic_info[dynamic_relocations [i].reloc];
7567
7568           if (rel_size)
7569             has_dynamic_reloc = TRUE;
7570
7571           if (is_rela == UNKNOWN)
7572             {
7573               if (dynamic_relocations [i].reloc == DT_JMPREL)
7574                 switch (filedata->dynamic_info[DT_PLTREL])
7575                   {
7576                   case DT_REL:
7577                     is_rela = FALSE;
7578                     break;
7579                   case DT_RELA:
7580                     is_rela = TRUE;
7581                     break;
7582                   }
7583             }
7584
7585           if (rel_size)
7586             {
7587               printf
7588                 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
7589                  name, rel_offset, rel_size);
7590
7591               dump_relocations (filedata,
7592                                 offset_from_vma (filedata, rel_offset, rel_size),
7593                                 rel_size,
7594                                 filedata->dynamic_symbols,
7595                                 filedata->num_dynamic_syms,
7596                                 filedata->dynamic_strings,
7597                                 filedata->dynamic_strings_length,
7598                                 is_rela, TRUE /* is_dynamic */);
7599             }
7600         }
7601
7602       if (is_ia64_vms (filedata))
7603         if (process_ia64_vms_dynamic_relocs (filedata))
7604           has_dynamic_reloc = TRUE;
7605
7606       if (! has_dynamic_reloc)
7607         printf (_("\nThere are no dynamic relocations in this file.\n"));
7608     }
7609   else
7610     {
7611       Elf_Internal_Shdr * section;
7612       unsigned long i;
7613       bfd_boolean found = FALSE;
7614
7615       for (i = 0, section = filedata->section_headers;
7616            i < filedata->file_header.e_shnum;
7617            i++, section++)
7618         {
7619           if (   section->sh_type != SHT_RELA
7620               && section->sh_type != SHT_REL)
7621             continue;
7622
7623           rel_offset = section->sh_offset;
7624           rel_size   = section->sh_size;
7625
7626           if (rel_size)
7627             {
7628               int is_rela;
7629               unsigned long num_rela;
7630
7631               printf (_("\nRelocation section "));
7632
7633               if (filedata->string_table == NULL)
7634                 printf ("%d", section->sh_name);
7635               else
7636                 printf ("'%s'", printable_section_name (filedata, section));
7637
7638               num_rela = rel_size / section->sh_entsize;
7639               printf (ngettext (" at offset 0x%lx contains %lu entry:\n",
7640                                 " at offset 0x%lx contains %lu entries:\n",
7641                                 num_rela),
7642                       rel_offset, num_rela);
7643
7644               is_rela = section->sh_type == SHT_RELA;
7645
7646               if (section->sh_link != 0
7647                   && section->sh_link < filedata->file_header.e_shnum)
7648                 {
7649                   Elf_Internal_Shdr * symsec;
7650                   Elf_Internal_Sym *  symtab;
7651                   unsigned long nsyms;
7652                   unsigned long strtablen = 0;
7653                   char * strtab = NULL;
7654
7655                   symsec = filedata->section_headers + section->sh_link;
7656                   if (symsec->sh_type != SHT_SYMTAB
7657                       && symsec->sh_type != SHT_DYNSYM)
7658                     continue;
7659
7660                   if (!get_symtab (filedata, symsec,
7661                                    &symtab, &nsyms, &strtab, &strtablen))
7662                     continue;
7663
7664                   dump_relocations (filedata, rel_offset, rel_size,
7665                                     symtab, nsyms, strtab, strtablen,
7666                                     is_rela,
7667                                     symsec->sh_type == SHT_DYNSYM);
7668                   free (strtab);
7669                   free (symtab);
7670                 }
7671               else
7672                 dump_relocations (filedata, rel_offset, rel_size,
7673                                   NULL, 0, NULL, 0, is_rela,
7674                                   FALSE /* is_dynamic */);
7675
7676               found = TRUE;
7677             }
7678         }
7679
7680       if (! found)
7681         {
7682           /* Users sometimes forget the -D option, so try to be helpful.  */
7683           for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7684             {
7685               if (filedata->dynamic_info[dynamic_relocations [i].size])
7686                 {
7687                   printf (_("\nThere are no static relocations in this file."));
7688                   printf (_("\nTo see the dynamic relocations add --use-dynamic to the command line.\n"));
7689
7690                   break;
7691                 }
7692             }
7693           if (i == ARRAY_SIZE (dynamic_relocations))
7694             printf (_("\nThere are no relocations in this file.\n"));
7695         }
7696     }
7697
7698   return TRUE;
7699 }
7700
7701 /* An absolute address consists of a section and an offset.  If the
7702    section is NULL, the offset itself is the address, otherwise, the
7703    address equals to LOAD_ADDRESS(section) + offset.  */
7704
7705 struct absaddr
7706 {
7707   unsigned short section;
7708   bfd_vma offset;
7709 };
7710
7711 /* Find the nearest symbol at or below ADDR.  Returns the symbol
7712    name, if found, and the offset from the symbol to ADDR.  */
7713
7714 static void
7715 find_symbol_for_address (Filedata *          filedata,
7716                          Elf_Internal_Sym *  symtab,
7717                          unsigned long       nsyms,
7718                          const char *        strtab,
7719                          unsigned long       strtab_size,
7720                          struct absaddr      addr,
7721                          const char **       symname,
7722                          bfd_vma *           offset)
7723 {
7724   bfd_vma dist = 0x100000;
7725   Elf_Internal_Sym * sym;
7726   Elf_Internal_Sym * beg;
7727   Elf_Internal_Sym * end;
7728   Elf_Internal_Sym * best = NULL;
7729
7730   REMOVE_ARCH_BITS (addr.offset);
7731   beg = symtab;
7732   end = symtab + nsyms;
7733
7734   while (beg < end)
7735     {
7736       bfd_vma value;
7737
7738       sym = beg + (end - beg) / 2;
7739
7740       value = sym->st_value;
7741       REMOVE_ARCH_BITS (value);
7742
7743       if (sym->st_name != 0
7744           && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
7745           && addr.offset >= value
7746           && addr.offset - value < dist)
7747         {
7748           best = sym;
7749           dist = addr.offset - value;
7750           if (!dist)
7751             break;
7752         }
7753
7754       if (addr.offset < value)
7755         end = sym;
7756       else
7757         beg = sym + 1;
7758     }
7759
7760   if (best)
7761     {
7762       *symname = (best->st_name >= strtab_size
7763                   ? _("<corrupt>") : strtab + best->st_name);
7764       *offset = dist;
7765       return;
7766     }
7767
7768   *symname = NULL;
7769   *offset = addr.offset;
7770 }
7771
7772 static /* signed */ int
7773 symcmp (const void *p, const void *q)
7774 {
7775   Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7776   Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7777
7778   return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7779 }
7780
7781 /* Process the unwind section.  */
7782
7783 #include "unwind-ia64.h"
7784
7785 struct ia64_unw_table_entry
7786 {
7787   struct absaddr start;
7788   struct absaddr end;
7789   struct absaddr info;
7790 };
7791
7792 struct ia64_unw_aux_info
7793 {
7794   struct ia64_unw_table_entry * table;          /* Unwind table.  */
7795   unsigned long                 table_len;      /* Length of unwind table.  */
7796   unsigned char *               info;           /* Unwind info.  */
7797   unsigned long                 info_size;      /* Size of unwind info.  */
7798   bfd_vma                       info_addr;      /* Starting address of unwind info.  */
7799   bfd_vma                       seg_base;       /* Starting address of segment.  */
7800   Elf_Internal_Sym *            symtab;         /* The symbol table.  */
7801   unsigned long                 nsyms;          /* Number of symbols.  */
7802   Elf_Internal_Sym *            funtab;         /* Sorted table of STT_FUNC symbols.  */
7803   unsigned long                 nfuns;          /* Number of entries in funtab.  */
7804   char *                        strtab;         /* The string table.  */
7805   unsigned long                 strtab_size;    /* Size of string table.  */
7806 };
7807
7808 static bfd_boolean
7809 dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
7810 {
7811   struct ia64_unw_table_entry * tp;
7812   unsigned long j, nfuns;
7813   int in_body;
7814   bfd_boolean res = TRUE;
7815
7816   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7817   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7818     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7819       aux->funtab[nfuns++] = aux->symtab[j];
7820   aux->nfuns = nfuns;
7821   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7822
7823   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7824     {
7825       bfd_vma stamp;
7826       bfd_vma offset;
7827       const unsigned char * dp;
7828       const unsigned char * head;
7829       const unsigned char * end;
7830       const char * procname;
7831
7832       find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7833                                aux->strtab_size, tp->start, &procname, &offset);
7834
7835       fputs ("\n<", stdout);
7836
7837       if (procname)
7838         {
7839           fputs (procname, stdout);
7840
7841           if (offset)
7842             printf ("+%lx", (unsigned long) offset);
7843         }
7844
7845       fputs (">: [", stdout);
7846       print_vma (tp->start.offset, PREFIX_HEX);
7847       fputc ('-', stdout);
7848       print_vma (tp->end.offset, PREFIX_HEX);
7849       printf ("], info at +0x%lx\n",
7850               (unsigned long) (tp->info.offset - aux->seg_base));
7851
7852       /* PR 17531: file: 86232b32.  */
7853       if (aux->info == NULL)
7854         continue;
7855
7856       offset = tp->info.offset;
7857       if (tp->info.section)
7858         {
7859           if (tp->info.section >= filedata->file_header.e_shnum)
7860             {
7861               warn (_("Invalid section %u in table entry %ld\n"),
7862                     tp->info.section, (long) (tp - aux->table));
7863               res = FALSE;
7864               continue;
7865             }
7866           offset += filedata->section_headers[tp->info.section].sh_addr;
7867         }
7868       offset -= aux->info_addr;
7869       /* PR 17531: file: 0997b4d1.  */
7870       if (offset >= aux->info_size
7871           || aux->info_size - offset < 8)
7872         {
7873           warn (_("Invalid offset %lx in table entry %ld\n"),
7874                 (long) tp->info.offset, (long) (tp - aux->table));
7875           res = FALSE;
7876           continue;
7877         }
7878
7879       head = aux->info + offset;
7880       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7881
7882       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7883               (unsigned) UNW_VER (stamp),
7884               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7885               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7886               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7887               (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7888
7889       if (UNW_VER (stamp) != 1)
7890         {
7891           printf (_("\tUnknown version.\n"));
7892           continue;
7893         }
7894
7895       in_body = 0;
7896       end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7897       /* PR 17531: file: 16ceda89.  */
7898       if (end > aux->info + aux->info_size)
7899         end = aux->info + aux->info_size;
7900       for (dp = head + 8; dp < end;)
7901         dp = unw_decode (dp, in_body, & in_body, end);
7902     }
7903
7904   free (aux->funtab);
7905
7906   return res;
7907 }
7908
7909 static bfd_boolean
7910 slurp_ia64_unwind_table (Filedata *                  filedata,
7911                          struct ia64_unw_aux_info *  aux,
7912                          Elf_Internal_Shdr *         sec)
7913 {
7914   unsigned long size, nrelas, i;
7915   Elf_Internal_Phdr * seg;
7916   struct ia64_unw_table_entry * tep;
7917   Elf_Internal_Shdr * relsec;
7918   Elf_Internal_Rela * rela;
7919   Elf_Internal_Rela * rp;
7920   unsigned char * table;
7921   unsigned char * tp;
7922   Elf_Internal_Sym * sym;
7923   const char * relname;
7924
7925   aux->table_len = 0;
7926
7927   /* First, find the starting address of the segment that includes
7928      this section: */
7929
7930   if (filedata->file_header.e_phnum)
7931     {
7932       if (! get_program_headers (filedata))
7933           return FALSE;
7934
7935       for (seg = filedata->program_headers;
7936            seg < filedata->program_headers + filedata->file_header.e_phnum;
7937            ++seg)
7938         {
7939           if (seg->p_type != PT_LOAD)
7940             continue;
7941
7942           if (sec->sh_addr >= seg->p_vaddr
7943               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7944             {
7945               aux->seg_base = seg->p_vaddr;
7946               break;
7947             }
7948         }
7949     }
7950
7951   /* Second, build the unwind table from the contents of the unwind section:  */
7952   size = sec->sh_size;
7953   table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7954                                       _("unwind table"));
7955   if (!table)
7956     return FALSE;
7957
7958   aux->table_len = size / (3 * eh_addr_size);
7959   aux->table = (struct ia64_unw_table_entry *)
7960     xcmalloc (aux->table_len, sizeof (aux->table[0]));
7961   tep = aux->table;
7962
7963   for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7964     {
7965       tep->start.section = SHN_UNDEF;
7966       tep->end.section   = SHN_UNDEF;
7967       tep->info.section  = SHN_UNDEF;
7968       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7969       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7970       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7971       tep->start.offset += aux->seg_base;
7972       tep->end.offset   += aux->seg_base;
7973       tep->info.offset  += aux->seg_base;
7974     }
7975   free (table);
7976
7977   /* Third, apply any relocations to the unwind table:  */
7978   for (relsec = filedata->section_headers;
7979        relsec < filedata->section_headers + filedata->file_header.e_shnum;
7980        ++relsec)
7981     {
7982       if (relsec->sh_type != SHT_RELA
7983           || relsec->sh_info >= filedata->file_header.e_shnum
7984           || filedata->section_headers + relsec->sh_info != sec)
7985         continue;
7986
7987       if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
7988                               & rela, & nrelas))
7989         {
7990           free (aux->table);
7991           aux->table = NULL;
7992           aux->table_len = 0;
7993           return FALSE;
7994         }
7995
7996       for (rp = rela; rp < rela + nrelas; ++rp)
7997         {
7998           unsigned int sym_ndx;
7999           unsigned int r_type = get_reloc_type (filedata, rp->r_info);
8000           relname = elf_ia64_reloc_type (r_type);
8001
8002           /* PR 17531: file: 9fa67536.  */
8003           if (relname == NULL)
8004             {
8005               warn (_("Skipping unknown relocation type: %u\n"), r_type);
8006               continue;
8007             }
8008
8009           if (! const_strneq (relname, "R_IA64_SEGREL"))
8010             {
8011               warn (_("Skipping unexpected relocation type: %s\n"), relname);
8012               continue;
8013             }
8014
8015           i = rp->r_offset / (3 * eh_addr_size);
8016
8017           /* PR 17531: file: 5bc8d9bf.  */
8018           if (i >= aux->table_len)
8019             {
8020               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
8021               continue;
8022             }
8023
8024           sym_ndx = get_reloc_symindex (rp->r_info);
8025           if (sym_ndx >= aux->nsyms)
8026             {
8027               warn (_("Skipping reloc with invalid symbol index: %u\n"),
8028                     sym_ndx);
8029               continue;
8030             }
8031           sym = aux->symtab + sym_ndx;
8032
8033           switch (rp->r_offset / eh_addr_size % 3)
8034             {
8035             case 0:
8036               aux->table[i].start.section = sym->st_shndx;
8037               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
8038               break;
8039             case 1:
8040               aux->table[i].end.section   = sym->st_shndx;
8041               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
8042               break;
8043             case 2:
8044               aux->table[i].info.section  = sym->st_shndx;
8045               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
8046               break;
8047             default:
8048               break;
8049             }
8050         }
8051
8052       free (rela);
8053     }
8054
8055   return TRUE;
8056 }
8057
8058 static bfd_boolean
8059 ia64_process_unwind (Filedata * filedata)
8060 {
8061   Elf_Internal_Shdr * sec;
8062   Elf_Internal_Shdr * unwsec = NULL;
8063   unsigned long i, unwcount = 0, unwstart = 0;
8064   struct ia64_unw_aux_info aux;
8065   bfd_boolean res = TRUE;
8066
8067   memset (& aux, 0, sizeof (aux));
8068
8069   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8070     {
8071       if (sec->sh_type == SHT_SYMTAB)
8072         {
8073           if (aux.symtab)
8074             {
8075               error (_("Multiple symbol tables encountered\n"));
8076               free (aux.symtab);
8077               aux.symtab = NULL;
8078               free (aux.strtab);
8079               aux.strtab = NULL;
8080             }
8081           if (!get_symtab (filedata, sec, &aux.symtab, &aux.nsyms,
8082                            &aux.strtab, &aux.strtab_size))
8083             return FALSE;
8084         }
8085       else if (sec->sh_type == SHT_IA_64_UNWIND)
8086         unwcount++;
8087     }
8088
8089   if (!unwcount)
8090     printf (_("\nThere are no unwind sections in this file.\n"));
8091
8092   while (unwcount-- > 0)
8093     {
8094       char * suffix;
8095       size_t len, len2;
8096
8097       for (i = unwstart, sec = filedata->section_headers + unwstart, unwsec = NULL;
8098            i < filedata->file_header.e_shnum; ++i, ++sec)
8099         if (sec->sh_type == SHT_IA_64_UNWIND)
8100           {
8101             unwsec = sec;
8102             break;
8103           }
8104       /* We have already counted the number of SHT_IA64_UNWIND
8105          sections so the loop above should never fail.  */
8106       assert (unwsec != NULL);
8107
8108       unwstart = i + 1;
8109       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
8110
8111       if ((unwsec->sh_flags & SHF_GROUP) != 0)
8112         {
8113           /* We need to find which section group it is in.  */
8114           struct group_list * g;
8115
8116           if (filedata->section_headers_groups == NULL
8117               || filedata->section_headers_groups[i] == NULL)
8118             i = filedata->file_header.e_shnum;
8119           else
8120             {
8121               g = filedata->section_headers_groups[i]->root;
8122
8123               for (; g != NULL; g = g->next)
8124                 {
8125                   sec = filedata->section_headers + g->section_index;
8126
8127                   if (SECTION_NAME_VALID (sec)
8128                       && streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
8129                     break;
8130                 }
8131
8132               if (g == NULL)
8133                 i = filedata->file_header.e_shnum;
8134             }
8135         }
8136       else if (SECTION_NAME_VALID (unwsec)
8137                && strneq (SECTION_NAME (unwsec),
8138                           ELF_STRING_ia64_unwind_once, len))
8139         {
8140           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
8141           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
8142           suffix = SECTION_NAME (unwsec) + len;
8143           for (i = 0, sec = filedata->section_headers;
8144                i < filedata->file_header.e_shnum;
8145                ++i, ++sec)
8146             if (SECTION_NAME_VALID (sec)
8147                 && strneq (SECTION_NAME (sec),
8148                            ELF_STRING_ia64_unwind_info_once, len2)
8149                 && streq (SECTION_NAME (sec) + len2, suffix))
8150               break;
8151         }
8152       else
8153         {
8154           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
8155              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
8156           len = sizeof (ELF_STRING_ia64_unwind) - 1;
8157           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
8158           suffix = "";
8159           if (SECTION_NAME_VALID (unwsec)
8160               && strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
8161             suffix = SECTION_NAME (unwsec) + len;
8162           for (i = 0, sec = filedata->section_headers;
8163                i < filedata->file_header.e_shnum;
8164                ++i, ++sec)
8165             if (SECTION_NAME_VALID (sec)
8166                 && strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
8167                 && streq (SECTION_NAME (sec) + len2, suffix))
8168               break;
8169         }
8170
8171       if (i == filedata->file_header.e_shnum)
8172         {
8173           printf (_("\nCould not find unwind info section for "));
8174
8175           if (filedata->string_table == NULL)
8176             printf ("%d", unwsec->sh_name);
8177           else
8178             printf ("'%s'", printable_section_name (filedata, unwsec));
8179         }
8180       else
8181         {
8182           aux.info_addr = sec->sh_addr;
8183           aux.info = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1,
8184                                                  sec->sh_size,
8185                                                  _("unwind info"));
8186           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
8187
8188           printf (_("\nUnwind section "));
8189
8190           if (filedata->string_table == NULL)
8191             printf ("%d", unwsec->sh_name);
8192           else
8193             printf ("'%s'", printable_section_name (filedata, unwsec));
8194
8195           printf (_(" at offset 0x%lx contains %lu entries:\n"),
8196                   (unsigned long) unwsec->sh_offset,
8197                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
8198
8199           if (slurp_ia64_unwind_table (filedata, & aux, unwsec)
8200               && aux.table_len > 0)
8201             dump_ia64_unwind (filedata, & aux);
8202
8203           free ((char *) aux.table);
8204           free ((char *) aux.info);
8205           aux.table = NULL;
8206           aux.info = NULL;
8207         }
8208     }
8209
8210   free (aux.symtab);
8211   free ((char *) aux.strtab);
8212
8213   return res;
8214 }
8215
8216 struct hppa_unw_table_entry
8217 {
8218   struct absaddr start;
8219   struct absaddr end;
8220   unsigned int Cannot_unwind:1;                 /* 0 */
8221   unsigned int Millicode:1;                     /* 1 */
8222   unsigned int Millicode_save_sr0:1;            /* 2 */
8223   unsigned int Region_description:2;            /* 3..4 */
8224   unsigned int reserved1:1;                     /* 5 */
8225   unsigned int Entry_SR:1;                      /* 6 */
8226   unsigned int Entry_FR:4;     /* Number saved     7..10 */
8227   unsigned int Entry_GR:5;     /* Number saved     11..15 */
8228   unsigned int Args_stored:1;                   /* 16 */
8229   unsigned int Variable_Frame:1;                /* 17 */
8230   unsigned int Separate_Package_Body:1;         /* 18 */
8231   unsigned int Frame_Extension_Millicode:1;     /* 19 */
8232   unsigned int Stack_Overflow_Check:1;          /* 20 */
8233   unsigned int Two_Instruction_SP_Increment:1;  /* 21 */
8234   unsigned int Ada_Region:1;                    /* 22 */
8235   unsigned int cxx_info:1;                      /* 23 */
8236   unsigned int cxx_try_catch:1;                 /* 24 */
8237   unsigned int sched_entry_seq:1;               /* 25 */
8238   unsigned int reserved2:1;                     /* 26 */
8239   unsigned int Save_SP:1;                       /* 27 */
8240   unsigned int Save_RP:1;                       /* 28 */
8241   unsigned int Save_MRP_in_frame:1;             /* 29 */
8242   unsigned int extn_ptr_defined:1;              /* 30 */
8243   unsigned int Cleanup_defined:1;               /* 31 */
8244
8245   unsigned int MPE_XL_interrupt_marker:1;       /* 0 */
8246   unsigned int HP_UX_interrupt_marker:1;        /* 1 */
8247   unsigned int Large_frame:1;                   /* 2 */
8248   unsigned int Pseudo_SP_Set:1;                 /* 3 */
8249   unsigned int reserved4:1;                     /* 4 */
8250   unsigned int Total_frame_size:27;             /* 5..31 */
8251 };
8252
8253 struct hppa_unw_aux_info
8254 {
8255   struct hppa_unw_table_entry *  table;         /* Unwind table.  */
8256   unsigned long                  table_len;     /* Length of unwind table.  */
8257   bfd_vma                        seg_base;      /* Starting address of segment.  */
8258   Elf_Internal_Sym *             symtab;        /* The symbol table.  */
8259   unsigned long                  nsyms;         /* Number of symbols.  */
8260   Elf_Internal_Sym *             funtab;        /* Sorted table of STT_FUNC symbols.  */
8261   unsigned long                  nfuns;         /* Number of entries in funtab.  */
8262   char *                         strtab;        /* The string table.  */
8263   unsigned long                  strtab_size;   /* Size of string table.  */
8264 };
8265
8266 static bfd_boolean
8267 dump_hppa_unwind (Filedata * filedata, struct hppa_unw_aux_info * aux)
8268 {
8269   struct hppa_unw_table_entry * tp;
8270   unsigned long j, nfuns;
8271   bfd_boolean res = TRUE;
8272
8273   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8274   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8275     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8276       aux->funtab[nfuns++] = aux->symtab[j];
8277   aux->nfuns = nfuns;
8278   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8279
8280   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
8281     {
8282       bfd_vma offset;
8283       const char * procname;
8284
8285       find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
8286                                aux->strtab_size, tp->start, &procname,
8287                                &offset);
8288
8289       fputs ("\n<", stdout);
8290
8291       if (procname)
8292         {
8293           fputs (procname, stdout);
8294
8295           if (offset)
8296             printf ("+%lx", (unsigned long) offset);
8297         }
8298
8299       fputs (">: [", stdout);
8300       print_vma (tp->start.offset, PREFIX_HEX);
8301       fputc ('-', stdout);
8302       print_vma (tp->end.offset, PREFIX_HEX);
8303       printf ("]\n\t");
8304
8305 #define PF(_m) if (tp->_m) printf (#_m " ");
8306 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
8307       PF(Cannot_unwind);
8308       PF(Millicode);
8309       PF(Millicode_save_sr0);
8310       /* PV(Region_description);  */
8311       PF(Entry_SR);
8312       PV(Entry_FR);
8313       PV(Entry_GR);
8314       PF(Args_stored);
8315       PF(Variable_Frame);
8316       PF(Separate_Package_Body);
8317       PF(Frame_Extension_Millicode);
8318       PF(Stack_Overflow_Check);
8319       PF(Two_Instruction_SP_Increment);
8320       PF(Ada_Region);
8321       PF(cxx_info);
8322       PF(cxx_try_catch);
8323       PF(sched_entry_seq);
8324       PF(Save_SP);
8325       PF(Save_RP);
8326       PF(Save_MRP_in_frame);
8327       PF(extn_ptr_defined);
8328       PF(Cleanup_defined);
8329       PF(MPE_XL_interrupt_marker);
8330       PF(HP_UX_interrupt_marker);
8331       PF(Large_frame);
8332       PF(Pseudo_SP_Set);
8333       PV(Total_frame_size);
8334 #undef PF
8335 #undef PV
8336     }
8337
8338   printf ("\n");
8339
8340   free (aux->funtab);
8341
8342   return res;
8343 }
8344
8345 static bfd_boolean
8346 slurp_hppa_unwind_table (Filedata *                  filedata,
8347                          struct hppa_unw_aux_info *  aux,
8348                          Elf_Internal_Shdr *         sec)
8349 {
8350   unsigned long size, unw_ent_size, nentries, nrelas, i;
8351   Elf_Internal_Phdr * seg;
8352   struct hppa_unw_table_entry * tep;
8353   Elf_Internal_Shdr * relsec;
8354   Elf_Internal_Rela * rela;
8355   Elf_Internal_Rela * rp;
8356   unsigned char * table;
8357   unsigned char * tp;
8358   Elf_Internal_Sym * sym;
8359   const char * relname;
8360
8361   /* First, find the starting address of the segment that includes
8362      this section.  */
8363   if (filedata->file_header.e_phnum)
8364     {
8365       if (! get_program_headers (filedata))
8366         return FALSE;
8367
8368       for (seg = filedata->program_headers;
8369            seg < filedata->program_headers + filedata->file_header.e_phnum;
8370            ++seg)
8371         {
8372           if (seg->p_type != PT_LOAD)
8373             continue;
8374
8375           if (sec->sh_addr >= seg->p_vaddr
8376               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
8377             {
8378               aux->seg_base = seg->p_vaddr;
8379               break;
8380             }
8381         }
8382     }
8383
8384   /* Second, build the unwind table from the contents of the unwind
8385      section.  */
8386   size = sec->sh_size;
8387   table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
8388                                       _("unwind table"));
8389   if (!table)
8390     return FALSE;
8391
8392   unw_ent_size = 16;
8393   nentries = size / unw_ent_size;
8394   size = unw_ent_size * nentries;
8395
8396   aux->table_len = nentries;
8397   tep = aux->table = (struct hppa_unw_table_entry *)
8398       xcmalloc (nentries, sizeof (aux->table[0]));
8399
8400   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
8401     {
8402       unsigned int tmp1, tmp2;
8403
8404       tep->start.section = SHN_UNDEF;
8405       tep->end.section   = SHN_UNDEF;
8406
8407       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
8408       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
8409       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
8410       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
8411
8412       tep->start.offset += aux->seg_base;
8413       tep->end.offset   += aux->seg_base;
8414
8415       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
8416       tep->Millicode = (tmp1 >> 30) & 0x1;
8417       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
8418       tep->Region_description = (tmp1 >> 27) & 0x3;
8419       tep->reserved1 = (tmp1 >> 26) & 0x1;
8420       tep->Entry_SR = (tmp1 >> 25) & 0x1;
8421       tep->Entry_FR = (tmp1 >> 21) & 0xf;
8422       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
8423       tep->Args_stored = (tmp1 >> 15) & 0x1;
8424       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
8425       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
8426       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
8427       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
8428       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
8429       tep->Ada_Region = (tmp1 >> 9) & 0x1;
8430       tep->cxx_info = (tmp1 >> 8) & 0x1;
8431       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
8432       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
8433       tep->reserved2 = (tmp1 >> 5) & 0x1;
8434       tep->Save_SP = (tmp1 >> 4) & 0x1;
8435       tep->Save_RP = (tmp1 >> 3) & 0x1;
8436       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
8437       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
8438       tep->Cleanup_defined = tmp1 & 0x1;
8439
8440       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
8441       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
8442       tep->Large_frame = (tmp2 >> 29) & 0x1;
8443       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
8444       tep->reserved4 = (tmp2 >> 27) & 0x1;
8445       tep->Total_frame_size = tmp2 & 0x7ffffff;
8446     }
8447   free (table);
8448
8449   /* Third, apply any relocations to the unwind table.  */
8450   for (relsec = filedata->section_headers;
8451        relsec < filedata->section_headers + filedata->file_header.e_shnum;
8452        ++relsec)
8453     {
8454       if (relsec->sh_type != SHT_RELA
8455           || relsec->sh_info >= filedata->file_header.e_shnum
8456           || filedata->section_headers + relsec->sh_info != sec)
8457         continue;
8458
8459       if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
8460                               & rela, & nrelas))
8461         return FALSE;
8462
8463       for (rp = rela; rp < rela + nrelas; ++rp)
8464         {
8465           unsigned int sym_ndx;
8466           unsigned int r_type = get_reloc_type (filedata, rp->r_info);
8467           relname = elf_hppa_reloc_type (r_type);
8468
8469           if (relname == NULL)
8470             {
8471               warn (_("Skipping unknown relocation type: %u\n"), r_type);
8472               continue;
8473             }
8474
8475           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
8476           if (! const_strneq (relname, "R_PARISC_SEGREL"))
8477             {
8478               warn (_("Skipping unexpected relocation type: %s\n"), relname);
8479               continue;
8480             }
8481
8482           i = rp->r_offset / unw_ent_size;
8483           if (i >= aux->table_len)
8484             {
8485               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
8486               continue;
8487             }
8488
8489           sym_ndx = get_reloc_symindex (rp->r_info);
8490           if (sym_ndx >= aux->nsyms)
8491             {
8492               warn (_("Skipping reloc with invalid symbol index: %u\n"),
8493                     sym_ndx);
8494               continue;
8495             }
8496           sym = aux->symtab + sym_ndx;
8497
8498           switch ((rp->r_offset % unw_ent_size) / 4)
8499             {
8500             case 0:
8501               aux->table[i].start.section = sym->st_shndx;
8502               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
8503               break;
8504             case 1:
8505               aux->table[i].end.section   = sym->st_shndx;
8506               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
8507               break;
8508             default:
8509               break;
8510             }
8511         }
8512
8513       free (rela);
8514     }
8515
8516   return TRUE;
8517 }
8518
8519 static bfd_boolean
8520 hppa_process_unwind (Filedata * filedata)
8521 {
8522   struct hppa_unw_aux_info aux;
8523   Elf_Internal_Shdr * unwsec = NULL;
8524   Elf_Internal_Shdr * sec;
8525   unsigned long i;
8526   bfd_boolean res = TRUE;
8527
8528   if (filedata->string_table == NULL)
8529     return FALSE;
8530
8531   memset (& aux, 0, sizeof (aux));
8532
8533   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8534     {
8535       if (sec->sh_type == SHT_SYMTAB)
8536         {
8537           if (aux.symtab)
8538             {
8539               error (_("Multiple symbol tables encountered\n"));
8540               free (aux.symtab);
8541               aux.symtab = NULL;
8542               free (aux.strtab);
8543               aux.strtab = NULL;
8544             }
8545           if (!get_symtab (filedata, sec, &aux.symtab, &aux.nsyms,
8546                            &aux.strtab, &aux.strtab_size))
8547             return FALSE;
8548         }
8549       else if (SECTION_NAME_VALID (sec)
8550                && streq (SECTION_NAME (sec), ".PARISC.unwind"))
8551         unwsec = sec;
8552     }
8553
8554   if (!unwsec)
8555     printf (_("\nThere are no unwind sections in this file.\n"));
8556
8557   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8558     {
8559       if (SECTION_NAME_VALID (sec)
8560           && streq (SECTION_NAME (sec), ".PARISC.unwind"))
8561         {
8562           unsigned long num_unwind = sec->sh_size / 16;
8563
8564           printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
8565                             "contains %lu entry:\n",
8566                             "\nUnwind section '%s' at offset 0x%lx "
8567                             "contains %lu entries:\n",
8568                             num_unwind),
8569                   printable_section_name (filedata, sec),
8570                   (unsigned long) sec->sh_offset,
8571                   num_unwind);
8572
8573           if (! slurp_hppa_unwind_table (filedata, &aux, sec))
8574             res = FALSE;
8575
8576           if (res && aux.table_len > 0)
8577             {
8578               if (! dump_hppa_unwind (filedata, &aux))
8579                 res = FALSE;
8580             }
8581
8582           free ((char *) aux.table);
8583           aux.table = NULL;
8584         }
8585     }
8586
8587   free (aux.symtab);
8588   free ((char *) aux.strtab);
8589
8590   return res;
8591 }
8592
8593 struct arm_section
8594 {
8595   unsigned char *      data;            /* The unwind data.  */
8596   Elf_Internal_Shdr *  sec;             /* The cached unwind section header.  */
8597   Elf_Internal_Rela *  rela;            /* The cached relocations for this section.  */
8598   unsigned long        nrelas;          /* The number of relocations.  */
8599   unsigned int         rel_type;        /* REL or RELA ?  */
8600   Elf_Internal_Rela *  next_rela;       /* Cyclic pointer to the next reloc to process.  */
8601 };
8602
8603 struct arm_unw_aux_info
8604 {
8605   Filedata *          filedata;         /* The file containing the unwind sections.  */
8606   Elf_Internal_Sym *  symtab;           /* The file's symbol table.  */
8607   unsigned long       nsyms;            /* Number of symbols.  */
8608   Elf_Internal_Sym *  funtab;           /* Sorted table of STT_FUNC symbols.  */
8609   unsigned long       nfuns;            /* Number of these symbols.  */
8610   char *              strtab;           /* The file's string table.  */
8611   unsigned long       strtab_size;      /* Size of string table.  */
8612 };
8613
8614 static const char *
8615 arm_print_vma_and_name (Filedata *                 filedata,
8616                         struct arm_unw_aux_info *  aux,
8617                         bfd_vma                    fn,
8618                         struct absaddr             addr)
8619 {
8620   const char *procname;
8621   bfd_vma sym_offset;
8622
8623   if (addr.section == SHN_UNDEF)
8624     addr.offset = fn;
8625
8626   find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
8627                            aux->strtab_size, addr, &procname,
8628                            &sym_offset);
8629
8630   print_vma (fn, PREFIX_HEX);
8631
8632   if (procname)
8633     {
8634       fputs (" <", stdout);
8635       fputs (procname, stdout);
8636
8637       if (sym_offset)
8638         printf ("+0x%lx", (unsigned long) sym_offset);
8639       fputc ('>', stdout);
8640     }
8641
8642   return procname;
8643 }
8644
8645 static void
8646 arm_free_section (struct arm_section *arm_sec)
8647 {
8648   free (arm_sec->data);
8649   free (arm_sec->rela);
8650 }
8651
8652 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
8653       cached section and install SEC instead.
8654    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
8655       and return its valued in * WORDP, relocating if necessary.
8656    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
8657       relocation's offset in ADDR.
8658    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
8659       into the string table of the symbol associated with the reloc.  If no
8660       reloc was applied store -1 there.
8661    5) Return TRUE upon success, FALSE otherwise.  */
8662
8663 static bfd_boolean
8664 get_unwind_section_word (Filedata *                 filedata,
8665                          struct arm_unw_aux_info *  aux,
8666                          struct arm_section *       arm_sec,
8667                          Elf_Internal_Shdr *        sec,
8668                          bfd_vma                    word_offset,
8669                          unsigned int *             wordp,
8670                          struct absaddr *           addr,
8671                          bfd_vma *                  sym_name)
8672 {
8673   Elf_Internal_Rela *rp;
8674   Elf_Internal_Sym *sym;
8675   const char * relname;
8676   unsigned int word;
8677   bfd_boolean wrapped;
8678
8679   if (sec == NULL || arm_sec == NULL)
8680     return FALSE;
8681
8682   addr->section = SHN_UNDEF;
8683   addr->offset = 0;
8684
8685   if (sym_name != NULL)
8686     *sym_name = (bfd_vma) -1;
8687
8688   /* If necessary, update the section cache.  */
8689   if (sec != arm_sec->sec)
8690     {
8691       Elf_Internal_Shdr *relsec;
8692
8693       arm_free_section (arm_sec);
8694
8695       arm_sec->sec = sec;
8696       arm_sec->data = get_data (NULL, aux->filedata, sec->sh_offset, 1,
8697                                 sec->sh_size, _("unwind data"));
8698       arm_sec->rela = NULL;
8699       arm_sec->nrelas = 0;
8700
8701       for (relsec = filedata->section_headers;
8702            relsec < filedata->section_headers + filedata->file_header.e_shnum;
8703            ++relsec)
8704         {
8705           if (relsec->sh_info >= filedata->file_header.e_shnum
8706               || filedata->section_headers + relsec->sh_info != sec
8707               /* PR 15745: Check the section type as well.  */
8708               || (relsec->sh_type != SHT_REL
8709                   && relsec->sh_type != SHT_RELA))
8710             continue;
8711
8712           arm_sec->rel_type = relsec->sh_type;
8713           if (relsec->sh_type == SHT_REL)
8714             {
8715               if (!slurp_rel_relocs (aux->filedata, relsec->sh_offset,
8716                                      relsec->sh_size,
8717                                      & arm_sec->rela, & arm_sec->nrelas))
8718                 return FALSE;
8719             }
8720           else /* relsec->sh_type == SHT_RELA */
8721             {
8722               if (!slurp_rela_relocs (aux->filedata, relsec->sh_offset,
8723                                       relsec->sh_size,
8724                                       & arm_sec->rela, & arm_sec->nrelas))
8725                 return FALSE;
8726             }
8727           break;
8728         }
8729
8730       arm_sec->next_rela = arm_sec->rela;
8731     }
8732
8733   /* If there is no unwind data we can do nothing.  */
8734   if (arm_sec->data == NULL)
8735     return FALSE;
8736
8737   /* If the offset is invalid then fail.  */
8738   if (/* PR 21343 *//* PR 18879 */
8739       sec->sh_size < 4
8740       || word_offset > (sec->sh_size - 4)
8741       || ((bfd_signed_vma) word_offset) < 0)
8742     return FALSE;
8743
8744   /* Get the word at the required offset.  */
8745   word = byte_get (arm_sec->data + word_offset, 4);
8746
8747   /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128.  */
8748   if (arm_sec->rela == NULL)
8749     {
8750       * wordp = word;
8751       return TRUE;
8752     }
8753
8754   /* Look through the relocs to find the one that applies to the provided offset.  */
8755   wrapped = FALSE;
8756   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
8757     {
8758       bfd_vma prelval, offset;
8759
8760       if (rp->r_offset > word_offset && !wrapped)
8761         {
8762           rp = arm_sec->rela;
8763           wrapped = TRUE;
8764         }
8765       if (rp->r_offset > word_offset)
8766         break;
8767
8768       if (rp->r_offset & 3)
8769         {
8770           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8771                 (unsigned long) rp->r_offset);
8772           continue;
8773         }
8774
8775       if (rp->r_offset < word_offset)
8776         continue;
8777
8778       /* PR 17531: file: 027-161405-0.004  */
8779       if (aux->symtab == NULL)
8780         continue;
8781
8782       if (arm_sec->rel_type == SHT_REL)
8783         {
8784           offset = word & 0x7fffffff;
8785           if (offset & 0x40000000)
8786             offset |= ~ (bfd_vma) 0x7fffffff;
8787         }
8788       else if (arm_sec->rel_type == SHT_RELA)
8789         offset = rp->r_addend;
8790       else
8791         {
8792           error (_("Unknown section relocation type %d encountered\n"),
8793                  arm_sec->rel_type);
8794           break;
8795         }
8796
8797       /* PR 17531 file: 027-1241568-0.004.  */
8798       if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8799         {
8800           error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8801                  (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8802           break;
8803         }
8804
8805       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
8806       offset += sym->st_value;
8807       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8808
8809       /* Check that we are processing the expected reloc type.  */
8810       if (filedata->file_header.e_machine == EM_ARM)
8811         {
8812           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
8813           if (relname == NULL)
8814             {
8815               warn (_("Skipping unknown ARM relocation type: %d\n"),
8816                     (int) ELF32_R_TYPE (rp->r_info));
8817               continue;
8818             }
8819
8820           if (streq (relname, "R_ARM_NONE"))
8821               continue;
8822
8823           if (! streq (relname, "R_ARM_PREL31"))
8824             {
8825               warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
8826               continue;
8827             }
8828         }
8829       else if (filedata->file_header.e_machine == EM_TI_C6000)
8830         {
8831           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
8832           if (relname == NULL)
8833             {
8834               warn (_("Skipping unknown C6000 relocation type: %d\n"),
8835                     (int) ELF32_R_TYPE (rp->r_info));
8836               continue;
8837             }
8838
8839           if (streq (relname, "R_C6000_NONE"))
8840             continue;
8841
8842           if (! streq (relname, "R_C6000_PREL31"))
8843             {
8844               warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
8845               continue;
8846             }
8847
8848           prelval >>= 1;
8849         }
8850       else
8851         {
8852           /* This function currently only supports ARM and TI unwinders.  */
8853           warn (_("Only TI and ARM unwinders are currently supported\n"));
8854           break;
8855         }
8856
8857       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8858       addr->section = sym->st_shndx;
8859       addr->offset = offset;
8860
8861       if (sym_name)
8862         * sym_name = sym->st_name;
8863       break;
8864     }
8865
8866   *wordp = word;
8867   arm_sec->next_rela = rp;
8868
8869   return TRUE;
8870 }
8871
8872 static const char *tic6x_unwind_regnames[16] =
8873 {
8874   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8875   "A14", "A13", "A12", "A11", "A10",
8876   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8877 };
8878
8879 static void
8880 decode_tic6x_unwind_regmask (unsigned int mask)
8881 {
8882   int i;
8883
8884   for (i = 12; mask; mask >>= 1, i--)
8885     {
8886       if (mask & 1)
8887         {
8888           fputs (tic6x_unwind_regnames[i], stdout);
8889           if (mask > 1)
8890             fputs (", ", stdout);
8891         }
8892     }
8893 }
8894
8895 #define ADVANCE                                                 \
8896   if (remaining == 0 && more_words)                             \
8897     {                                                           \
8898       data_offset += 4;                                         \
8899       if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec,     \
8900                                      data_offset, & word, & addr, NULL))        \
8901         return FALSE;                                           \
8902       remaining = 4;                                            \
8903       more_words--;                                             \
8904     }                                                           \
8905
8906 #define GET_OP(OP)                      \
8907   ADVANCE;                              \
8908   if (remaining)                        \
8909     {                                   \
8910       remaining--;                      \
8911       (OP) = word >> 24;                \
8912       word <<= 8;                       \
8913     }                                   \
8914   else                                  \
8915     {                                   \
8916       printf (_("[Truncated opcode]\n"));       \
8917       return FALSE;                     \
8918     }                                   \
8919   printf ("0x%02x ", OP)
8920
8921 static bfd_boolean
8922 decode_arm_unwind_bytecode (Filedata *                 filedata,
8923                             struct arm_unw_aux_info *  aux,
8924                             unsigned int               word,
8925                             unsigned int               remaining,
8926                             unsigned int               more_words,
8927                             bfd_vma                    data_offset,
8928                             Elf_Internal_Shdr *        data_sec,
8929                             struct arm_section *       data_arm_sec)
8930 {
8931   struct absaddr addr;
8932   bfd_boolean res = TRUE;
8933
8934   /* Decode the unwinding instructions.  */
8935   while (1)
8936     {
8937       unsigned int op, op2;
8938
8939       ADVANCE;
8940       if (remaining == 0)
8941         break;
8942       remaining--;
8943       op = word >> 24;
8944       word <<= 8;
8945
8946       printf ("  0x%02x ", op);
8947
8948       if ((op & 0xc0) == 0x00)
8949         {
8950           int offset = ((op & 0x3f) << 2) + 4;
8951
8952           printf ("     vsp = vsp + %d", offset);
8953         }
8954       else if ((op & 0xc0) == 0x40)
8955         {
8956           int offset = ((op & 0x3f) << 2) + 4;
8957
8958           printf ("     vsp = vsp - %d", offset);
8959         }
8960       else if ((op & 0xf0) == 0x80)
8961         {
8962           GET_OP (op2);
8963           if (op == 0x80 && op2 == 0)
8964             printf (_("Refuse to unwind"));
8965           else
8966             {
8967               unsigned int mask = ((op & 0x0f) << 8) | op2;
8968               bfd_boolean first = TRUE;
8969               int i;
8970
8971               printf ("pop {");
8972               for (i = 0; i < 12; i++)
8973                 if (mask & (1 << i))
8974                   {
8975                     if (first)
8976                       first = FALSE;
8977                     else
8978                       printf (", ");
8979                     printf ("r%d", 4 + i);
8980                   }
8981               printf ("}");
8982             }
8983         }
8984       else if ((op & 0xf0) == 0x90)
8985         {
8986           if (op == 0x9d || op == 0x9f)
8987             printf (_("     [Reserved]"));
8988           else
8989             printf ("     vsp = r%d", op & 0x0f);
8990         }
8991       else if ((op & 0xf0) == 0xa0)
8992         {
8993           int end = 4 + (op & 0x07);
8994           bfd_boolean first = TRUE;
8995           int i;
8996
8997           printf ("     pop {");
8998           for (i = 4; i <= end; i++)
8999             {
9000               if (first)
9001                 first = FALSE;
9002               else
9003                 printf (", ");
9004               printf ("r%d", i);
9005             }
9006           if (op & 0x08)
9007             {
9008               if (!first)
9009                 printf (", ");
9010               printf ("r14");
9011             }
9012           printf ("}");
9013         }
9014       else if (op == 0xb0)
9015         printf (_("     finish"));
9016       else if (op == 0xb1)
9017         {
9018           GET_OP (op2);
9019           if (op2 == 0 || (op2 & 0xf0) != 0)
9020             printf (_("[Spare]"));
9021           else
9022             {
9023               unsigned int mask = op2 & 0x0f;
9024               bfd_boolean first = TRUE;
9025               int i;
9026
9027               printf ("pop {");
9028               for (i = 0; i < 12; i++)
9029                 if (mask & (1 << i))
9030                   {
9031                     if (first)
9032                       first = FALSE;
9033                     else
9034                       printf (", ");
9035                     printf ("r%d", i);
9036                   }
9037               printf ("}");
9038             }
9039         }
9040       else if (op == 0xb2)
9041         {
9042           unsigned char buf[9];
9043           unsigned int i, len;
9044           unsigned long offset;
9045
9046           for (i = 0; i < sizeof (buf); i++)
9047             {
9048               GET_OP (buf[i]);
9049               if ((buf[i] & 0x80) == 0)
9050                 break;
9051             }
9052           if (i == sizeof (buf))
9053             {
9054               error (_("corrupt change to vsp\n"));
9055               res = FALSE;
9056             }
9057           else
9058             {
9059               offset = read_leb128 (buf, buf + i + 1, FALSE, &len, NULL);
9060               assert (len == i + 1);
9061               offset = offset * 4 + 0x204;
9062               printf ("vsp = vsp + %ld", offset);
9063             }
9064         }
9065       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
9066         {
9067           unsigned int first, last;
9068
9069           GET_OP (op2);
9070           first = op2 >> 4;
9071           last = op2 & 0x0f;
9072           if (op == 0xc8)
9073             first = first + 16;
9074           printf ("pop {D%d", first);
9075           if (last)
9076             printf ("-D%d", first + last);
9077           printf ("}");
9078         }
9079       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
9080         {
9081           unsigned int count = op & 0x07;
9082
9083           printf ("pop {D8");
9084           if (count)
9085             printf ("-D%d", 8 + count);
9086           printf ("}");
9087         }
9088       else if (op >= 0xc0 && op <= 0xc5)
9089         {
9090           unsigned int count = op & 0x07;
9091
9092           printf ("     pop {wR10");
9093           if (count)
9094             printf ("-wR%d", 10 + count);
9095           printf ("}");
9096         }
9097       else if (op == 0xc6)
9098         {
9099           unsigned int first, last;
9100
9101           GET_OP (op2);
9102           first = op2 >> 4;
9103           last = op2 & 0x0f;
9104           printf ("pop {wR%d", first);
9105           if (last)
9106             printf ("-wR%d", first + last);
9107           printf ("}");
9108         }
9109       else if (op == 0xc7)
9110         {
9111           GET_OP (op2);
9112           if (op2 == 0 || (op2 & 0xf0) != 0)
9113             printf (_("[Spare]"));
9114           else
9115             {
9116               unsigned int mask = op2 & 0x0f;
9117               bfd_boolean first = TRUE;
9118               int i;
9119
9120               printf ("pop {");
9121               for (i = 0; i < 4; i++)
9122                 if (mask & (1 << i))
9123                   {
9124                     if (first)
9125                       first = FALSE;
9126                     else
9127                       printf (", ");
9128                     printf ("wCGR%d", i);
9129                   }
9130               printf ("}");
9131             }
9132         }
9133       else
9134         {
9135           printf (_("     [unsupported opcode]"));
9136           res = FALSE;
9137         }
9138
9139       printf ("\n");
9140     }
9141
9142   return res;
9143 }
9144
9145 static bfd_boolean
9146 decode_tic6x_unwind_bytecode (Filedata *                 filedata,
9147                               struct arm_unw_aux_info *  aux,
9148                               unsigned int               word,
9149                               unsigned int               remaining,
9150                               unsigned int               more_words,
9151                               bfd_vma                    data_offset,
9152                               Elf_Internal_Shdr *        data_sec,
9153                               struct arm_section *       data_arm_sec)
9154 {
9155   struct absaddr addr;
9156
9157   /* Decode the unwinding instructions.  */
9158   while (1)
9159     {
9160       unsigned int op, op2;
9161
9162       ADVANCE;
9163       if (remaining == 0)
9164         break;
9165       remaining--;
9166       op = word >> 24;
9167       word <<= 8;
9168
9169       printf ("  0x%02x ", op);
9170
9171       if ((op & 0xc0) == 0x00)
9172         {
9173           int offset = ((op & 0x3f) << 3) + 8;
9174           printf ("     sp = sp + %d", offset);
9175         }
9176       else if ((op & 0xc0) == 0x80)
9177         {
9178           GET_OP (op2);
9179           if (op == 0x80 && op2 == 0)
9180             printf (_("Refuse to unwind"));
9181           else
9182             {
9183               unsigned int mask = ((op & 0x1f) << 8) | op2;
9184               if (op & 0x20)
9185                 printf ("pop compact {");
9186               else
9187                 printf ("pop {");
9188
9189               decode_tic6x_unwind_regmask (mask);
9190               printf("}");
9191             }
9192         }
9193       else if ((op & 0xf0) == 0xc0)
9194         {
9195           unsigned int reg;
9196           unsigned int nregs;
9197           unsigned int i;
9198           const char *name;
9199           struct
9200           {
9201             unsigned int offset;
9202             unsigned int reg;
9203           } regpos[16];
9204
9205           /* Scan entire instruction first so that GET_OP output is not
9206              interleaved with disassembly.  */
9207           nregs = 0;
9208           for (i = 0; nregs < (op & 0xf); i++)
9209             {
9210               GET_OP (op2);
9211               reg = op2 >> 4;
9212               if (reg != 0xf)
9213                 {
9214                   regpos[nregs].offset = i * 2;
9215                   regpos[nregs].reg = reg;
9216                   nregs++;
9217                 }
9218
9219               reg = op2 & 0xf;
9220               if (reg != 0xf)
9221                 {
9222                   regpos[nregs].offset = i * 2 + 1;
9223                   regpos[nregs].reg = reg;
9224                   nregs++;
9225                 }
9226             }
9227
9228           printf (_("pop frame {"));
9229           if (nregs == 0)
9230             {
9231               printf (_("*corrupt* - no registers specified"));
9232             }
9233           else
9234             {
9235               reg = nregs - 1;
9236               for (i = i * 2; i > 0; i--)
9237                 {
9238                   if (regpos[reg].offset == i - 1)
9239                     {
9240                       name = tic6x_unwind_regnames[regpos[reg].reg];
9241                       if (reg > 0)
9242                         reg--;
9243                     }
9244                   else
9245                     name = _("[pad]");
9246
9247                   fputs (name, stdout);
9248                   if (i > 1)
9249                     printf (", ");
9250                 }
9251             }
9252
9253           printf ("}");
9254         }
9255       else if (op == 0xd0)
9256         printf ("     MOV FP, SP");
9257       else if (op == 0xd1)
9258         printf ("     __c6xabi_pop_rts");
9259       else if (op == 0xd2)
9260         {
9261           unsigned char buf[9];
9262           unsigned int i, len;
9263           unsigned long offset;
9264
9265           for (i = 0; i < sizeof (buf); i++)
9266             {
9267               GET_OP (buf[i]);
9268               if ((buf[i] & 0x80) == 0)
9269                 break;
9270             }
9271           /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2.  */
9272           if (i == sizeof (buf))
9273             {
9274               warn (_("Corrupt stack pointer adjustment detected\n"));
9275               return FALSE;
9276             }
9277
9278           offset = read_leb128 (buf, buf + i + 1, FALSE, &len, NULL);
9279           assert (len == i + 1);
9280           offset = offset * 8 + 0x408;
9281           printf (_("sp = sp + %ld"), offset);
9282         }
9283       else if ((op & 0xf0) == 0xe0)
9284         {
9285           if ((op & 0x0f) == 7)
9286             printf ("     RETURN");
9287           else
9288             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
9289         }
9290       else
9291         {
9292           printf (_("     [unsupported opcode]"));
9293         }
9294       putchar ('\n');
9295     }
9296
9297   return TRUE;
9298 }
9299
9300 static bfd_vma
9301 arm_expand_prel31 (Filedata * filedata, bfd_vma word, bfd_vma where)
9302 {
9303   bfd_vma offset;
9304
9305   offset = word & 0x7fffffff;
9306   if (offset & 0x40000000)
9307     offset |= ~ (bfd_vma) 0x7fffffff;
9308
9309   if (filedata->file_header.e_machine == EM_TI_C6000)
9310     offset <<= 1;
9311
9312   return offset + where;
9313 }
9314
9315 static bfd_boolean
9316 decode_arm_unwind (Filedata *                 filedata,
9317                    struct arm_unw_aux_info *  aux,
9318                    unsigned int               word,
9319                    unsigned int               remaining,
9320                    bfd_vma                    data_offset,
9321                    Elf_Internal_Shdr *        data_sec,
9322                    struct arm_section *       data_arm_sec)
9323 {
9324   int per_index;
9325   unsigned int more_words = 0;
9326   struct absaddr addr;
9327   bfd_vma sym_name = (bfd_vma) -1;
9328   bfd_boolean res = TRUE;
9329
9330   if (remaining == 0)
9331     {
9332       /* Fetch the first word.
9333          Note - when decoding an object file the address extracted
9334          here will always be 0.  So we also pass in the sym_name
9335          parameter so that we can find the symbol associated with
9336          the personality routine.  */
9337       if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, data_offset,
9338                                      & word, & addr, & sym_name))
9339         return FALSE;
9340
9341       remaining = 4;
9342     }
9343   else
9344     {
9345       addr.section = SHN_UNDEF;
9346       addr.offset = 0;
9347     }
9348
9349   if ((word & 0x80000000) == 0)
9350     {
9351       /* Expand prel31 for personality routine.  */
9352       bfd_vma fn;
9353       const char *procname;
9354
9355       fn = arm_expand_prel31 (filedata, word, data_sec->sh_addr + data_offset);
9356       printf (_("  Personality routine: "));
9357       if (fn == 0
9358           && addr.section == SHN_UNDEF && addr.offset == 0
9359           && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
9360         {
9361           procname = aux->strtab + sym_name;
9362           print_vma (fn, PREFIX_HEX);
9363           if (procname)
9364             {
9365               fputs (" <", stdout);
9366               fputs (procname, stdout);
9367               fputc ('>', stdout);
9368             }
9369         }
9370       else
9371         procname = arm_print_vma_and_name (filedata, aux, fn, addr);
9372       fputc ('\n', stdout);
9373
9374       /* The GCC personality routines use the standard compact
9375          encoding, starting with one byte giving the number of
9376          words.  */
9377       if (procname != NULL
9378           && (const_strneq (procname, "__gcc_personality_v0")
9379               || const_strneq (procname, "__gxx_personality_v0")
9380               || const_strneq (procname, "__gcj_personality_v0")
9381               || const_strneq (procname, "__gnu_objc_personality_v0")))
9382         {
9383           remaining = 0;
9384           more_words = 1;
9385           ADVANCE;
9386           if (!remaining)
9387             {
9388               printf (_("  [Truncated data]\n"));
9389               return FALSE;
9390             }
9391           more_words = word >> 24;
9392           word <<= 8;
9393           remaining--;
9394           per_index = -1;
9395         }
9396       else
9397         return TRUE;
9398     }
9399   else
9400     {
9401       /* ARM EHABI Section 6.3:
9402
9403          An exception-handling table entry for the compact model looks like:
9404
9405            31 30-28 27-24 23-0
9406            -- ----- ----- ----
9407             1   0   index Data for personalityRoutine[index]    */
9408
9409       if (filedata->file_header.e_machine == EM_ARM
9410           && (word & 0x70000000))
9411         {
9412           warn (_("Corrupt ARM compact model table entry: %x \n"), word);
9413           res = FALSE;
9414         }
9415
9416       per_index = (word >> 24) & 0x7f;
9417       printf (_("  Compact model index: %d\n"), per_index);
9418       if (per_index == 0)
9419         {
9420           more_words = 0;
9421           word <<= 8;
9422           remaining--;
9423         }
9424       else if (per_index < 3)
9425         {
9426           more_words = (word >> 16) & 0xff;
9427           word <<= 16;
9428           remaining -= 2;
9429         }
9430     }
9431
9432   switch (filedata->file_header.e_machine)
9433     {
9434     case EM_ARM:
9435       if (per_index < 3)
9436         {
9437           if (! decode_arm_unwind_bytecode (filedata, aux, word, remaining, more_words,
9438                                             data_offset, data_sec, data_arm_sec))
9439             res = FALSE;
9440         }
9441       else
9442         {
9443           warn (_("Unknown ARM compact model index encountered\n"));
9444           printf (_("  [reserved]\n"));
9445           res = FALSE;
9446         }
9447       break;
9448
9449     case EM_TI_C6000:
9450       if (per_index < 3)
9451         {
9452           if (! decode_tic6x_unwind_bytecode (filedata, aux, word, remaining, more_words,
9453                                               data_offset, data_sec, data_arm_sec))
9454             res = FALSE;
9455         }
9456       else if (per_index < 5)
9457         {
9458           if (((word >> 17) & 0x7f) == 0x7f)
9459             printf (_("  Restore stack from frame pointer\n"));
9460           else
9461             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
9462           printf (_("  Registers restored: "));
9463           if (per_index == 4)
9464             printf (" (compact) ");
9465           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
9466           putchar ('\n');
9467           printf (_("  Return register: %s\n"),
9468                   tic6x_unwind_regnames[word & 0xf]);
9469         }
9470       else
9471         printf (_("  [reserved (%d)]\n"), per_index);
9472       break;
9473
9474     default:
9475       error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
9476              filedata->file_header.e_machine);
9477       res = FALSE;
9478     }
9479
9480   /* Decode the descriptors.  Not implemented.  */
9481
9482   return res;
9483 }
9484
9485 static bfd_boolean
9486 dump_arm_unwind (Filedata *                 filedata,
9487                  struct arm_unw_aux_info *  aux,
9488                  Elf_Internal_Shdr *        exidx_sec)
9489 {
9490   struct arm_section exidx_arm_sec, extab_arm_sec;
9491   unsigned int i, exidx_len;
9492   unsigned long j, nfuns;
9493   bfd_boolean res = TRUE;
9494
9495   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
9496   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
9497   exidx_len = exidx_sec->sh_size / 8;
9498
9499   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
9500   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
9501     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
9502       aux->funtab[nfuns++] = aux->symtab[j];
9503   aux->nfuns = nfuns;
9504   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
9505
9506   for (i = 0; i < exidx_len; i++)
9507     {
9508       unsigned int exidx_fn, exidx_entry;
9509       struct absaddr fn_addr, entry_addr;
9510       bfd_vma fn;
9511
9512       fputc ('\n', stdout);
9513
9514       if (! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9515                                      8 * i, & exidx_fn, & fn_addr, NULL)
9516           || ! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9517                                         8 * i + 4, & exidx_entry, & entry_addr, NULL))
9518         {
9519           free (aux->funtab);
9520           arm_free_section (& exidx_arm_sec);
9521           arm_free_section (& extab_arm_sec);
9522           return FALSE;
9523         }
9524
9525       /* ARM EHABI, Section 5:
9526          An index table entry consists of 2 words.
9527          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
9528       if (exidx_fn & 0x80000000)
9529         {
9530           warn (_("corrupt index table entry: %x\n"), exidx_fn);
9531           res = FALSE;
9532         }
9533
9534       fn = arm_expand_prel31 (filedata, exidx_fn, exidx_sec->sh_addr + 8 * i);
9535
9536       arm_print_vma_and_name (filedata, aux, fn, fn_addr);
9537       fputs (": ", stdout);
9538
9539       if (exidx_entry == 1)
9540         {
9541           print_vma (exidx_entry, PREFIX_HEX);
9542           fputs (" [cantunwind]\n", stdout);
9543         }
9544       else if (exidx_entry & 0x80000000)
9545         {
9546           print_vma (exidx_entry, PREFIX_HEX);
9547           fputc ('\n', stdout);
9548           decode_arm_unwind (filedata, aux, exidx_entry, 4, 0, NULL, NULL);
9549         }
9550       else
9551         {
9552           bfd_vma table, table_offset = 0;
9553           Elf_Internal_Shdr *table_sec;
9554
9555           fputs ("@", stdout);
9556           table = arm_expand_prel31 (filedata, exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
9557           print_vma (table, PREFIX_HEX);
9558           printf ("\n");
9559
9560           /* Locate the matching .ARM.extab.  */
9561           if (entry_addr.section != SHN_UNDEF
9562               && entry_addr.section < filedata->file_header.e_shnum)
9563             {
9564               table_sec = filedata->section_headers + entry_addr.section;
9565               table_offset = entry_addr.offset;
9566               /* PR 18879 */
9567               if (table_offset > table_sec->sh_size
9568                   || ((bfd_signed_vma) table_offset) < 0)
9569                 {
9570                   warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
9571                         (unsigned long) table_offset,
9572                         printable_section_name (filedata, table_sec));
9573                   res = FALSE;
9574                   continue;
9575                 }
9576             }
9577           else
9578             {
9579               table_sec = find_section_by_address (filedata, table);
9580               if (table_sec != NULL)
9581                 table_offset = table - table_sec->sh_addr;
9582             }
9583
9584           if (table_sec == NULL)
9585             {
9586               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
9587                     (unsigned long) table);
9588               res = FALSE;
9589               continue;
9590             }
9591
9592           if (! decode_arm_unwind (filedata, aux, 0, 0, table_offset, table_sec,
9593                                    &extab_arm_sec))
9594             res = FALSE;
9595         }
9596     }
9597
9598   printf ("\n");
9599
9600   free (aux->funtab);
9601   arm_free_section (&exidx_arm_sec);
9602   arm_free_section (&extab_arm_sec);
9603
9604   return res;
9605 }
9606
9607 /* Used for both ARM and C6X unwinding tables.  */
9608
9609 static bfd_boolean
9610 arm_process_unwind (Filedata * filedata)
9611 {
9612   struct arm_unw_aux_info aux;
9613   Elf_Internal_Shdr *unwsec = NULL;
9614   Elf_Internal_Shdr *sec;
9615   unsigned long i;
9616   unsigned int sec_type;
9617   bfd_boolean res = TRUE;
9618
9619   switch (filedata->file_header.e_machine)
9620     {
9621     case EM_ARM:
9622       sec_type = SHT_ARM_EXIDX;
9623       break;
9624
9625     case EM_TI_C6000:
9626       sec_type = SHT_C6000_UNWIND;
9627       break;
9628
9629     default:
9630       error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
9631              filedata->file_header.e_machine);
9632       return FALSE;
9633     }
9634
9635   if (filedata->string_table == NULL)
9636     return FALSE;
9637
9638   memset (& aux, 0, sizeof (aux));
9639   aux.filedata = filedata;
9640
9641   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9642     {
9643       if (sec->sh_type == SHT_SYMTAB)
9644         {
9645           if (aux.symtab)
9646             {
9647               error (_("Multiple symbol tables encountered\n"));
9648               free (aux.symtab);
9649               aux.symtab = NULL;
9650               free (aux.strtab);
9651               aux.strtab = NULL;
9652             }
9653           if (!get_symtab (filedata, sec, &aux.symtab, &aux.nsyms,
9654                            &aux.strtab, &aux.strtab_size))
9655             return FALSE;
9656         }
9657       else if (sec->sh_type == sec_type)
9658         unwsec = sec;
9659     }
9660
9661   if (unwsec == NULL)
9662     printf (_("\nThere are no unwind sections in this file.\n"));
9663   else
9664     for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9665       {
9666         if (sec->sh_type == sec_type)
9667           {
9668             unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size);
9669             printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
9670                               "contains %lu entry:\n",
9671                               "\nUnwind section '%s' at offset 0x%lx "
9672                               "contains %lu entries:\n",
9673                               num_unwind),
9674                     printable_section_name (filedata, sec),
9675                     (unsigned long) sec->sh_offset,
9676                     num_unwind);
9677
9678             if (! dump_arm_unwind (filedata, &aux, sec))
9679               res = FALSE;
9680           }
9681       }
9682
9683   free (aux.symtab);
9684   free ((char *) aux.strtab);
9685
9686   return res;
9687 }
9688
9689 static bfd_boolean
9690 process_unwind (Filedata * filedata)
9691 {
9692   struct unwind_handler
9693   {
9694     unsigned int machtype;
9695     bfd_boolean (* handler)(Filedata *);
9696   } handlers[] =
9697   {
9698     { EM_ARM, arm_process_unwind },
9699     { EM_IA_64, ia64_process_unwind },
9700     { EM_PARISC, hppa_process_unwind },
9701     { EM_TI_C6000, arm_process_unwind },
9702     { 0, NULL }
9703   };
9704   int i;
9705
9706   if (!do_unwind)
9707     return TRUE;
9708
9709   for (i = 0; handlers[i].handler != NULL; i++)
9710     if (filedata->file_header.e_machine == handlers[i].machtype)
9711       return handlers[i].handler (filedata);
9712
9713   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
9714           get_machine_name (filedata->file_header.e_machine));
9715   return TRUE;
9716 }
9717
9718 static void
9719 dynamic_section_aarch64_val (Elf_Internal_Dyn * entry)
9720 {
9721   switch (entry->d_tag)
9722     {
9723     case DT_AARCH64_BTI_PLT:
9724     case DT_AARCH64_PAC_PLT:
9725       break;
9726     default:
9727       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9728       break;
9729     }
9730   putchar ('\n');
9731 }
9732
9733 static void
9734 dynamic_section_mips_val (Filedata * filedata, Elf_Internal_Dyn * entry)
9735 {
9736   switch (entry->d_tag)
9737     {
9738     case DT_MIPS_FLAGS:
9739       if (entry->d_un.d_val == 0)
9740         printf (_("NONE"));
9741       else
9742         {
9743           static const char * opts[] =
9744           {
9745             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
9746             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
9747             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
9748             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
9749             "RLD_ORDER_SAFE"
9750           };
9751           unsigned int cnt;
9752           bfd_boolean first = TRUE;
9753
9754           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
9755             if (entry->d_un.d_val & (1 << cnt))
9756               {
9757                 printf ("%s%s", first ? "" : " ", opts[cnt]);
9758                 first = FALSE;
9759               }
9760         }
9761       break;
9762
9763     case DT_MIPS_IVERSION:
9764       if (VALID_DYNAMIC_NAME (filedata, entry->d_un.d_val))
9765         printf (_("Interface Version: %s"),
9766                 GET_DYNAMIC_NAME (filedata, entry->d_un.d_val));
9767       else
9768         {
9769           char buf[40];
9770           sprintf_vma (buf, entry->d_un.d_ptr);
9771           /* Note: coded this way so that there is a single string for translation.  */
9772           printf (_("<corrupt: %s>"), buf);
9773         }
9774       break;
9775
9776     case DT_MIPS_TIME_STAMP:
9777       {
9778         char timebuf[128];
9779         struct tm * tmp;
9780         time_t atime = entry->d_un.d_val;
9781
9782         tmp = gmtime (&atime);
9783         /* PR 17531: file: 6accc532.  */
9784         if (tmp == NULL)
9785           snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
9786         else
9787           snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
9788                     tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9789                     tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9790         printf (_("Time Stamp: %s"), timebuf);
9791       }
9792       break;
9793
9794     case DT_MIPS_RLD_VERSION:
9795     case DT_MIPS_LOCAL_GOTNO:
9796     case DT_MIPS_CONFLICTNO:
9797     case DT_MIPS_LIBLISTNO:
9798     case DT_MIPS_SYMTABNO:
9799     case DT_MIPS_UNREFEXTNO:
9800     case DT_MIPS_HIPAGENO:
9801     case DT_MIPS_DELTA_CLASS_NO:
9802     case DT_MIPS_DELTA_INSTANCE_NO:
9803     case DT_MIPS_DELTA_RELOC_NO:
9804     case DT_MIPS_DELTA_SYM_NO:
9805     case DT_MIPS_DELTA_CLASSSYM_NO:
9806     case DT_MIPS_COMPACT_SIZE:
9807       print_vma (entry->d_un.d_val, DEC);
9808       break;
9809
9810     case DT_MIPS_XHASH:
9811       filedata->dynamic_info_DT_MIPS_XHASH = entry->d_un.d_val;
9812       filedata->dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9813       /* Falls through.  */
9814
9815     default:
9816       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9817     }
9818     putchar ('\n');
9819 }
9820
9821 static void
9822 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
9823 {
9824   switch (entry->d_tag)
9825     {
9826     case DT_HP_DLD_FLAGS:
9827       {
9828         static struct
9829         {
9830           long int bit;
9831           const char * str;
9832         }
9833         flags[] =
9834         {
9835           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
9836           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
9837           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
9838           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
9839           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
9840           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
9841           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9842           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9843           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9844           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
9845           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9846           { DT_HP_GST, "HP_GST" },
9847           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9848           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9849           { DT_HP_NODELETE, "HP_NODELETE" },
9850           { DT_HP_GROUP, "HP_GROUP" },
9851           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
9852         };
9853         bfd_boolean first = TRUE;
9854         size_t cnt;
9855         bfd_vma val = entry->d_un.d_val;
9856
9857         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
9858           if (val & flags[cnt].bit)
9859             {
9860               if (! first)
9861                 putchar (' ');
9862               fputs (flags[cnt].str, stdout);
9863               first = FALSE;
9864               val ^= flags[cnt].bit;
9865             }
9866
9867         if (val != 0 || first)
9868           {
9869             if (! first)
9870               putchar (' ');
9871             print_vma (val, HEX);
9872           }
9873       }
9874       break;
9875
9876     default:
9877       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9878       break;
9879     }
9880   putchar ('\n');
9881 }
9882
9883 #ifdef BFD64
9884
9885 /* VMS vs Unix time offset and factor.  */
9886
9887 #define VMS_EPOCH_OFFSET 35067168000000000LL
9888 #define VMS_GRANULARITY_FACTOR 10000000
9889 #ifndef INT64_MIN
9890 #define INT64_MIN (-9223372036854775807LL - 1)
9891 #endif
9892
9893 /* Display a VMS time in a human readable format.  */
9894
9895 static void
9896 print_vms_time (bfd_int64_t vmstime)
9897 {
9898   struct tm *tm = NULL;
9899   time_t unxtime;
9900
9901   if (vmstime >= INT64_MIN + VMS_EPOCH_OFFSET)
9902     {
9903       vmstime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9904       unxtime = vmstime;
9905       if (unxtime == vmstime)
9906         tm = gmtime (&unxtime);
9907     }
9908   if (tm != NULL)
9909     printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9910             tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9911             tm->tm_hour, tm->tm_min, tm->tm_sec);
9912 }
9913 #endif /* BFD64 */
9914
9915 static void
9916 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
9917 {
9918   switch (entry->d_tag)
9919     {
9920     case DT_IA_64_PLT_RESERVE:
9921       /* First 3 slots reserved.  */
9922       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9923       printf (" -- ");
9924       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
9925       break;
9926
9927     case DT_IA_64_VMS_LINKTIME:
9928 #ifdef BFD64
9929       print_vms_time (entry->d_un.d_val);
9930 #endif
9931       break;
9932
9933     case DT_IA_64_VMS_LNKFLAGS:
9934       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9935       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9936         printf (" CALL_DEBUG");
9937       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9938         printf (" NOP0BUFS");
9939       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9940         printf (" P0IMAGE");
9941       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9942         printf (" MKTHREADS");
9943       if (entry->d_un.d_val & VMS_LF_UPCALLS)
9944         printf (" UPCALLS");
9945       if (entry->d_un.d_val & VMS_LF_IMGSTA)
9946         printf (" IMGSTA");
9947       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9948         printf (" INITIALIZE");
9949       if (entry->d_un.d_val & VMS_LF_MAIN)
9950         printf (" MAIN");
9951       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9952         printf (" EXE_INIT");
9953       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9954         printf (" TBK_IN_IMG");
9955       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9956         printf (" DBG_IN_IMG");
9957       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9958         printf (" TBK_IN_DSF");
9959       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9960         printf (" DBG_IN_DSF");
9961       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9962         printf (" SIGNATURES");
9963       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9964         printf (" REL_SEG_OFF");
9965       break;
9966
9967     default:
9968       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9969       break;
9970     }
9971   putchar ('\n');
9972 }
9973
9974 static bfd_boolean
9975 get_32bit_dynamic_section (Filedata * filedata)
9976 {
9977   Elf32_External_Dyn * edyn;
9978   Elf32_External_Dyn * ext;
9979   Elf_Internal_Dyn * entry;
9980
9981   edyn = (Elf32_External_Dyn *) get_data (NULL, filedata,
9982                                           filedata->dynamic_addr, 1,
9983                                           filedata->dynamic_size,
9984                                           _("dynamic section"));
9985   if (!edyn)
9986     return FALSE;
9987
9988   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9989      might not have the luxury of section headers.  Look for the DT_NULL
9990      terminator to determine the number of entries.  */
9991   for (ext = edyn, filedata->dynamic_nent = 0;
9992        (char *) (ext + 1) <= (char *) edyn + filedata->dynamic_size;
9993        ext++)
9994     {
9995       filedata->dynamic_nent++;
9996       if (BYTE_GET (ext->d_tag) == DT_NULL)
9997         break;
9998     }
9999
10000   filedata->dynamic_section
10001     = (Elf_Internal_Dyn *) cmalloc (filedata->dynamic_nent, sizeof (* entry));
10002   if (filedata->dynamic_section == NULL)
10003     {
10004       error (_("Out of memory allocating space for %lu dynamic entries\n"),
10005              (unsigned long) filedata->dynamic_nent);
10006       free (edyn);
10007       return FALSE;
10008     }
10009
10010   for (ext = edyn, entry = filedata->dynamic_section;
10011        entry < filedata->dynamic_section + filedata->dynamic_nent;
10012        ext++, entry++)
10013     {
10014       entry->d_tag      = BYTE_GET (ext->d_tag);
10015       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
10016     }
10017
10018   free (edyn);
10019
10020   return TRUE;
10021 }
10022
10023 static bfd_boolean
10024 get_64bit_dynamic_section (Filedata * filedata)
10025 {
10026   Elf64_External_Dyn * edyn;
10027   Elf64_External_Dyn * ext;
10028   Elf_Internal_Dyn * entry;
10029
10030   /* Read in the data.  */
10031   edyn = (Elf64_External_Dyn *) get_data (NULL, filedata,
10032                                           filedata->dynamic_addr, 1,
10033                                           filedata->dynamic_size,
10034                                           _("dynamic section"));
10035   if (!edyn)
10036     return FALSE;
10037
10038   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
10039      might not have the luxury of section headers.  Look for the DT_NULL
10040      terminator to determine the number of entries.  */
10041   for (ext = edyn, filedata->dynamic_nent = 0;
10042        /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer.  */
10043        (char *) (ext + 1) <= (char *) edyn + filedata->dynamic_size;
10044        ext++)
10045     {
10046       filedata->dynamic_nent++;
10047       if (BYTE_GET (ext->d_tag) == DT_NULL)
10048         break;
10049     }
10050
10051   filedata->dynamic_section
10052     = (Elf_Internal_Dyn *) cmalloc (filedata->dynamic_nent, sizeof (* entry));
10053   if (filedata->dynamic_section == NULL)
10054     {
10055       error (_("Out of memory allocating space for %lu dynamic entries\n"),
10056              (unsigned long) filedata->dynamic_nent);
10057       free (edyn);
10058       return FALSE;
10059     }
10060
10061   /* Convert from external to internal formats.  */
10062   for (ext = edyn, entry = filedata->dynamic_section;
10063        entry < filedata->dynamic_section + filedata->dynamic_nent;
10064        ext++, entry++)
10065     {
10066       entry->d_tag      = BYTE_GET (ext->d_tag);
10067       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
10068     }
10069
10070   free (edyn);
10071
10072   return TRUE;
10073 }
10074
10075 static void
10076 print_dynamic_flags (bfd_vma flags)
10077 {
10078   bfd_boolean first = TRUE;
10079
10080   while (flags)
10081     {
10082       bfd_vma flag;
10083
10084       flag = flags & - flags;
10085       flags &= ~ flag;
10086
10087       if (first)
10088         first = FALSE;
10089       else
10090         putc (' ', stdout);
10091
10092       switch (flag)
10093         {
10094         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
10095         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
10096         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
10097         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
10098         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
10099         default:                fputs (_("unknown"), stdout); break;
10100         }
10101     }
10102   puts ("");
10103 }
10104
10105 static bfd_vma *
10106 get_dynamic_data (Filedata * filedata, bfd_size_type number, unsigned int ent_size)
10107 {
10108   unsigned char * e_data;
10109   bfd_vma * i_data;
10110
10111   /* If the size_t type is smaller than the bfd_size_type, eg because
10112      you are building a 32-bit tool on a 64-bit host, then make sure
10113      that when (number) is cast to (size_t) no information is lost.  */
10114   if (sizeof (size_t) < sizeof (bfd_size_type)
10115       && (bfd_size_type) ((size_t) number) != number)
10116     {
10117       error (_("Size truncation prevents reading %s elements of size %u\n"),
10118              bfd_vmatoa ("u", number), ent_size);
10119       return NULL;
10120     }
10121
10122   /* Be kind to memory checkers (eg valgrind, address sanitizer) by not
10123      attempting to allocate memory when the read is bound to fail.  */
10124   if (ent_size * number > filedata->file_size)
10125     {
10126       error (_("Invalid number of dynamic entries: %s\n"),
10127              bfd_vmatoa ("u", number));
10128       return NULL;
10129     }
10130
10131   e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
10132   if (e_data == NULL)
10133     {
10134       error (_("Out of memory reading %s dynamic entries\n"),
10135              bfd_vmatoa ("u", number));
10136       return NULL;
10137     }
10138
10139   if (fread (e_data, ent_size, (size_t) number, filedata->handle) != number)
10140     {
10141       error (_("Unable to read in %s bytes of dynamic data\n"),
10142              bfd_vmatoa ("u", number * ent_size));
10143       free (e_data);
10144       return NULL;
10145     }
10146
10147   i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
10148   if (i_data == NULL)
10149     {
10150       error (_("Out of memory allocating space for %s dynamic entries\n"),
10151              bfd_vmatoa ("u", number));
10152       free (e_data);
10153       return NULL;
10154     }
10155
10156   while (number--)
10157     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
10158
10159   free (e_data);
10160
10161   return i_data;
10162 }
10163
10164 static unsigned long
10165 get_num_dynamic_syms (Filedata * filedata)
10166 {
10167   unsigned long num_of_syms = 0;
10168
10169   if (!do_histogram && (!do_using_dynamic || do_dyn_syms))
10170     return num_of_syms;
10171
10172   if (filedata->dynamic_info[DT_HASH])
10173     {
10174       unsigned char nb[8];
10175       unsigned char nc[8];
10176       unsigned int hash_ent_size = 4;
10177
10178       if ((filedata->file_header.e_machine == EM_ALPHA
10179            || filedata->file_header.e_machine == EM_S390
10180            || filedata->file_header.e_machine == EM_S390_OLD)
10181           && filedata->file_header.e_ident[EI_CLASS] == ELFCLASS64)
10182         hash_ent_size = 8;
10183
10184       if (fseek (filedata->handle,
10185                  (filedata->archive_file_offset
10186                   + offset_from_vma (filedata, filedata->dynamic_info[DT_HASH],
10187                                      sizeof nb + sizeof nc)),
10188                  SEEK_SET))
10189         {
10190           error (_("Unable to seek to start of dynamic information\n"));
10191           goto no_hash;
10192         }
10193
10194       if (fread (nb, hash_ent_size, 1, filedata->handle) != 1)
10195         {
10196           error (_("Failed to read in number of buckets\n"));
10197           goto no_hash;
10198         }
10199
10200       if (fread (nc, hash_ent_size, 1, filedata->handle) != 1)
10201         {
10202           error (_("Failed to read in number of chains\n"));
10203           goto no_hash;
10204         }
10205
10206       filedata->nbuckets = byte_get (nb, hash_ent_size);
10207       filedata->nchains = byte_get (nc, hash_ent_size);
10208
10209       if (filedata->nbuckets != 0 && filedata->nchains != 0)
10210         {
10211           filedata->buckets = get_dynamic_data (filedata, filedata->nbuckets,
10212                                                 hash_ent_size);
10213           filedata->chains  = get_dynamic_data (filedata, filedata->nchains,
10214                                                 hash_ent_size);
10215
10216           if (filedata->buckets != NULL && filedata->chains != NULL)
10217             num_of_syms = filedata->nchains;
10218         }
10219     no_hash:
10220       if (num_of_syms == 0)
10221         {
10222           free (filedata->buckets);
10223           filedata->buckets = NULL;
10224           free (filedata->chains);
10225           filedata->chains = NULL;
10226           filedata->nbuckets = 0;
10227         }
10228     }
10229
10230   if (filedata->dynamic_info_DT_GNU_HASH)
10231     {
10232       unsigned char nb[16];
10233       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
10234       bfd_vma buckets_vma;
10235       unsigned long hn;
10236
10237       if (fseek (filedata->handle,
10238                  (filedata->archive_file_offset
10239                   + offset_from_vma (filedata,
10240                                      filedata->dynamic_info_DT_GNU_HASH,
10241                                      sizeof nb)),
10242                  SEEK_SET))
10243         {
10244           error (_("Unable to seek to start of dynamic information\n"));
10245           goto no_gnu_hash;
10246         }
10247
10248       if (fread (nb, 16, 1, filedata->handle) != 1)
10249         {
10250           error (_("Failed to read in number of buckets\n"));
10251           goto no_gnu_hash;
10252         }
10253
10254       filedata->ngnubuckets = byte_get (nb, 4);
10255       filedata->gnusymidx = byte_get (nb + 4, 4);
10256       bitmaskwords = byte_get (nb + 8, 4);
10257       buckets_vma = filedata->dynamic_info_DT_GNU_HASH + 16;
10258       if (is_32bit_elf)
10259         buckets_vma += bitmaskwords * 4;
10260       else
10261         buckets_vma += bitmaskwords * 8;
10262
10263       if (fseek (filedata->handle,
10264                  (filedata->archive_file_offset
10265                   + offset_from_vma (filedata, buckets_vma, 4)),
10266                  SEEK_SET))
10267         {
10268           error (_("Unable to seek to start of dynamic information\n"));
10269           goto no_gnu_hash;
10270         }
10271
10272       filedata->gnubuckets
10273         = get_dynamic_data (filedata, filedata->ngnubuckets, 4);
10274
10275       if (filedata->gnubuckets == NULL)
10276         goto no_gnu_hash;
10277
10278       for (i = 0; i < filedata->ngnubuckets; i++)
10279         if (filedata->gnubuckets[i] != 0)
10280           {
10281             if (filedata->gnubuckets[i] < filedata->gnusymidx)
10282               goto no_gnu_hash;
10283
10284             if (maxchain == 0xffffffff || filedata->gnubuckets[i] > maxchain)
10285               maxchain = filedata->gnubuckets[i];
10286           }
10287
10288       if (maxchain == 0xffffffff)
10289         goto no_gnu_hash;
10290
10291       maxchain -= filedata->gnusymidx;
10292
10293       if (fseek (filedata->handle,
10294                  (filedata->archive_file_offset
10295                   + offset_from_vma (filedata,
10296                                      buckets_vma + 4 * (filedata->ngnubuckets
10297                                                         + maxchain),
10298                                       4)),
10299                  SEEK_SET))
10300         {
10301           error (_("Unable to seek to start of dynamic information\n"));
10302           goto no_gnu_hash;
10303         }
10304
10305       do
10306         {
10307           if (fread (nb, 4, 1, filedata->handle) != 1)
10308             {
10309               error (_("Failed to determine last chain length\n"));
10310               goto no_gnu_hash;
10311             }
10312
10313           if (maxchain + 1 == 0)
10314             goto no_gnu_hash;
10315
10316           ++maxchain;
10317         }
10318       while ((byte_get (nb, 4) & 1) == 0);
10319
10320       if (fseek (filedata->handle,
10321                  (filedata->archive_file_offset
10322                   + offset_from_vma (filedata, (buckets_vma
10323                                                 + 4 * filedata->ngnubuckets),
10324                                      4)),
10325                  SEEK_SET))
10326         {
10327           error (_("Unable to seek to start of dynamic information\n"));
10328           goto no_gnu_hash;
10329         }
10330
10331       filedata->gnuchains = get_dynamic_data (filedata, maxchain, 4);
10332       filedata->ngnuchains = maxchain;
10333
10334       if (filedata->gnuchains == NULL)
10335         goto no_gnu_hash;
10336
10337       if (filedata->dynamic_info_DT_MIPS_XHASH)
10338         {
10339           if (fseek (filedata->handle,
10340                      (filedata->archive_file_offset
10341                       + offset_from_vma (filedata, (buckets_vma
10342                                                     + 4 * (filedata->ngnubuckets
10343                                                            + maxchain)), 4)),
10344                      SEEK_SET))
10345             {
10346               error (_("Unable to seek to start of dynamic information\n"));
10347               goto no_gnu_hash;
10348             }
10349
10350           filedata->mipsxlat = get_dynamic_data (filedata, maxchain, 4);
10351           if (filedata->mipsxlat == NULL)
10352             goto no_gnu_hash;
10353         }
10354
10355       for (hn = 0; hn < filedata->ngnubuckets; ++hn)
10356         if (filedata->gnubuckets[hn] != 0)
10357           {
10358             bfd_vma si = filedata->gnubuckets[hn];
10359             bfd_vma off = si - filedata->gnusymidx;
10360
10361             do
10362               {
10363                 if (filedata->dynamic_info_DT_MIPS_XHASH)
10364                   {
10365                     if (off < filedata->ngnuchains
10366                         && filedata->mipsxlat[off] >= num_of_syms)
10367                       num_of_syms = filedata->mipsxlat[off] + 1;
10368                   }
10369                 else
10370                   {
10371                     if (si >= num_of_syms)
10372                       num_of_syms = si + 1;
10373                   }
10374                 si++;
10375               }
10376             while (off < filedata->ngnuchains
10377                    && (filedata->gnuchains[off++] & 1) == 0);
10378           }
10379
10380       if (num_of_syms == 0)
10381         {
10382         no_gnu_hash:
10383           free (filedata->mipsxlat);
10384           filedata->mipsxlat = NULL;
10385           free (filedata->gnuchains);
10386           filedata->gnuchains = NULL;
10387           free (filedata->gnubuckets);
10388           filedata->gnubuckets = NULL;
10389           filedata->ngnubuckets = 0;
10390           filedata->ngnuchains = 0;
10391         }
10392     }
10393
10394   return num_of_syms;
10395 }
10396
10397 /* Parse and display the contents of the dynamic section.  */
10398
10399 static bfd_boolean
10400 process_dynamic_section (Filedata * filedata)
10401 {
10402   Elf_Internal_Dyn * entry;
10403
10404   if (filedata->dynamic_size == 0)
10405     {
10406       if (do_dynamic)
10407         printf (_("\nThere is no dynamic section in this file.\n"));
10408
10409       return TRUE;
10410     }
10411
10412   if (is_32bit_elf)
10413     {
10414       if (! get_32bit_dynamic_section (filedata))
10415         return FALSE;
10416     }
10417   else
10418     {
10419       if (! get_64bit_dynamic_section (filedata))
10420         return FALSE;
10421     }
10422
10423   /* Find the appropriate symbol table.  */
10424   if (filedata->dynamic_symbols == NULL || do_histogram)
10425     {
10426       unsigned long num_of_syms;
10427
10428       for (entry = filedata->dynamic_section;
10429            entry < filedata->dynamic_section + filedata->dynamic_nent;
10430            ++entry)
10431         if (entry->d_tag == DT_SYMTAB)
10432           filedata->dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
10433         else if (entry->d_tag == DT_SYMENT)
10434           filedata->dynamic_info[DT_SYMENT] = entry->d_un.d_val;
10435         else if (entry->d_tag == DT_HASH)
10436           filedata->dynamic_info[DT_HASH] = entry->d_un.d_val;
10437         else if (entry->d_tag == DT_GNU_HASH)
10438           filedata->dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
10439         else if ((filedata->file_header.e_machine == EM_MIPS
10440                   || filedata->file_header.e_machine == EM_MIPS_RS3_LE)
10441                  && entry->d_tag == DT_MIPS_XHASH)
10442           {
10443             filedata->dynamic_info_DT_MIPS_XHASH = entry->d_un.d_val;
10444             filedata->dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
10445           }
10446
10447       num_of_syms = get_num_dynamic_syms (filedata);
10448
10449       if (num_of_syms != 0
10450           && filedata->dynamic_symbols == NULL
10451           && filedata->dynamic_info[DT_SYMTAB]
10452           && filedata->dynamic_info[DT_SYMENT])
10453         {
10454           Elf_Internal_Phdr *seg;
10455           bfd_vma vma = filedata->dynamic_info[DT_SYMTAB];
10456
10457           if (! get_program_headers (filedata))
10458             {
10459               error (_("Cannot interpret virtual addresses "
10460                        "without program headers.\n"));
10461               return FALSE;
10462             }
10463
10464           for (seg = filedata->program_headers;
10465                seg < filedata->program_headers + filedata->file_header.e_phnum;
10466                ++seg)
10467             {
10468               if (seg->p_type != PT_LOAD)
10469                 continue;
10470
10471               if (seg->p_offset + seg->p_filesz > filedata->file_size)
10472                 {
10473                   /* See PR 21379 for a reproducer.  */
10474                   error (_("Invalid PT_LOAD entry\n"));
10475                   return FALSE;
10476                 }
10477
10478               if (vma >= (seg->p_vaddr & -seg->p_align)
10479                   && vma < seg->p_vaddr + seg->p_filesz)
10480                 {
10481                   /* Since we do not know how big the symbol table is,
10482                      we default to reading in up to the end of PT_LOAD
10483                      segment and processing that.  This is overkill, I
10484                      know, but it should work.  */
10485                   Elf_Internal_Shdr section;
10486                   section.sh_offset = (vma - seg->p_vaddr
10487                                        + seg->p_offset);
10488                   section.sh_size = (num_of_syms
10489                                      * filedata->dynamic_info[DT_SYMENT]);
10490                   section.sh_entsize = filedata->dynamic_info[DT_SYMENT];
10491
10492                   if (do_checks
10493                       && filedata->dynamic_symtab_section != NULL
10494                       && ((filedata->dynamic_symtab_section->sh_offset
10495                            != section.sh_offset)
10496                           || (filedata->dynamic_symtab_section->sh_size
10497                               != section.sh_size)
10498                           || (filedata->dynamic_symtab_section->sh_entsize
10499                               != section.sh_entsize)))
10500                     warn (_("\
10501 the .dynsym section doesn't match the DT_SYMTAB and DT_SYMENT tags\n"));
10502
10503                   section.sh_name = filedata->string_table_length;
10504                   filedata->dynamic_symbols
10505                     = GET_ELF_SYMBOLS (filedata, &section,
10506                                        &filedata->num_dynamic_syms);
10507                   if (filedata->dynamic_symbols == NULL
10508                       || filedata->num_dynamic_syms != num_of_syms)
10509                     {
10510                       error (_("Corrupt DT_SYMTAB dynamic entry\n"));
10511                       return FALSE;
10512                     }
10513                   break;
10514                 }
10515             }
10516         }
10517     }
10518
10519   /* Similarly find a string table.  */
10520   if (filedata->dynamic_strings == NULL)
10521     for (entry = filedata->dynamic_section;
10522          entry < filedata->dynamic_section + filedata->dynamic_nent;
10523          ++entry)
10524       {
10525         if (entry->d_tag == DT_STRTAB)
10526           filedata->dynamic_info[DT_STRTAB] = entry->d_un.d_val;
10527
10528         if (entry->d_tag == DT_STRSZ)
10529           filedata->dynamic_info[DT_STRSZ] = entry->d_un.d_val;
10530
10531         if (filedata->dynamic_info[DT_STRTAB]
10532             && filedata->dynamic_info[DT_STRSZ])
10533           {
10534             unsigned long offset;
10535             bfd_size_type str_tab_len = filedata->dynamic_info[DT_STRSZ];
10536
10537             offset = offset_from_vma (filedata,
10538                                       filedata->dynamic_info[DT_STRTAB],
10539                                       str_tab_len);
10540             if (do_checks
10541                 && filedata->dynamic_strtab_section
10542                 && ((filedata->dynamic_strtab_section->sh_offset
10543                      != (file_ptr) offset)
10544                     || (filedata->dynamic_strtab_section->sh_size
10545                         != str_tab_len)))
10546               warn (_("\
10547 the .dynstr section doesn't match the DT_STRTAB and DT_STRSZ tags\n"));
10548
10549             filedata->dynamic_strings
10550               = (char *) get_data (NULL, filedata, offset, 1, str_tab_len,
10551                                    _("dynamic string table"));
10552             if (filedata->dynamic_strings == NULL)
10553               {
10554                 error (_("Corrupt DT_STRTAB dynamic entry\n"));
10555                 break;
10556               }
10557
10558             filedata->dynamic_strings_length = str_tab_len;
10559             break;
10560           }
10561       }
10562
10563   /* And find the syminfo section if available.  */
10564   if (filedata->dynamic_syminfo == NULL)
10565     {
10566       unsigned long syminsz = 0;
10567
10568       for (entry = filedata->dynamic_section;
10569            entry < filedata->dynamic_section + filedata->dynamic_nent;
10570            ++entry)
10571         {
10572           if (entry->d_tag == DT_SYMINENT)
10573             {
10574               /* Note: these braces are necessary to avoid a syntax
10575                  error from the SunOS4 C compiler.  */
10576               /* PR binutils/17531: A corrupt file can trigger this test.
10577                  So do not use an assert, instead generate an error message.  */
10578               if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
10579                 error (_("Bad value (%d) for SYMINENT entry\n"),
10580                        (int) entry->d_un.d_val);
10581             }
10582           else if (entry->d_tag == DT_SYMINSZ)
10583             syminsz = entry->d_un.d_val;
10584           else if (entry->d_tag == DT_SYMINFO)
10585             filedata->dynamic_syminfo_offset
10586               = offset_from_vma (filedata, entry->d_un.d_val, syminsz);
10587         }
10588
10589       if (filedata->dynamic_syminfo_offset != 0 && syminsz != 0)
10590         {
10591           Elf_External_Syminfo * extsyminfo;
10592           Elf_External_Syminfo * extsym;
10593           Elf_Internal_Syminfo * syminfo;
10594
10595           /* There is a syminfo section.  Read the data.  */
10596           extsyminfo = (Elf_External_Syminfo *)
10597             get_data (NULL, filedata, filedata->dynamic_syminfo_offset,
10598                       1, syminsz, _("symbol information"));
10599           if (!extsyminfo)
10600             return FALSE;
10601
10602           if (filedata->dynamic_syminfo != NULL)
10603             {
10604               error (_("Multiple dynamic symbol information sections found\n"));
10605               free (filedata->dynamic_syminfo);
10606             }
10607           filedata->dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
10608           if (filedata->dynamic_syminfo == NULL)
10609             {
10610               error (_("Out of memory allocating %lu bytes "
10611                        "for dynamic symbol info\n"),
10612                      (unsigned long) syminsz);
10613               return FALSE;
10614             }
10615
10616           filedata->dynamic_syminfo_nent
10617             = syminsz / sizeof (Elf_External_Syminfo);
10618           for (syminfo = filedata->dynamic_syminfo, extsym = extsyminfo;
10619                syminfo < (filedata->dynamic_syminfo
10620                           + filedata->dynamic_syminfo_nent);
10621                ++syminfo, ++extsym)
10622             {
10623               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
10624               syminfo->si_flags = BYTE_GET (extsym->si_flags);
10625             }
10626
10627           free (extsyminfo);
10628         }
10629     }
10630
10631   if (do_dynamic && filedata->dynamic_addr)
10632     printf (ngettext ("\nDynamic section at offset 0x%lx "
10633                       "contains %lu entry:\n",
10634                       "\nDynamic section at offset 0x%lx "
10635                       "contains %lu entries:\n",
10636                       filedata->dynamic_nent),
10637             filedata->dynamic_addr, (unsigned long) filedata->dynamic_nent);
10638   if (do_dynamic)
10639     printf (_("  Tag        Type                         Name/Value\n"));
10640
10641   for (entry = filedata->dynamic_section;
10642        entry < filedata->dynamic_section + filedata->dynamic_nent;
10643        entry++)
10644     {
10645       if (do_dynamic)
10646         {
10647           const char * dtype;
10648
10649           putchar (' ');
10650           print_vma (entry->d_tag, FULL_HEX);
10651           dtype = get_dynamic_type (filedata, entry->d_tag);
10652           printf (" (%s)%*s", dtype,
10653                   ((is_32bit_elf ? 27 : 19) - (int) strlen (dtype)), " ");
10654         }
10655
10656       switch (entry->d_tag)
10657         {
10658         case DT_FLAGS:
10659           if (do_dynamic)
10660             print_dynamic_flags (entry->d_un.d_val);
10661           break;
10662
10663         case DT_AUXILIARY:
10664         case DT_FILTER:
10665         case DT_CONFIG:
10666         case DT_DEPAUDIT:
10667         case DT_AUDIT:
10668           if (do_dynamic)
10669             {
10670               switch (entry->d_tag)
10671                 {
10672                 case DT_AUXILIARY:
10673                   printf (_("Auxiliary library"));
10674                   break;
10675
10676                 case DT_FILTER:
10677                   printf (_("Filter library"));
10678                   break;
10679
10680                 case DT_CONFIG:
10681                   printf (_("Configuration file"));
10682                   break;
10683
10684                 case DT_DEPAUDIT:
10685                   printf (_("Dependency audit library"));
10686                   break;
10687
10688                 case DT_AUDIT:
10689                   printf (_("Audit library"));
10690                   break;
10691                 }
10692
10693               if (VALID_DYNAMIC_NAME (filedata, entry->d_un.d_val))
10694                 printf (": [%s]\n",
10695                         GET_DYNAMIC_NAME (filedata, entry->d_un.d_val));
10696               else
10697                 {
10698                   printf (": ");
10699                   print_vma (entry->d_un.d_val, PREFIX_HEX);
10700                   putchar ('\n');
10701                 }
10702             }
10703           break;
10704
10705         case DT_FEATURE:
10706           if (do_dynamic)
10707             {
10708               printf (_("Flags:"));
10709
10710               if (entry->d_un.d_val == 0)
10711                 printf (_(" None\n"));
10712               else
10713                 {
10714                   unsigned long int val = entry->d_un.d_val;
10715
10716                   if (val & DTF_1_PARINIT)
10717                     {
10718                       printf (" PARINIT");
10719                       val ^= DTF_1_PARINIT;
10720                     }
10721                   if (val & DTF_1_CONFEXP)
10722                     {
10723                       printf (" CONFEXP");
10724                       val ^= DTF_1_CONFEXP;
10725                     }
10726                   if (val != 0)
10727                     printf (" %lx", val);
10728                   puts ("");
10729                 }
10730             }
10731           break;
10732
10733         case DT_POSFLAG_1:
10734           if (do_dynamic)
10735             {
10736               printf (_("Flags:"));
10737
10738               if (entry->d_un.d_val == 0)
10739                 printf (_(" None\n"));
10740               else
10741                 {
10742                   unsigned long int val = entry->d_un.d_val;
10743
10744                   if (val & DF_P1_LAZYLOAD)
10745                     {
10746                       printf (" LAZYLOAD");
10747                       val ^= DF_P1_LAZYLOAD;
10748                     }
10749                   if (val & DF_P1_GROUPPERM)
10750                     {
10751                       printf (" GROUPPERM");
10752                       val ^= DF_P1_GROUPPERM;
10753                     }
10754                   if (val != 0)
10755                     printf (" %lx", val);
10756                   puts ("");
10757                 }
10758             }
10759           break;
10760
10761         case DT_FLAGS_1:
10762           if (do_dynamic)
10763             {
10764               printf (_("Flags:"));
10765               if (entry->d_un.d_val == 0)
10766                 printf (_(" None\n"));
10767               else
10768                 {
10769                   unsigned long int val = entry->d_un.d_val;
10770
10771                   if (val & DF_1_NOW)
10772                     {
10773                       printf (" NOW");
10774                       val ^= DF_1_NOW;
10775                     }
10776                   if (val & DF_1_GLOBAL)
10777                     {
10778                       printf (" GLOBAL");
10779                       val ^= DF_1_GLOBAL;
10780                     }
10781                   if (val & DF_1_GROUP)
10782                     {
10783                       printf (" GROUP");
10784                       val ^= DF_1_GROUP;
10785                     }
10786                   if (val & DF_1_NODELETE)
10787                     {
10788                       printf (" NODELETE");
10789                       val ^= DF_1_NODELETE;
10790                     }
10791                   if (val & DF_1_LOADFLTR)
10792                     {
10793                       printf (" LOADFLTR");
10794                       val ^= DF_1_LOADFLTR;
10795                     }
10796                   if (val & DF_1_INITFIRST)
10797                     {
10798                       printf (" INITFIRST");
10799                       val ^= DF_1_INITFIRST;
10800                     }
10801                   if (val & DF_1_NOOPEN)
10802                     {
10803                       printf (" NOOPEN");
10804                       val ^= DF_1_NOOPEN;
10805                     }
10806                   if (val & DF_1_ORIGIN)
10807                     {
10808                       printf (" ORIGIN");
10809                       val ^= DF_1_ORIGIN;
10810                     }
10811                   if (val & DF_1_DIRECT)
10812                     {
10813                       printf (" DIRECT");
10814                       val ^= DF_1_DIRECT;
10815                     }
10816                   if (val & DF_1_TRANS)
10817                     {
10818                       printf (" TRANS");
10819                       val ^= DF_1_TRANS;
10820                     }
10821                   if (val & DF_1_INTERPOSE)
10822                     {
10823                       printf (" INTERPOSE");
10824                       val ^= DF_1_INTERPOSE;
10825                     }
10826                   if (val & DF_1_NODEFLIB)
10827                     {
10828                       printf (" NODEFLIB");
10829                       val ^= DF_1_NODEFLIB;
10830                     }
10831                   if (val & DF_1_NODUMP)
10832                     {
10833                       printf (" NODUMP");
10834                       val ^= DF_1_NODUMP;
10835                     }
10836                   if (val & DF_1_CONFALT)
10837                     {
10838                       printf (" CONFALT");
10839                       val ^= DF_1_CONFALT;
10840                     }
10841                   if (val & DF_1_ENDFILTEE)
10842                     {
10843                       printf (" ENDFILTEE");
10844                       val ^= DF_1_ENDFILTEE;
10845                     }
10846                   if (val & DF_1_DISPRELDNE)
10847                     {
10848                       printf (" DISPRELDNE");
10849                       val ^= DF_1_DISPRELDNE;
10850                     }
10851                   if (val & DF_1_DISPRELPND)
10852                     {
10853                       printf (" DISPRELPND");
10854                       val ^= DF_1_DISPRELPND;
10855                     }
10856                   if (val & DF_1_NODIRECT)
10857                     {
10858                       printf (" NODIRECT");
10859                       val ^= DF_1_NODIRECT;
10860                     }
10861                   if (val & DF_1_IGNMULDEF)
10862                     {
10863                       printf (" IGNMULDEF");
10864                       val ^= DF_1_IGNMULDEF;
10865                     }
10866                   if (val & DF_1_NOKSYMS)
10867                     {
10868                       printf (" NOKSYMS");
10869                       val ^= DF_1_NOKSYMS;
10870                     }
10871                   if (val & DF_1_NOHDR)
10872                     {
10873                       printf (" NOHDR");
10874                       val ^= DF_1_NOHDR;
10875                     }
10876                   if (val & DF_1_EDITED)
10877                     {
10878                       printf (" EDITED");
10879                       val ^= DF_1_EDITED;
10880                     }
10881                   if (val & DF_1_NORELOC)
10882                     {
10883                       printf (" NORELOC");
10884                       val ^= DF_1_NORELOC;
10885                     }
10886                   if (val & DF_1_SYMINTPOSE)
10887                     {
10888                       printf (" SYMINTPOSE");
10889                       val ^= DF_1_SYMINTPOSE;
10890                     }
10891                   if (val & DF_1_GLOBAUDIT)
10892                     {
10893                       printf (" GLOBAUDIT");
10894                       val ^= DF_1_GLOBAUDIT;
10895                     }
10896                   if (val & DF_1_SINGLETON)
10897                     {
10898                       printf (" SINGLETON");
10899                       val ^= DF_1_SINGLETON;
10900                     }
10901                   if (val & DF_1_STUB)
10902                     {
10903                       printf (" STUB");
10904                       val ^= DF_1_STUB;
10905                     }
10906                   if (val & DF_1_PIE)
10907                     {
10908                       printf (" PIE");
10909                       val ^= DF_1_PIE;
10910                     }
10911                   if (val & DF_1_KMOD)
10912                     {
10913                       printf (" KMOD");
10914                       val ^= DF_1_KMOD;
10915                     }
10916                   if (val & DF_1_WEAKFILTER)
10917                     {
10918                       printf (" WEAKFILTER");
10919                       val ^= DF_1_WEAKFILTER;
10920                     }
10921                   if (val & DF_1_NOCOMMON)
10922                     {
10923                       printf (" NOCOMMON");
10924                       val ^= DF_1_NOCOMMON;
10925                     }
10926                   if (val != 0)
10927                     printf (" %lx", val);
10928                   puts ("");
10929                 }
10930             }
10931           break;
10932
10933         case DT_PLTREL:
10934           filedata->dynamic_info[entry->d_tag] = entry->d_un.d_val;
10935           if (do_dynamic)
10936             puts (get_dynamic_type (filedata, entry->d_un.d_val));
10937           break;
10938
10939         case DT_NULL    :
10940         case DT_NEEDED  :
10941         case DT_PLTGOT  :
10942         case DT_HASH    :
10943         case DT_STRTAB  :
10944         case DT_SYMTAB  :
10945         case DT_RELA    :
10946         case DT_INIT    :
10947         case DT_FINI    :
10948         case DT_SONAME  :
10949         case DT_RPATH   :
10950         case DT_SYMBOLIC:
10951         case DT_REL     :
10952         case DT_DEBUG   :
10953         case DT_TEXTREL :
10954         case DT_JMPREL  :
10955         case DT_RUNPATH :
10956           filedata->dynamic_info[entry->d_tag] = entry->d_un.d_val;
10957
10958           if (do_dynamic)
10959             {
10960               char * name;
10961
10962               if (VALID_DYNAMIC_NAME (filedata, entry->d_un.d_val))
10963                 name = GET_DYNAMIC_NAME (filedata, entry->d_un.d_val);
10964               else
10965                 name = NULL;
10966
10967               if (name)
10968                 {
10969                   switch (entry->d_tag)
10970                     {
10971                     case DT_NEEDED:
10972                       printf (_("Shared library: [%s]"), name);
10973
10974                       if (streq (name, filedata->program_interpreter))
10975                         printf (_(" program interpreter"));
10976                       break;
10977
10978                     case DT_SONAME:
10979                       printf (_("Library soname: [%s]"), name);
10980                       break;
10981
10982                     case DT_RPATH:
10983                       printf (_("Library rpath: [%s]"), name);
10984                       break;
10985
10986                     case DT_RUNPATH:
10987                       printf (_("Library runpath: [%s]"), name);
10988                       break;
10989
10990                     default:
10991                       print_vma (entry->d_un.d_val, PREFIX_HEX);
10992                       break;
10993                     }
10994                 }
10995               else
10996                 print_vma (entry->d_un.d_val, PREFIX_HEX);
10997
10998               putchar ('\n');
10999             }
11000           break;
11001
11002         case DT_PLTRELSZ:
11003         case DT_RELASZ  :
11004         case DT_STRSZ   :
11005         case DT_RELSZ   :
11006         case DT_RELAENT :
11007         case DT_SYMENT  :
11008         case DT_RELENT  :
11009           filedata->dynamic_info[entry->d_tag] = entry->d_un.d_val;
11010           /* Fall through.  */
11011         case DT_PLTPADSZ:
11012         case DT_MOVEENT :
11013         case DT_MOVESZ  :
11014         case DT_INIT_ARRAYSZ:
11015         case DT_FINI_ARRAYSZ:
11016         case DT_GNU_CONFLICTSZ:
11017         case DT_GNU_LIBLISTSZ:
11018           if (do_dynamic)
11019             {
11020               print_vma (entry->d_un.d_val, UNSIGNED);
11021               printf (_(" (bytes)\n"));
11022             }
11023           break;
11024
11025         case DT_VERDEFNUM:
11026         case DT_VERNEEDNUM:
11027         case DT_RELACOUNT:
11028         case DT_RELCOUNT:
11029           if (do_dynamic)
11030             {
11031               print_vma (entry->d_un.d_val, UNSIGNED);
11032               putchar ('\n');
11033             }
11034           break;
11035
11036         case DT_SYMINSZ:
11037         case DT_SYMINENT:
11038         case DT_SYMINFO:
11039         case DT_USED:
11040         case DT_INIT_ARRAY:
11041         case DT_FINI_ARRAY:
11042           if (do_dynamic)
11043             {
11044               if (entry->d_tag == DT_USED
11045                   && VALID_DYNAMIC_NAME (filedata, entry->d_un.d_val))
11046                 {
11047                   char * name = GET_DYNAMIC_NAME (filedata, entry->d_un.d_val);
11048
11049                   if (*name)
11050                     {
11051                       printf (_("Not needed object: [%s]\n"), name);
11052                       break;
11053                     }
11054                 }
11055
11056               print_vma (entry->d_un.d_val, PREFIX_HEX);
11057               putchar ('\n');
11058             }
11059           break;
11060
11061         case DT_BIND_NOW:
11062           /* The value of this entry is ignored.  */
11063           if (do_dynamic)
11064             putchar ('\n');
11065           break;
11066
11067         case DT_GNU_PRELINKED:
11068           if (do_dynamic)
11069             {
11070               struct tm * tmp;
11071               time_t atime = entry->d_un.d_val;
11072
11073               tmp = gmtime (&atime);
11074               /* PR 17533 file: 041-1244816-0.004.  */
11075               if (tmp == NULL)
11076                 printf (_("<corrupt time val: %lx"),
11077                         (unsigned long) atime);
11078               else
11079                 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
11080                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
11081                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
11082
11083             }
11084           break;
11085
11086         case DT_GNU_HASH:
11087           filedata->dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
11088           if (do_dynamic)
11089             {
11090               print_vma (entry->d_un.d_val, PREFIX_HEX);
11091               putchar ('\n');
11092             }
11093           break;
11094
11095         case DT_GNU_FLAGS_1:
11096           if (do_dynamic)
11097             {
11098               printf (_("Flags:"));
11099               if (entry->d_un.d_val == 0)
11100                 printf (_(" None\n"));
11101               else
11102                 {
11103                   unsigned long int val = entry->d_un.d_val;
11104
11105                   if (val & DF_GNU_1_UNIQUE)
11106                     {
11107                       printf (" UNIQUE");
11108                       val ^= DF_GNU_1_UNIQUE;
11109                     }
11110                   if (val != 0)
11111                     printf (" %lx", val);
11112                   puts ("");
11113                 }
11114             }
11115           break;
11116
11117         default:
11118           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
11119             filedata->version_info[DT_VERSIONTAGIDX (entry->d_tag)]
11120               = entry->d_un.d_val;
11121
11122           if (do_dynamic)
11123             {
11124               switch (filedata->file_header.e_machine)
11125                 {
11126                 case EM_AARCH64:
11127                   dynamic_section_aarch64_val (entry);
11128                   break;
11129                 case EM_MIPS:
11130                 case EM_MIPS_RS3_LE:
11131                   dynamic_section_mips_val (filedata, entry);
11132                   break;
11133                 case EM_PARISC:
11134                   dynamic_section_parisc_val (entry);
11135                   break;
11136                 case EM_IA_64:
11137                   dynamic_section_ia64_val (entry);
11138                   break;
11139                 default:
11140                   print_vma (entry->d_un.d_val, PREFIX_HEX);
11141                   putchar ('\n');
11142                 }
11143             }
11144           break;
11145         }
11146     }
11147
11148   return TRUE;
11149 }
11150
11151 static char *
11152 get_ver_flags (unsigned int flags)
11153 {
11154   static char buff[128];
11155
11156   buff[0] = 0;
11157
11158   if (flags == 0)
11159     return _("none");
11160
11161   if (flags & VER_FLG_BASE)
11162     strcat (buff, "BASE");
11163
11164   if (flags & VER_FLG_WEAK)
11165     {
11166       if (flags & VER_FLG_BASE)
11167         strcat (buff, " | ");
11168
11169       strcat (buff, "WEAK");
11170     }
11171
11172   if (flags & VER_FLG_INFO)
11173     {
11174       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
11175         strcat (buff, " | ");
11176
11177       strcat (buff, "INFO");
11178     }
11179
11180   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
11181     {
11182       if (flags & (VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
11183         strcat (buff, " | ");
11184
11185       strcat (buff, _("<unknown>"));
11186     }
11187
11188   return buff;
11189 }
11190
11191 /* Display the contents of the version sections.  */
11192
11193 static bfd_boolean
11194 process_version_sections (Filedata * filedata)
11195 {
11196   Elf_Internal_Shdr * section;
11197   unsigned i;
11198   bfd_boolean found = FALSE;
11199
11200   if (! do_version)
11201     return TRUE;
11202
11203   for (i = 0, section = filedata->section_headers;
11204        i < filedata->file_header.e_shnum;
11205        i++, section++)
11206     {
11207       switch (section->sh_type)
11208         {
11209         case SHT_GNU_verdef:
11210           {
11211             Elf_External_Verdef * edefs;
11212             unsigned long idx;
11213             unsigned long cnt;
11214             char * endbuf;
11215
11216             found = TRUE;
11217
11218             printf (ngettext ("\nVersion definition section '%s' "
11219                               "contains %u entry:\n",
11220                               "\nVersion definition section '%s' "
11221                               "contains %u entries:\n",
11222                               section->sh_info),
11223                     printable_section_name (filedata, section),
11224                     section->sh_info);
11225
11226             printf (_(" Addr: 0x"));
11227             printf_vma (section->sh_addr);
11228             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
11229                     (unsigned long) section->sh_offset, section->sh_link,
11230                     printable_section_name_from_index (filedata, section->sh_link));
11231
11232             edefs = (Elf_External_Verdef *)
11233                 get_data (NULL, filedata, section->sh_offset, 1,section->sh_size,
11234                           _("version definition section"));
11235             if (!edefs)
11236               break;
11237             endbuf = (char *) edefs + section->sh_size;
11238
11239             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
11240               {
11241                 char * vstart;
11242                 Elf_External_Verdef * edef;
11243                 Elf_Internal_Verdef ent;
11244                 Elf_External_Verdaux * eaux;
11245                 Elf_Internal_Verdaux aux;
11246                 unsigned long isum;
11247                 int j;
11248
11249                 vstart = ((char *) edefs) + idx;
11250                 if (vstart + sizeof (*edef) > endbuf)
11251                   break;
11252
11253                 edef = (Elf_External_Verdef *) vstart;
11254
11255                 ent.vd_version = BYTE_GET (edef->vd_version);
11256                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
11257                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
11258                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
11259                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
11260                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
11261                 ent.vd_next    = BYTE_GET (edef->vd_next);
11262
11263                 printf (_("  %#06lx: Rev: %d  Flags: %s"),
11264                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
11265
11266                 printf (_("  Index: %d  Cnt: %d  "),
11267                         ent.vd_ndx, ent.vd_cnt);
11268
11269                 /* Check for overflow.  */
11270                 if (ent.vd_aux > (size_t) (endbuf - vstart))
11271                   break;
11272
11273                 vstart += ent.vd_aux;
11274
11275                 if (vstart + sizeof (*eaux) > endbuf)
11276                   break;
11277                 eaux = (Elf_External_Verdaux *) vstart;
11278
11279                 aux.vda_name = BYTE_GET (eaux->vda_name);
11280                 aux.vda_next = BYTE_GET (eaux->vda_next);
11281
11282                 if (VALID_DYNAMIC_NAME (filedata, aux.vda_name))
11283                   printf (_("Name: %s\n"),
11284                           GET_DYNAMIC_NAME (filedata, aux.vda_name));
11285                 else
11286                   printf (_("Name index: %ld\n"), aux.vda_name);
11287
11288                 isum = idx + ent.vd_aux;
11289
11290                 for (j = 1; j < ent.vd_cnt; j++)
11291                   {
11292                     if (aux.vda_next < sizeof (*eaux)
11293                         && !(j == ent.vd_cnt - 1 && aux.vda_next == 0))
11294                       {
11295                         warn (_("Invalid vda_next field of %lx\n"),
11296                               aux.vda_next);
11297                         j = ent.vd_cnt;
11298                         break;
11299                       }
11300                     /* Check for overflow.  */
11301                     if (aux.vda_next > (size_t) (endbuf - vstart))
11302                       break;
11303
11304                     isum   += aux.vda_next;
11305                     vstart += aux.vda_next;
11306
11307                     if (vstart + sizeof (*eaux) > endbuf)
11308                       break;
11309                     eaux = (Elf_External_Verdaux *) vstart;
11310
11311                     aux.vda_name = BYTE_GET (eaux->vda_name);
11312                     aux.vda_next = BYTE_GET (eaux->vda_next);
11313
11314                     if (VALID_DYNAMIC_NAME (filedata, aux.vda_name))
11315                       printf (_("  %#06lx: Parent %d: %s\n"),
11316                               isum, j,
11317                               GET_DYNAMIC_NAME (filedata, aux.vda_name));
11318                     else
11319                       printf (_("  %#06lx: Parent %d, name index: %ld\n"),
11320                               isum, j, aux.vda_name);
11321                   }
11322
11323                 if (j < ent.vd_cnt)
11324                   printf (_("  Version def aux past end of section\n"));
11325
11326                 /* PR 17531:
11327                    file: id:000001,src:000172+005151,op:splice,rep:2.  */
11328                 if (ent.vd_next < sizeof (*edef)
11329                     && !(cnt == section->sh_info - 1 && ent.vd_next == 0))
11330                   {
11331                     warn (_("Invalid vd_next field of %lx\n"), ent.vd_next);
11332                     cnt = section->sh_info;
11333                     break;
11334                   }
11335                 if (ent.vd_next > (size_t) (endbuf - ((char *) edefs + idx)))
11336                   break;
11337
11338                 idx += ent.vd_next;
11339               }
11340
11341             if (cnt < section->sh_info)
11342               printf (_("  Version definition past end of section\n"));
11343
11344             free (edefs);
11345           }
11346           break;
11347
11348         case SHT_GNU_verneed:
11349           {
11350             Elf_External_Verneed * eneed;
11351             unsigned long idx;
11352             unsigned long cnt;
11353             char * endbuf;
11354
11355             found = TRUE;
11356
11357             printf (ngettext ("\nVersion needs section '%s' "
11358                               "contains %u entry:\n",
11359                               "\nVersion needs section '%s' "
11360                               "contains %u entries:\n",
11361                               section->sh_info),
11362                     printable_section_name (filedata, section), section->sh_info);
11363
11364             printf (_(" Addr: 0x"));
11365             printf_vma (section->sh_addr);
11366             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
11367                     (unsigned long) section->sh_offset, section->sh_link,
11368                     printable_section_name_from_index (filedata, section->sh_link));
11369
11370             eneed = (Elf_External_Verneed *) get_data (NULL, filedata,
11371                                                        section->sh_offset, 1,
11372                                                        section->sh_size,
11373                                                        _("Version Needs section"));
11374             if (!eneed)
11375               break;
11376             endbuf = (char *) eneed + section->sh_size;
11377
11378             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
11379               {
11380                 Elf_External_Verneed * entry;
11381                 Elf_Internal_Verneed ent;
11382                 unsigned long isum;
11383                 int j;
11384                 char * vstart;
11385
11386                 vstart = ((char *) eneed) + idx;
11387                 if (vstart + sizeof (*entry) > endbuf)
11388                   break;
11389
11390                 entry = (Elf_External_Verneed *) vstart;
11391
11392                 ent.vn_version = BYTE_GET (entry->vn_version);
11393                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
11394                 ent.vn_file    = BYTE_GET (entry->vn_file);
11395                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
11396                 ent.vn_next    = BYTE_GET (entry->vn_next);
11397
11398                 printf (_("  %#06lx: Version: %d"), idx, ent.vn_version);
11399
11400                 if (VALID_DYNAMIC_NAME (filedata, ent.vn_file))
11401                   printf (_("  File: %s"),
11402                           GET_DYNAMIC_NAME (filedata, ent.vn_file));
11403                 else
11404                   printf (_("  File: %lx"), ent.vn_file);
11405
11406                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
11407
11408                 /* Check for overflow.  */
11409                 if (ent.vn_aux > (size_t) (endbuf - vstart))
11410                   break;
11411                 vstart += ent.vn_aux;
11412
11413                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
11414                   {
11415                     Elf_External_Vernaux * eaux;
11416                     Elf_Internal_Vernaux aux;
11417
11418                     if (vstart + sizeof (*eaux) > endbuf)
11419                       break;
11420                     eaux = (Elf_External_Vernaux *) vstart;
11421
11422                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
11423                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
11424                     aux.vna_other = BYTE_GET (eaux->vna_other);
11425                     aux.vna_name  = BYTE_GET (eaux->vna_name);
11426                     aux.vna_next  = BYTE_GET (eaux->vna_next);
11427
11428                     if (VALID_DYNAMIC_NAME (filedata, aux.vna_name))
11429                       printf (_("  %#06lx:   Name: %s"),
11430                               isum, GET_DYNAMIC_NAME (filedata, aux.vna_name));
11431                     else
11432                       printf (_("  %#06lx:   Name index: %lx"),
11433                               isum, aux.vna_name);
11434
11435                     printf (_("  Flags: %s  Version: %d\n"),
11436                             get_ver_flags (aux.vna_flags), aux.vna_other);
11437
11438                     if (aux.vna_next < sizeof (*eaux)
11439                         && !(j == ent.vn_cnt - 1 && aux.vna_next == 0))
11440                       {
11441                         warn (_("Invalid vna_next field of %lx\n"),
11442                               aux.vna_next);
11443                         j = ent.vn_cnt;
11444                         break;
11445                       }
11446                     /* Check for overflow.  */
11447                     if (aux.vna_next > (size_t) (endbuf - vstart))
11448                       break;
11449                     isum   += aux.vna_next;
11450                     vstart += aux.vna_next;
11451                   }
11452
11453                 if (j < ent.vn_cnt)
11454                   warn (_("Missing Version Needs auxillary information\n"));
11455
11456                 if (ent.vn_next < sizeof (*entry)
11457                     && !(cnt == section->sh_info - 1 && ent.vn_next == 0))
11458                   {
11459                     warn (_("Invalid vn_next field of %lx\n"), ent.vn_next);
11460                     cnt = section->sh_info;
11461                     break;
11462                   }
11463                 if (ent.vn_next > (size_t) (endbuf - ((char *) eneed + idx)))
11464                   break;
11465                 idx += ent.vn_next;
11466               }
11467
11468             if (cnt < section->sh_info)
11469               warn (_("Missing Version Needs information\n"));
11470
11471             free (eneed);
11472           }
11473           break;
11474
11475         case SHT_GNU_versym:
11476           {
11477             Elf_Internal_Shdr * link_section;
11478             size_t total;
11479             unsigned int cnt;
11480             unsigned char * edata;
11481             unsigned short * data;
11482             char * strtab;
11483             Elf_Internal_Sym * symbols;
11484             Elf_Internal_Shdr * string_sec;
11485             unsigned long num_syms;
11486             long off;
11487
11488             if (section->sh_link >= filedata->file_header.e_shnum)
11489               break;
11490
11491             link_section = filedata->section_headers + section->sh_link;
11492             total = section->sh_size / sizeof (Elf_External_Versym);
11493
11494             if (link_section->sh_link >= filedata->file_header.e_shnum)
11495               break;
11496
11497             found = TRUE;
11498
11499             symbols = GET_ELF_SYMBOLS (filedata, link_section, & num_syms);
11500             if (symbols == NULL)
11501               break;
11502
11503             string_sec = filedata->section_headers + link_section->sh_link;
11504
11505             strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
11506                                         string_sec->sh_size,
11507                                         _("version string table"));
11508             if (!strtab)
11509               {
11510                 free (symbols);
11511                 break;
11512               }
11513
11514             printf (ngettext ("\nVersion symbols section '%s' "
11515                               "contains %lu entry:\n",
11516                               "\nVersion symbols section '%s' "
11517                               "contains %lu entries:\n",
11518                               total),
11519                     printable_section_name (filedata, section), (unsigned long) total);
11520
11521             printf (_(" Addr: 0x"));
11522             printf_vma (section->sh_addr);
11523             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
11524                     (unsigned long) section->sh_offset, section->sh_link,
11525                     printable_section_name (filedata, link_section));
11526
11527             off = offset_from_vma (filedata,
11528                                    filedata->version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
11529                                    total * sizeof (short));
11530             edata = (unsigned char *) get_data (NULL, filedata, off,
11531                                                 sizeof (short), total,
11532                                                 _("version symbol data"));
11533             if (!edata)
11534               {
11535                 free (strtab);
11536                 free (symbols);
11537                 break;
11538               }
11539
11540             data = (short unsigned int *) cmalloc (total, sizeof (short));
11541
11542             for (cnt = total; cnt --;)
11543               data[cnt] = byte_get (edata + cnt * sizeof (short),
11544                                     sizeof (short));
11545
11546             free (edata);
11547
11548             for (cnt = 0; cnt < total; cnt += 4)
11549               {
11550                 int j, nn;
11551                 char *name;
11552                 char *invalid = _("*invalid*");
11553
11554                 printf ("  %03x:", cnt);
11555
11556                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
11557                   switch (data[cnt + j])
11558                     {
11559                     case 0:
11560                       fputs (_("   0 (*local*)    "), stdout);
11561                       break;
11562
11563                     case 1:
11564                       fputs (_("   1 (*global*)   "), stdout);
11565                       break;
11566
11567                     default:
11568                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
11569                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
11570
11571                       /* If this index value is greater than the size of the symbols
11572                          array, break to avoid an out-of-bounds read.  */
11573                       if ((unsigned long)(cnt + j) >= num_syms)
11574                         {
11575                           warn (_("invalid index into symbol array\n"));
11576                           break;
11577                         }
11578
11579                       name = NULL;
11580                       if (filedata->version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
11581                         {
11582                           Elf_Internal_Verneed ivn;
11583                           unsigned long offset;
11584
11585                           offset = offset_from_vma
11586                             (filedata,
11587                              filedata->version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
11588                              sizeof (Elf_External_Verneed));
11589
11590                           do
11591                             {
11592                               Elf_Internal_Vernaux ivna;
11593                               Elf_External_Verneed evn;
11594                               Elf_External_Vernaux evna;
11595                               unsigned long a_off;
11596
11597                               if (get_data (&evn, filedata, offset, sizeof (evn), 1,
11598                                             _("version need")) == NULL)
11599                                 break;
11600
11601                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
11602                               ivn.vn_next = BYTE_GET (evn.vn_next);
11603
11604                               a_off = offset + ivn.vn_aux;
11605
11606                               do
11607                                 {
11608                                   if (get_data (&evna, filedata, a_off, sizeof (evna),
11609                                                 1, _("version need aux (2)")) == NULL)
11610                                     {
11611                                       ivna.vna_next  = 0;
11612                                       ivna.vna_other = 0;
11613                                     }
11614                                   else
11615                                     {
11616                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
11617                                       ivna.vna_other = BYTE_GET (evna.vna_other);
11618                                     }
11619
11620                                   a_off += ivna.vna_next;
11621                                 }
11622                               while (ivna.vna_other != data[cnt + j]
11623                                      && ivna.vna_next != 0);
11624
11625                               if (ivna.vna_other == data[cnt + j])
11626                                 {
11627                                   ivna.vna_name = BYTE_GET (evna.vna_name);
11628
11629                                   if (ivna.vna_name >= string_sec->sh_size)
11630                                     name = invalid;
11631                                   else
11632                                     name = strtab + ivna.vna_name;
11633                                   break;
11634                                 }
11635
11636                               offset += ivn.vn_next;
11637                             }
11638                           while (ivn.vn_next);
11639                         }
11640
11641                       if (data[cnt + j] != 0x8001
11642                           && filedata->version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
11643                         {
11644                           Elf_Internal_Verdef ivd;
11645                           Elf_External_Verdef evd;
11646                           unsigned long offset;
11647
11648                           offset = offset_from_vma
11649                             (filedata,
11650                              filedata->version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
11651                              sizeof evd);
11652
11653                           do
11654                             {
11655                               if (get_data (&evd, filedata, offset, sizeof (evd), 1,
11656                                             _("version def")) == NULL)
11657                                 {
11658                                   ivd.vd_next = 0;
11659                                   /* PR 17531: file: 046-1082287-0.004.  */
11660                                   ivd.vd_ndx  = (data[cnt + j] & VERSYM_VERSION) + 1;
11661                                   break;
11662                                 }
11663                               else
11664                                 {
11665                                   ivd.vd_next = BYTE_GET (evd.vd_next);
11666                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
11667                                 }
11668
11669                               offset += ivd.vd_next;
11670                             }
11671                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
11672                                  && ivd.vd_next != 0);
11673
11674                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
11675                             {
11676                               Elf_External_Verdaux evda;
11677                               Elf_Internal_Verdaux ivda;
11678
11679                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
11680
11681                               if (get_data (&evda, filedata,
11682                                             offset - ivd.vd_next + ivd.vd_aux,
11683                                             sizeof (evda), 1,
11684                                             _("version def aux")) == NULL)
11685                                 break;
11686
11687                               ivda.vda_name = BYTE_GET (evda.vda_name);
11688
11689                               if (ivda.vda_name >= string_sec->sh_size)
11690                                 name = invalid;
11691                               else if (name != NULL && name != invalid)
11692                                 name = _("*both*");
11693                               else
11694                                 name = strtab + ivda.vda_name;
11695                             }
11696                         }
11697                       if (name != NULL)
11698                         nn += printf ("(%s%-*s",
11699                                       name,
11700                                       12 - (int) strlen (name),
11701                                       ")");
11702
11703                       if (nn < 18)
11704                         printf ("%*c", 18 - nn, ' ');
11705                     }
11706
11707                 putchar ('\n');
11708               }
11709
11710             free (data);
11711             free (strtab);
11712             free (symbols);
11713           }
11714           break;
11715
11716         default:
11717           break;
11718         }
11719     }
11720
11721   if (! found)
11722     printf (_("\nNo version information found in this file.\n"));
11723
11724   return TRUE;
11725 }
11726
11727 static const char *
11728 get_symbol_binding (Filedata * filedata, unsigned int binding)
11729 {
11730   static char buff[64];
11731
11732   switch (binding)
11733     {
11734     case STB_LOCAL:     return "LOCAL";
11735     case STB_GLOBAL:    return "GLOBAL";
11736     case STB_WEAK:      return "WEAK";
11737     default:
11738       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
11739         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
11740                   binding);
11741       else if (binding >= STB_LOOS && binding <= STB_HIOS)
11742         {
11743           if (binding == STB_GNU_UNIQUE
11744               && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU)
11745             return "UNIQUE";
11746           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
11747         }
11748       else
11749         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
11750       return buff;
11751     }
11752 }
11753
11754 static const char *
11755 get_symbol_type (Filedata * filedata, unsigned int type)
11756 {
11757   static char buff[64];
11758
11759   switch (type)
11760     {
11761     case STT_NOTYPE:    return "NOTYPE";
11762     case STT_OBJECT:    return "OBJECT";
11763     case STT_FUNC:      return "FUNC";
11764     case STT_SECTION:   return "SECTION";
11765     case STT_FILE:      return "FILE";
11766     case STT_COMMON:    return "COMMON";
11767     case STT_TLS:       return "TLS";
11768     case STT_RELC:      return "RELC";
11769     case STT_SRELC:     return "SRELC";
11770     default:
11771       if (type >= STT_LOPROC && type <= STT_HIPROC)
11772         {
11773           if (filedata->file_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
11774             return "THUMB_FUNC";
11775
11776           if (filedata->file_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
11777             return "REGISTER";
11778
11779           if (filedata->file_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
11780             return "PARISC_MILLI";
11781
11782           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
11783         }
11784       else if (type >= STT_LOOS && type <= STT_HIOS)
11785         {
11786           if (filedata->file_header.e_machine == EM_PARISC)
11787             {
11788               if (type == STT_HP_OPAQUE)
11789                 return "HP_OPAQUE";
11790               if (type == STT_HP_STUB)
11791                 return "HP_STUB";
11792             }
11793
11794           if (type == STT_GNU_IFUNC
11795               && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
11796                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD))
11797             return "IFUNC";
11798
11799           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
11800         }
11801       else
11802         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
11803       return buff;
11804     }
11805 }
11806
11807 static const char *
11808 get_symbol_visibility (unsigned int visibility)
11809 {
11810   switch (visibility)
11811     {
11812     case STV_DEFAULT:   return "DEFAULT";
11813     case STV_INTERNAL:  return "INTERNAL";
11814     case STV_HIDDEN:    return "HIDDEN";
11815     case STV_PROTECTED: return "PROTECTED";
11816     default:
11817       error (_("Unrecognized visibility value: %u\n"), visibility);
11818       return _("<unknown>");
11819     }
11820 }
11821
11822 static const char *
11823 get_alpha_symbol_other (unsigned int other)
11824 {
11825   switch (other)
11826     {
11827     case STO_ALPHA_NOPV:       return "NOPV";
11828     case STO_ALPHA_STD_GPLOAD: return "STD GPLOAD";
11829     default:
11830       error (_("Unrecognized alpha specific other value: %u\n"), other);
11831       return _("<unknown>");
11832     }
11833 }
11834
11835 static const char *
11836 get_solaris_symbol_visibility (unsigned int visibility)
11837 {
11838   switch (visibility)
11839     {
11840     case 4: return "EXPORTED";
11841     case 5: return "SINGLETON";
11842     case 6: return "ELIMINATE";
11843     default: return get_symbol_visibility (visibility);
11844     }
11845 }
11846
11847 static const char *
11848 get_aarch64_symbol_other (unsigned int other)
11849 {
11850   static char buf[32];
11851
11852   if (other & STO_AARCH64_VARIANT_PCS)
11853     {
11854       other &= ~STO_AARCH64_VARIANT_PCS;
11855       if (other == 0)
11856         return "VARIANT_PCS";
11857       snprintf (buf, sizeof buf, "VARIANT_PCS | %x", other);
11858       return buf;
11859     }
11860   return NULL;
11861 }
11862
11863 static const char *
11864 get_mips_symbol_other (unsigned int other)
11865 {
11866   switch (other)
11867     {
11868     case STO_OPTIONAL:      return "OPTIONAL";
11869     case STO_MIPS_PLT:      return "MIPS PLT";
11870     case STO_MIPS_PIC:      return "MIPS PIC";
11871     case STO_MICROMIPS:     return "MICROMIPS";
11872     case STO_MICROMIPS | STO_MIPS_PIC:      return "MICROMIPS, MIPS PIC";
11873     case STO_MIPS16:        return "MIPS16";
11874     default:                return NULL;
11875     }
11876 }
11877
11878 static const char *
11879 get_ia64_symbol_other (Filedata * filedata, unsigned int other)
11880 {
11881   if (is_ia64_vms (filedata))
11882     {
11883       static char res[32];
11884
11885       res[0] = 0;
11886
11887       /* Function types is for images and .STB files only.  */
11888       switch (filedata->file_header.e_type)
11889         {
11890         case ET_DYN:
11891         case ET_EXEC:
11892           switch (VMS_ST_FUNC_TYPE (other))
11893             {
11894             case VMS_SFT_CODE_ADDR:
11895               strcat (res, " CA");
11896               break;
11897             case VMS_SFT_SYMV_IDX:
11898               strcat (res, " VEC");
11899               break;
11900             case VMS_SFT_FD:
11901               strcat (res, " FD");
11902               break;
11903             case VMS_SFT_RESERVE:
11904               strcat (res, " RSV");
11905               break;
11906             default:
11907               warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
11908                     VMS_ST_FUNC_TYPE (other));
11909               strcat (res, " <unknown>");
11910               break;
11911             }
11912           break;
11913         default:
11914           break;
11915         }
11916       switch (VMS_ST_LINKAGE (other))
11917         {
11918         case VMS_STL_IGNORE:
11919           strcat (res, " IGN");
11920           break;
11921         case VMS_STL_RESERVE:
11922           strcat (res, " RSV");
11923           break;
11924         case VMS_STL_STD:
11925           strcat (res, " STD");
11926           break;
11927         case VMS_STL_LNK:
11928           strcat (res, " LNK");
11929           break;
11930         default:
11931           warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
11932                 VMS_ST_LINKAGE (other));
11933           strcat (res, " <unknown>");
11934           break;
11935         }
11936
11937       if (res[0] != 0)
11938         return res + 1;
11939       else
11940         return res;
11941     }
11942   return NULL;
11943 }
11944
11945 static const char *
11946 get_ppc64_symbol_other (unsigned int other)
11947 {
11948   if ((other & ~STO_PPC64_LOCAL_MASK) != 0)
11949     return NULL;
11950
11951   other >>= STO_PPC64_LOCAL_BIT;
11952   if (other <= 6)
11953     {
11954       static char buf[64];
11955       if (other >= 2)
11956         other = ppc64_decode_local_entry (other);
11957       snprintf (buf, sizeof buf, _("<localentry>: %d"), other);
11958       return buf;
11959     }
11960   return NULL;
11961 }
11962
11963 static const char *
11964 get_symbol_other (Filedata * filedata, unsigned int other)
11965 {
11966   const char * result = NULL;
11967   static char buff [64];
11968
11969   if (other == 0)
11970     return "";
11971
11972   switch (filedata->file_header.e_machine)
11973     {
11974     case EM_ALPHA:
11975       result = get_alpha_symbol_other (other);
11976       break;
11977     case EM_AARCH64:
11978       result = get_aarch64_symbol_other (other);
11979       break;
11980     case EM_MIPS:
11981       result = get_mips_symbol_other (other);
11982       break;
11983     case EM_IA_64:
11984       result = get_ia64_symbol_other (filedata, other);
11985       break;
11986     case EM_PPC64:
11987       result = get_ppc64_symbol_other (other);
11988       break;
11989     default:
11990       result = NULL;
11991       break;
11992     }
11993
11994   if (result)
11995     return result;
11996
11997   snprintf (buff, sizeof buff, _("<other>: %x"), other);
11998   return buff;
11999 }
12000
12001 static const char *
12002 get_symbol_index_type (Filedata * filedata, unsigned int type)
12003 {
12004   static char buff[32];
12005
12006   switch (type)
12007     {
12008     case SHN_UNDEF:     return "UND";
12009     case SHN_ABS:       return "ABS";
12010     case SHN_COMMON:    return "COM";
12011     default:
12012       if (type == SHN_IA_64_ANSI_COMMON
12013           && filedata->file_header.e_machine == EM_IA_64
12014           && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
12015         return "ANSI_COM";
12016       else if ((filedata->file_header.e_machine == EM_X86_64
12017                 || filedata->file_header.e_machine == EM_L1OM
12018                 || filedata->file_header.e_machine == EM_K1OM)
12019                && type == SHN_X86_64_LCOMMON)
12020         return "LARGE_COM";
12021       else if ((type == SHN_MIPS_SCOMMON
12022                 && filedata->file_header.e_machine == EM_MIPS)
12023                || (type == SHN_TIC6X_SCOMMON
12024                    && filedata->file_header.e_machine == EM_TI_C6000))
12025         return "SCOM";
12026       else if (type == SHN_MIPS_SUNDEFINED
12027                && filedata->file_header.e_machine == EM_MIPS)
12028         return "SUND";
12029       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
12030         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
12031       else if (type >= SHN_LOOS && type <= SHN_HIOS)
12032         sprintf (buff, "OS [0x%04x]", type & 0xffff);
12033       else if (type >= SHN_LORESERVE)
12034         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
12035       else if (filedata->file_header.e_shnum != 0
12036                && type >= filedata->file_header.e_shnum)
12037         sprintf (buff, _("bad section index[%3d]"), type);
12038       else
12039         sprintf (buff, "%3d", type);
12040       break;
12041     }
12042
12043   return buff;
12044 }
12045
12046 static const char *
12047 get_symbol_version_string (Filedata *                   filedata,
12048                            bfd_boolean                  is_dynsym,
12049                            const char *                 strtab,
12050                            unsigned long int            strtab_size,
12051                            unsigned int                 si,
12052                            Elf_Internal_Sym *           psym,
12053                            enum versioned_symbol_info * sym_info,
12054                            unsigned short *             vna_other)
12055 {
12056   unsigned char data[2];
12057   unsigned short vers_data;
12058   unsigned long offset;
12059   unsigned short max_vd_ndx;
12060
12061   if (!is_dynsym
12062       || filedata->version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
12063     return NULL;
12064
12065   offset = offset_from_vma (filedata,
12066                             filedata->version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
12067                             sizeof data + si * sizeof (vers_data));
12068
12069   if (get_data (&data, filedata, offset + si * sizeof (vers_data),
12070                 sizeof (data), 1, _("version data")) == NULL)
12071     return NULL;
12072
12073   vers_data = byte_get (data, 2);
12074
12075   if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data == 0)
12076     return NULL;
12077
12078   *sym_info = (vers_data & VERSYM_HIDDEN) != 0 ? symbol_hidden : symbol_public;
12079   max_vd_ndx = 0;
12080
12081   /* Usually we'd only see verdef for defined symbols, and verneed for
12082      undefined symbols.  However, symbols defined by the linker in
12083      .dynbss for variables copied from a shared library in order to
12084      avoid text relocations are defined yet have verneed.  We could
12085      use a heuristic to detect the special case, for example, check
12086      for verneed first on symbols defined in SHT_NOBITS sections, but
12087      it is simpler and more reliable to just look for both verdef and
12088      verneed.  .dynbss might not be mapped to a SHT_NOBITS section.  */
12089
12090   if (psym->st_shndx != SHN_UNDEF
12091       && vers_data != 0x8001
12092       && filedata->version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
12093     {
12094       Elf_Internal_Verdef ivd;
12095       Elf_Internal_Verdaux ivda;
12096       Elf_External_Verdaux evda;
12097       unsigned long off;
12098
12099       off = offset_from_vma (filedata,
12100                              filedata->version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
12101                              sizeof (Elf_External_Verdef));
12102
12103       do
12104         {
12105           Elf_External_Verdef evd;
12106
12107           if (get_data (&evd, filedata, off, sizeof (evd), 1,
12108                         _("version def")) == NULL)
12109             {
12110               ivd.vd_ndx = 0;
12111               ivd.vd_aux = 0;
12112               ivd.vd_next = 0;
12113               ivd.vd_flags = 0;
12114             }
12115           else
12116             {
12117               ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
12118               ivd.vd_aux = BYTE_GET (evd.vd_aux);
12119               ivd.vd_next = BYTE_GET (evd.vd_next);
12120               ivd.vd_flags = BYTE_GET (evd.vd_flags);
12121             }
12122
12123           if ((ivd.vd_ndx & VERSYM_VERSION) > max_vd_ndx)
12124             max_vd_ndx = ivd.vd_ndx & VERSYM_VERSION;
12125
12126           off += ivd.vd_next;
12127         }
12128       while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
12129
12130       if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
12131         {
12132           if (ivd.vd_ndx == 1 && ivd.vd_flags == VER_FLG_BASE)
12133             return NULL;
12134
12135           off -= ivd.vd_next;
12136           off += ivd.vd_aux;
12137
12138           if (get_data (&evda, filedata, off, sizeof (evda), 1,
12139                         _("version def aux")) != NULL)
12140             {
12141               ivda.vda_name = BYTE_GET (evda.vda_name);
12142
12143               if (psym->st_name != ivda.vda_name)
12144                 return (ivda.vda_name < strtab_size
12145                         ? strtab + ivda.vda_name : _("<corrupt>"));
12146             }
12147         }
12148     }
12149
12150   if (filedata->version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
12151     {
12152       Elf_External_Verneed evn;
12153       Elf_Internal_Verneed ivn;
12154       Elf_Internal_Vernaux ivna;
12155
12156       offset = offset_from_vma (filedata,
12157                                 filedata->version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
12158                                 sizeof evn);
12159       do
12160         {
12161           unsigned long vna_off;
12162
12163           if (get_data (&evn, filedata, offset, sizeof (evn), 1,
12164                         _("version need")) == NULL)
12165             {
12166               ivna.vna_next = 0;
12167               ivna.vna_other = 0;
12168               ivna.vna_name = 0;
12169               break;
12170             }
12171
12172           ivn.vn_aux  = BYTE_GET (evn.vn_aux);
12173           ivn.vn_next = BYTE_GET (evn.vn_next);
12174
12175           vna_off = offset + ivn.vn_aux;
12176
12177           do
12178             {
12179               Elf_External_Vernaux evna;
12180
12181               if (get_data (&evna, filedata, vna_off, sizeof (evna), 1,
12182                             _("version need aux (3)")) == NULL)
12183                 {
12184                   ivna.vna_next = 0;
12185                   ivna.vna_other = 0;
12186                   ivna.vna_name = 0;
12187                 }
12188               else
12189                 {
12190                   ivna.vna_other = BYTE_GET (evna.vna_other);
12191                   ivna.vna_next  = BYTE_GET (evna.vna_next);
12192                   ivna.vna_name  = BYTE_GET (evna.vna_name);
12193                 }
12194
12195               vna_off += ivna.vna_next;
12196             }
12197           while (ivna.vna_other != vers_data && ivna.vna_next != 0);
12198
12199           if (ivna.vna_other == vers_data)
12200             break;
12201
12202           offset += ivn.vn_next;
12203         }
12204       while (ivn.vn_next != 0);
12205
12206       if (ivna.vna_other == vers_data)
12207         {
12208           *sym_info = symbol_undefined;
12209           *vna_other = ivna.vna_other;
12210           return (ivna.vna_name < strtab_size
12211                   ? strtab + ivna.vna_name : _("<corrupt>"));
12212         }
12213       else if ((max_vd_ndx || (vers_data & VERSYM_VERSION) != 1)
12214                && (vers_data & VERSYM_VERSION) > max_vd_ndx)
12215         return _("<corrupt>");
12216     }
12217   return NULL;
12218 }
12219
12220 static void
12221 print_dynamic_symbol (Filedata *filedata, unsigned long si,
12222                       Elf_Internal_Sym *symtab,
12223                       Elf_Internal_Shdr *section,
12224                       char *strtab, size_t strtab_size)
12225 {
12226   const char *version_string;
12227   enum versioned_symbol_info sym_info;
12228   unsigned short vna_other;
12229   Elf_Internal_Sym *psym = symtab + si;
12230
12231   printf ("%6ld: ", si);
12232   print_vma (psym->st_value, LONG_HEX);
12233   putchar (' ');
12234   print_vma (psym->st_size, DEC_5);
12235   printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
12236   printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
12237   if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
12238     printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
12239   else
12240     {
12241       unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
12242
12243       printf (" %-7s", get_symbol_visibility (vis));
12244       /* Check to see if any other bits in the st_other field are set.
12245          Note - displaying this information disrupts the layout of the
12246          table being generated, but for the moment this case is very rare.  */
12247       if (psym->st_other ^ vis)
12248         printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
12249     }
12250   printf (" %4s ", get_symbol_index_type (filedata, psym->st_shndx));
12251
12252   bfd_boolean is_valid = VALID_SYMBOL_NAME (strtab, strtab_size,
12253                                             psym->st_name);
12254   const char * sstr = is_valid  ? strtab + psym->st_name : _("<corrupt>");
12255
12256   version_string
12257     = get_symbol_version_string (filedata,
12258                                  (section == NULL
12259                                   || section->sh_type == SHT_DYNSYM),
12260                                  strtab, strtab_size, si,
12261                                  psym, &sym_info, &vna_other);
12262
12263   int len_avail = 21;
12264   if (! do_wide && version_string != NULL)
12265     {
12266       char buffer[16];
12267
12268       len_avail -= 1 + strlen (version_string);
12269
12270       if (sym_info == symbol_undefined)
12271         len_avail -= sprintf (buffer," (%d)", vna_other);
12272       else if (sym_info != symbol_hidden)
12273         len_avail -= 1;
12274     }
12275
12276   print_symbol (len_avail, sstr);
12277
12278   if (version_string)
12279     {
12280       if (sym_info == symbol_undefined)
12281         printf ("@%s (%d)", version_string, vna_other);
12282       else
12283         printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
12284                 version_string);
12285     }
12286
12287   putchar ('\n');
12288
12289   if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
12290       && section != NULL
12291       && si >= section->sh_info
12292       /* Irix 5 and 6 MIPS binaries are known to ignore this requirement.  */
12293       && filedata->file_header.e_machine != EM_MIPS
12294       /* Solaris binaries have been found to violate this requirement as
12295          well.  Not sure if this is a bug or an ABI requirement.  */
12296       && filedata->file_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
12297     warn (_("local symbol %lu found at index >= %s's sh_info value of %u\n"),
12298           si, printable_section_name (filedata, section), section->sh_info);
12299 }
12300
12301 static const char *
12302 get_lto_kind (unsigned int kind)
12303 {
12304   switch (kind)
12305     {
12306     case 0: return "DEF";
12307     case 1: return "WEAKDEF";
12308     case 2: return "UNDEF";
12309     case 3: return "WEAKUNDEF";
12310     case 4: return "COMMON";
12311     default:
12312       break;
12313     }
12314
12315   static char buffer[30];
12316   error (_("Unknown LTO symbol definition encountered: %u\n"), kind);
12317   sprintf (buffer, "<unknown: %u>", kind);
12318   return buffer;
12319 }
12320
12321 static const char *
12322 get_lto_visibility (unsigned int visibility)
12323 {
12324   switch (visibility)
12325     {
12326     case 0: return "DEFAULT";
12327     case 1: return "PROTECTED";
12328     case 2: return "INTERNAL";
12329     case 3: return "HIDDEN";
12330     default:
12331       break;
12332     }
12333
12334   static char buffer[30];
12335   error (_("Unknown LTO symbol visibility encountered: %u\n"), visibility);
12336   sprintf (buffer, "<unknown: %u>", visibility);
12337   return buffer;
12338 }
12339
12340 static const char *
12341 get_lto_sym_type (unsigned int sym_type)
12342 {
12343   switch (sym_type)
12344     {
12345     case 0: return "UNKNOWN";
12346     case 1: return "FUNCTION";
12347     case 2: return "VARIABLE";
12348     default:
12349       break;
12350     }
12351
12352   static char buffer[30];
12353   error (_("Unknown LTO symbol type encountered: %u\n"), sym_type);
12354   sprintf (buffer, "<unknown: %u>", sym_type);
12355   return buffer;
12356 }
12357
12358 /* Display an LTO format symbol table.
12359    FIXME: The format of LTO symbol tables is not formalized.
12360    So this code could need changing in the future.  */
12361
12362 static bfd_boolean
12363 display_lto_symtab (Filedata *           filedata,
12364                     Elf_Internal_Shdr *  section)
12365 {
12366   if (section->sh_size == 0)
12367     {
12368       printf (_("\nLTO Symbol table '%s' is empty!\n"),
12369               printable_section_name (filedata, section));
12370       return TRUE;
12371     }
12372
12373   if (section->sh_size > filedata->file_size)
12374     {
12375       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
12376              printable_section_name (filedata, section),
12377              (unsigned long) section->sh_size);
12378       return FALSE;
12379     }
12380
12381   void * alloced_data = get_data (NULL, filedata, section->sh_offset,
12382                                   section->sh_size, 1, _("LTO symbols"));
12383   if (alloced_data == NULL)
12384     return FALSE;
12385
12386   /* Look for extended data for the symbol table.  */
12387   Elf_Internal_Shdr * ext;
12388   void * ext_data_orig = NULL;
12389   char * ext_data = NULL;
12390   char * ext_data_end = NULL;
12391   char * ext_name = NULL;
12392
12393   if (asprintf (& ext_name, ".gnu.lto_.ext_symtab.%s",
12394                 SECTION_NAME (section) + sizeof (".gnu.lto_.symtab.") - 1) > 0
12395       && ext_name != NULL /* Paranoia.  */
12396       && (ext = find_section (filedata, ext_name)) != NULL)
12397     {
12398       if (ext->sh_size < 3)
12399         error (_("LTO Symbol extension table '%s' is empty!\n"),
12400                printable_section_name (filedata, ext));
12401       else
12402         {
12403           ext_data_orig = ext_data = get_data (NULL, filedata, ext->sh_offset,
12404                                                ext->sh_size, 1,
12405                                                _("LTO ext symbol data"));
12406           if (ext_data != NULL)
12407             {
12408               ext_data_end = ext_data + ext->sh_size;
12409               if (* ext_data++ != 1)
12410                 error (_("Unexpected version number in symbol extension table\n"));
12411             }
12412         }
12413     }
12414
12415   const unsigned char * data = (const unsigned char *) alloced_data;
12416   const unsigned char * end = data + section->sh_size;
12417
12418   if (ext_data_orig != NULL)
12419     {
12420       if (do_wide)
12421         printf (_("\nLTO Symbol table '%s' and extension table '%s' contain:\n"),
12422                 printable_section_name (filedata, section),
12423                 printable_section_name (filedata, ext));
12424       else
12425         {
12426           printf (_("\nLTO Symbol table '%s'\n"),
12427                   printable_section_name (filedata, section));
12428           printf (_(" and extension table '%s' contain:\n"),
12429                   printable_section_name (filedata, ext));
12430         }
12431     }
12432   else
12433     printf (_("\nLTO Symbol table '%s' contains:\n"),
12434             printable_section_name (filedata, section));
12435
12436
12437   /* FIXME: Add a wide version.  */
12438   if (ext_data_orig != NULL)
12439     printf (_("  Comdat_Key       Kind  Visibility     Size      Slot      Type  Section Name\n"));
12440   else
12441     printf (_("  Comdat_Key       Kind  Visibility     Size      Slot Name\n"));
12442
12443   /* FIXME: We do not handle style prefixes.  */
12444
12445   while (data < end)
12446     {
12447       const unsigned char * sym_name = data;
12448       data += strnlen ((const char *) sym_name, end - data) + 1;
12449       if (data >= end)
12450         goto fail;
12451
12452       const unsigned char * comdat_key = data;
12453       data += strnlen ((const char *) comdat_key, end - data) + 1;
12454       if (data >= end)
12455         goto fail;
12456
12457       if (data + 2 + 8 + 4 > end)
12458         goto fail;
12459
12460       unsigned int kind = *data++;
12461       unsigned int visibility = *data++;
12462
12463       elf_vma size = byte_get (data, 8);
12464       data += 8;
12465
12466       elf_vma slot = byte_get (data, 4);
12467       data += 4;
12468
12469       if (ext_data != NULL)
12470         {
12471           if (ext_data < (ext_data_end - 1))
12472             {
12473               unsigned int sym_type = * ext_data ++;
12474               unsigned int sec_kind = * ext_data ++;
12475
12476               printf ("  %10s %10s %11s %08lx  %08lx %9s %08lx _",
12477                       * comdat_key == 0 ? "-" : (char *) comdat_key,
12478                       get_lto_kind (kind),
12479                       get_lto_visibility (visibility),
12480                       (long) size,
12481                       (long) slot,
12482                       get_lto_sym_type (sym_type),
12483                       (long) sec_kind);
12484               print_symbol (6, (const char *) sym_name);
12485             }
12486           else
12487             {
12488               error (_("Ran out of LTO symbol extension data\n"));
12489               ext_data = NULL;
12490               /* FIXME: return FAIL result ?  */
12491             }
12492         }
12493       else
12494         {
12495           printf ("  %10s %10s %11s %08lx  %08lx _",
12496                   * comdat_key == 0 ? "-" : (char *) comdat_key,
12497                   get_lto_kind (kind),
12498                   get_lto_visibility (visibility),
12499                   (long) size,
12500                   (long) slot);
12501           print_symbol (21, (const char *) sym_name);
12502         }
12503       putchar ('\n');
12504     }
12505
12506   if (ext_data != NULL && ext_data < ext_data_end)
12507     {
12508       error (_("Data remains in the LTO symbol extension table\n"));
12509       goto fail;
12510     }
12511
12512   free (alloced_data);
12513   free (ext_data_orig);
12514   free (ext_name);
12515   return TRUE;
12516
12517  fail:
12518   error (_("Buffer overrun encountered whilst decoding LTO symbol table\n"));
12519   free (alloced_data);
12520   free (ext_data_orig);
12521   free (ext_name);
12522   return FALSE;
12523 }
12524
12525 /* Display LTO symbol tables.  */
12526
12527 static bfd_boolean
12528 process_lto_symbol_tables (Filedata * filedata)
12529 {
12530   Elf_Internal_Shdr * section;
12531   unsigned int i;
12532   bfd_boolean res = TRUE;
12533
12534   if (!do_lto_syms)
12535     return TRUE;
12536
12537   if (filedata->section_headers == NULL)
12538     return TRUE;
12539
12540   for (i = 0, section = filedata->section_headers;
12541        i < filedata->file_header.e_shnum;
12542        i++, section++)
12543     if (SECTION_NAME_VALID (section)
12544         && CONST_STRNEQ (SECTION_NAME (section), ".gnu.lto_.symtab."))
12545       res &= display_lto_symtab (filedata, section);
12546
12547   return res;
12548 }
12549
12550 /* Dump the symbol table.  */
12551
12552 static bfd_boolean
12553 process_symbol_table (Filedata * filedata)
12554 {
12555   Elf_Internal_Shdr * section;
12556
12557   if (!do_syms && !do_dyn_syms && !do_histogram)
12558     return TRUE;
12559
12560   if ((filedata->dynamic_info[DT_HASH] || filedata->dynamic_info_DT_GNU_HASH)
12561       && do_syms
12562       && do_using_dynamic
12563       && filedata->dynamic_strings != NULL
12564       && filedata->dynamic_symbols != NULL)
12565     {
12566       unsigned long si;
12567
12568       printf (ngettext ("\nSymbol table for image contains %lu entry:\n",
12569                         "\nSymbol table for image contains %lu entries:\n",
12570                         filedata->num_dynamic_syms),
12571               filedata->num_dynamic_syms);
12572       if (is_32bit_elf)
12573         printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
12574       else
12575         printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
12576
12577       for (si = 0; si < filedata->num_dynamic_syms; si++)
12578         print_dynamic_symbol (filedata, si, filedata->dynamic_symbols, NULL,
12579                               filedata->dynamic_strings,
12580                               filedata->dynamic_strings_length);
12581     }
12582   else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
12583            && filedata->section_headers != NULL)
12584     {
12585       unsigned int i;
12586
12587       for (i = 0, section = filedata->section_headers;
12588            i < filedata->file_header.e_shnum;
12589            i++, section++)
12590         {
12591           char * strtab = NULL;
12592           unsigned long int strtab_size = 0;
12593           Elf_Internal_Sym * symtab;
12594           unsigned long si, num_syms;
12595
12596           if ((section->sh_type != SHT_SYMTAB
12597                && section->sh_type != SHT_DYNSYM)
12598               || (!do_syms
12599                   && section->sh_type == SHT_SYMTAB))
12600             continue;
12601
12602           if (section->sh_entsize == 0)
12603             {
12604               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
12605                       printable_section_name (filedata, section));
12606               continue;
12607             }
12608
12609           num_syms = section->sh_size / section->sh_entsize;
12610           printf (ngettext ("\nSymbol table '%s' contains %lu entry:\n",
12611                             "\nSymbol table '%s' contains %lu entries:\n",
12612                             num_syms),
12613                   printable_section_name (filedata, section),
12614                   num_syms);
12615
12616           if (is_32bit_elf)
12617             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
12618           else
12619             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
12620
12621           symtab = GET_ELF_SYMBOLS (filedata, section, & num_syms);
12622           if (symtab == NULL)
12623             continue;
12624
12625           if (section->sh_link == filedata->file_header.e_shstrndx)
12626             {
12627               strtab = filedata->string_table;
12628               strtab_size = filedata->string_table_length;
12629             }
12630           else if (section->sh_link < filedata->file_header.e_shnum)
12631             {
12632               Elf_Internal_Shdr * string_sec;
12633
12634               string_sec = filedata->section_headers + section->sh_link;
12635
12636               strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset,
12637                                           1, string_sec->sh_size,
12638                                           _("string table"));
12639               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
12640             }
12641
12642           for (si = 0; si < num_syms; si++)
12643             print_dynamic_symbol (filedata, si, symtab, section,
12644                                   strtab, strtab_size);
12645
12646           free (symtab);
12647           if (strtab != filedata->string_table)
12648             free (strtab);
12649         }
12650     }
12651   else if (do_syms)
12652     printf
12653       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
12654
12655   if (do_histogram && filedata->buckets != NULL)
12656     {
12657       unsigned long * lengths;
12658       unsigned long * counts;
12659       unsigned long hn;
12660       bfd_vma si;
12661       unsigned long maxlength = 0;
12662       unsigned long nzero_counts = 0;
12663       unsigned long nsyms = 0;
12664       char *visited;
12665
12666       printf (ngettext ("\nHistogram for bucket list length "
12667                         "(total of %lu bucket):\n",
12668                         "\nHistogram for bucket list length "
12669                         "(total of %lu buckets):\n",
12670                         (unsigned long) filedata->nbuckets),
12671               (unsigned long) filedata->nbuckets);
12672
12673       lengths = (unsigned long *) calloc (filedata->nbuckets,
12674                                           sizeof (*lengths));
12675       if (lengths == NULL)
12676         {
12677           error (_("Out of memory allocating space for histogram buckets\n"));
12678           goto err_out;
12679         }
12680       visited = xcmalloc (filedata->nchains, 1);
12681       memset (visited, 0, filedata->nchains);
12682
12683       printf (_(" Length  Number     %% of total  Coverage\n"));
12684       for (hn = 0; hn < filedata->nbuckets; ++hn)
12685         {
12686           for (si = filedata->buckets[hn]; si > 0; si = filedata->chains[si])
12687             {
12688               ++nsyms;
12689               if (maxlength < ++lengths[hn])
12690                 ++maxlength;
12691               if (si >= filedata->nchains || visited[si])
12692                 {
12693                   error (_("histogram chain is corrupt\n"));
12694                   break;
12695                 }
12696               visited[si] = 1;
12697             }
12698         }
12699       free (visited);
12700
12701       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
12702       if (counts == NULL)
12703         {
12704           free (lengths);
12705           error (_("Out of memory allocating space for histogram counts\n"));
12706           goto err_out;
12707         }
12708
12709       for (hn = 0; hn < filedata->nbuckets; ++hn)
12710         ++counts[lengths[hn]];
12711
12712       if (filedata->nbuckets > 0)
12713         {
12714           unsigned long i;
12715           printf ("      0  %-10lu (%5.1f%%)\n",
12716                   counts[0], (counts[0] * 100.0) / filedata->nbuckets);
12717           for (i = 1; i <= maxlength; ++i)
12718             {
12719               nzero_counts += counts[i] * i;
12720               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
12721                       i, counts[i], (counts[i] * 100.0) / filedata->nbuckets,
12722                       (nzero_counts * 100.0) / nsyms);
12723             }
12724         }
12725
12726       free (counts);
12727       free (lengths);
12728     }
12729
12730   free (filedata->buckets);
12731   filedata->buckets = NULL;
12732   filedata->nbuckets = 0;
12733   free (filedata->chains);
12734   filedata->chains = NULL;
12735
12736   if (do_histogram && filedata->gnubuckets != NULL)
12737     {
12738       unsigned long * lengths;
12739       unsigned long * counts;
12740       unsigned long hn;
12741       unsigned long maxlength = 0;
12742       unsigned long nzero_counts = 0;
12743       unsigned long nsyms = 0;
12744
12745       printf (ngettext ("\nHistogram for `%s' bucket list length "
12746                         "(total of %lu bucket):\n",
12747                         "\nHistogram for `%s' bucket list length "
12748                         "(total of %lu buckets):\n",
12749                         (unsigned long) filedata->ngnubuckets),
12750               GNU_HASH_SECTION_NAME (filedata),
12751               (unsigned long) filedata->ngnubuckets);
12752
12753       lengths = (unsigned long *) calloc (filedata->ngnubuckets,
12754                                           sizeof (*lengths));
12755       if (lengths == NULL)
12756         {
12757           error (_("Out of memory allocating space for gnu histogram buckets\n"));
12758           goto err_out;
12759         }
12760
12761       printf (_(" Length  Number     %% of total  Coverage\n"));
12762
12763       for (hn = 0; hn < filedata->ngnubuckets; ++hn)
12764         if (filedata->gnubuckets[hn] != 0)
12765           {
12766             bfd_vma off, length = 1;
12767
12768             for (off = filedata->gnubuckets[hn] - filedata->gnusymidx;
12769                  /* PR 17531 file: 010-77222-0.004.  */
12770                  off < filedata->ngnuchains
12771                    && (filedata->gnuchains[off] & 1) == 0;
12772                  ++off)
12773               ++length;
12774             lengths[hn] = length;
12775             if (length > maxlength)
12776               maxlength = length;
12777             nsyms += length;
12778           }
12779
12780       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
12781       if (counts == NULL)
12782         {
12783           free (lengths);
12784           error (_("Out of memory allocating space for gnu histogram counts\n"));
12785           goto err_out;
12786         }
12787
12788       for (hn = 0; hn < filedata->ngnubuckets; ++hn)
12789         ++counts[lengths[hn]];
12790
12791       if (filedata->ngnubuckets > 0)
12792         {
12793           unsigned long j;
12794           printf ("      0  %-10lu (%5.1f%%)\n",
12795                   counts[0], (counts[0] * 100.0) / filedata->ngnubuckets);
12796           for (j = 1; j <= maxlength; ++j)
12797             {
12798               nzero_counts += counts[j] * j;
12799               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
12800                       j, counts[j], (counts[j] * 100.0) / filedata->ngnubuckets,
12801                       (nzero_counts * 100.0) / nsyms);
12802             }
12803         }
12804
12805       free (counts);
12806       free (lengths);
12807     }
12808   free (filedata->gnubuckets);
12809   filedata->gnubuckets = NULL;
12810   filedata->ngnubuckets = 0;
12811   free (filedata->gnuchains);
12812   filedata->gnuchains = NULL;
12813   filedata->ngnuchains = 0;
12814   free (filedata->mipsxlat);
12815   filedata->mipsxlat = NULL;
12816   return TRUE;
12817
12818  err_out:
12819   free (filedata->gnubuckets);
12820   filedata->gnubuckets = NULL;
12821   filedata->ngnubuckets = 0;
12822   free (filedata->gnuchains);
12823   filedata->gnuchains = NULL;
12824   filedata->ngnuchains = 0;
12825   free (filedata->mipsxlat);
12826   filedata->mipsxlat = NULL;
12827   free (filedata->buckets);
12828   filedata->buckets = NULL;
12829   filedata->nbuckets = 0;
12830   free (filedata->chains);
12831   filedata->chains = NULL;
12832   return FALSE;
12833 }
12834
12835 static bfd_boolean
12836 process_syminfo (Filedata * filedata ATTRIBUTE_UNUSED)
12837 {
12838   unsigned int i;
12839
12840   if (filedata->dynamic_syminfo == NULL
12841       || !do_dynamic)
12842     /* No syminfo, this is ok.  */
12843     return TRUE;
12844
12845   /* There better should be a dynamic symbol section.  */
12846   if (filedata->dynamic_symbols == NULL || filedata->dynamic_strings == NULL)
12847     return FALSE;
12848
12849   if (filedata->dynamic_addr)
12850     printf (ngettext ("\nDynamic info segment at offset 0x%lx "
12851                       "contains %d entry:\n",
12852                       "\nDynamic info segment at offset 0x%lx "
12853                       "contains %d entries:\n",
12854                       filedata->dynamic_syminfo_nent),
12855             filedata->dynamic_syminfo_offset, filedata->dynamic_syminfo_nent);
12856
12857   printf (_(" Num: Name                           BoundTo     Flags\n"));
12858   for (i = 0; i < filedata->dynamic_syminfo_nent; ++i)
12859     {
12860       unsigned short int flags = filedata->dynamic_syminfo[i].si_flags;
12861
12862       printf ("%4d: ", i);
12863       if (i >= filedata->num_dynamic_syms)
12864         printf (_("<corrupt index>"));
12865       else if (VALID_DYNAMIC_NAME (filedata, filedata->dynamic_symbols[i].st_name))
12866         print_symbol (30, GET_DYNAMIC_NAME (filedata,
12867                                             filedata->dynamic_symbols[i].st_name));
12868       else
12869         printf (_("<corrupt: %19ld>"), filedata->dynamic_symbols[i].st_name);
12870       putchar (' ');
12871
12872       switch (filedata->dynamic_syminfo[i].si_boundto)
12873         {
12874         case SYMINFO_BT_SELF:
12875           fputs ("SELF       ", stdout);
12876           break;
12877         case SYMINFO_BT_PARENT:
12878           fputs ("PARENT     ", stdout);
12879           break;
12880         default:
12881           if (filedata->dynamic_syminfo[i].si_boundto > 0
12882               && filedata->dynamic_syminfo[i].si_boundto < filedata->dynamic_nent
12883               && VALID_DYNAMIC_NAME (filedata,
12884                                      filedata->dynamic_section[filedata->dynamic_syminfo[i].si_boundto].d_un.d_val))
12885             {
12886               print_symbol (10, GET_DYNAMIC_NAME (filedata,
12887                                                   filedata->dynamic_section[filedata->dynamic_syminfo[i].si_boundto].d_un.d_val));
12888               putchar (' ' );
12889             }
12890           else
12891             printf ("%-10d ", filedata->dynamic_syminfo[i].si_boundto);
12892           break;
12893         }
12894
12895       if (flags & SYMINFO_FLG_DIRECT)
12896         printf (" DIRECT");
12897       if (flags & SYMINFO_FLG_PASSTHRU)
12898         printf (" PASSTHRU");
12899       if (flags & SYMINFO_FLG_COPY)
12900         printf (" COPY");
12901       if (flags & SYMINFO_FLG_LAZYLOAD)
12902         printf (" LAZYLOAD");
12903
12904       puts ("");
12905     }
12906
12907   return TRUE;
12908 }
12909
12910 /* A macro which evaluates to TRUE if the region ADDR .. ADDR + NELEM
12911    is contained by the region START .. END.  The types of ADDR, START
12912    and END should all be the same.  Note both ADDR + NELEM and END
12913    point to just beyond the end of the regions that are being tested.  */
12914 #define IN_RANGE(START,END,ADDR,NELEM)          \
12915   (((ADDR) >= (START)) && ((ADDR) < (END)) && ((ADDR) + (NELEM) <= (END)))
12916
12917 /* Check to see if the given reloc needs to be handled in a target specific
12918    manner.  If so then process the reloc and return TRUE otherwise return
12919    FALSE.
12920
12921    If called with reloc == NULL, then this is a signal that reloc processing
12922    for the current section has finished, and any saved state should be
12923    discarded.  */
12924
12925 static bfd_boolean
12926 target_specific_reloc_handling (Filedata *           filedata,
12927                                 Elf_Internal_Rela *  reloc,
12928                                 unsigned char *      start,
12929                                 unsigned char *      end,
12930                                 Elf_Internal_Sym *   symtab,
12931                                 unsigned long        num_syms)
12932 {
12933   unsigned int reloc_type = 0;
12934   unsigned long sym_index = 0;
12935
12936   if (reloc)
12937     {
12938       reloc_type = get_reloc_type (filedata, reloc->r_info);
12939       sym_index = get_reloc_symindex (reloc->r_info);
12940     }
12941
12942   switch (filedata->file_header.e_machine)
12943     {
12944     case EM_MSP430:
12945     case EM_MSP430_OLD:
12946       {
12947         static Elf_Internal_Sym * saved_sym = NULL;
12948
12949         if (reloc == NULL)
12950           {
12951             saved_sym = NULL;
12952             return TRUE;
12953           }
12954
12955         switch (reloc_type)
12956           {
12957           case 10: /* R_MSP430_SYM_DIFF */
12958           case 12: /* R_MSP430_GNU_SUB_ULEB128 */
12959             if (uses_msp430x_relocs (filedata))
12960               break;
12961             /* Fall through.  */
12962           case 21: /* R_MSP430X_SYM_DIFF */
12963           case 23: /* R_MSP430X_GNU_SUB_ULEB128 */
12964             /* PR 21139.  */
12965             if (sym_index >= num_syms)
12966               error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
12967                      sym_index);
12968             else
12969               saved_sym = symtab + sym_index;
12970             return TRUE;
12971
12972           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
12973           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
12974             goto handle_sym_diff;
12975
12976           case 5: /* R_MSP430_16_BYTE */
12977           case 9: /* R_MSP430_8 */
12978           case 11: /* R_MSP430_GNU_SET_ULEB128 */
12979             if (uses_msp430x_relocs (filedata))
12980               break;
12981             goto handle_sym_diff;
12982
12983           case 2: /* R_MSP430_ABS16 */
12984           case 15: /* R_MSP430X_ABS16 */
12985           case 22: /* R_MSP430X_GNU_SET_ULEB128 */
12986             if (! uses_msp430x_relocs (filedata))
12987               break;
12988             goto handle_sym_diff;
12989
12990           handle_sym_diff:
12991             if (saved_sym != NULL)
12992               {
12993                 bfd_vma value;
12994                 unsigned int reloc_size = 0;
12995                 int leb_ret = 0;
12996                 switch (reloc_type)
12997                   {
12998                   case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
12999                     reloc_size = 4;
13000                     break;
13001                   case 11: /* R_MSP430_GNU_SET_ULEB128 */
13002                   case 22: /* R_MSP430X_GNU_SET_ULEB128 */
13003                     if (reloc->r_offset < (size_t) (end - start))
13004                       read_leb128 (start + reloc->r_offset, end, FALSE,
13005                                    &reloc_size, &leb_ret);
13006                     break;
13007                   default:
13008                     reloc_size = 2;
13009                     break;
13010                   }
13011
13012                 if (leb_ret != 0 || reloc_size == 0 || reloc_size > 8)
13013                   error (_("MSP430 ULEB128 field at 0x%lx contains invalid "
13014                            "ULEB128 value\n"),
13015                          (long) reloc->r_offset);
13016                 else if (sym_index >= num_syms)
13017                   error (_("MSP430 reloc contains invalid symbol index %lu\n"),
13018                          sym_index);
13019                 else
13020                   {
13021                     value = reloc->r_addend + (symtab[sym_index].st_value
13022                                                - saved_sym->st_value);
13023
13024                     if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
13025                       byte_put (start + reloc->r_offset, value, reloc_size);
13026                     else
13027                       /* PR 21137 */
13028                       error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
13029                              (long) reloc->r_offset);
13030                   }
13031
13032                 saved_sym = NULL;
13033                 return TRUE;
13034               }
13035             break;
13036
13037           default:
13038             if (saved_sym != NULL)
13039               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
13040             break;
13041           }
13042         break;
13043       }
13044
13045     case EM_MN10300:
13046     case EM_CYGNUS_MN10300:
13047       {
13048         static Elf_Internal_Sym * saved_sym = NULL;
13049
13050         if (reloc == NULL)
13051           {
13052             saved_sym = NULL;
13053             return TRUE;
13054           }
13055
13056         switch (reloc_type)
13057           {
13058           case 34: /* R_MN10300_ALIGN */
13059             return TRUE;
13060           case 33: /* R_MN10300_SYM_DIFF */
13061             if (sym_index >= num_syms)
13062               error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
13063                      sym_index);
13064             else
13065               saved_sym = symtab + sym_index;
13066             return TRUE;
13067
13068           case 1: /* R_MN10300_32 */
13069           case 2: /* R_MN10300_16 */
13070             if (saved_sym != NULL)
13071               {
13072                 int reloc_size = reloc_type == 1 ? 4 : 2;
13073                 bfd_vma value;
13074
13075                 if (sym_index >= num_syms)
13076                   error (_("MN10300 reloc contains invalid symbol index %lu\n"),
13077                          sym_index);
13078                 else
13079                   {
13080                     value = reloc->r_addend + (symtab[sym_index].st_value
13081                                                - saved_sym->st_value);
13082
13083                     if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
13084                       byte_put (start + reloc->r_offset, value, reloc_size);
13085                     else
13086                       error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
13087                              (long) reloc->r_offset);
13088                   }
13089
13090                 saved_sym = NULL;
13091                 return TRUE;
13092               }
13093             break;
13094           default:
13095             if (saved_sym != NULL)
13096               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
13097             break;
13098           }
13099         break;
13100       }
13101
13102     case EM_RL78:
13103       {
13104         static bfd_vma saved_sym1 = 0;
13105         static bfd_vma saved_sym2 = 0;
13106         static bfd_vma value;
13107
13108         if (reloc == NULL)
13109           {
13110             saved_sym1 = saved_sym2 = 0;
13111             return TRUE;
13112           }
13113
13114         switch (reloc_type)
13115           {
13116           case 0x80: /* R_RL78_SYM.  */
13117             saved_sym1 = saved_sym2;
13118             if (sym_index >= num_syms)
13119               error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
13120                      sym_index);
13121             else
13122               {
13123                 saved_sym2 = symtab[sym_index].st_value;
13124                 saved_sym2 += reloc->r_addend;
13125               }
13126             return TRUE;
13127
13128           case 0x83: /* R_RL78_OPsub.  */
13129             value = saved_sym1 - saved_sym2;
13130             saved_sym2 = saved_sym1 = 0;
13131             return TRUE;
13132             break;
13133
13134           case 0x41: /* R_RL78_ABS32.  */
13135             if (IN_RANGE (start, end, start + reloc->r_offset, 4))
13136               byte_put (start + reloc->r_offset, value, 4);
13137             else
13138               error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
13139                      (long) reloc->r_offset);
13140             value = 0;
13141             return TRUE;
13142
13143           case 0x43: /* R_RL78_ABS16.  */
13144             if (IN_RANGE (start, end, start + reloc->r_offset, 2))
13145               byte_put (start + reloc->r_offset, value, 2);
13146             else
13147               error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
13148                      (long) reloc->r_offset);
13149             value = 0;
13150             return TRUE;
13151
13152           default:
13153             break;
13154           }
13155         break;
13156       }
13157     }
13158
13159   return FALSE;
13160 }
13161
13162 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
13163    DWARF debug sections.  This is a target specific test.  Note - we do not
13164    go through the whole including-target-headers-multiple-times route, (as
13165    we have already done with <elf/h8.h>) because this would become very
13166    messy and even then this function would have to contain target specific
13167    information (the names of the relocs instead of their numeric values).
13168    FIXME: This is not the correct way to solve this problem.  The proper way
13169    is to have target specific reloc sizing and typing functions created by
13170    the reloc-macros.h header, in the same way that it already creates the
13171    reloc naming functions.  */
13172
13173 static bfd_boolean
13174 is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
13175 {
13176   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13177   switch (filedata->file_header.e_machine)
13178     {
13179     case EM_386:
13180     case EM_IAMCU:
13181       return reloc_type == 1; /* R_386_32.  */
13182     case EM_68K:
13183       return reloc_type == 1; /* R_68K_32.  */
13184     case EM_860:
13185       return reloc_type == 1; /* R_860_32.  */
13186     case EM_960:
13187       return reloc_type == 2; /* R_960_32.  */
13188     case EM_AARCH64:
13189       return (reloc_type == 258
13190               || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
13191     case EM_BPF:
13192       return reloc_type == 11; /* R_BPF_DATA_32 */
13193     case EM_ADAPTEVA_EPIPHANY:
13194       return reloc_type == 3;
13195     case EM_ALPHA:
13196       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
13197     case EM_ARC:
13198       return reloc_type == 1; /* R_ARC_32.  */
13199     case EM_ARC_COMPACT:
13200     case EM_ARC_COMPACT2:
13201       return reloc_type == 4; /* R_ARC_32.  */
13202     case EM_ARM:
13203       return reloc_type == 2; /* R_ARM_ABS32 */
13204     case EM_AVR_OLD:
13205     case EM_AVR:
13206       return reloc_type == 1;
13207     case EM_BLACKFIN:
13208       return reloc_type == 0x12; /* R_byte4_data.  */
13209     case EM_CRIS:
13210       return reloc_type == 3; /* R_CRIS_32.  */
13211     case EM_CR16:
13212       return reloc_type == 3; /* R_CR16_NUM32.  */
13213     case EM_CRX:
13214       return reloc_type == 15; /* R_CRX_NUM32.  */
13215     case EM_CSKY:
13216       return reloc_type == 1; /* R_CKCORE_ADDR32.  */
13217     case EM_CYGNUS_FRV:
13218       return reloc_type == 1;
13219     case EM_CYGNUS_D10V:
13220     case EM_D10V:
13221       return reloc_type == 6; /* R_D10V_32.  */
13222     case EM_CYGNUS_D30V:
13223     case EM_D30V:
13224       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
13225     case EM_DLX:
13226       return reloc_type == 3; /* R_DLX_RELOC_32.  */
13227     case EM_CYGNUS_FR30:
13228     case EM_FR30:
13229       return reloc_type == 3; /* R_FR30_32.  */
13230     case EM_FT32:
13231       return reloc_type == 1; /* R_FT32_32.  */
13232     case EM_H8S:
13233     case EM_H8_300:
13234     case EM_H8_300H:
13235       return reloc_type == 1; /* R_H8_DIR32.  */
13236     case EM_IA_64:
13237       return (reloc_type == 0x64    /* R_IA64_SECREL32MSB.  */
13238               || reloc_type == 0x65 /* R_IA64_SECREL32LSB.  */
13239               || reloc_type == 0x24 /* R_IA64_DIR32MSB.  */
13240               || reloc_type == 0x25 /* R_IA64_DIR32LSB.  */);
13241     case EM_IP2K_OLD:
13242     case EM_IP2K:
13243       return reloc_type == 2; /* R_IP2K_32.  */
13244     case EM_IQ2000:
13245       return reloc_type == 2; /* R_IQ2000_32.  */
13246     case EM_LATTICEMICO32:
13247       return reloc_type == 3; /* R_LM32_32.  */
13248     case EM_M32C_OLD:
13249     case EM_M32C:
13250       return reloc_type == 3; /* R_M32C_32.  */
13251     case EM_M32R:
13252       return reloc_type == 34; /* R_M32R_32_RELA.  */
13253     case EM_68HC11:
13254     case EM_68HC12:
13255       return reloc_type == 6; /* R_M68HC11_32.  */
13256     case EM_S12Z:
13257       return reloc_type == 7 || /* R_S12Z_EXT32 */
13258         reloc_type == 6;        /* R_S12Z_CW32.  */
13259     case EM_MCORE:
13260       return reloc_type == 1; /* R_MCORE_ADDR32.  */
13261     case EM_CYGNUS_MEP:
13262       return reloc_type == 4; /* R_MEP_32.  */
13263     case EM_METAG:
13264       return reloc_type == 2; /* R_METAG_ADDR32.  */
13265     case EM_MICROBLAZE:
13266       return reloc_type == 1; /* R_MICROBLAZE_32.  */
13267     case EM_MIPS:
13268       return reloc_type == 2; /* R_MIPS_32.  */
13269     case EM_MMIX:
13270       return reloc_type == 4; /* R_MMIX_32.  */
13271     case EM_CYGNUS_MN10200:
13272     case EM_MN10200:
13273       return reloc_type == 1; /* R_MN10200_32.  */
13274     case EM_CYGNUS_MN10300:
13275     case EM_MN10300:
13276       return reloc_type == 1; /* R_MN10300_32.  */
13277     case EM_MOXIE:
13278       return reloc_type == 1; /* R_MOXIE_32.  */
13279     case EM_MSP430_OLD:
13280     case EM_MSP430:
13281       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
13282     case EM_MT:
13283       return reloc_type == 2; /* R_MT_32.  */
13284     case EM_NDS32:
13285       return reloc_type == 20; /* R_NDS32_RELA.  */
13286     case EM_ALTERA_NIOS2:
13287       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
13288     case EM_NIOS32:
13289       return reloc_type == 1; /* R_NIOS_32.  */
13290     case EM_OR1K:
13291       return reloc_type == 1; /* R_OR1K_32.  */
13292     case EM_PARISC:
13293       return (reloc_type == 1 /* R_PARISC_DIR32.  */
13294               || reloc_type == 2 /* R_PARISC_DIR21L.  */
13295               || reloc_type == 41); /* R_PARISC_SECREL32.  */
13296     case EM_PJ:
13297     case EM_PJ_OLD:
13298       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
13299     case EM_PPC64:
13300       return reloc_type == 1; /* R_PPC64_ADDR32.  */
13301     case EM_PPC:
13302       return reloc_type == 1; /* R_PPC_ADDR32.  */
13303     case EM_TI_PRU:
13304       return reloc_type == 11; /* R_PRU_BFD_RELOC_32.  */
13305     case EM_RISCV:
13306       return reloc_type == 1; /* R_RISCV_32.  */
13307     case EM_RL78:
13308       return reloc_type == 1; /* R_RL78_DIR32.  */
13309     case EM_RX:
13310       return reloc_type == 1; /* R_RX_DIR32.  */
13311     case EM_S370:
13312       return reloc_type == 1; /* R_I370_ADDR31.  */
13313     case EM_S390_OLD:
13314     case EM_S390:
13315       return reloc_type == 4; /* R_S390_32.  */
13316     case EM_SCORE:
13317       return reloc_type == 8; /* R_SCORE_ABS32.  */
13318     case EM_SH:
13319       return reloc_type == 1; /* R_SH_DIR32.  */
13320     case EM_SPARC32PLUS:
13321     case EM_SPARCV9:
13322     case EM_SPARC:
13323       return reloc_type == 3 /* R_SPARC_32.  */
13324         || reloc_type == 23; /* R_SPARC_UA32.  */
13325     case EM_SPU:
13326       return reloc_type == 6; /* R_SPU_ADDR32 */
13327     case EM_TI_C6000:
13328       return reloc_type == 1; /* R_C6000_ABS32.  */
13329     case EM_TILEGX:
13330       return reloc_type == 2; /* R_TILEGX_32.  */
13331     case EM_TILEPRO:
13332       return reloc_type == 1; /* R_TILEPRO_32.  */
13333     case EM_CYGNUS_V850:
13334     case EM_V850:
13335       return reloc_type == 6; /* R_V850_ABS32.  */
13336     case EM_V800:
13337       return reloc_type == 0x33; /* R_V810_WORD.  */
13338     case EM_VAX:
13339       return reloc_type == 1; /* R_VAX_32.  */
13340     case EM_VISIUM:
13341       return reloc_type == 3;  /* R_VISIUM_32. */
13342     case EM_WEBASSEMBLY:
13343       return reloc_type == 1;  /* R_WASM32_32.  */
13344     case EM_X86_64:
13345     case EM_L1OM:
13346     case EM_K1OM:
13347       return reloc_type == 10; /* R_X86_64_32.  */
13348     case EM_XC16X:
13349     case EM_C166:
13350       return reloc_type == 3; /* R_XC16C_ABS_32.  */
13351     case EM_XGATE:
13352       return reloc_type == 4; /* R_XGATE_32.  */
13353     case EM_XSTORMY16:
13354       return reloc_type == 1; /* R_XSTROMY16_32.  */
13355     case EM_XTENSA_OLD:
13356     case EM_XTENSA:
13357       return reloc_type == 1; /* R_XTENSA_32.  */
13358     case EM_Z80:
13359       return reloc_type == 6; /* R_Z80_32.  */
13360     default:
13361       {
13362         static unsigned int prev_warn = 0;
13363
13364         /* Avoid repeating the same warning multiple times.  */
13365         if (prev_warn != filedata->file_header.e_machine)
13366           error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
13367                  filedata->file_header.e_machine);
13368         prev_warn = filedata->file_header.e_machine;
13369         return FALSE;
13370       }
13371     }
13372 }
13373
13374 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13375    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
13376
13377 static bfd_boolean
13378 is_32bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
13379 {
13380   switch (filedata->file_header.e_machine)
13381   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13382     {
13383     case EM_386:
13384     case EM_IAMCU:
13385       return reloc_type == 2;  /* R_386_PC32.  */
13386     case EM_68K:
13387       return reloc_type == 4;  /* R_68K_PC32.  */
13388     case EM_AARCH64:
13389       return reloc_type == 261; /* R_AARCH64_PREL32 */
13390     case EM_ADAPTEVA_EPIPHANY:
13391       return reloc_type == 6;
13392     case EM_ALPHA:
13393       return reloc_type == 10; /* R_ALPHA_SREL32.  */
13394     case EM_ARC_COMPACT:
13395     case EM_ARC_COMPACT2:
13396       return reloc_type == 49; /* R_ARC_32_PCREL.  */
13397     case EM_ARM:
13398       return reloc_type == 3;  /* R_ARM_REL32 */
13399     case EM_AVR_OLD:
13400     case EM_AVR:
13401       return reloc_type == 36; /* R_AVR_32_PCREL.  */
13402     case EM_MICROBLAZE:
13403       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
13404     case EM_OR1K:
13405       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
13406     case EM_PARISC:
13407       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
13408     case EM_PPC:
13409       return reloc_type == 26; /* R_PPC_REL32.  */
13410     case EM_PPC64:
13411       return reloc_type == 26; /* R_PPC64_REL32.  */
13412     case EM_RISCV:
13413       return reloc_type == 57;  /* R_RISCV_32_PCREL.  */
13414     case EM_S390_OLD:
13415     case EM_S390:
13416       return reloc_type == 5;  /* R_390_PC32.  */
13417     case EM_SH:
13418       return reloc_type == 2;  /* R_SH_REL32.  */
13419     case EM_SPARC32PLUS:
13420     case EM_SPARCV9:
13421     case EM_SPARC:
13422       return reloc_type == 6;  /* R_SPARC_DISP32.  */
13423     case EM_SPU:
13424       return reloc_type == 13; /* R_SPU_REL32.  */
13425     case EM_TILEGX:
13426       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
13427     case EM_TILEPRO:
13428       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
13429     case EM_VISIUM:
13430       return reloc_type == 6;  /* R_VISIUM_32_PCREL */
13431     case EM_X86_64:
13432     case EM_L1OM:
13433     case EM_K1OM:
13434       return reloc_type == 2;  /* R_X86_64_PC32.  */
13435     case EM_VAX:
13436       return reloc_type == 4;  /* R_VAX_PCREL32.  */
13437     case EM_XTENSA_OLD:
13438     case EM_XTENSA:
13439       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
13440     default:
13441       /* Do not abort or issue an error message here.  Not all targets use
13442          pc-relative 32-bit relocs in their DWARF debug information and we
13443          have already tested for target coverage in is_32bit_abs_reloc.  A
13444          more helpful warning message will be generated by apply_relocations
13445          anyway, so just return.  */
13446       return FALSE;
13447     }
13448 }
13449
13450 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13451    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
13452
13453 static bfd_boolean
13454 is_64bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
13455 {
13456   switch (filedata->file_header.e_machine)
13457     {
13458     case EM_AARCH64:
13459       return reloc_type == 257; /* R_AARCH64_ABS64.  */
13460     case EM_ALPHA:
13461       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
13462     case EM_IA_64:
13463       return (reloc_type == 0x26    /* R_IA64_DIR64MSB.  */
13464               || reloc_type == 0x27 /* R_IA64_DIR64LSB.  */);
13465     case EM_PARISC:
13466       return reloc_type == 80; /* R_PARISC_DIR64.  */
13467     case EM_PPC64:
13468       return reloc_type == 38; /* R_PPC64_ADDR64.  */
13469     case EM_RISCV:
13470       return reloc_type == 2; /* R_RISCV_64.  */
13471     case EM_SPARC32PLUS:
13472     case EM_SPARCV9:
13473     case EM_SPARC:
13474       return reloc_type == 32 /* R_SPARC_64.  */
13475         || reloc_type == 54; /* R_SPARC_UA64.  */
13476     case EM_X86_64:
13477     case EM_L1OM:
13478     case EM_K1OM:
13479       return reloc_type == 1; /* R_X86_64_64.  */
13480     case EM_S390_OLD:
13481     case EM_S390:
13482       return reloc_type == 22;  /* R_S390_64.  */
13483     case EM_TILEGX:
13484       return reloc_type == 1; /* R_TILEGX_64.  */
13485     case EM_MIPS:
13486       return reloc_type == 18;  /* R_MIPS_64.  */
13487     default:
13488       return FALSE;
13489     }
13490 }
13491
13492 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
13493    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
13494
13495 static bfd_boolean
13496 is_64bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
13497 {
13498   switch (filedata->file_header.e_machine)
13499     {
13500     case EM_AARCH64:
13501       return reloc_type == 260; /* R_AARCH64_PREL64.  */
13502     case EM_ALPHA:
13503       return reloc_type == 11; /* R_ALPHA_SREL64.  */
13504     case EM_IA_64:
13505       return (reloc_type == 0x4e    /* R_IA64_PCREL64MSB.  */
13506               || reloc_type == 0x4f /* R_IA64_PCREL64LSB.  */);
13507     case EM_PARISC:
13508       return reloc_type == 72; /* R_PARISC_PCREL64.  */
13509     case EM_PPC64:
13510       return reloc_type == 44; /* R_PPC64_REL64.  */
13511     case EM_SPARC32PLUS:
13512     case EM_SPARCV9:
13513     case EM_SPARC:
13514       return reloc_type == 46; /* R_SPARC_DISP64.  */
13515     case EM_X86_64:
13516     case EM_L1OM:
13517     case EM_K1OM:
13518       return reloc_type == 24; /* R_X86_64_PC64.  */
13519     case EM_S390_OLD:
13520     case EM_S390:
13521       return reloc_type == 23;  /* R_S390_PC64.  */
13522     case EM_TILEGX:
13523       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
13524     default:
13525       return FALSE;
13526     }
13527 }
13528
13529 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13530    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
13531
13532 static bfd_boolean
13533 is_24bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
13534 {
13535   switch (filedata->file_header.e_machine)
13536     {
13537     case EM_CYGNUS_MN10200:
13538     case EM_MN10200:
13539       return reloc_type == 4; /* R_MN10200_24.  */
13540     case EM_FT32:
13541       return reloc_type == 5; /* R_FT32_20.  */
13542     case EM_Z80:
13543       return reloc_type == 5; /* R_Z80_24. */
13544     default:
13545       return FALSE;
13546     }
13547 }
13548
13549 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13550    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
13551
13552 static bfd_boolean
13553 is_16bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
13554 {
13555   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13556   switch (filedata->file_header.e_machine)
13557     {
13558     case EM_ARC:
13559     case EM_ARC_COMPACT:
13560     case EM_ARC_COMPACT2:
13561       return reloc_type == 2; /* R_ARC_16.  */
13562     case EM_ADAPTEVA_EPIPHANY:
13563       return reloc_type == 5;
13564     case EM_AVR_OLD:
13565     case EM_AVR:
13566       return reloc_type == 4; /* R_AVR_16.  */
13567     case EM_CYGNUS_D10V:
13568     case EM_D10V:
13569       return reloc_type == 3; /* R_D10V_16.  */
13570     case EM_FT32:
13571       return reloc_type == 2; /* R_FT32_16.  */
13572     case EM_H8S:
13573     case EM_H8_300:
13574     case EM_H8_300H:
13575       return reloc_type == R_H8_DIR16;
13576     case EM_IP2K_OLD:
13577     case EM_IP2K:
13578       return reloc_type == 1; /* R_IP2K_16.  */
13579     case EM_M32C_OLD:
13580     case EM_M32C:
13581       return reloc_type == 1; /* R_M32C_16 */
13582     case EM_CYGNUS_MN10200:
13583     case EM_MN10200:
13584       return reloc_type == 2; /* R_MN10200_16.  */
13585     case EM_CYGNUS_MN10300:
13586     case EM_MN10300:
13587       return reloc_type == 2; /* R_MN10300_16.  */
13588     case EM_MSP430:
13589       if (uses_msp430x_relocs (filedata))
13590         return reloc_type == 2; /* R_MSP430_ABS16.  */
13591       /* Fall through.  */
13592     case EM_MSP430_OLD:
13593       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
13594     case EM_NDS32:
13595       return reloc_type == 19; /* R_NDS32_RELA.  */
13596     case EM_ALTERA_NIOS2:
13597       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
13598     case EM_NIOS32:
13599       return reloc_type == 9; /* R_NIOS_16.  */
13600     case EM_OR1K:
13601       return reloc_type == 2; /* R_OR1K_16.  */
13602     case EM_RISCV:
13603       return reloc_type == 55; /* R_RISCV_SET16.  */
13604     case EM_TI_PRU:
13605       return reloc_type == 8; /* R_PRU_BFD_RELOC_16.  */
13606     case EM_TI_C6000:
13607       return reloc_type == 2; /* R_C6000_ABS16.  */
13608     case EM_VISIUM:
13609       return reloc_type == 2; /* R_VISIUM_16. */
13610     case EM_XC16X:
13611     case EM_C166:
13612       return reloc_type == 2; /* R_XC16C_ABS_16.  */
13613     case EM_XGATE:
13614       return reloc_type == 3; /* R_XGATE_16.  */
13615     case EM_Z80:
13616       return reloc_type == 4; /* R_Z80_16.  */
13617     default:
13618       return FALSE;
13619     }
13620 }
13621
13622 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13623    a 8-bit absolute RELA relocation used in DWARF debug sections.  */
13624
13625 static bfd_boolean
13626 is_8bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
13627 {
13628   switch (filedata->file_header.e_machine)
13629     {
13630     case EM_RISCV:
13631       return reloc_type == 54; /* R_RISCV_SET8.  */
13632     case EM_Z80:
13633       return reloc_type == 1;  /* R_Z80_8.  */
13634     default:
13635       return FALSE;
13636     }
13637 }
13638
13639 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13640    a 6-bit absolute RELA relocation used in DWARF debug sections.  */
13641
13642 static bfd_boolean
13643 is_6bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
13644 {
13645   switch (filedata->file_header.e_machine)
13646     {
13647     case EM_RISCV:
13648       return reloc_type == 53; /* R_RISCV_SET6.  */
13649     default:
13650       return FALSE;
13651     }
13652 }
13653
13654 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13655    a 32-bit inplace add RELA relocation used in DWARF debug sections.  */
13656
13657 static bfd_boolean
13658 is_32bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
13659 {
13660   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13661   switch (filedata->file_header.e_machine)
13662     {
13663     case EM_RISCV:
13664       return reloc_type == 35; /* R_RISCV_ADD32.  */
13665     default:
13666       return FALSE;
13667     }
13668 }
13669
13670 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13671    a 32-bit inplace sub RELA relocation used in DWARF debug sections.  */
13672
13673 static bfd_boolean
13674 is_32bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
13675 {
13676   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13677   switch (filedata->file_header.e_machine)
13678     {
13679     case EM_RISCV:
13680       return reloc_type == 39; /* R_RISCV_SUB32.  */
13681     default:
13682       return FALSE;
13683     }
13684 }
13685
13686 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13687    a 64-bit inplace add RELA relocation used in DWARF debug sections.  */
13688
13689 static bfd_boolean
13690 is_64bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
13691 {
13692   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13693   switch (filedata->file_header.e_machine)
13694     {
13695     case EM_RISCV:
13696       return reloc_type == 36; /* R_RISCV_ADD64.  */
13697     default:
13698       return FALSE;
13699     }
13700 }
13701
13702 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13703    a 64-bit inplace sub RELA relocation used in DWARF debug sections.  */
13704
13705 static bfd_boolean
13706 is_64bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
13707 {
13708   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13709   switch (filedata->file_header.e_machine)
13710     {
13711     case EM_RISCV:
13712       return reloc_type == 40; /* R_RISCV_SUB64.  */
13713     default:
13714       return FALSE;
13715     }
13716 }
13717
13718 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13719    a 16-bit inplace add RELA relocation used in DWARF debug sections.  */
13720
13721 static bfd_boolean
13722 is_16bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
13723 {
13724   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13725   switch (filedata->file_header.e_machine)
13726     {
13727     case EM_RISCV:
13728       return reloc_type == 34; /* R_RISCV_ADD16.  */
13729     default:
13730       return FALSE;
13731     }
13732 }
13733
13734 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13735    a 16-bit inplace sub RELA relocation used in DWARF debug sections.  */
13736
13737 static bfd_boolean
13738 is_16bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
13739 {
13740   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13741   switch (filedata->file_header.e_machine)
13742     {
13743     case EM_RISCV:
13744       return reloc_type == 38; /* R_RISCV_SUB16.  */
13745     default:
13746       return FALSE;
13747     }
13748 }
13749
13750 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13751    a 8-bit inplace add RELA relocation used in DWARF debug sections.  */
13752
13753 static bfd_boolean
13754 is_8bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
13755 {
13756   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13757   switch (filedata->file_header.e_machine)
13758     {
13759     case EM_RISCV:
13760       return reloc_type == 33; /* R_RISCV_ADD8.  */
13761     default:
13762       return FALSE;
13763     }
13764 }
13765
13766 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13767    a 8-bit inplace sub RELA relocation used in DWARF debug sections.  */
13768
13769 static bfd_boolean
13770 is_8bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
13771 {
13772   /* Please keep this table alpha-sorted for ease of visual lookup.  */
13773   switch (filedata->file_header.e_machine)
13774     {
13775     case EM_RISCV:
13776       return reloc_type == 37; /* R_RISCV_SUB8.  */
13777     default:
13778       return FALSE;
13779     }
13780 }
13781
13782 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
13783    a 6-bit inplace sub RELA relocation used in DWARF debug sections.  */
13784
13785 static bfd_boolean
13786 is_6bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
13787 {
13788   switch (filedata->file_header.e_machine)
13789     {
13790     case EM_RISCV:
13791       return reloc_type == 52; /* R_RISCV_SUB6.  */
13792     default:
13793       return FALSE;
13794     }
13795 }
13796
13797 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
13798    relocation entries (possibly formerly used for SHT_GROUP sections).  */
13799
13800 static bfd_boolean
13801 is_none_reloc (Filedata * filedata, unsigned int reloc_type)
13802 {
13803   switch (filedata->file_header.e_machine)
13804     {
13805     case EM_386:     /* R_386_NONE.  */
13806     case EM_68K:     /* R_68K_NONE.  */
13807     case EM_ADAPTEVA_EPIPHANY:
13808     case EM_ALPHA:   /* R_ALPHA_NONE.  */
13809     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
13810     case EM_ARC:     /* R_ARC_NONE.  */
13811     case EM_ARC_COMPACT2: /* R_ARC_NONE.  */
13812     case EM_ARC_COMPACT: /* R_ARC_NONE.  */
13813     case EM_ARM:     /* R_ARM_NONE.  */
13814     case EM_C166:    /* R_XC16X_NONE.  */
13815     case EM_CRIS:    /* R_CRIS_NONE.  */
13816     case EM_FT32:    /* R_FT32_NONE.  */
13817     case EM_IA_64:   /* R_IA64_NONE.  */
13818     case EM_K1OM:    /* R_X86_64_NONE.  */
13819     case EM_L1OM:    /* R_X86_64_NONE.  */
13820     case EM_M32R:    /* R_M32R_NONE.  */
13821     case EM_MIPS:    /* R_MIPS_NONE.  */
13822     case EM_MN10300: /* R_MN10300_NONE.  */
13823     case EM_MOXIE:   /* R_MOXIE_NONE.  */
13824     case EM_NIOS32:  /* R_NIOS_NONE.  */
13825     case EM_OR1K:    /* R_OR1K_NONE. */
13826     case EM_PARISC:  /* R_PARISC_NONE.  */
13827     case EM_PPC64:   /* R_PPC64_NONE.  */
13828     case EM_PPC:     /* R_PPC_NONE.  */
13829     case EM_RISCV:   /* R_RISCV_NONE.  */
13830     case EM_S390:    /* R_390_NONE.  */
13831     case EM_S390_OLD:
13832     case EM_SH:      /* R_SH_NONE.  */
13833     case EM_SPARC32PLUS:
13834     case EM_SPARC:   /* R_SPARC_NONE.  */
13835     case EM_SPARCV9:
13836     case EM_TILEGX:  /* R_TILEGX_NONE.  */
13837     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
13838     case EM_TI_C6000:/* R_C6000_NONE.  */
13839     case EM_X86_64:  /* R_X86_64_NONE.  */
13840     case EM_XC16X:
13841     case EM_Z80:     /* R_Z80_NONE. */
13842     case EM_WEBASSEMBLY: /* R_WASM32_NONE.  */
13843       return reloc_type == 0;
13844
13845     case EM_AARCH64:
13846       return reloc_type == 0 || reloc_type == 256;
13847     case EM_AVR_OLD:
13848     case EM_AVR:
13849       return (reloc_type == 0 /* R_AVR_NONE.  */
13850               || reloc_type == 30 /* R_AVR_DIFF8.  */
13851               || reloc_type == 31 /* R_AVR_DIFF16.  */
13852               || reloc_type == 32 /* R_AVR_DIFF32.  */);
13853     case EM_METAG:
13854       return reloc_type == 3; /* R_METAG_NONE.  */
13855     case EM_NDS32:
13856       return (reloc_type == 0       /* R_XTENSA_NONE.  */
13857               || reloc_type == 204  /* R_NDS32_DIFF8.  */
13858               || reloc_type == 205  /* R_NDS32_DIFF16.  */
13859               || reloc_type == 206  /* R_NDS32_DIFF32.  */
13860               || reloc_type == 207  /* R_NDS32_ULEB128.  */);
13861     case EM_TI_PRU:
13862       return (reloc_type == 0       /* R_PRU_NONE.  */
13863               || reloc_type == 65   /* R_PRU_DIFF8.  */
13864               || reloc_type == 66   /* R_PRU_DIFF16.  */
13865               || reloc_type == 67   /* R_PRU_DIFF32.  */);
13866     case EM_XTENSA_OLD:
13867     case EM_XTENSA:
13868       return (reloc_type == 0      /* R_XTENSA_NONE.  */
13869               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
13870               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
13871               || reloc_type == 19  /* R_XTENSA_DIFF32.  */
13872               || reloc_type == 57  /* R_XTENSA_PDIFF8.  */
13873               || reloc_type == 58  /* R_XTENSA_PDIFF16.  */
13874               || reloc_type == 59  /* R_XTENSA_PDIFF32.  */
13875               || reloc_type == 60  /* R_XTENSA_NDIFF8.  */
13876               || reloc_type == 61  /* R_XTENSA_NDIFF16.  */
13877               || reloc_type == 62  /* R_XTENSA_NDIFF32.  */);
13878     }
13879   return FALSE;
13880 }
13881
13882 /* Returns TRUE if there is a relocation against
13883    section NAME at OFFSET bytes.  */
13884
13885 bfd_boolean
13886 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
13887 {
13888   Elf_Internal_Rela * relocs;
13889   Elf_Internal_Rela * rp;
13890
13891   if (dsec == NULL || dsec->reloc_info == NULL)
13892     return FALSE;
13893
13894   relocs = (Elf_Internal_Rela *) dsec->reloc_info;
13895
13896   for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
13897     if (rp->r_offset == offset)
13898       return TRUE;
13899
13900    return FALSE;
13901 }
13902
13903 /* Apply relocations to a section.
13904    Returns TRUE upon success, FALSE otherwise.
13905    If RELOCS_RETURN is non-NULL then it is set to point to the loaded relocs.
13906    It is then the caller's responsibility to free them.  NUM_RELOCS_RETURN
13907    will be set to the number of relocs loaded.
13908
13909    Note: So far support has been added only for those relocations
13910    which can be found in debug sections. FIXME: Add support for
13911    more relocations ?  */
13912
13913 static bfd_boolean
13914 apply_relocations (Filedata *                 filedata,
13915                    const Elf_Internal_Shdr *  section,
13916                    unsigned char *            start,
13917                    bfd_size_type              size,
13918                    void **                    relocs_return,
13919                    unsigned long *            num_relocs_return)
13920 {
13921   Elf_Internal_Shdr * relsec;
13922   unsigned char * end = start + size;
13923
13924   if (relocs_return != NULL)
13925     {
13926       * (Elf_Internal_Rela **) relocs_return = NULL;
13927       * num_relocs_return = 0;
13928     }
13929
13930   if (filedata->file_header.e_type != ET_REL)
13931     /* No relocs to apply.  */
13932     return TRUE;
13933
13934   /* Find the reloc section associated with the section.  */
13935   for (relsec = filedata->section_headers;
13936        relsec < filedata->section_headers + filedata->file_header.e_shnum;
13937        ++relsec)
13938     {
13939       bfd_boolean is_rela;
13940       unsigned long num_relocs;
13941       Elf_Internal_Rela * relocs;
13942       Elf_Internal_Rela * rp;
13943       Elf_Internal_Shdr * symsec;
13944       Elf_Internal_Sym * symtab;
13945       unsigned long num_syms;
13946       Elf_Internal_Sym * sym;
13947
13948       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13949           || relsec->sh_info >= filedata->file_header.e_shnum
13950           || filedata->section_headers + relsec->sh_info != section
13951           || relsec->sh_size == 0
13952           || relsec->sh_link >= filedata->file_header.e_shnum)
13953         continue;
13954
13955       symsec = filedata->section_headers + relsec->sh_link;
13956       if (symsec->sh_type != SHT_SYMTAB
13957           && symsec->sh_type != SHT_DYNSYM)
13958         return FALSE;
13959
13960       is_rela = relsec->sh_type == SHT_RELA;
13961
13962       if (is_rela)
13963         {
13964           if (!slurp_rela_relocs (filedata, relsec->sh_offset,
13965                                   relsec->sh_size, & relocs, & num_relocs))
13966             return FALSE;
13967         }
13968       else
13969         {
13970           if (!slurp_rel_relocs (filedata, relsec->sh_offset,
13971                                  relsec->sh_size, & relocs, & num_relocs))
13972             return FALSE;
13973         }
13974
13975       /* SH uses RELA but uses in place value instead of the addend field.  */
13976       if (filedata->file_header.e_machine == EM_SH)
13977         is_rela = FALSE;
13978
13979       symtab = GET_ELF_SYMBOLS (filedata, symsec, & num_syms);
13980
13981       for (rp = relocs; rp < relocs + num_relocs; ++rp)
13982         {
13983           bfd_vma         addend;
13984           unsigned int    reloc_type;
13985           unsigned int    reloc_size;
13986           bfd_boolean     reloc_inplace = FALSE;
13987           bfd_boolean     reloc_subtract = FALSE;
13988           unsigned char * rloc;
13989           unsigned long   sym_index;
13990
13991           reloc_type = get_reloc_type (filedata, rp->r_info);
13992
13993           if (target_specific_reloc_handling (filedata, rp, start, end, symtab, num_syms))
13994             continue;
13995           else if (is_none_reloc (filedata, reloc_type))
13996             continue;
13997           else if (is_32bit_abs_reloc (filedata, reloc_type)
13998                    || is_32bit_pcrel_reloc (filedata, reloc_type))
13999             reloc_size = 4;
14000           else if (is_64bit_abs_reloc (filedata, reloc_type)
14001                    || is_64bit_pcrel_reloc (filedata, reloc_type))
14002             reloc_size = 8;
14003           else if (is_24bit_abs_reloc (filedata, reloc_type))
14004             reloc_size = 3;
14005           else if (is_16bit_abs_reloc (filedata, reloc_type))
14006             reloc_size = 2;
14007           else if (is_8bit_abs_reloc (filedata, reloc_type)
14008                    || is_6bit_abs_reloc (filedata, reloc_type))
14009             reloc_size = 1;
14010           else if ((reloc_subtract = is_32bit_inplace_sub_reloc (filedata,
14011                                                                  reloc_type))
14012                    || is_32bit_inplace_add_reloc (filedata, reloc_type))
14013             {
14014               reloc_size = 4;
14015               reloc_inplace = TRUE;
14016             }
14017           else if ((reloc_subtract = is_64bit_inplace_sub_reloc (filedata,
14018                                                                  reloc_type))
14019                    || is_64bit_inplace_add_reloc (filedata, reloc_type))
14020             {
14021               reloc_size = 8;
14022               reloc_inplace = TRUE;
14023             }
14024           else if ((reloc_subtract = is_16bit_inplace_sub_reloc (filedata,
14025                                                                  reloc_type))
14026                    || is_16bit_inplace_add_reloc (filedata, reloc_type))
14027             {
14028               reloc_size = 2;
14029               reloc_inplace = TRUE;
14030             }
14031           else if ((reloc_subtract = is_8bit_inplace_sub_reloc (filedata,
14032                                                                 reloc_type))
14033                    || is_8bit_inplace_add_reloc (filedata, reloc_type))
14034             {
14035               reloc_size = 1;
14036               reloc_inplace = TRUE;
14037             }
14038           else if ((reloc_subtract = is_6bit_inplace_sub_reloc (filedata,
14039                                                                 reloc_type)))
14040             {
14041               reloc_size = 1;
14042               reloc_inplace = TRUE;
14043             }
14044           else
14045             {
14046               static unsigned int prev_reloc = 0;
14047
14048               if (reloc_type != prev_reloc)
14049                 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
14050                       reloc_type, printable_section_name (filedata, section));
14051               prev_reloc = reloc_type;
14052               continue;
14053             }
14054
14055           rloc = start + rp->r_offset;
14056           if (!IN_RANGE (start, end, rloc, reloc_size))
14057             {
14058               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
14059                     (unsigned long) rp->r_offset,
14060                     printable_section_name (filedata, section));
14061               continue;
14062             }
14063
14064           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
14065           if (sym_index >= num_syms)
14066             {
14067               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
14068                     sym_index, printable_section_name (filedata, section));
14069               continue;
14070             }
14071           sym = symtab + sym_index;
14072
14073           /* If the reloc has a symbol associated with it,
14074              make sure that it is of an appropriate type.
14075
14076              Relocations against symbols without type can happen.
14077              Gcc -feliminate-dwarf2-dups may generate symbols
14078              without type for debug info.
14079
14080              Icc generates relocations against function symbols
14081              instead of local labels.
14082
14083              Relocations against object symbols can happen, eg when
14084              referencing a global array.  For an example of this see
14085              the _clz.o binary in libgcc.a.  */
14086           if (sym != symtab
14087               && ELF_ST_TYPE (sym->st_info) != STT_COMMON
14088               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
14089             {
14090               warn (_("skipping unexpected symbol type %s in section %s relocation %ld\n"),
14091                     get_symbol_type (filedata, ELF_ST_TYPE (sym->st_info)),
14092                     printable_section_name (filedata, relsec),
14093                     (long int)(rp - relocs));
14094               continue;
14095             }
14096
14097           addend = 0;
14098           if (is_rela)
14099             addend += rp->r_addend;
14100           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
14101              partial_inplace.  */
14102           if (!is_rela
14103               || (filedata->file_header.e_machine == EM_XTENSA
14104                   && reloc_type == 1)
14105               || ((filedata->file_header.e_machine == EM_PJ
14106                    || filedata->file_header.e_machine == EM_PJ_OLD)
14107                   && reloc_type == 1)
14108               || ((filedata->file_header.e_machine == EM_D30V
14109                    || filedata->file_header.e_machine == EM_CYGNUS_D30V)
14110                   && reloc_type == 12)
14111               || reloc_inplace)
14112             {
14113               if (is_6bit_inplace_sub_reloc (filedata, reloc_type))
14114                 addend += byte_get (rloc, reloc_size) & 0x3f;
14115               else
14116                 addend += byte_get (rloc, reloc_size);
14117             }
14118
14119           if (is_32bit_pcrel_reloc (filedata, reloc_type)
14120               || is_64bit_pcrel_reloc (filedata, reloc_type))
14121             {
14122               /* On HPPA, all pc-relative relocations are biased by 8.  */
14123               if (filedata->file_header.e_machine == EM_PARISC)
14124                 addend -= 8;
14125               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
14126                         reloc_size);
14127             }
14128           else if (is_6bit_abs_reloc (filedata, reloc_type)
14129                    || is_6bit_inplace_sub_reloc (filedata, reloc_type))
14130             {
14131               if (reloc_subtract)
14132                 addend -= sym->st_value;
14133               else
14134                 addend += sym->st_value;
14135               addend = (addend & 0x3f) | (byte_get (rloc, reloc_size) & 0xc0);
14136               byte_put (rloc, addend, reloc_size);
14137             }
14138           else if (reloc_subtract)
14139             byte_put (rloc, addend - sym->st_value, reloc_size);
14140           else
14141             byte_put (rloc, addend + sym->st_value, reloc_size);
14142         }
14143
14144       free (symtab);
14145       /* Let the target specific reloc processing code know that
14146          we have finished with these relocs.  */
14147       target_specific_reloc_handling (filedata, NULL, NULL, NULL, NULL, 0);
14148
14149       if (relocs_return)
14150         {
14151           * (Elf_Internal_Rela **) relocs_return = relocs;
14152           * num_relocs_return = num_relocs;
14153         }
14154       else
14155         free (relocs);
14156
14157       break;
14158     }
14159
14160   return TRUE;
14161 }
14162
14163 #ifdef SUPPORT_DISASSEMBLY
14164 static bfd_boolean
14165 disassemble_section (Elf_Internal_Shdr * section, Filedata * filedata)
14166 {
14167   printf (_("\nAssembly dump of section %s\n"), printable_section_name (filedata, section));
14168
14169   /* FIXME: XXX -- to be done --- XXX */
14170
14171   return TRUE;
14172 }
14173 #endif
14174
14175 /* Reads in the contents of SECTION from FILE, returning a pointer
14176    to a malloc'ed buffer or NULL if something went wrong.  */
14177
14178 static char *
14179 get_section_contents (Elf_Internal_Shdr * section, Filedata * filedata)
14180 {
14181   bfd_size_type num_bytes = section->sh_size;
14182
14183   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
14184     {
14185       printf (_("Section '%s' has no data to dump.\n"),
14186               printable_section_name (filedata, section));
14187       return NULL;
14188     }
14189
14190   return  (char *) get_data (NULL, filedata, section->sh_offset, 1, num_bytes,
14191                              _("section contents"));
14192 }
14193
14194 /* Uncompresses a section that was compressed using zlib, in place.  */
14195
14196 static bfd_boolean
14197 uncompress_section_contents (unsigned char **   buffer,
14198                              dwarf_size_type    uncompressed_size,
14199                              dwarf_size_type *  size)
14200 {
14201   dwarf_size_type compressed_size = *size;
14202   unsigned char * compressed_buffer = *buffer;
14203   unsigned char * uncompressed_buffer;
14204   z_stream strm;
14205   int rc;
14206
14207   /* It is possible the section consists of several compressed
14208      buffers concatenated together, so we uncompress in a loop.  */
14209   /* PR 18313: The state field in the z_stream structure is supposed
14210      to be invisible to the user (ie us), but some compilers will
14211      still complain about it being used without initialisation.  So
14212      we first zero the entire z_stream structure and then set the fields
14213      that we need.  */
14214   memset (& strm, 0, sizeof strm);
14215   strm.avail_in = compressed_size;
14216   strm.next_in = (Bytef *) compressed_buffer;
14217   strm.avail_out = uncompressed_size;
14218   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
14219
14220   rc = inflateInit (& strm);
14221   while (strm.avail_in > 0)
14222     {
14223       if (rc != Z_OK)
14224         goto fail;
14225       strm.next_out = ((Bytef *) uncompressed_buffer
14226                        + (uncompressed_size - strm.avail_out));
14227       rc = inflate (&strm, Z_FINISH);
14228       if (rc != Z_STREAM_END)
14229         goto fail;
14230       rc = inflateReset (& strm);
14231     }
14232   rc = inflateEnd (& strm);
14233   if (rc != Z_OK
14234       || strm.avail_out != 0)
14235     goto fail;
14236
14237   *buffer = uncompressed_buffer;
14238   *size = uncompressed_size;
14239   return TRUE;
14240
14241  fail:
14242   free (uncompressed_buffer);
14243   /* Indicate decompression failure.  */
14244   *buffer = NULL;
14245   return FALSE;
14246 }
14247
14248 static bfd_boolean
14249 dump_section_as_strings (Elf_Internal_Shdr * section, Filedata * filedata)
14250 {
14251   Elf_Internal_Shdr *  relsec;
14252   bfd_size_type        num_bytes;
14253   unsigned char *      data;
14254   unsigned char *      end;
14255   unsigned char *      real_start;
14256   unsigned char *      start;
14257   bfd_boolean          some_strings_shown;
14258
14259   real_start = start = (unsigned char *) get_section_contents (section, filedata);
14260   if (start == NULL)
14261     /* PR 21820: Do not fail if the section was empty.  */
14262     return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
14263
14264   num_bytes = section->sh_size;
14265
14266   printf (_("\nString dump of section '%s':\n"), printable_section_name (filedata, section));
14267
14268   if (decompress_dumps)
14269     {
14270       dwarf_size_type new_size = num_bytes;
14271       dwarf_size_type uncompressed_size = 0;
14272
14273       if ((section->sh_flags & SHF_COMPRESSED) != 0)
14274         {
14275           Elf_Internal_Chdr chdr;
14276           unsigned int compression_header_size
14277             = get_compression_header (& chdr, (unsigned char *) start,
14278                                       num_bytes);
14279           if (compression_header_size == 0)
14280             /* An error message will have already been generated
14281                by get_compression_header.  */
14282             goto error_out;
14283
14284           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
14285             {
14286               warn (_("section '%s' has unsupported compress type: %d\n"),
14287                     printable_section_name (filedata, section), chdr.ch_type);
14288               goto error_out;
14289             }
14290           uncompressed_size = chdr.ch_size;
14291           start += compression_header_size;
14292           new_size -= compression_header_size;
14293         }
14294       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
14295         {
14296           /* Read the zlib header.  In this case, it should be "ZLIB"
14297              followed by the uncompressed section size, 8 bytes in
14298              big-endian order.  */
14299           uncompressed_size = start[4]; uncompressed_size <<= 8;
14300           uncompressed_size += start[5]; uncompressed_size <<= 8;
14301           uncompressed_size += start[6]; uncompressed_size <<= 8;
14302           uncompressed_size += start[7]; uncompressed_size <<= 8;
14303           uncompressed_size += start[8]; uncompressed_size <<= 8;
14304           uncompressed_size += start[9]; uncompressed_size <<= 8;
14305           uncompressed_size += start[10]; uncompressed_size <<= 8;
14306           uncompressed_size += start[11];
14307           start += 12;
14308           new_size -= 12;
14309         }
14310
14311       if (uncompressed_size)
14312         {
14313           if (uncompress_section_contents (& start,
14314                                            uncompressed_size, & new_size))
14315             num_bytes = new_size;
14316           else
14317             {
14318               error (_("Unable to decompress section %s\n"),
14319                      printable_section_name (filedata, section));
14320               goto error_out;
14321             }
14322         }
14323       else
14324         start = real_start;
14325     }
14326
14327   /* If the section being dumped has relocations against it the user might
14328      be expecting these relocations to have been applied.  Check for this
14329      case and issue a warning message in order to avoid confusion.
14330      FIXME: Maybe we ought to have an option that dumps a section with
14331      relocs applied ?  */
14332   for (relsec = filedata->section_headers;
14333        relsec < filedata->section_headers + filedata->file_header.e_shnum;
14334        ++relsec)
14335     {
14336       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
14337           || relsec->sh_info >= filedata->file_header.e_shnum
14338           || filedata->section_headers + relsec->sh_info != section
14339           || relsec->sh_size == 0
14340           || relsec->sh_link >= filedata->file_header.e_shnum)
14341         continue;
14342
14343       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
14344       break;
14345     }
14346
14347   data = start;
14348   end  = start + num_bytes;
14349   some_strings_shown = FALSE;
14350
14351 #ifdef HAVE_MBSTATE_T
14352   mbstate_t state;
14353   /* Initialise the multibyte conversion state.  */
14354   memset (& state, 0, sizeof (state));
14355 #endif
14356
14357   bfd_boolean continuing = FALSE;
14358
14359   while (data < end)
14360     {
14361       while (!ISPRINT (* data))
14362         if (++ data >= end)
14363           break;
14364
14365       if (data < end)
14366         {
14367           size_t maxlen = end - data;
14368
14369           if (continuing)
14370             {
14371               printf ("            ");
14372               continuing = FALSE;
14373             }
14374           else
14375             {
14376               printf ("  [%6lx]  ", (unsigned long) (data - start));
14377             }
14378
14379           if (maxlen > 0)
14380             {
14381               char c = 0;
14382
14383               while (maxlen)
14384                 {
14385                   c = *data++;
14386
14387                   if (c == 0)
14388                     break;
14389
14390                   /* PR 25543: Treat new-lines as string-ending characters.  */
14391                   if (c == '\n')
14392                     {
14393                       printf ("\\n\n");
14394                       if (*data != 0)
14395                         continuing = TRUE;
14396                       break;
14397                     }
14398
14399                   /* Do not print control characters directly as they can affect terminal
14400                      settings.  Such characters usually appear in the names generated
14401                      by the assembler for local labels.  */
14402                   if (ISCNTRL (c))
14403                     {
14404                       printf ("^%c", c + 0x40);
14405                     }
14406                   else if (ISPRINT (c))
14407                     {
14408                       putchar (c);
14409                     }
14410                   else
14411                     {
14412                       size_t  n;
14413 #ifdef HAVE_MBSTATE_T
14414                       wchar_t w;
14415 #endif
14416                       /* Let printf do the hard work of displaying multibyte characters.  */
14417                       printf ("%.1s", data - 1);
14418 #ifdef HAVE_MBSTATE_T
14419                       /* Try to find out how many bytes made up the character that was
14420                          just printed.  Advance the symbol pointer past the bytes that
14421                          were displayed.  */
14422                       n = mbrtowc (& w, (char *)(data - 1), MB_CUR_MAX, & state);
14423 #else
14424                       n = 1;
14425 #endif
14426                       if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
14427                         data += (n - 1);
14428                     }
14429                 }
14430
14431               if (c != '\n')
14432                 putchar ('\n');
14433             }
14434           else
14435             {
14436               printf (_("<corrupt>\n"));
14437               data = end;
14438             }
14439           some_strings_shown = TRUE;
14440         }
14441     }
14442
14443   if (! some_strings_shown)
14444     printf (_("  No strings found in this section."));
14445
14446   free (real_start);
14447
14448   putchar ('\n');
14449   return TRUE;
14450
14451 error_out:
14452   free (real_start);
14453   return FALSE;
14454 }
14455
14456 static bfd_boolean
14457 dump_section_as_bytes (Elf_Internal_Shdr *  section,
14458                        Filedata *           filedata,
14459                        bfd_boolean          relocate)
14460 {
14461   Elf_Internal_Shdr * relsec;
14462   bfd_size_type       bytes;
14463   bfd_size_type       section_size;
14464   bfd_vma             addr;
14465   unsigned char *     data;
14466   unsigned char *     real_start;
14467   unsigned char *     start;
14468
14469   real_start = start = (unsigned char *) get_section_contents (section, filedata);
14470   if (start == NULL)
14471     /* PR 21820: Do not fail if the section was empty.  */
14472     return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
14473
14474   section_size = section->sh_size;
14475
14476   printf (_("\nHex dump of section '%s':\n"), printable_section_name (filedata, section));
14477
14478   if (decompress_dumps)
14479     {
14480       dwarf_size_type new_size = section_size;
14481       dwarf_size_type uncompressed_size = 0;
14482
14483       if ((section->sh_flags & SHF_COMPRESSED) != 0)
14484         {
14485           Elf_Internal_Chdr chdr;
14486           unsigned int compression_header_size
14487             = get_compression_header (& chdr, start, section_size);
14488
14489           if (compression_header_size == 0)
14490             /* An error message will have already been generated
14491                by get_compression_header.  */
14492             goto error_out;
14493
14494           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
14495             {
14496               warn (_("section '%s' has unsupported compress type: %d\n"),
14497                     printable_section_name (filedata, section), chdr.ch_type);
14498               goto error_out;
14499             }
14500           uncompressed_size = chdr.ch_size;
14501           start += compression_header_size;
14502           new_size -= compression_header_size;
14503         }
14504       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
14505         {
14506           /* Read the zlib header.  In this case, it should be "ZLIB"
14507              followed by the uncompressed section size, 8 bytes in
14508              big-endian order.  */
14509           uncompressed_size = start[4]; uncompressed_size <<= 8;
14510           uncompressed_size += start[5]; uncompressed_size <<= 8;
14511           uncompressed_size += start[6]; uncompressed_size <<= 8;
14512           uncompressed_size += start[7]; uncompressed_size <<= 8;
14513           uncompressed_size += start[8]; uncompressed_size <<= 8;
14514           uncompressed_size += start[9]; uncompressed_size <<= 8;
14515           uncompressed_size += start[10]; uncompressed_size <<= 8;
14516           uncompressed_size += start[11];
14517           start += 12;
14518           new_size -= 12;
14519         }
14520
14521       if (uncompressed_size)
14522         {
14523           if (uncompress_section_contents (& start, uncompressed_size,
14524                                            & new_size))
14525             {
14526               section_size = new_size;
14527             }
14528           else
14529             {
14530               error (_("Unable to decompress section %s\n"),
14531                      printable_section_name (filedata, section));
14532               /* FIXME: Print the section anyway ?  */
14533               goto error_out;
14534             }
14535         }
14536       else
14537         start = real_start;
14538     }
14539
14540   if (relocate)
14541     {
14542       if (! apply_relocations (filedata, section, start, section_size, NULL, NULL))
14543         goto error_out;
14544     }
14545   else
14546     {
14547       /* If the section being dumped has relocations against it the user might
14548          be expecting these relocations to have been applied.  Check for this
14549          case and issue a warning message in order to avoid confusion.
14550          FIXME: Maybe we ought to have an option that dumps a section with
14551          relocs applied ?  */
14552       for (relsec = filedata->section_headers;
14553            relsec < filedata->section_headers + filedata->file_header.e_shnum;
14554            ++relsec)
14555         {
14556           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
14557               || relsec->sh_info >= filedata->file_header.e_shnum
14558               || filedata->section_headers + relsec->sh_info != section
14559               || relsec->sh_size == 0
14560               || relsec->sh_link >= filedata->file_header.e_shnum)
14561             continue;
14562
14563           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
14564           break;
14565         }
14566     }
14567
14568   addr = section->sh_addr;
14569   bytes = section_size;
14570   data = start;
14571
14572   while (bytes)
14573     {
14574       int j;
14575       int k;
14576       int lbytes;
14577
14578       lbytes = (bytes > 16 ? 16 : bytes);
14579
14580       printf ("  0x%8.8lx ", (unsigned long) addr);
14581
14582       for (j = 0; j < 16; j++)
14583         {
14584           if (j < lbytes)
14585             printf ("%2.2x", data[j]);
14586           else
14587             printf ("  ");
14588
14589           if ((j & 3) == 3)
14590             printf (" ");
14591         }
14592
14593       for (j = 0; j < lbytes; j++)
14594         {
14595           k = data[j];
14596           if (k >= ' ' && k < 0x7f)
14597             printf ("%c", k);
14598           else
14599             printf (".");
14600         }
14601
14602       putchar ('\n');
14603
14604       data  += lbytes;
14605       addr  += lbytes;
14606       bytes -= lbytes;
14607     }
14608
14609   free (real_start);
14610
14611   putchar ('\n');
14612   return TRUE;
14613
14614  error_out:
14615   free (real_start);
14616   return FALSE;
14617 }
14618
14619 #ifdef ENABLE_LIBCTF
14620 static ctf_sect_t *
14621 shdr_to_ctf_sect (ctf_sect_t *buf, Elf_Internal_Shdr *shdr, Filedata *filedata)
14622 {
14623   buf->cts_name = SECTION_NAME_PRINT (shdr);
14624   buf->cts_size = shdr->sh_size;
14625   buf->cts_entsize = shdr->sh_entsize;
14626
14627   return buf;
14628 }
14629
14630 /* Formatting callback function passed to ctf_dump.  Returns either the pointer
14631    it is passed, or a pointer to newly-allocated storage, in which case
14632    dump_ctf() will free it when it no longer needs it.  */
14633
14634 static char *
14635 dump_ctf_indent_lines (ctf_sect_names_t sect ATTRIBUTE_UNUSED,
14636                        char *s, void *arg)
14637 {
14638   const char *blanks = arg;
14639   char *new_s;
14640
14641   if (asprintf (&new_s, "%s%s", blanks, s) < 0)
14642     return s;
14643   return new_s;
14644 }
14645
14646 /* Dump CTF errors/warnings.  */
14647 static void
14648 dump_ctf_errs (ctf_dict_t *fp)
14649 {
14650   ctf_next_t *it = NULL;
14651   char *errtext;
14652   int is_warning;
14653   int err;
14654
14655   /* Dump accumulated errors and warnings.  */
14656   while ((errtext = ctf_errwarning_next (fp, &it, &is_warning, &err)) != NULL)
14657     {
14658       error (_("%s: %s"), is_warning ? _("warning"): _("error"),
14659              errtext);
14660       free (errtext);
14661     }
14662   if (err != ECTF_NEXT_END)
14663     error (_("CTF error: cannot get CTF errors: `%s'"), ctf_errmsg (err));
14664 }
14665
14666 /* Dump one CTF archive member.  */
14667
14668 static int
14669 dump_ctf_archive_member (ctf_dict_t *ctf, const char *name, void *arg)
14670 {
14671   ctf_dict_t *parent = (ctf_dict_t *) arg;
14672   const char *things[] = {"Header", "Labels", "Data objects",
14673                           "Function objects", "Variables", "Types", "Strings",
14674                           ""};
14675   const char **thing;
14676   size_t i;
14677   int err = 0;
14678
14679   /* Only print out the name of non-default-named archive members.
14680      The name .ctf appears everywhere, even for things that aren't
14681      really archives, so printing it out is liable to be confusing.
14682
14683      The parent, if there is one, is the default-owned archive member:
14684      avoid importing it into itself.  (This does no harm, but looks
14685      confusing.)  */
14686
14687   if (strcmp (name, ".ctf") != 0)
14688     {
14689       printf (_("\nCTF archive member: %s:\n"), name);
14690       ctf_import (ctf, parent);
14691     }
14692
14693   for (i = 0, thing = things; *thing[0]; thing++, i++)
14694     {
14695       ctf_dump_state_t *s = NULL;
14696       char *item;
14697
14698       printf ("\n  %s:\n", *thing);
14699       while ((item = ctf_dump (ctf, &s, i, dump_ctf_indent_lines,
14700                                (void *) "    ")) != NULL)
14701         {
14702           printf ("%s\n", item);
14703           free (item);
14704         }
14705
14706       if (ctf_errno (ctf))
14707         {
14708           error (_("Iteration failed: %s, %s\n"), *thing,
14709                  ctf_errmsg (ctf_errno (ctf)));
14710           err = 1;
14711           goto out;
14712         }
14713     }
14714
14715  out:
14716   dump_ctf_errs (ctf);
14717   return err;
14718 }
14719
14720 static bfd_boolean
14721 dump_section_as_ctf (Elf_Internal_Shdr * section, Filedata * filedata)
14722 {
14723   Elf_Internal_Shdr *  parent_sec = NULL;
14724   Elf_Internal_Shdr *  symtab_sec = NULL;
14725   Elf_Internal_Shdr *  strtab_sec = NULL;
14726   void *               data = NULL;
14727   void *               symdata = NULL;
14728   void *               strdata = NULL;
14729   void *               parentdata = NULL;
14730   ctf_sect_t           ctfsect, symsect, strsect, parentsect;
14731   ctf_sect_t *         symsectp = NULL;
14732   ctf_sect_t *         strsectp = NULL;
14733   ctf_archive_t *      ctfa = NULL;
14734   ctf_archive_t *      parenta = NULL, *lookparent;
14735   ctf_dict_t *         parent = NULL;
14736
14737   int err;
14738   bfd_boolean ret = FALSE;
14739
14740   shdr_to_ctf_sect (&ctfsect, section, filedata);
14741   data = get_section_contents (section, filedata);
14742   ctfsect.cts_data = data;
14743
14744   if (!dump_ctf_symtab_name)
14745     dump_ctf_symtab_name = strdup (".dynsym");
14746
14747   if (!dump_ctf_strtab_name)
14748     dump_ctf_strtab_name = strdup (".dynstr");
14749
14750   if (dump_ctf_symtab_name && dump_ctf_symtab_name[0] != 0)
14751     {
14752       if ((symtab_sec = find_section (filedata, dump_ctf_symtab_name)) == NULL)
14753         {
14754           error (_("No symbol section named %s\n"), dump_ctf_symtab_name);
14755           goto fail;
14756         }
14757       if ((symdata = (void *) get_data (NULL, filedata,
14758                                         symtab_sec->sh_offset, 1,
14759                                         symtab_sec->sh_size,
14760                                         _("symbols"))) == NULL)
14761         goto fail;
14762       symsectp = shdr_to_ctf_sect (&symsect, symtab_sec, filedata);
14763       symsect.cts_data = symdata;
14764     }
14765   if (dump_ctf_strtab_name && dump_ctf_strtab_name[0] != 0)
14766     {
14767       if ((strtab_sec = find_section (filedata, dump_ctf_strtab_name)) == NULL)
14768         {
14769           error (_("No string table section named %s\n"),
14770                  dump_ctf_strtab_name);
14771           goto fail;
14772         }
14773       if ((strdata = (void *) get_data (NULL, filedata,
14774                                         strtab_sec->sh_offset, 1,
14775                                         strtab_sec->sh_size,
14776                                         _("strings"))) == NULL)
14777         goto fail;
14778       strsectp = shdr_to_ctf_sect (&strsect, strtab_sec, filedata);
14779       strsect.cts_data = strdata;
14780     }
14781   if (dump_ctf_parent_name)
14782     {
14783       if ((parent_sec = find_section (filedata, dump_ctf_parent_name)) == NULL)
14784         {
14785           error (_("No CTF parent section named %s\n"), dump_ctf_parent_name);
14786           goto fail;
14787         }
14788       if ((parentdata = (void *) get_data (NULL, filedata,
14789                                            parent_sec->sh_offset, 1,
14790                                            parent_sec->sh_size,
14791                                            _("CTF parent"))) == NULL)
14792         goto fail;
14793       shdr_to_ctf_sect (&parentsect, parent_sec, filedata);
14794       parentsect.cts_data = parentdata;
14795     }
14796
14797   /* Load the CTF file and dump it.  It may be a raw CTF section, or an archive:
14798      libctf papers over the difference, so we can pretend it is always an
14799      archive.  Possibly open the parent as well, if one was specified.  */
14800
14801   if ((ctfa = ctf_arc_bufopen (&ctfsect, symsectp, strsectp, &err)) == NULL)
14802     {
14803       dump_ctf_errs (NULL);
14804       error (_("CTF open failure: %s\n"), ctf_errmsg (err));
14805       goto fail;
14806     }
14807
14808   ctf_arc_symsect_endianness (ctfa, filedata->file_header.e_ident[EI_DATA]
14809                               != ELFDATA2MSB);
14810
14811   if (parentdata)
14812     {
14813       if ((parenta = ctf_arc_bufopen (&parentsect, symsectp, strsectp,
14814                                       &err)) == NULL)
14815         {
14816           dump_ctf_errs (NULL);
14817           error (_("CTF open failure: %s\n"), ctf_errmsg (err));
14818           goto fail;
14819         }
14820       lookparent = parenta;
14821     }
14822   else
14823     lookparent = ctfa;
14824
14825   /* Assume that the applicable parent archive member is the default one.
14826      (This is what all known implementations are expected to do, if they
14827      put CTFs and their parents in archives together.)  */
14828   if ((parent = ctf_dict_open (lookparent, NULL, &err)) == NULL)
14829     {
14830       dump_ctf_errs (NULL);
14831       error (_("CTF open failure: %s\n"), ctf_errmsg (err));
14832       goto fail;
14833     }
14834
14835   ret = TRUE;
14836
14837   printf (_("\nDump of CTF section '%s':\n"),
14838           printable_section_name (filedata, section));
14839
14840   if ((err = ctf_archive_iter (ctfa, dump_ctf_archive_member, parent)) != 0)
14841     {
14842       dump_ctf_errs (NULL);
14843       error (_("CTF member open failure: %s\n"), ctf_errmsg (err));
14844       ret = FALSE;
14845     }
14846
14847  fail:
14848   ctf_dict_close (parent);
14849   ctf_close (ctfa);
14850   ctf_close (parenta);
14851   free (parentdata);
14852   free (data);
14853   free (symdata);
14854   free (strdata);
14855   return ret;
14856 }
14857 #endif
14858
14859 static bfd_boolean
14860 load_specific_debug_section (enum dwarf_section_display_enum  debug,
14861                              const Elf_Internal_Shdr *        sec,
14862                              void *                           data)
14863 {
14864   struct dwarf_section * section = &debug_displays [debug].section;
14865   char buf [64];
14866   Filedata * filedata = (Filedata *) data;
14867
14868   if (section->start != NULL)
14869     {
14870       /* If it is already loaded, do nothing.  */
14871       if (streq (section->filename, filedata->file_name))
14872         return TRUE;
14873       free (section->start);
14874     }
14875
14876   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
14877   section->address = sec->sh_addr;
14878   section->user_data = NULL;
14879   section->filename = filedata->file_name;
14880   section->start = (unsigned char *) get_data (NULL, filedata,
14881                                                sec->sh_offset, 1,
14882                                                sec->sh_size, buf);
14883   if (section->start == NULL)
14884     section->size = 0;
14885   else
14886     {
14887       unsigned char *start = section->start;
14888       dwarf_size_type size = sec->sh_size;
14889       dwarf_size_type uncompressed_size = 0;
14890
14891       if ((sec->sh_flags & SHF_COMPRESSED) != 0)
14892         {
14893           Elf_Internal_Chdr chdr;
14894           unsigned int compression_header_size;
14895
14896           if (size < (is_32bit_elf
14897                       ? sizeof (Elf32_External_Chdr)
14898                       : sizeof (Elf64_External_Chdr)))
14899             {
14900               warn (_("compressed section %s is too small to contain a compression header\n"),
14901                     section->name);
14902               return FALSE;
14903             }
14904
14905           compression_header_size = get_compression_header (&chdr, start, size);
14906           if (compression_header_size == 0)
14907             /* An error message will have already been generated
14908                by get_compression_header.  */
14909             return FALSE;
14910
14911           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
14912             {
14913               warn (_("section '%s' has unsupported compress type: %d\n"),
14914                     section->name, chdr.ch_type);
14915               return FALSE;
14916             }
14917           uncompressed_size = chdr.ch_size;
14918           start += compression_header_size;
14919           size -= compression_header_size;
14920         }
14921       else if (size > 12 && streq ((char *) start, "ZLIB"))
14922         {
14923           /* Read the zlib header.  In this case, it should be "ZLIB"
14924              followed by the uncompressed section size, 8 bytes in
14925              big-endian order.  */
14926           uncompressed_size = start[4]; uncompressed_size <<= 8;
14927           uncompressed_size += start[5]; uncompressed_size <<= 8;
14928           uncompressed_size += start[6]; uncompressed_size <<= 8;
14929           uncompressed_size += start[7]; uncompressed_size <<= 8;
14930           uncompressed_size += start[8]; uncompressed_size <<= 8;
14931           uncompressed_size += start[9]; uncompressed_size <<= 8;
14932           uncompressed_size += start[10]; uncompressed_size <<= 8;
14933           uncompressed_size += start[11];
14934           start += 12;
14935           size -= 12;
14936         }
14937
14938       if (uncompressed_size)
14939         {
14940           if (uncompress_section_contents (&start, uncompressed_size,
14941                                            &size))
14942             {
14943               /* Free the compressed buffer, update the section buffer
14944                  and the section size if uncompress is successful.  */
14945               free (section->start);
14946               section->start = start;
14947             }
14948           else
14949             {
14950               error (_("Unable to decompress section %s\n"),
14951                      printable_section_name (filedata, sec));
14952               return FALSE;
14953             }
14954         }
14955
14956       section->size = size;
14957     }
14958
14959   if (section->start == NULL)
14960     return FALSE;
14961
14962   if (debug_displays [debug].relocate)
14963     {
14964       if (! apply_relocations (filedata, sec, section->start, section->size,
14965                                & section->reloc_info, & section->num_relocs))
14966         return FALSE;
14967     }
14968   else
14969     {
14970       section->reloc_info = NULL;
14971       section->num_relocs = 0;
14972     }
14973
14974   return TRUE;
14975 }
14976
14977 #if HAVE_LIBDEBUGINFOD
14978 /* Return a hex string representation of the build-id.  */
14979 unsigned char *
14980 get_build_id (void * data)
14981 {
14982   Filedata * filedata = (Filedata *)data;
14983   Elf_Internal_Shdr * shdr;
14984   unsigned long i;
14985
14986   /* Iterate through notes to find note.gnu.build-id.
14987      FIXME: Only the first note in any note section is examined.  */
14988   for (i = 0, shdr = filedata->section_headers;
14989        i < filedata->file_header.e_shnum && shdr != NULL;
14990        i++, shdr++)
14991     {
14992       if (shdr->sh_type != SHT_NOTE)
14993         continue;
14994
14995       char * next;
14996       char * end;
14997       size_t data_remaining;
14998       size_t min_notesz;
14999       Elf_External_Note * enote;
15000       Elf_Internal_Note inote;
15001
15002       bfd_vma offset = shdr->sh_offset;
15003       bfd_vma align = shdr->sh_addralign;
15004       bfd_vma length = shdr->sh_size;
15005
15006       enote = (Elf_External_Note *) get_section_contents (shdr, filedata);
15007       if (enote == NULL)
15008         continue;
15009
15010       if (align < 4)
15011         align = 4;
15012       else if (align != 4 && align != 8)
15013         {
15014           free (enote);
15015           continue;
15016         }
15017
15018       end = (char *) enote + length;
15019       data_remaining = end - (char *) enote;
15020
15021       if (!is_ia64_vms (filedata))
15022         {
15023           min_notesz = offsetof (Elf_External_Note, name);
15024           if (data_remaining < min_notesz)
15025             {
15026               warn (_("\
15027 malformed note encountered in section %s whilst scanning for build-id note\n"),
15028                     printable_section_name (filedata, shdr));
15029               free (enote);
15030               continue;
15031             }
15032           data_remaining -= min_notesz;
15033
15034           inote.type     = BYTE_GET (enote->type);
15035           inote.namesz   = BYTE_GET (enote->namesz);
15036           inote.namedata = enote->name;
15037           inote.descsz   = BYTE_GET (enote->descsz);
15038           inote.descdata = ((char *) enote
15039                             + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
15040           inote.descpos  = offset + (inote.descdata - (char *) enote);
15041           next = ((char *) enote
15042                   + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
15043         }
15044       else
15045         {
15046           Elf64_External_VMS_Note *vms_enote;
15047
15048           /* PR binutils/15191
15049              Make sure that there is enough data to read.  */
15050           min_notesz = offsetof (Elf64_External_VMS_Note, name);
15051           if (data_remaining < min_notesz)
15052             {
15053               warn (_("\
15054 malformed note encountered in section %s whilst scanning for build-id note\n"),
15055                     printable_section_name (filedata, shdr));
15056               free (enote);
15057               continue;
15058             }
15059           data_remaining -= min_notesz;
15060
15061           vms_enote = (Elf64_External_VMS_Note *) enote;
15062           inote.type     = BYTE_GET (vms_enote->type);
15063           inote.namesz   = BYTE_GET (vms_enote->namesz);
15064           inote.namedata = vms_enote->name;
15065           inote.descsz   = BYTE_GET (vms_enote->descsz);
15066           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
15067           inote.descpos  = offset + (inote.descdata - (char *) enote);
15068           next = inote.descdata + align_power (inote.descsz, 3);
15069         }
15070
15071       /* Skip malformed notes.  */
15072       if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
15073           || (size_t) (inote.descdata - inote.namedata) > data_remaining
15074           || (size_t) (next - inote.descdata) < inote.descsz
15075           || ((size_t) (next - inote.descdata)
15076               > data_remaining - (size_t) (inote.descdata - inote.namedata)))
15077         {
15078           warn (_("\
15079 malformed note encountered in section %s whilst scanning for build-id note\n"),
15080                 printable_section_name (filedata, shdr));
15081           free (enote);
15082           continue;
15083         }
15084
15085       /* Check if this is the build-id note. If so then convert the build-id
15086          bytes to a hex string.  */
15087       if (inote.namesz > 0
15088           && const_strneq (inote.namedata, "GNU")
15089           && inote.type == NT_GNU_BUILD_ID)
15090         {
15091           unsigned long j;
15092           char * build_id;
15093
15094           build_id = malloc (inote.descsz * 2 + 1);
15095           if (build_id == NULL)
15096             {
15097               free (enote);
15098               return NULL;
15099             }
15100
15101           for (j = 0; j < inote.descsz; ++j)
15102             sprintf (build_id + (j * 2), "%02x", inote.descdata[j] & 0xff);
15103           build_id[inote.descsz * 2] = '\0';
15104           free (enote);
15105
15106           return (unsigned char *) build_id;
15107         }
15108       free (enote);
15109     }
15110
15111   return NULL;
15112 }
15113 #endif /* HAVE_LIBDEBUGINFOD */
15114
15115 /* If this is not NULL, load_debug_section will only look for sections
15116    within the list of sections given here.  */
15117 static unsigned int * section_subset = NULL;
15118
15119 bfd_boolean
15120 load_debug_section (enum dwarf_section_display_enum debug, void * data)
15121 {
15122   struct dwarf_section * section = &debug_displays [debug].section;
15123   Elf_Internal_Shdr * sec;
15124   Filedata * filedata = (Filedata *) data;
15125
15126   /* Without section headers we cannot find any sections.  */
15127   if (filedata->section_headers == NULL)
15128     return FALSE;
15129
15130   if (filedata->string_table == NULL
15131       && filedata->file_header.e_shstrndx != SHN_UNDEF
15132       && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
15133     {
15134       Elf_Internal_Shdr * strs;
15135
15136       /* Read in the string table, so that we have section names to scan.  */
15137       strs = filedata->section_headers + filedata->file_header.e_shstrndx;
15138
15139       if (strs != NULL && strs->sh_size != 0)
15140         {
15141           filedata->string_table
15142             = (char *) get_data (NULL, filedata, strs->sh_offset,
15143                                  1, strs->sh_size, _("string table"));
15144
15145           filedata->string_table_length
15146             = filedata->string_table != NULL ? strs->sh_size : 0;
15147         }
15148     }
15149
15150   /* Locate the debug section.  */
15151   sec = find_section_in_set (filedata, section->uncompressed_name, section_subset);
15152   if (sec != NULL)
15153     section->name = section->uncompressed_name;
15154   else
15155     {
15156       sec = find_section_in_set (filedata, section->compressed_name, section_subset);
15157       if (sec != NULL)
15158         section->name = section->compressed_name;
15159     }
15160   if (sec == NULL)
15161     return FALSE;
15162
15163   /* If we're loading from a subset of sections, and we've loaded
15164      a section matching this name before, it's likely that it's a
15165      different one.  */
15166   if (section_subset != NULL)
15167     free_debug_section (debug);
15168
15169   return load_specific_debug_section (debug, sec, data);
15170 }
15171
15172 void
15173 free_debug_section (enum dwarf_section_display_enum debug)
15174 {
15175   struct dwarf_section * section = &debug_displays [debug].section;
15176
15177   if (section->start == NULL)
15178     return;
15179
15180   free ((char *) section->start);
15181   section->start = NULL;
15182   section->address = 0;
15183   section->size = 0;
15184
15185   free (section->reloc_info);
15186   section->reloc_info = NULL;
15187   section->num_relocs = 0;
15188 }
15189
15190 static bfd_boolean
15191 display_debug_section (int shndx, Elf_Internal_Shdr * section, Filedata * filedata)
15192 {
15193   char * name = SECTION_NAME_VALID (section) ? SECTION_NAME (section) : "";
15194   const char * print_name = printable_section_name (filedata, section);
15195   bfd_size_type length;
15196   bfd_boolean result = TRUE;
15197   int i;
15198
15199   length = section->sh_size;
15200   if (length == 0)
15201     {
15202       printf (_("\nSection '%s' has no debugging data.\n"), print_name);
15203       return TRUE;
15204     }
15205   if (section->sh_type == SHT_NOBITS)
15206     {
15207       /* There is no point in dumping the contents of a debugging section
15208          which has the NOBITS type - the bits in the file will be random.
15209          This can happen when a file containing a .eh_frame section is
15210          stripped with the --only-keep-debug command line option.  */
15211       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
15212               print_name);
15213       return FALSE;
15214     }
15215
15216   if (const_strneq (name, ".gnu.linkonce.wi."))
15217     name = ".debug_info";
15218
15219   /* See if we know how to display the contents of this section.  */
15220   for (i = 0; i < max; i++)
15221     {
15222       enum dwarf_section_display_enum  id = (enum dwarf_section_display_enum) i;
15223       struct dwarf_section_display *   display = debug_displays + i;
15224       struct dwarf_section *           sec = & display->section;
15225
15226       if (streq (sec->uncompressed_name, name)
15227           || (id == line && const_strneq (name, ".debug_line."))
15228           || streq (sec->compressed_name, name))
15229         {
15230           bfd_boolean secondary = (section != find_section (filedata, name));
15231
15232           if (secondary)
15233             free_debug_section (id);
15234
15235           if (i == line && const_strneq (name, ".debug_line."))
15236             sec->name = name;
15237           else if (streq (sec->uncompressed_name, name))
15238             sec->name = sec->uncompressed_name;
15239           else
15240             sec->name = sec->compressed_name;
15241
15242           if (load_specific_debug_section (id, section, filedata))
15243             {
15244               /* If this debug section is part of a CU/TU set in a .dwp file,
15245                  restrict load_debug_section to the sections in that set.  */
15246               section_subset = find_cu_tu_set (filedata, shndx);
15247
15248               result &= display->display (sec, filedata);
15249
15250               section_subset = NULL;
15251
15252               if (secondary || (id != info && id != abbrev))
15253                 free_debug_section (id);
15254             }
15255           break;
15256         }
15257     }
15258
15259   if (i == max)
15260     {
15261       printf (_("Unrecognized debug section: %s\n"), print_name);
15262       result = FALSE;
15263     }
15264
15265   return result;
15266 }
15267
15268 /* Set DUMP_SECTS for all sections where dumps were requested
15269    based on section name.  */
15270
15271 static void
15272 initialise_dumps_byname (Filedata * filedata)
15273 {
15274   struct dump_list_entry * cur;
15275
15276   for (cur = dump_sects_byname; cur; cur = cur->next)
15277     {
15278       unsigned int i;
15279       bfd_boolean any = FALSE;
15280
15281       for (i = 0; i < filedata->file_header.e_shnum; i++)
15282         if (SECTION_NAME_VALID (filedata->section_headers + i)
15283             && streq (SECTION_NAME (filedata->section_headers + i), cur->name))
15284           {
15285             request_dump_bynumber (&filedata->dump, i, cur->type);
15286             any = TRUE;
15287           }
15288
15289       if (!any)
15290         warn (_("Section '%s' was not dumped because it does not exist!\n"),
15291               cur->name);
15292     }
15293 }
15294
15295 static bfd_boolean
15296 process_section_contents (Filedata * filedata)
15297 {
15298   Elf_Internal_Shdr * section;
15299   unsigned int i;
15300   bfd_boolean res = TRUE;
15301
15302   if (! do_dump)
15303     return TRUE;
15304
15305   initialise_dumps_byname (filedata);
15306
15307   for (i = 0, section = filedata->section_headers;
15308        i < filedata->file_header.e_shnum && i < filedata->dump.num_dump_sects;
15309        i++, section++)
15310     {
15311       dump_type dump = filedata->dump.dump_sects[i];
15312
15313 #ifdef SUPPORT_DISASSEMBLY
15314       if (dump & DISASS_DUMP)
15315         {
15316           if (! disassemble_section (section, filedata))
15317             res = FALSE;
15318         }
15319 #endif
15320       if (dump & HEX_DUMP)
15321         {
15322           if (! dump_section_as_bytes (section, filedata, FALSE))
15323             res = FALSE;
15324         }
15325
15326       if (dump & RELOC_DUMP)
15327         {
15328           if (! dump_section_as_bytes (section, filedata, TRUE))
15329             res = FALSE;
15330         }
15331
15332       if (dump & STRING_DUMP)
15333         {
15334           if (! dump_section_as_strings (section, filedata))
15335             res = FALSE;
15336         }
15337
15338       if (dump & DEBUG_DUMP)
15339         {
15340           if (! display_debug_section (i, section, filedata))
15341             res = FALSE;
15342         }
15343
15344 #ifdef ENABLE_LIBCTF
15345       if (dump & CTF_DUMP)
15346         {
15347           if (! dump_section_as_ctf (section, filedata))
15348             res = FALSE;
15349         }
15350 #endif
15351     }
15352
15353   /* Check to see if the user requested a
15354      dump of a section that does not exist.  */
15355   while (i < filedata->dump.num_dump_sects)
15356     {
15357       if (filedata->dump.dump_sects[i])
15358         {
15359           warn (_("Section %d was not dumped because it does not exist!\n"), i);
15360           res = FALSE;
15361         }
15362       i++;
15363     }
15364
15365   return res;
15366 }
15367
15368 static void
15369 process_mips_fpe_exception (int mask)
15370 {
15371   if (mask)
15372     {
15373       bfd_boolean first = TRUE;
15374
15375       if (mask & OEX_FPU_INEX)
15376         fputs ("INEX", stdout), first = FALSE;
15377       if (mask & OEX_FPU_UFLO)
15378         printf ("%sUFLO", first ? "" : "|"), first = FALSE;
15379       if (mask & OEX_FPU_OFLO)
15380         printf ("%sOFLO", first ? "" : "|"), first = FALSE;
15381       if (mask & OEX_FPU_DIV0)
15382         printf ("%sDIV0", first ? "" : "|"), first = FALSE;
15383       if (mask & OEX_FPU_INVAL)
15384         printf ("%sINVAL", first ? "" : "|");
15385     }
15386   else
15387     fputs ("0", stdout);
15388 }
15389
15390 /* Display's the value of TAG at location P.  If TAG is
15391    greater than 0 it is assumed to be an unknown tag, and
15392    a message is printed to this effect.  Otherwise it is
15393    assumed that a message has already been printed.
15394
15395    If the bottom bit of TAG is set it assumed to have a
15396    string value, otherwise it is assumed to have an integer
15397    value.
15398
15399    Returns an updated P pointing to the first unread byte
15400    beyond the end of TAG's value.
15401
15402    Reads at or beyond END will not be made.  */
15403
15404 static unsigned char *
15405 display_tag_value (signed int tag,
15406                    unsigned char * p,
15407                    const unsigned char * const end)
15408 {
15409   unsigned long val;
15410
15411   if (tag > 0)
15412     printf ("  Tag_unknown_%d: ", tag);
15413
15414   if (p >= end)
15415     {
15416       warn (_("<corrupt tag>\n"));
15417     }
15418   else if (tag & 1)
15419     {
15420       /* PR 17531 file: 027-19978-0.004.  */
15421       size_t maxlen = (end - p) - 1;
15422
15423       putchar ('"');
15424       if (maxlen > 0)
15425         {
15426           print_symbol ((int) maxlen, (const char *) p);
15427           p += strnlen ((char *) p, maxlen) + 1;
15428         }
15429       else
15430         {
15431           printf (_("<corrupt string tag>"));
15432           p = (unsigned char *) end;
15433         }
15434       printf ("\"\n");
15435     }
15436   else
15437     {
15438       READ_ULEB (val, p, end);
15439       printf ("%ld (0x%lx)\n", val, val);
15440     }
15441
15442   assert (p <= end);
15443   return p;
15444 }
15445
15446 /* ARC ABI attributes section.  */
15447
15448 static unsigned char *
15449 display_arc_attribute (unsigned char * p,
15450                        const unsigned char * const end)
15451 {
15452   unsigned int tag;
15453   unsigned int val;
15454
15455   READ_ULEB (tag, p, end);
15456
15457   switch (tag)
15458     {
15459     case Tag_ARC_PCS_config:
15460       READ_ULEB (val, p, end);
15461       printf ("  Tag_ARC_PCS_config: ");
15462       switch (val)
15463         {
15464         case 0:
15465           printf (_("Absent/Non standard\n"));
15466           break;
15467         case 1:
15468           printf (_("Bare metal/mwdt\n"));
15469           break;
15470         case 2:
15471           printf (_("Bare metal/newlib\n"));
15472           break;
15473         case 3:
15474           printf (_("Linux/uclibc\n"));
15475           break;
15476         case 4:
15477           printf (_("Linux/glibc\n"));
15478           break;
15479         default:
15480           printf (_("Unknown\n"));
15481           break;
15482         }
15483       break;
15484
15485     case Tag_ARC_CPU_base:
15486       READ_ULEB (val, p, end);
15487       printf ("  Tag_ARC_CPU_base: ");
15488       switch (val)
15489         {
15490         default:
15491         case TAG_CPU_NONE:
15492           printf (_("Absent\n"));
15493           break;
15494         case TAG_CPU_ARC6xx:
15495           printf ("ARC6xx\n");
15496           break;
15497         case TAG_CPU_ARC7xx:
15498           printf ("ARC7xx\n");
15499           break;
15500         case TAG_CPU_ARCEM:
15501           printf ("ARCEM\n");
15502           break;
15503         case TAG_CPU_ARCHS:
15504           printf ("ARCHS\n");
15505           break;
15506         }
15507       break;
15508
15509     case Tag_ARC_CPU_variation:
15510       READ_ULEB (val, p, end);
15511       printf ("  Tag_ARC_CPU_variation: ");
15512       switch (val)
15513         {
15514         default:
15515           if (val > 0 && val < 16)
15516               printf ("Core%d\n", val);
15517           else
15518               printf ("Unknown\n");
15519           break;
15520
15521         case 0:
15522           printf (_("Absent\n"));
15523           break;
15524         }
15525       break;
15526
15527     case Tag_ARC_CPU_name:
15528       printf ("  Tag_ARC_CPU_name: ");
15529       p = display_tag_value (-1, p, end);
15530       break;
15531
15532     case Tag_ARC_ABI_rf16:
15533       READ_ULEB (val, p, end);
15534       printf ("  Tag_ARC_ABI_rf16: %s\n", val ? _("yes") : _("no"));
15535       break;
15536
15537     case Tag_ARC_ABI_osver:
15538       READ_ULEB (val, p, end);
15539       printf ("  Tag_ARC_ABI_osver: v%d\n", val);
15540       break;
15541
15542     case Tag_ARC_ABI_pic:
15543     case Tag_ARC_ABI_sda:
15544       READ_ULEB (val, p, end);
15545       printf (tag == Tag_ARC_ABI_sda ? "  Tag_ARC_ABI_sda: "
15546               : "  Tag_ARC_ABI_pic: ");
15547       switch (val)
15548         {
15549         case 0:
15550           printf (_("Absent\n"));
15551           break;
15552         case 1:
15553           printf ("MWDT\n");
15554           break;
15555         case 2:
15556           printf ("GNU\n");
15557           break;
15558         default:
15559           printf (_("Unknown\n"));
15560           break;
15561         }
15562       break;
15563
15564     case Tag_ARC_ABI_tls:
15565       READ_ULEB (val, p, end);
15566       printf ("  Tag_ARC_ABI_tls: %s\n", val ? "r25": "none");
15567       break;
15568
15569     case Tag_ARC_ABI_enumsize:
15570       READ_ULEB (val, p, end);
15571       printf ("  Tag_ARC_ABI_enumsize: %s\n", val ? _("default") :
15572               _("smallest"));
15573       break;
15574
15575     case Tag_ARC_ABI_exceptions:
15576       READ_ULEB (val, p, end);
15577       printf ("  Tag_ARC_ABI_exceptions: %s\n", val ? _("OPTFP")
15578               : _("default"));
15579       break;
15580
15581     case Tag_ARC_ABI_double_size:
15582       READ_ULEB (val, p, end);
15583       printf ("  Tag_ARC_ABI_double_size: %d\n", val);
15584       break;
15585
15586     case Tag_ARC_ISA_config:
15587       printf ("  Tag_ARC_ISA_config: ");
15588       p = display_tag_value (-1, p, end);
15589       break;
15590
15591     case Tag_ARC_ISA_apex:
15592       printf ("  Tag_ARC_ISA_apex: ");
15593       p = display_tag_value (-1, p, end);
15594       break;
15595
15596     case Tag_ARC_ISA_mpy_option:
15597       READ_ULEB (val, p, end);
15598       printf ("  Tag_ARC_ISA_mpy_option: %d\n", val);
15599       break;
15600
15601     case Tag_ARC_ATR_version:
15602       READ_ULEB (val, p, end);
15603       printf ("  Tag_ARC_ATR_version: %d\n", val);
15604       break;
15605
15606     default:
15607       return display_tag_value (tag & 1, p, end);
15608     }
15609
15610   return p;
15611 }
15612
15613 /* ARM EABI attributes section.  */
15614 typedef struct
15615 {
15616   unsigned int tag;
15617   const char * name;
15618   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
15619   unsigned int type;
15620   const char *const *table;
15621 } arm_attr_public_tag;
15622
15623 static const char *const arm_attr_tag_CPU_arch[] =
15624   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
15625    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "v8-R", "v8-M.baseline",
15626    "v8-M.mainline", "", "", "", "v8.1-M.mainline"};
15627 static const char *const arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
15628 static const char *const arm_attr_tag_THUMB_ISA_use[] =
15629   {"No", "Thumb-1", "Thumb-2", "Yes"};
15630 static const char *const arm_attr_tag_FP_arch[] =
15631   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
15632    "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
15633 static const char *const arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
15634 static const char *const arm_attr_tag_Advanced_SIMD_arch[] =
15635   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
15636    "NEON for ARMv8.1"};
15637 static const char *const arm_attr_tag_PCS_config[] =
15638   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
15639    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
15640 static const char *const arm_attr_tag_ABI_PCS_R9_use[] =
15641   {"V6", "SB", "TLS", "Unused"};
15642 static const char *const arm_attr_tag_ABI_PCS_RW_data[] =
15643   {"Absolute", "PC-relative", "SB-relative", "None"};
15644 static const char *const arm_attr_tag_ABI_PCS_RO_data[] =
15645   {"Absolute", "PC-relative", "None"};
15646 static const char *const arm_attr_tag_ABI_PCS_GOT_use[] =
15647   {"None", "direct", "GOT-indirect"};
15648 static const char *const arm_attr_tag_ABI_PCS_wchar_t[] =
15649   {"None", "??? 1", "2", "??? 3", "4"};
15650 static const char *const arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
15651 static const char *const arm_attr_tag_ABI_FP_denormal[] =
15652   {"Unused", "Needed", "Sign only"};
15653 static const char *const arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
15654 static const char *const arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
15655 static const char *const arm_attr_tag_ABI_FP_number_model[] =
15656   {"Unused", "Finite", "RTABI", "IEEE 754"};
15657 static const char *const arm_attr_tag_ABI_enum_size[] =
15658   {"Unused", "small", "int", "forced to int"};
15659 static const char *const arm_attr_tag_ABI_HardFP_use[] =
15660   {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
15661 static const char *const arm_attr_tag_ABI_VFP_args[] =
15662   {"AAPCS", "VFP registers", "custom", "compatible"};
15663 static const char *const arm_attr_tag_ABI_WMMX_args[] =
15664   {"AAPCS", "WMMX registers", "custom"};
15665 static const char *const arm_attr_tag_ABI_optimization_goals[] =
15666   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
15667     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
15668 static const char *const arm_attr_tag_ABI_FP_optimization_goals[] =
15669   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
15670     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
15671 static const char *const arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
15672 static const char *const arm_attr_tag_FP_HP_extension[] =
15673   {"Not Allowed", "Allowed"};
15674 static const char *const arm_attr_tag_ABI_FP_16bit_format[] =
15675   {"None", "IEEE 754", "Alternative Format"};
15676 static const char *const arm_attr_tag_DSP_extension[] =
15677   {"Follow architecture", "Allowed"};
15678 static const char *const arm_attr_tag_MPextension_use[] =
15679   {"Not Allowed", "Allowed"};
15680 static const char *const arm_attr_tag_DIV_use[] =
15681   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
15682     "Allowed in v7-A with integer division extension"};
15683 static const char *const arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
15684 static const char *const arm_attr_tag_Virtualization_use[] =
15685   {"Not Allowed", "TrustZone", "Virtualization Extensions",
15686     "TrustZone and Virtualization Extensions"};
15687 static const char *const arm_attr_tag_MPextension_use_legacy[] =
15688   {"Not Allowed", "Allowed"};
15689
15690 static const char *const arm_attr_tag_MVE_arch[] =
15691   {"No MVE", "MVE Integer only", "MVE Integer and FP"};
15692
15693 #define LOOKUP(id, name) \
15694   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
15695 static arm_attr_public_tag arm_attr_public_tags[] =
15696 {
15697   {4, "CPU_raw_name", 1, NULL},
15698   {5, "CPU_name", 1, NULL},
15699   LOOKUP(6, CPU_arch),
15700   {7, "CPU_arch_profile", 0, NULL},
15701   LOOKUP(8, ARM_ISA_use),
15702   LOOKUP(9, THUMB_ISA_use),
15703   LOOKUP(10, FP_arch),
15704   LOOKUP(11, WMMX_arch),
15705   LOOKUP(12, Advanced_SIMD_arch),
15706   LOOKUP(13, PCS_config),
15707   LOOKUP(14, ABI_PCS_R9_use),
15708   LOOKUP(15, ABI_PCS_RW_data),
15709   LOOKUP(16, ABI_PCS_RO_data),
15710   LOOKUP(17, ABI_PCS_GOT_use),
15711   LOOKUP(18, ABI_PCS_wchar_t),
15712   LOOKUP(19, ABI_FP_rounding),
15713   LOOKUP(20, ABI_FP_denormal),
15714   LOOKUP(21, ABI_FP_exceptions),
15715   LOOKUP(22, ABI_FP_user_exceptions),
15716   LOOKUP(23, ABI_FP_number_model),
15717   {24, "ABI_align_needed", 0, NULL},
15718   {25, "ABI_align_preserved", 0, NULL},
15719   LOOKUP(26, ABI_enum_size),
15720   LOOKUP(27, ABI_HardFP_use),
15721   LOOKUP(28, ABI_VFP_args),
15722   LOOKUP(29, ABI_WMMX_args),
15723   LOOKUP(30, ABI_optimization_goals),
15724   LOOKUP(31, ABI_FP_optimization_goals),
15725   {32, "compatibility", 0, NULL},
15726   LOOKUP(34, CPU_unaligned_access),
15727   LOOKUP(36, FP_HP_extension),
15728   LOOKUP(38, ABI_FP_16bit_format),
15729   LOOKUP(42, MPextension_use),
15730   LOOKUP(44, DIV_use),
15731   LOOKUP(46, DSP_extension),
15732   LOOKUP(48, MVE_arch),
15733   {64, "nodefaults", 0, NULL},
15734   {65, "also_compatible_with", 0, NULL},
15735   LOOKUP(66, T2EE_use),
15736   {67, "conformance", 1, NULL},
15737   LOOKUP(68, Virtualization_use),
15738   LOOKUP(70, MPextension_use_legacy)
15739 };
15740 #undef LOOKUP
15741
15742 static unsigned char *
15743 display_arm_attribute (unsigned char * p,
15744                        const unsigned char * const end)
15745 {
15746   unsigned int tag;
15747   unsigned int val;
15748   arm_attr_public_tag * attr;
15749   unsigned i;
15750   unsigned int type;
15751
15752   READ_ULEB (tag, p, end);
15753   attr = NULL;
15754   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
15755     {
15756       if (arm_attr_public_tags[i].tag == tag)
15757         {
15758           attr = &arm_attr_public_tags[i];
15759           break;
15760         }
15761     }
15762
15763   if (attr)
15764     {
15765       printf ("  Tag_%s: ", attr->name);
15766       switch (attr->type)
15767         {
15768         case 0:
15769           switch (tag)
15770             {
15771             case 7: /* Tag_CPU_arch_profile.  */
15772               READ_ULEB (val, p, end);
15773               switch (val)
15774                 {
15775                 case 0: printf (_("None\n")); break;
15776                 case 'A': printf (_("Application\n")); break;
15777                 case 'R': printf (_("Realtime\n")); break;
15778                 case 'M': printf (_("Microcontroller\n")); break;
15779                 case 'S': printf (_("Application or Realtime\n")); break;
15780                 default: printf ("??? (%d)\n", val); break;
15781                 }
15782               break;
15783
15784             case 24: /* Tag_align_needed.  */
15785               READ_ULEB (val, p, end);
15786               switch (val)
15787                 {
15788                 case 0: printf (_("None\n")); break;
15789                 case 1: printf (_("8-byte\n")); break;
15790                 case 2: printf (_("4-byte\n")); break;
15791                 case 3: printf ("??? 3\n"); break;
15792                 default:
15793                   if (val <= 12)
15794                     printf (_("8-byte and up to %d-byte extended\n"),
15795                             1 << val);
15796                   else
15797                     printf ("??? (%d)\n", val);
15798                   break;
15799                 }
15800               break;
15801
15802             case 25: /* Tag_align_preserved.  */
15803               READ_ULEB (val, p, end);
15804               switch (val)
15805                 {
15806                 case 0: printf (_("None\n")); break;
15807                 case 1: printf (_("8-byte, except leaf SP\n")); break;
15808                 case 2: printf (_("8-byte\n")); break;
15809                 case 3: printf ("??? 3\n"); break;
15810                 default:
15811                   if (val <= 12)
15812                     printf (_("8-byte and up to %d-byte extended\n"),
15813                             1 << val);
15814                   else
15815                     printf ("??? (%d)\n", val);
15816                   break;
15817                 }
15818               break;
15819
15820             case 32: /* Tag_compatibility.  */
15821               {
15822                 READ_ULEB (val, p, end);
15823                 printf (_("flag = %d, vendor = "), val);
15824                 if (p < end - 1)
15825                   {
15826                     size_t maxlen = (end - p) - 1;
15827
15828                     print_symbol ((int) maxlen, (const char *) p);
15829                     p += strnlen ((char *) p, maxlen) + 1;
15830                   }
15831                 else
15832                   {
15833                     printf (_("<corrupt>"));
15834                     p = (unsigned char *) end;
15835                   }
15836                 putchar ('\n');
15837               }
15838               break;
15839
15840             case 64: /* Tag_nodefaults.  */
15841               /* PR 17531: file: 001-505008-0.01.  */
15842               if (p < end)
15843                 p++;
15844               printf (_("True\n"));
15845               break;
15846
15847             case 65: /* Tag_also_compatible_with.  */
15848               READ_ULEB (val, p, end);
15849               if (val == 6 /* Tag_CPU_arch.  */)
15850                 {
15851                   READ_ULEB (val, p, end);
15852                   if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
15853                     printf ("??? (%d)\n", val);
15854                   else
15855                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
15856                 }
15857               else
15858                 printf ("???\n");
15859               while (p < end && *(p++) != '\0' /* NUL terminator.  */)
15860                 ;
15861               break;
15862
15863             default:
15864               printf (_("<unknown: %d>\n"), tag);
15865               break;
15866             }
15867           return p;
15868
15869         case 1:
15870           return display_tag_value (-1, p, end);
15871         case 2:
15872           return display_tag_value (0, p, end);
15873
15874         default:
15875           assert (attr->type & 0x80);
15876           READ_ULEB (val, p, end);
15877           type = attr->type & 0x7f;
15878           if (val >= type)
15879             printf ("??? (%d)\n", val);
15880           else
15881             printf ("%s\n", attr->table[val]);
15882           return p;
15883         }
15884     }
15885
15886   return display_tag_value (tag, p, end);
15887 }
15888
15889 static unsigned char *
15890 display_gnu_attribute (unsigned char * p,
15891                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const),
15892                        const unsigned char * const end)
15893 {
15894   unsigned int tag;
15895   unsigned int val;
15896
15897   READ_ULEB (tag, p, end);
15898
15899   /* Tag_compatibility is the only generic GNU attribute defined at
15900      present.  */
15901   if (tag == 32)
15902     {
15903       READ_ULEB (val, p, end);
15904
15905       printf (_("flag = %d, vendor = "), val);
15906       if (p == end)
15907         {
15908           printf (_("<corrupt>\n"));
15909           warn (_("corrupt vendor attribute\n"));
15910         }
15911       else
15912         {
15913           if (p < end - 1)
15914             {
15915               size_t maxlen = (end - p) - 1;
15916
15917               print_symbol ((int) maxlen, (const char *) p);
15918               p += strnlen ((char *) p, maxlen) + 1;
15919             }
15920           else
15921             {
15922               printf (_("<corrupt>"));
15923               p = (unsigned char *) end;
15924             }
15925           putchar ('\n');
15926         }
15927       return p;
15928     }
15929
15930   if ((tag & 2) == 0 && display_proc_gnu_attribute)
15931     return display_proc_gnu_attribute (p, tag, end);
15932
15933   return display_tag_value (tag, p, end);
15934 }
15935
15936 static unsigned char *
15937 display_m68k_gnu_attribute (unsigned char * p,
15938                             unsigned int tag,
15939                             const unsigned char * const end)
15940 {
15941   unsigned int val;
15942
15943   if (tag == Tag_GNU_M68K_ABI_FP)
15944     {
15945       printf ("  Tag_GNU_M68K_ABI_FP: ");
15946       if (p == end)
15947         {
15948           printf (_("<corrupt>\n"));
15949           return p;
15950         }
15951       READ_ULEB (val, p, end);
15952
15953       if (val > 3)
15954         printf ("(%#x), ", val);
15955
15956       switch (val & 3)
15957         {
15958         case 0:
15959           printf (_("unspecified hard/soft float\n"));
15960           break;
15961         case 1:
15962           printf (_("hard float\n"));
15963           break;
15964         case 2:
15965           printf (_("soft float\n"));
15966           break;
15967         }
15968       return p;
15969     }
15970
15971   return display_tag_value (tag & 1, p, end);
15972 }
15973
15974 static unsigned char *
15975 display_power_gnu_attribute (unsigned char * p,
15976                              unsigned int tag,
15977                              const unsigned char * const end)
15978 {
15979   unsigned int val;
15980
15981   if (tag == Tag_GNU_Power_ABI_FP)
15982     {
15983       printf ("  Tag_GNU_Power_ABI_FP: ");
15984       if (p == end)
15985         {
15986           printf (_("<corrupt>\n"));
15987           return p;
15988         }
15989       READ_ULEB (val, p, end);
15990
15991       if (val > 15)
15992         printf ("(%#x), ", val);
15993
15994       switch (val & 3)
15995         {
15996         case 0:
15997           printf (_("unspecified hard/soft float, "));
15998           break;
15999         case 1:
16000           printf (_("hard float, "));
16001           break;
16002         case 2:
16003           printf (_("soft float, "));
16004           break;
16005         case 3:
16006           printf (_("single-precision hard float, "));
16007           break;
16008         }
16009
16010       switch (val & 0xC)
16011         {
16012         case 0:
16013           printf (_("unspecified long double\n"));
16014           break;
16015         case 4:
16016           printf (_("128-bit IBM long double\n"));
16017           break;
16018         case 8:
16019           printf (_("64-bit long double\n"));
16020           break;
16021         case 12:
16022           printf (_("128-bit IEEE long double\n"));
16023           break;
16024         }
16025       return p;
16026     }
16027
16028   if (tag == Tag_GNU_Power_ABI_Vector)
16029     {
16030       printf ("  Tag_GNU_Power_ABI_Vector: ");
16031       if (p == end)
16032         {
16033           printf (_("<corrupt>\n"));
16034           return p;
16035         }
16036       READ_ULEB (val, p, end);
16037
16038       if (val > 3)
16039         printf ("(%#x), ", val);
16040
16041       switch (val & 3)
16042         {
16043         case 0:
16044           printf (_("unspecified\n"));
16045           break;
16046         case 1:
16047           printf (_("generic\n"));
16048           break;
16049         case 2:
16050           printf ("AltiVec\n");
16051           break;
16052         case 3:
16053           printf ("SPE\n");
16054           break;
16055         }
16056       return p;
16057     }
16058
16059   if (tag == Tag_GNU_Power_ABI_Struct_Return)
16060     {
16061       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
16062       if (p == end)
16063         {
16064           printf (_("<corrupt>\n"));
16065           return p;
16066         }
16067       READ_ULEB (val, p, end);
16068
16069       if (val > 2)
16070         printf ("(%#x), ", val);
16071
16072       switch (val & 3)
16073         {
16074         case 0:
16075           printf (_("unspecified\n"));
16076           break;
16077         case 1:
16078           printf ("r3/r4\n");
16079           break;
16080         case 2:
16081           printf (_("memory\n"));
16082           break;
16083         case 3:
16084           printf ("???\n");
16085           break;
16086         }
16087       return p;
16088     }
16089
16090   return display_tag_value (tag & 1, p, end);
16091 }
16092
16093 static unsigned char *
16094 display_s390_gnu_attribute (unsigned char * p,
16095                             unsigned int tag,
16096                             const unsigned char * const end)
16097 {
16098   unsigned int val;
16099
16100   if (tag == Tag_GNU_S390_ABI_Vector)
16101     {
16102       printf ("  Tag_GNU_S390_ABI_Vector: ");
16103       READ_ULEB (val, p, end);
16104
16105       switch (val)
16106         {
16107         case 0:
16108           printf (_("any\n"));
16109           break;
16110         case 1:
16111           printf (_("software\n"));
16112           break;
16113         case 2:
16114           printf (_("hardware\n"));
16115           break;
16116         default:
16117           printf ("??? (%d)\n", val);
16118           break;
16119         }
16120       return p;
16121    }
16122
16123   return display_tag_value (tag & 1, p, end);
16124 }
16125
16126 static void
16127 display_sparc_hwcaps (unsigned int mask)
16128 {
16129   if (mask)
16130     {
16131       bfd_boolean first = TRUE;
16132
16133       if (mask & ELF_SPARC_HWCAP_MUL32)
16134         fputs ("mul32", stdout), first = FALSE;
16135       if (mask & ELF_SPARC_HWCAP_DIV32)
16136         printf ("%sdiv32", first ? "" : "|"), first = FALSE;
16137       if (mask & ELF_SPARC_HWCAP_FSMULD)
16138         printf ("%sfsmuld", first ? "" : "|"), first = FALSE;
16139       if (mask & ELF_SPARC_HWCAP_V8PLUS)
16140         printf ("%sv8plus", first ? "" : "|"), first = FALSE;
16141       if (mask & ELF_SPARC_HWCAP_POPC)
16142         printf ("%spopc", first ? "" : "|"), first = FALSE;
16143       if (mask & ELF_SPARC_HWCAP_VIS)
16144         printf ("%svis", first ? "" : "|"), first = FALSE;
16145       if (mask & ELF_SPARC_HWCAP_VIS2)
16146         printf ("%svis2", first ? "" : "|"), first = FALSE;
16147       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
16148         printf ("%sASIBlkInit", first ? "" : "|"), first = FALSE;
16149       if (mask & ELF_SPARC_HWCAP_FMAF)
16150         printf ("%sfmaf", first ? "" : "|"), first = FALSE;
16151       if (mask & ELF_SPARC_HWCAP_VIS3)
16152         printf ("%svis3", first ? "" : "|"), first = FALSE;
16153       if (mask & ELF_SPARC_HWCAP_HPC)
16154         printf ("%shpc", first ? "" : "|"), first = FALSE;
16155       if (mask & ELF_SPARC_HWCAP_RANDOM)
16156         printf ("%srandom", first ? "" : "|"), first = FALSE;
16157       if (mask & ELF_SPARC_HWCAP_TRANS)
16158         printf ("%strans", first ? "" : "|"), first = FALSE;
16159       if (mask & ELF_SPARC_HWCAP_FJFMAU)
16160         printf ("%sfjfmau", first ? "" : "|"), first = FALSE;
16161       if (mask & ELF_SPARC_HWCAP_IMA)
16162         printf ("%sima", first ? "" : "|"), first = FALSE;
16163       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
16164         printf ("%scspare", first ? "" : "|"), first = FALSE;
16165     }
16166   else
16167     fputc ('0', stdout);
16168   fputc ('\n', stdout);
16169 }
16170
16171 static void
16172 display_sparc_hwcaps2 (unsigned int mask)
16173 {
16174   if (mask)
16175     {
16176       bfd_boolean first = TRUE;
16177
16178       if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
16179         fputs ("fjathplus", stdout), first = FALSE;
16180       if (mask & ELF_SPARC_HWCAP2_VIS3B)
16181         printf ("%svis3b", first ? "" : "|"), first = FALSE;
16182       if (mask & ELF_SPARC_HWCAP2_ADP)
16183         printf ("%sadp", first ? "" : "|"), first = FALSE;
16184       if (mask & ELF_SPARC_HWCAP2_SPARC5)
16185         printf ("%ssparc5", first ? "" : "|"), first = FALSE;
16186       if (mask & ELF_SPARC_HWCAP2_MWAIT)
16187         printf ("%smwait", first ? "" : "|"), first = FALSE;
16188       if (mask & ELF_SPARC_HWCAP2_XMPMUL)
16189         printf ("%sxmpmul", first ? "" : "|"), first = FALSE;
16190       if (mask & ELF_SPARC_HWCAP2_XMONT)
16191         printf ("%sxmont2", first ? "" : "|"), first = FALSE;
16192       if (mask & ELF_SPARC_HWCAP2_NSEC)
16193         printf ("%snsec", first ? "" : "|"), first = FALSE;
16194       if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
16195         printf ("%sfjathhpc", first ? "" : "|"), first = FALSE;
16196       if (mask & ELF_SPARC_HWCAP2_FJDES)
16197         printf ("%sfjdes", first ? "" : "|"), first = FALSE;
16198       if (mask & ELF_SPARC_HWCAP2_FJAES)
16199         printf ("%sfjaes", first ? "" : "|"), first = FALSE;
16200     }
16201   else
16202     fputc ('0', stdout);
16203   fputc ('\n', stdout);
16204 }
16205
16206 static unsigned char *
16207 display_sparc_gnu_attribute (unsigned char * p,
16208                              unsigned int tag,
16209                              const unsigned char * const end)
16210 {
16211   unsigned int val;
16212
16213   if (tag == Tag_GNU_Sparc_HWCAPS)
16214     {
16215       READ_ULEB (val, p, end);
16216       printf ("  Tag_GNU_Sparc_HWCAPS: ");
16217       display_sparc_hwcaps (val);
16218       return p;
16219     }
16220   if (tag == Tag_GNU_Sparc_HWCAPS2)
16221     {
16222       READ_ULEB (val, p, end);
16223       printf ("  Tag_GNU_Sparc_HWCAPS2: ");
16224       display_sparc_hwcaps2 (val);
16225       return p;
16226     }
16227
16228   return display_tag_value (tag, p, end);
16229 }
16230
16231 static void
16232 print_mips_fp_abi_value (unsigned int val)
16233 {
16234   switch (val)
16235     {
16236     case Val_GNU_MIPS_ABI_FP_ANY:
16237       printf (_("Hard or soft float\n"));
16238       break;
16239     case Val_GNU_MIPS_ABI_FP_DOUBLE:
16240       printf (_("Hard float (double precision)\n"));
16241       break;
16242     case Val_GNU_MIPS_ABI_FP_SINGLE:
16243       printf (_("Hard float (single precision)\n"));
16244       break;
16245     case Val_GNU_MIPS_ABI_FP_SOFT:
16246       printf (_("Soft float\n"));
16247       break;
16248     case Val_GNU_MIPS_ABI_FP_OLD_64:
16249       printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
16250       break;
16251     case Val_GNU_MIPS_ABI_FP_XX:
16252       printf (_("Hard float (32-bit CPU, Any FPU)\n"));
16253       break;
16254     case Val_GNU_MIPS_ABI_FP_64:
16255       printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
16256       break;
16257     case Val_GNU_MIPS_ABI_FP_64A:
16258       printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
16259       break;
16260     case Val_GNU_MIPS_ABI_FP_NAN2008:
16261       printf (_("NaN 2008 compatibility\n"));
16262       break;
16263     default:
16264       printf ("??? (%d)\n", val);
16265       break;
16266     }
16267 }
16268
16269 static unsigned char *
16270 display_mips_gnu_attribute (unsigned char * p,
16271                             unsigned int tag,
16272                             const unsigned char * const end)
16273 {
16274   if (tag == Tag_GNU_MIPS_ABI_FP)
16275     {
16276       unsigned int val;
16277
16278       printf ("  Tag_GNU_MIPS_ABI_FP: ");
16279       READ_ULEB (val, p, end);
16280       print_mips_fp_abi_value (val);
16281       return p;
16282    }
16283
16284   if (tag == Tag_GNU_MIPS_ABI_MSA)
16285     {
16286       unsigned int val;
16287
16288       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
16289       READ_ULEB (val, p, end);
16290
16291       switch (val)
16292         {
16293         case Val_GNU_MIPS_ABI_MSA_ANY:
16294           printf (_("Any MSA or not\n"));
16295           break;
16296         case Val_GNU_MIPS_ABI_MSA_128:
16297           printf (_("128-bit MSA\n"));
16298           break;
16299         default:
16300           printf ("??? (%d)\n", val);
16301           break;
16302         }
16303       return p;
16304     }
16305
16306   return display_tag_value (tag & 1, p, end);
16307 }
16308
16309 static unsigned char *
16310 display_tic6x_attribute (unsigned char * p,
16311                          const unsigned char * const end)
16312 {
16313   unsigned int tag;
16314   unsigned int val;
16315
16316   READ_ULEB (tag, p, end);
16317
16318   switch (tag)
16319     {
16320     case Tag_ISA:
16321       printf ("  Tag_ISA: ");
16322       READ_ULEB (val, p, end);
16323
16324       switch (val)
16325         {
16326         case C6XABI_Tag_ISA_none:
16327           printf (_("None\n"));
16328           break;
16329         case C6XABI_Tag_ISA_C62X:
16330           printf ("C62x\n");
16331           break;
16332         case C6XABI_Tag_ISA_C67X:
16333           printf ("C67x\n");
16334           break;
16335         case C6XABI_Tag_ISA_C67XP:
16336           printf ("C67x+\n");
16337           break;
16338         case C6XABI_Tag_ISA_C64X:
16339           printf ("C64x\n");
16340           break;
16341         case C6XABI_Tag_ISA_C64XP:
16342           printf ("C64x+\n");
16343           break;
16344         case C6XABI_Tag_ISA_C674X:
16345           printf ("C674x\n");
16346           break;
16347         default:
16348           printf ("??? (%d)\n", val);
16349           break;
16350         }
16351       return p;
16352
16353     case Tag_ABI_wchar_t:
16354       printf ("  Tag_ABI_wchar_t: ");
16355       READ_ULEB (val, p, end);
16356       switch (val)
16357         {
16358         case 0:
16359           printf (_("Not used\n"));
16360           break;
16361         case 1:
16362           printf (_("2 bytes\n"));
16363           break;
16364         case 2:
16365           printf (_("4 bytes\n"));
16366           break;
16367         default:
16368           printf ("??? (%d)\n", val);
16369           break;
16370         }
16371       return p;
16372
16373     case Tag_ABI_stack_align_needed:
16374       printf ("  Tag_ABI_stack_align_needed: ");
16375       READ_ULEB (val, p, end);
16376       switch (val)
16377         {
16378         case 0:
16379           printf (_("8-byte\n"));
16380           break;
16381         case 1:
16382           printf (_("16-byte\n"));
16383           break;
16384         default:
16385           printf ("??? (%d)\n", val);
16386           break;
16387         }
16388       return p;
16389
16390     case Tag_ABI_stack_align_preserved:
16391       READ_ULEB (val, p, end);
16392       printf ("  Tag_ABI_stack_align_preserved: ");
16393       switch (val)
16394         {
16395         case 0:
16396           printf (_("8-byte\n"));
16397           break;
16398         case 1:
16399           printf (_("16-byte\n"));
16400           break;
16401         default:
16402           printf ("??? (%d)\n", val);
16403           break;
16404         }
16405       return p;
16406
16407     case Tag_ABI_DSBT:
16408       READ_ULEB (val, p, end);
16409       printf ("  Tag_ABI_DSBT: ");
16410       switch (val)
16411         {
16412         case 0:
16413           printf (_("DSBT addressing not used\n"));
16414           break;
16415         case 1:
16416           printf (_("DSBT addressing used\n"));
16417           break;
16418         default:
16419           printf ("??? (%d)\n", val);
16420           break;
16421         }
16422       return p;
16423
16424     case Tag_ABI_PID:
16425       READ_ULEB (val, p, end);
16426       printf ("  Tag_ABI_PID: ");
16427       switch (val)
16428         {
16429         case 0:
16430           printf (_("Data addressing position-dependent\n"));
16431           break;
16432         case 1:
16433           printf (_("Data addressing position-independent, GOT near DP\n"));
16434           break;
16435         case 2:
16436           printf (_("Data addressing position-independent, GOT far from DP\n"));
16437           break;
16438         default:
16439           printf ("??? (%d)\n", val);
16440           break;
16441         }
16442       return p;
16443
16444     case Tag_ABI_PIC:
16445       READ_ULEB (val, p, end);
16446       printf ("  Tag_ABI_PIC: ");
16447       switch (val)
16448         {
16449         case 0:
16450           printf (_("Code addressing position-dependent\n"));
16451           break;
16452         case 1:
16453           printf (_("Code addressing position-independent\n"));
16454           break;
16455         default:
16456           printf ("??? (%d)\n", val);
16457           break;
16458         }
16459       return p;
16460
16461     case Tag_ABI_array_object_alignment:
16462       READ_ULEB (val, p, end);
16463       printf ("  Tag_ABI_array_object_alignment: ");
16464       switch (val)
16465         {
16466         case 0:
16467           printf (_("8-byte\n"));
16468           break;
16469         case 1:
16470           printf (_("4-byte\n"));
16471           break;
16472         case 2:
16473           printf (_("16-byte\n"));
16474           break;
16475         default:
16476           printf ("??? (%d)\n", val);
16477           break;
16478         }
16479       return p;
16480
16481     case Tag_ABI_array_object_align_expected:
16482       READ_ULEB (val, p, end);
16483       printf ("  Tag_ABI_array_object_align_expected: ");
16484       switch (val)
16485         {
16486         case 0:
16487           printf (_("8-byte\n"));
16488           break;
16489         case 1:
16490           printf (_("4-byte\n"));
16491           break;
16492         case 2:
16493           printf (_("16-byte\n"));
16494           break;
16495         default:
16496           printf ("??? (%d)\n", val);
16497           break;
16498         }
16499       return p;
16500
16501     case Tag_ABI_compatibility:
16502       {
16503         READ_ULEB (val, p, end);
16504         printf ("  Tag_ABI_compatibility: ");
16505         printf (_("flag = %d, vendor = "), val);
16506         if (p < end - 1)
16507           {
16508             size_t maxlen = (end - p) - 1;
16509
16510             print_symbol ((int) maxlen, (const char *) p);
16511             p += strnlen ((char *) p, maxlen) + 1;
16512           }
16513         else
16514           {
16515             printf (_("<corrupt>"));
16516             p = (unsigned char *) end;
16517           }
16518         putchar ('\n');
16519         return p;
16520       }
16521
16522     case Tag_ABI_conformance:
16523       {
16524         printf ("  Tag_ABI_conformance: \"");
16525         if (p < end - 1)
16526           {
16527             size_t maxlen = (end - p) - 1;
16528
16529             print_symbol ((int) maxlen, (const char *) p);
16530             p += strnlen ((char *) p, maxlen) + 1;
16531           }
16532         else
16533           {
16534             printf (_("<corrupt>"));
16535             p = (unsigned char *) end;
16536           }
16537         printf ("\"\n");
16538         return p;
16539       }
16540     }
16541
16542   return display_tag_value (tag, p, end);
16543 }
16544
16545 static void
16546 display_raw_attribute (unsigned char * p, unsigned char const * const end)
16547 {
16548   unsigned long addr = 0;
16549   size_t bytes = end - p;
16550
16551   assert (end >= p);
16552   while (bytes)
16553     {
16554       int j;
16555       int k;
16556       int lbytes = (bytes > 16 ? 16 : bytes);
16557
16558       printf ("  0x%8.8lx ", addr);
16559
16560       for (j = 0; j < 16; j++)
16561         {
16562           if (j < lbytes)
16563             printf ("%2.2x", p[j]);
16564           else
16565             printf ("  ");
16566
16567           if ((j & 3) == 3)
16568             printf (" ");
16569         }
16570
16571       for (j = 0; j < lbytes; j++)
16572         {
16573           k = p[j];
16574           if (k >= ' ' && k < 0x7f)
16575             printf ("%c", k);
16576           else
16577             printf (".");
16578         }
16579
16580       putchar ('\n');
16581
16582       p  += lbytes;
16583       bytes -= lbytes;
16584       addr += lbytes;
16585     }
16586
16587   putchar ('\n');
16588 }
16589
16590 static unsigned char *
16591 display_msp430_attribute (unsigned char * p,
16592                            const unsigned char * const end)
16593 {
16594   unsigned int val;
16595   unsigned int tag;
16596
16597   READ_ULEB (tag, p, end);
16598
16599   switch (tag)
16600     {
16601     case OFBA_MSPABI_Tag_ISA:
16602       printf ("  Tag_ISA: ");
16603       READ_ULEB (val, p, end);
16604       switch (val)
16605         {
16606         case 0: printf (_("None\n")); break;
16607         case 1: printf (_("MSP430\n")); break;
16608         case 2: printf (_("MSP430X\n")); break;
16609         default: printf ("??? (%d)\n", val); break;
16610         }
16611       break;
16612
16613     case OFBA_MSPABI_Tag_Code_Model:
16614       printf ("  Tag_Code_Model: ");
16615       READ_ULEB (val, p, end);
16616       switch (val)
16617         {
16618         case 0: printf (_("None\n")); break;
16619         case 1: printf (_("Small\n")); break;
16620         case 2: printf (_("Large\n")); break;
16621         default: printf ("??? (%d)\n", val); break;
16622         }
16623       break;
16624
16625     case OFBA_MSPABI_Tag_Data_Model:
16626       printf ("  Tag_Data_Model: ");
16627       READ_ULEB (val, p, end);
16628       switch (val)
16629         {
16630         case 0: printf (_("None\n")); break;
16631         case 1: printf (_("Small\n")); break;
16632         case 2: printf (_("Large\n")); break;
16633         case 3: printf (_("Restricted Large\n")); break;
16634         default: printf ("??? (%d)\n", val); break;
16635         }
16636       break;
16637
16638     default:
16639       printf (_("  <unknown tag %d>: "), tag);
16640
16641       if (tag & 1)
16642         {
16643           putchar ('"');
16644           if (p < end - 1)
16645             {
16646               size_t maxlen = (end - p) - 1;
16647
16648               print_symbol ((int) maxlen, (const char *) p);
16649               p += strnlen ((char *) p, maxlen) + 1;
16650             }
16651           else
16652             {
16653               printf (_("<corrupt>"));
16654               p = (unsigned char *) end;
16655             }
16656           printf ("\"\n");
16657         }
16658       else
16659         {
16660           READ_ULEB (val, p, end);
16661           printf ("%d (0x%x)\n", val, val);
16662         }
16663       break;
16664    }
16665
16666   assert (p <= end);
16667   return p;
16668 }
16669
16670 static unsigned char *
16671 display_msp430_gnu_attribute (unsigned char * p,
16672                               unsigned int tag,
16673                               const unsigned char * const end)
16674 {
16675   if (tag == Tag_GNU_MSP430_Data_Region)
16676     {
16677       unsigned int val;
16678
16679       printf ("  Tag_GNU_MSP430_Data_Region: ");
16680       READ_ULEB (val, p, end);
16681
16682       switch (val)
16683         {
16684         case Val_GNU_MSP430_Data_Region_Any:
16685           printf (_("Any Region\n"));
16686           break;
16687         case Val_GNU_MSP430_Data_Region_Lower:
16688           printf (_("Lower Region Only\n"));
16689           break;
16690         default:
16691           printf ("??? (%u)\n", val);
16692         }
16693       return p;
16694     }
16695   return display_tag_value (tag & 1, p, end);
16696 }
16697
16698 struct riscv_attr_tag_t {
16699   const char *name;
16700   unsigned int tag;
16701 };
16702
16703 static struct riscv_attr_tag_t riscv_attr_tag[] =
16704 {
16705 #define T(tag) {"Tag_RISCV_" #tag, Tag_RISCV_##tag}
16706   T(arch),
16707   T(priv_spec),
16708   T(priv_spec_minor),
16709   T(priv_spec_revision),
16710   T(unaligned_access),
16711   T(stack_align),
16712 #undef T
16713 };
16714
16715 static unsigned char *
16716 display_riscv_attribute (unsigned char *p,
16717                          const unsigned char * const end)
16718 {
16719   unsigned int val;
16720   unsigned int tag;
16721   struct riscv_attr_tag_t *attr = NULL;
16722   unsigned i;
16723
16724   READ_ULEB (tag, p, end);
16725
16726   /* Find the name of attribute. */
16727   for (i = 0; i < ARRAY_SIZE (riscv_attr_tag); i++)
16728     {
16729       if (riscv_attr_tag[i].tag == tag)
16730         {
16731           attr = &riscv_attr_tag[i];
16732           break;
16733         }
16734     }
16735
16736   if (attr)
16737     printf ("  %s: ", attr->name);
16738   else
16739     return display_tag_value (tag, p, end);
16740
16741   switch (tag)
16742     {
16743     case Tag_RISCV_priv_spec:
16744     case Tag_RISCV_priv_spec_minor:
16745     case Tag_RISCV_priv_spec_revision:
16746       READ_ULEB (val, p, end);
16747       printf (_("%u\n"), val);
16748       break;
16749     case Tag_RISCV_unaligned_access:
16750       READ_ULEB (val, p, end);
16751       switch (val)
16752         {
16753         case 0:
16754           printf (_("No unaligned access\n"));
16755           break;
16756         case 1:
16757           printf (_("Unaligned access\n"));
16758           break;
16759         }
16760       break;
16761     case Tag_RISCV_stack_align:
16762       READ_ULEB (val, p, end);
16763       printf (_("%u-bytes\n"), val);
16764       break;
16765     case Tag_RISCV_arch:
16766       p = display_tag_value (-1, p, end);
16767       break;
16768     default:
16769       return display_tag_value (tag, p, end);
16770     }
16771
16772   return p;
16773 }
16774
16775 static unsigned char *
16776 display_csky_attribute (unsigned char * p,
16777                         const unsigned char * const end)
16778 {
16779   unsigned int tag;
16780   unsigned int val;
16781   READ_ULEB (tag, p, end);
16782
16783   if (tag >= Tag_CSKY_MAX)
16784     {
16785       return display_tag_value (-1, p, end);
16786     }
16787
16788   switch (tag)
16789     {
16790     case Tag_CSKY_ARCH_NAME:
16791       printf ("  Tag_CSKY_ARCH_NAME:\t\t");
16792       return display_tag_value (-1, p, end);
16793     case Tag_CSKY_CPU_NAME:
16794       printf ("  Tag_CSKY_CPU_NAME:\t\t");
16795       return display_tag_value (-1, p, end);
16796
16797     case Tag_CSKY_ISA_FLAGS:
16798       printf ("  Tag_CSKY_ISA_FLAGS:\t\t");
16799       return display_tag_value (0, p, end);
16800     case Tag_CSKY_ISA_EXT_FLAGS:
16801       printf ("  Tag_CSKY_ISA_EXT_FLAGS:\t");
16802       return display_tag_value (0, p, end);
16803
16804     case Tag_CSKY_DSP_VERSION:
16805       printf ("  Tag_CSKY_DSP_VERSION:\t\t");
16806       READ_ULEB (val, p, end);
16807       if (val == VAL_CSKY_DSP_VERSION_EXTENSION)
16808         printf ("DSP Extension\n");
16809       else if (val == VAL_CSKY_DSP_VERSION_2)
16810         printf ("DSP 2.0\n");
16811       break;
16812
16813     case Tag_CSKY_VDSP_VERSION:
16814       printf ("  Tag_CSKY_VDSP_VERSION:\t");
16815       READ_ULEB (val, p, end);
16816       printf ("VDSP Version %d\n", val);
16817       break;
16818
16819     case Tag_CSKY_FPU_VERSION:
16820       printf ("  Tag_CSKY_FPU_VERSION:\t\t");
16821       READ_ULEB (val, p, end);
16822       if (val == VAL_CSKY_FPU_VERSION_1)
16823         printf ("ABIV1 FPU Version 1\n");
16824       else if (val == VAL_CSKY_FPU_VERSION_2)
16825         printf ("FPU Version 2\n");
16826       break;
16827
16828     case Tag_CSKY_FPU_ABI:
16829       printf ("  Tag_CSKY_FPU_ABI:\t\t");
16830       READ_ULEB (val, p, end);
16831       if (val == VAL_CSKY_FPU_ABI_HARD)
16832         printf ("Hard\n");
16833       else if (val == VAL_CSKY_FPU_ABI_SOFTFP)
16834         printf ("SoftFP\n");
16835       else if (val == VAL_CSKY_FPU_ABI_SOFT)
16836         printf ("Soft\n");
16837       break;
16838     case Tag_CSKY_FPU_ROUNDING:
16839       READ_ULEB (val, p, end);
16840       if (val == 1) {
16841         printf ("  Tag_CSKY_FPU_ROUNDING:\t");
16842         printf ("Needed\n");
16843       }
16844       break;
16845     case Tag_CSKY_FPU_DENORMAL:
16846       READ_ULEB (val, p, end);
16847       if (val == 1) {
16848         printf ("  Tag_CSKY_FPU_DENORMAL:\t");
16849         printf ("Needed\n");
16850       }
16851       break;
16852     case Tag_CSKY_FPU_Exception:
16853       READ_ULEB (val, p, end);
16854       if (val == 1) {
16855         printf ("  Tag_CSKY_FPU_Exception:\t");
16856         printf ("Needed\n");
16857       }
16858       break;
16859     case Tag_CSKY_FPU_NUMBER_MODULE:
16860       printf ("  Tag_CSKY_FPU_NUMBER_MODULE:\t");
16861       return display_tag_value (-1, p, end);
16862     case Tag_CSKY_FPU_HARDFP:
16863       printf ("  Tag_CSKY_FPU_HARDFP:\t\t");
16864       READ_ULEB (val, p, end);
16865       if (val & VAL_CSKY_FPU_HARDFP_HALF)
16866         printf (" Half");
16867       if (val & VAL_CSKY_FPU_HARDFP_SINGLE)
16868         printf (" Single");
16869       if (val & VAL_CSKY_FPU_HARDFP_DOUBLE)
16870         printf (" Double");
16871       printf ("\n");
16872       break;
16873     default:
16874       return display_tag_value (tag, p, end);
16875      }
16876   return p;
16877 }
16878
16879 static bfd_boolean
16880 process_attributes (Filedata * filedata,
16881                     const char * public_name,
16882                     unsigned int proc_type,
16883                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
16884                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const))
16885 {
16886   Elf_Internal_Shdr * sect;
16887   unsigned i;
16888   bfd_boolean res = TRUE;
16889
16890   /* Find the section header so that we get the size.  */
16891   for (i = 0, sect = filedata->section_headers;
16892        i < filedata->file_header.e_shnum;
16893        i++, sect++)
16894     {
16895       unsigned char * contents;
16896       unsigned char * p;
16897
16898       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
16899         continue;
16900
16901       contents = (unsigned char *) get_data (NULL, filedata, sect->sh_offset, 1,
16902                                              sect->sh_size, _("attributes"));
16903       if (contents == NULL)
16904         {
16905           res = FALSE;
16906           continue;
16907         }
16908
16909       p = contents;
16910       /* The first character is the version of the attributes.
16911          Currently only version 1, (aka 'A') is recognised here.  */
16912       if (*p != 'A')
16913         {
16914           printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p);
16915           res = FALSE;
16916         }
16917       else
16918         {
16919           bfd_vma section_len;
16920
16921           section_len = sect->sh_size - 1;
16922           p++;
16923
16924           while (section_len > 0)
16925             {
16926               bfd_vma attr_len;
16927               unsigned int namelen;
16928               bfd_boolean public_section;
16929               bfd_boolean gnu_section;
16930
16931               if (section_len <= 4)
16932                 {
16933                   error (_("Tag section ends prematurely\n"));
16934                   res = FALSE;
16935                   break;
16936                 }
16937               attr_len = byte_get (p, 4);
16938               p += 4;
16939
16940               if (attr_len > section_len)
16941                 {
16942                   error (_("Bad attribute length (%u > %u)\n"),
16943                           (unsigned) attr_len, (unsigned) section_len);
16944                   attr_len = section_len;
16945                   res = FALSE;
16946                 }
16947               /* PR 17531: file: 001-101425-0.004  */
16948               else if (attr_len < 5)
16949                 {
16950                   error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
16951                   res = FALSE;
16952                   break;
16953                 }
16954
16955               section_len -= attr_len;
16956               attr_len -= 4;
16957
16958               namelen = strnlen ((char *) p, attr_len) + 1;
16959               if (namelen == 0 || namelen >= attr_len)
16960                 {
16961                   error (_("Corrupt attribute section name\n"));
16962                   res = FALSE;
16963                   break;
16964                 }
16965
16966               printf (_("Attribute Section: "));
16967               print_symbol (INT_MAX, (const char *) p);
16968               putchar ('\n');
16969
16970               if (public_name && streq ((char *) p, public_name))
16971                 public_section = TRUE;
16972               else
16973                 public_section = FALSE;
16974
16975               if (streq ((char *) p, "gnu"))
16976                 gnu_section = TRUE;
16977               else
16978                 gnu_section = FALSE;
16979
16980               p += namelen;
16981               attr_len -= namelen;
16982
16983               while (attr_len > 0 && p < contents + sect->sh_size)
16984                 {
16985                   int tag;
16986                   unsigned int val;
16987                   bfd_vma size;
16988                   unsigned char * end;
16989
16990                   /* PR binutils/17531: Safe handling of corrupt files.  */
16991                   if (attr_len < 6)
16992                     {
16993                       error (_("Unused bytes at end of section\n"));
16994                       res = FALSE;
16995                       section_len = 0;
16996                       break;
16997                     }
16998
16999                   tag = *(p++);
17000                   size = byte_get (p, 4);
17001                   if (size > attr_len)
17002                     {
17003                       error (_("Bad subsection length (%u > %u)\n"),
17004                               (unsigned) size, (unsigned) attr_len);
17005                       res = FALSE;
17006                       size = attr_len;
17007                     }
17008                   /* PR binutils/17531: Safe handling of corrupt files.  */
17009                   if (size < 6)
17010                     {
17011                       error (_("Bad subsection length (%u < 6)\n"),
17012                               (unsigned) size);
17013                       res = FALSE;
17014                       section_len = 0;
17015                       break;
17016                     }
17017
17018                   attr_len -= size;
17019                   end = p + size - 1;
17020                   assert (end <= contents + sect->sh_size);
17021                   p += 4;
17022
17023                   switch (tag)
17024                     {
17025                     case 1:
17026                       printf (_("File Attributes\n"));
17027                       break;
17028                     case 2:
17029                       printf (_("Section Attributes:"));
17030                       goto do_numlist;
17031                     case 3:
17032                       printf (_("Symbol Attributes:"));
17033                       /* Fall through.  */
17034                     do_numlist:
17035                       for (;;)
17036                         {
17037                           READ_ULEB (val, p, end);
17038                           if (val == 0)
17039                             break;
17040                           printf (" %d", val);
17041                         }
17042                       printf ("\n");
17043                       break;
17044                     default:
17045                       printf (_("Unknown tag: %d\n"), tag);
17046                       public_section = FALSE;
17047                       break;
17048                     }
17049
17050                   if (public_section && display_pub_attribute != NULL)
17051                     {
17052                       while (p < end)
17053                         p = display_pub_attribute (p, end);
17054                       assert (p == end);
17055                     }
17056                   else if (gnu_section && display_proc_gnu_attribute != NULL)
17057                     {
17058                       while (p < end)
17059                         p = display_gnu_attribute (p,
17060                                                    display_proc_gnu_attribute,
17061                                                    end);
17062                       assert (p == end);
17063                     }
17064                   else if (p < end)
17065                     {
17066                       printf (_("  Unknown attribute:\n"));
17067                       display_raw_attribute (p, end);
17068                       p = end;
17069                     }
17070                   else
17071                     attr_len = 0;
17072                 }
17073             }
17074         }
17075
17076       free (contents);
17077     }
17078
17079   return res;
17080 }
17081
17082 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
17083    Print the Address, Access and Initial fields of an entry at VMA ADDR
17084    and return the VMA of the next entry, or -1 if there was a problem.
17085    Does not read from DATA_END or beyond.  */
17086
17087 static bfd_vma
17088 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
17089                       unsigned char * data_end)
17090 {
17091   printf ("  ");
17092   print_vma (addr, LONG_HEX);
17093   printf (" ");
17094   if (addr < pltgot + 0xfff0)
17095     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
17096   else
17097     printf ("%10s", "");
17098   printf (" ");
17099   if (data == NULL)
17100     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
17101   else
17102     {
17103       bfd_vma entry;
17104       unsigned char * from = data + addr - pltgot;
17105
17106       if (from + (is_32bit_elf ? 4 : 8) > data_end)
17107         {
17108           warn (_("MIPS GOT entry extends beyond the end of available data\n"));
17109           printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
17110           return (bfd_vma) -1;
17111         }
17112       else
17113         {
17114           entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
17115           print_vma (entry, LONG_HEX);
17116         }
17117     }
17118   return addr + (is_32bit_elf ? 4 : 8);
17119 }
17120
17121 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
17122    PLTGOT.  Print the Address and Initial fields of an entry at VMA
17123    ADDR and return the VMA of the next entry.  */
17124
17125 static bfd_vma
17126 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
17127 {
17128   printf ("  ");
17129   print_vma (addr, LONG_HEX);
17130   printf (" ");
17131   if (data == NULL)
17132     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
17133   else
17134     {
17135       bfd_vma entry;
17136
17137       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
17138       print_vma (entry, LONG_HEX);
17139     }
17140   return addr + (is_32bit_elf ? 4 : 8);
17141 }
17142
17143 static void
17144 print_mips_ases (unsigned int mask)
17145 {
17146   if (mask & AFL_ASE_DSP)
17147     fputs ("\n\tDSP ASE", stdout);
17148   if (mask & AFL_ASE_DSPR2)
17149     fputs ("\n\tDSP R2 ASE", stdout);
17150   if (mask & AFL_ASE_DSPR3)
17151     fputs ("\n\tDSP R3 ASE", stdout);
17152   if (mask & AFL_ASE_EVA)
17153     fputs ("\n\tEnhanced VA Scheme", stdout);
17154   if (mask & AFL_ASE_MCU)
17155     fputs ("\n\tMCU (MicroController) ASE", stdout);
17156   if (mask & AFL_ASE_MDMX)
17157     fputs ("\n\tMDMX ASE", stdout);
17158   if (mask & AFL_ASE_MIPS3D)
17159     fputs ("\n\tMIPS-3D ASE", stdout);
17160   if (mask & AFL_ASE_MT)
17161     fputs ("\n\tMT ASE", stdout);
17162   if (mask & AFL_ASE_SMARTMIPS)
17163     fputs ("\n\tSmartMIPS ASE", stdout);
17164   if (mask & AFL_ASE_VIRT)
17165     fputs ("\n\tVZ ASE", stdout);
17166   if (mask & AFL_ASE_MSA)
17167     fputs ("\n\tMSA ASE", stdout);
17168   if (mask & AFL_ASE_MIPS16)
17169     fputs ("\n\tMIPS16 ASE", stdout);
17170   if (mask & AFL_ASE_MICROMIPS)
17171     fputs ("\n\tMICROMIPS ASE", stdout);
17172   if (mask & AFL_ASE_XPA)
17173     fputs ("\n\tXPA ASE", stdout);
17174   if (mask & AFL_ASE_MIPS16E2)
17175     fputs ("\n\tMIPS16e2 ASE", stdout);
17176   if (mask & AFL_ASE_CRC)
17177     fputs ("\n\tCRC ASE", stdout);
17178   if (mask & AFL_ASE_GINV)
17179     fputs ("\n\tGINV ASE", stdout);
17180   if (mask & AFL_ASE_LOONGSON_MMI)
17181     fputs ("\n\tLoongson MMI ASE", stdout);
17182   if (mask & AFL_ASE_LOONGSON_CAM)
17183     fputs ("\n\tLoongson CAM ASE", stdout);
17184   if (mask & AFL_ASE_LOONGSON_EXT)
17185     fputs ("\n\tLoongson EXT ASE", stdout);
17186   if (mask & AFL_ASE_LOONGSON_EXT2)
17187     fputs ("\n\tLoongson EXT2 ASE", stdout);
17188   if (mask == 0)
17189     fprintf (stdout, "\n\t%s", _("None"));
17190   else if ((mask & ~AFL_ASE_MASK) != 0)
17191     fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
17192 }
17193
17194 static void
17195 print_mips_isa_ext (unsigned int isa_ext)
17196 {
17197   switch (isa_ext)
17198     {
17199     case 0:
17200       fputs (_("None"), stdout);
17201       break;
17202     case AFL_EXT_XLR:
17203       fputs ("RMI XLR", stdout);
17204       break;
17205     case AFL_EXT_OCTEON3:
17206       fputs ("Cavium Networks Octeon3", stdout);
17207       break;
17208     case AFL_EXT_OCTEON2:
17209       fputs ("Cavium Networks Octeon2", stdout);
17210       break;
17211     case AFL_EXT_OCTEONP:
17212       fputs ("Cavium Networks OcteonP", stdout);
17213       break;
17214     case AFL_EXT_OCTEON:
17215       fputs ("Cavium Networks Octeon", stdout);
17216       break;
17217     case AFL_EXT_5900:
17218       fputs ("Toshiba R5900", stdout);
17219       break;
17220     case AFL_EXT_4650:
17221       fputs ("MIPS R4650", stdout);
17222       break;
17223     case AFL_EXT_4010:
17224       fputs ("LSI R4010", stdout);
17225       break;
17226     case AFL_EXT_4100:
17227       fputs ("NEC VR4100", stdout);
17228       break;
17229     case AFL_EXT_3900:
17230       fputs ("Toshiba R3900", stdout);
17231       break;
17232     case AFL_EXT_10000:
17233       fputs ("MIPS R10000", stdout);
17234       break;
17235     case AFL_EXT_SB1:
17236       fputs ("Broadcom SB-1", stdout);
17237       break;
17238     case AFL_EXT_4111:
17239       fputs ("NEC VR4111/VR4181", stdout);
17240       break;
17241     case AFL_EXT_4120:
17242       fputs ("NEC VR4120", stdout);
17243       break;
17244     case AFL_EXT_5400:
17245       fputs ("NEC VR5400", stdout);
17246       break;
17247     case AFL_EXT_5500:
17248       fputs ("NEC VR5500", stdout);
17249       break;
17250     case AFL_EXT_LOONGSON_2E:
17251       fputs ("ST Microelectronics Loongson 2E", stdout);
17252       break;
17253     case AFL_EXT_LOONGSON_2F:
17254       fputs ("ST Microelectronics Loongson 2F", stdout);
17255       break;
17256     case AFL_EXT_INTERAPTIV_MR2:
17257       fputs ("Imagination interAptiv MR2", stdout);
17258       break;
17259     default:
17260       fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
17261     }
17262 }
17263
17264 static signed int
17265 get_mips_reg_size (int reg_size)
17266 {
17267   return (reg_size == AFL_REG_NONE) ? 0
17268          : (reg_size == AFL_REG_32) ? 32
17269          : (reg_size == AFL_REG_64) ? 64
17270          : (reg_size == AFL_REG_128) ? 128
17271          : -1;
17272 }
17273
17274 static bfd_boolean
17275 process_mips_specific (Filedata * filedata)
17276 {
17277   Elf_Internal_Dyn * entry;
17278   Elf_Internal_Shdr *sect = NULL;
17279   size_t liblist_offset = 0;
17280   size_t liblistno = 0;
17281   size_t conflictsno = 0;
17282   size_t options_offset = 0;
17283   size_t conflicts_offset = 0;
17284   size_t pltrelsz = 0;
17285   size_t pltrel = 0;
17286   bfd_vma pltgot = 0;
17287   bfd_vma mips_pltgot = 0;
17288   bfd_vma jmprel = 0;
17289   bfd_vma local_gotno = 0;
17290   bfd_vma gotsym = 0;
17291   bfd_vma symtabno = 0;
17292   bfd_boolean res = TRUE;
17293
17294   if (! process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
17295                             display_mips_gnu_attribute))
17296     res = FALSE;
17297
17298   sect = find_section (filedata, ".MIPS.abiflags");
17299
17300   if (sect != NULL)
17301     {
17302       Elf_External_ABIFlags_v0 *abiflags_ext;
17303       Elf_Internal_ABIFlags_v0 abiflags_in;
17304
17305       if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
17306         {
17307           error (_("Corrupt MIPS ABI Flags section.\n"));
17308           res = FALSE;
17309         }
17310       else
17311         {
17312           abiflags_ext = get_data (NULL, filedata, sect->sh_offset, 1,
17313                                    sect->sh_size, _("MIPS ABI Flags section"));
17314           if (abiflags_ext)
17315             {
17316               abiflags_in.version = BYTE_GET (abiflags_ext->version);
17317               abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
17318               abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
17319               abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
17320               abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
17321               abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
17322               abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
17323               abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
17324               abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
17325               abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
17326               abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
17327
17328               printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
17329               printf ("\nISA: MIPS%d", abiflags_in.isa_level);
17330               if (abiflags_in.isa_rev > 1)
17331                 printf ("r%d", abiflags_in.isa_rev);
17332               printf ("\nGPR size: %d",
17333                       get_mips_reg_size (abiflags_in.gpr_size));
17334               printf ("\nCPR1 size: %d",
17335                       get_mips_reg_size (abiflags_in.cpr1_size));
17336               printf ("\nCPR2 size: %d",
17337                       get_mips_reg_size (abiflags_in.cpr2_size));
17338               fputs ("\nFP ABI: ", stdout);
17339               print_mips_fp_abi_value (abiflags_in.fp_abi);
17340               fputs ("ISA Extension: ", stdout);
17341               print_mips_isa_ext (abiflags_in.isa_ext);
17342               fputs ("\nASEs:", stdout);
17343               print_mips_ases (abiflags_in.ases);
17344               printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
17345               printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
17346               fputc ('\n', stdout);
17347               free (abiflags_ext);
17348             }
17349         }
17350     }
17351
17352   /* We have a lot of special sections.  Thanks SGI!  */
17353   if (filedata->dynamic_section == NULL)
17354     {
17355       /* No dynamic information available.  See if there is static GOT.  */
17356       sect = find_section (filedata, ".got");
17357       if (sect != NULL)
17358         {
17359           unsigned char *data_end;
17360           unsigned char *data;
17361           bfd_vma ent, end;
17362           int addr_size;
17363
17364           pltgot = sect->sh_addr;
17365
17366           ent = pltgot;
17367           addr_size = (is_32bit_elf ? 4 : 8);
17368           end = pltgot + sect->sh_size;
17369
17370           data = (unsigned char *) get_data (NULL, filedata, sect->sh_offset,
17371                                              end - pltgot, 1,
17372                                              _("Global Offset Table data"));
17373           /* PR 12855: Null data is handled gracefully throughout.  */
17374           data_end = data + (end - pltgot);
17375
17376           printf (_("\nStatic GOT:\n"));
17377           printf (_(" Canonical gp value: "));
17378           print_vma (ent + 0x7ff0, LONG_HEX);
17379           printf ("\n\n");
17380
17381           /* In a dynamic binary GOT[0] is reserved for the dynamic
17382              loader to store the lazy resolver pointer, however in
17383              a static binary it may well have been omitted and GOT
17384              reduced to a table of addresses.
17385              PR 21344: Check for the entry being fully available
17386              before fetching it.  */
17387           if (data
17388               && data + ent - pltgot + addr_size <= data_end
17389               && byte_get (data + ent - pltgot, addr_size) == 0)
17390             {
17391               printf (_(" Reserved entries:\n"));
17392               printf (_("  %*s %10s %*s\n"),
17393                       addr_size * 2, _("Address"), _("Access"),
17394                       addr_size * 2, _("Value"));
17395               ent = print_mips_got_entry (data, pltgot, ent, data_end);
17396               printf ("\n");
17397               if (ent == (bfd_vma) -1)
17398                 goto sgot_print_fail;
17399
17400               /* Check for the MSB of GOT[1] being set, identifying a
17401                  GNU object.  This entry will be used by some runtime
17402                  loaders, to store the module pointer.  Otherwise this
17403                  is an ordinary local entry.
17404                  PR 21344: Check for the entry being fully available
17405                  before fetching it.  */
17406               if (data
17407                   && data + ent - pltgot + addr_size <= data_end
17408                   && (byte_get (data + ent - pltgot, addr_size)
17409                       >> (addr_size * 8 - 1)) != 0)
17410                 {
17411                   ent = print_mips_got_entry (data, pltgot, ent, data_end);
17412                   printf ("\n");
17413                   if (ent == (bfd_vma) -1)
17414                     goto sgot_print_fail;
17415                 }
17416               printf ("\n");
17417             }
17418
17419           if (data != NULL && ent < end)
17420             {
17421               printf (_(" Local entries:\n"));
17422               printf ("  %*s %10s %*s\n",
17423                       addr_size * 2, _("Address"), _("Access"),
17424                       addr_size * 2, _("Value"));
17425               while (ent < end)
17426                 {
17427                   ent = print_mips_got_entry (data, pltgot, ent, data_end);
17428                   printf ("\n");
17429                   if (ent == (bfd_vma) -1)
17430                     goto sgot_print_fail;
17431                 }
17432               printf ("\n");
17433             }
17434
17435         sgot_print_fail:
17436           free (data);
17437         }
17438       return res;
17439     }
17440
17441   for (entry = filedata->dynamic_section;
17442        /* PR 17531 file: 012-50589-0.004.  */
17443        (entry < filedata->dynamic_section + filedata->dynamic_nent
17444         && entry->d_tag != DT_NULL);
17445        ++entry)
17446     switch (entry->d_tag)
17447       {
17448       case DT_MIPS_LIBLIST:
17449         liblist_offset
17450           = offset_from_vma (filedata, entry->d_un.d_val,
17451                              liblistno * sizeof (Elf32_External_Lib));
17452         break;
17453       case DT_MIPS_LIBLISTNO:
17454         liblistno = entry->d_un.d_val;
17455         break;
17456       case DT_MIPS_OPTIONS:
17457         options_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
17458         break;
17459       case DT_MIPS_CONFLICT:
17460         conflicts_offset
17461           = offset_from_vma (filedata, entry->d_un.d_val,
17462                              conflictsno * sizeof (Elf32_External_Conflict));
17463         break;
17464       case DT_MIPS_CONFLICTNO:
17465         conflictsno = entry->d_un.d_val;
17466         break;
17467       case DT_PLTGOT:
17468         pltgot = entry->d_un.d_ptr;
17469         break;
17470       case DT_MIPS_LOCAL_GOTNO:
17471         local_gotno = entry->d_un.d_val;
17472         break;
17473       case DT_MIPS_GOTSYM:
17474         gotsym = entry->d_un.d_val;
17475         break;
17476       case DT_MIPS_SYMTABNO:
17477         symtabno = entry->d_un.d_val;
17478         break;
17479       case DT_MIPS_PLTGOT:
17480         mips_pltgot = entry->d_un.d_ptr;
17481         break;
17482       case DT_PLTREL:
17483         pltrel = entry->d_un.d_val;
17484         break;
17485       case DT_PLTRELSZ:
17486         pltrelsz = entry->d_un.d_val;
17487         break;
17488       case DT_JMPREL:
17489         jmprel = entry->d_un.d_ptr;
17490         break;
17491       default:
17492         break;
17493       }
17494
17495   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
17496     {
17497       Elf32_External_Lib * elib;
17498       size_t cnt;
17499
17500       elib = (Elf32_External_Lib *) get_data (NULL, filedata, liblist_offset,
17501                                               sizeof (Elf32_External_Lib),
17502                                               liblistno,
17503                                               _("liblist section data"));
17504       if (elib)
17505         {
17506           printf (ngettext ("\nSection '.liblist' contains %lu entry:\n",
17507                             "\nSection '.liblist' contains %lu entries:\n",
17508                             (unsigned long) liblistno),
17509                   (unsigned long) liblistno);
17510           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
17511                  stdout);
17512
17513           for (cnt = 0; cnt < liblistno; ++cnt)
17514             {
17515               Elf32_Lib liblist;
17516               time_t atime;
17517               char timebuf[128];
17518               struct tm * tmp;
17519
17520               liblist.l_name = BYTE_GET (elib[cnt].l_name);
17521               atime = BYTE_GET (elib[cnt].l_time_stamp);
17522               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
17523               liblist.l_version = BYTE_GET (elib[cnt].l_version);
17524               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
17525
17526               tmp = gmtime (&atime);
17527               snprintf (timebuf, sizeof (timebuf),
17528                         "%04u-%02u-%02uT%02u:%02u:%02u",
17529                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
17530                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
17531
17532               printf ("%3lu: ", (unsigned long) cnt);
17533               if (VALID_DYNAMIC_NAME (filedata, liblist.l_name))
17534                 print_symbol (20, GET_DYNAMIC_NAME (filedata, liblist.l_name));
17535               else
17536                 printf (_("<corrupt: %9ld>"), liblist.l_name);
17537               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
17538                       liblist.l_version);
17539
17540               if (liblist.l_flags == 0)
17541                 puts (_(" NONE"));
17542               else
17543                 {
17544                   static const struct
17545                   {
17546                     const char * name;
17547                     int bit;
17548                   }
17549                   l_flags_vals[] =
17550                   {
17551                     { " EXACT_MATCH", LL_EXACT_MATCH },
17552                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
17553                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
17554                     { " EXPORTS", LL_EXPORTS },
17555                     { " DELAY_LOAD", LL_DELAY_LOAD },
17556                     { " DELTA", LL_DELTA }
17557                   };
17558                   int flags = liblist.l_flags;
17559                   size_t fcnt;
17560
17561                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
17562                     if ((flags & l_flags_vals[fcnt].bit) != 0)
17563                       {
17564                         fputs (l_flags_vals[fcnt].name, stdout);
17565                         flags ^= l_flags_vals[fcnt].bit;
17566                       }
17567                   if (flags != 0)
17568                     printf (" %#x", (unsigned int) flags);
17569
17570                   puts ("");
17571                 }
17572             }
17573
17574           free (elib);
17575         }
17576       else
17577         res = FALSE;
17578     }
17579
17580   if (options_offset != 0)
17581     {
17582       Elf_External_Options * eopt;
17583       size_t offset;
17584       int cnt;
17585       sect = filedata->section_headers;
17586
17587       /* Find the section header so that we get the size.  */
17588       sect = find_section_by_type (filedata, SHT_MIPS_OPTIONS);
17589       /* PR 17533 file: 012-277276-0.004.  */
17590       if (sect == NULL)
17591         {
17592           error (_("No MIPS_OPTIONS header found\n"));
17593           return FALSE;
17594         }
17595       /* PR 24243  */
17596       if (sect->sh_size < sizeof (* eopt))
17597         {
17598           error (_("The MIPS options section is too small.\n"));
17599           return FALSE;
17600         }
17601
17602       eopt = (Elf_External_Options *) get_data (NULL, filedata, options_offset, 1,
17603                                                 sect->sh_size, _("options"));
17604       if (eopt)
17605         {
17606           Elf_Internal_Options option;
17607
17608           offset = cnt = 0;
17609           while (offset <= sect->sh_size - sizeof (* eopt))
17610             {
17611               Elf_External_Options * eoption;
17612               unsigned int optsize;
17613
17614               eoption = (Elf_External_Options *) ((char *) eopt + offset);
17615
17616               optsize = BYTE_GET (eoption->size);
17617
17618               /* PR 17531: file: ffa0fa3b.  */
17619               if (optsize < sizeof (* eopt)
17620                   || optsize > sect->sh_size - offset)
17621                 {
17622                   error (_("Invalid size (%u) for MIPS option\n"),
17623                          optsize);
17624                   free (eopt);
17625                   return FALSE;
17626                 }
17627               offset += optsize;
17628               ++cnt;
17629             }
17630
17631           printf (ngettext ("\nSection '%s' contains %d entry:\n",
17632                             "\nSection '%s' contains %d entries:\n",
17633                             cnt),
17634                   printable_section_name (filedata, sect), cnt);
17635
17636           offset = 0;
17637           while (cnt-- > 0)
17638             {
17639               size_t len;
17640               Elf_External_Options * eoption;
17641
17642               eoption = (Elf_External_Options *) ((char *) eopt + offset);
17643
17644               option.kind = BYTE_GET (eoption->kind);
17645               option.size = BYTE_GET (eoption->size);
17646               option.section = BYTE_GET (eoption->section);
17647               option.info = BYTE_GET (eoption->info);
17648
17649               switch (option.kind)
17650                 {
17651                 case ODK_NULL:
17652                   /* This shouldn't happen.  */
17653                   printf (" NULL       %" PRId16 " %" PRIx32,
17654                           option.section, option.info);
17655                   break;
17656
17657                 case ODK_REGINFO:
17658                   printf (" REGINFO    ");
17659                   if (filedata->file_header.e_machine == EM_MIPS)
17660                     {
17661                       Elf32_External_RegInfo * ereg;
17662                       Elf32_RegInfo reginfo;
17663
17664                       /* 32bit form.  */
17665                       if (option.size < (sizeof (Elf_External_Options)
17666                                          + sizeof (Elf32_External_RegInfo)))
17667                         {
17668                           printf (_("<corrupt>\n"));
17669                           error (_("Truncated MIPS REGINFO option\n"));
17670                           cnt = 0;
17671                           break;
17672                         }
17673
17674                       ereg = (Elf32_External_RegInfo *) (eoption + 1);
17675
17676                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
17677                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
17678                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
17679                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
17680                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
17681                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
17682
17683                       printf ("GPR %08" PRIx32 "  GP 0x%" PRIx32 "\n",
17684                               reginfo.ri_gprmask, reginfo.ri_gp_value);
17685                       printf ("          "
17686                               "  CPR0 %08" PRIx32 "  CPR1 %08" PRIx32
17687                               "  CPR2 %08" PRIx32 "  CPR3 %08" PRIx32 "\n",
17688                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
17689                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
17690                     }
17691                   else
17692                     {
17693                       /* 64 bit form.  */
17694                       Elf64_External_RegInfo * ereg;
17695                       Elf64_Internal_RegInfo reginfo;
17696
17697                       if (option.size < (sizeof (Elf_External_Options)
17698                                          + sizeof (Elf64_External_RegInfo)))
17699                         {
17700                           printf (_("<corrupt>\n"));
17701                           error (_("Truncated MIPS REGINFO option\n"));
17702                           cnt = 0;
17703                           break;
17704                         }
17705
17706                       ereg = (Elf64_External_RegInfo *) (eoption + 1);
17707                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
17708                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
17709                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
17710                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
17711                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
17712                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
17713
17714                       printf ("GPR %08" PRIx32 "  GP 0x%" PRIx64 "\n",
17715                               reginfo.ri_gprmask, reginfo.ri_gp_value);
17716                       printf ("          "
17717                               "  CPR0 %08" PRIx32 "  CPR1 %08" PRIx32
17718                               "  CPR2 %08" PRIx32 "  CPR3 %08" PRIx32 "\n",
17719                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
17720                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
17721                     }
17722                   offset += option.size;
17723                   continue;
17724
17725                 case ODK_EXCEPTIONS:
17726                   fputs (" EXCEPTIONS fpe_min(", stdout);
17727                   process_mips_fpe_exception (option.info & OEX_FPU_MIN);
17728                   fputs (") fpe_max(", stdout);
17729                   process_mips_fpe_exception ((option.info & OEX_FPU_MAX) >> 8);
17730                   fputs (")", stdout);
17731
17732                   if (option.info & OEX_PAGE0)
17733                     fputs (" PAGE0", stdout);
17734                   if (option.info & OEX_SMM)
17735                     fputs (" SMM", stdout);
17736                   if (option.info & OEX_FPDBUG)
17737                     fputs (" FPDBUG", stdout);
17738                   if (option.info & OEX_DISMISS)
17739                     fputs (" DISMISS", stdout);
17740                   break;
17741
17742                 case ODK_PAD:
17743                   fputs (" PAD       ", stdout);
17744                   if (option.info & OPAD_PREFIX)
17745                     fputs (" PREFIX", stdout);
17746                   if (option.info & OPAD_POSTFIX)
17747                     fputs (" POSTFIX", stdout);
17748                   if (option.info & OPAD_SYMBOL)
17749                     fputs (" SYMBOL", stdout);
17750                   break;
17751
17752                 case ODK_HWPATCH:
17753                   fputs (" HWPATCH   ", stdout);
17754                   if (option.info & OHW_R4KEOP)
17755                     fputs (" R4KEOP", stdout);
17756                   if (option.info & OHW_R8KPFETCH)
17757                     fputs (" R8KPFETCH", stdout);
17758                   if (option.info & OHW_R5KEOP)
17759                     fputs (" R5KEOP", stdout);
17760                   if (option.info & OHW_R5KCVTL)
17761                     fputs (" R5KCVTL", stdout);
17762                   break;
17763
17764                 case ODK_FILL:
17765                   fputs (" FILL       ", stdout);
17766                   /* XXX Print content of info word?  */
17767                   break;
17768
17769                 case ODK_TAGS:
17770                   fputs (" TAGS       ", stdout);
17771                   /* XXX Print content of info word?  */
17772                   break;
17773
17774                 case ODK_HWAND:
17775                   fputs (" HWAND     ", stdout);
17776                   if (option.info & OHWA0_R4KEOP_CHECKED)
17777                     fputs (" R4KEOP_CHECKED", stdout);
17778                   if (option.info & OHWA0_R4KEOP_CLEAN)
17779                     fputs (" R4KEOP_CLEAN", stdout);
17780                   break;
17781
17782                 case ODK_HWOR:
17783                   fputs (" HWOR      ", stdout);
17784                   if (option.info & OHWA0_R4KEOP_CHECKED)
17785                     fputs (" R4KEOP_CHECKED", stdout);
17786                   if (option.info & OHWA0_R4KEOP_CLEAN)
17787                     fputs (" R4KEOP_CLEAN", stdout);
17788                   break;
17789
17790                 case ODK_GP_GROUP:
17791                   printf (" GP_GROUP  %#06x  self-contained %#06x",
17792                           option.info & OGP_GROUP,
17793                           (option.info & OGP_SELF) >> 16);
17794                   break;
17795
17796                 case ODK_IDENT:
17797                   printf (" IDENT     %#06x  self-contained %#06x",
17798                           option.info & OGP_GROUP,
17799                           (option.info & OGP_SELF) >> 16);
17800                   break;
17801
17802                 default:
17803                   /* This shouldn't happen.  */
17804                   printf (" %3d ???     %" PRId16 " %" PRIx32,
17805                           option.kind, option.section, option.info);
17806                   break;
17807                 }
17808
17809               len = sizeof (* eopt);
17810               while (len < option.size)
17811                 {
17812                   unsigned char datum = *((unsigned char *) eoption + len);
17813
17814                   if (ISPRINT (datum))
17815                     printf ("%c", datum);
17816                   else
17817                     printf ("\\%03o", datum);
17818                   len ++;
17819                 }
17820               fputs ("\n", stdout);
17821
17822               offset += option.size;
17823             }
17824           free (eopt);
17825         }
17826       else
17827         res = FALSE;
17828     }
17829
17830   if (conflicts_offset != 0 && conflictsno != 0)
17831     {
17832       Elf32_Conflict * iconf;
17833       size_t cnt;
17834
17835       if (filedata->dynamic_symbols == NULL)
17836         {
17837           error (_("conflict list found without a dynamic symbol table\n"));
17838           return FALSE;
17839         }
17840
17841       /* PR 21345 - print a slightly more helpful error message
17842          if we are sure that the cmalloc will fail.  */
17843       if (conflictsno > filedata->file_size / sizeof (* iconf))
17844         {
17845           error (_("Overlarge number of conflicts detected: %lx\n"),
17846                  (long) conflictsno);
17847           return FALSE;
17848         }
17849
17850       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
17851       if (iconf == NULL)
17852         {
17853           error (_("Out of memory allocating space for dynamic conflicts\n"));
17854           return FALSE;
17855         }
17856
17857       if (is_32bit_elf)
17858         {
17859           Elf32_External_Conflict * econf32;
17860
17861           econf32 = (Elf32_External_Conflict *)
17862             get_data (NULL, filedata, conflicts_offset,
17863                       sizeof (*econf32), conflictsno, _("conflict"));
17864           if (!econf32)
17865             {
17866               free (iconf);
17867               return FALSE;
17868             }
17869
17870           for (cnt = 0; cnt < conflictsno; ++cnt)
17871             iconf[cnt] = BYTE_GET (econf32[cnt]);
17872
17873           free (econf32);
17874         }
17875       else
17876         {
17877           Elf64_External_Conflict * econf64;
17878
17879           econf64 = (Elf64_External_Conflict *)
17880             get_data (NULL, filedata, conflicts_offset,
17881                       sizeof (*econf64), conflictsno, _("conflict"));
17882           if (!econf64)
17883             {
17884               free (iconf);
17885               return FALSE;
17886             }
17887
17888           for (cnt = 0; cnt < conflictsno; ++cnt)
17889             iconf[cnt] = BYTE_GET (econf64[cnt]);
17890
17891           free (econf64);
17892         }
17893
17894       printf (ngettext ("\nSection '.conflict' contains %lu entry:\n",
17895                         "\nSection '.conflict' contains %lu entries:\n",
17896                         (unsigned long) conflictsno),
17897               (unsigned long) conflictsno);
17898       puts (_("  Num:    Index       Value  Name"));
17899
17900       for (cnt = 0; cnt < conflictsno; ++cnt)
17901         {
17902           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
17903
17904           if (iconf[cnt] >= filedata->num_dynamic_syms)
17905             printf (_("<corrupt symbol index>"));
17906           else
17907             {
17908               Elf_Internal_Sym * psym;
17909
17910               psym = & filedata->dynamic_symbols[iconf[cnt]];
17911               print_vma (psym->st_value, FULL_HEX);
17912               putchar (' ');
17913               if (VALID_DYNAMIC_NAME (filedata, psym->st_name))
17914                 print_symbol (25, GET_DYNAMIC_NAME (filedata, psym->st_name));
17915               else
17916                 printf (_("<corrupt: %14ld>"), psym->st_name);
17917             }
17918           putchar ('\n');
17919         }
17920
17921       free (iconf);
17922     }
17923
17924   if (pltgot != 0 && local_gotno != 0)
17925     {
17926       bfd_vma ent, local_end, global_end;
17927       size_t i, offset;
17928       unsigned char * data;
17929       unsigned char * data_end;
17930       int addr_size;
17931
17932       ent = pltgot;
17933       addr_size = (is_32bit_elf ? 4 : 8);
17934       local_end = pltgot + local_gotno * addr_size;
17935
17936       /* PR binutils/17533 file: 012-111227-0.004  */
17937       if (symtabno < gotsym)
17938         {
17939           error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
17940                  (unsigned long) gotsym, (unsigned long) symtabno);
17941           return FALSE;
17942         }
17943
17944       global_end = local_end + (symtabno - gotsym) * addr_size;
17945       /* PR 17531: file: 54c91a34.  */
17946       if (global_end < local_end)
17947         {
17948           error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
17949           return FALSE;
17950         }
17951
17952       offset = offset_from_vma (filedata, pltgot, global_end - pltgot);
17953       data = (unsigned char *) get_data (NULL, filedata, offset,
17954                                          global_end - pltgot, 1,
17955                                          _("Global Offset Table data"));
17956       /* PR 12855: Null data is handled gracefully throughout.  */
17957       data_end = data + (global_end - pltgot);
17958
17959       printf (_("\nPrimary GOT:\n"));
17960       printf (_(" Canonical gp value: "));
17961       print_vma (pltgot + 0x7ff0, LONG_HEX);
17962       printf ("\n\n");
17963
17964       printf (_(" Reserved entries:\n"));
17965       printf (_("  %*s %10s %*s Purpose\n"),
17966               addr_size * 2, _("Address"), _("Access"),
17967               addr_size * 2, _("Initial"));
17968       ent = print_mips_got_entry (data, pltgot, ent, data_end);
17969       printf (_(" Lazy resolver\n"));
17970       if (ent == (bfd_vma) -1)
17971         goto got_print_fail;
17972
17973       /* Check for the MSB of GOT[1] being set, denoting a GNU object.
17974          This entry will be used by some runtime loaders, to store the
17975          module pointer.  Otherwise this is an ordinary local entry.
17976          PR 21344: Check for the entry being fully available before
17977          fetching it.  */
17978       if (data
17979           && data + ent - pltgot + addr_size <= data_end
17980           && (byte_get (data + ent - pltgot, addr_size)
17981               >> (addr_size * 8 - 1)) != 0)
17982         {
17983           ent = print_mips_got_entry (data, pltgot, ent, data_end);
17984           printf (_(" Module pointer (GNU extension)\n"));
17985           if (ent == (bfd_vma) -1)
17986             goto got_print_fail;
17987         }
17988       printf ("\n");
17989
17990       if (data != NULL && ent < local_end)
17991         {
17992           printf (_(" Local entries:\n"));
17993           printf ("  %*s %10s %*s\n",
17994                   addr_size * 2, _("Address"), _("Access"),
17995                   addr_size * 2, _("Initial"));
17996           while (ent < local_end)
17997             {
17998               ent = print_mips_got_entry (data, pltgot, ent, data_end);
17999               printf ("\n");
18000               if (ent == (bfd_vma) -1)
18001                 goto got_print_fail;
18002             }
18003           printf ("\n");
18004         }
18005
18006       if (data != NULL && gotsym < symtabno)
18007         {
18008           int sym_width;
18009
18010           printf (_(" Global entries:\n"));
18011           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
18012                   addr_size * 2, _("Address"),
18013                   _("Access"),
18014                   addr_size * 2, _("Initial"),
18015                   addr_size * 2, _("Sym.Val."),
18016                   _("Type"),
18017                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
18018                   _("Ndx"), _("Name"));
18019
18020           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
18021
18022           for (i = gotsym; i < symtabno; i++)
18023             {
18024               ent = print_mips_got_entry (data, pltgot, ent, data_end);
18025               printf (" ");
18026
18027               if (filedata->dynamic_symbols == NULL)
18028                 printf (_("<no dynamic symbols>"));
18029               else if (i < filedata->num_dynamic_syms)
18030                 {
18031                   Elf_Internal_Sym * psym = filedata->dynamic_symbols + i;
18032
18033                   print_vma (psym->st_value, LONG_HEX);
18034                   printf (" %-7s %3s ",
18035                           get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
18036                           get_symbol_index_type (filedata, psym->st_shndx));
18037
18038                   if (VALID_DYNAMIC_NAME (filedata, psym->st_name))
18039                     print_symbol (sym_width,
18040                                   GET_DYNAMIC_NAME (filedata, psym->st_name));
18041                   else
18042                     printf (_("<corrupt: %14ld>"), psym->st_name);
18043                 }
18044               else
18045                 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
18046                         (unsigned long) i);
18047
18048               printf ("\n");
18049               if (ent == (bfd_vma) -1)
18050                 break;
18051             }
18052           printf ("\n");
18053         }
18054
18055     got_print_fail:
18056       free (data);
18057     }
18058
18059   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
18060     {
18061       bfd_vma ent, end;
18062       size_t offset, rel_offset;
18063       unsigned long count, i;
18064       unsigned char * data;
18065       int addr_size, sym_width;
18066       Elf_Internal_Rela * rels;
18067
18068       rel_offset = offset_from_vma (filedata, jmprel, pltrelsz);
18069       if (pltrel == DT_RELA)
18070         {
18071           if (!slurp_rela_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
18072             return FALSE;
18073         }
18074       else
18075         {
18076           if (!slurp_rel_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
18077             return FALSE;
18078         }
18079
18080       ent = mips_pltgot;
18081       addr_size = (is_32bit_elf ? 4 : 8);
18082       end = mips_pltgot + (2 + count) * addr_size;
18083
18084       offset = offset_from_vma (filedata, mips_pltgot, end - mips_pltgot);
18085       data = (unsigned char *) get_data (NULL, filedata, offset, end - mips_pltgot,
18086                                          1, _("Procedure Linkage Table data"));
18087       if (data == NULL)
18088         {
18089           free (rels);
18090           return FALSE;
18091         }
18092
18093       printf ("\nPLT GOT:\n\n");
18094       printf (_(" Reserved entries:\n"));
18095       printf (_("  %*s %*s Purpose\n"),
18096               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
18097       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
18098       printf (_(" PLT lazy resolver\n"));
18099       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
18100       printf (_(" Module pointer\n"));
18101       printf ("\n");
18102
18103       printf (_(" Entries:\n"));
18104       printf ("  %*s %*s %*s %-7s %3s %s\n",
18105               addr_size * 2, _("Address"),
18106               addr_size * 2, _("Initial"),
18107               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
18108       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
18109       for (i = 0; i < count; i++)
18110         {
18111           unsigned long idx = get_reloc_symindex (rels[i].r_info);
18112
18113           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
18114           printf (" ");
18115
18116           if (idx >= filedata->num_dynamic_syms)
18117             printf (_("<corrupt symbol index: %lu>"), idx);
18118           else
18119             {
18120               Elf_Internal_Sym * psym = filedata->dynamic_symbols + idx;
18121
18122               print_vma (psym->st_value, LONG_HEX);
18123               printf (" %-7s %3s ",
18124                       get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
18125                       get_symbol_index_type (filedata, psym->st_shndx));
18126               if (VALID_DYNAMIC_NAME (filedata, psym->st_name))
18127                 print_symbol (sym_width,
18128                               GET_DYNAMIC_NAME (filedata, psym->st_name));
18129               else
18130                 printf (_("<corrupt: %14ld>"), psym->st_name);
18131             }
18132           printf ("\n");
18133         }
18134       printf ("\n");
18135
18136       free (data);
18137       free (rels);
18138     }
18139
18140   return res;
18141 }
18142
18143 static bfd_boolean
18144 process_nds32_specific (Filedata * filedata)
18145 {
18146   Elf_Internal_Shdr *sect = NULL;
18147
18148   sect = find_section (filedata, ".nds32_e_flags");
18149   if (sect != NULL && sect->sh_size >= 4)
18150     {
18151       unsigned char *buf;
18152       unsigned int flag;
18153
18154       printf ("\nNDS32 elf flags section:\n");
18155       buf = get_data (NULL, filedata, sect->sh_offset, 1, 4,
18156                       _("NDS32 elf flags section"));
18157
18158       if (buf == NULL)
18159         return FALSE;
18160
18161       flag = byte_get (buf, 4);
18162       free (buf);
18163       switch (flag & 0x3)
18164         {
18165         case 0:
18166           printf ("(VEC_SIZE):\tNo entry.\n");
18167           break;
18168         case 1:
18169           printf ("(VEC_SIZE):\t4 bytes\n");
18170           break;
18171         case 2:
18172           printf ("(VEC_SIZE):\t16 bytes\n");
18173           break;
18174         case 3:
18175           printf ("(VEC_SIZE):\treserved\n");
18176           break;
18177         }
18178     }
18179
18180   return TRUE;
18181 }
18182
18183 static bfd_boolean
18184 process_gnu_liblist (Filedata * filedata)
18185 {
18186   Elf_Internal_Shdr * section;
18187   Elf_Internal_Shdr * string_sec;
18188   Elf32_External_Lib * elib;
18189   char * strtab;
18190   size_t strtab_size;
18191   size_t cnt;
18192   unsigned long num_liblist;
18193   unsigned i;
18194   bfd_boolean res = TRUE;
18195
18196   if (! do_arch)
18197     return TRUE;
18198
18199   for (i = 0, section = filedata->section_headers;
18200        i < filedata->file_header.e_shnum;
18201        i++, section++)
18202     {
18203       switch (section->sh_type)
18204         {
18205         case SHT_GNU_LIBLIST:
18206           if (section->sh_link >= filedata->file_header.e_shnum)
18207             break;
18208
18209           elib = (Elf32_External_Lib *)
18210               get_data (NULL, filedata, section->sh_offset, 1, section->sh_size,
18211                         _("liblist section data"));
18212
18213           if (elib == NULL)
18214             {
18215               res = FALSE;
18216               break;
18217             }
18218
18219           string_sec = filedata->section_headers + section->sh_link;
18220           strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
18221                                       string_sec->sh_size,
18222                                       _("liblist string table"));
18223           if (strtab == NULL
18224               || section->sh_entsize != sizeof (Elf32_External_Lib))
18225             {
18226               free (elib);
18227               free (strtab);
18228               res = FALSE;
18229               break;
18230             }
18231           strtab_size = string_sec->sh_size;
18232
18233           num_liblist = section->sh_size / sizeof (Elf32_External_Lib);
18234           printf (ngettext ("\nLibrary list section '%s' contains %lu entries:\n",
18235                             "\nLibrary list section '%s' contains %lu entries:\n",
18236                             num_liblist),
18237                   printable_section_name (filedata, section),
18238                   num_liblist);
18239
18240           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
18241
18242           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
18243                ++cnt)
18244             {
18245               Elf32_Lib liblist;
18246               time_t atime;
18247               char timebuf[128];
18248               struct tm * tmp;
18249
18250               liblist.l_name = BYTE_GET (elib[cnt].l_name);
18251               atime = BYTE_GET (elib[cnt].l_time_stamp);
18252               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
18253               liblist.l_version = BYTE_GET (elib[cnt].l_version);
18254               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
18255
18256               tmp = gmtime (&atime);
18257               snprintf (timebuf, sizeof (timebuf),
18258                         "%04u-%02u-%02uT%02u:%02u:%02u",
18259                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
18260                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
18261
18262               printf ("%3lu: ", (unsigned long) cnt);
18263               if (do_wide)
18264                 printf ("%-20s", liblist.l_name < strtab_size
18265                         ? strtab + liblist.l_name : _("<corrupt>"));
18266               else
18267                 printf ("%-20.20s", liblist.l_name < strtab_size
18268                         ? strtab + liblist.l_name : _("<corrupt>"));
18269               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
18270                       liblist.l_version, liblist.l_flags);
18271             }
18272
18273           free (elib);
18274           free (strtab);
18275         }
18276     }
18277
18278   return res;
18279 }
18280
18281 static const char *
18282 get_note_type (Filedata * filedata, unsigned e_type)
18283 {
18284   static char buff[64];
18285
18286   if (filedata->file_header.e_type == ET_CORE)
18287     switch (e_type)
18288       {
18289       case NT_AUXV:
18290         return _("NT_AUXV (auxiliary vector)");
18291       case NT_PRSTATUS:
18292         return _("NT_PRSTATUS (prstatus structure)");
18293       case NT_FPREGSET:
18294         return _("NT_FPREGSET (floating point registers)");
18295       case NT_PRPSINFO:
18296         return _("NT_PRPSINFO (prpsinfo structure)");
18297       case NT_TASKSTRUCT:
18298         return _("NT_TASKSTRUCT (task structure)");
18299       case NT_PRXFPREG:
18300         return _("NT_PRXFPREG (user_xfpregs structure)");
18301       case NT_PPC_VMX:
18302         return _("NT_PPC_VMX (ppc Altivec registers)");
18303       case NT_PPC_VSX:
18304         return _("NT_PPC_VSX (ppc VSX registers)");
18305       case NT_PPC_TAR:
18306         return _("NT_PPC_TAR (ppc TAR register)");
18307       case NT_PPC_PPR:
18308         return _("NT_PPC_PPR (ppc PPR register)");
18309       case NT_PPC_DSCR:
18310         return _("NT_PPC_DSCR (ppc DSCR register)");
18311       case NT_PPC_EBB:
18312         return _("NT_PPC_EBB (ppc EBB registers)");
18313       case NT_PPC_PMU:
18314         return _("NT_PPC_PMU (ppc PMU registers)");
18315       case NT_PPC_TM_CGPR:
18316         return _("NT_PPC_TM_CGPR (ppc checkpointed GPR registers)");
18317       case NT_PPC_TM_CFPR:
18318         return _("NT_PPC_TM_CFPR (ppc checkpointed floating point registers)");
18319       case NT_PPC_TM_CVMX:
18320         return _("NT_PPC_TM_CVMX (ppc checkpointed Altivec registers)");
18321       case NT_PPC_TM_CVSX:
18322         return _("NT_PPC_TM_CVSX (ppc checkpointed VSX registers)");
18323       case NT_PPC_TM_SPR:
18324         return _("NT_PPC_TM_SPR (ppc TM special purpose registers)");
18325       case NT_PPC_TM_CTAR:
18326         return _("NT_PPC_TM_CTAR (ppc checkpointed TAR register)");
18327       case NT_PPC_TM_CPPR:
18328         return _("NT_PPC_TM_CPPR (ppc checkpointed PPR register)");
18329       case NT_PPC_TM_CDSCR:
18330         return _("NT_PPC_TM_CDSCR (ppc checkpointed DSCR register)");
18331       case NT_386_TLS:
18332         return _("NT_386_TLS (x86 TLS information)");
18333       case NT_386_IOPERM:
18334         return _("NT_386_IOPERM (x86 I/O permissions)");
18335       case NT_X86_XSTATE:
18336         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
18337       case NT_X86_CET:
18338         return _("NT_X86_CET (x86 CET state)");
18339       case NT_S390_HIGH_GPRS:
18340         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
18341       case NT_S390_TIMER:
18342         return _("NT_S390_TIMER (s390 timer register)");
18343       case NT_S390_TODCMP:
18344         return _("NT_S390_TODCMP (s390 TOD comparator register)");
18345       case NT_S390_TODPREG:
18346         return _("NT_S390_TODPREG (s390 TOD programmable register)");
18347       case NT_S390_CTRS:
18348         return _("NT_S390_CTRS (s390 control registers)");
18349       case NT_S390_PREFIX:
18350         return _("NT_S390_PREFIX (s390 prefix register)");
18351       case NT_S390_LAST_BREAK:
18352         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
18353       case NT_S390_SYSTEM_CALL:
18354         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
18355       case NT_S390_TDB:
18356         return _("NT_S390_TDB (s390 transaction diagnostic block)");
18357       case NT_S390_VXRS_LOW:
18358         return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
18359       case NT_S390_VXRS_HIGH:
18360         return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
18361       case NT_S390_GS_CB:
18362         return _("NT_S390_GS_CB (s390 guarded-storage registers)");
18363       case NT_S390_GS_BC:
18364         return _("NT_S390_GS_BC (s390 guarded-storage broadcast control)");
18365       case NT_ARM_VFP:
18366         return _("NT_ARM_VFP (arm VFP registers)");
18367       case NT_ARM_TLS:
18368         return _("NT_ARM_TLS (AArch TLS registers)");
18369       case NT_ARM_HW_BREAK:
18370         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
18371       case NT_ARM_HW_WATCH:
18372         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
18373       case NT_ARC_V2:
18374         return _("NT_ARC_V2 (ARC HS accumulator/extra registers)");
18375       case NT_PSTATUS:
18376         return _("NT_PSTATUS (pstatus structure)");
18377       case NT_FPREGS:
18378         return _("NT_FPREGS (floating point registers)");
18379       case NT_PSINFO:
18380         return _("NT_PSINFO (psinfo structure)");
18381       case NT_LWPSTATUS:
18382         return _("NT_LWPSTATUS (lwpstatus_t structure)");
18383       case NT_LWPSINFO:
18384         return _("NT_LWPSINFO (lwpsinfo_t structure)");
18385       case NT_WIN32PSTATUS:
18386         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
18387       case NT_SIGINFO:
18388         return _("NT_SIGINFO (siginfo_t data)");
18389       case NT_FILE:
18390         return _("NT_FILE (mapped files)");
18391       default:
18392         break;
18393       }
18394   else
18395     switch (e_type)
18396       {
18397       case NT_VERSION:
18398         return _("NT_VERSION (version)");
18399       case NT_ARCH:
18400         return _("NT_ARCH (architecture)");
18401       case NT_GNU_BUILD_ATTRIBUTE_OPEN:
18402         return _("OPEN");
18403       case NT_GNU_BUILD_ATTRIBUTE_FUNC:
18404         return _("func");
18405       default:
18406         break;
18407       }
18408
18409   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
18410   return buff;
18411 }
18412
18413 static bfd_boolean
18414 print_core_note (Elf_Internal_Note *pnote)
18415 {
18416   unsigned int addr_size = is_32bit_elf ? 4 : 8;
18417   bfd_vma count, page_size;
18418   unsigned char *descdata, *filenames, *descend;
18419
18420   if (pnote->type != NT_FILE)
18421     {
18422       if (do_wide)
18423         printf ("\n");
18424       return TRUE;
18425     }
18426
18427 #ifndef BFD64
18428   if (!is_32bit_elf)
18429     {
18430       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
18431       /* Still "successful".  */
18432       return TRUE;
18433     }
18434 #endif
18435
18436   if (pnote->descsz < 2 * addr_size)
18437     {
18438       error (_("    Malformed note - too short for header\n"));
18439       return FALSE;
18440     }
18441
18442   descdata = (unsigned char *) pnote->descdata;
18443   descend = descdata + pnote->descsz;
18444
18445   if (descdata[pnote->descsz - 1] != '\0')
18446     {
18447       error (_("    Malformed note - does not end with \\0\n"));
18448       return FALSE;
18449     }
18450
18451   count = byte_get (descdata, addr_size);
18452   descdata += addr_size;
18453
18454   page_size = byte_get (descdata, addr_size);
18455   descdata += addr_size;
18456
18457   if (count > ((bfd_vma) -1 - 2 * addr_size) / (3 * addr_size)
18458       || pnote->descsz < 2 * addr_size + count * 3 * addr_size)
18459     {
18460       error (_("    Malformed note - too short for supplied file count\n"));
18461       return FALSE;
18462     }
18463
18464   printf (_("    Page size: "));
18465   print_vma (page_size, DEC);
18466   printf ("\n");
18467
18468   printf (_("    %*s%*s%*s\n"),
18469           (int) (2 + 2 * addr_size), _("Start"),
18470           (int) (4 + 2 * addr_size), _("End"),
18471           (int) (4 + 2 * addr_size), _("Page Offset"));
18472   filenames = descdata + count * 3 * addr_size;
18473   while (count-- > 0)
18474     {
18475       bfd_vma start, end, file_ofs;
18476
18477       if (filenames == descend)
18478         {
18479           error (_("    Malformed note - filenames end too early\n"));
18480           return FALSE;
18481         }
18482
18483       start = byte_get (descdata, addr_size);
18484       descdata += addr_size;
18485       end = byte_get (descdata, addr_size);
18486       descdata += addr_size;
18487       file_ofs = byte_get (descdata, addr_size);
18488       descdata += addr_size;
18489
18490       printf ("    ");
18491       print_vma (start, FULL_HEX);
18492       printf ("  ");
18493       print_vma (end, FULL_HEX);
18494       printf ("  ");
18495       print_vma (file_ofs, FULL_HEX);
18496       printf ("\n        %s\n", filenames);
18497
18498       filenames += 1 + strlen ((char *) filenames);
18499     }
18500
18501   return TRUE;
18502 }
18503
18504 static const char *
18505 get_gnu_elf_note_type (unsigned e_type)
18506 {
18507   /* NB/ Keep this switch statement in sync with print_gnu_note ().  */
18508   switch (e_type)
18509     {
18510     case NT_GNU_ABI_TAG:
18511       return _("NT_GNU_ABI_TAG (ABI version tag)");
18512     case NT_GNU_HWCAP:
18513       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
18514     case NT_GNU_BUILD_ID:
18515       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
18516     case NT_GNU_GOLD_VERSION:
18517       return _("NT_GNU_GOLD_VERSION (gold version)");
18518     case NT_GNU_PROPERTY_TYPE_0:
18519       return _("NT_GNU_PROPERTY_TYPE_0");
18520     case NT_GNU_BUILD_ATTRIBUTE_OPEN:
18521       return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
18522     case NT_GNU_BUILD_ATTRIBUTE_FUNC:
18523       return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
18524     default:
18525       {
18526         static char buff[64];
18527
18528         snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
18529         return buff;
18530       }
18531     }
18532 }
18533
18534 static void
18535 decode_x86_compat_isa (unsigned int bitmask)
18536 {
18537   while (bitmask)
18538     {
18539       unsigned int bit = bitmask & (- bitmask);
18540
18541       bitmask &= ~ bit;
18542       switch (bit)
18543         {
18544         case GNU_PROPERTY_X86_COMPAT_ISA_1_486:
18545           printf ("i486");
18546           break;
18547         case GNU_PROPERTY_X86_COMPAT_ISA_1_586:
18548           printf ("586");
18549           break;
18550         case GNU_PROPERTY_X86_COMPAT_ISA_1_686:
18551           printf ("686");
18552           break;
18553         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE:
18554           printf ("SSE");
18555           break;
18556         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE2:
18557           printf ("SSE2");
18558           break;
18559         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE3:
18560           printf ("SSE3");
18561           break;
18562         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSSE3:
18563           printf ("SSSE3");
18564           break;
18565         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_1:
18566           printf ("SSE4_1");
18567           break;
18568         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_2:
18569           printf ("SSE4_2");
18570           break;
18571         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX:
18572           printf ("AVX");
18573           break;
18574         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX2:
18575           printf ("AVX2");
18576           break;
18577         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512F:
18578           printf ("AVX512F");
18579           break;
18580         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512CD:
18581           printf ("AVX512CD");
18582           break;
18583         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512ER:
18584           printf ("AVX512ER");
18585           break;
18586         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512PF:
18587           printf ("AVX512PF");
18588           break;
18589         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512VL:
18590           printf ("AVX512VL");
18591           break;
18592         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512DQ:
18593           printf ("AVX512DQ");
18594           break;
18595         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512BW:
18596           printf ("AVX512BW");
18597           break;
18598         default:
18599           printf (_("<unknown: %x>"), bit);
18600           break;
18601         }
18602       if (bitmask)
18603         printf (", ");
18604     }
18605 }
18606
18607 static void
18608 decode_x86_compat_2_isa (unsigned int bitmask)
18609 {
18610   if (!bitmask)
18611     {
18612       printf (_("<None>"));
18613       return;
18614     }
18615
18616   while (bitmask)
18617     {
18618       unsigned int bit = bitmask & (- bitmask);
18619
18620       bitmask &= ~ bit;
18621       switch (bit)
18622         {
18623         case GNU_PROPERTY_X86_COMPAT_2_ISA_1_CMOV:
18624           printf ("CMOV");
18625           break;
18626         case GNU_PROPERTY_X86_COMPAT_2_ISA_1_SSE:
18627           printf ("SSE");
18628           break;
18629         case GNU_PROPERTY_X86_COMPAT_2_ISA_1_SSE2:
18630           printf ("SSE2");
18631           break;
18632         case GNU_PROPERTY_X86_COMPAT_2_ISA_1_SSE3:
18633           printf ("SSE3");
18634           break;
18635         case GNU_PROPERTY_X86_COMPAT_2_ISA_1_SSSE3:
18636           printf ("SSSE3");
18637           break;
18638         case GNU_PROPERTY_X86_COMPAT_2_ISA_1_SSE4_1:
18639           printf ("SSE4_1");
18640           break;
18641         case GNU_PROPERTY_X86_COMPAT_2_ISA_1_SSE4_2:
18642           printf ("SSE4_2");
18643           break;
18644         case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX:
18645           printf ("AVX");
18646           break;
18647         case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX2:
18648           printf ("AVX2");
18649           break;
18650         case GNU_PROPERTY_X86_COMPAT_2_ISA_1_FMA:
18651           printf ("FMA");
18652           break;
18653         case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512F:
18654           printf ("AVX512F");
18655           break;
18656         case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512CD:
18657           printf ("AVX512CD");
18658           break;
18659         case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512ER:
18660           printf ("AVX512ER");
18661           break;
18662         case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512PF:
18663           printf ("AVX512PF");
18664           break;
18665         case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512VL:
18666           printf ("AVX512VL");
18667           break;
18668         case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512DQ:
18669           printf ("AVX512DQ");
18670           break;
18671         case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512BW:
18672           printf ("AVX512BW");
18673           break;
18674         case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_4FMAPS:
18675           printf ("AVX512_4FMAPS");
18676           break;
18677         case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_4VNNIW:
18678           printf ("AVX512_4VNNIW");
18679           break;
18680         case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_BITALG:
18681           printf ("AVX512_BITALG");
18682           break;
18683         case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_IFMA:
18684           printf ("AVX512_IFMA");
18685           break;
18686         case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_VBMI:
18687           printf ("AVX512_VBMI");
18688           break;
18689         case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_VBMI2:
18690           printf ("AVX512_VBMI2");
18691           break;
18692         case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_VNNI:
18693           printf ("AVX512_VNNI");
18694           break;
18695         case GNU_PROPERTY_X86_COMPAT_2_ISA_1_AVX512_BF16:
18696           printf ("AVX512_BF16");
18697           break;
18698         default:
18699           printf (_("<unknown: %x>"), bit);
18700           break;
18701         }
18702       if (bitmask)
18703         printf (", ");
18704     }
18705 }
18706
18707 static void
18708 decode_x86_isa (unsigned int bitmask)
18709 {
18710   while (bitmask)
18711     {
18712       unsigned int bit = bitmask & (- bitmask);
18713
18714       bitmask &= ~ bit;
18715       switch (bit)
18716         {
18717         case GNU_PROPERTY_X86_ISA_1_BASELINE:
18718           printf ("x86-64-baseline");
18719           break;
18720         case GNU_PROPERTY_X86_ISA_1_V2:
18721           printf ("x86-64-v2");
18722           break;
18723         case GNU_PROPERTY_X86_ISA_1_V3:
18724           printf ("x86-64-v3");
18725           break;
18726         case GNU_PROPERTY_X86_ISA_1_V4:
18727           printf ("x86-64-v4");
18728           break;
18729         default:
18730           printf (_("<unknown: %x>"), bit);
18731           break;
18732         }
18733       if (bitmask)
18734         printf (", ");
18735     }
18736 }
18737
18738 static void
18739 decode_x86_feature_1 (unsigned int bitmask)
18740 {
18741   if (!bitmask)
18742     {
18743       printf (_("<None>"));
18744       return;
18745     }
18746
18747   while (bitmask)
18748     {
18749       unsigned int bit = bitmask & (- bitmask);
18750
18751       bitmask &= ~ bit;
18752       switch (bit)
18753         {
18754         case GNU_PROPERTY_X86_FEATURE_1_IBT:
18755           printf ("IBT");
18756           break;
18757         case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
18758           printf ("SHSTK");
18759           break;
18760         case GNU_PROPERTY_X86_FEATURE_1_LAM_U48:
18761           printf ("LAM_U48");
18762           break;
18763         case GNU_PROPERTY_X86_FEATURE_1_LAM_U57:
18764           printf ("LAM_U57");
18765           break;
18766         default:
18767           printf (_("<unknown: %x>"), bit);
18768           break;
18769         }
18770       if (bitmask)
18771         printf (", ");
18772     }
18773 }
18774
18775 static void
18776 decode_x86_feature_2 (unsigned int bitmask)
18777 {
18778   if (!bitmask)
18779     {
18780       printf (_("<None>"));
18781       return;
18782     }
18783
18784   while (bitmask)
18785     {
18786       unsigned int bit = bitmask & (- bitmask);
18787
18788       bitmask &= ~ bit;
18789       switch (bit)
18790         {
18791         case GNU_PROPERTY_X86_FEATURE_2_X86:
18792           printf ("x86");
18793           break;
18794         case GNU_PROPERTY_X86_FEATURE_2_X87:
18795           printf ("x87");
18796           break;
18797         case GNU_PROPERTY_X86_FEATURE_2_MMX:
18798           printf ("MMX");
18799           break;
18800         case GNU_PROPERTY_X86_FEATURE_2_XMM:
18801           printf ("XMM");
18802           break;
18803         case GNU_PROPERTY_X86_FEATURE_2_YMM:
18804           printf ("YMM");
18805           break;
18806         case GNU_PROPERTY_X86_FEATURE_2_ZMM:
18807           printf ("ZMM");
18808           break;
18809         case GNU_PROPERTY_X86_FEATURE_2_TMM:
18810           printf ("TMM");
18811           break;
18812         case GNU_PROPERTY_X86_FEATURE_2_MASK:
18813           printf ("MASK");
18814           break;
18815         case GNU_PROPERTY_X86_FEATURE_2_FXSR:
18816           printf ("FXSR");
18817           break;
18818         case GNU_PROPERTY_X86_FEATURE_2_XSAVE:
18819           printf ("XSAVE");
18820           break;
18821         case GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT:
18822           printf ("XSAVEOPT");
18823           break;
18824         case GNU_PROPERTY_X86_FEATURE_2_XSAVEC:
18825           printf ("XSAVEC");
18826           break;
18827         default:
18828           printf (_("<unknown: %x>"), bit);
18829           break;
18830         }
18831       if (bitmask)
18832         printf (", ");
18833     }
18834 }
18835
18836 static void
18837 decode_aarch64_feature_1_and (unsigned int bitmask)
18838 {
18839   while (bitmask)
18840     {
18841       unsigned int bit = bitmask & (- bitmask);
18842
18843       bitmask &= ~ bit;
18844       switch (bit)
18845         {
18846         case GNU_PROPERTY_AARCH64_FEATURE_1_BTI:
18847           printf ("BTI");
18848           break;
18849
18850         case GNU_PROPERTY_AARCH64_FEATURE_1_PAC:
18851           printf ("PAC");
18852           break;
18853
18854         default:
18855           printf (_("<unknown: %x>"), bit);
18856           break;
18857         }
18858       if (bitmask)
18859         printf (", ");
18860     }
18861 }
18862
18863 static void
18864 print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
18865 {
18866   unsigned char * ptr = (unsigned char *) pnote->descdata;
18867   unsigned char * ptr_end = ptr + pnote->descsz;
18868   unsigned int    size = is_32bit_elf ? 4 : 8;
18869
18870   printf (_("      Properties: "));
18871
18872   if (pnote->descsz < 8 || (pnote->descsz % size) != 0)
18873     {
18874       printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz);
18875       return;
18876     }
18877
18878   while (ptr < ptr_end)
18879     {
18880       unsigned int j;
18881       unsigned int type;
18882       unsigned int datasz;
18883
18884       if ((size_t) (ptr_end - ptr) < 8)
18885         {
18886           printf (_("<corrupt descsz: %#lx>\n"), pnote->descsz);
18887           break;
18888         }
18889
18890       type = byte_get (ptr, 4);
18891       datasz = byte_get (ptr + 4, 4);
18892
18893       ptr += 8;
18894
18895       if (datasz > (size_t) (ptr_end - ptr))
18896         {
18897           printf (_("<corrupt type (%#x) datasz: %#x>\n"),
18898                   type, datasz);
18899           break;
18900         }
18901
18902       if (type >= GNU_PROPERTY_LOPROC && type <= GNU_PROPERTY_HIPROC)
18903         {
18904           if (filedata->file_header.e_machine == EM_X86_64
18905               || filedata->file_header.e_machine == EM_IAMCU
18906               || filedata->file_header.e_machine == EM_386)
18907             {
18908               unsigned int bitmask;
18909
18910               if (datasz == 4)
18911                 bitmask = byte_get (ptr, 4);
18912               else
18913                 bitmask = 0;
18914
18915               switch (type)
18916                 {
18917                 case GNU_PROPERTY_X86_ISA_1_USED:
18918                   if (datasz != 4)
18919                     printf (_("x86 ISA used: <corrupt length: %#x> "),
18920                             datasz);
18921                   else
18922                     {
18923                       printf ("x86 ISA used: ");
18924                       decode_x86_isa (bitmask);
18925                     }
18926                   goto next;
18927
18928                 case GNU_PROPERTY_X86_ISA_1_NEEDED:
18929                   if (datasz != 4)
18930                     printf (_("x86 ISA needed: <corrupt length: %#x> "),
18931                             datasz);
18932                   else
18933                     {
18934                       printf ("x86 ISA needed: ");
18935                       decode_x86_isa (bitmask);
18936                     }
18937                   goto next;
18938
18939                 case GNU_PROPERTY_X86_FEATURE_1_AND:
18940                   if (datasz != 4)
18941                     printf (_("x86 feature: <corrupt length: %#x> "),
18942                             datasz);
18943                   else
18944                     {
18945                       printf ("x86 feature: ");
18946                       decode_x86_feature_1 (bitmask);
18947                     }
18948                   goto next;
18949
18950                 case GNU_PROPERTY_X86_FEATURE_2_USED:
18951                   if (datasz != 4)
18952                     printf (_("x86 feature used: <corrupt length: %#x> "),
18953                             datasz);
18954                   else
18955                     {
18956                       printf ("x86 feature used: ");
18957                       decode_x86_feature_2 (bitmask);
18958                     }
18959                   goto next;
18960
18961                 case GNU_PROPERTY_X86_FEATURE_2_NEEDED:
18962                   if (datasz != 4)
18963                     printf (_("x86 feature needed: <corrupt length: %#x> "), datasz);
18964                   else
18965                     {
18966                       printf ("x86 feature needed: ");
18967                       decode_x86_feature_2 (bitmask);
18968                     }
18969                   goto next;
18970
18971                 case GNU_PROPERTY_X86_COMPAT_ISA_1_USED:
18972                   if (datasz != 4)
18973                     printf (_("x86 ISA used: <corrupt length: %#x> "),
18974                             datasz);
18975                   else
18976                     {
18977                       printf ("x86 ISA used: ");
18978                       decode_x86_compat_isa (bitmask);
18979                     }
18980                   goto next;
18981
18982                 case GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED:
18983                   if (datasz != 4)
18984                     printf (_("x86 ISA needed: <corrupt length: %#x> "),
18985                             datasz);
18986                   else
18987                     {
18988                       printf ("x86 ISA needed: ");
18989                       decode_x86_compat_isa (bitmask);
18990                     }
18991                   goto next;
18992
18993                 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_USED:
18994                   if (datasz != 4)
18995                     printf (_("x86 ISA used: <corrupt length: %#x> "),
18996                             datasz);
18997                   else
18998                     {
18999                       printf ("x86 ISA used: ");
19000                       decode_x86_compat_2_isa (bitmask);
19001                     }
19002                   goto next;
19003
19004                 case GNU_PROPERTY_X86_COMPAT_2_ISA_1_NEEDED:
19005                   if (datasz != 4)
19006                     printf (_("x86 ISA needed: <corrupt length: %#x> "),
19007                             datasz);
19008                   else
19009                     {
19010                       printf ("x86 ISA needed: ");
19011                       decode_x86_compat_2_isa (bitmask);
19012                     }
19013                   goto next;
19014
19015                 default:
19016                   break;
19017                 }
19018             }
19019           else if (filedata->file_header.e_machine == EM_AARCH64)
19020             {
19021               if (type == GNU_PROPERTY_AARCH64_FEATURE_1_AND)
19022                 {
19023                   printf ("AArch64 feature: ");
19024                   if (datasz != 4)
19025                     printf (_("<corrupt length: %#x> "), datasz);
19026                   else
19027                     decode_aarch64_feature_1_and (byte_get (ptr, 4));
19028                   goto next;
19029                 }
19030             }
19031         }
19032       else
19033         {
19034           switch (type)
19035             {
19036             case GNU_PROPERTY_STACK_SIZE:
19037               printf (_("stack size: "));
19038               if (datasz != size)
19039                 printf (_("<corrupt length: %#x> "), datasz);
19040               else
19041                 printf ("%#lx", (unsigned long) byte_get (ptr, size));
19042               goto next;
19043
19044             case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
19045               printf ("no copy on protected ");
19046               if (datasz)
19047                 printf (_("<corrupt length: %#x> "), datasz);
19048               goto next;
19049
19050             default:
19051               break;
19052             }
19053         }
19054
19055       if (type < GNU_PROPERTY_LOPROC)
19056         printf (_("<unknown type %#x data: "), type);
19057       else if (type < GNU_PROPERTY_LOUSER)
19058         printf (_("<procesor-specific type %#x data: "), type);
19059       else
19060         printf (_("<application-specific type %#x data: "), type);
19061       for (j = 0; j < datasz; ++j)
19062         printf ("%02x ", ptr[j] & 0xff);
19063       printf (">");
19064
19065     next:
19066       ptr += ((datasz + (size - 1)) & ~ (size - 1));
19067       if (ptr == ptr_end)
19068         break;
19069
19070       if (do_wide)
19071         printf (", ");
19072       else
19073         printf ("\n\t");
19074     }
19075
19076   printf ("\n");
19077 }
19078
19079 static bfd_boolean
19080 print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
19081 {
19082   /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type ().  */
19083   switch (pnote->type)
19084     {
19085     case NT_GNU_BUILD_ID:
19086       {
19087         unsigned long i;
19088
19089         printf (_("    Build ID: "));
19090         for (i = 0; i < pnote->descsz; ++i)
19091           printf ("%02x", pnote->descdata[i] & 0xff);
19092         printf ("\n");
19093       }
19094       break;
19095
19096     case NT_GNU_ABI_TAG:
19097       {
19098         unsigned long os, major, minor, subminor;
19099         const char *osname;
19100
19101         /* PR 17531: file: 030-599401-0.004.  */
19102         if (pnote->descsz < 16)
19103           {
19104             printf (_("    <corrupt GNU_ABI_TAG>\n"));
19105             break;
19106           }
19107
19108         os = byte_get ((unsigned char *) pnote->descdata, 4);
19109         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
19110         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
19111         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
19112
19113         switch (os)
19114           {
19115           case GNU_ABI_TAG_LINUX:
19116             osname = "Linux";
19117             break;
19118           case GNU_ABI_TAG_HURD:
19119             osname = "Hurd";
19120             break;
19121           case GNU_ABI_TAG_SOLARIS:
19122             osname = "Solaris";
19123             break;
19124           case GNU_ABI_TAG_FREEBSD:
19125             osname = "FreeBSD";
19126             break;
19127           case GNU_ABI_TAG_NETBSD:
19128             osname = "NetBSD";
19129             break;
19130           case GNU_ABI_TAG_SYLLABLE:
19131             osname = "Syllable";
19132             break;
19133           case GNU_ABI_TAG_NACL:
19134             osname = "NaCl";
19135             break;
19136           default:
19137             osname = "Unknown";
19138             break;
19139           }
19140
19141         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
19142                 major, minor, subminor);
19143       }
19144       break;
19145
19146     case NT_GNU_GOLD_VERSION:
19147       {
19148         unsigned long i;
19149
19150         printf (_("    Version: "));
19151         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
19152           printf ("%c", pnote->descdata[i]);
19153         printf ("\n");
19154       }
19155       break;
19156
19157     case NT_GNU_HWCAP:
19158       {
19159         unsigned long num_entries, mask;
19160
19161         /* Hardware capabilities information.  Word 0 is the number of entries.
19162            Word 1 is a bitmask of enabled entries.  The rest of the descriptor
19163            is a series of entries, where each entry is a single byte followed
19164            by a nul terminated string.  The byte gives the bit number to test
19165            if enabled in the bitmask.  */
19166         printf (_("      Hardware Capabilities: "));
19167         if (pnote->descsz < 8)
19168           {
19169             error (_("<corrupt GNU_HWCAP>\n"));
19170             return FALSE;
19171           }
19172         num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
19173         mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
19174         printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
19175         /* FIXME: Add code to display the entries... */
19176       }
19177       break;
19178
19179     case NT_GNU_PROPERTY_TYPE_0:
19180       print_gnu_property_note (filedata, pnote);
19181       break;
19182
19183     default:
19184       /* Handle unrecognised types.  An error message should have already been
19185          created by get_gnu_elf_note_type(), so all that we need to do is to
19186          display the data.  */
19187       {
19188         unsigned long i;
19189
19190         printf (_("    Description data: "));
19191         for (i = 0; i < pnote->descsz; ++i)
19192           printf ("%02x ", pnote->descdata[i] & 0xff);
19193         printf ("\n");
19194       }
19195       break;
19196     }
19197
19198   return TRUE;
19199 }
19200
19201 static const char *
19202 get_v850_elf_note_type (enum v850_notes n_type)
19203 {
19204   static char buff[64];
19205
19206   switch (n_type)
19207     {
19208     case V850_NOTE_ALIGNMENT:  return _("Alignment of 8-byte objects");
19209     case V850_NOTE_DATA_SIZE:  return _("Sizeof double and long double");
19210     case V850_NOTE_FPU_INFO:   return _("Type of FPU support needed");
19211     case V850_NOTE_SIMD_INFO:  return _("Use of SIMD instructions");
19212     case V850_NOTE_CACHE_INFO: return _("Use of cache");
19213     case V850_NOTE_MMU_INFO:   return _("Use of MMU");
19214     default:
19215       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
19216       return buff;
19217     }
19218 }
19219
19220 static bfd_boolean
19221 print_v850_note (Elf_Internal_Note * pnote)
19222 {
19223   unsigned int val;
19224
19225   if (pnote->descsz != 4)
19226     return FALSE;
19227
19228   val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
19229
19230   if (val == 0)
19231     {
19232       printf (_("not set\n"));
19233       return TRUE;
19234     }
19235
19236   switch (pnote->type)
19237     {
19238     case V850_NOTE_ALIGNMENT:
19239       switch (val)
19240         {
19241         case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return TRUE;
19242         case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return TRUE;
19243         }
19244       break;
19245
19246     case V850_NOTE_DATA_SIZE:
19247       switch (val)
19248         {
19249         case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return TRUE;
19250         case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return TRUE;
19251         }
19252       break;
19253
19254     case V850_NOTE_FPU_INFO:
19255       switch (val)
19256         {
19257         case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return TRUE;
19258         case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return TRUE;
19259         }
19260       break;
19261
19262     case V850_NOTE_MMU_INFO:
19263     case V850_NOTE_CACHE_INFO:
19264     case V850_NOTE_SIMD_INFO:
19265       if (val == EF_RH850_SIMD)
19266         {
19267           printf (_("yes\n"));
19268           return TRUE;
19269         }
19270       break;
19271
19272     default:
19273       /* An 'unknown note type' message will already have been displayed.  */
19274       break;
19275     }
19276
19277   printf (_("unknown value: %x\n"), val);
19278   return FALSE;
19279 }
19280
19281 static bfd_boolean
19282 process_netbsd_elf_note (Elf_Internal_Note * pnote)
19283 {
19284   unsigned int version;
19285
19286   switch (pnote->type)
19287     {
19288     case NT_NETBSD_IDENT:
19289       if (pnote->descsz < 1)
19290         break;
19291       version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
19292       if ((version / 10000) % 100)
19293         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
19294                 version, version / 100000000, (version / 1000000) % 100,
19295                 (version / 10000) % 100 > 26 ? "Z" : "",
19296                 'A' + (version / 10000) % 26);
19297       else
19298         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
19299                 version, version / 100000000, (version / 1000000) % 100,
19300                 (version / 100) % 100);
19301       return TRUE;
19302
19303     case NT_NETBSD_MARCH:
19304       printf ("  NetBSD\t\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
19305               pnote->descdata);
19306       return TRUE;
19307
19308 #ifdef   NT_NETBSD_PAX
19309     case NT_NETBSD_PAX:
19310       if (pnote->descsz < 1)
19311         break;
19312       version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
19313       printf ("  NetBSD\t\t0x%08lx\tPaX <%s%s%s%s%s%s>\n", pnote->descsz,
19314               ((version & NT_NETBSD_PAX_MPROTECT) ? "+mprotect" : ""),
19315               ((version & NT_NETBSD_PAX_NOMPROTECT) ? "-mprotect" : ""),
19316               ((version & NT_NETBSD_PAX_GUARD) ? "+guard" : ""),
19317               ((version & NT_NETBSD_PAX_NOGUARD) ? "-guard" : ""),
19318               ((version & NT_NETBSD_PAX_ASLR) ? "+ASLR" : ""),
19319               ((version & NT_NETBSD_PAX_NOASLR) ? "-ASLR" : ""));
19320       return TRUE;
19321 #endif
19322     }
19323
19324   printf ("  NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n",
19325           pnote->descsz, pnote->type);
19326   return FALSE;
19327 }
19328
19329 static const char *
19330 get_freebsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
19331 {
19332   switch (e_type)
19333     {
19334     case NT_FREEBSD_THRMISC:
19335       return _("NT_THRMISC (thrmisc structure)");
19336     case NT_FREEBSD_PROCSTAT_PROC:
19337       return _("NT_PROCSTAT_PROC (proc data)");
19338     case NT_FREEBSD_PROCSTAT_FILES:
19339       return _("NT_PROCSTAT_FILES (files data)");
19340     case NT_FREEBSD_PROCSTAT_VMMAP:
19341       return _("NT_PROCSTAT_VMMAP (vmmap data)");
19342     case NT_FREEBSD_PROCSTAT_GROUPS:
19343       return _("NT_PROCSTAT_GROUPS (groups data)");
19344     case NT_FREEBSD_PROCSTAT_UMASK:
19345       return _("NT_PROCSTAT_UMASK (umask data)");
19346     case NT_FREEBSD_PROCSTAT_RLIMIT:
19347       return _("NT_PROCSTAT_RLIMIT (rlimit data)");
19348     case NT_FREEBSD_PROCSTAT_OSREL:
19349       return _("NT_PROCSTAT_OSREL (osreldate data)");
19350     case NT_FREEBSD_PROCSTAT_PSSTRINGS:
19351       return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
19352     case NT_FREEBSD_PROCSTAT_AUXV:
19353       return _("NT_PROCSTAT_AUXV (auxv data)");
19354     case NT_FREEBSD_PTLWPINFO:
19355       return _("NT_PTLWPINFO (ptrace_lwpinfo structure)");
19356     }
19357   return get_note_type (filedata, e_type);
19358 }
19359
19360 static const char *
19361 get_netbsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
19362 {
19363   static char buff[64];
19364
19365   switch (e_type)
19366     {
19367     case NT_NETBSDCORE_PROCINFO:
19368       /* NetBSD core "procinfo" structure.  */
19369       return _("NetBSD procinfo structure");
19370
19371 #ifdef NT_NETBSDCORE_AUXV
19372     case NT_NETBSDCORE_AUXV:
19373       return _("NetBSD ELF auxiliary vector data");
19374 #endif
19375
19376 #ifdef NT_NETBSDCORE_LWPSTATUS
19377     case NT_NETBSDCORE_LWPSTATUS:
19378       return _("PT_LWPSTATUS (ptrace_lwpstatus structure)");
19379 #endif
19380
19381     default:
19382       /* As of Jan 2020 there are no other machine-independent notes
19383          defined for NetBSD core files.  If the note type is less
19384          than the start of the machine-dependent note types, we don't
19385          understand it.  */
19386
19387       if (e_type < NT_NETBSDCORE_FIRSTMACH)
19388         {
19389           snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
19390           return buff;
19391         }
19392       break;
19393     }
19394
19395   switch (filedata->file_header.e_machine)
19396     {
19397     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
19398        and PT_GETFPREGS == mach+2.  */
19399
19400     case EM_OLD_ALPHA:
19401     case EM_ALPHA:
19402     case EM_SPARC:
19403     case EM_SPARC32PLUS:
19404     case EM_SPARCV9:
19405       switch (e_type)
19406         {
19407         case NT_NETBSDCORE_FIRSTMACH + 0:
19408           return _("PT_GETREGS (reg structure)");
19409         case NT_NETBSDCORE_FIRSTMACH + 2:
19410           return _("PT_GETFPREGS (fpreg structure)");
19411         default:
19412           break;
19413         }
19414       break;
19415
19416     /* On SuperH, PT_GETREGS == mach+3 and PT_GETFPREGS == mach+5.
19417        There's also old PT___GETREGS40 == mach + 1 for old reg
19418        structure which lacks GBR.  */
19419     case EM_SH:
19420       switch (e_type)
19421         {
19422         case NT_NETBSDCORE_FIRSTMACH + 1:
19423           return _("PT___GETREGS40 (old reg structure)");
19424         case NT_NETBSDCORE_FIRSTMACH + 3:
19425           return _("PT_GETREGS (reg structure)");
19426         case NT_NETBSDCORE_FIRSTMACH + 5:
19427           return _("PT_GETFPREGS (fpreg structure)");
19428         default:
19429           break;
19430         }
19431       break;
19432
19433     /* On all other arch's, PT_GETREGS == mach+1 and
19434        PT_GETFPREGS == mach+3.  */
19435     default:
19436       switch (e_type)
19437         {
19438         case NT_NETBSDCORE_FIRSTMACH + 1:
19439           return _("PT_GETREGS (reg structure)");
19440         case NT_NETBSDCORE_FIRSTMACH + 3:
19441           return _("PT_GETFPREGS (fpreg structure)");
19442         default:
19443           break;
19444         }
19445     }
19446
19447   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
19448             e_type - NT_NETBSDCORE_FIRSTMACH);
19449   return buff;
19450 }
19451
19452 static const char *
19453 get_stapsdt_note_type (unsigned e_type)
19454 {
19455   static char buff[64];
19456
19457   switch (e_type)
19458     {
19459     case NT_STAPSDT:
19460       return _("NT_STAPSDT (SystemTap probe descriptors)");
19461
19462     default:
19463       break;
19464     }
19465
19466   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
19467   return buff;
19468 }
19469
19470 static bfd_boolean
19471 print_stapsdt_note (Elf_Internal_Note *pnote)
19472 {
19473   size_t len, maxlen;
19474   unsigned long addr_size = is_32bit_elf ? 4 : 8;
19475   char *data = pnote->descdata;
19476   char *data_end = pnote->descdata + pnote->descsz;
19477   bfd_vma pc, base_addr, semaphore;
19478   char *provider, *probe, *arg_fmt;
19479
19480   if (pnote->descsz < (addr_size * 3))
19481     goto stapdt_note_too_small;
19482
19483   pc = byte_get ((unsigned char *) data, addr_size);
19484   data += addr_size;
19485
19486   base_addr = byte_get ((unsigned char *) data, addr_size);
19487   data += addr_size;
19488
19489   semaphore = byte_get ((unsigned char *) data, addr_size);
19490   data += addr_size;
19491
19492   if (data >= data_end)
19493     goto stapdt_note_too_small;
19494   maxlen = data_end - data;
19495   len = strnlen (data, maxlen);
19496   if (len < maxlen)
19497     {
19498       provider = data;
19499       data += len + 1;
19500     }
19501   else
19502     goto stapdt_note_too_small;
19503
19504   if (data >= data_end)
19505     goto stapdt_note_too_small;
19506   maxlen = data_end - data;
19507   len = strnlen (data, maxlen);
19508   if (len < maxlen)
19509     {
19510       probe = data;
19511       data += len + 1;
19512     }
19513   else
19514     goto stapdt_note_too_small;
19515
19516   if (data >= data_end)
19517     goto stapdt_note_too_small;
19518   maxlen = data_end - data;
19519   len = strnlen (data, maxlen);
19520   if (len < maxlen)
19521     {
19522       arg_fmt = data;
19523       data += len + 1;
19524     }
19525   else
19526     goto stapdt_note_too_small;
19527
19528   printf (_("    Provider: %s\n"), provider);
19529   printf (_("    Name: %s\n"), probe);
19530   printf (_("    Location: "));
19531   print_vma (pc, FULL_HEX);
19532   printf (_(", Base: "));
19533   print_vma (base_addr, FULL_HEX);
19534   printf (_(", Semaphore: "));
19535   print_vma (semaphore, FULL_HEX);
19536   printf ("\n");
19537   printf (_("    Arguments: %s\n"), arg_fmt);
19538
19539   return data == data_end;
19540
19541  stapdt_note_too_small:
19542   printf (_("  <corrupt - note is too small>\n"));
19543   error (_("corrupt stapdt note - the data size is too small\n"));
19544   return FALSE;
19545 }
19546
19547 static const char *
19548 get_ia64_vms_note_type (unsigned e_type)
19549 {
19550   static char buff[64];
19551
19552   switch (e_type)
19553     {
19554     case NT_VMS_MHD:
19555       return _("NT_VMS_MHD (module header)");
19556     case NT_VMS_LNM:
19557       return _("NT_VMS_LNM (language name)");
19558     case NT_VMS_SRC:
19559       return _("NT_VMS_SRC (source files)");
19560     case NT_VMS_TITLE:
19561       return "NT_VMS_TITLE";
19562     case NT_VMS_EIDC:
19563       return _("NT_VMS_EIDC (consistency check)");
19564     case NT_VMS_FPMODE:
19565       return _("NT_VMS_FPMODE (FP mode)");
19566     case NT_VMS_LINKTIME:
19567       return "NT_VMS_LINKTIME";
19568     case NT_VMS_IMGNAM:
19569       return _("NT_VMS_IMGNAM (image name)");
19570     case NT_VMS_IMGID:
19571       return _("NT_VMS_IMGID (image id)");
19572     case NT_VMS_LINKID:
19573       return _("NT_VMS_LINKID (link id)");
19574     case NT_VMS_IMGBID:
19575       return _("NT_VMS_IMGBID (build id)");
19576     case NT_VMS_GSTNAM:
19577       return _("NT_VMS_GSTNAM (sym table name)");
19578     case NT_VMS_ORIG_DYN:
19579       return "NT_VMS_ORIG_DYN";
19580     case NT_VMS_PATCHTIME:
19581       return "NT_VMS_PATCHTIME";
19582     default:
19583       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
19584       return buff;
19585     }
19586 }
19587
19588 static bfd_boolean
19589 print_ia64_vms_note (Elf_Internal_Note * pnote)
19590 {
19591   int maxlen = pnote->descsz;
19592
19593   if (maxlen < 2 || (unsigned long) maxlen != pnote->descsz)
19594     goto desc_size_fail;
19595
19596   switch (pnote->type)
19597     {
19598     case NT_VMS_MHD:
19599       if (maxlen <= 36)
19600         goto desc_size_fail;
19601
19602       int l = (int) strnlen (pnote->descdata + 34, maxlen - 34);
19603
19604       printf (_("    Creation date  : %.17s\n"), pnote->descdata);
19605       printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
19606       if (l + 34 < maxlen)
19607         {
19608           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
19609           if (l + 35 < maxlen)
19610             printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
19611           else
19612             printf (_("    Module version : <missing>\n"));
19613         }
19614       else
19615         {
19616           printf (_("    Module name    : <missing>\n"));
19617           printf (_("    Module version : <missing>\n"));
19618         }
19619       break;
19620
19621     case NT_VMS_LNM:
19622       printf (_("   Language: %.*s\n"), maxlen, pnote->descdata);
19623       break;
19624
19625 #ifdef BFD64
19626     case NT_VMS_FPMODE:
19627       printf (_("   Floating Point mode: "));
19628       if (maxlen < 8)
19629         goto desc_size_fail;
19630       /* FIXME: Generate an error if descsz > 8 ?  */
19631
19632       printf ("0x%016" BFD_VMA_FMT "x\n",
19633               (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
19634       break;
19635
19636     case NT_VMS_LINKTIME:
19637       printf (_("   Link time: "));
19638       if (maxlen < 8)
19639         goto desc_size_fail;
19640       /* FIXME: Generate an error if descsz > 8 ?  */
19641
19642       print_vms_time
19643         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
19644       printf ("\n");
19645       break;
19646
19647     case NT_VMS_PATCHTIME:
19648       printf (_("   Patch time: "));
19649       if (maxlen < 8)
19650         goto desc_size_fail;
19651       /* FIXME: Generate an error if descsz > 8 ?  */
19652
19653       print_vms_time
19654         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
19655       printf ("\n");
19656       break;
19657
19658     case NT_VMS_ORIG_DYN:
19659       if (maxlen < 34)
19660         goto desc_size_fail;
19661
19662       printf (_("   Major id: %u,  minor id: %u\n"),
19663               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
19664               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
19665       printf (_("   Last modified  : "));
19666       print_vms_time
19667         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
19668       printf (_("\n   Link flags  : "));
19669       printf ("0x%016" BFD_VMA_FMT "x\n",
19670               (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
19671       printf (_("   Header flags: 0x%08x\n"),
19672               (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
19673       printf (_("   Image id    : %.*s\n"), maxlen - 32, pnote->descdata + 32);
19674       break;
19675 #endif
19676
19677     case NT_VMS_IMGNAM:
19678       printf (_("    Image name: %.*s\n"), maxlen, pnote->descdata);
19679       break;
19680
19681     case NT_VMS_GSTNAM:
19682       printf (_("    Global symbol table name: %.*s\n"), maxlen, pnote->descdata);
19683       break;
19684
19685     case NT_VMS_IMGID:
19686       printf (_("    Image id: %.*s\n"), maxlen, pnote->descdata);
19687       break;
19688
19689     case NT_VMS_LINKID:
19690       printf (_("    Linker id: %.*s\n"), maxlen, pnote->descdata);
19691       break;
19692
19693     default:
19694       return FALSE;
19695     }
19696
19697   return TRUE;
19698
19699  desc_size_fail:
19700   printf (_("  <corrupt - data size is too small>\n"));
19701   error (_("corrupt IA64 note: data size is too small\n"));
19702   return FALSE;
19703 }
19704
19705 struct build_attr_cache {
19706   Filedata *filedata;
19707   char *strtab;
19708   unsigned long strtablen;
19709   Elf_Internal_Sym *symtab;
19710   unsigned long nsyms;
19711 } ba_cache;
19712
19713 /* Find the symbol associated with a build attribute that is attached
19714    to address OFFSET.  If PNAME is non-NULL then store the name of
19715    the symbol (if found) in the provided pointer,  Returns NULL if a
19716    symbol could not be found.  */
19717
19718 static Elf_Internal_Sym *
19719 get_symbol_for_build_attribute (Filedata *       filedata,
19720                                 unsigned long    offset,
19721                                 bfd_boolean      is_open_attr,
19722                                 const char **    pname)
19723 {
19724   Elf_Internal_Sym *saved_sym = NULL;
19725   Elf_Internal_Sym *sym;
19726
19727   if (filedata->section_headers != NULL
19728       && (ba_cache.filedata == NULL || filedata != ba_cache.filedata))
19729     {
19730       Elf_Internal_Shdr * symsec;
19731
19732       free (ba_cache.strtab);
19733       ba_cache.strtab = NULL;
19734       free (ba_cache.symtab);
19735       ba_cache.symtab = NULL;
19736
19737       /* Load the symbol and string sections.  */
19738       for (symsec = filedata->section_headers;
19739            symsec < filedata->section_headers + filedata->file_header.e_shnum;
19740            symsec ++)
19741         {
19742           if (symsec->sh_type == SHT_SYMTAB
19743               && get_symtab (filedata, symsec,
19744                              &ba_cache.symtab, &ba_cache.nsyms,
19745                              &ba_cache.strtab, &ba_cache.strtablen))
19746             break;
19747         }
19748       ba_cache.filedata = filedata;
19749     }
19750
19751   if (ba_cache.symtab == NULL)
19752     return NULL;
19753
19754   /* Find a symbol whose value matches offset.  */
19755   for (sym = ba_cache.symtab; sym < ba_cache.symtab + ba_cache.nsyms; sym ++)
19756     if (sym->st_value == offset)
19757       {
19758         if (sym->st_name >= ba_cache.strtablen)
19759           /* Huh ?  This should not happen.  */
19760           continue;
19761
19762         if (ba_cache.strtab[sym->st_name] == 0)
19763           continue;
19764
19765         /* The AArch64 and ARM architectures define mapping symbols
19766            (eg $d, $x, $t) which we want to ignore.  */
19767         if (ba_cache.strtab[sym->st_name] == '$'
19768             && ba_cache.strtab[sym->st_name + 1] != 0
19769             && ba_cache.strtab[sym->st_name + 2] == 0)
19770           continue;
19771
19772         if (is_open_attr)
19773           {
19774             /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
19775                and FILE or OBJECT symbols over NOTYPE symbols.  We skip
19776                FUNC symbols entirely.  */
19777             switch (ELF_ST_TYPE (sym->st_info))
19778               {
19779               case STT_OBJECT:
19780               case STT_FILE:
19781                 saved_sym = sym;
19782                 if (sym->st_size)
19783                   {
19784                     /* If the symbol has a size associated
19785                        with it then we can stop searching.  */
19786                     sym = ba_cache.symtab + ba_cache.nsyms;
19787                   }
19788                 continue;
19789
19790               case STT_FUNC:
19791                 /* Ignore function symbols.  */
19792                 continue;
19793
19794               default:
19795                 break;
19796               }
19797
19798             switch (ELF_ST_BIND (sym->st_info))
19799               {
19800               case STB_GLOBAL:
19801                 if (saved_sym == NULL
19802                     || ELF_ST_TYPE (saved_sym->st_info) != STT_OBJECT)
19803                   saved_sym = sym;
19804                 break;
19805
19806               case STB_LOCAL:
19807                 if (saved_sym == NULL)
19808                   saved_sym = sym;
19809                 break;
19810
19811               default:
19812                 break;
19813               }
19814           }
19815         else
19816           {
19817             if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
19818               continue;
19819
19820             saved_sym = sym;
19821             break;
19822           }
19823       }
19824
19825   if (saved_sym && pname)
19826     * pname = ba_cache.strtab + saved_sym->st_name;
19827
19828   return saved_sym;
19829 }
19830
19831 /* Returns true iff addr1 and addr2 are in the same section.  */
19832
19833 static bfd_boolean
19834 same_section (Filedata * filedata, unsigned long addr1, unsigned long addr2)
19835 {
19836   Elf_Internal_Shdr * a1;
19837   Elf_Internal_Shdr * a2;
19838
19839   a1 = find_section_by_address (filedata, addr1);
19840   a2 = find_section_by_address (filedata, addr2);
19841
19842   return a1 == a2 && a1 != NULL;
19843 }
19844
19845 static bfd_boolean
19846 print_gnu_build_attribute_description (Elf_Internal_Note *  pnote,
19847                                        Filedata *           filedata)
19848 {
19849   static unsigned long  global_offset = 0;
19850   static unsigned long  global_end = 0;
19851   static unsigned long  func_offset = 0;
19852   static unsigned long  func_end = 0;
19853
19854   Elf_Internal_Sym *    sym;
19855   const char *          name;
19856   unsigned long         start;
19857   unsigned long         end;
19858   bfd_boolean           is_open_attr = pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN;
19859
19860   switch (pnote->descsz)
19861     {
19862     case 0:
19863       /* A zero-length description means that the range of
19864          the previous note of the same type should be used.  */
19865       if (is_open_attr)
19866         {
19867           if (global_end > global_offset)
19868             printf (_("    Applies to region from %#lx to %#lx\n"),
19869                     global_offset, global_end);
19870           else
19871             printf (_("    Applies to region from %#lx\n"), global_offset);
19872         }
19873       else
19874         {
19875           if (func_end > func_offset)
19876             printf (_("    Applies to region from %#lx to %#lx\n"), func_offset, func_end);
19877           else
19878             printf (_("    Applies to region from %#lx\n"), func_offset);
19879         }
19880       return TRUE;
19881
19882     case 4:
19883       start = byte_get ((unsigned char *) pnote->descdata, 4);
19884       end = 0;
19885       break;
19886
19887     case 8:
19888       if (is_32bit_elf)
19889         {
19890           /* FIXME: We should check that version 3+ notes are being used here...  */
19891           start = byte_get ((unsigned char *) pnote->descdata, 4);
19892           end = byte_get ((unsigned char *) pnote->descdata + 4, 4);
19893         }
19894       else
19895         {
19896           start = byte_get ((unsigned char *) pnote->descdata, 8);
19897           end = 0;
19898         }
19899       break;
19900
19901     case 16:
19902       start = byte_get ((unsigned char *) pnote->descdata, 8);
19903       end = byte_get ((unsigned char *) pnote->descdata + 8, 8);
19904       break;
19905
19906     default:
19907       error (_("    <invalid description size: %lx>\n"), pnote->descsz);
19908       printf (_("    <invalid descsz>"));
19909       return FALSE;
19910     }
19911
19912   name = NULL;
19913   sym = get_symbol_for_build_attribute (filedata, start, is_open_attr, & name);
19914   /* As of version 5 of the annobin plugin, filename symbols are biased by 2
19915      in order to avoid them being confused with the start address of the
19916      first function in the file...  */
19917   if (sym == NULL && is_open_attr)
19918     sym = get_symbol_for_build_attribute (filedata, start + 2, is_open_attr,
19919                                           & name);
19920
19921   if (end == 0 && sym != NULL && sym->st_size > 0)
19922     end = start + sym->st_size;
19923
19924   if (is_open_attr)
19925     {
19926       /* FIXME: Need to properly allow for section alignment.
19927          16 is just the alignment used on x86_64.  */
19928       if (global_end > 0
19929           && start > BFD_ALIGN (global_end, 16)
19930           /* Build notes are not guaranteed to be organised in order of
19931              increasing address, but we should find the all of the notes
19932              for one section in the same place.  */
19933           && same_section (filedata, start, global_end))
19934         warn (_("Gap in build notes detected from %#lx to %#lx\n"),
19935               global_end + 1, start - 1);
19936
19937       printf (_("    Applies to region from %#lx"), start);
19938       global_offset = start;
19939
19940       if (end)
19941         {
19942           printf (_(" to %#lx"), end);
19943           global_end = end;
19944         }
19945     }
19946   else
19947     {
19948       printf (_("    Applies to region from %#lx"), start);
19949       func_offset = start;
19950
19951       if (end)
19952         {
19953           printf (_(" to %#lx"), end);
19954           func_end = end;
19955         }
19956     }
19957
19958   if (sym && name)
19959     printf (_(" (%s)"), name);
19960
19961   printf ("\n");
19962   return TRUE;
19963 }
19964
19965 static bfd_boolean
19966 print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
19967 {
19968   static const char string_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_STRING, 0 };
19969   static const char number_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC, 0 };
19970   static const char bool_expected [3] = { GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE, GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE, 0 };
19971   char         name_type;
19972   char         name_attribute;
19973   const char * expected_types;
19974   const char * name = pnote->namedata;
19975   const char * text;
19976   signed int   left;
19977
19978   if (name == NULL || pnote->namesz < 2)
19979     {
19980       error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
19981       print_symbol (-20, _("  <corrupt name>"));
19982       return FALSE;
19983     }
19984
19985   if (do_wide)
19986     left = 28;
19987   else
19988     left = 20;
19989
19990   /* Version 2 of the spec adds a "GA" prefix to the name field.  */
19991   if (name[0] == 'G' && name[1] == 'A')
19992     {
19993       if (pnote->namesz < 4)
19994         {
19995           error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
19996           print_symbol (-20, _("  <corrupt name>"));
19997           return FALSE;
19998         }
19999
20000       printf ("GA");
20001       name += 2;
20002       left -= 2;
20003     }
20004
20005   switch ((name_type = * name))
20006     {
20007     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
20008     case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
20009     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
20010     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
20011       printf ("%c", * name);
20012       left --;
20013       break;
20014     default:
20015       error (_("unrecognised attribute type in name field: %d\n"), name_type);
20016       print_symbol (-20, _("<unknown name type>"));
20017       return FALSE;
20018     }
20019
20020   ++ name;
20021   text = NULL;
20022
20023   switch ((name_attribute = * name))
20024     {
20025     case GNU_BUILD_ATTRIBUTE_VERSION:
20026       text = _("<version>");
20027       expected_types = string_expected;
20028       ++ name;
20029       break;
20030     case GNU_BUILD_ATTRIBUTE_STACK_PROT:
20031       text = _("<stack prot>");
20032       expected_types = "!+*";
20033       ++ name;
20034       break;
20035     case GNU_BUILD_ATTRIBUTE_RELRO:
20036       text = _("<relro>");
20037       expected_types = bool_expected;
20038       ++ name;
20039       break;
20040     case GNU_BUILD_ATTRIBUTE_STACK_SIZE:
20041       text = _("<stack size>");
20042       expected_types = number_expected;
20043       ++ name;
20044       break;
20045     case GNU_BUILD_ATTRIBUTE_TOOL:
20046       text = _("<tool>");
20047       expected_types = string_expected;
20048       ++ name;
20049       break;
20050     case GNU_BUILD_ATTRIBUTE_ABI:
20051       text = _("<ABI>");
20052       expected_types = "$*";
20053       ++ name;
20054       break;
20055     case GNU_BUILD_ATTRIBUTE_PIC:
20056       text = _("<PIC>");
20057       expected_types = number_expected;
20058       ++ name;
20059       break;
20060     case GNU_BUILD_ATTRIBUTE_SHORT_ENUM:
20061       text = _("<short enum>");
20062       expected_types = bool_expected;
20063       ++ name;
20064       break;
20065     default:
20066       if (ISPRINT (* name))
20067         {
20068           int len = strnlen (name, pnote->namesz - (name - pnote->namedata)) + 1;
20069
20070           if (len > left && ! do_wide)
20071             len = left;
20072           printf ("%.*s:", len, name);
20073           left -= len;
20074           name += len;
20075         }
20076       else
20077         {
20078           static char tmpbuf [128];
20079
20080           error (_("unrecognised byte in name field: %d\n"), * name);
20081           sprintf (tmpbuf, _("<unknown:_%d>"), * name);
20082           text = tmpbuf;
20083           name ++;
20084         }
20085       expected_types = "*$!+";
20086       break;
20087     }
20088
20089   if (text)
20090     left -= printf ("%s", text);
20091
20092   if (strchr (expected_types, name_type) == NULL)
20093     warn (_("attribute does not have an expected type (%c)\n"), name_type);
20094
20095   if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
20096     {
20097       error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
20098              (unsigned long) pnote->namesz,
20099              (long) (name - pnote->namedata));
20100       return FALSE;
20101     }
20102
20103   if (left < 1 && ! do_wide)
20104     return TRUE;
20105
20106   switch (name_type)
20107     {
20108     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
20109       {
20110         unsigned int        bytes;
20111         unsigned long long  val = 0;
20112         unsigned int        shift = 0;
20113         char *              decoded = NULL;
20114
20115         bytes = pnote->namesz - (name - pnote->namedata);
20116         if (bytes > 0)
20117           /* The -1 is because the name field is always 0 terminated, and we
20118              want to be able to ensure that the shift in the while loop below
20119              will not overflow.  */
20120           -- bytes;
20121
20122         if (bytes > sizeof (val))
20123           {
20124             error (_("corrupt numeric name field: too many bytes in the value: %x\n"),
20125                    bytes);
20126             bytes = sizeof (val);
20127           }
20128         /* We do not bother to warn if bytes == 0 as this can
20129            happen with some early versions of the gcc plugin.  */
20130
20131         while (bytes --)
20132           {
20133             unsigned long long byte = *name++ & 0xff;
20134
20135             val |= byte << shift;
20136             shift += 8;
20137           }
20138
20139         switch (name_attribute)
20140           {
20141           case GNU_BUILD_ATTRIBUTE_PIC:
20142             switch (val)
20143               {
20144               case 0: decoded = "static"; break;
20145               case 1: decoded = "pic"; break;
20146               case 2: decoded = "PIC"; break;
20147               case 3: decoded = "pie"; break;
20148               case 4: decoded = "PIE"; break;
20149               default: break;
20150               }
20151             break;
20152           case GNU_BUILD_ATTRIBUTE_STACK_PROT:
20153             switch (val)
20154               {
20155                 /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c.  */
20156               case 0: decoded = "off"; break;
20157               case 1: decoded = "on"; break;
20158               case 2: decoded = "all"; break;
20159               case 3: decoded = "strong"; break;
20160               case 4: decoded = "explicit"; break;
20161               default: break;
20162               }
20163             break;
20164           default:
20165             break;
20166           }
20167
20168         if (decoded != NULL)
20169           {
20170             print_symbol (-left, decoded);
20171             left = 0;
20172           }
20173         else if (val == 0)
20174           {
20175             printf ("0x0");
20176             left -= 3;
20177           }
20178         else
20179           {
20180             if (do_wide)
20181               left -= printf ("0x%llx", val);
20182             else
20183               left -= printf ("0x%-.*llx", left, val);
20184           }
20185       }
20186       break;
20187     case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
20188       left -= print_symbol (- left, name);
20189       break;
20190     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
20191       left -= print_symbol (- left, "true");
20192       break;
20193     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
20194       left -= print_symbol (- left, "false");
20195       break;
20196     }
20197
20198   if (do_wide && left > 0)
20199     printf ("%-*s", left, " ");
20200
20201   return TRUE;
20202 }
20203
20204 /* Note that by the ELF standard, the name field is already null byte
20205    terminated, and namesz includes the terminating null byte.
20206    I.E. the value of namesz for the name "FSF" is 4.
20207
20208    If the value of namesz is zero, there is no name present.  */
20209
20210 static bfd_boolean
20211 process_note (Elf_Internal_Note *  pnote,
20212               Filedata *           filedata)
20213 {
20214   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
20215   const char * nt;
20216
20217   if (pnote->namesz == 0)
20218     /* If there is no note name, then use the default set of
20219        note type strings.  */
20220     nt = get_note_type (filedata, pnote->type);
20221
20222   else if (const_strneq (pnote->namedata, "GNU"))
20223     /* GNU-specific object file notes.  */
20224     nt = get_gnu_elf_note_type (pnote->type);
20225
20226   else if (const_strneq (pnote->namedata, "FreeBSD"))
20227     /* FreeBSD-specific core file notes.  */
20228     nt = get_freebsd_elfcore_note_type (filedata, pnote->type);
20229
20230   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
20231     /* NetBSD-specific core file notes.  */
20232     nt = get_netbsd_elfcore_note_type (filedata, pnote->type);
20233
20234   else if (const_strneq (pnote->namedata, "NetBSD"))
20235     /* NetBSD-specific core file notes.  */
20236     return process_netbsd_elf_note (pnote);
20237
20238   else if (const_strneq (pnote->namedata, "PaX"))
20239     /* NetBSD-specific core file notes.  */
20240     return process_netbsd_elf_note (pnote);
20241
20242   else if (strneq (pnote->namedata, "SPU/", 4))
20243     {
20244       /* SPU-specific core file notes.  */
20245       nt = pnote->namedata + 4;
20246       name = "SPU";
20247     }
20248
20249   else if (const_strneq (pnote->namedata, "IPF/VMS"))
20250     /* VMS/ia64-specific file notes.  */
20251     nt = get_ia64_vms_note_type (pnote->type);
20252
20253   else if (const_strneq (pnote->namedata, "stapsdt"))
20254     nt = get_stapsdt_note_type (pnote->type);
20255
20256   else
20257     /* Don't recognize this note name; just use the default set of
20258        note type strings.  */
20259     nt = get_note_type (filedata, pnote->type);
20260
20261   printf ("  ");
20262
20263   if (((const_strneq (pnote->namedata, "GA")
20264         && strchr ("*$!+", pnote->namedata[2]) != NULL)
20265        || strchr ("*$!+", pnote->namedata[0]) != NULL)
20266       && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
20267           || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
20268     print_gnu_build_attribute_name (pnote);
20269   else
20270     print_symbol (-20, name);
20271
20272   if (do_wide)
20273     printf (" 0x%08lx\t%s\t", pnote->descsz, nt);
20274   else
20275     printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
20276
20277   if (const_strneq (pnote->namedata, "IPF/VMS"))
20278     return print_ia64_vms_note (pnote);
20279   else if (const_strneq (pnote->namedata, "GNU"))
20280     return print_gnu_note (filedata, pnote);
20281   else if (const_strneq (pnote->namedata, "stapsdt"))
20282     return print_stapsdt_note (pnote);
20283   else if (const_strneq (pnote->namedata, "CORE"))
20284     return print_core_note (pnote);
20285   else if (((const_strneq (pnote->namedata, "GA")
20286              && strchr ("*$!+", pnote->namedata[2]) != NULL)
20287             || strchr ("*$!+", pnote->namedata[0]) != NULL)
20288            && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
20289                || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
20290     return print_gnu_build_attribute_description (pnote, filedata);
20291
20292   if (pnote->descsz)
20293     {
20294       unsigned long i;
20295
20296       printf (_("   description data: "));
20297       for (i = 0; i < pnote->descsz; i++)
20298         printf ("%02x ", pnote->descdata[i] & 0xff);
20299       if (!do_wide)
20300         printf ("\n");
20301     }
20302
20303   if (do_wide)
20304     printf ("\n");
20305
20306   return TRUE;
20307 }
20308
20309 static bfd_boolean
20310 process_notes_at (Filedata *           filedata,
20311                   Elf_Internal_Shdr *  section,
20312                   bfd_vma              offset,
20313                   bfd_vma              length,
20314                   bfd_vma              align)
20315 {
20316   Elf_External_Note * pnotes;
20317   Elf_External_Note * external;
20318   char *              end;
20319   bfd_boolean         res = TRUE;
20320
20321   if (length <= 0)
20322     return FALSE;
20323
20324   if (section)
20325     {
20326       pnotes = (Elf_External_Note *) get_section_contents (section, filedata);
20327       if (pnotes)
20328         {
20329           if (! apply_relocations (filedata, section, (unsigned char *) pnotes, length, NULL, NULL))
20330             {
20331               free (pnotes);
20332               return FALSE;
20333             }
20334         }
20335     }
20336   else
20337     pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
20338                                              _("notes"));
20339
20340   if (pnotes == NULL)
20341     return FALSE;
20342
20343   external = pnotes;
20344
20345   if (section)
20346     printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (filedata, section));
20347   else
20348     printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
20349             (unsigned long) offset, (unsigned long) length);
20350
20351   /* NB: Some note sections may have alignment value of 0 or 1.  gABI
20352      specifies that notes should be aligned to 4 bytes in 32-bit
20353      objects and to 8 bytes in 64-bit objects.  As a Linux extension,
20354      we also support 4 byte alignment in 64-bit objects.  If section
20355      alignment is less than 4, we treate alignment as 4 bytes.   */
20356   if (align < 4)
20357     align = 4;
20358   else if (align != 4 && align != 8)
20359     {
20360       warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
20361             (long) align);
20362       free (pnotes);
20363       return FALSE;
20364     }
20365
20366   printf (_("  %-20s %-10s\tDescription\n"), _("Owner"), _("Data size"));
20367
20368   end = (char *) pnotes + length;
20369   while ((char *) external < end)
20370     {
20371       Elf_Internal_Note inote;
20372       size_t min_notesz;
20373       char * next;
20374       char * temp = NULL;
20375       size_t data_remaining = end - (char *) external;
20376
20377       if (!is_ia64_vms (filedata))
20378         {
20379           /* PR binutils/15191
20380              Make sure that there is enough data to read.  */
20381           min_notesz = offsetof (Elf_External_Note, name);
20382           if (data_remaining < min_notesz)
20383             {
20384               warn (ngettext ("Corrupt note: only %ld byte remains, "
20385                               "not enough for a full note\n",
20386                               "Corrupt note: only %ld bytes remain, "
20387                               "not enough for a full note\n",
20388                               data_remaining),
20389                     (long) data_remaining);
20390               break;
20391             }
20392           data_remaining -= min_notesz;
20393
20394           inote.type     = BYTE_GET (external->type);
20395           inote.namesz   = BYTE_GET (external->namesz);
20396           inote.namedata = external->name;
20397           inote.descsz   = BYTE_GET (external->descsz);
20398           inote.descdata = ((char *) external
20399                             + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
20400           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
20401           next = ((char *) external
20402                   + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
20403         }
20404       else
20405         {
20406           Elf64_External_VMS_Note *vms_external;
20407
20408           /* PR binutils/15191
20409              Make sure that there is enough data to read.  */
20410           min_notesz = offsetof (Elf64_External_VMS_Note, name);
20411           if (data_remaining < min_notesz)
20412             {
20413               warn (ngettext ("Corrupt note: only %ld byte remains, "
20414                               "not enough for a full note\n",
20415                               "Corrupt note: only %ld bytes remain, "
20416                               "not enough for a full note\n",
20417                               data_remaining),
20418                     (long) data_remaining);
20419               break;
20420             }
20421           data_remaining -= min_notesz;
20422
20423           vms_external = (Elf64_External_VMS_Note *) external;
20424           inote.type     = BYTE_GET (vms_external->type);
20425           inote.namesz   = BYTE_GET (vms_external->namesz);
20426           inote.namedata = vms_external->name;
20427           inote.descsz   = BYTE_GET (vms_external->descsz);
20428           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
20429           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
20430           next = inote.descdata + align_power (inote.descsz, 3);
20431         }
20432
20433       /* PR 17531: file: 3443835e.  */
20434       /* PR 17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4.  */
20435       if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
20436           || (size_t) (inote.descdata - inote.namedata) > data_remaining
20437           || (size_t) (next - inote.descdata) < inote.descsz
20438           || ((size_t) (next - inote.descdata)
20439               > data_remaining - (size_t) (inote.descdata - inote.namedata)))
20440         {
20441           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
20442                 (unsigned long) ((char *) external - (char *) pnotes));
20443           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
20444                 inote.type, inote.namesz, inote.descsz, (int) align);
20445           break;
20446         }
20447
20448       external = (Elf_External_Note *) next;
20449
20450       /* Verify that name is null terminated.  It appears that at least
20451          one version of Linux (RedHat 6.0) generates corefiles that don't
20452          comply with the ELF spec by failing to include the null byte in
20453          namesz.  */
20454       if (inote.namesz > 0 && inote.namedata[inote.namesz - 1] != '\0')
20455         {
20456           if ((size_t) (inote.descdata - inote.namedata) == inote.namesz)
20457             {
20458               temp = (char *) malloc (inote.namesz + 1);
20459               if (temp == NULL)
20460                 {
20461                   error (_("Out of memory allocating space for inote name\n"));
20462                   res = FALSE;
20463                   break;
20464                 }
20465
20466               memcpy (temp, inote.namedata, inote.namesz);
20467               inote.namedata = temp;
20468             }
20469           inote.namedata[inote.namesz] = 0;
20470         }
20471
20472       if (! process_note (& inote, filedata))
20473         res = FALSE;
20474
20475       free (temp);
20476       temp = NULL;
20477     }
20478
20479   free (pnotes);
20480
20481   return res;
20482 }
20483
20484 static bfd_boolean
20485 process_corefile_note_segments (Filedata * filedata)
20486 {
20487   Elf_Internal_Phdr * segment;
20488   unsigned int i;
20489   bfd_boolean res = TRUE;
20490
20491   if (! get_program_headers (filedata))
20492     return TRUE;
20493
20494   for (i = 0, segment = filedata->program_headers;
20495        i < filedata->file_header.e_phnum;
20496        i++, segment++)
20497     {
20498       if (segment->p_type == PT_NOTE)
20499         if (! process_notes_at (filedata, NULL,
20500                                 (bfd_vma) segment->p_offset,
20501                                 (bfd_vma) segment->p_filesz,
20502                                 (bfd_vma) segment->p_align))
20503           res = FALSE;
20504     }
20505
20506   return res;
20507 }
20508
20509 static bfd_boolean
20510 process_v850_notes (Filedata * filedata, bfd_vma offset, bfd_vma length)
20511 {
20512   Elf_External_Note * pnotes;
20513   Elf_External_Note * external;
20514   char * end;
20515   bfd_boolean res = TRUE;
20516
20517   if (length <= 0)
20518     return FALSE;
20519
20520   pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
20521                                            _("v850 notes"));
20522   if (pnotes == NULL)
20523     return FALSE;
20524
20525   external = pnotes;
20526   end = (char*) pnotes + length;
20527
20528   printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
20529           (unsigned long) offset, (unsigned long) length);
20530
20531   while ((char *) external + sizeof (Elf_External_Note) < end)
20532     {
20533       Elf_External_Note * next;
20534       Elf_Internal_Note inote;
20535
20536       inote.type     = BYTE_GET (external->type);
20537       inote.namesz   = BYTE_GET (external->namesz);
20538       inote.namedata = external->name;
20539       inote.descsz   = BYTE_GET (external->descsz);
20540       inote.descdata = inote.namedata + align_power (inote.namesz, 2);
20541       inote.descpos  = offset + (inote.descdata - (char *) pnotes);
20542
20543       if (inote.descdata < (char *) pnotes || inote.descdata >= end)
20544         {
20545           warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
20546           inote.descdata = inote.namedata;
20547           inote.namesz   = 0;
20548         }
20549
20550       next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
20551
20552       if (   ((char *) next > end)
20553           || ((char *) next <  (char *) pnotes))
20554         {
20555           warn (_("corrupt descsz found in note at offset 0x%lx\n"),
20556                 (unsigned long) ((char *) external - (char *) pnotes));
20557           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
20558                 inote.type, inote.namesz, inote.descsz);
20559           break;
20560         }
20561
20562       external = next;
20563
20564       /* Prevent out-of-bounds indexing.  */
20565       if (   inote.namedata + inote.namesz > end
20566           || inote.namedata + inote.namesz < inote.namedata)
20567         {
20568           warn (_("corrupt namesz found in note at offset 0x%lx\n"),
20569                 (unsigned long) ((char *) external - (char *) pnotes));
20570           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
20571                 inote.type, inote.namesz, inote.descsz);
20572           break;
20573         }
20574
20575       printf ("  %s: ", get_v850_elf_note_type (inote.type));
20576
20577       if (! print_v850_note (& inote))
20578         {
20579           res = FALSE;
20580           printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
20581                   inote.namesz, inote.descsz);
20582         }
20583     }
20584
20585   free (pnotes);
20586
20587   return res;
20588 }
20589
20590 static bfd_boolean
20591 process_note_sections (Filedata * filedata)
20592 {
20593   Elf_Internal_Shdr * section;
20594   unsigned long i;
20595   unsigned int n = 0;
20596   bfd_boolean res = TRUE;
20597
20598   for (i = 0, section = filedata->section_headers;
20599        i < filedata->file_header.e_shnum && section != NULL;
20600        i++, section++)
20601     {
20602       if (section->sh_type == SHT_NOTE)
20603         {
20604           if (! process_notes_at (filedata, section,
20605                                   (bfd_vma) section->sh_offset,
20606                                   (bfd_vma) section->sh_size,
20607                                   (bfd_vma) section->sh_addralign))
20608             res = FALSE;
20609           n++;
20610         }
20611
20612       if ((   filedata->file_header.e_machine == EM_V800
20613            || filedata->file_header.e_machine == EM_V850
20614            || filedata->file_header.e_machine == EM_CYGNUS_V850)
20615           && section->sh_type == SHT_RENESAS_INFO)
20616         {
20617           if (! process_v850_notes (filedata,
20618                                     (bfd_vma) section->sh_offset,
20619                                     (bfd_vma) section->sh_size))
20620             res = FALSE;
20621           n++;
20622         }
20623     }
20624
20625   if (n == 0)
20626     /* Try processing NOTE segments instead.  */
20627     return process_corefile_note_segments (filedata);
20628
20629   return res;
20630 }
20631
20632 static bfd_boolean
20633 process_notes (Filedata * filedata)
20634 {
20635   /* If we have not been asked to display the notes then do nothing.  */
20636   if (! do_notes)
20637     return TRUE;
20638
20639   if (filedata->file_header.e_type != ET_CORE)
20640     return process_note_sections (filedata);
20641
20642   /* No program headers means no NOTE segment.  */
20643   if (filedata->file_header.e_phnum > 0)
20644     return process_corefile_note_segments (filedata);
20645
20646   printf (_("No note segments present in the core file.\n"));
20647   return TRUE;
20648 }
20649
20650 static unsigned char *
20651 display_public_gnu_attributes (unsigned char * start,
20652                                const unsigned char * const end)
20653 {
20654   printf (_("  Unknown GNU attribute: %s\n"), start);
20655
20656   start += strnlen ((char *) start, end - start);
20657   display_raw_attribute (start, end);
20658
20659   return (unsigned char *) end;
20660 }
20661
20662 static unsigned char *
20663 display_generic_attribute (unsigned char * start,
20664                            unsigned int tag,
20665                            const unsigned char * const end)
20666 {
20667   if (tag == 0)
20668     return (unsigned char *) end;
20669
20670   return display_tag_value (tag, start, end);
20671 }
20672
20673 static bfd_boolean
20674 process_arch_specific (Filedata * filedata)
20675 {
20676   if (! do_arch)
20677     return TRUE;
20678
20679   switch (filedata->file_header.e_machine)
20680     {
20681     case EM_ARC:
20682     case EM_ARC_COMPACT:
20683     case EM_ARC_COMPACT2:
20684       return process_attributes (filedata, "ARC", SHT_ARC_ATTRIBUTES,
20685                                  display_arc_attribute,
20686                                  display_generic_attribute);
20687     case EM_ARM:
20688       return process_attributes (filedata, "aeabi", SHT_ARM_ATTRIBUTES,
20689                                  display_arm_attribute,
20690                                  display_generic_attribute);
20691
20692     case EM_MIPS:
20693     case EM_MIPS_RS3_LE:
20694       return process_mips_specific (filedata);
20695
20696     case EM_MSP430:
20697      return process_attributes (filedata, "mspabi", SHT_MSP430_ATTRIBUTES,
20698                                 display_msp430_attribute,
20699                                 display_msp430_gnu_attribute);
20700
20701     case EM_RISCV:
20702      return process_attributes (filedata, "riscv", SHT_RISCV_ATTRIBUTES,
20703                                 display_riscv_attribute,
20704                                 display_generic_attribute);
20705
20706     case EM_NDS32:
20707       return process_nds32_specific (filedata);
20708
20709     case EM_68K:
20710       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
20711                                  display_m68k_gnu_attribute);
20712
20713     case EM_PPC:
20714     case EM_PPC64:
20715       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
20716                                  display_power_gnu_attribute);
20717
20718     case EM_S390:
20719     case EM_S390_OLD:
20720       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
20721                                  display_s390_gnu_attribute);
20722
20723     case EM_SPARC:
20724     case EM_SPARC32PLUS:
20725     case EM_SPARCV9:
20726       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
20727                                  display_sparc_gnu_attribute);
20728
20729     case EM_TI_C6000:
20730       return process_attributes (filedata, "c6xabi", SHT_C6000_ATTRIBUTES,
20731                                  display_tic6x_attribute,
20732                                  display_generic_attribute);
20733
20734     case EM_CSKY:
20735       return process_attributes (filedata, "csky", SHT_CSKY_ATTRIBUTES,
20736                                  display_csky_attribute, NULL);
20737
20738     default:
20739       return process_attributes (filedata, "gnu", SHT_GNU_ATTRIBUTES,
20740                                  display_public_gnu_attributes,
20741                                  display_generic_attribute);
20742     }
20743 }
20744
20745 static bfd_boolean
20746 get_file_header (Filedata * filedata)
20747 {
20748   /* Read in the identity array.  */
20749   if (fread (filedata->file_header.e_ident, EI_NIDENT, 1, filedata->handle) != 1)
20750     return FALSE;
20751
20752   /* Determine how to read the rest of the header.  */
20753   switch (filedata->file_header.e_ident[EI_DATA])
20754     {
20755     default:
20756     case ELFDATANONE:
20757     case ELFDATA2LSB:
20758       byte_get = byte_get_little_endian;
20759       byte_put = byte_put_little_endian;
20760       break;
20761     case ELFDATA2MSB:
20762       byte_get = byte_get_big_endian;
20763       byte_put = byte_put_big_endian;
20764       break;
20765     }
20766
20767   /* For now we only support 32 bit and 64 bit ELF files.  */
20768   is_32bit_elf = (filedata->file_header.e_ident[EI_CLASS] != ELFCLASS64);
20769
20770   /* Read in the rest of the header.  */
20771   if (is_32bit_elf)
20772     {
20773       Elf32_External_Ehdr ehdr32;
20774
20775       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, filedata->handle) != 1)
20776         return FALSE;
20777
20778       filedata->file_header.e_type      = BYTE_GET (ehdr32.e_type);
20779       filedata->file_header.e_machine   = BYTE_GET (ehdr32.e_machine);
20780       filedata->file_header.e_version   = BYTE_GET (ehdr32.e_version);
20781       filedata->file_header.e_entry     = BYTE_GET (ehdr32.e_entry);
20782       filedata->file_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
20783       filedata->file_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
20784       filedata->file_header.e_flags     = BYTE_GET (ehdr32.e_flags);
20785       filedata->file_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
20786       filedata->file_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
20787       filedata->file_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
20788       filedata->file_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
20789       filedata->file_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
20790       filedata->file_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
20791     }
20792   else
20793     {
20794       Elf64_External_Ehdr ehdr64;
20795
20796       /* If we have been compiled with sizeof (bfd_vma) == 4, then
20797          we will not be able to cope with the 64bit data found in
20798          64 ELF files.  Detect this now and abort before we start
20799          overwriting things.  */
20800       if (sizeof (bfd_vma) < 8)
20801         {
20802           error (_("This instance of readelf has been built without support for a\n\
20803 64 bit data type and so it cannot read 64 bit ELF files.\n"));
20804           return FALSE;
20805         }
20806
20807       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, filedata->handle) != 1)
20808         return FALSE;
20809
20810       filedata->file_header.e_type      = BYTE_GET (ehdr64.e_type);
20811       filedata->file_header.e_machine   = BYTE_GET (ehdr64.e_machine);
20812       filedata->file_header.e_version   = BYTE_GET (ehdr64.e_version);
20813       filedata->file_header.e_entry     = BYTE_GET (ehdr64.e_entry);
20814       filedata->file_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
20815       filedata->file_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
20816       filedata->file_header.e_flags     = BYTE_GET (ehdr64.e_flags);
20817       filedata->file_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
20818       filedata->file_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
20819       filedata->file_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
20820       filedata->file_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
20821       filedata->file_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
20822       filedata->file_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
20823     }
20824
20825   if (filedata->file_header.e_shoff)
20826     {
20827       /* There may be some extensions in the first section header.  Don't
20828          bomb if we can't read it.  */
20829       if (is_32bit_elf)
20830         get_32bit_section_headers (filedata, TRUE);
20831       else
20832         get_64bit_section_headers (filedata, TRUE);
20833     }
20834
20835   return TRUE;
20836 }
20837
20838 static void
20839 close_file (Filedata * filedata)
20840 {
20841   if (filedata)
20842     {
20843       if (filedata->handle)
20844         fclose (filedata->handle);
20845       free (filedata);
20846     }
20847 }
20848
20849 void
20850 close_debug_file (void * data)
20851 {
20852   close_file ((Filedata *) data);
20853 }
20854
20855 static Filedata *
20856 open_file (const char * pathname)
20857 {
20858   struct stat  statbuf;
20859   Filedata *   filedata = NULL;
20860
20861   if (stat (pathname, & statbuf) < 0
20862       || ! S_ISREG (statbuf.st_mode))
20863     goto fail;
20864
20865   filedata = calloc (1, sizeof * filedata);
20866   if (filedata == NULL)
20867     goto fail;
20868
20869   filedata->handle = fopen (pathname, "rb");
20870   if (filedata->handle == NULL)
20871     goto fail;
20872
20873   filedata->file_size = (bfd_size_type) statbuf.st_size;
20874   filedata->file_name = pathname;
20875
20876   if (! get_file_header (filedata))
20877     goto fail;
20878
20879   if (filedata->file_header.e_shoff)
20880     {
20881       bfd_boolean res;
20882
20883       /* Read the section headers again, this time for real.  */
20884       if (is_32bit_elf)
20885         res = get_32bit_section_headers (filedata, FALSE);
20886       else
20887         res = get_64bit_section_headers (filedata, FALSE);
20888
20889       if (!res)
20890         goto fail;
20891     }
20892
20893   return filedata;
20894
20895  fail:
20896   if (filedata)
20897     {
20898       if (filedata->handle)
20899         fclose (filedata->handle);
20900       free (filedata);
20901     }
20902   return NULL;
20903 }
20904
20905 void *
20906 open_debug_file (const char * pathname)
20907 {
20908   return open_file (pathname);
20909 }
20910
20911 /* Process one ELF object file according to the command line options.
20912    This file may actually be stored in an archive.  The file is
20913    positioned at the start of the ELF object.  Returns TRUE if no
20914    problems were encountered, FALSE otherwise.  */
20915
20916 static bfd_boolean
20917 process_object (Filedata * filedata)
20918 {
20919   bfd_boolean  have_separate_files;
20920   unsigned int i;
20921   bfd_boolean res;
20922
20923   if (! get_file_header (filedata))
20924     {
20925       error (_("%s: Failed to read file header\n"), filedata->file_name);
20926       return FALSE;
20927     }
20928
20929   /* Initialise per file variables.  */
20930   for (i = ARRAY_SIZE (filedata->version_info); i--;)
20931     filedata->version_info[i] = 0;
20932
20933   for (i = ARRAY_SIZE (filedata->dynamic_info); i--;)
20934     filedata->dynamic_info[i] = 0;
20935   filedata->dynamic_info_DT_GNU_HASH = 0;
20936   filedata->dynamic_info_DT_MIPS_XHASH = 0;
20937
20938   /* Process the file.  */
20939   if (show_name)
20940     printf (_("\nFile: %s\n"), filedata->file_name);
20941
20942   /* Initialise the dump_sects array from the cmdline_dump_sects array.
20943      Note we do this even if cmdline_dump_sects is empty because we
20944      must make sure that the dump_sets array is zeroed out before each
20945      object file is processed.  */
20946   if (filedata->dump.num_dump_sects > cmdline.num_dump_sects)
20947     memset (filedata->dump.dump_sects, 0,
20948             filedata->dump.num_dump_sects * sizeof (*filedata->dump.dump_sects));
20949
20950   if (cmdline.num_dump_sects > 0)
20951     {
20952       if (filedata->dump.num_dump_sects == 0)
20953         /* A sneaky way of allocating the dump_sects array.  */
20954         request_dump_bynumber (&filedata->dump, cmdline.num_dump_sects, 0);
20955
20956       assert (filedata->dump.num_dump_sects >= cmdline.num_dump_sects);
20957       memcpy (filedata->dump.dump_sects, cmdline.dump_sects,
20958               cmdline.num_dump_sects * sizeof (*filedata->dump.dump_sects));
20959     }
20960
20961   if (! process_file_header (filedata))
20962     return FALSE;
20963
20964   if (! process_section_headers (filedata))
20965     {
20966       /* Without loaded section headers we cannot process lots of things.  */
20967       do_unwind = do_version = do_dump = do_arch = FALSE;
20968
20969       if (! do_using_dynamic)
20970         do_syms = do_dyn_syms = do_reloc = FALSE;
20971     }
20972
20973   if (! process_section_groups (filedata))
20974     /* Without loaded section groups we cannot process unwind.  */
20975     do_unwind = FALSE;
20976
20977   res = process_program_headers (filedata);
20978   if (res)
20979     res = process_dynamic_section (filedata);
20980
20981   if (! process_relocs (filedata))
20982     res = FALSE;
20983
20984   if (! process_unwind (filedata))
20985     res = FALSE;
20986
20987   if (! process_symbol_table (filedata))
20988     res = FALSE;
20989
20990   if (! process_lto_symbol_tables (filedata))
20991     res = FALSE;
20992
20993   if (! process_syminfo (filedata))
20994     res = FALSE;
20995
20996   if (! process_version_sections (filedata))
20997     res = FALSE;
20998
20999   if (filedata->file_header.e_shstrndx != SHN_UNDEF)
21000     have_separate_files = load_separate_debug_files (filedata, filedata->file_name);
21001   else
21002     have_separate_files = FALSE;
21003
21004   if (! process_section_contents (filedata))
21005     res = FALSE;
21006
21007   if (have_separate_files)
21008     {
21009       separate_info * d;
21010
21011       for (d = first_separate_info; d != NULL; d = d->next)
21012         {
21013           if (! process_section_headers (d->handle))
21014             res = FALSE;
21015           else if (! process_section_contents (d->handle))
21016             res = FALSE;
21017         }
21018
21019       /* The file handles are closed by the call to free_debug_memory() below.  */
21020     }
21021
21022   if (! process_notes (filedata))
21023     res = FALSE;
21024
21025   if (! process_gnu_liblist (filedata))
21026     res = FALSE;
21027
21028   if (! process_arch_specific (filedata))
21029     res = FALSE;
21030
21031   free (filedata->program_headers);
21032   filedata->program_headers = NULL;
21033
21034   free (filedata->section_headers);
21035   filedata->section_headers = NULL;
21036
21037   free (filedata->string_table);
21038   filedata->string_table = NULL;
21039   filedata->string_table_length = 0;
21040
21041   free (filedata->dump.dump_sects);
21042   filedata->dump.dump_sects = NULL;
21043   filedata->dump.num_dump_sects = 0;
21044
21045   free (filedata->dynamic_strings);
21046   filedata->dynamic_strings = NULL;
21047   filedata->dynamic_strings_length = 0;
21048
21049   free (filedata->dynamic_symbols);
21050   filedata->dynamic_symbols = NULL;
21051   filedata->num_dynamic_syms = 0;
21052
21053   free (filedata->dynamic_syminfo);
21054   filedata->dynamic_syminfo = NULL;
21055
21056   free (filedata->dynamic_section);
21057   filedata->dynamic_section = NULL;
21058
21059   while (filedata->symtab_shndx_list != NULL)
21060     {
21061       elf_section_list *next = filedata->symtab_shndx_list->next;
21062       free (filedata->symtab_shndx_list);
21063       filedata->symtab_shndx_list = next;
21064     }
21065
21066   free (filedata->section_headers_groups);
21067   filedata->section_headers_groups = NULL;
21068
21069   if (filedata->section_groups)
21070     {
21071       struct group_list * g;
21072       struct group_list * next;
21073
21074       for (i = 0; i < filedata->group_count; i++)
21075         {
21076           for (g = filedata->section_groups [i].root; g != NULL; g = next)
21077             {
21078               next = g->next;
21079               free (g);
21080             }
21081         }
21082
21083       free (filedata->section_groups);
21084       filedata->section_groups = NULL;
21085     }
21086
21087   free_debug_memory ();
21088
21089   return res;
21090 }
21091
21092 /* Process an ELF archive.
21093    On entry the file is positioned just after the ARMAG string.
21094    Returns TRUE upon success, FALSE otherwise.  */
21095
21096 static bfd_boolean
21097 process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
21098 {
21099   struct archive_info arch;
21100   struct archive_info nested_arch;
21101   size_t got;
21102   bfd_boolean ret = TRUE;
21103
21104   show_name = TRUE;
21105
21106   /* The ARCH structure is used to hold information about this archive.  */
21107   arch.file_name = NULL;
21108   arch.file = NULL;
21109   arch.index_array = NULL;
21110   arch.sym_table = NULL;
21111   arch.longnames = NULL;
21112
21113   /* The NESTED_ARCH structure is used as a single-item cache of information
21114      about a nested archive (when members of a thin archive reside within
21115      another regular archive file).  */
21116   nested_arch.file_name = NULL;
21117   nested_arch.file = NULL;
21118   nested_arch.index_array = NULL;
21119   nested_arch.sym_table = NULL;
21120   nested_arch.longnames = NULL;
21121
21122   if (setup_archive (&arch, filedata->file_name, filedata->handle,
21123                      filedata->file_size, is_thin_archive,
21124                      do_archive_index) != 0)
21125     {
21126       ret = FALSE;
21127       goto out;
21128     }
21129
21130   if (do_archive_index)
21131     {
21132       if (arch.sym_table == NULL)
21133         error (_("%s: unable to dump the index as none was found\n"),
21134                filedata->file_name);
21135       else
21136         {
21137           unsigned long i, l;
21138           unsigned long current_pos;
21139
21140           printf (_("Index of archive %s: (%lu entries, 0x%lx bytes "
21141                     "in the symbol table)\n"),
21142                   filedata->file_name, (unsigned long) arch.index_num,
21143                   arch.sym_size);
21144
21145           current_pos = ftell (filedata->handle);
21146
21147           for (i = l = 0; i < arch.index_num; i++)
21148             {
21149               if (i == 0
21150                   || (i > 0 && arch.index_array[i] != arch.index_array[i - 1]))
21151                 {
21152                   char * member_name
21153                     = get_archive_member_name_at (&arch, arch.index_array[i],
21154                                                   &nested_arch);
21155
21156                   if (member_name != NULL)
21157                     {
21158                       char * qualified_name
21159                         = make_qualified_name (&arch, &nested_arch,
21160                                                member_name);
21161
21162                       if (qualified_name != NULL)
21163                         {
21164                           printf (_("Contents of binary %s at offset "),
21165                                   qualified_name);
21166                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
21167                           putchar ('\n');
21168                           free (qualified_name);
21169                         }
21170                       free (member_name);
21171                     }
21172                 }
21173
21174               if (l >= arch.sym_size)
21175                 {
21176                   error (_("%s: end of the symbol table reached "
21177                            "before the end of the index\n"),
21178                          filedata->file_name);
21179                   ret = FALSE;
21180                   break;
21181                 }
21182               /* PR 17531: file: 0b6630b2.  */
21183               printf ("\t%.*s\n",
21184                       (int) (arch.sym_size - l), arch.sym_table + l);
21185               l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
21186             }
21187
21188           if (arch.uses_64bit_indices)
21189             l = (l + 7) & ~ 7;
21190           else
21191             l += l & 1;
21192
21193           if (l < arch.sym_size)
21194             {
21195               error (ngettext ("%s: %ld byte remains in the symbol table, "
21196                                "but without corresponding entries in "
21197                                "the index table\n",
21198                                "%s: %ld bytes remain in the symbol table, "
21199                                "but without corresponding entries in "
21200                                "the index table\n",
21201                                arch.sym_size - l),
21202                      filedata->file_name, arch.sym_size - l);
21203               ret = FALSE;
21204             }
21205
21206           if (fseek (filedata->handle, current_pos, SEEK_SET) != 0)
21207             {
21208               error (_("%s: failed to seek back to start of object files "
21209                        "in the archive\n"),
21210                      filedata->file_name);
21211               ret = FALSE;
21212               goto out;
21213             }
21214         }
21215
21216       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
21217           && !do_segments && !do_header && !do_dump && !do_version
21218           && !do_histogram && !do_debugging && !do_arch && !do_notes
21219           && !do_section_groups && !do_dyn_syms)
21220         {
21221           ret = TRUE; /* Archive index only.  */
21222           goto out;
21223         }
21224     }
21225
21226   while (1)
21227     {
21228       char * name;
21229       size_t namelen;
21230       char * qualified_name;
21231
21232       /* Read the next archive header.  */
21233       if (fseek (filedata->handle, arch.next_arhdr_offset, SEEK_SET) != 0)
21234         {
21235           error (_("%s: failed to seek to next archive header\n"),
21236                  arch.file_name);
21237           ret = FALSE;
21238           break;
21239         }
21240       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, filedata->handle);
21241       if (got != sizeof arch.arhdr)
21242         {
21243           if (got == 0)
21244             break;
21245           /* PR 24049 - we cannot use filedata->file_name as this will
21246              have already been freed.  */
21247           error (_("%s: failed to read archive header\n"), arch.file_name);
21248
21249           ret = FALSE;
21250           break;
21251         }
21252       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
21253         {
21254           error (_("%s: did not find a valid archive header\n"),
21255                  arch.file_name);
21256           ret = FALSE;
21257           break;
21258         }
21259
21260       arch.next_arhdr_offset += sizeof arch.arhdr;
21261
21262       filedata->archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
21263       if (filedata->archive_file_size & 01)
21264         ++filedata->archive_file_size;
21265
21266       name = get_archive_member_name (&arch, &nested_arch);
21267       if (name == NULL)
21268         {
21269           error (_("%s: bad archive file name\n"), arch.file_name);
21270           ret = FALSE;
21271           break;
21272         }
21273       namelen = strlen (name);
21274
21275       qualified_name = make_qualified_name (&arch, &nested_arch, name);
21276       if (qualified_name == NULL)
21277         {
21278           error (_("%s: bad archive file name\n"), arch.file_name);
21279           free (name);
21280           ret = FALSE;
21281           break;
21282         }
21283
21284       if (is_thin_archive && arch.nested_member_origin == 0)
21285         {
21286           /* This is a proxy for an external member of a thin archive.  */
21287           Filedata * member_filedata;
21288           char * member_file_name = adjust_relative_path
21289             (filedata->file_name, name, namelen);
21290
21291           free (name);
21292           if (member_file_name == NULL)
21293             {
21294               free (qualified_name);
21295               ret = FALSE;
21296               break;
21297             }
21298
21299           member_filedata = open_file (member_file_name);
21300           if (member_filedata == NULL)
21301             {
21302               error (_("Input file '%s' is not readable.\n"), member_file_name);
21303               free (member_file_name);
21304               free (qualified_name);
21305               ret = FALSE;
21306               break;
21307             }
21308
21309           filedata->archive_file_offset = arch.nested_member_origin;
21310           member_filedata->file_name = qualified_name;
21311
21312           if (! process_object (member_filedata))
21313             ret = FALSE;
21314
21315           close_file (member_filedata);
21316           free (member_file_name);
21317         }
21318       else if (is_thin_archive)
21319         {
21320           Filedata thin_filedata;
21321
21322           memset (&thin_filedata, 0, sizeof (thin_filedata));
21323
21324           /* PR 15140: Allow for corrupt thin archives.  */
21325           if (nested_arch.file == NULL)
21326             {
21327               error (_("%s: contains corrupt thin archive: %s\n"),
21328                      qualified_name, name);
21329               free (qualified_name);
21330               free (name);
21331               ret = FALSE;
21332               break;
21333             }
21334           free (name);
21335
21336           /* This is a proxy for a member of a nested archive.  */
21337           filedata->archive_file_offset
21338             = arch.nested_member_origin + sizeof arch.arhdr;
21339
21340           /* The nested archive file will have been opened and setup by
21341              get_archive_member_name.  */
21342           if (fseek (nested_arch.file, filedata->archive_file_offset,
21343                      SEEK_SET) != 0)
21344             {
21345               error (_("%s: failed to seek to archive member.\n"),
21346                      nested_arch.file_name);
21347               free (qualified_name);
21348               ret = FALSE;
21349               break;
21350             }
21351
21352           thin_filedata.handle = nested_arch.file;
21353           thin_filedata.file_name = qualified_name;
21354
21355           if (! process_object (& thin_filedata))
21356             ret = FALSE;
21357         }
21358       else
21359         {
21360           free (name);
21361           filedata->archive_file_offset = arch.next_arhdr_offset;
21362           filedata->file_name = qualified_name;
21363           if (! process_object (filedata))
21364             ret = FALSE;
21365           arch.next_arhdr_offset += filedata->archive_file_size;
21366           /* Stop looping with "negative" archive_file_size.  */
21367           if (arch.next_arhdr_offset < filedata->archive_file_size)
21368             arch.next_arhdr_offset = -1ul;
21369         }
21370
21371       free (qualified_name);
21372     }
21373
21374  out:
21375   if (nested_arch.file != NULL)
21376     fclose (nested_arch.file);
21377   release_archive (&nested_arch);
21378   release_archive (&arch);
21379
21380   return ret;
21381 }
21382
21383 static bfd_boolean
21384 process_file (char * file_name)
21385 {
21386   Filedata * filedata = NULL;
21387   struct stat statbuf;
21388   char armag[SARMAG];
21389   bfd_boolean ret = TRUE;
21390
21391   if (stat (file_name, &statbuf) < 0)
21392     {
21393       if (errno == ENOENT)
21394         error (_("'%s': No such file\n"), file_name);
21395       else
21396         error (_("Could not locate '%s'.  System error message: %s\n"),
21397                file_name, strerror (errno));
21398       return FALSE;
21399     }
21400
21401   if (! S_ISREG (statbuf.st_mode))
21402     {
21403       error (_("'%s' is not an ordinary file\n"), file_name);
21404       return FALSE;
21405     }
21406
21407   filedata = calloc (1, sizeof * filedata);
21408   if (filedata == NULL)
21409     {
21410       error (_("Out of memory allocating file data structure\n"));
21411       return FALSE;
21412     }
21413
21414   filedata->file_name = file_name;
21415   filedata->handle = fopen (file_name, "rb");
21416   if (filedata->handle == NULL)
21417     {
21418       error (_("Input file '%s' is not readable.\n"), file_name);
21419       free (filedata);
21420       return FALSE;
21421     }
21422
21423   if (fread (armag, SARMAG, 1, filedata->handle) != 1)
21424     {
21425       error (_("%s: Failed to read file's magic number\n"), file_name);
21426       fclose (filedata->handle);
21427       free (filedata);
21428       return FALSE;
21429     }
21430
21431   filedata->file_size = (bfd_size_type) statbuf.st_size;
21432
21433   if (memcmp (armag, ARMAG, SARMAG) == 0)
21434     {
21435       if (! process_archive (filedata, FALSE))
21436         ret = FALSE;
21437     }
21438   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
21439     {
21440       if ( ! process_archive (filedata, TRUE))
21441         ret = FALSE;
21442     }
21443   else
21444     {
21445       if (do_archive_index && !check_all)
21446         error (_("File %s is not an archive so its index cannot be displayed.\n"),
21447                file_name);
21448
21449       rewind (filedata->handle);
21450       filedata->archive_file_size = filedata->archive_file_offset = 0;
21451
21452       if (! process_object (filedata))
21453         ret = FALSE;
21454     }
21455
21456   fclose (filedata->handle);
21457   free (filedata->section_headers);
21458   free (filedata->program_headers);
21459   free (filedata->string_table);
21460   free (filedata->dump.dump_sects);
21461   free (filedata);
21462
21463   free (ba_cache.strtab);
21464   ba_cache.strtab = NULL;
21465   free (ba_cache.symtab);
21466   ba_cache.symtab = NULL;
21467   ba_cache.filedata = NULL;
21468
21469   return ret;
21470 }
21471
21472 #ifdef SUPPORT_DISASSEMBLY
21473 /* Needed by the i386 disassembler.  For extra credit, someone could
21474    fix this so that we insert symbolic addresses here, esp for GOT/PLT
21475    symbols.  */
21476
21477 void
21478 print_address (unsigned int addr, FILE * outfile)
21479 {
21480   fprintf (outfile,"0x%8.8x", addr);
21481 }
21482
21483 /* Needed by the i386 disassembler.  */
21484
21485 void
21486 db_task_printsym (unsigned int addr)
21487 {
21488   print_address (addr, stderr);
21489 }
21490 #endif
21491
21492 int
21493 main (int argc, char ** argv)
21494 {
21495   int err;
21496
21497 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
21498   setlocale (LC_MESSAGES, "");
21499 #endif
21500 #if defined (HAVE_SETLOCALE)
21501   setlocale (LC_CTYPE, "");
21502 #endif
21503   bindtextdomain (PACKAGE, LOCALEDIR);
21504   textdomain (PACKAGE);
21505
21506   expandargv (&argc, &argv);
21507
21508   parse_args (& cmdline, argc, argv);
21509
21510   if (optind < (argc - 1))
21511     /* When displaying information for more than one file,
21512        prefix the information with the file name.  */
21513     show_name = TRUE;
21514   else if (optind >= argc)
21515     {
21516       /* Ensure that the warning is always displayed.  */
21517       do_checks = TRUE;
21518
21519       warn (_("Nothing to do.\n"));
21520       usage (stderr);
21521     }
21522
21523   err = FALSE;
21524   while (optind < argc)
21525     if (! process_file (argv[optind++]))
21526       err = TRUE;
21527
21528   free (cmdline.dump_sects);
21529
21530   free (dump_ctf_symtab_name);
21531   free (dump_ctf_strtab_name);
21532   free (dump_ctf_parent_name);
21533
21534   return err ? EXIT_FAILURE : EXIT_SUCCESS;
21535 }
This page took 1.316079 seconds and 4 git commands to generate.