Fix typo in NT_PPC_TM_CVSX note description
[external/binutils.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2    Copyright (C) 1998-2018 Free Software Foundation, Inc.
3
4    Originally developed by Eric Youngdale <eric@andante.jic.com>
5    Modifications by Nick Clifton <nickc@redhat.com>
6
7    This file is part of GNU Binutils.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22    02110-1301, USA.  */
23 \f
24 /* The difference between readelf and objdump:
25
26   Both programs are capable of displaying the contents of ELF format files,
27   so why does the binutils project have two file dumpers ?
28
29   The reason is that objdump sees an ELF file through a BFD filter of the
30   world; if BFD has a bug where, say, it disagrees about a machine constant
31   in e_flags, then the odds are good that it will remain internally
32   consistent.  The linker sees it the BFD way, objdump sees it the BFD way,
33   GAS sees it the BFD way.  There was need for a tool to go find out what
34   the file actually says.
35
36   This is why the readelf program does not link against the BFD library - it
37   exists as an independent program to help verify the correct working of BFD.
38
39   There is also the case that readelf can provide more information about an
40   ELF file than is provided by objdump.  In particular it can display DWARF
41   debugging information which (at the moment) objdump cannot.  */
42 \f
43 #include "sysdep.h"
44 #include <assert.h>
45 #include <time.h>
46 #include <zlib.h>
47 #ifdef HAVE_WCHAR_H
48 #include <wchar.h>
49 #endif
50
51 #if __GNUC__ >= 2
52 /* Define BFD64 here, even if our default architecture is 32 bit ELF
53    as this will allow us to read in and parse 64bit and 32bit ELF files.
54    Only do this if we believe that the compiler can support a 64 bit
55    data type.  For now we only rely on GCC being able to do this.  */
56 #define BFD64
57 #endif
58
59 #include "bfd.h"
60 #include "bucomm.h"
61 #include "elfcomm.h"
62 #include "dwarf.h"
63
64 #include "elf/common.h"
65 #include "elf/external.h"
66 #include "elf/internal.h"
67
68
69 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
70    we can obtain the H8 reloc numbers.  We need these for the
71    get_reloc_size() function.  We include h8.h again after defining
72    RELOC_MACROS_GEN_FUNC so that we get the naming function as well.  */
73
74 #include "elf/h8.h"
75 #undef _ELF_H8_H
76
77 /* Undo the effects of #including reloc-macros.h.  */
78
79 #undef START_RELOC_NUMBERS
80 #undef RELOC_NUMBER
81 #undef FAKE_RELOC
82 #undef EMPTY_RELOC
83 #undef END_RELOC_NUMBERS
84 #undef _RELOC_MACROS_H
85
86 /* The following headers use the elf/reloc-macros.h file to
87    automatically generate relocation recognition functions
88    such as elf_mips_reloc_type()  */
89
90 #define RELOC_MACROS_GEN_FUNC
91
92 #include "elf/aarch64.h"
93 #include "elf/alpha.h"
94 #include "elf/arc.h"
95 #include "elf/arm.h"
96 #include "elf/avr.h"
97 #include "elf/bfin.h"
98 #include "elf/cr16.h"
99 #include "elf/cris.h"
100 #include "elf/crx.h"
101 #include "elf/d10v.h"
102 #include "elf/d30v.h"
103 #include "elf/dlx.h"
104 #include "elf/epiphany.h"
105 #include "elf/fr30.h"
106 #include "elf/frv.h"
107 #include "elf/ft32.h"
108 #include "elf/h8.h"
109 #include "elf/hppa.h"
110 #include "elf/i386.h"
111 #include "elf/i370.h"
112 #include "elf/i860.h"
113 #include "elf/i960.h"
114 #include "elf/ia64.h"
115 #include "elf/ip2k.h"
116 #include "elf/lm32.h"
117 #include "elf/iq2000.h"
118 #include "elf/m32c.h"
119 #include "elf/m32r.h"
120 #include "elf/m68k.h"
121 #include "elf/m68hc11.h"
122 #include "elf/s12z.h"
123 #include "elf/mcore.h"
124 #include "elf/mep.h"
125 #include "elf/metag.h"
126 #include "elf/microblaze.h"
127 #include "elf/mips.h"
128 #include "elf/mmix.h"
129 #include "elf/mn10200.h"
130 #include "elf/mn10300.h"
131 #include "elf/moxie.h"
132 #include "elf/mt.h"
133 #include "elf/msp430.h"
134 #include "elf/nds32.h"
135 #include "elf/nfp.h"
136 #include "elf/nios2.h"
137 #include "elf/or1k.h"
138 #include "elf/pj.h"
139 #include "elf/ppc.h"
140 #include "elf/ppc64.h"
141 #include "elf/pru.h"
142 #include "elf/riscv.h"
143 #include "elf/rl78.h"
144 #include "elf/rx.h"
145 #include "elf/s390.h"
146 #include "elf/score.h"
147 #include "elf/sh.h"
148 #include "elf/sparc.h"
149 #include "elf/spu.h"
150 #include "elf/tic6x.h"
151 #include "elf/tilegx.h"
152 #include "elf/tilepro.h"
153 #include "elf/v850.h"
154 #include "elf/vax.h"
155 #include "elf/visium.h"
156 #include "elf/wasm32.h"
157 #include "elf/x86-64.h"
158 #include "elf/xc16x.h"
159 #include "elf/xgate.h"
160 #include "elf/xstormy16.h"
161 #include "elf/xtensa.h"
162
163 #include "getopt.h"
164 #include "libiberty.h"
165 #include "safe-ctype.h"
166 #include "filenames.h"
167
168 #ifndef offsetof
169 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
170 #endif
171
172 typedef struct elf_section_list
173 {
174   Elf_Internal_Shdr *        hdr;
175   struct elf_section_list *  next;
176 } elf_section_list;
177
178 /* Flag bits indicating particular types of dump.  */
179 #define HEX_DUMP        (1 << 0)        /* The -x command line switch.  */
180 #define DISASS_DUMP     (1 << 1)        /* The -i command line switch.  */
181 #define DEBUG_DUMP      (1 << 2)        /* The -w command line switch.  */
182 #define STRING_DUMP     (1 << 3)        /* The -p command line switch.  */
183 #define RELOC_DUMP      (1 << 4)        /* The -R command line switch.  */
184
185 typedef unsigned char dump_type;
186
187 /* A linked list of the section names for which dumps were requested.  */
188 struct dump_list_entry
189 {
190   char *                    name;
191   dump_type                 type;
192   struct dump_list_entry *  next;
193 };
194
195 typedef struct filedata
196 {
197   const char *         file_name;
198   FILE *               handle;
199   bfd_size_type        file_size;
200   Elf_Internal_Ehdr    file_header;
201   Elf_Internal_Shdr *  section_headers;
202   Elf_Internal_Phdr *  program_headers;
203   char *               string_table;
204   unsigned long        string_table_length;
205   /* A dynamic array of flags indicating for which sections a dump of
206      some kind has been requested.  It is reset on a per-object file
207      basis and then initialised from the cmdline_dump_sects array,
208      the results of interpreting the -w switch, and the
209      dump_sects_byname list.  */
210   dump_type *          dump_sects;
211   unsigned int         num_dump_sects;
212 } Filedata;
213
214 char * program_name = "readelf";
215
216 static unsigned long archive_file_offset;
217 static unsigned long archive_file_size;
218 static unsigned long dynamic_addr;
219 static bfd_size_type dynamic_size;
220 static size_t dynamic_nent;
221 static char * dynamic_strings;
222 static unsigned long dynamic_strings_length;
223 static unsigned long num_dynamic_syms;
224 static Elf_Internal_Sym * dynamic_symbols;
225 static Elf_Internal_Syminfo * dynamic_syminfo;
226 static unsigned long dynamic_syminfo_offset;
227 static unsigned int dynamic_syminfo_nent;
228 static char program_interpreter[PATH_MAX];
229 static bfd_vma dynamic_info[DT_ENCODING];
230 static bfd_vma dynamic_info_DT_GNU_HASH;
231 static bfd_vma version_info[16];
232 static Elf_Internal_Dyn *  dynamic_section;
233 static elf_section_list * symtab_shndx_list;
234 static bfd_boolean show_name = FALSE;
235 static bfd_boolean do_dynamic = FALSE;
236 static bfd_boolean do_syms = FALSE;
237 static bfd_boolean do_dyn_syms = FALSE;
238 static bfd_boolean do_reloc = FALSE;
239 static bfd_boolean do_sections = FALSE;
240 static bfd_boolean do_section_groups = FALSE;
241 static bfd_boolean do_section_details = FALSE;
242 static bfd_boolean do_segments = FALSE;
243 static bfd_boolean do_unwind = FALSE;
244 static bfd_boolean do_using_dynamic = FALSE;
245 static bfd_boolean do_header = FALSE;
246 static bfd_boolean do_dump = FALSE;
247 static bfd_boolean do_version = FALSE;
248 static bfd_boolean do_histogram = FALSE;
249 static bfd_boolean do_debugging = FALSE;
250 static bfd_boolean do_arch = FALSE;
251 static bfd_boolean do_notes = FALSE;
252 static bfd_boolean do_archive_index = FALSE;
253 static bfd_boolean is_32bit_elf = FALSE;
254 static bfd_boolean decompress_dumps = FALSE;
255
256 struct group_list
257 {
258   struct group_list *  next;
259   unsigned int         section_index;
260 };
261
262 struct group
263 {
264   struct group_list *  root;
265   unsigned int         group_index;
266 };
267
268 static size_t           group_count;
269 static struct group *   section_groups;
270 static struct group **  section_headers_groups;
271
272 /* A dynamic array of flags indicating for which sections a dump
273    has been requested via command line switches.  */
274 static Filedata         cmdline;
275
276 static struct dump_list_entry * dump_sects_byname;
277
278 /* How to print a vma value.  */
279 typedef enum print_mode
280 {
281   HEX,
282   DEC,
283   DEC_5,
284   UNSIGNED,
285   PREFIX_HEX,
286   FULL_HEX,
287   LONG_HEX
288 }
289 print_mode;
290
291 /* Versioned symbol info.  */
292 enum versioned_symbol_info
293 {
294   symbol_undefined,
295   symbol_hidden,
296   symbol_public
297 };
298
299 static const char * get_symbol_version_string
300   (Filedata *, bfd_boolean, const char *, unsigned long, unsigned,
301    Elf_Internal_Sym *, enum versioned_symbol_info *, unsigned short *);
302
303 #define UNKNOWN -1
304
305 #define SECTION_NAME(X)                                         \
306   ((X) == NULL ? _("<none>")                                    \
307    : filedata->string_table == NULL ? _("<no-strings>")         \
308    : ((X)->sh_name >= filedata->string_table_length ? _("<corrupt>")    \
309   : filedata->string_table + (X)->sh_name))
310
311 #define DT_VERSIONTAGIDX(tag)   (DT_VERNEEDNUM - (tag)) /* Reverse order!  */
312
313 #define GET_ELF_SYMBOLS(file, section, sym_count)                       \
314   (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count)      \
315    : get_64bit_elf_symbols (file, section, sym_count))
316
317 #define VALID_DYNAMIC_NAME(offset)      ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
318 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
319    already been called and verified that the string exists.  */
320 #define GET_DYNAMIC_NAME(offset)        (dynamic_strings + offset)
321
322 #define REMOVE_ARCH_BITS(ADDR)                  \
323   do                                            \
324     {                                           \
325       if (filedata->file_header.e_machine == EM_ARM)    \
326         (ADDR) &= ~1;                           \
327     }                                           \
328   while (0)
329 \f
330 /* Print a BFD_VMA to an internal buffer, for use in error messages.
331    BFD_FMA_FMT can't be used in translated strings.  */
332
333 static const char *
334 bfd_vmatoa (char *fmtch, bfd_vma value)
335 {
336   /* bfd_vmatoa is used more then once in a printf call for output.
337      Cycle through an array of buffers.  */
338   static int buf_pos = 0;
339   static struct bfd_vmatoa_buf
340   {
341     char place[64];
342   } buf[4];
343   char *ret;
344   char fmt[32];
345
346   ret = buf[buf_pos++].place;
347   buf_pos %= ARRAY_SIZE (buf);
348
349   sprintf (fmt, "%%%s%s", BFD_VMA_FMT, fmtch);
350   snprintf (ret, sizeof (buf[0].place), fmt, value);
351   return ret;
352 }
353
354 /* Retrieve NMEMB structures, each SIZE bytes long from FILEDATA starting at
355    OFFSET + the offset of the current archive member, if we are examining an
356    archive.  Put the retrieved data into VAR, if it is not NULL.  Otherwise
357    allocate a buffer using malloc and fill that.  In either case return the
358    pointer to the start of the retrieved data or NULL if something went wrong.
359    If something does go wrong and REASON is not NULL then emit an error
360    message using REASON as part of the context.  */
361
362 static void *
363 get_data (void *         var,
364           Filedata *     filedata,
365           unsigned long  offset,
366           bfd_size_type  size,
367           bfd_size_type  nmemb,
368           const char *   reason)
369 {
370   void * mvar;
371   bfd_size_type amt = size * nmemb;
372
373   if (size == 0 || nmemb == 0)
374     return NULL;
375
376   /* If the size_t type is smaller than the bfd_size_type, eg because
377      you are building a 32-bit tool on a 64-bit host, then make sure
378      that when the sizes are cast to (size_t) no information is lost.  */
379   if (sizeof (size_t) < sizeof (bfd_size_type)
380       && (   (bfd_size_type) ((size_t) size) != size
381           || (bfd_size_type) ((size_t) nmemb) != nmemb))
382     {
383       if (reason)
384         error (_("Size truncation prevents reading %s"
385                  " elements of size %s for %s\n"),
386                bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
387       return NULL;
388     }
389
390   /* Check for size overflow.  */
391   if (amt < nmemb)
392     {
393       if (reason)
394         error (_("Size overflow prevents reading %s"
395                  " elements of size %s for %s\n"),
396                bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
397       return NULL;
398     }
399
400   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
401      attempting to allocate memory when the read is bound to fail.  */
402   if (amt > filedata->file_size
403       || offset + archive_file_offset + amt > filedata->file_size)
404     {
405       if (reason)
406         error (_("Reading %s bytes extends past end of file for %s\n"),
407                bfd_vmatoa ("u", amt), reason);
408       return NULL;
409     }
410
411   if (fseek (filedata->handle, archive_file_offset + offset, SEEK_SET))
412     {
413       if (reason)
414         error (_("Unable to seek to 0x%lx for %s\n"),
415                archive_file_offset + offset, reason);
416       return NULL;
417     }
418
419   mvar = var;
420   if (mvar == NULL)
421     {
422       /* Check for overflow.  */
423       if (nmemb < (~(bfd_size_type) 0 - 1) / size)
424         /* + 1 so that we can '\0' terminate invalid string table sections.  */
425         mvar = malloc ((size_t) amt + 1);
426
427       if (mvar == NULL)
428         {
429           if (reason)
430             error (_("Out of memory allocating %s bytes for %s\n"),
431                    bfd_vmatoa ("u", amt), reason);
432           return NULL;
433         }
434
435       ((char *) mvar)[amt] = '\0';
436     }
437
438   if (fread (mvar, (size_t) size, (size_t) nmemb, filedata->handle) != nmemb)
439     {
440       if (reason)
441         error (_("Unable to read in %s bytes of %s\n"),
442                bfd_vmatoa ("u", amt), reason);
443       if (mvar != var)
444         free (mvar);
445       return NULL;
446     }
447
448   return mvar;
449 }
450
451 /* Print a VMA value in the MODE specified.
452    Returns the number of characters displayed.  */
453
454 static unsigned int
455 print_vma (bfd_vma vma, print_mode mode)
456 {
457   unsigned int nc = 0;
458
459   switch (mode)
460     {
461     case FULL_HEX:
462       nc = printf ("0x");
463       /* Fall through.  */
464     case LONG_HEX:
465 #ifdef BFD64
466       if (is_32bit_elf)
467         return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
468 #endif
469       printf_vma (vma);
470       return nc + 16;
471
472     case DEC_5:
473       if (vma <= 99999)
474         return printf ("%5" BFD_VMA_FMT "d", vma);
475       /* Fall through.  */
476     case PREFIX_HEX:
477       nc = printf ("0x");
478       /* Fall through.  */
479     case HEX:
480       return nc + printf ("%" BFD_VMA_FMT "x", vma);
481
482     case DEC:
483       return printf ("%" BFD_VMA_FMT "d", vma);
484
485     case UNSIGNED:
486       return printf ("%" BFD_VMA_FMT "u", vma);
487
488     default:
489       /* FIXME: Report unrecognised mode ?  */
490       return 0;
491     }
492 }
493
494 /* Display a symbol on stdout.  Handles the display of control characters and
495    multibye characters (assuming the host environment supports them).
496
497    Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
498
499    If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
500    padding as necessary.
501
502    Returns the number of emitted characters.  */
503
504 static unsigned int
505 print_symbol (signed int width, const char *symbol)
506 {
507   bfd_boolean extra_padding = FALSE;
508   signed int num_printed = 0;
509 #ifdef HAVE_MBSTATE_T
510   mbstate_t state;
511 #endif
512   unsigned int width_remaining;
513
514   if (width < 0)
515     {
516       /* Keep the width positive.  This helps the code below.  */
517       width = - width;
518       extra_padding = TRUE;
519     }
520   else if (width == 0)
521     return 0;
522
523   if (do_wide)
524     /* Set the remaining width to a very large value.
525        This simplifies the code below.  */
526     width_remaining = INT_MAX;
527   else
528     width_remaining = width;
529
530 #ifdef HAVE_MBSTATE_T
531   /* Initialise the multibyte conversion state.  */
532   memset (& state, 0, sizeof (state));
533 #endif
534
535   while (width_remaining)
536     {
537       size_t  n;
538       const char c = *symbol++;
539
540       if (c == 0)
541         break;
542
543       /* Do not print control characters directly as they can affect terminal
544          settings.  Such characters usually appear in the names generated
545          by the assembler for local labels.  */
546       if (ISCNTRL (c))
547         {
548           if (width_remaining < 2)
549             break;
550
551           printf ("^%c", c + 0x40);
552           width_remaining -= 2;
553           num_printed += 2;
554         }
555       else if (ISPRINT (c))
556         {
557           putchar (c);
558           width_remaining --;
559           num_printed ++;
560         }
561       else
562         {
563 #ifdef HAVE_MBSTATE_T
564           wchar_t w;
565 #endif
566           /* Let printf do the hard work of displaying multibyte characters.  */
567           printf ("%.1s", symbol - 1);
568           width_remaining --;
569           num_printed ++;
570
571 #ifdef HAVE_MBSTATE_T
572           /* Try to find out how many bytes made up the character that was
573              just printed.  Advance the symbol pointer past the bytes that
574              were displayed.  */
575           n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
576 #else
577           n = 1;
578 #endif
579           if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
580             symbol += (n - 1);
581         }
582     }
583
584   if (extra_padding && num_printed < width)
585     {
586       /* Fill in the remaining spaces.  */
587       printf ("%-*s", width - num_printed, " ");
588       num_printed = width;
589     }
590
591   return num_printed;
592 }
593
594 /* Returns a pointer to a static buffer containing a printable version of
595    the given section's name.  Like print_symbol, except that it does not try
596    to print multibyte characters, it just interprets them as hex values.  */
597
598 static const char *
599 printable_section_name (Filedata * filedata, const Elf_Internal_Shdr * sec)
600 {
601 #define MAX_PRINT_SEC_NAME_LEN 128
602   static char  sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
603   const char * name = SECTION_NAME (sec);
604   char *       buf = sec_name_buf;
605   char         c;
606   unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
607
608   while ((c = * name ++) != 0)
609     {
610       if (ISCNTRL (c))
611         {
612           if (remaining < 2)
613             break;
614
615           * buf ++ = '^';
616           * buf ++ = c + 0x40;
617           remaining -= 2;
618         }
619       else if (ISPRINT (c))
620         {
621           * buf ++ = c;
622           remaining -= 1;
623         }
624       else
625         {
626           static char hex[17] = "0123456789ABCDEF";
627
628           if (remaining < 4)
629             break;
630           * buf ++ = '<';
631           * buf ++ = hex[(c & 0xf0) >> 4];
632           * buf ++ = hex[c & 0x0f];
633           * buf ++ = '>';
634           remaining -= 4;
635         }
636
637       if (remaining == 0)
638         break;
639     }
640
641   * buf = 0;
642   return sec_name_buf;
643 }
644
645 static const char *
646 printable_section_name_from_index (Filedata * filedata, unsigned long ndx)
647 {
648   if (ndx >= filedata->file_header.e_shnum)
649     return _("<corrupt>");
650
651   return printable_section_name (filedata, filedata->section_headers + ndx);
652 }
653
654 /* Return a pointer to section NAME, or NULL if no such section exists.  */
655
656 static Elf_Internal_Shdr *
657 find_section (Filedata * filedata, const char * name)
658 {
659   unsigned int i;
660
661   if (filedata->section_headers == NULL)
662     return NULL;
663
664   for (i = 0; i < filedata->file_header.e_shnum; i++)
665     if (streq (SECTION_NAME (filedata->section_headers + i), name))
666       return filedata->section_headers + i;
667
668   return NULL;
669 }
670
671 /* Return a pointer to a section containing ADDR, or NULL if no such
672    section exists.  */
673
674 static Elf_Internal_Shdr *
675 find_section_by_address (Filedata * filedata, bfd_vma addr)
676 {
677   unsigned int i;
678
679   if (filedata->section_headers == NULL)
680     return NULL;
681
682   for (i = 0; i < filedata->file_header.e_shnum; i++)
683     {
684       Elf_Internal_Shdr *sec = filedata->section_headers + i;
685
686       if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
687         return sec;
688     }
689
690   return NULL;
691 }
692
693 static Elf_Internal_Shdr *
694 find_section_by_type (Filedata * filedata, unsigned int type)
695 {
696   unsigned int i;
697
698   if (filedata->section_headers == NULL)
699     return NULL;
700
701   for (i = 0; i < filedata->file_header.e_shnum; i++)
702     {
703       Elf_Internal_Shdr *sec = filedata->section_headers + i;
704
705       if (sec->sh_type == type)
706         return sec;
707     }
708
709   return NULL;
710 }
711
712 /* Return a pointer to section NAME, or NULL if no such section exists,
713    restricted to the list of sections given in SET.  */
714
715 static Elf_Internal_Shdr *
716 find_section_in_set (Filedata * filedata, const char * name, unsigned int * set)
717 {
718   unsigned int i;
719
720   if (filedata->section_headers == NULL)
721     return NULL;
722
723   if (set != NULL)
724     {
725       while ((i = *set++) > 0)
726         {
727           /* See PR 21156 for a reproducer.  */
728           if (i >= filedata->file_header.e_shnum)
729             continue; /* FIXME: Should we issue an error message ?  */
730
731           if (streq (SECTION_NAME (filedata->section_headers + i), name))
732             return filedata->section_headers + i;
733         }
734     }
735
736   return find_section (filedata, name);
737 }
738
739 /* Read an unsigned LEB128 encoded value from DATA.
740    Set *LENGTH_RETURN to the number of bytes read.  */
741
742 static inline unsigned long
743 read_uleb128 (unsigned char * data,
744               unsigned int * length_return,
745               const unsigned char * const end)
746 {
747   return read_leb128 (data, length_return, FALSE, end);
748 }
749
750 /* Return TRUE if the current file is for IA-64 machine and OpenVMS ABI.
751    This OS has so many departures from the ELF standard that we test it at
752    many places.  */
753
754 static inline bfd_boolean
755 is_ia64_vms (Filedata * filedata)
756 {
757   return filedata->file_header.e_machine == EM_IA_64
758     && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
759 }
760
761 /* Guess the relocation size commonly used by the specific machines.  */
762
763 static bfd_boolean
764 guess_is_rela (unsigned int e_machine)
765 {
766   switch (e_machine)
767     {
768       /* Targets that use REL relocations.  */
769     case EM_386:
770     case EM_IAMCU:
771     case EM_960:
772     case EM_ARM:
773     case EM_D10V:
774     case EM_CYGNUS_D10V:
775     case EM_DLX:
776     case EM_MIPS:
777     case EM_MIPS_RS3_LE:
778     case EM_CYGNUS_M32R:
779     case EM_SCORE:
780     case EM_XGATE:
781     case EM_NFP:
782       return FALSE;
783
784       /* Targets that use RELA relocations.  */
785     case EM_68K:
786     case EM_860:
787     case EM_AARCH64:
788     case EM_ADAPTEVA_EPIPHANY:
789     case EM_ALPHA:
790     case EM_ALTERA_NIOS2:
791     case EM_ARC:
792     case EM_ARC_COMPACT:
793     case EM_ARC_COMPACT2:
794     case EM_AVR:
795     case EM_AVR_OLD:
796     case EM_BLACKFIN:
797     case EM_CR16:
798     case EM_CRIS:
799     case EM_CRX:
800     case EM_D30V:
801     case EM_CYGNUS_D30V:
802     case EM_FR30:
803     case EM_FT32:
804     case EM_CYGNUS_FR30:
805     case EM_CYGNUS_FRV:
806     case EM_H8S:
807     case EM_H8_300:
808     case EM_H8_300H:
809     case EM_IA_64:
810     case EM_IP2K:
811     case EM_IP2K_OLD:
812     case EM_IQ2000:
813     case EM_LATTICEMICO32:
814     case EM_M32C_OLD:
815     case EM_M32C:
816     case EM_M32R:
817     case EM_MCORE:
818     case EM_CYGNUS_MEP:
819     case EM_METAG:
820     case EM_MMIX:
821     case EM_MN10200:
822     case EM_CYGNUS_MN10200:
823     case EM_MN10300:
824     case EM_CYGNUS_MN10300:
825     case EM_MOXIE:
826     case EM_MSP430:
827     case EM_MSP430_OLD:
828     case EM_MT:
829     case EM_NDS32:
830     case EM_NIOS32:
831     case EM_OR1K:
832     case EM_PPC64:
833     case EM_PPC:
834     case EM_TI_PRU:
835     case EM_RISCV:
836     case EM_RL78:
837     case EM_RX:
838     case EM_S390:
839     case EM_S390_OLD:
840     case EM_SH:
841     case EM_SPARC:
842     case EM_SPARC32PLUS:
843     case EM_SPARCV9:
844     case EM_SPU:
845     case EM_TI_C6000:
846     case EM_TILEGX:
847     case EM_TILEPRO:
848     case EM_V800:
849     case EM_V850:
850     case EM_CYGNUS_V850:
851     case EM_VAX:
852     case EM_VISIUM:
853     case EM_X86_64:
854     case EM_L1OM:
855     case EM_K1OM:
856     case EM_XSTORMY16:
857     case EM_XTENSA:
858     case EM_XTENSA_OLD:
859     case EM_MICROBLAZE:
860     case EM_MICROBLAZE_OLD:
861     case EM_WEBASSEMBLY:
862       return TRUE;
863
864     case EM_68HC05:
865     case EM_68HC08:
866     case EM_68HC11:
867     case EM_68HC16:
868     case EM_FX66:
869     case EM_ME16:
870     case EM_MMA:
871     case EM_NCPU:
872     case EM_NDR1:
873     case EM_PCP:
874     case EM_ST100:
875     case EM_ST19:
876     case EM_ST7:
877     case EM_ST9PLUS:
878     case EM_STARCORE:
879     case EM_SVX:
880     case EM_TINYJ:
881     default:
882       warn (_("Don't know about relocations on this machine architecture\n"));
883       return FALSE;
884     }
885 }
886
887 /* Load RELA type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
888    Returns TRUE upon success, FALSE otherwise.  If successful then a
889    pointer to a malloc'ed buffer containing the relocs is placed in *RELASP,
890    and the number of relocs loaded is placed in *NRELASP.  It is the caller's
891    responsibility to free the allocated buffer.  */
892
893 static bfd_boolean
894 slurp_rela_relocs (Filedata *            filedata,
895                    unsigned long         rel_offset,
896                    unsigned long         rel_size,
897                    Elf_Internal_Rela **  relasp,
898                    unsigned long *       nrelasp)
899 {
900   Elf_Internal_Rela * relas;
901   size_t nrelas;
902   unsigned int i;
903
904   if (is_32bit_elf)
905     {
906       Elf32_External_Rela * erelas;
907
908       erelas = (Elf32_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
909                                                  rel_size, _("32-bit relocation data"));
910       if (!erelas)
911         return FALSE;
912
913       nrelas = rel_size / sizeof (Elf32_External_Rela);
914
915       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
916                                              sizeof (Elf_Internal_Rela));
917
918       if (relas == NULL)
919         {
920           free (erelas);
921           error (_("out of memory parsing relocs\n"));
922           return FALSE;
923         }
924
925       for (i = 0; i < nrelas; i++)
926         {
927           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
928           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
929           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
930         }
931
932       free (erelas);
933     }
934   else
935     {
936       Elf64_External_Rela * erelas;
937
938       erelas = (Elf64_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
939                                                  rel_size, _("64-bit relocation data"));
940       if (!erelas)
941         return FALSE;
942
943       nrelas = rel_size / sizeof (Elf64_External_Rela);
944
945       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
946                                              sizeof (Elf_Internal_Rela));
947
948       if (relas == NULL)
949         {
950           free (erelas);
951           error (_("out of memory parsing relocs\n"));
952           return FALSE;
953         }
954
955       for (i = 0; i < nrelas; i++)
956         {
957           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
958           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
959           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
960
961           /* The #ifdef BFD64 below is to prevent a compile time
962              warning.  We know that if we do not have a 64 bit data
963              type that we will never execute this code anyway.  */
964 #ifdef BFD64
965           if (filedata->file_header.e_machine == EM_MIPS
966               && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
967             {
968               /* In little-endian objects, r_info isn't really a
969                  64-bit little-endian value: it has a 32-bit
970                  little-endian symbol index followed by four
971                  individual byte fields.  Reorder INFO
972                  accordingly.  */
973               bfd_vma inf = relas[i].r_info;
974               inf = (((inf & 0xffffffff) << 32)
975                       | ((inf >> 56) & 0xff)
976                       | ((inf >> 40) & 0xff00)
977                       | ((inf >> 24) & 0xff0000)
978                       | ((inf >> 8) & 0xff000000));
979               relas[i].r_info = inf;
980             }
981 #endif /* BFD64 */
982         }
983
984       free (erelas);
985     }
986
987   *relasp = relas;
988   *nrelasp = nrelas;
989   return TRUE;
990 }
991
992 /* Load REL type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
993    Returns TRUE upon success, FALSE otherwise.  If successful then a
994    pointer to a malloc'ed buffer containing the relocs is placed in *RELSP,
995    and the number of relocs loaded is placed in *NRELSP.  It is the caller's
996    responsibility to free the allocated buffer.  */
997
998 static bfd_boolean
999 slurp_rel_relocs (Filedata *            filedata,
1000                   unsigned long         rel_offset,
1001                   unsigned long         rel_size,
1002                   Elf_Internal_Rela **  relsp,
1003                   unsigned long *       nrelsp)
1004 {
1005   Elf_Internal_Rela * rels;
1006   size_t nrels;
1007   unsigned int i;
1008
1009   if (is_32bit_elf)
1010     {
1011       Elf32_External_Rel * erels;
1012
1013       erels = (Elf32_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1014                                                rel_size, _("32-bit relocation data"));
1015       if (!erels)
1016         return FALSE;
1017
1018       nrels = rel_size / sizeof (Elf32_External_Rel);
1019
1020       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1021
1022       if (rels == NULL)
1023         {
1024           free (erels);
1025           error (_("out of memory parsing relocs\n"));
1026           return FALSE;
1027         }
1028
1029       for (i = 0; i < nrels; i++)
1030         {
1031           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1032           rels[i].r_info   = BYTE_GET (erels[i].r_info);
1033           rels[i].r_addend = 0;
1034         }
1035
1036       free (erels);
1037     }
1038   else
1039     {
1040       Elf64_External_Rel * erels;
1041
1042       erels = (Elf64_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1043                                                rel_size, _("64-bit relocation data"));
1044       if (!erels)
1045         return FALSE;
1046
1047       nrels = rel_size / sizeof (Elf64_External_Rel);
1048
1049       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1050
1051       if (rels == NULL)
1052         {
1053           free (erels);
1054           error (_("out of memory parsing relocs\n"));
1055           return FALSE;
1056         }
1057
1058       for (i = 0; i < nrels; i++)
1059         {
1060           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1061           rels[i].r_info   = BYTE_GET (erels[i].r_info);
1062           rels[i].r_addend = 0;
1063
1064           /* The #ifdef BFD64 below is to prevent a compile time
1065              warning.  We know that if we do not have a 64 bit data
1066              type that we will never execute this code anyway.  */
1067 #ifdef BFD64
1068           if (filedata->file_header.e_machine == EM_MIPS
1069               && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
1070             {
1071               /* In little-endian objects, r_info isn't really a
1072                  64-bit little-endian value: it has a 32-bit
1073                  little-endian symbol index followed by four
1074                  individual byte fields.  Reorder INFO
1075                  accordingly.  */
1076               bfd_vma inf = rels[i].r_info;
1077               inf = (((inf & 0xffffffff) << 32)
1078                      | ((inf >> 56) & 0xff)
1079                      | ((inf >> 40) & 0xff00)
1080                      | ((inf >> 24) & 0xff0000)
1081                      | ((inf >> 8) & 0xff000000));
1082               rels[i].r_info = inf;
1083             }
1084 #endif /* BFD64 */
1085         }
1086
1087       free (erels);
1088     }
1089
1090   *relsp = rels;
1091   *nrelsp = nrels;
1092   return TRUE;
1093 }
1094
1095 /* Returns the reloc type extracted from the reloc info field.  */
1096
1097 static unsigned int
1098 get_reloc_type (Filedata * filedata, bfd_vma reloc_info)
1099 {
1100   if (is_32bit_elf)
1101     return ELF32_R_TYPE (reloc_info);
1102
1103   switch (filedata->file_header.e_machine)
1104     {
1105     case EM_MIPS:
1106       /* Note: We assume that reloc_info has already been adjusted for us.  */
1107       return ELF64_MIPS_R_TYPE (reloc_info);
1108
1109     case EM_SPARCV9:
1110       return ELF64_R_TYPE_ID (reloc_info);
1111
1112     default:
1113       return ELF64_R_TYPE (reloc_info);
1114     }
1115 }
1116
1117 /* Return the symbol index extracted from the reloc info field.  */
1118
1119 static bfd_vma
1120 get_reloc_symindex (bfd_vma reloc_info)
1121 {
1122   return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1123 }
1124
1125 static inline bfd_boolean
1126 uses_msp430x_relocs (Filedata * filedata)
1127 {
1128   return
1129     filedata->file_header.e_machine == EM_MSP430 /* Paranoia.  */
1130     /* GCC uses osabi == ELFOSBI_STANDALONE.  */
1131     && (((filedata->file_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1132         /* TI compiler uses ELFOSABI_NONE.  */
1133         || (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1134 }
1135
1136 /* Display the contents of the relocation data found at the specified
1137    offset.  */
1138
1139 static bfd_boolean
1140 dump_relocations (Filedata *          filedata,
1141                   unsigned long       rel_offset,
1142                   unsigned long       rel_size,
1143                   Elf_Internal_Sym *  symtab,
1144                   unsigned long       nsyms,
1145                   char *              strtab,
1146                   unsigned long       strtablen,
1147                   int                 is_rela,
1148                   bfd_boolean         is_dynsym)
1149 {
1150   unsigned long i;
1151   Elf_Internal_Rela * rels;
1152   bfd_boolean res = TRUE;
1153
1154   if (is_rela == UNKNOWN)
1155     is_rela = guess_is_rela (filedata->file_header.e_machine);
1156
1157   if (is_rela)
1158     {
1159       if (!slurp_rela_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1160         return FALSE;
1161     }
1162   else
1163     {
1164       if (!slurp_rel_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1165         return FALSE;
1166     }
1167
1168   if (is_32bit_elf)
1169     {
1170       if (is_rela)
1171         {
1172           if (do_wide)
1173             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name + Addend\n"));
1174           else
1175             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name + Addend\n"));
1176         }
1177       else
1178         {
1179           if (do_wide)
1180             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name\n"));
1181           else
1182             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name\n"));
1183         }
1184     }
1185   else
1186     {
1187       if (is_rela)
1188         {
1189           if (do_wide)
1190             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend\n"));
1191           else
1192             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name + Addend\n"));
1193         }
1194       else
1195         {
1196           if (do_wide)
1197             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name\n"));
1198           else
1199             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name\n"));
1200         }
1201     }
1202
1203   for (i = 0; i < rel_size; i++)
1204     {
1205       const char * rtype;
1206       bfd_vma offset;
1207       bfd_vma inf;
1208       bfd_vma symtab_index;
1209       bfd_vma type;
1210
1211       offset = rels[i].r_offset;
1212       inf    = rels[i].r_info;
1213
1214       type = get_reloc_type (filedata, inf);
1215       symtab_index = get_reloc_symindex  (inf);
1216
1217       if (is_32bit_elf)
1218         {
1219           printf ("%8.8lx  %8.8lx ",
1220                   (unsigned long) offset & 0xffffffff,
1221                   (unsigned long) inf & 0xffffffff);
1222         }
1223       else
1224         {
1225 #if BFD_HOST_64BIT_LONG
1226           printf (do_wide
1227                   ? "%16.16lx  %16.16lx "
1228                   : "%12.12lx  %12.12lx ",
1229                   offset, inf);
1230 #elif BFD_HOST_64BIT_LONG_LONG
1231 #ifndef __MSVCRT__
1232           printf (do_wide
1233                   ? "%16.16llx  %16.16llx "
1234                   : "%12.12llx  %12.12llx ",
1235                   offset, inf);
1236 #else
1237           printf (do_wide
1238                   ? "%16.16I64x  %16.16I64x "
1239                   : "%12.12I64x  %12.12I64x ",
1240                   offset, inf);
1241 #endif
1242 #else
1243           printf (do_wide
1244                   ? "%8.8lx%8.8lx  %8.8lx%8.8lx "
1245                   : "%4.4lx%8.8lx  %4.4lx%8.8lx ",
1246                   _bfd_int64_high (offset),
1247                   _bfd_int64_low (offset),
1248                   _bfd_int64_high (inf),
1249                   _bfd_int64_low (inf));
1250 #endif
1251         }
1252
1253       switch (filedata->file_header.e_machine)
1254         {
1255         default:
1256           rtype = NULL;
1257           break;
1258
1259         case EM_AARCH64:
1260           rtype = elf_aarch64_reloc_type (type);
1261           break;
1262
1263         case EM_M32R:
1264         case EM_CYGNUS_M32R:
1265           rtype = elf_m32r_reloc_type (type);
1266           break;
1267
1268         case EM_386:
1269         case EM_IAMCU:
1270           rtype = elf_i386_reloc_type (type);
1271           break;
1272
1273         case EM_68HC11:
1274         case EM_68HC12:
1275           rtype = elf_m68hc11_reloc_type (type);
1276           break;
1277
1278         case EM_S12Z:
1279           rtype = elf_s12z_reloc_type (type);
1280           break;
1281
1282         case EM_68K:
1283           rtype = elf_m68k_reloc_type (type);
1284           break;
1285
1286         case EM_960:
1287           rtype = elf_i960_reloc_type (type);
1288           break;
1289
1290         case EM_AVR:
1291         case EM_AVR_OLD:
1292           rtype = elf_avr_reloc_type (type);
1293           break;
1294
1295         case EM_OLD_SPARCV9:
1296         case EM_SPARC32PLUS:
1297         case EM_SPARCV9:
1298         case EM_SPARC:
1299           rtype = elf_sparc_reloc_type (type);
1300           break;
1301
1302         case EM_SPU:
1303           rtype = elf_spu_reloc_type (type);
1304           break;
1305
1306         case EM_V800:
1307           rtype = v800_reloc_type (type);
1308           break;
1309         case EM_V850:
1310         case EM_CYGNUS_V850:
1311           rtype = v850_reloc_type (type);
1312           break;
1313
1314         case EM_D10V:
1315         case EM_CYGNUS_D10V:
1316           rtype = elf_d10v_reloc_type (type);
1317           break;
1318
1319         case EM_D30V:
1320         case EM_CYGNUS_D30V:
1321           rtype = elf_d30v_reloc_type (type);
1322           break;
1323
1324         case EM_DLX:
1325           rtype = elf_dlx_reloc_type (type);
1326           break;
1327
1328         case EM_SH:
1329           rtype = elf_sh_reloc_type (type);
1330           break;
1331
1332         case EM_MN10300:
1333         case EM_CYGNUS_MN10300:
1334           rtype = elf_mn10300_reloc_type (type);
1335           break;
1336
1337         case EM_MN10200:
1338         case EM_CYGNUS_MN10200:
1339           rtype = elf_mn10200_reloc_type (type);
1340           break;
1341
1342         case EM_FR30:
1343         case EM_CYGNUS_FR30:
1344           rtype = elf_fr30_reloc_type (type);
1345           break;
1346
1347         case EM_CYGNUS_FRV:
1348           rtype = elf_frv_reloc_type (type);
1349           break;
1350
1351         case EM_FT32:
1352           rtype = elf_ft32_reloc_type (type);
1353           break;
1354
1355         case EM_MCORE:
1356           rtype = elf_mcore_reloc_type (type);
1357           break;
1358
1359         case EM_MMIX:
1360           rtype = elf_mmix_reloc_type (type);
1361           break;
1362
1363         case EM_MOXIE:
1364           rtype = elf_moxie_reloc_type (type);
1365           break;
1366
1367         case EM_MSP430:
1368           if (uses_msp430x_relocs (filedata))
1369             {
1370               rtype = elf_msp430x_reloc_type (type);
1371               break;
1372             }
1373           /* Fall through.  */
1374         case EM_MSP430_OLD:
1375           rtype = elf_msp430_reloc_type (type);
1376           break;
1377
1378         case EM_NDS32:
1379           rtype = elf_nds32_reloc_type (type);
1380           break;
1381
1382         case EM_PPC:
1383           rtype = elf_ppc_reloc_type (type);
1384           break;
1385
1386         case EM_PPC64:
1387           rtype = elf_ppc64_reloc_type (type);
1388           break;
1389
1390         case EM_MIPS:
1391         case EM_MIPS_RS3_LE:
1392           rtype = elf_mips_reloc_type (type);
1393           break;
1394
1395         case EM_RISCV:
1396           rtype = elf_riscv_reloc_type (type);
1397           break;
1398
1399         case EM_ALPHA:
1400           rtype = elf_alpha_reloc_type (type);
1401           break;
1402
1403         case EM_ARM:
1404           rtype = elf_arm_reloc_type (type);
1405           break;
1406
1407         case EM_ARC:
1408         case EM_ARC_COMPACT:
1409         case EM_ARC_COMPACT2:
1410           rtype = elf_arc_reloc_type (type);
1411           break;
1412
1413         case EM_PARISC:
1414           rtype = elf_hppa_reloc_type (type);
1415           break;
1416
1417         case EM_H8_300:
1418         case EM_H8_300H:
1419         case EM_H8S:
1420           rtype = elf_h8_reloc_type (type);
1421           break;
1422
1423         case EM_OR1K:
1424           rtype = elf_or1k_reloc_type (type);
1425           break;
1426
1427         case EM_PJ:
1428         case EM_PJ_OLD:
1429           rtype = elf_pj_reloc_type (type);
1430           break;
1431         case EM_IA_64:
1432           rtype = elf_ia64_reloc_type (type);
1433           break;
1434
1435         case EM_CRIS:
1436           rtype = elf_cris_reloc_type (type);
1437           break;
1438
1439         case EM_860:
1440           rtype = elf_i860_reloc_type (type);
1441           break;
1442
1443         case EM_X86_64:
1444         case EM_L1OM:
1445         case EM_K1OM:
1446           rtype = elf_x86_64_reloc_type (type);
1447           break;
1448
1449         case EM_S370:
1450           rtype = i370_reloc_type (type);
1451           break;
1452
1453         case EM_S390_OLD:
1454         case EM_S390:
1455           rtype = elf_s390_reloc_type (type);
1456           break;
1457
1458         case EM_SCORE:
1459           rtype = elf_score_reloc_type (type);
1460           break;
1461
1462         case EM_XSTORMY16:
1463           rtype = elf_xstormy16_reloc_type (type);
1464           break;
1465
1466         case EM_CRX:
1467           rtype = elf_crx_reloc_type (type);
1468           break;
1469
1470         case EM_VAX:
1471           rtype = elf_vax_reloc_type (type);
1472           break;
1473
1474         case EM_VISIUM:
1475           rtype = elf_visium_reloc_type (type);
1476           break;
1477
1478         case EM_ADAPTEVA_EPIPHANY:
1479           rtype = elf_epiphany_reloc_type (type);
1480           break;
1481
1482         case EM_IP2K:
1483         case EM_IP2K_OLD:
1484           rtype = elf_ip2k_reloc_type (type);
1485           break;
1486
1487         case EM_IQ2000:
1488           rtype = elf_iq2000_reloc_type (type);
1489           break;
1490
1491         case EM_XTENSA_OLD:
1492         case EM_XTENSA:
1493           rtype = elf_xtensa_reloc_type (type);
1494           break;
1495
1496         case EM_LATTICEMICO32:
1497           rtype = elf_lm32_reloc_type (type);
1498           break;
1499
1500         case EM_M32C_OLD:
1501         case EM_M32C:
1502           rtype = elf_m32c_reloc_type (type);
1503           break;
1504
1505         case EM_MT:
1506           rtype = elf_mt_reloc_type (type);
1507           break;
1508
1509         case EM_BLACKFIN:
1510           rtype = elf_bfin_reloc_type (type);
1511           break;
1512
1513         case EM_CYGNUS_MEP:
1514           rtype = elf_mep_reloc_type (type);
1515           break;
1516
1517         case EM_CR16:
1518           rtype = elf_cr16_reloc_type (type);
1519           break;
1520
1521         case EM_MICROBLAZE:
1522         case EM_MICROBLAZE_OLD:
1523           rtype = elf_microblaze_reloc_type (type);
1524           break;
1525
1526         case EM_RL78:
1527           rtype = elf_rl78_reloc_type (type);
1528           break;
1529
1530         case EM_RX:
1531           rtype = elf_rx_reloc_type (type);
1532           break;
1533
1534         case EM_METAG:
1535           rtype = elf_metag_reloc_type (type);
1536           break;
1537
1538         case EM_XC16X:
1539         case EM_C166:
1540           rtype = elf_xc16x_reloc_type (type);
1541           break;
1542
1543         case EM_TI_C6000:
1544           rtype = elf_tic6x_reloc_type (type);
1545           break;
1546
1547         case EM_TILEGX:
1548           rtype = elf_tilegx_reloc_type (type);
1549           break;
1550
1551         case EM_TILEPRO:
1552           rtype = elf_tilepro_reloc_type (type);
1553           break;
1554
1555         case EM_WEBASSEMBLY:
1556           rtype = elf_wasm32_reloc_type (type);
1557           break;
1558
1559         case EM_XGATE:
1560           rtype = elf_xgate_reloc_type (type);
1561           break;
1562
1563         case EM_ALTERA_NIOS2:
1564           rtype = elf_nios2_reloc_type (type);
1565           break;
1566
1567         case EM_TI_PRU:
1568           rtype = elf_pru_reloc_type (type);
1569           break;
1570
1571         case EM_NFP:
1572           if (EF_NFP_MACH (filedata->file_header.e_flags) == E_NFP_MACH_3200)
1573             rtype = elf_nfp3200_reloc_type (type);
1574           else
1575             rtype = elf_nfp_reloc_type (type);
1576           break;
1577         }
1578
1579       if (rtype == NULL)
1580         printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1581       else
1582         printf (do_wide ? "%-22s" : "%-17.17s", rtype);
1583
1584       if (filedata->file_header.e_machine == EM_ALPHA
1585           && rtype != NULL
1586           && streq (rtype, "R_ALPHA_LITUSE")
1587           && is_rela)
1588         {
1589           switch (rels[i].r_addend)
1590             {
1591             case LITUSE_ALPHA_ADDR:   rtype = "ADDR";   break;
1592             case LITUSE_ALPHA_BASE:   rtype = "BASE";   break;
1593             case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1594             case LITUSE_ALPHA_JSR:    rtype = "JSR";    break;
1595             case LITUSE_ALPHA_TLSGD:  rtype = "TLSGD";  break;
1596             case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1597             case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1598             default: rtype = NULL;
1599             }
1600
1601           if (rtype)
1602             printf (" (%s)", rtype);
1603           else
1604             {
1605               putchar (' ');
1606               printf (_("<unknown addend: %lx>"),
1607                       (unsigned long) rels[i].r_addend);
1608               res = FALSE;
1609             }
1610         }
1611       else if (symtab_index)
1612         {
1613           if (symtab == NULL || symtab_index >= nsyms)
1614             {
1615               error (_(" bad symbol index: %08lx in reloc"), (unsigned long) symtab_index);
1616               res = FALSE;
1617             }
1618           else
1619             {
1620               Elf_Internal_Sym * psym;
1621               const char * version_string;
1622               enum versioned_symbol_info sym_info;
1623               unsigned short vna_other;
1624
1625               psym = symtab + symtab_index;
1626
1627               version_string
1628                 = get_symbol_version_string (filedata, is_dynsym,
1629                                              strtab, strtablen,
1630                                              symtab_index,
1631                                              psym,
1632                                              &sym_info,
1633                                              &vna_other);
1634
1635               printf (" ");
1636
1637               if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1638                 {
1639                   const char * name;
1640                   unsigned int len;
1641                   unsigned int width = is_32bit_elf ? 8 : 14;
1642
1643                   /* Relocations against GNU_IFUNC symbols do not use the value
1644                      of the symbol as the address to relocate against.  Instead
1645                      they invoke the function named by the symbol and use its
1646                      result as the address for relocation.
1647
1648                      To indicate this to the user, do not display the value of
1649                      the symbol in the "Symbols's Value" field.  Instead show
1650                      its name followed by () as a hint that the symbol is
1651                      invoked.  */
1652
1653                   if (strtab == NULL
1654                       || psym->st_name == 0
1655                       || psym->st_name >= strtablen)
1656                     name = "??";
1657                   else
1658                     name = strtab + psym->st_name;
1659
1660                   len = print_symbol (width, name);
1661                   if (version_string)
1662                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1663                             version_string);
1664                   printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1665                 }
1666               else
1667                 {
1668                   print_vma (psym->st_value, LONG_HEX);
1669
1670                   printf (is_32bit_elf ? "   " : " ");
1671                 }
1672
1673               if (psym->st_name == 0)
1674                 {
1675                   const char * sec_name = "<null>";
1676                   char name_buf[40];
1677
1678                   if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1679                     {
1680                       if (psym->st_shndx < filedata->file_header.e_shnum)
1681                         sec_name = SECTION_NAME (filedata->section_headers + psym->st_shndx);
1682                       else if (psym->st_shndx == SHN_ABS)
1683                         sec_name = "ABS";
1684                       else if (psym->st_shndx == SHN_COMMON)
1685                         sec_name = "COMMON";
1686                       else if ((filedata->file_header.e_machine == EM_MIPS
1687                                 && psym->st_shndx == SHN_MIPS_SCOMMON)
1688                                || (filedata->file_header.e_machine == EM_TI_C6000
1689                                    && psym->st_shndx == SHN_TIC6X_SCOMMON))
1690                         sec_name = "SCOMMON";
1691                       else if (filedata->file_header.e_machine == EM_MIPS
1692                                && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1693                         sec_name = "SUNDEF";
1694                       else if ((filedata->file_header.e_machine == EM_X86_64
1695                                 || filedata->file_header.e_machine == EM_L1OM
1696                                 || filedata->file_header.e_machine == EM_K1OM)
1697                                && psym->st_shndx == SHN_X86_64_LCOMMON)
1698                         sec_name = "LARGE_COMMON";
1699                       else if (filedata->file_header.e_machine == EM_IA_64
1700                                && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1701                                && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1702                         sec_name = "ANSI_COM";
1703                       else if (is_ia64_vms (filedata)
1704                                && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1705                         sec_name = "VMS_SYMVEC";
1706                       else
1707                         {
1708                           sprintf (name_buf, "<section 0x%x>",
1709                                    (unsigned int) psym->st_shndx);
1710                           sec_name = name_buf;
1711                         }
1712                     }
1713                   print_symbol (22, sec_name);
1714                 }
1715               else if (strtab == NULL)
1716                 printf (_("<string table index: %3ld>"), psym->st_name);
1717               else if (psym->st_name >= strtablen)
1718                 {
1719                   error (_("<corrupt string table index: %3ld>"), psym->st_name);
1720                   res = FALSE;
1721                 }
1722               else
1723                 {
1724                   print_symbol (22, strtab + psym->st_name);
1725                   if (version_string)
1726                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1727                             version_string);
1728                 }
1729
1730               if (is_rela)
1731                 {
1732                   bfd_vma off = rels[i].r_addend;
1733
1734                   if ((bfd_signed_vma) off < 0)
1735                     printf (" - %" BFD_VMA_FMT "x", - off);
1736                   else
1737                     printf (" + %" BFD_VMA_FMT "x", off);
1738                 }
1739             }
1740         }
1741       else if (is_rela)
1742         {
1743           bfd_vma off = rels[i].r_addend;
1744
1745           printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1746           if ((bfd_signed_vma) off < 0)
1747             printf ("-%" BFD_VMA_FMT "x", - off);
1748           else
1749             printf ("%" BFD_VMA_FMT "x", off);
1750         }
1751
1752       if (filedata->file_header.e_machine == EM_SPARCV9
1753           && rtype != NULL
1754           && streq (rtype, "R_SPARC_OLO10"))
1755         printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1756
1757       putchar ('\n');
1758
1759 #ifdef BFD64
1760       if (! is_32bit_elf && filedata->file_header.e_machine == EM_MIPS)
1761         {
1762           bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1763           bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1764           const char * rtype2 = elf_mips_reloc_type (type2);
1765           const char * rtype3 = elf_mips_reloc_type (type3);
1766
1767           printf ("                    Type2: ");
1768
1769           if (rtype2 == NULL)
1770             printf (_("unrecognized: %-7lx"),
1771                     (unsigned long) type2 & 0xffffffff);
1772           else
1773             printf ("%-17.17s", rtype2);
1774
1775           printf ("\n                    Type3: ");
1776
1777           if (rtype3 == NULL)
1778             printf (_("unrecognized: %-7lx"),
1779                     (unsigned long) type3 & 0xffffffff);
1780           else
1781             printf ("%-17.17s", rtype3);
1782
1783           putchar ('\n');
1784         }
1785 #endif /* BFD64 */
1786     }
1787
1788   free (rels);
1789
1790   return res;
1791 }
1792
1793 static const char *
1794 get_mips_dynamic_type (unsigned long type)
1795 {
1796   switch (type)
1797     {
1798     case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1799     case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1800     case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1801     case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1802     case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1803     case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1804     case DT_MIPS_MSYM: return "MIPS_MSYM";
1805     case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1806     case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1807     case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1808     case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1809     case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1810     case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1811     case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1812     case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1813     case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1814     case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1815     case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1816     case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1817     case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1818     case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1819     case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1820     case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1821     case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1822     case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1823     case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1824     case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1825     case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1826     case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1827     case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1828     case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1829     case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1830     case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1831     case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1832     case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1833     case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1834     case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1835     case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1836     case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1837     case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1838     case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1839     case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1840     case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1841     case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1842     case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1843     case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1844     default:
1845       return NULL;
1846     }
1847 }
1848
1849 static const char *
1850 get_sparc64_dynamic_type (unsigned long type)
1851 {
1852   switch (type)
1853     {
1854     case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1855     default:
1856       return NULL;
1857     }
1858 }
1859
1860 static const char *
1861 get_ppc_dynamic_type (unsigned long type)
1862 {
1863   switch (type)
1864     {
1865     case DT_PPC_GOT:    return "PPC_GOT";
1866     case DT_PPC_OPT:    return "PPC_OPT";
1867     default:
1868       return NULL;
1869     }
1870 }
1871
1872 static const char *
1873 get_ppc64_dynamic_type (unsigned long type)
1874 {
1875   switch (type)
1876     {
1877     case DT_PPC64_GLINK:  return "PPC64_GLINK";
1878     case DT_PPC64_OPD:    return "PPC64_OPD";
1879     case DT_PPC64_OPDSZ:  return "PPC64_OPDSZ";
1880     case DT_PPC64_OPT:    return "PPC64_OPT";
1881     default:
1882       return NULL;
1883     }
1884 }
1885
1886 static const char *
1887 get_parisc_dynamic_type (unsigned long type)
1888 {
1889   switch (type)
1890     {
1891     case DT_HP_LOAD_MAP:        return "HP_LOAD_MAP";
1892     case DT_HP_DLD_FLAGS:       return "HP_DLD_FLAGS";
1893     case DT_HP_DLD_HOOK:        return "HP_DLD_HOOK";
1894     case DT_HP_UX10_INIT:       return "HP_UX10_INIT";
1895     case DT_HP_UX10_INITSZ:     return "HP_UX10_INITSZ";
1896     case DT_HP_PREINIT:         return "HP_PREINIT";
1897     case DT_HP_PREINITSZ:       return "HP_PREINITSZ";
1898     case DT_HP_NEEDED:          return "HP_NEEDED";
1899     case DT_HP_TIME_STAMP:      return "HP_TIME_STAMP";
1900     case DT_HP_CHECKSUM:        return "HP_CHECKSUM";
1901     case DT_HP_GST_SIZE:        return "HP_GST_SIZE";
1902     case DT_HP_GST_VERSION:     return "HP_GST_VERSION";
1903     case DT_HP_GST_HASHVAL:     return "HP_GST_HASHVAL";
1904     case DT_HP_EPLTREL:         return "HP_GST_EPLTREL";
1905     case DT_HP_EPLTRELSZ:       return "HP_GST_EPLTRELSZ";
1906     case DT_HP_FILTERED:        return "HP_FILTERED";
1907     case DT_HP_FILTER_TLS:      return "HP_FILTER_TLS";
1908     case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1909     case DT_HP_LAZYLOAD:        return "HP_LAZYLOAD";
1910     case DT_HP_BIND_NOW_COUNT:  return "HP_BIND_NOW_COUNT";
1911     case DT_PLT:                return "PLT";
1912     case DT_PLT_SIZE:           return "PLT_SIZE";
1913     case DT_DLT:                return "DLT";
1914     case DT_DLT_SIZE:           return "DLT_SIZE";
1915     default:
1916       return NULL;
1917     }
1918 }
1919
1920 static const char *
1921 get_ia64_dynamic_type (unsigned long type)
1922 {
1923   switch (type)
1924     {
1925     case DT_IA_64_PLT_RESERVE:         return "IA_64_PLT_RESERVE";
1926     case DT_IA_64_VMS_SUBTYPE:         return "VMS_SUBTYPE";
1927     case DT_IA_64_VMS_IMGIOCNT:        return "VMS_IMGIOCNT";
1928     case DT_IA_64_VMS_LNKFLAGS:        return "VMS_LNKFLAGS";
1929     case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1930     case DT_IA_64_VMS_IDENT:           return "VMS_IDENT";
1931     case DT_IA_64_VMS_NEEDED_IDENT:    return "VMS_NEEDED_IDENT";
1932     case DT_IA_64_VMS_IMG_RELA_CNT:    return "VMS_IMG_RELA_CNT";
1933     case DT_IA_64_VMS_SEG_RELA_CNT:    return "VMS_SEG_RELA_CNT";
1934     case DT_IA_64_VMS_FIXUP_RELA_CNT:  return "VMS_FIXUP_RELA_CNT";
1935     case DT_IA_64_VMS_FIXUP_NEEDED:    return "VMS_FIXUP_NEEDED";
1936     case DT_IA_64_VMS_SYMVEC_CNT:      return "VMS_SYMVEC_CNT";
1937     case DT_IA_64_VMS_XLATED:          return "VMS_XLATED";
1938     case DT_IA_64_VMS_STACKSIZE:       return "VMS_STACKSIZE";
1939     case DT_IA_64_VMS_UNWINDSZ:        return "VMS_UNWINDSZ";
1940     case DT_IA_64_VMS_UNWIND_CODSEG:   return "VMS_UNWIND_CODSEG";
1941     case DT_IA_64_VMS_UNWIND_INFOSEG:  return "VMS_UNWIND_INFOSEG";
1942     case DT_IA_64_VMS_LINKTIME:        return "VMS_LINKTIME";
1943     case DT_IA_64_VMS_SEG_NO:          return "VMS_SEG_NO";
1944     case DT_IA_64_VMS_SYMVEC_OFFSET:   return "VMS_SYMVEC_OFFSET";
1945     case DT_IA_64_VMS_SYMVEC_SEG:      return "VMS_SYMVEC_SEG";
1946     case DT_IA_64_VMS_UNWIND_OFFSET:   return "VMS_UNWIND_OFFSET";
1947     case DT_IA_64_VMS_UNWIND_SEG:      return "VMS_UNWIND_SEG";
1948     case DT_IA_64_VMS_STRTAB_OFFSET:   return "VMS_STRTAB_OFFSET";
1949     case DT_IA_64_VMS_SYSVER_OFFSET:   return "VMS_SYSVER_OFFSET";
1950     case DT_IA_64_VMS_IMG_RELA_OFF:    return "VMS_IMG_RELA_OFF";
1951     case DT_IA_64_VMS_SEG_RELA_OFF:    return "VMS_SEG_RELA_OFF";
1952     case DT_IA_64_VMS_FIXUP_RELA_OFF:  return "VMS_FIXUP_RELA_OFF";
1953     case DT_IA_64_VMS_PLTGOT_OFFSET:   return "VMS_PLTGOT_OFFSET";
1954     case DT_IA_64_VMS_PLTGOT_SEG:      return "VMS_PLTGOT_SEG";
1955     case DT_IA_64_VMS_FPMODE:          return "VMS_FPMODE";
1956     default:
1957       return NULL;
1958     }
1959 }
1960
1961 static const char *
1962 get_solaris_section_type (unsigned long type)
1963 {
1964   switch (type)
1965     {
1966     case 0x6fffffee: return "SUNW_ancillary";
1967     case 0x6fffffef: return "SUNW_capchain";
1968     case 0x6ffffff0: return "SUNW_capinfo";
1969     case 0x6ffffff1: return "SUNW_symsort";
1970     case 0x6ffffff2: return "SUNW_tlssort";
1971     case 0x6ffffff3: return "SUNW_LDYNSYM";
1972     case 0x6ffffff4: return "SUNW_dof";
1973     case 0x6ffffff5: return "SUNW_cap";
1974     case 0x6ffffff6: return "SUNW_SIGNATURE";
1975     case 0x6ffffff7: return "SUNW_ANNOTATE";
1976     case 0x6ffffff8: return "SUNW_DEBUGSTR";
1977     case 0x6ffffff9: return "SUNW_DEBUG";
1978     case 0x6ffffffa: return "SUNW_move";
1979     case 0x6ffffffb: return "SUNW_COMDAT";
1980     case 0x6ffffffc: return "SUNW_syminfo";
1981     case 0x6ffffffd: return "SUNW_verdef";
1982     case 0x6ffffffe: return "SUNW_verneed";
1983     case 0x6fffffff: return "SUNW_versym";
1984     case 0x70000000: return "SPARC_GOTDATA";
1985     default: return NULL;
1986     }
1987 }
1988
1989 static const char *
1990 get_alpha_dynamic_type (unsigned long type)
1991 {
1992   switch (type)
1993     {
1994     case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1995     default: return NULL;
1996     }
1997 }
1998
1999 static const char *
2000 get_score_dynamic_type (unsigned long type)
2001 {
2002   switch (type)
2003     {
2004     case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
2005     case DT_SCORE_LOCAL_GOTNO:  return "SCORE_LOCAL_GOTNO";
2006     case DT_SCORE_SYMTABNO:     return "SCORE_SYMTABNO";
2007     case DT_SCORE_GOTSYM:       return "SCORE_GOTSYM";
2008     case DT_SCORE_UNREFEXTNO:   return "SCORE_UNREFEXTNO";
2009     case DT_SCORE_HIPAGENO:     return "SCORE_HIPAGENO";
2010     default:                    return NULL;
2011     }
2012 }
2013
2014 static const char *
2015 get_tic6x_dynamic_type (unsigned long type)
2016 {
2017   switch (type)
2018     {
2019     case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
2020     case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
2021     case DT_C6000_DSBT_BASE:   return "C6000_DSBT_BASE";
2022     case DT_C6000_DSBT_SIZE:   return "C6000_DSBT_SIZE";
2023     case DT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
2024     case DT_C6000_DSBT_INDEX:  return "C6000_DSBT_INDEX";
2025     default:                   return NULL;
2026     }
2027 }
2028
2029 static const char *
2030 get_nios2_dynamic_type (unsigned long type)
2031 {
2032   switch (type)
2033     {
2034     case DT_NIOS2_GP: return "NIOS2_GP";
2035     default:          return NULL;
2036     }
2037 }
2038
2039 static const char *
2040 get_solaris_dynamic_type (unsigned long type)
2041 {
2042   switch (type)
2043     {
2044     case 0x6000000d: return "SUNW_AUXILIARY";
2045     case 0x6000000e: return "SUNW_RTLDINF";
2046     case 0x6000000f: return "SUNW_FILTER";
2047     case 0x60000010: return "SUNW_CAP";
2048     case 0x60000011: return "SUNW_SYMTAB";
2049     case 0x60000012: return "SUNW_SYMSZ";
2050     case 0x60000013: return "SUNW_SORTENT";
2051     case 0x60000014: return "SUNW_SYMSORT";
2052     case 0x60000015: return "SUNW_SYMSORTSZ";
2053     case 0x60000016: return "SUNW_TLSSORT";
2054     case 0x60000017: return "SUNW_TLSSORTSZ";
2055     case 0x60000018: return "SUNW_CAPINFO";
2056     case 0x60000019: return "SUNW_STRPAD";
2057     case 0x6000001a: return "SUNW_CAPCHAIN";
2058     case 0x6000001b: return "SUNW_LDMACH";
2059     case 0x6000001d: return "SUNW_CAPCHAINENT";
2060     case 0x6000001f: return "SUNW_CAPCHAINSZ";
2061     case 0x60000021: return "SUNW_PARENT";
2062     case 0x60000023: return "SUNW_ASLR";
2063     case 0x60000025: return "SUNW_RELAX";
2064     case 0x60000029: return "SUNW_NXHEAP";
2065     case 0x6000002b: return "SUNW_NXSTACK";
2066
2067     case 0x70000001: return "SPARC_REGISTER";
2068     case 0x7ffffffd: return "AUXILIARY";
2069     case 0x7ffffffe: return "USED";
2070     case 0x7fffffff: return "FILTER";
2071
2072     default: return NULL;
2073     }
2074 }
2075
2076 static const char *
2077 get_dynamic_type (Filedata * filedata, unsigned long type)
2078 {
2079   static char buff[64];
2080
2081   switch (type)
2082     {
2083     case DT_NULL:       return "NULL";
2084     case DT_NEEDED:     return "NEEDED";
2085     case DT_PLTRELSZ:   return "PLTRELSZ";
2086     case DT_PLTGOT:     return "PLTGOT";
2087     case DT_HASH:       return "HASH";
2088     case DT_STRTAB:     return "STRTAB";
2089     case DT_SYMTAB:     return "SYMTAB";
2090     case DT_RELA:       return "RELA";
2091     case DT_RELASZ:     return "RELASZ";
2092     case DT_RELAENT:    return "RELAENT";
2093     case DT_STRSZ:      return "STRSZ";
2094     case DT_SYMENT:     return "SYMENT";
2095     case DT_INIT:       return "INIT";
2096     case DT_FINI:       return "FINI";
2097     case DT_SONAME:     return "SONAME";
2098     case DT_RPATH:      return "RPATH";
2099     case DT_SYMBOLIC:   return "SYMBOLIC";
2100     case DT_REL:        return "REL";
2101     case DT_RELSZ:      return "RELSZ";
2102     case DT_RELENT:     return "RELENT";
2103     case DT_PLTREL:     return "PLTREL";
2104     case DT_DEBUG:      return "DEBUG";
2105     case DT_TEXTREL:    return "TEXTREL";
2106     case DT_JMPREL:     return "JMPREL";
2107     case DT_BIND_NOW:   return "BIND_NOW";
2108     case DT_INIT_ARRAY: return "INIT_ARRAY";
2109     case DT_FINI_ARRAY: return "FINI_ARRAY";
2110     case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2111     case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
2112     case DT_RUNPATH:    return "RUNPATH";
2113     case DT_FLAGS:      return "FLAGS";
2114
2115     case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2116     case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
2117     case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX";
2118
2119     case DT_CHECKSUM:   return "CHECKSUM";
2120     case DT_PLTPADSZ:   return "PLTPADSZ";
2121     case DT_MOVEENT:    return "MOVEENT";
2122     case DT_MOVESZ:     return "MOVESZ";
2123     case DT_FEATURE:    return "FEATURE";
2124     case DT_POSFLAG_1:  return "POSFLAG_1";
2125     case DT_SYMINSZ:    return "SYMINSZ";
2126     case DT_SYMINENT:   return "SYMINENT"; /* aka VALRNGHI */
2127
2128     case DT_ADDRRNGLO:  return "ADDRRNGLO";
2129     case DT_CONFIG:     return "CONFIG";
2130     case DT_DEPAUDIT:   return "DEPAUDIT";
2131     case DT_AUDIT:      return "AUDIT";
2132     case DT_PLTPAD:     return "PLTPAD";
2133     case DT_MOVETAB:    return "MOVETAB";
2134     case DT_SYMINFO:    return "SYMINFO"; /* aka ADDRRNGHI */
2135
2136     case DT_VERSYM:     return "VERSYM";
2137
2138     case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2139     case DT_TLSDESC_PLT: return "TLSDESC_PLT";
2140     case DT_RELACOUNT:  return "RELACOUNT";
2141     case DT_RELCOUNT:   return "RELCOUNT";
2142     case DT_FLAGS_1:    return "FLAGS_1";
2143     case DT_VERDEF:     return "VERDEF";
2144     case DT_VERDEFNUM:  return "VERDEFNUM";
2145     case DT_VERNEED:    return "VERNEED";
2146     case DT_VERNEEDNUM: return "VERNEEDNUM";
2147
2148     case DT_AUXILIARY:  return "AUXILIARY";
2149     case DT_USED:       return "USED";
2150     case DT_FILTER:     return "FILTER";
2151
2152     case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2153     case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2154     case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2155     case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2156     case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
2157     case DT_GNU_HASH:   return "GNU_HASH";
2158
2159     default:
2160       if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2161         {
2162           const char * result;
2163
2164           switch (filedata->file_header.e_machine)
2165             {
2166             case EM_MIPS:
2167             case EM_MIPS_RS3_LE:
2168               result = get_mips_dynamic_type (type);
2169               break;
2170             case EM_SPARCV9:
2171               result = get_sparc64_dynamic_type (type);
2172               break;
2173             case EM_PPC:
2174               result = get_ppc_dynamic_type (type);
2175               break;
2176             case EM_PPC64:
2177               result = get_ppc64_dynamic_type (type);
2178               break;
2179             case EM_IA_64:
2180               result = get_ia64_dynamic_type (type);
2181               break;
2182             case EM_ALPHA:
2183               result = get_alpha_dynamic_type (type);
2184               break;
2185             case EM_SCORE:
2186               result = get_score_dynamic_type (type);
2187               break;
2188             case EM_TI_C6000:
2189               result = get_tic6x_dynamic_type (type);
2190               break;
2191             case EM_ALTERA_NIOS2:
2192               result = get_nios2_dynamic_type (type);
2193               break;
2194             default:
2195               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2196                 result = get_solaris_dynamic_type (type);
2197               else
2198                 result = NULL;
2199               break;
2200             }
2201
2202           if (result != NULL)
2203             return result;
2204
2205           snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2206         }
2207       else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2208                || (filedata->file_header.e_machine == EM_PARISC
2209                    && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2210         {
2211           const char * result;
2212
2213           switch (filedata->file_header.e_machine)
2214             {
2215             case EM_PARISC:
2216               result = get_parisc_dynamic_type (type);
2217               break;
2218             case EM_IA_64:
2219               result = get_ia64_dynamic_type (type);
2220               break;
2221             default:
2222               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2223                 result = get_solaris_dynamic_type (type);
2224               else
2225                 result = NULL;
2226               break;
2227             }
2228
2229           if (result != NULL)
2230             return result;
2231
2232           snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2233                     type);
2234         }
2235       else
2236         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2237
2238       return buff;
2239     }
2240 }
2241
2242 static char *
2243 get_file_type (unsigned e_type)
2244 {
2245   static char buff[32];
2246
2247   switch (e_type)
2248     {
2249     case ET_NONE: return _("NONE (None)");
2250     case ET_REL:  return _("REL (Relocatable file)");
2251     case ET_EXEC: return _("EXEC (Executable file)");
2252     case ET_DYN:  return _("DYN (Shared object file)");
2253     case ET_CORE: return _("CORE (Core file)");
2254
2255     default:
2256       if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2257         snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2258       else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2259         snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2260       else
2261         snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2262       return buff;
2263     }
2264 }
2265
2266 static char *
2267 get_machine_name (unsigned e_machine)
2268 {
2269   static char buff[64]; /* XXX */
2270
2271   switch (e_machine)
2272     {
2273       /* Please keep this switch table sorted by increasing EM_ value.  */
2274       /* 0 */
2275     case EM_NONE:               return _("None");
2276     case EM_M32:                return "WE32100";
2277     case EM_SPARC:              return "Sparc";
2278     case EM_386:                return "Intel 80386";
2279     case EM_68K:                return "MC68000";
2280     case EM_88K:                return "MC88000";
2281     case EM_IAMCU:              return "Intel MCU";
2282     case EM_860:                return "Intel 80860";
2283     case EM_MIPS:               return "MIPS R3000";
2284     case EM_S370:               return "IBM System/370";
2285       /* 10 */
2286     case EM_MIPS_RS3_LE:        return "MIPS R4000 big-endian";
2287     case EM_OLD_SPARCV9:        return "Sparc v9 (old)";
2288     case EM_PARISC:             return "HPPA";
2289     case EM_VPP550:             return "Fujitsu VPP500";
2290     case EM_SPARC32PLUS:        return "Sparc v8+" ;
2291     case EM_960:                return "Intel 80960";
2292     case EM_PPC:                return "PowerPC";
2293       /* 20 */
2294     case EM_PPC64:              return "PowerPC64";
2295     case EM_S390_OLD:
2296     case EM_S390:               return "IBM S/390";
2297     case EM_SPU:                return "SPU";
2298       /* 30 */
2299     case EM_V800:               return "Renesas V850 (using RH850 ABI)";
2300     case EM_FR20:               return "Fujitsu FR20";
2301     case EM_RH32:               return "TRW RH32";
2302     case EM_MCORE:              return "MCORE";
2303       /* 40 */
2304     case EM_ARM:                return "ARM";
2305     case EM_OLD_ALPHA:          return "Digital Alpha (old)";
2306     case EM_SH:                 return "Renesas / SuperH SH";
2307     case EM_SPARCV9:            return "Sparc v9";
2308     case EM_TRICORE:            return "Siemens Tricore";
2309     case EM_ARC:                return "ARC";
2310     case EM_H8_300:             return "Renesas H8/300";
2311     case EM_H8_300H:            return "Renesas H8/300H";
2312     case EM_H8S:                return "Renesas H8S";
2313     case EM_H8_500:             return "Renesas H8/500";
2314       /* 50 */
2315     case EM_IA_64:              return "Intel IA-64";
2316     case EM_MIPS_X:             return "Stanford MIPS-X";
2317     case EM_COLDFIRE:           return "Motorola Coldfire";
2318     case EM_68HC12:             return "Motorola MC68HC12 Microcontroller";
2319     case EM_MMA:                return "Fujitsu Multimedia Accelerator";
2320     case EM_PCP:                return "Siemens PCP";
2321     case EM_NCPU:               return "Sony nCPU embedded RISC processor";
2322     case EM_NDR1:               return "Denso NDR1 microprocesspr";
2323     case EM_STARCORE:           return "Motorola Star*Core processor";
2324     case EM_ME16:               return "Toyota ME16 processor";
2325       /* 60 */
2326     case EM_ST100:              return "STMicroelectronics ST100 processor";
2327     case EM_TINYJ:              return "Advanced Logic Corp. TinyJ embedded processor";
2328     case EM_X86_64:             return "Advanced Micro Devices X86-64";
2329     case EM_PDSP:               return "Sony DSP processor";
2330     case EM_PDP10:              return "Digital Equipment Corp. PDP-10";
2331     case EM_PDP11:              return "Digital Equipment Corp. PDP-11";
2332     case EM_FX66:               return "Siemens FX66 microcontroller";
2333     case EM_ST9PLUS:            return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2334     case EM_ST7:                return "STMicroelectronics ST7 8-bit microcontroller";
2335     case EM_68HC16:             return "Motorola MC68HC16 Microcontroller";
2336       /* 70 */
2337     case EM_68HC11:             return "Motorola MC68HC11 Microcontroller";
2338     case EM_68HC08:             return "Motorola MC68HC08 Microcontroller";
2339     case EM_68HC05:             return "Motorola MC68HC05 Microcontroller";
2340     case EM_SVX:                return "Silicon Graphics SVx";
2341     case EM_ST19:               return "STMicroelectronics ST19 8-bit microcontroller";
2342     case EM_VAX:                return "Digital VAX";
2343     case EM_CRIS:               return "Axis Communications 32-bit embedded processor";
2344     case EM_JAVELIN:            return "Infineon Technologies 32-bit embedded cpu";
2345     case EM_FIREPATH:           return "Element 14 64-bit DSP processor";
2346     case EM_ZSP:                return "LSI Logic's 16-bit DSP processor";
2347       /* 80 */
2348     case EM_MMIX:               return "Donald Knuth's educational 64-bit processor";
2349     case EM_HUANY:              return "Harvard Universitys's machine-independent object format";
2350     case EM_PRISM:              return "Vitesse Prism";
2351     case EM_AVR_OLD:
2352     case EM_AVR:                return "Atmel AVR 8-bit microcontroller";
2353     case EM_CYGNUS_FR30:
2354     case EM_FR30:               return "Fujitsu FR30";
2355     case EM_CYGNUS_D10V:
2356     case EM_D10V:               return "d10v";
2357     case EM_CYGNUS_D30V:
2358     case EM_D30V:               return "d30v";
2359     case EM_CYGNUS_V850:
2360     case EM_V850:               return "Renesas V850";
2361     case EM_CYGNUS_M32R:
2362     case EM_M32R:               return "Renesas M32R (formerly Mitsubishi M32r)";
2363     case EM_CYGNUS_MN10300:
2364     case EM_MN10300:            return "mn10300";
2365       /* 90 */
2366     case EM_CYGNUS_MN10200:
2367     case EM_MN10200:            return "mn10200";
2368     case EM_PJ:                 return "picoJava";
2369     case EM_OR1K:               return "OpenRISC 1000";
2370     case EM_ARC_COMPACT:        return "ARCompact";
2371     case EM_XTENSA_OLD:
2372     case EM_XTENSA:             return "Tensilica Xtensa Processor";
2373     case EM_VIDEOCORE:          return "Alphamosaic VideoCore processor";
2374     case EM_TMM_GPP:            return "Thompson Multimedia General Purpose Processor";
2375     case EM_NS32K:              return "National Semiconductor 32000 series";
2376     case EM_TPC:                return "Tenor Network TPC processor";
2377     case EM_SNP1K:              return "Trebia SNP 1000 processor";
2378       /* 100 */
2379     case EM_ST200:              return "STMicroelectronics ST200 microcontroller";  
2380     case EM_IP2K_OLD:
2381     case EM_IP2K:               return "Ubicom IP2xxx 8-bit microcontrollers";
2382     case EM_MAX:                return "MAX Processor";
2383     case EM_CR:                 return "National Semiconductor CompactRISC";
2384     case EM_F2MC16:             return "Fujitsu F2MC16";
2385     case EM_MSP430:             return "Texas Instruments msp430 microcontroller";
2386     case EM_BLACKFIN:           return "Analog Devices Blackfin";
2387     case EM_SE_C33:             return "S1C33 Family of Seiko Epson processors";
2388     case EM_SEP:                return "Sharp embedded microprocessor";
2389     case EM_ARCA:               return "Arca RISC microprocessor";
2390       /* 110 */
2391     case EM_UNICORE:            return "Unicore";
2392     case EM_EXCESS:             return "eXcess 16/32/64-bit configurable embedded CPU";
2393     case EM_DXP:                return "Icera Semiconductor Inc. Deep Execution Processor";
2394     case EM_ALTERA_NIOS2:       return "Altera Nios II";
2395     case EM_CRX:                return "National Semiconductor CRX microprocessor";
2396     case EM_XGATE:              return "Motorola XGATE embedded processor";
2397     case EM_C166:
2398     case EM_XC16X:              return "Infineon Technologies xc16x";
2399     case EM_M16C:               return "Renesas M16C series microprocessors";
2400     case EM_DSPIC30F:           return "Microchip Technology dsPIC30F Digital Signal Controller";
2401     case EM_CE:                 return "Freescale Communication Engine RISC core";
2402       /* 120 */
2403     case EM_M32C:               return "Renesas M32c";
2404       /* 130 */
2405     case EM_TSK3000:            return "Altium TSK3000 core";
2406     case EM_RS08:               return "Freescale RS08 embedded processor";
2407     case EM_ECOG2:              return "Cyan Technology eCOG2 microprocessor";
2408     case EM_SCORE:              return "SUNPLUS S+Core";
2409     case EM_DSP24:              return "New Japan Radio (NJR) 24-bit DSP Processor";
2410     case EM_VIDEOCORE3:         return "Broadcom VideoCore III processor";
2411     case EM_LATTICEMICO32:      return "Lattice Mico32";
2412     case EM_SE_C17:             return "Seiko Epson C17 family";
2413       /* 140 */
2414     case EM_TI_C6000:           return "Texas Instruments TMS320C6000 DSP family";
2415     case EM_TI_C2000:           return "Texas Instruments TMS320C2000 DSP family";
2416     case EM_TI_C5500:           return "Texas Instruments TMS320C55x DSP family";
2417     case EM_TI_PRU:             return "TI PRU I/O processor";
2418       /* 160 */
2419     case EM_MMDSP_PLUS:         return "STMicroelectronics 64bit VLIW Data Signal Processor";
2420     case EM_CYPRESS_M8C:        return "Cypress M8C microprocessor";
2421     case EM_R32C:               return "Renesas R32C series microprocessors";
2422     case EM_TRIMEDIA:           return "NXP Semiconductors TriMedia architecture family";
2423     case EM_QDSP6:              return "QUALCOMM DSP6 Processor";
2424     case EM_8051:               return "Intel 8051 and variants";
2425     case EM_STXP7X:             return "STMicroelectronics STxP7x family";
2426     case EM_NDS32:              return "Andes Technology compact code size embedded RISC processor family";
2427     case EM_ECOG1X:             return "Cyan Technology eCOG1X family";
2428     case EM_MAXQ30:             return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2429       /* 170 */
2430     case EM_XIMO16:             return "New Japan Radio (NJR) 16-bit DSP Processor";
2431     case EM_MANIK:              return "M2000 Reconfigurable RISC Microprocessor";
2432     case EM_CRAYNV2:            return "Cray Inc. NV2 vector architecture";
2433     case EM_RX:                 return "Renesas RX";
2434     case EM_METAG:              return "Imagination Technologies Meta processor architecture";
2435     case EM_MCST_ELBRUS:        return "MCST Elbrus general purpose hardware architecture";
2436     case EM_ECOG16:             return "Cyan Technology eCOG16 family";
2437     case EM_CR16:
2438     case EM_MICROBLAZE:
2439     case EM_MICROBLAZE_OLD:     return "Xilinx MicroBlaze";
2440     case EM_ETPU:               return "Freescale Extended Time Processing Unit";
2441     case EM_SLE9X:              return "Infineon Technologies SLE9X core";
2442       /* 180 */
2443     case EM_L1OM:               return "Intel L1OM";
2444     case EM_K1OM:               return "Intel K1OM";
2445     case EM_INTEL182:           return "Intel (reserved)";
2446     case EM_AARCH64:            return "AArch64";
2447     case EM_ARM184:             return "ARM (reserved)";
2448     case EM_AVR32:              return "Atmel Corporation 32-bit microprocessor";
2449     case EM_STM8:               return "STMicroeletronics STM8 8-bit microcontroller";
2450     case EM_TILE64:             return "Tilera TILE64 multicore architecture family";
2451     case EM_TILEPRO:            return "Tilera TILEPro multicore architecture family";
2452       /* 190 */
2453     case EM_CUDA:               return "NVIDIA CUDA architecture";
2454     case EM_TILEGX:             return "Tilera TILE-Gx multicore architecture family";
2455     case EM_CLOUDSHIELD:        return "CloudShield architecture family";
2456     case EM_COREA_1ST:          return "KIPO-KAIST Core-A 1st generation processor family";
2457     case EM_COREA_2ND:          return "KIPO-KAIST Core-A 2nd generation processor family";
2458     case EM_ARC_COMPACT2:       return "ARCv2";
2459     case EM_OPEN8:              return "Open8 8-bit RISC soft processor core";
2460     case EM_RL78:               return "Renesas RL78";
2461     case EM_VIDEOCORE5:         return "Broadcom VideoCore V processor";
2462     case EM_78K0R:              return "Renesas 78K0R";
2463       /* 200 */
2464     case EM_56800EX:            return "Freescale 56800EX Digital Signal Controller (DSC)";
2465     case EM_BA1:                return "Beyond BA1 CPU architecture";
2466     case EM_BA2:                return "Beyond BA2 CPU architecture";
2467     case EM_XCORE:              return "XMOS xCORE processor family";
2468     case EM_MCHP_PIC:           return "Microchip 8-bit PIC(r) family";
2469       /* 210 */
2470     case EM_KM32:               return "KM211 KM32 32-bit processor";
2471     case EM_KMX32:              return "KM211 KMX32 32-bit processor";
2472     case EM_KMX16:              return "KM211 KMX16 16-bit processor";
2473     case EM_KMX8:               return "KM211 KMX8 8-bit processor";
2474     case EM_KVARC:              return "KM211 KVARC processor";
2475     case EM_CDP:                return "Paneve CDP architecture family";
2476     case EM_COGE:               return "Cognitive Smart Memory Processor";
2477     case EM_COOL:               return "Bluechip Systems CoolEngine";
2478     case EM_NORC:               return "Nanoradio Optimized RISC";
2479     case EM_CSR_KALIMBA:        return "CSR Kalimba architecture family";
2480       /* 220 */
2481     case EM_Z80:                return "Zilog Z80";
2482     case EM_VISIUM:             return "CDS VISIUMcore processor";
2483     case EM_FT32:               return "FTDI Chip FT32";
2484     case EM_MOXIE:              return "Moxie";
2485     case EM_AMDGPU:             return "AMD GPU";
2486     case EM_RISCV:              return "RISC-V";
2487     case EM_LANAI:              return "Lanai 32-bit processor";
2488     case EM_BPF:                return "Linux BPF";
2489     case EM_NFP:                return "Netronome Flow Processor";
2490
2491       /* Large numbers...  */
2492     case EM_MT:                 return "Morpho Techologies MT processor";
2493     case EM_ALPHA:              return "Alpha";
2494     case EM_WEBASSEMBLY:        return "Web Assembly";
2495     case EM_DLX:                return "OpenDLX";  
2496     case EM_XSTORMY16:          return "Sanyo XStormy16 CPU core";
2497     case EM_IQ2000:             return "Vitesse IQ2000";
2498     case EM_M32C_OLD:
2499     case EM_NIOS32:             return "Altera Nios";
2500     case EM_CYGNUS_MEP:         return "Toshiba MeP Media Engine";
2501     case EM_ADAPTEVA_EPIPHANY:  return "Adapteva EPIPHANY";
2502     case EM_CYGNUS_FRV:         return "Fujitsu FR-V";
2503     case EM_S12Z:               return "Freescale S12Z";
2504
2505     default:
2506       snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2507       return buff;
2508     }
2509 }
2510
2511 static void
2512 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2513 {
2514   /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2.  Some
2515      other compilers don't a specific architecture type in the e_flags, and
2516      instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2517      architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2518      architectures.
2519
2520      Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2521      but also sets a specific architecture type in the e_flags field.
2522
2523      However, when decoding the flags we don't worry if we see an
2524      unexpected pairing, for example EM_ARC_COMPACT machine type, with
2525      ARCEM architecture type.  */
2526
2527   switch (e_flags & EF_ARC_MACH_MSK)
2528     {
2529       /* We only expect these to occur for EM_ARC_COMPACT2.  */
2530     case EF_ARC_CPU_ARCV2EM:
2531       strcat (buf, ", ARC EM");
2532       break;
2533     case EF_ARC_CPU_ARCV2HS:
2534       strcat (buf, ", ARC HS");
2535       break;
2536
2537       /* We only expect these to occur for EM_ARC_COMPACT.  */
2538     case E_ARC_MACH_ARC600:
2539       strcat (buf, ", ARC600");
2540       break;
2541     case E_ARC_MACH_ARC601:
2542       strcat (buf, ", ARC601");
2543       break;
2544     case E_ARC_MACH_ARC700:
2545       strcat (buf, ", ARC700");
2546       break;
2547
2548       /* The only times we should end up here are (a) A corrupt ELF, (b) A
2549          new ELF with new architecture being read by an old version of
2550          readelf, or (c) An ELF built with non-GNU compiler that does not
2551          set the architecture in the e_flags.  */
2552     default:
2553       if (e_machine == EM_ARC_COMPACT)
2554         strcat (buf, ", Unknown ARCompact");
2555       else
2556         strcat (buf, ", Unknown ARC");
2557       break;
2558     }
2559
2560   switch (e_flags & EF_ARC_OSABI_MSK)
2561     {
2562     case E_ARC_OSABI_ORIG:
2563       strcat (buf, ", (ABI:legacy)");
2564       break;
2565     case E_ARC_OSABI_V2:
2566       strcat (buf, ", (ABI:v2)");
2567       break;
2568       /* Only upstream 3.9+ kernels will support ARCv2 ISA.  */
2569     case E_ARC_OSABI_V3:
2570       strcat (buf, ", v3 no-legacy-syscalls ABI");
2571       break;
2572     case E_ARC_OSABI_V4:
2573       strcat (buf, ", v4 ABI");
2574       break;
2575     default:
2576       strcat (buf, ", unrecognised ARC OSABI flag");
2577       break;
2578     }
2579 }
2580
2581 static void
2582 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2583 {
2584   unsigned eabi;
2585   bfd_boolean unknown = FALSE;
2586
2587   eabi = EF_ARM_EABI_VERSION (e_flags);
2588   e_flags &= ~ EF_ARM_EABIMASK;
2589
2590   /* Handle "generic" ARM flags.  */
2591   if (e_flags & EF_ARM_RELEXEC)
2592     {
2593       strcat (buf, ", relocatable executable");
2594       e_flags &= ~ EF_ARM_RELEXEC;
2595     }
2596
2597   if (e_flags & EF_ARM_PIC)
2598     {
2599       strcat (buf, ", position independent");
2600       e_flags &= ~ EF_ARM_PIC;
2601     }
2602
2603   /* Now handle EABI specific flags.  */
2604   switch (eabi)
2605     {
2606     default:
2607       strcat (buf, ", <unrecognized EABI>");
2608       if (e_flags)
2609         unknown = TRUE;
2610       break;
2611
2612     case EF_ARM_EABI_VER1:
2613       strcat (buf, ", Version1 EABI");
2614       while (e_flags)
2615         {
2616           unsigned flag;
2617
2618           /* Process flags one bit at a time.  */
2619           flag = e_flags & - e_flags;
2620           e_flags &= ~ flag;
2621
2622           switch (flag)
2623             {
2624             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2625               strcat (buf, ", sorted symbol tables");
2626               break;
2627
2628             default:
2629               unknown = TRUE;
2630               break;
2631             }
2632         }
2633       break;
2634
2635     case EF_ARM_EABI_VER2:
2636       strcat (buf, ", Version2 EABI");
2637       while (e_flags)
2638         {
2639           unsigned flag;
2640
2641           /* Process flags one bit at a time.  */
2642           flag = e_flags & - e_flags;
2643           e_flags &= ~ flag;
2644
2645           switch (flag)
2646             {
2647             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2648               strcat (buf, ", sorted symbol tables");
2649               break;
2650
2651             case EF_ARM_DYNSYMSUSESEGIDX:
2652               strcat (buf, ", dynamic symbols use segment index");
2653               break;
2654
2655             case EF_ARM_MAPSYMSFIRST:
2656               strcat (buf, ", mapping symbols precede others");
2657               break;
2658
2659             default:
2660               unknown = TRUE;
2661               break;
2662             }
2663         }
2664       break;
2665
2666     case EF_ARM_EABI_VER3:
2667       strcat (buf, ", Version3 EABI");
2668       break;
2669
2670     case EF_ARM_EABI_VER4:
2671       strcat (buf, ", Version4 EABI");
2672       while (e_flags)
2673         {
2674           unsigned flag;
2675
2676           /* Process flags one bit at a time.  */
2677           flag = e_flags & - e_flags;
2678           e_flags &= ~ flag;
2679
2680           switch (flag)
2681             {
2682             case EF_ARM_BE8:
2683               strcat (buf, ", BE8");
2684               break;
2685
2686             case EF_ARM_LE8:
2687               strcat (buf, ", LE8");
2688               break;
2689
2690             default:
2691               unknown = TRUE;
2692               break;
2693             }
2694         }
2695       break;
2696
2697     case EF_ARM_EABI_VER5:
2698       strcat (buf, ", Version5 EABI");
2699       while (e_flags)
2700         {
2701           unsigned flag;
2702
2703           /* Process flags one bit at a time.  */
2704           flag = e_flags & - e_flags;
2705           e_flags &= ~ flag;
2706
2707           switch (flag)
2708             {
2709             case EF_ARM_BE8:
2710               strcat (buf, ", BE8");
2711               break;
2712
2713             case EF_ARM_LE8:
2714               strcat (buf, ", LE8");
2715               break;
2716
2717             case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT.  */
2718               strcat (buf, ", soft-float ABI");
2719               break;
2720
2721             case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT.  */
2722               strcat (buf, ", hard-float ABI");
2723               break;
2724
2725             default:
2726               unknown = TRUE;
2727               break;
2728             }
2729         }
2730       break;
2731
2732     case EF_ARM_EABI_UNKNOWN:
2733       strcat (buf, ", GNU 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_INTERWORK:
2745               strcat (buf, ", interworking enabled");
2746               break;
2747
2748             case EF_ARM_APCS_26:
2749               strcat (buf, ", uses APCS/26");
2750               break;
2751
2752             case EF_ARM_APCS_FLOAT:
2753               strcat (buf, ", uses APCS/float");
2754               break;
2755
2756             case EF_ARM_PIC:
2757               strcat (buf, ", position independent");
2758               break;
2759
2760             case EF_ARM_ALIGN8:
2761               strcat (buf, ", 8 bit structure alignment");
2762               break;
2763
2764             case EF_ARM_NEW_ABI:
2765               strcat (buf, ", uses new ABI");
2766               break;
2767
2768             case EF_ARM_OLD_ABI:
2769               strcat (buf, ", uses old ABI");
2770               break;
2771
2772             case EF_ARM_SOFT_FLOAT:
2773               strcat (buf, ", software FP");
2774               break;
2775
2776             case EF_ARM_VFP_FLOAT:
2777               strcat (buf, ", VFP");
2778               break;
2779
2780             case EF_ARM_MAVERICK_FLOAT:
2781               strcat (buf, ", Maverick FP");
2782               break;
2783
2784             default:
2785               unknown = TRUE;
2786               break;
2787             }
2788         }
2789     }
2790
2791   if (unknown)
2792     strcat (buf,_(", <unknown>"));
2793 }
2794
2795 static void
2796 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2797 {
2798   --size; /* Leave space for null terminator.  */
2799
2800   switch (e_flags & EF_AVR_MACH)
2801     {
2802     case E_AVR_MACH_AVR1:
2803       strncat (buf, ", avr:1", size);
2804       break;
2805     case E_AVR_MACH_AVR2:
2806       strncat (buf, ", avr:2", size);
2807       break;
2808     case E_AVR_MACH_AVR25:
2809       strncat (buf, ", avr:25", size);
2810       break;
2811     case E_AVR_MACH_AVR3:
2812       strncat (buf, ", avr:3", size);
2813       break;
2814     case E_AVR_MACH_AVR31:
2815       strncat (buf, ", avr:31", size);
2816       break;
2817     case E_AVR_MACH_AVR35:
2818       strncat (buf, ", avr:35", size);
2819       break;
2820     case E_AVR_MACH_AVR4:
2821       strncat (buf, ", avr:4", size);
2822       break;
2823     case E_AVR_MACH_AVR5:
2824       strncat (buf, ", avr:5", size);
2825       break;
2826     case E_AVR_MACH_AVR51:
2827       strncat (buf, ", avr:51", size);
2828       break;
2829     case E_AVR_MACH_AVR6:
2830       strncat (buf, ", avr:6", size);
2831       break;
2832     case E_AVR_MACH_AVRTINY:
2833       strncat (buf, ", avr:100", size);
2834       break;
2835     case E_AVR_MACH_XMEGA1:
2836       strncat (buf, ", avr:101", size);
2837       break;
2838     case E_AVR_MACH_XMEGA2:
2839       strncat (buf, ", avr:102", size);
2840       break;
2841     case E_AVR_MACH_XMEGA3:
2842       strncat (buf, ", avr:103", size);
2843       break;
2844     case E_AVR_MACH_XMEGA4:
2845       strncat (buf, ", avr:104", size);
2846       break;
2847     case E_AVR_MACH_XMEGA5:
2848       strncat (buf, ", avr:105", size);
2849       break;
2850     case E_AVR_MACH_XMEGA6:
2851       strncat (buf, ", avr:106", size);
2852       break;
2853     case E_AVR_MACH_XMEGA7:
2854       strncat (buf, ", avr:107", size);
2855       break;
2856     default:
2857       strncat (buf, ", avr:<unknown>", size);
2858       break;
2859     }
2860
2861   size -= strlen (buf);
2862   if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2863     strncat (buf, ", link-relax", size);
2864 }
2865
2866 static void
2867 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2868 {
2869   unsigned abi;
2870   unsigned arch;
2871   unsigned config;
2872   unsigned version;
2873   bfd_boolean has_fpu = FALSE;
2874   unsigned int r = 0;
2875
2876   static const char *ABI_STRINGS[] =
2877   {
2878     "ABI v0", /* use r5 as return register; only used in N1213HC */
2879     "ABI v1", /* use r0 as return register */
2880     "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2881     "ABI v2fp", /* for FPU */
2882     "AABI",
2883     "ABI2 FP+"
2884   };
2885   static const char *VER_STRINGS[] =
2886   {
2887     "Andes ELF V1.3 or older",
2888     "Andes ELF V1.3.1",
2889     "Andes ELF V1.4"
2890   };
2891   static const char *ARCH_STRINGS[] =
2892   {
2893     "",
2894     "Andes Star v1.0",
2895     "Andes Star v2.0",
2896     "Andes Star v3.0",
2897     "Andes Star v3.0m"
2898   };
2899
2900   abi = EF_NDS_ABI & e_flags;
2901   arch = EF_NDS_ARCH & e_flags;
2902   config = EF_NDS_INST & e_flags;
2903   version = EF_NDS32_ELF_VERSION & e_flags;
2904
2905   memset (buf, 0, size);
2906
2907   switch (abi)
2908     {
2909     case E_NDS_ABI_V0:
2910     case E_NDS_ABI_V1:
2911     case E_NDS_ABI_V2:
2912     case E_NDS_ABI_V2FP:
2913     case E_NDS_ABI_AABI:
2914     case E_NDS_ABI_V2FP_PLUS:
2915       /* In case there are holes in the array.  */
2916       r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2917       break;
2918
2919     default:
2920       r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2921       break;
2922     }
2923
2924   switch (version)
2925     {
2926     case E_NDS32_ELF_VER_1_2:
2927     case E_NDS32_ELF_VER_1_3:
2928     case E_NDS32_ELF_VER_1_4:
2929       r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2930       break;
2931
2932     default:
2933       r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2934       break;
2935     }
2936
2937   if (E_NDS_ABI_V0 == abi)
2938     {
2939       /* OLD ABI; only used in N1213HC, has performance extension 1.  */
2940       r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2941       if (arch == E_NDS_ARCH_STAR_V1_0)
2942         r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2943       return;
2944     }
2945
2946   switch (arch)
2947     {
2948     case E_NDS_ARCH_STAR_V1_0:
2949     case E_NDS_ARCH_STAR_V2_0:
2950     case E_NDS_ARCH_STAR_V3_0:
2951     case E_NDS_ARCH_STAR_V3_M:
2952       r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2953       break;
2954
2955     default:
2956       r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2957       /* ARCH version determines how the e_flags are interpreted.
2958          If it is unknown, we cannot proceed.  */
2959       return;
2960     }
2961
2962   /* Newer ABI; Now handle architecture specific flags.  */
2963   if (arch == E_NDS_ARCH_STAR_V1_0)
2964     {
2965       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2966         r += snprintf (buf + r, size -r, ", MFUSR_PC");
2967
2968       if (!(config & E_NDS32_HAS_NO_MAC_INST))
2969         r += snprintf (buf + r, size -r, ", MAC");
2970
2971       if (config & E_NDS32_HAS_DIV_INST)
2972         r += snprintf (buf + r, size -r, ", DIV");
2973
2974       if (config & E_NDS32_HAS_16BIT_INST)
2975         r += snprintf (buf + r, size -r, ", 16b");
2976     }
2977   else
2978     {
2979       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2980         {
2981           if (version <= E_NDS32_ELF_VER_1_3)
2982             r += snprintf (buf + r, size -r, ", [B8]");
2983           else
2984             r += snprintf (buf + r, size -r, ", EX9");
2985         }
2986
2987       if (config & E_NDS32_HAS_MAC_DX_INST)
2988         r += snprintf (buf + r, size -r, ", MAC_DX");
2989
2990       if (config & E_NDS32_HAS_DIV_DX_INST)
2991         r += snprintf (buf + r, size -r, ", DIV_DX");
2992
2993       if (config & E_NDS32_HAS_16BIT_INST)
2994         {
2995           if (version <= E_NDS32_ELF_VER_1_3)
2996             r += snprintf (buf + r, size -r, ", 16b");
2997           else
2998             r += snprintf (buf + r, size -r, ", IFC");
2999         }
3000     }
3001
3002   if (config & E_NDS32_HAS_EXT_INST)
3003     r += snprintf (buf + r, size -r, ", PERF1");
3004
3005   if (config & E_NDS32_HAS_EXT2_INST)
3006     r += snprintf (buf + r, size -r, ", PERF2");
3007
3008   if (config & E_NDS32_HAS_FPU_INST)
3009     {
3010       has_fpu = TRUE;
3011       r += snprintf (buf + r, size -r, ", FPU_SP");
3012     }
3013
3014   if (config & E_NDS32_HAS_FPU_DP_INST)
3015     {
3016       has_fpu = TRUE;
3017       r += snprintf (buf + r, size -r, ", FPU_DP");
3018     }
3019
3020   if (config & E_NDS32_HAS_FPU_MAC_INST)
3021     {
3022       has_fpu = TRUE;
3023       r += snprintf (buf + r, size -r, ", FPU_MAC");
3024     }
3025
3026   if (has_fpu)
3027     {
3028       switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
3029         {
3030         case E_NDS32_FPU_REG_8SP_4DP:
3031           r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
3032           break;
3033         case E_NDS32_FPU_REG_16SP_8DP:
3034           r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
3035           break;
3036         case E_NDS32_FPU_REG_32SP_16DP:
3037           r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
3038           break;
3039         case E_NDS32_FPU_REG_32SP_32DP:
3040           r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
3041           break;
3042         }
3043     }
3044
3045   if (config & E_NDS32_HAS_AUDIO_INST)
3046     r += snprintf (buf + r, size -r, ", AUDIO");
3047
3048   if (config & E_NDS32_HAS_STRING_INST)
3049     r += snprintf (buf + r, size -r, ", STR");
3050
3051   if (config & E_NDS32_HAS_REDUCED_REGS)
3052     r += snprintf (buf + r, size -r, ", 16REG");
3053
3054   if (config & E_NDS32_HAS_VIDEO_INST)
3055     {
3056       if (version <= E_NDS32_ELF_VER_1_3)
3057         r += snprintf (buf + r, size -r, ", VIDEO");
3058       else
3059         r += snprintf (buf + r, size -r, ", SATURATION");
3060     }
3061
3062   if (config & E_NDS32_HAS_ENCRIPT_INST)
3063     r += snprintf (buf + r, size -r, ", ENCRP");
3064
3065   if (config & E_NDS32_HAS_L2C_INST)
3066     r += snprintf (buf + r, size -r, ", L2C");
3067 }
3068
3069 static char *
3070 get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine)
3071 {
3072   static char buf[1024];
3073
3074   buf[0] = '\0';
3075
3076   if (e_flags)
3077     {
3078       switch (e_machine)
3079         {
3080         default:
3081           break;
3082
3083         case EM_ARC_COMPACT2:
3084         case EM_ARC_COMPACT:
3085           decode_ARC_machine_flags (e_flags, e_machine, buf);
3086           break;
3087
3088         case EM_ARM:
3089           decode_ARM_machine_flags (e_flags, buf);
3090           break;
3091
3092         case EM_AVR:
3093           decode_AVR_machine_flags (e_flags, buf, sizeof buf);
3094           break;
3095
3096         case EM_BLACKFIN:
3097           if (e_flags & EF_BFIN_PIC)
3098             strcat (buf, ", PIC");
3099
3100           if (e_flags & EF_BFIN_FDPIC)
3101             strcat (buf, ", FDPIC");
3102
3103           if (e_flags & EF_BFIN_CODE_IN_L1)
3104             strcat (buf, ", code in L1");
3105
3106           if (e_flags & EF_BFIN_DATA_IN_L1)
3107             strcat (buf, ", data in L1");
3108
3109           break;
3110
3111         case EM_CYGNUS_FRV:
3112           switch (e_flags & EF_FRV_CPU_MASK)
3113             {
3114             case EF_FRV_CPU_GENERIC:
3115               break;
3116
3117             default:
3118               strcat (buf, ", fr???");
3119               break;
3120
3121             case EF_FRV_CPU_FR300:
3122               strcat (buf, ", fr300");
3123               break;
3124
3125             case EF_FRV_CPU_FR400:
3126               strcat (buf, ", fr400");
3127               break;
3128             case EF_FRV_CPU_FR405:
3129               strcat (buf, ", fr405");
3130               break;
3131
3132             case EF_FRV_CPU_FR450:
3133               strcat (buf, ", fr450");
3134               break;
3135
3136             case EF_FRV_CPU_FR500:
3137               strcat (buf, ", fr500");
3138               break;
3139             case EF_FRV_CPU_FR550:
3140               strcat (buf, ", fr550");
3141               break;
3142
3143             case EF_FRV_CPU_SIMPLE:
3144               strcat (buf, ", simple");
3145               break;
3146             case EF_FRV_CPU_TOMCAT:
3147               strcat (buf, ", tomcat");
3148               break;
3149             }
3150           break;
3151
3152         case EM_68K:
3153           if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
3154             strcat (buf, ", m68000");
3155           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3156             strcat (buf, ", cpu32");
3157           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
3158             strcat (buf, ", fido_a");
3159           else
3160             {
3161               char const * isa = _("unknown");
3162               char const * mac = _("unknown mac");
3163               char const * additional = NULL;
3164
3165               switch (e_flags & EF_M68K_CF_ISA_MASK)
3166                 {
3167                 case EF_M68K_CF_ISA_A_NODIV:
3168                   isa = "A";
3169                   additional = ", nodiv";
3170                   break;
3171                 case EF_M68K_CF_ISA_A:
3172                   isa = "A";
3173                   break;
3174                 case EF_M68K_CF_ISA_A_PLUS:
3175                   isa = "A+";
3176                   break;
3177                 case EF_M68K_CF_ISA_B_NOUSP:
3178                   isa = "B";
3179                   additional = ", nousp";
3180                   break;
3181                 case EF_M68K_CF_ISA_B:
3182                   isa = "B";
3183                   break;
3184                 case EF_M68K_CF_ISA_C:
3185                   isa = "C";
3186                   break;
3187                 case EF_M68K_CF_ISA_C_NODIV:
3188                   isa = "C";
3189                   additional = ", nodiv";
3190                   break;
3191                 }
3192               strcat (buf, ", cf, isa ");
3193               strcat (buf, isa);
3194               if (additional)
3195                 strcat (buf, additional);
3196               if (e_flags & EF_M68K_CF_FLOAT)
3197                 strcat (buf, ", float");
3198               switch (e_flags & EF_M68K_CF_MAC_MASK)
3199                 {
3200                 case 0:
3201                   mac = NULL;
3202                   break;
3203                 case EF_M68K_CF_MAC:
3204                   mac = "mac";
3205                   break;
3206                 case EF_M68K_CF_EMAC:
3207                   mac = "emac";
3208                   break;
3209                 case EF_M68K_CF_EMAC_B:
3210                   mac = "emac_b";
3211                   break;
3212                 }
3213               if (mac)
3214                 {
3215                   strcat (buf, ", ");
3216                   strcat (buf, mac);
3217                 }
3218             }
3219           break;
3220
3221         case EM_CYGNUS_MEP:
3222           switch (e_flags & EF_MEP_CPU_MASK)
3223             {
3224             case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3225             case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3226             case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3227             case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3228             case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3229             case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3230             default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3231             }
3232
3233           switch (e_flags & EF_MEP_COP_MASK)
3234             {
3235             case EF_MEP_COP_NONE: break;
3236             case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3237             case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3238             case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3239             case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3240             default: strcat (buf, _("<unknown MeP copro type>")); break;
3241             }
3242
3243           if (e_flags & EF_MEP_LIBRARY)
3244             strcat (buf, ", Built for Library");
3245
3246           if (e_flags & EF_MEP_INDEX_MASK)
3247             sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3248                      e_flags & EF_MEP_INDEX_MASK);
3249
3250           if (e_flags & ~ EF_MEP_ALL_FLAGS)
3251             sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3252                      e_flags & ~ EF_MEP_ALL_FLAGS);
3253           break;
3254
3255         case EM_PPC:
3256           if (e_flags & EF_PPC_EMB)
3257             strcat (buf, ", emb");
3258
3259           if (e_flags & EF_PPC_RELOCATABLE)
3260             strcat (buf, _(", relocatable"));
3261
3262           if (e_flags & EF_PPC_RELOCATABLE_LIB)
3263             strcat (buf, _(", relocatable-lib"));
3264           break;
3265
3266         case EM_PPC64:
3267           if (e_flags & EF_PPC64_ABI)
3268             {
3269               char abi[] = ", abiv0";
3270
3271               abi[6] += e_flags & EF_PPC64_ABI;
3272               strcat (buf, abi);
3273             }
3274           break;
3275
3276         case EM_V800:
3277           if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3278             strcat (buf, ", RH850 ABI");
3279
3280           if (e_flags & EF_V800_850E3)
3281             strcat (buf, ", V3 architecture");
3282
3283           if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3284             strcat (buf, ", FPU not used");
3285
3286           if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3287             strcat (buf, ", regmode: COMMON");
3288
3289           if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3290             strcat (buf, ", r4 not used");
3291
3292           if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3293             strcat (buf, ", r30 not used");
3294
3295           if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3296             strcat (buf, ", r5 not used");
3297
3298           if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3299             strcat (buf, ", r2 not used");
3300
3301           for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3302             {
3303               switch (e_flags & - e_flags)
3304                 {
3305                 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3306                 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3307                 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3308                 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3309                 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3310                 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3311                 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3312                 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3313                 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3314                 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3315                 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3316                 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3317                 default: break;
3318                 }
3319             }
3320           break;
3321
3322         case EM_V850:
3323         case EM_CYGNUS_V850:
3324           switch (e_flags & EF_V850_ARCH)
3325             {
3326             case E_V850E3V5_ARCH:
3327               strcat (buf, ", v850e3v5");
3328               break;
3329             case E_V850E2V3_ARCH:
3330               strcat (buf, ", v850e2v3");
3331               break;
3332             case E_V850E2_ARCH:
3333               strcat (buf, ", v850e2");
3334               break;
3335             case E_V850E1_ARCH:
3336               strcat (buf, ", v850e1");
3337               break;
3338             case E_V850E_ARCH:
3339               strcat (buf, ", v850e");
3340               break;
3341             case E_V850_ARCH:
3342               strcat (buf, ", v850");
3343               break;
3344             default:
3345               strcat (buf, _(", unknown v850 architecture variant"));
3346               break;
3347             }
3348           break;
3349
3350         case EM_M32R:
3351         case EM_CYGNUS_M32R:
3352           if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3353             strcat (buf, ", m32r");
3354           break;
3355
3356         case EM_MIPS:
3357         case EM_MIPS_RS3_LE:
3358           if (e_flags & EF_MIPS_NOREORDER)
3359             strcat (buf, ", noreorder");
3360
3361           if (e_flags & EF_MIPS_PIC)
3362             strcat (buf, ", pic");
3363
3364           if (e_flags & EF_MIPS_CPIC)
3365             strcat (buf, ", cpic");
3366
3367           if (e_flags & EF_MIPS_UCODE)
3368             strcat (buf, ", ugen_reserved");
3369
3370           if (e_flags & EF_MIPS_ABI2)
3371             strcat (buf, ", abi2");
3372
3373           if (e_flags & EF_MIPS_OPTIONS_FIRST)
3374             strcat (buf, ", odk first");
3375
3376           if (e_flags & EF_MIPS_32BITMODE)
3377             strcat (buf, ", 32bitmode");
3378
3379           if (e_flags & EF_MIPS_NAN2008)
3380             strcat (buf, ", nan2008");
3381
3382           if (e_flags & EF_MIPS_FP64)
3383             strcat (buf, ", fp64");
3384
3385           switch ((e_flags & EF_MIPS_MACH))
3386             {
3387             case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3388             case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3389             case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3390             case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3391             case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3392             case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3393             case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3394             case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3395             case E_MIPS_MACH_5900: strcat (buf, ", 5900"); break;
3396             case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
3397             case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3398             case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3399             case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3400             case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
3401             case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3402             case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3403             case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3404             case E_MIPS_MACH_XLR:  strcat (buf, ", xlr"); break;
3405             case E_MIPS_MACH_IAMR2:  strcat (buf, ", interaptiv-mr2"); break;
3406             case 0:
3407             /* We simply ignore the field in this case to avoid confusion:
3408                MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3409                extension.  */
3410               break;
3411             default: strcat (buf, _(", unknown CPU")); break;
3412             }
3413
3414           switch ((e_flags & EF_MIPS_ABI))
3415             {
3416             case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3417             case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3418             case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3419             case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3420             case 0:
3421             /* We simply ignore the field in this case to avoid confusion:
3422                MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3423                This means it is likely to be an o32 file, but not for
3424                sure.  */
3425               break;
3426             default: strcat (buf, _(", unknown ABI")); break;
3427             }
3428
3429           if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3430             strcat (buf, ", mdmx");
3431
3432           if (e_flags & EF_MIPS_ARCH_ASE_M16)
3433             strcat (buf, ", mips16");
3434
3435           if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3436             strcat (buf, ", micromips");
3437
3438           switch ((e_flags & EF_MIPS_ARCH))
3439             {
3440             case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3441             case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3442             case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3443             case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3444             case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3445             case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3446             case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3447             case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3448             case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3449             case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3450             case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3451             default: strcat (buf, _(", unknown ISA")); break;
3452             }
3453           break;
3454
3455         case EM_NDS32:
3456           decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3457           break;
3458
3459         case EM_NFP:
3460           switch (EF_NFP_MACH (e_flags))
3461             {
3462             case E_NFP_MACH_3200:
3463               strcat (buf, ", NFP-32xx");
3464               break;
3465             case E_NFP_MACH_6000:
3466               strcat (buf, ", NFP-6xxx");
3467               break;
3468             }
3469           break;
3470
3471         case EM_RISCV:
3472           if (e_flags & EF_RISCV_RVC)
3473             strcat (buf, ", RVC");
3474
3475           if (e_flags & EF_RISCV_RVE)
3476             strcat (buf, ", RVE");
3477
3478           switch (e_flags & EF_RISCV_FLOAT_ABI)
3479             {
3480             case EF_RISCV_FLOAT_ABI_SOFT:
3481               strcat (buf, ", soft-float ABI");
3482               break;
3483
3484             case EF_RISCV_FLOAT_ABI_SINGLE:
3485               strcat (buf, ", single-float ABI");
3486               break;
3487
3488             case EF_RISCV_FLOAT_ABI_DOUBLE:
3489               strcat (buf, ", double-float ABI");
3490               break;
3491
3492             case EF_RISCV_FLOAT_ABI_QUAD:
3493               strcat (buf, ", quad-float ABI");
3494               break;
3495             }
3496           break;
3497
3498         case EM_SH:
3499           switch ((e_flags & EF_SH_MACH_MASK))
3500             {
3501             case EF_SH1: strcat (buf, ", sh1"); break;
3502             case EF_SH2: strcat (buf, ", sh2"); break;
3503             case EF_SH3: strcat (buf, ", sh3"); break;
3504             case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3505             case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3506             case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3507             case EF_SH3E: strcat (buf, ", sh3e"); break;
3508             case EF_SH4: strcat (buf, ", sh4"); break;
3509             case EF_SH5: strcat (buf, ", sh5"); break;
3510             case EF_SH2E: strcat (buf, ", sh2e"); break;
3511             case EF_SH4A: strcat (buf, ", sh4a"); break;
3512             case EF_SH2A: strcat (buf, ", sh2a"); break;
3513             case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3514             case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3515             case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3516             case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3517             case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3518             case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3519             case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3520             case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3521             case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3522             default: strcat (buf, _(", unknown ISA")); break;
3523             }
3524
3525           if (e_flags & EF_SH_PIC)
3526             strcat (buf, ", pic");
3527
3528           if (e_flags & EF_SH_FDPIC)
3529             strcat (buf, ", fdpic");
3530           break;
3531
3532         case EM_OR1K:
3533           if (e_flags & EF_OR1K_NODELAY)
3534             strcat (buf, ", no delay");
3535           break;
3536
3537         case EM_SPARCV9:
3538           if (e_flags & EF_SPARC_32PLUS)
3539             strcat (buf, ", v8+");
3540
3541           if (e_flags & EF_SPARC_SUN_US1)
3542             strcat (buf, ", ultrasparcI");
3543
3544           if (e_flags & EF_SPARC_SUN_US3)
3545             strcat (buf, ", ultrasparcIII");
3546
3547           if (e_flags & EF_SPARC_HAL_R1)
3548             strcat (buf, ", halr1");
3549
3550           if (e_flags & EF_SPARC_LEDATA)
3551             strcat (buf, ", ledata");
3552
3553           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3554             strcat (buf, ", tso");
3555
3556           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3557             strcat (buf, ", pso");
3558
3559           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3560             strcat (buf, ", rmo");
3561           break;
3562
3563         case EM_PARISC:
3564           switch (e_flags & EF_PARISC_ARCH)
3565             {
3566             case EFA_PARISC_1_0:
3567               strcpy (buf, ", PA-RISC 1.0");
3568               break;
3569             case EFA_PARISC_1_1:
3570               strcpy (buf, ", PA-RISC 1.1");
3571               break;
3572             case EFA_PARISC_2_0:
3573               strcpy (buf, ", PA-RISC 2.0");
3574               break;
3575             default:
3576               break;
3577             }
3578           if (e_flags & EF_PARISC_TRAPNIL)
3579             strcat (buf, ", trapnil");
3580           if (e_flags & EF_PARISC_EXT)
3581             strcat (buf, ", ext");
3582           if (e_flags & EF_PARISC_LSB)
3583             strcat (buf, ", lsb");
3584           if (e_flags & EF_PARISC_WIDE)
3585             strcat (buf, ", wide");
3586           if (e_flags & EF_PARISC_NO_KABP)
3587             strcat (buf, ", no kabp");
3588           if (e_flags & EF_PARISC_LAZYSWAP)
3589             strcat (buf, ", lazyswap");
3590           break;
3591
3592         case EM_PJ:
3593         case EM_PJ_OLD:
3594           if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3595             strcat (buf, ", new calling convention");
3596
3597           if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3598             strcat (buf, ", gnu calling convention");
3599           break;
3600
3601         case EM_IA_64:
3602           if ((e_flags & EF_IA_64_ABI64))
3603             strcat (buf, ", 64-bit");
3604           else
3605             strcat (buf, ", 32-bit");
3606           if ((e_flags & EF_IA_64_REDUCEDFP))
3607             strcat (buf, ", reduced fp model");
3608           if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3609             strcat (buf, ", no function descriptors, constant gp");
3610           else if ((e_flags & EF_IA_64_CONS_GP))
3611             strcat (buf, ", constant gp");
3612           if ((e_flags & EF_IA_64_ABSOLUTE))
3613             strcat (buf, ", absolute");
3614           if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3615             {
3616               if ((e_flags & EF_IA_64_VMS_LINKAGES))
3617                 strcat (buf, ", vms_linkages");
3618               switch ((e_flags & EF_IA_64_VMS_COMCOD))
3619                 {
3620                 case EF_IA_64_VMS_COMCOD_SUCCESS:
3621                   break;
3622                 case EF_IA_64_VMS_COMCOD_WARNING:
3623                   strcat (buf, ", warning");
3624                   break;
3625                 case EF_IA_64_VMS_COMCOD_ERROR:
3626                   strcat (buf, ", error");
3627                   break;
3628                 case EF_IA_64_VMS_COMCOD_ABORT:
3629                   strcat (buf, ", abort");
3630                   break;
3631                 default:
3632                   warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3633                         e_flags & EF_IA_64_VMS_COMCOD);
3634                   strcat (buf, ", <unknown>");
3635                 }
3636             }
3637           break;
3638
3639         case EM_VAX:
3640           if ((e_flags & EF_VAX_NONPIC))
3641             strcat (buf, ", non-PIC");
3642           if ((e_flags & EF_VAX_DFLOAT))
3643             strcat (buf, ", D-Float");
3644           if ((e_flags & EF_VAX_GFLOAT))
3645             strcat (buf, ", G-Float");
3646           break;
3647
3648         case EM_VISIUM:
3649           if (e_flags & EF_VISIUM_ARCH_MCM)
3650             strcat (buf, ", mcm");
3651           else if (e_flags & EF_VISIUM_ARCH_MCM24)
3652             strcat (buf, ", mcm24");
3653           if (e_flags & EF_VISIUM_ARCH_GR6)
3654             strcat (buf, ", gr6");
3655           break;
3656
3657         case EM_RL78:
3658           switch (e_flags & E_FLAG_RL78_CPU_MASK)
3659             {
3660             case E_FLAG_RL78_ANY_CPU: break;
3661             case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3662             case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3663             case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3664             }
3665           if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3666             strcat (buf, ", 64-bit doubles");
3667           break;
3668
3669         case EM_RX:
3670           if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3671             strcat (buf, ", 64-bit doubles");
3672           if (e_flags & E_FLAG_RX_DSP)
3673             strcat (buf, ", dsp");
3674           if (e_flags & E_FLAG_RX_PID)
3675             strcat (buf, ", pid");
3676           if (e_flags & E_FLAG_RX_ABI)
3677             strcat (buf, ", RX ABI");
3678           if (e_flags & E_FLAG_RX_SINSNS_SET)
3679             strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3680                     ? ", uses String instructions" : ", bans String instructions");
3681           if (e_flags & E_FLAG_RX_V2)
3682             strcat (buf, ", V2");
3683           break;
3684
3685         case EM_S390:
3686           if (e_flags & EF_S390_HIGH_GPRS)
3687             strcat (buf, ", highgprs");
3688           break;
3689
3690         case EM_TI_C6000:
3691           if ((e_flags & EF_C6000_REL))
3692             strcat (buf, ", relocatable module");
3693           break;
3694
3695         case EM_MSP430:
3696           strcat (buf, _(": architecture variant: "));
3697           switch (e_flags & EF_MSP430_MACH)
3698             {
3699             case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3700             case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3701             case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3702             case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3703             case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3704             case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3705             case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3706             case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3707             case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3708             case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3709             case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3710             case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3711             case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3712             case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3713             case E_MSP430_MACH_MSP430X  : strcat (buf, "MSP430X"); break;
3714             default:
3715               strcat (buf, _(": unknown")); break;
3716             }
3717
3718           if (e_flags & ~ EF_MSP430_MACH)
3719             strcat (buf, _(": unknown extra flag bits also present"));
3720         }
3721     }
3722
3723   return buf;
3724 }
3725
3726 static const char *
3727 get_osabi_name (Filedata * filedata, unsigned int osabi)
3728 {
3729   static char buff[32];
3730
3731   switch (osabi)
3732     {
3733     case ELFOSABI_NONE:         return "UNIX - System V";
3734     case ELFOSABI_HPUX:         return "UNIX - HP-UX";
3735     case ELFOSABI_NETBSD:       return "UNIX - NetBSD";
3736     case ELFOSABI_GNU:          return "UNIX - GNU";
3737     case ELFOSABI_SOLARIS:      return "UNIX - Solaris";
3738     case ELFOSABI_AIX:          return "UNIX - AIX";
3739     case ELFOSABI_IRIX:         return "UNIX - IRIX";
3740     case ELFOSABI_FREEBSD:      return "UNIX - FreeBSD";
3741     case ELFOSABI_TRU64:        return "UNIX - TRU64";
3742     case ELFOSABI_MODESTO:      return "Novell - Modesto";
3743     case ELFOSABI_OPENBSD:      return "UNIX - OpenBSD";
3744     case ELFOSABI_OPENVMS:      return "VMS - OpenVMS";
3745     case ELFOSABI_NSK:          return "HP - Non-Stop Kernel";
3746     case ELFOSABI_AROS:         return "AROS";
3747     case ELFOSABI_FENIXOS:      return "FenixOS";
3748     case ELFOSABI_CLOUDABI:     return "Nuxi CloudABI";
3749     case ELFOSABI_OPENVOS:      return "Stratus Technologies OpenVOS";
3750     default:
3751       if (osabi >= 64)
3752         switch (filedata->file_header.e_machine)
3753           {
3754           case EM_ARM:
3755             switch (osabi)
3756               {
3757               case ELFOSABI_ARM:        return "ARM";
3758               case ELFOSABI_ARM_FDPIC:  return "ARM FDPIC";
3759               default:
3760                 break;
3761               }
3762             break;
3763
3764           case EM_MSP430:
3765           case EM_MSP430_OLD:
3766           case EM_VISIUM:
3767             switch (osabi)
3768               {
3769               case ELFOSABI_STANDALONE: return _("Standalone App");
3770               default:
3771                 break;
3772               }
3773             break;
3774
3775           case EM_TI_C6000:
3776             switch (osabi)
3777               {
3778               case ELFOSABI_C6000_ELFABI:       return _("Bare-metal C6000");
3779               case ELFOSABI_C6000_LINUX:        return "Linux C6000";
3780               default:
3781                 break;
3782               }
3783             break;
3784
3785           default:
3786             break;
3787           }
3788       snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3789       return buff;
3790     }
3791 }
3792
3793 static const char *
3794 get_aarch64_segment_type (unsigned long type)
3795 {
3796   switch (type)
3797     {
3798     case PT_AARCH64_ARCHEXT:  return "AARCH64_ARCHEXT";
3799     default:                  return NULL;
3800     }
3801 }
3802
3803 static const char *
3804 get_arm_segment_type (unsigned long type)
3805 {
3806   switch (type)
3807     {
3808     case PT_ARM_EXIDX: return "EXIDX";
3809     default:           return NULL;
3810     }
3811 }
3812
3813 static const char *
3814 get_s390_segment_type (unsigned long type)
3815 {
3816   switch (type)
3817     {
3818     case PT_S390_PGSTE: return "S390_PGSTE";
3819     default:            return NULL;
3820     }
3821 }
3822
3823 static const char *
3824 get_mips_segment_type (unsigned long type)
3825 {
3826   switch (type)
3827     {
3828     case PT_MIPS_REGINFO:   return "REGINFO";
3829     case PT_MIPS_RTPROC:    return "RTPROC";
3830     case PT_MIPS_OPTIONS:   return "OPTIONS";
3831     case PT_MIPS_ABIFLAGS:  return "ABIFLAGS";
3832     default:                return NULL;
3833     }
3834 }
3835
3836 static const char *
3837 get_parisc_segment_type (unsigned long type)
3838 {
3839   switch (type)
3840     {
3841     case PT_HP_TLS:             return "HP_TLS";
3842     case PT_HP_CORE_NONE:       return "HP_CORE_NONE";
3843     case PT_HP_CORE_VERSION:    return "HP_CORE_VERSION";
3844     case PT_HP_CORE_KERNEL:     return "HP_CORE_KERNEL";
3845     case PT_HP_CORE_COMM:       return "HP_CORE_COMM";
3846     case PT_HP_CORE_PROC:       return "HP_CORE_PROC";
3847     case PT_HP_CORE_LOADABLE:   return "HP_CORE_LOADABLE";
3848     case PT_HP_CORE_STACK:      return "HP_CORE_STACK";
3849     case PT_HP_CORE_SHM:        return "HP_CORE_SHM";
3850     case PT_HP_CORE_MMF:        return "HP_CORE_MMF";
3851     case PT_HP_PARALLEL:        return "HP_PARALLEL";
3852     case PT_HP_FASTBIND:        return "HP_FASTBIND";
3853     case PT_HP_OPT_ANNOT:       return "HP_OPT_ANNOT";
3854     case PT_HP_HSL_ANNOT:       return "HP_HSL_ANNOT";
3855     case PT_HP_STACK:           return "HP_STACK";
3856     case PT_HP_CORE_UTSNAME:    return "HP_CORE_UTSNAME";
3857     case PT_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
3858     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
3859     case PT_PARISC_WEAKORDER:   return "PARISC_WEAKORDER";
3860     default:                    return NULL;
3861     }
3862 }
3863
3864 static const char *
3865 get_ia64_segment_type (unsigned long type)
3866 {
3867   switch (type)
3868     {
3869     case PT_IA_64_ARCHEXT:      return "IA_64_ARCHEXT";
3870     case PT_IA_64_UNWIND:       return "IA_64_UNWIND";
3871     case PT_HP_TLS:             return "HP_TLS";
3872     case PT_IA_64_HP_OPT_ANOT:  return "HP_OPT_ANNOT";
3873     case PT_IA_64_HP_HSL_ANOT:  return "HP_HSL_ANNOT";
3874     case PT_IA_64_HP_STACK:     return "HP_STACK";
3875     default:                    return NULL;
3876     }
3877 }
3878
3879 static const char *
3880 get_tic6x_segment_type (unsigned long type)
3881 {
3882   switch (type)
3883     {
3884     case PT_C6000_PHATTR:  return "C6000_PHATTR";
3885     default:               return NULL;
3886     }
3887 }
3888
3889 static const char *
3890 get_solaris_segment_type (unsigned long type)
3891 {
3892   switch (type)
3893     {
3894     case 0x6464e550: return "PT_SUNW_UNWIND";
3895     case 0x6474e550: return "PT_SUNW_EH_FRAME";
3896     case 0x6ffffff7: return "PT_LOSUNW";
3897     case 0x6ffffffa: return "PT_SUNWBSS";
3898     case 0x6ffffffb: return "PT_SUNWSTACK";
3899     case 0x6ffffffc: return "PT_SUNWDTRACE";
3900     case 0x6ffffffd: return "PT_SUNWCAP";
3901     case 0x6fffffff: return "PT_HISUNW";
3902     default:         return NULL;
3903     }
3904 }
3905
3906 static const char *
3907 get_segment_type (Filedata * filedata, unsigned long p_type)
3908 {
3909   static char buff[32];
3910
3911   switch (p_type)
3912     {
3913     case PT_NULL:       return "NULL";
3914     case PT_LOAD:       return "LOAD";
3915     case PT_DYNAMIC:    return "DYNAMIC";
3916     case PT_INTERP:     return "INTERP";
3917     case PT_NOTE:       return "NOTE";
3918     case PT_SHLIB:      return "SHLIB";
3919     case PT_PHDR:       return "PHDR";
3920     case PT_TLS:        return "TLS";
3921     case PT_GNU_EH_FRAME: return "GNU_EH_FRAME";
3922     case PT_GNU_STACK:  return "GNU_STACK";
3923     case PT_GNU_RELRO:  return "GNU_RELRO";
3924
3925     default:
3926       if (p_type >= PT_GNU_MBIND_LO && p_type <= PT_GNU_MBIND_HI)
3927         {
3928           sprintf (buff, "GNU_MBIND+%#lx",
3929                    p_type - PT_GNU_MBIND_LO);
3930         }
3931       else if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3932         {
3933           const char * result;
3934
3935           switch (filedata->file_header.e_machine)
3936             {
3937             case EM_AARCH64:
3938               result = get_aarch64_segment_type (p_type);
3939               break;
3940             case EM_ARM:
3941               result = get_arm_segment_type (p_type);
3942               break;
3943             case EM_MIPS:
3944             case EM_MIPS_RS3_LE:
3945               result = get_mips_segment_type (p_type);
3946               break;
3947             case EM_PARISC:
3948               result = get_parisc_segment_type (p_type);
3949               break;
3950             case EM_IA_64:
3951               result = get_ia64_segment_type (p_type);
3952               break;
3953             case EM_TI_C6000:
3954               result = get_tic6x_segment_type (p_type);
3955               break;
3956             case EM_S390:
3957             case EM_S390_OLD:
3958               result = get_s390_segment_type (p_type);
3959               break;
3960             default:
3961               result = NULL;
3962               break;
3963             }
3964
3965           if (result != NULL)
3966             return result;
3967
3968           sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
3969         }
3970       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3971         {
3972           const char * result;
3973
3974           switch (filedata->file_header.e_machine)
3975             {
3976             case EM_PARISC:
3977               result = get_parisc_segment_type (p_type);
3978               break;
3979             case EM_IA_64:
3980               result = get_ia64_segment_type (p_type);
3981               break;
3982             default:
3983               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
3984                 result = get_solaris_segment_type (p_type);
3985               else
3986                 result = NULL;
3987               break;
3988             }
3989
3990           if (result != NULL)
3991             return result;
3992
3993           sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
3994         }
3995       else
3996         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3997
3998       return buff;
3999     }
4000 }
4001
4002 static const char *
4003 get_arc_section_type_name (unsigned int sh_type)
4004 {
4005   switch (sh_type)
4006     {
4007     case SHT_ARC_ATTRIBUTES:      return "ARC_ATTRIBUTES";
4008     default:
4009       break;
4010     }
4011   return NULL;
4012 }
4013
4014 static const char *
4015 get_mips_section_type_name (unsigned int sh_type)
4016 {
4017   switch (sh_type)
4018     {
4019     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
4020     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
4021     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
4022     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
4023     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
4024     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
4025     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
4026     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
4027     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
4028     case SHT_MIPS_RELD:          return "MIPS_RELD";
4029     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
4030     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
4031     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
4032     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
4033     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
4034     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
4035     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
4036     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
4037     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
4038     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
4039     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
4040     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
4041     case SHT_MIPS_LINE:          return "MIPS_LINE";
4042     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
4043     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
4044     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
4045     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
4046     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
4047     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
4048     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
4049     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
4050     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
4051     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
4052     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
4053     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
4054     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
4055     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
4056     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
4057     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
4058     case SHT_MIPS_ABIFLAGS:      return "MIPS_ABIFLAGS";
4059     default:
4060       break;
4061     }
4062   return NULL;
4063 }
4064
4065 static const char *
4066 get_parisc_section_type_name (unsigned int sh_type)
4067 {
4068   switch (sh_type)
4069     {
4070     case SHT_PARISC_EXT:        return "PARISC_EXT";
4071     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
4072     case SHT_PARISC_DOC:        return "PARISC_DOC";
4073     case SHT_PARISC_ANNOT:      return "PARISC_ANNOT";
4074     case SHT_PARISC_SYMEXTN:    return "PARISC_SYMEXTN";
4075     case SHT_PARISC_STUBS:      return "PARISC_STUBS";
4076     case SHT_PARISC_DLKM:       return "PARISC_DLKM";
4077     default:                    return NULL;
4078     }
4079 }
4080
4081 static const char *
4082 get_ia64_section_type_name (Filedata * filedata, unsigned int sh_type)
4083 {
4084   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
4085   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
4086     return get_osabi_name (filedata, (sh_type & 0x00FF0000) >> 16);
4087
4088   switch (sh_type)
4089     {
4090     case SHT_IA_64_EXT:                return "IA_64_EXT";
4091     case SHT_IA_64_UNWIND:             return "IA_64_UNWIND";
4092     case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
4093     case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
4094     case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
4095     case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
4096     case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
4097     case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
4098     case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
4099     case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
4100     default:
4101       break;
4102     }
4103   return NULL;
4104 }
4105
4106 static const char *
4107 get_x86_64_section_type_name (unsigned int sh_type)
4108 {
4109   switch (sh_type)
4110     {
4111     case SHT_X86_64_UNWIND:     return "X86_64_UNWIND";
4112     default:                    return NULL;
4113     }
4114 }
4115
4116 static const char *
4117 get_aarch64_section_type_name (unsigned int sh_type)
4118 {
4119   switch (sh_type)
4120     {
4121     case SHT_AARCH64_ATTRIBUTES: return "AARCH64_ATTRIBUTES";
4122     default:                     return NULL;
4123     }
4124 }
4125
4126 static const char *
4127 get_arm_section_type_name (unsigned int sh_type)
4128 {
4129   switch (sh_type)
4130     {
4131     case SHT_ARM_EXIDX:           return "ARM_EXIDX";
4132     case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
4133     case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
4134     case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
4135     case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
4136     default:                      return NULL;
4137     }
4138 }
4139
4140 static const char *
4141 get_tic6x_section_type_name (unsigned int sh_type)
4142 {
4143   switch (sh_type)
4144     {
4145     case SHT_C6000_UNWIND:      return "C6000_UNWIND";
4146     case SHT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
4147     case SHT_C6000_ATTRIBUTES:  return "C6000_ATTRIBUTES";
4148     case SHT_TI_ICODE:          return "TI_ICODE";
4149     case SHT_TI_XREF:           return "TI_XREF";
4150     case SHT_TI_HANDLER:        return "TI_HANDLER";
4151     case SHT_TI_INITINFO:       return "TI_INITINFO";
4152     case SHT_TI_PHATTRS:        return "TI_PHATTRS";
4153     default:                    return NULL;
4154     }
4155 }
4156
4157 static const char *
4158 get_msp430x_section_type_name (unsigned int sh_type)
4159 {
4160   switch (sh_type)
4161     {
4162     case SHT_MSP430_SEC_FLAGS:    return "MSP430_SEC_FLAGS";
4163     case SHT_MSP430_SYM_ALIASES:  return "MSP430_SYM_ALIASES";
4164     case SHT_MSP430_ATTRIBUTES:   return "MSP430_ATTRIBUTES";
4165     default:                      return NULL;
4166     }
4167 }
4168
4169 static const char *
4170 get_nfp_section_type_name (unsigned int sh_type)
4171 {
4172   switch (sh_type)
4173     {
4174     case SHT_NFP_MECONFIG:      return "NFP_MECONFIG";
4175     case SHT_NFP_INITREG:       return "NFP_INITREG";
4176     case SHT_NFP_UDEBUG:        return "NFP_UDEBUG";
4177     default:                    return NULL;
4178     }
4179 }
4180
4181 static const char *
4182 get_v850_section_type_name (unsigned int sh_type)
4183 {
4184   switch (sh_type)
4185     {
4186     case SHT_V850_SCOMMON:  return "V850 Small Common";
4187     case SHT_V850_TCOMMON:  return "V850 Tiny Common";
4188     case SHT_V850_ZCOMMON:  return "V850 Zero Common";
4189     case SHT_RENESAS_IOP:   return "RENESAS IOP";
4190     case SHT_RENESAS_INFO:  return "RENESAS INFO";
4191     default:                return NULL;
4192     }
4193 }
4194
4195 static const char *
4196 get_section_type_name (Filedata * filedata, unsigned int sh_type)
4197 {
4198   static char buff[32];
4199   const char * result;
4200
4201   switch (sh_type)
4202     {
4203     case SHT_NULL:              return "NULL";
4204     case SHT_PROGBITS:          return "PROGBITS";
4205     case SHT_SYMTAB:            return "SYMTAB";
4206     case SHT_STRTAB:            return "STRTAB";
4207     case SHT_RELA:              return "RELA";
4208     case SHT_HASH:              return "HASH";
4209     case SHT_DYNAMIC:           return "DYNAMIC";
4210     case SHT_NOTE:              return "NOTE";
4211     case SHT_NOBITS:            return "NOBITS";
4212     case SHT_REL:               return "REL";
4213     case SHT_SHLIB:             return "SHLIB";
4214     case SHT_DYNSYM:            return "DYNSYM";
4215     case SHT_INIT_ARRAY:        return "INIT_ARRAY";
4216     case SHT_FINI_ARRAY:        return "FINI_ARRAY";
4217     case SHT_PREINIT_ARRAY:     return "PREINIT_ARRAY";
4218     case SHT_GNU_HASH:          return "GNU_HASH";
4219     case SHT_GROUP:             return "GROUP";
4220     case SHT_SYMTAB_SHNDX:      return "SYMTAB SECTION INDICIES";
4221     case SHT_GNU_verdef:        return "VERDEF";
4222     case SHT_GNU_verneed:       return "VERNEED";
4223     case SHT_GNU_versym:        return "VERSYM";
4224     case 0x6ffffff0:            return "VERSYM";
4225     case 0x6ffffffc:            return "VERDEF";
4226     case 0x7ffffffd:            return "AUXILIARY";
4227     case 0x7fffffff:            return "FILTER";
4228     case SHT_GNU_LIBLIST:       return "GNU_LIBLIST";
4229
4230     default:
4231       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4232         {
4233           switch (filedata->file_header.e_machine)
4234             {
4235             case EM_ARC:
4236             case EM_ARC_COMPACT:
4237             case EM_ARC_COMPACT2:
4238               result = get_arc_section_type_name (sh_type);
4239               break;
4240             case EM_MIPS:
4241             case EM_MIPS_RS3_LE:
4242               result = get_mips_section_type_name (sh_type);
4243               break;
4244             case EM_PARISC:
4245               result = get_parisc_section_type_name (sh_type);
4246               break;
4247             case EM_IA_64:
4248               result = get_ia64_section_type_name (filedata, sh_type);
4249               break;
4250             case EM_X86_64:
4251             case EM_L1OM:
4252             case EM_K1OM:
4253               result = get_x86_64_section_type_name (sh_type);
4254               break;
4255             case EM_AARCH64:
4256               result = get_aarch64_section_type_name (sh_type);
4257               break;
4258             case EM_ARM:
4259               result = get_arm_section_type_name (sh_type);
4260               break;
4261             case EM_TI_C6000:
4262               result = get_tic6x_section_type_name (sh_type);
4263               break;
4264             case EM_MSP430:
4265               result = get_msp430x_section_type_name (sh_type);
4266               break;
4267             case EM_NFP:
4268               result = get_nfp_section_type_name (sh_type);
4269               break;
4270             case EM_V800:
4271             case EM_V850:
4272             case EM_CYGNUS_V850:
4273               result = get_v850_section_type_name (sh_type);
4274               break;
4275             default:
4276               result = NULL;
4277               break;
4278             }
4279
4280           if (result != NULL)
4281             return result;
4282
4283           sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4284         }
4285       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4286         {
4287           switch (filedata->file_header.e_machine)
4288             {
4289             case EM_IA_64:
4290               result = get_ia64_section_type_name (filedata, sh_type);
4291               break;
4292             default:
4293               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4294                 result = get_solaris_section_type (sh_type);
4295               else
4296                 {
4297                   switch (sh_type)
4298                     {
4299                     case SHT_GNU_INCREMENTAL_INPUTS: result = "GNU_INCREMENTAL_INPUTS"; break;
4300                     case SHT_GNU_ATTRIBUTES: result = "GNU_ATTRIBUTES"; break;
4301                     case SHT_GNU_HASH: result = "GNU_HASH"; break;
4302                     case SHT_GNU_LIBLIST: result = "GNU_LIBLIST"; break;
4303                     default:
4304                       result = NULL;
4305                       break;
4306                     }
4307                 }
4308               break;
4309             }
4310
4311           if (result != NULL)
4312             return result;
4313
4314           sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4315         }
4316       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4317         {
4318           switch (filedata->file_header.e_machine)
4319             {
4320             case EM_V800:
4321             case EM_V850:
4322             case EM_CYGNUS_V850:
4323               result = get_v850_section_type_name (sh_type);
4324               break;
4325             default:
4326               result = NULL;
4327               break;
4328             }
4329
4330           if (result != NULL)
4331             return result;
4332
4333           sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4334         }
4335       else
4336         /* This message is probably going to be displayed in a 15
4337            character wide field, so put the hex value first.  */
4338         snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4339
4340       return buff;
4341     }
4342 }
4343
4344 #define OPTION_DEBUG_DUMP       512
4345 #define OPTION_DYN_SYMS         513
4346 #define OPTION_DWARF_DEPTH      514
4347 #define OPTION_DWARF_START      515
4348 #define OPTION_DWARF_CHECK      516
4349
4350 static struct option options[] =
4351 {
4352   {"all",              no_argument, 0, 'a'},
4353   {"file-header",      no_argument, 0, 'h'},
4354   {"program-headers",  no_argument, 0, 'l'},
4355   {"headers",          no_argument, 0, 'e'},
4356   {"histogram",        no_argument, 0, 'I'},
4357   {"segments",         no_argument, 0, 'l'},
4358   {"sections",         no_argument, 0, 'S'},
4359   {"section-headers",  no_argument, 0, 'S'},
4360   {"section-groups",   no_argument, 0, 'g'},
4361   {"section-details",  no_argument, 0, 't'},
4362   {"full-section-name",no_argument, 0, 'N'},
4363   {"symbols",          no_argument, 0, 's'},
4364   {"syms",             no_argument, 0, 's'},
4365   {"dyn-syms",         no_argument, 0, OPTION_DYN_SYMS},
4366   {"relocs",           no_argument, 0, 'r'},
4367   {"notes",            no_argument, 0, 'n'},
4368   {"dynamic",          no_argument, 0, 'd'},
4369   {"arch-specific",    no_argument, 0, 'A'},
4370   {"version-info",     no_argument, 0, 'V'},
4371   {"use-dynamic",      no_argument, 0, 'D'},
4372   {"unwind",           no_argument, 0, 'u'},
4373   {"archive-index",    no_argument, 0, 'c'},
4374   {"hex-dump",         required_argument, 0, 'x'},
4375   {"relocated-dump",   required_argument, 0, 'R'},
4376   {"string-dump",      required_argument, 0, 'p'},
4377   {"decompress",       no_argument, 0, 'z'},
4378 #ifdef SUPPORT_DISASSEMBLY
4379   {"instruction-dump", required_argument, 0, 'i'},
4380 #endif
4381   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
4382
4383   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
4384   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
4385   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
4386
4387   {"version",          no_argument, 0, 'v'},
4388   {"wide",             no_argument, 0, 'W'},
4389   {"help",             no_argument, 0, 'H'},
4390   {0,                  no_argument, 0, 0}
4391 };
4392
4393 static void
4394 usage (FILE * stream)
4395 {
4396   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4397   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4398   fprintf (stream, _(" Options are:\n\
4399   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4400   -h --file-header       Display the ELF file header\n\
4401   -l --program-headers   Display the program headers\n\
4402      --segments          An alias for --program-headers\n\
4403   -S --section-headers   Display the sections' header\n\
4404      --sections          An alias for --section-headers\n\
4405   -g --section-groups    Display the section groups\n\
4406   -t --section-details   Display the section details\n\
4407   -e --headers           Equivalent to: -h -l -S\n\
4408   -s --syms              Display the symbol table\n\
4409      --symbols           An alias for --syms\n\
4410   --dyn-syms             Display the dynamic symbol table\n\
4411   -n --notes             Display the core notes (if present)\n\
4412   -r --relocs            Display the relocations (if present)\n\
4413   -u --unwind            Display the unwind info (if present)\n\
4414   -d --dynamic           Display the dynamic section (if present)\n\
4415   -V --version-info      Display the version sections (if present)\n\
4416   -A --arch-specific     Display architecture specific information (if any)\n\
4417   -c --archive-index     Display the symbol/file index in an archive\n\
4418   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
4419   -x --hex-dump=<number|name>\n\
4420                          Dump the contents of section <number|name> as bytes\n\
4421   -p --string-dump=<number|name>\n\
4422                          Dump the contents of section <number|name> as strings\n\
4423   -R --relocated-dump=<number|name>\n\
4424                          Dump the contents of section <number|name> as relocated bytes\n\
4425   -z --decompress        Decompress section before dumping it\n\
4426   -w[lLiaprmfFsoRtUuTgAckK] or\n\
4427   --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4428                =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4429                =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4430                =addr,=cu_index,=links,=follow-links]\n\
4431                          Display the contents of DWARF debug sections\n"));
4432   fprintf (stream, _("\
4433   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
4434   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
4435                          or deeper\n"));
4436 #ifdef SUPPORT_DISASSEMBLY
4437   fprintf (stream, _("\
4438   -i --instruction-dump=<number|name>\n\
4439                          Disassemble the contents of section <number|name>\n"));
4440 #endif
4441   fprintf (stream, _("\
4442   -I --histogram         Display histogram of bucket list lengths\n\
4443   -W --wide              Allow output width to exceed 80 characters\n\
4444   @<file>                Read options from <file>\n\
4445   -H --help              Display this information\n\
4446   -v --version           Display the version number of readelf\n"));
4447
4448   if (REPORT_BUGS_TO[0] && stream == stdout)
4449     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4450
4451   exit (stream == stdout ? 0 : 1);
4452 }
4453
4454 /* Record the fact that the user wants the contents of section number
4455    SECTION to be displayed using the method(s) encoded as flags bits
4456    in TYPE.  Note, TYPE can be zero if we are creating the array for
4457    the first time.  */
4458
4459 static void
4460 request_dump_bynumber (Filedata * filedata, unsigned int section, dump_type type)
4461 {
4462   if (section >= filedata->num_dump_sects)
4463     {
4464       dump_type * new_dump_sects;
4465
4466       new_dump_sects = (dump_type *) calloc (section + 1,
4467                                              sizeof (* new_dump_sects));
4468
4469       if (new_dump_sects == NULL)
4470         error (_("Out of memory allocating dump request table.\n"));
4471       else
4472         {
4473           if (filedata->dump_sects)
4474             {
4475               /* Copy current flag settings.  */
4476               memcpy (new_dump_sects, filedata->dump_sects,
4477                       filedata->num_dump_sects * sizeof (* new_dump_sects));
4478
4479               free (filedata->dump_sects);
4480             }
4481
4482           filedata->dump_sects = new_dump_sects;
4483           filedata->num_dump_sects = section + 1;
4484         }
4485     }
4486
4487   if (filedata->dump_sects)
4488     filedata->dump_sects[section] |= type;
4489 }
4490
4491 /* Request a dump by section name.  */
4492
4493 static void
4494 request_dump_byname (const char * section, dump_type type)
4495 {
4496   struct dump_list_entry * new_request;
4497
4498   new_request = (struct dump_list_entry *)
4499       malloc (sizeof (struct dump_list_entry));
4500   if (!new_request)
4501     error (_("Out of memory allocating dump request table.\n"));
4502
4503   new_request->name = strdup (section);
4504   if (!new_request->name)
4505     error (_("Out of memory allocating dump request table.\n"));
4506
4507   new_request->type = type;
4508
4509   new_request->next = dump_sects_byname;
4510   dump_sects_byname = new_request;
4511 }
4512
4513 static inline void
4514 request_dump (Filedata * filedata, dump_type type)
4515 {
4516   int section;
4517   char * cp;
4518
4519   do_dump++;
4520   section = strtoul (optarg, & cp, 0);
4521
4522   if (! *cp && section >= 0)
4523     request_dump_bynumber (filedata, section, type);
4524   else
4525     request_dump_byname (optarg, type);
4526 }
4527
4528 static void
4529 parse_args (Filedata * filedata, int argc, char ** argv)
4530 {
4531   int c;
4532
4533   if (argc < 2)
4534     usage (stderr);
4535
4536   while ((c = getopt_long
4537           (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4538     {
4539       switch (c)
4540         {
4541         case 0:
4542           /* Long options.  */
4543           break;
4544         case 'H':
4545           usage (stdout);
4546           break;
4547
4548         case 'a':
4549           do_syms = TRUE;
4550           do_reloc = TRUE;
4551           do_unwind = TRUE;
4552           do_dynamic = TRUE;
4553           do_header = TRUE;
4554           do_sections = TRUE;
4555           do_section_groups = TRUE;
4556           do_segments = TRUE;
4557           do_version = TRUE;
4558           do_histogram = TRUE;
4559           do_arch = TRUE;
4560           do_notes = TRUE;
4561           break;
4562         case 'g':
4563           do_section_groups = TRUE;
4564           break;
4565         case 't':
4566         case 'N':
4567           do_sections = TRUE;
4568           do_section_details = TRUE;
4569           break;
4570         case 'e':
4571           do_header = TRUE;
4572           do_sections = TRUE;
4573           do_segments = TRUE;
4574           break;
4575         case 'A':
4576           do_arch = TRUE;
4577           break;
4578         case 'D':
4579           do_using_dynamic = TRUE;
4580           break;
4581         case 'r':
4582           do_reloc = TRUE;
4583           break;
4584         case 'u':
4585           do_unwind = TRUE;
4586           break;
4587         case 'h':
4588           do_header = TRUE;
4589           break;
4590         case 'l':
4591           do_segments = TRUE;
4592           break;
4593         case 's':
4594           do_syms = TRUE;
4595           break;
4596         case 'S':
4597           do_sections = TRUE;
4598           break;
4599         case 'd':
4600           do_dynamic = TRUE;
4601           break;
4602         case 'I':
4603           do_histogram = TRUE;
4604           break;
4605         case 'n':
4606           do_notes = TRUE;
4607           break;
4608         case 'c':
4609           do_archive_index = TRUE;
4610           break;
4611         case 'x':
4612           request_dump (filedata, HEX_DUMP);
4613           break;
4614         case 'p':
4615           request_dump (filedata, STRING_DUMP);
4616           break;
4617         case 'R':
4618           request_dump (filedata, RELOC_DUMP);
4619           break;
4620         case 'z':
4621           decompress_dumps = TRUE;
4622           break;
4623         case 'w':
4624           do_dump = TRUE;
4625           if (optarg == 0)
4626             {
4627               do_debugging = TRUE;
4628               dwarf_select_sections_all ();
4629             }
4630           else
4631             {
4632               do_debugging = FALSE;
4633               dwarf_select_sections_by_letters (optarg);
4634             }
4635           break;
4636         case OPTION_DEBUG_DUMP:
4637           do_dump = TRUE;
4638           if (optarg == 0)
4639             do_debugging = TRUE;
4640           else
4641             {
4642               do_debugging = FALSE;
4643               dwarf_select_sections_by_names (optarg);
4644             }
4645           break;
4646         case OPTION_DWARF_DEPTH:
4647           {
4648             char *cp;
4649
4650             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4651           }
4652           break;
4653         case OPTION_DWARF_START:
4654           {
4655             char *cp;
4656
4657             dwarf_start_die = strtoul (optarg, & cp, 0);
4658           }
4659           break;
4660         case OPTION_DWARF_CHECK:
4661           dwarf_check = TRUE;
4662           break;
4663         case OPTION_DYN_SYMS:
4664           do_dyn_syms = TRUE;
4665           break;
4666 #ifdef SUPPORT_DISASSEMBLY
4667         case 'i':
4668           request_dump (filedata, DISASS_DUMP);
4669           break;
4670 #endif
4671         case 'v':
4672           print_version (program_name);
4673           break;
4674         case 'V':
4675           do_version = TRUE;
4676           break;
4677         case 'W':
4678           do_wide = TRUE;
4679           break;
4680         default:
4681           /* xgettext:c-format */
4682           error (_("Invalid option '-%c'\n"), c);
4683           /* Fall through.  */
4684         case '?':
4685           usage (stderr);
4686         }
4687     }
4688
4689   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4690       && !do_segments && !do_header && !do_dump && !do_version
4691       && !do_histogram && !do_debugging && !do_arch && !do_notes
4692       && !do_section_groups && !do_archive_index
4693       && !do_dyn_syms)
4694     usage (stderr);
4695 }
4696
4697 static const char *
4698 get_elf_class (unsigned int elf_class)
4699 {
4700   static char buff[32];
4701
4702   switch (elf_class)
4703     {
4704     case ELFCLASSNONE: return _("none");
4705     case ELFCLASS32:   return "ELF32";
4706     case ELFCLASS64:   return "ELF64";
4707     default:
4708       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4709       return buff;
4710     }
4711 }
4712
4713 static const char *
4714 get_data_encoding (unsigned int encoding)
4715 {
4716   static char buff[32];
4717
4718   switch (encoding)
4719     {
4720     case ELFDATANONE: return _("none");
4721     case ELFDATA2LSB: return _("2's complement, little endian");
4722     case ELFDATA2MSB: return _("2's complement, big endian");
4723     default:
4724       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4725       return buff;
4726     }
4727 }
4728
4729 /* Decode the data held in 'filedata->file_header'.  */
4730
4731 static bfd_boolean
4732 process_file_header (Filedata * filedata)
4733 {
4734   Elf_Internal_Ehdr * header = & filedata->file_header;
4735
4736   if (   header->e_ident[EI_MAG0] != ELFMAG0
4737       || header->e_ident[EI_MAG1] != ELFMAG1
4738       || header->e_ident[EI_MAG2] != ELFMAG2
4739       || header->e_ident[EI_MAG3] != ELFMAG3)
4740     {
4741       error
4742         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4743       return FALSE;
4744     }
4745
4746   init_dwarf_regnames (header->e_machine);
4747
4748   if (do_header)
4749     {
4750       unsigned i;
4751
4752       printf (_("ELF Header:\n"));
4753       printf (_("  Magic:   "));
4754       for (i = 0; i < EI_NIDENT; i++)
4755         printf ("%2.2x ", header->e_ident[i]);
4756       printf ("\n");
4757       printf (_("  Class:                             %s\n"),
4758               get_elf_class (header->e_ident[EI_CLASS]));
4759       printf (_("  Data:                              %s\n"),
4760               get_data_encoding (header->e_ident[EI_DATA]));
4761       printf (_("  Version:                           %d %s\n"),
4762               header->e_ident[EI_VERSION],
4763               (header->e_ident[EI_VERSION] == EV_CURRENT
4764                ? "(current)"
4765                : (header->e_ident[EI_VERSION] != EV_NONE
4766                   ? _("<unknown: %lx>")
4767                   : "")));
4768       printf (_("  OS/ABI:                            %s\n"),
4769               get_osabi_name (filedata, header->e_ident[EI_OSABI]));
4770       printf (_("  ABI Version:                       %d\n"),
4771               header->e_ident[EI_ABIVERSION]);
4772       printf (_("  Type:                              %s\n"),
4773               get_file_type (header->e_type));
4774       printf (_("  Machine:                           %s\n"),
4775               get_machine_name (header->e_machine));
4776       printf (_("  Version:                           0x%lx\n"),
4777               (unsigned long) header->e_version);
4778
4779       printf (_("  Entry point address:               "));
4780       print_vma ((bfd_vma) header->e_entry, PREFIX_HEX);
4781       printf (_("\n  Start of program headers:          "));
4782       print_vma ((bfd_vma) header->e_phoff, DEC);
4783       printf (_(" (bytes into file)\n  Start of section headers:          "));
4784       print_vma ((bfd_vma) header->e_shoff, DEC);
4785       printf (_(" (bytes into file)\n"));
4786
4787       printf (_("  Flags:                             0x%lx%s\n"),
4788               (unsigned long) header->e_flags,
4789               get_machine_flags (filedata, header->e_flags, header->e_machine));
4790       printf (_("  Size of this header:               %ld (bytes)\n"),
4791               (long) header->e_ehsize);
4792       printf (_("  Size of program headers:           %ld (bytes)\n"),
4793               (long) header->e_phentsize);
4794       printf (_("  Number of program headers:         %ld"),
4795               (long) header->e_phnum);
4796       if (filedata->section_headers != NULL
4797           && header->e_phnum == PN_XNUM
4798           && filedata->section_headers[0].sh_info != 0)
4799         printf (" (%ld)", (long) filedata->section_headers[0].sh_info);
4800       putc ('\n', stdout);
4801       printf (_("  Size of section headers:           %ld (bytes)\n"),
4802               (long) header->e_shentsize);
4803       printf (_("  Number of section headers:         %ld"),
4804               (long) header->e_shnum);
4805       if (filedata->section_headers != NULL && header->e_shnum == SHN_UNDEF)
4806         printf (" (%ld)", (long) filedata->section_headers[0].sh_size);
4807       putc ('\n', stdout);
4808       printf (_("  Section header string table index: %ld"),
4809               (long) header->e_shstrndx);
4810       if (filedata->section_headers != NULL
4811           && header->e_shstrndx == (SHN_XINDEX & 0xffff))
4812         printf (" (%u)", filedata->section_headers[0].sh_link);
4813       else if (header->e_shstrndx != SHN_UNDEF
4814                && header->e_shstrndx >= header->e_shnum)
4815         printf (_(" <corrupt: out of range>"));
4816       putc ('\n', stdout);
4817     }
4818
4819   if (filedata->section_headers != NULL)
4820     {
4821       if (header->e_phnum == PN_XNUM
4822           && filedata->section_headers[0].sh_info != 0)
4823         header->e_phnum = filedata->section_headers[0].sh_info;
4824       if (header->e_shnum == SHN_UNDEF)
4825         header->e_shnum = filedata->section_headers[0].sh_size;
4826       if (header->e_shstrndx == (SHN_XINDEX & 0xffff))
4827         header->e_shstrndx = filedata->section_headers[0].sh_link;
4828       if (header->e_shstrndx >= header->e_shnum)
4829         header->e_shstrndx = SHN_UNDEF;
4830       free (filedata->section_headers);
4831       filedata->section_headers = NULL;
4832     }
4833
4834   return TRUE;
4835 }
4836
4837 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4838    Returns TRUE upon success, FALSE otherwise.  Loads 32-bit headers.  */
4839
4840 static bfd_boolean
4841 get_32bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4842 {
4843   Elf32_External_Phdr * phdrs;
4844   Elf32_External_Phdr * external;
4845   Elf_Internal_Phdr *   internal;
4846   unsigned int i;
4847   unsigned int size = filedata->file_header.e_phentsize;
4848   unsigned int num  = filedata->file_header.e_phnum;
4849
4850   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4851   if (size == 0 || num == 0)
4852     return FALSE;
4853   if (size < sizeof * phdrs)
4854     {
4855       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4856       return FALSE;
4857     }
4858   if (size > sizeof * phdrs)
4859     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4860
4861   phdrs = (Elf32_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4862                                             size, num, _("program headers"));
4863   if (phdrs == NULL)
4864     return FALSE;
4865
4866   for (i = 0, internal = pheaders, external = phdrs;
4867        i < filedata->file_header.e_phnum;
4868        i++, internal++, external++)
4869     {
4870       internal->p_type   = BYTE_GET (external->p_type);
4871       internal->p_offset = BYTE_GET (external->p_offset);
4872       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4873       internal->p_paddr  = BYTE_GET (external->p_paddr);
4874       internal->p_filesz = BYTE_GET (external->p_filesz);
4875       internal->p_memsz  = BYTE_GET (external->p_memsz);
4876       internal->p_flags  = BYTE_GET (external->p_flags);
4877       internal->p_align  = BYTE_GET (external->p_align);
4878     }
4879
4880   free (phdrs);
4881   return TRUE;
4882 }
4883
4884 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4885    Returns TRUE upon success, FALSE otherwise.  Loads 64-bit headers.  */
4886
4887 static bfd_boolean
4888 get_64bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4889 {
4890   Elf64_External_Phdr * phdrs;
4891   Elf64_External_Phdr * external;
4892   Elf_Internal_Phdr *   internal;
4893   unsigned int i;
4894   unsigned int size = filedata->file_header.e_phentsize;
4895   unsigned int num  = filedata->file_header.e_phnum;
4896
4897   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4898   if (size == 0 || num == 0)
4899     return FALSE;
4900   if (size < sizeof * phdrs)
4901     {
4902       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4903       return FALSE;
4904     }
4905   if (size > sizeof * phdrs)
4906     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4907
4908   phdrs = (Elf64_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4909                                             size, num, _("program headers"));
4910   if (!phdrs)
4911     return FALSE;
4912
4913   for (i = 0, internal = pheaders, external = phdrs;
4914        i < filedata->file_header.e_phnum;
4915        i++, internal++, external++)
4916     {
4917       internal->p_type   = BYTE_GET (external->p_type);
4918       internal->p_flags  = BYTE_GET (external->p_flags);
4919       internal->p_offset = BYTE_GET (external->p_offset);
4920       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4921       internal->p_paddr  = BYTE_GET (external->p_paddr);
4922       internal->p_filesz = BYTE_GET (external->p_filesz);
4923       internal->p_memsz  = BYTE_GET (external->p_memsz);
4924       internal->p_align  = BYTE_GET (external->p_align);
4925     }
4926
4927   free (phdrs);
4928   return TRUE;
4929 }
4930
4931 /* Returns TRUE if the program headers were read into `program_headers'.  */
4932
4933 static bfd_boolean
4934 get_program_headers (Filedata * filedata)
4935 {
4936   Elf_Internal_Phdr * phdrs;
4937
4938   /* Check cache of prior read.  */
4939   if (filedata->program_headers != NULL)
4940     return TRUE;
4941
4942   /* Be kind to memory checkers by looking for
4943      e_phnum values which we know must be invalid.  */
4944   if (filedata->file_header.e_phnum
4945       * (is_32bit_elf ? sizeof (Elf32_External_Phdr) : sizeof (Elf64_External_Phdr))
4946       >= filedata->file_size)
4947     {
4948       error (_("Too many program headers - %#x - the file is not that big\n"),
4949              filedata->file_header.e_phnum);
4950       return FALSE;
4951     }
4952
4953   phdrs = (Elf_Internal_Phdr *) cmalloc (filedata->file_header.e_phnum,
4954                                          sizeof (Elf_Internal_Phdr));
4955   if (phdrs == NULL)
4956     {
4957       error (_("Out of memory reading %u program headers\n"),
4958              filedata->file_header.e_phnum);
4959       return FALSE;
4960     }
4961
4962   if (is_32bit_elf
4963       ? get_32bit_program_headers (filedata, phdrs)
4964       : get_64bit_program_headers (filedata, phdrs))
4965     {
4966       filedata->program_headers = phdrs;
4967       return TRUE;
4968     }
4969
4970   free (phdrs);
4971   return FALSE;
4972 }
4973
4974 /* Returns TRUE if the program headers were loaded.  */
4975
4976 static bfd_boolean
4977 process_program_headers (Filedata * filedata)
4978 {
4979   Elf_Internal_Phdr * segment;
4980   unsigned int i;
4981   Elf_Internal_Phdr * previous_load = NULL;
4982
4983   if (filedata->file_header.e_phnum == 0)
4984     {
4985       /* PR binutils/12467.  */
4986       if (filedata->file_header.e_phoff != 0)
4987         {
4988           warn (_("possibly corrupt ELF header - it has a non-zero program"
4989                   " header offset, but no program headers\n"));
4990           return FALSE;
4991         }
4992       else if (do_segments)
4993         printf (_("\nThere are no program headers in this file.\n"));
4994       return TRUE;
4995     }
4996
4997   if (do_segments && !do_header)
4998     {
4999       printf (_("\nElf file type is %s\n"), get_file_type (filedata->file_header.e_type));
5000       printf (_("Entry point 0x%s\n"), bfd_vmatoa ("x", filedata->file_header.e_entry));
5001       printf (ngettext ("There is %d program header, starting at offset %s\n",
5002                         "There are %d program headers, starting at offset %s\n",
5003                         filedata->file_header.e_phnum),
5004               filedata->file_header.e_phnum,
5005               bfd_vmatoa ("u", filedata->file_header.e_phoff));
5006     }
5007
5008   if (! get_program_headers (filedata))
5009     return TRUE;
5010
5011   if (do_segments)
5012     {
5013       if (filedata->file_header.e_phnum > 1)
5014         printf (_("\nProgram Headers:\n"));
5015       else
5016         printf (_("\nProgram Headers:\n"));
5017
5018       if (is_32bit_elf)
5019         printf
5020           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
5021       else if (do_wide)
5022         printf
5023           (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
5024       else
5025         {
5026           printf
5027             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
5028           printf
5029             (_("                 FileSiz            MemSiz              Flags  Align\n"));
5030         }
5031     }
5032
5033   dynamic_addr = 0;
5034   dynamic_size = 0;
5035
5036   for (i = 0, segment = filedata->program_headers;
5037        i < filedata->file_header.e_phnum;
5038        i++, segment++)
5039     {
5040       if (do_segments)
5041         {
5042           printf ("  %-14.14s ", get_segment_type (filedata, segment->p_type));
5043
5044           if (is_32bit_elf)
5045             {
5046               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5047               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
5048               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
5049               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
5050               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
5051               printf ("%c%c%c ",
5052                       (segment->p_flags & PF_R ? 'R' : ' '),
5053                       (segment->p_flags & PF_W ? 'W' : ' '),
5054                       (segment->p_flags & PF_X ? 'E' : ' '));
5055               printf ("%#lx", (unsigned long) segment->p_align);
5056             }
5057           else if (do_wide)
5058             {
5059               if ((unsigned long) segment->p_offset == segment->p_offset)
5060                 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5061               else
5062                 {
5063                   print_vma (segment->p_offset, FULL_HEX);
5064                   putchar (' ');
5065                 }
5066
5067               print_vma (segment->p_vaddr, FULL_HEX);
5068               putchar (' ');
5069               print_vma (segment->p_paddr, FULL_HEX);
5070               putchar (' ');
5071
5072               if ((unsigned long) segment->p_filesz == segment->p_filesz)
5073                 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
5074               else
5075                 {
5076                   print_vma (segment->p_filesz, FULL_HEX);
5077                   putchar (' ');
5078                 }
5079
5080               if ((unsigned long) segment->p_memsz == segment->p_memsz)
5081                 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
5082               else
5083                 {
5084                   print_vma (segment->p_memsz, FULL_HEX);
5085                 }
5086
5087               printf (" %c%c%c ",
5088                       (segment->p_flags & PF_R ? 'R' : ' '),
5089                       (segment->p_flags & PF_W ? 'W' : ' '),
5090                       (segment->p_flags & PF_X ? 'E' : ' '));
5091
5092               if ((unsigned long) segment->p_align == segment->p_align)
5093                 printf ("%#lx", (unsigned long) segment->p_align);
5094               else
5095                 {
5096                   print_vma (segment->p_align, PREFIX_HEX);
5097                 }
5098             }
5099           else
5100             {
5101               print_vma (segment->p_offset, FULL_HEX);
5102               putchar (' ');
5103               print_vma (segment->p_vaddr, FULL_HEX);
5104               putchar (' ');
5105               print_vma (segment->p_paddr, FULL_HEX);
5106               printf ("\n                 ");
5107               print_vma (segment->p_filesz, FULL_HEX);
5108               putchar (' ');
5109               print_vma (segment->p_memsz, FULL_HEX);
5110               printf ("  %c%c%c    ",
5111                       (segment->p_flags & PF_R ? 'R' : ' '),
5112                       (segment->p_flags & PF_W ? 'W' : ' '),
5113                       (segment->p_flags & PF_X ? 'E' : ' '));
5114               print_vma (segment->p_align, PREFIX_HEX);
5115             }
5116
5117           putc ('\n', stdout);
5118         }
5119
5120       switch (segment->p_type)
5121         {
5122         case PT_LOAD:
5123 #if 0 /* Do not warn about out of order PT_LOAD segments.  Although officially
5124          required by the ELF standard, several programs, including the Linux
5125          kernel, make use of non-ordered segments.  */
5126           if (previous_load
5127               && previous_load->p_vaddr > segment->p_vaddr)
5128             error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
5129 #endif
5130           if (segment->p_memsz < segment->p_filesz)
5131             error (_("the segment's file size is larger than its memory size\n"));
5132           previous_load = segment;
5133           break;
5134
5135         case PT_PHDR:
5136           /* PR 20815 - Verify that the program header is loaded into memory.  */
5137           if (i > 0 && previous_load != NULL)
5138             error (_("the PHDR segment must occur before any LOAD segment\n"));
5139           if (filedata->file_header.e_machine != EM_PARISC)
5140             {
5141               unsigned int j;
5142
5143               for (j = 1; j < filedata->file_header.e_phnum; j++)
5144                 if (filedata->program_headers[j].p_vaddr <= segment->p_vaddr
5145                     && (filedata->program_headers[j].p_vaddr
5146                         + filedata->program_headers[j].p_memsz)
5147                     >= (segment->p_vaddr + segment->p_filesz))
5148                   break;
5149               if (j == filedata->file_header.e_phnum)
5150                 error (_("the PHDR segment is not covered by a LOAD segment\n"));
5151             }
5152           break;
5153
5154         case PT_DYNAMIC:
5155           if (dynamic_addr)
5156             error (_("more than one dynamic segment\n"));
5157
5158           /* By default, assume that the .dynamic section is the first
5159              section in the DYNAMIC segment.  */
5160           dynamic_addr = segment->p_offset;
5161           dynamic_size = segment->p_filesz;
5162
5163           /* Try to locate the .dynamic section. If there is
5164              a section header table, we can easily locate it.  */
5165           if (filedata->section_headers != NULL)
5166             {
5167               Elf_Internal_Shdr * sec;
5168
5169               sec = find_section (filedata, ".dynamic");
5170               if (sec == NULL || sec->sh_size == 0)
5171                 {
5172                   /* A corresponding .dynamic section is expected, but on
5173                      IA-64/OpenVMS it is OK for it to be missing.  */
5174                   if (!is_ia64_vms (filedata))
5175                     error (_("no .dynamic section in the dynamic segment\n"));
5176                   break;
5177                 }
5178
5179               if (sec->sh_type == SHT_NOBITS)
5180                 {
5181                   dynamic_size = 0;
5182                   break;
5183                 }
5184
5185               dynamic_addr = sec->sh_offset;
5186               dynamic_size = sec->sh_size;
5187
5188               if (dynamic_addr < segment->p_offset
5189                   || dynamic_addr > segment->p_offset + segment->p_filesz)
5190                 warn (_("the .dynamic section is not contained"
5191                         " within the dynamic segment\n"));
5192               else if (dynamic_addr > segment->p_offset)
5193                 warn (_("the .dynamic section is not the first section"
5194                         " in the dynamic segment.\n"));
5195             }
5196
5197           /* PR binutils/17512: Avoid corrupt dynamic section info in the
5198              segment.  Check this after matching against the section headers
5199              so we don't warn on debuginfo file (which have NOBITS .dynamic
5200              sections).  */
5201           if (dynamic_addr + dynamic_size >= filedata->file_size)
5202             {
5203               error (_("the dynamic segment offset + size exceeds the size of the file\n"));
5204               dynamic_addr = dynamic_size = 0;
5205             }
5206           break;
5207
5208         case PT_INTERP:
5209           if (fseek (filedata->handle, archive_file_offset + (long) segment->p_offset,
5210                      SEEK_SET))
5211             error (_("Unable to find program interpreter name\n"));
5212           else
5213             {
5214               char fmt [32];
5215               int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
5216
5217               if (ret >= (int) sizeof (fmt) || ret < 0)
5218                 error (_("Internal error: failed to create format string to display program interpreter\n"));
5219
5220               program_interpreter[0] = 0;
5221               if (fscanf (filedata->handle, fmt, program_interpreter) <= 0)
5222                 error (_("Unable to read program interpreter name\n"));
5223
5224               if (do_segments)
5225                 printf (_("      [Requesting program interpreter: %s]\n"),
5226                     program_interpreter);
5227             }
5228           break;
5229         }
5230     }
5231
5232   if (do_segments
5233       && filedata->section_headers != NULL
5234       && filedata->string_table != NULL)
5235     {
5236       printf (_("\n Section to Segment mapping:\n"));
5237       printf (_("  Segment Sections...\n"));
5238
5239       for (i = 0; i < filedata->file_header.e_phnum; i++)
5240         {
5241           unsigned int j;
5242           Elf_Internal_Shdr * section;
5243
5244           segment = filedata->program_headers + i;
5245           section = filedata->section_headers + 1;
5246
5247           printf ("   %2.2d     ", i);
5248
5249           for (j = 1; j < filedata->file_header.e_shnum; j++, section++)
5250             {
5251               if (!ELF_TBSS_SPECIAL (section, segment)
5252                   && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
5253                 printf ("%s ", printable_section_name (filedata, section));
5254             }
5255
5256           putc ('\n',stdout);
5257         }
5258     }
5259
5260   return TRUE;
5261 }
5262
5263
5264 /* Find the file offset corresponding to VMA by using the program headers.  */
5265
5266 static long
5267 offset_from_vma (Filedata * filedata, bfd_vma vma, bfd_size_type size)
5268 {
5269   Elf_Internal_Phdr * seg;
5270
5271   if (! get_program_headers (filedata))
5272     {
5273       warn (_("Cannot interpret virtual addresses without program headers.\n"));
5274       return (long) vma;
5275     }
5276
5277   for (seg = filedata->program_headers;
5278        seg < filedata->program_headers + filedata->file_header.e_phnum;
5279        ++seg)
5280     {
5281       if (seg->p_type != PT_LOAD)
5282         continue;
5283
5284       if (vma >= (seg->p_vaddr & -seg->p_align)
5285           && vma + size <= seg->p_vaddr + seg->p_filesz)
5286         return vma - seg->p_vaddr + seg->p_offset;
5287     }
5288
5289   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
5290         (unsigned long) vma);
5291   return (long) vma;
5292 }
5293
5294
5295 /* Allocate memory and load the sections headers into FILEDATA->filedata->section_headers.
5296    If PROBE is true, this is just a probe and we do not generate any error
5297    messages if the load fails.  */
5298
5299 static bfd_boolean
5300 get_32bit_section_headers (Filedata * filedata, bfd_boolean probe)
5301 {
5302   Elf32_External_Shdr * shdrs;
5303   Elf_Internal_Shdr *   internal;
5304   unsigned int          i;
5305   unsigned int          size = filedata->file_header.e_shentsize;
5306   unsigned int          num = probe ? 1 : filedata->file_header.e_shnum;
5307
5308   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5309   if (size == 0 || num == 0)
5310     return FALSE;
5311   if (size < sizeof * shdrs)
5312     {
5313       if (! probe)
5314         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5315       return FALSE;
5316     }
5317   if (!probe && size > sizeof * shdrs)
5318     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5319
5320   shdrs = (Elf32_External_Shdr *) get_data (NULL, filedata, filedata->file_header.e_shoff,
5321                                             size, num,
5322                                             probe ? NULL : _("section headers"));
5323   if (shdrs == NULL)
5324     return FALSE;
5325
5326   free (filedata->section_headers);
5327   filedata->section_headers = (Elf_Internal_Shdr *)
5328     cmalloc (num, sizeof (Elf_Internal_Shdr));
5329   if (filedata->section_headers == NULL)
5330     {
5331       if (!probe)
5332         error (_("Out of memory reading %u section headers\n"), num);
5333       return FALSE;
5334     }
5335
5336   for (i = 0, internal = filedata->section_headers;
5337        i < num;
5338        i++, internal++)
5339     {
5340       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5341       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5342       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5343       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5344       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5345       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5346       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5347       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5348       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5349       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5350       if (!probe && internal->sh_link > num)
5351         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5352       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5353         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5354     }
5355
5356   free (shdrs);
5357   return TRUE;
5358 }
5359
5360 /* Like get_32bit_section_headers, except that it fetches 64-bit headers.  */
5361
5362 static bfd_boolean
5363 get_64bit_section_headers (Filedata * filedata, bfd_boolean probe)
5364 {
5365   Elf64_External_Shdr *  shdrs;
5366   Elf_Internal_Shdr *    internal;
5367   unsigned int           i;
5368   unsigned int           size = filedata->file_header.e_shentsize;
5369   unsigned int           num = probe ? 1 : filedata->file_header.e_shnum;
5370
5371   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5372   if (size == 0 || num == 0)
5373     return FALSE;
5374
5375   if (size < sizeof * shdrs)
5376     {
5377       if (! probe)
5378         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5379       return FALSE;
5380     }
5381
5382   if (! probe && size > sizeof * shdrs)
5383     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5384
5385   shdrs = (Elf64_External_Shdr *) get_data (NULL, filedata,
5386                                             filedata->file_header.e_shoff,
5387                                             size, num,
5388                                             probe ? NULL : _("section headers"));
5389   if (shdrs == NULL)
5390     return FALSE;
5391
5392   free (filedata->section_headers);
5393   filedata->section_headers = (Elf_Internal_Shdr *)
5394     cmalloc (num, sizeof (Elf_Internal_Shdr));
5395   if (filedata->section_headers == NULL)
5396     {
5397       if (! probe)
5398         error (_("Out of memory reading %u section headers\n"), num);
5399       return FALSE;
5400     }
5401
5402   for (i = 0, internal = filedata->section_headers;
5403        i < num;
5404        i++, internal++)
5405     {
5406       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5407       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5408       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5409       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5410       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5411       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5412       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5413       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5414       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5415       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5416       if (!probe && internal->sh_link > num)
5417         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5418       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5419         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5420     }
5421
5422   free (shdrs);
5423   return TRUE;
5424 }
5425
5426 static Elf_Internal_Sym *
5427 get_32bit_elf_symbols (Filedata *           filedata,
5428                        Elf_Internal_Shdr *  section,
5429                        unsigned long *      num_syms_return)
5430 {
5431   unsigned long number = 0;
5432   Elf32_External_Sym * esyms = NULL;
5433   Elf_External_Sym_Shndx * shndx = NULL;
5434   Elf_Internal_Sym * isyms = NULL;
5435   Elf_Internal_Sym * psym;
5436   unsigned int j;
5437
5438   if (section->sh_size == 0)
5439     {
5440       if (num_syms_return != NULL)
5441         * num_syms_return = 0;
5442       return NULL;
5443     }
5444
5445   /* Run some sanity checks first.  */
5446   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5447     {
5448       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5449              printable_section_name (filedata, section),
5450              (unsigned long) section->sh_entsize);
5451       goto exit_point;
5452     }
5453
5454   if (section->sh_size > filedata->file_size)
5455     {
5456       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5457              printable_section_name (filedata, section),
5458              (unsigned long) section->sh_size);
5459       goto exit_point;
5460     }
5461
5462   number = section->sh_size / section->sh_entsize;
5463
5464   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5465     {
5466       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5467              (unsigned long) section->sh_size,
5468              printable_section_name (filedata, section),
5469              (unsigned long) section->sh_entsize);
5470       goto exit_point;
5471     }
5472
5473   esyms = (Elf32_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5474                                            section->sh_size, _("symbols"));
5475   if (esyms == NULL)
5476     goto exit_point;
5477
5478   {
5479     elf_section_list * entry;
5480
5481     shndx = NULL;
5482     for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5483       if (entry->hdr->sh_link == (unsigned long) (section - filedata->section_headers))
5484         {
5485           shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5486                                                        entry->hdr->sh_offset,
5487                                                        1, entry->hdr->sh_size,
5488                                                        _("symbol table section indicies"));
5489           if (shndx == NULL)
5490             goto exit_point;
5491           /* PR17531: file: heap-buffer-overflow */
5492           else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5493             {
5494               error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5495                      printable_section_name (filedata, entry->hdr),
5496                      (unsigned long) entry->hdr->sh_size,
5497                      (unsigned long) section->sh_size);
5498               goto exit_point;
5499             }
5500         }
5501   }
5502
5503   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5504
5505   if (isyms == NULL)
5506     {
5507       error (_("Out of memory reading %lu symbols\n"),
5508              (unsigned long) number);
5509       goto exit_point;
5510     }
5511
5512   for (j = 0, psym = isyms; j < number; j++, psym++)
5513     {
5514       psym->st_name  = BYTE_GET (esyms[j].st_name);
5515       psym->st_value = BYTE_GET (esyms[j].st_value);
5516       psym->st_size  = BYTE_GET (esyms[j].st_size);
5517       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5518       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5519         psym->st_shndx
5520           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5521       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5522         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5523       psym->st_info  = BYTE_GET (esyms[j].st_info);
5524       psym->st_other = BYTE_GET (esyms[j].st_other);
5525     }
5526
5527  exit_point:
5528   if (shndx != NULL)
5529     free (shndx);
5530   if (esyms != NULL)
5531     free (esyms);
5532
5533   if (num_syms_return != NULL)
5534     * num_syms_return = isyms == NULL ? 0 : number;
5535
5536   return isyms;
5537 }
5538
5539 static Elf_Internal_Sym *
5540 get_64bit_elf_symbols (Filedata *           filedata,
5541                        Elf_Internal_Shdr *  section,
5542                        unsigned long *      num_syms_return)
5543 {
5544   unsigned long number = 0;
5545   Elf64_External_Sym * esyms = NULL;
5546   Elf_External_Sym_Shndx * shndx = NULL;
5547   Elf_Internal_Sym * isyms = NULL;
5548   Elf_Internal_Sym * psym;
5549   unsigned int j;
5550
5551   if (section->sh_size == 0)
5552     {
5553       if (num_syms_return != NULL)
5554         * num_syms_return = 0;
5555       return NULL;
5556     }
5557
5558   /* Run some sanity checks first.  */
5559   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5560     {
5561       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5562              printable_section_name (filedata, section),
5563              (unsigned long) section->sh_entsize);
5564       goto exit_point;
5565     }
5566
5567   if (section->sh_size > filedata->file_size)
5568     {
5569       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5570              printable_section_name (filedata, section),
5571              (unsigned long) section->sh_size);
5572       goto exit_point;
5573     }
5574
5575   number = section->sh_size / section->sh_entsize;
5576
5577   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5578     {
5579       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5580              (unsigned long) section->sh_size,
5581              printable_section_name (filedata, section),
5582              (unsigned long) section->sh_entsize);
5583       goto exit_point;
5584     }
5585
5586   esyms = (Elf64_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5587                                            section->sh_size, _("symbols"));
5588   if (!esyms)
5589     goto exit_point;
5590
5591   {
5592     elf_section_list * entry;
5593
5594     shndx = NULL;
5595     for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5596       if (entry->hdr->sh_link == (unsigned long) (section - filedata->section_headers))
5597         {
5598           shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5599                                                        entry->hdr->sh_offset,
5600                                                        1, entry->hdr->sh_size,
5601                                                        _("symbol table section indicies"));
5602           if (shndx == NULL)
5603             goto exit_point;
5604           /* PR17531: file: heap-buffer-overflow */
5605           else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5606             {
5607               error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5608                      printable_section_name (filedata, entry->hdr),
5609                      (unsigned long) entry->hdr->sh_size,
5610                      (unsigned long) section->sh_size);
5611               goto exit_point;
5612             }
5613         }
5614   }
5615
5616   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5617
5618   if (isyms == NULL)
5619     {
5620       error (_("Out of memory reading %lu symbols\n"),
5621              (unsigned long) number);
5622       goto exit_point;
5623     }
5624
5625   for (j = 0, psym = isyms; j < number; j++, psym++)
5626     {
5627       psym->st_name  = BYTE_GET (esyms[j].st_name);
5628       psym->st_info  = BYTE_GET (esyms[j].st_info);
5629       psym->st_other = BYTE_GET (esyms[j].st_other);
5630       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5631
5632       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5633         psym->st_shndx
5634           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5635       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5636         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5637
5638       psym->st_value = BYTE_GET (esyms[j].st_value);
5639       psym->st_size  = BYTE_GET (esyms[j].st_size);
5640     }
5641
5642  exit_point:
5643   if (shndx != NULL)
5644     free (shndx);
5645   if (esyms != NULL)
5646     free (esyms);
5647
5648   if (num_syms_return != NULL)
5649     * num_syms_return = isyms == NULL ? 0 : number;
5650
5651   return isyms;
5652 }
5653
5654 static const char *
5655 get_elf_section_flags (Filedata * filedata, bfd_vma sh_flags)
5656 {
5657   static char buff[1024];
5658   char * p = buff;
5659   unsigned int field_size = is_32bit_elf ? 8 : 16;
5660   signed int sindex;
5661   unsigned int size = sizeof (buff) - (field_size + 4 + 1);
5662   bfd_vma os_flags = 0;
5663   bfd_vma proc_flags = 0;
5664   bfd_vma unknown_flags = 0;
5665   static const struct
5666     {
5667       const char * str;
5668       unsigned int len;
5669     }
5670   flags [] =
5671     {
5672       /*  0 */ { STRING_COMMA_LEN ("WRITE") },
5673       /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
5674       /*  2 */ { STRING_COMMA_LEN ("EXEC") },
5675       /*  3 */ { STRING_COMMA_LEN ("MERGE") },
5676       /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
5677       /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
5678       /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5679       /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5680       /*  8 */ { STRING_COMMA_LEN ("GROUP") },
5681       /*  9 */ { STRING_COMMA_LEN ("TLS") },
5682       /* IA-64 specific.  */
5683       /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5684       /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5685       /* IA-64 OpenVMS specific.  */
5686       /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5687       /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5688       /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5689       /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5690       /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5691       /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5692       /* Generic.  */
5693       /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5694       /* SPARC specific.  */
5695       /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5696       /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5697       /* ARM specific.  */
5698       /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5699       /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5700       /* 23 */ { STRING_COMMA_LEN ("COMDEF") },
5701       /* GNU specific.  */
5702       /* 24 */ { STRING_COMMA_LEN ("GNU_MBIND") },
5703       /* VLE specific.  */
5704       /* 25 */ { STRING_COMMA_LEN ("VLE") },
5705     };
5706
5707   if (do_section_details)
5708     {
5709       sprintf (buff, "[%*.*lx]: ",
5710                field_size, field_size, (unsigned long) sh_flags);
5711       p += field_size + 4;
5712     }
5713
5714   while (sh_flags)
5715     {
5716       bfd_vma flag;
5717
5718       flag = sh_flags & - sh_flags;
5719       sh_flags &= ~ flag;
5720
5721       if (do_section_details)
5722         {
5723           switch (flag)
5724             {
5725             case SHF_WRITE:             sindex = 0; break;
5726             case SHF_ALLOC:             sindex = 1; break;
5727             case SHF_EXECINSTR:         sindex = 2; break;
5728             case SHF_MERGE:             sindex = 3; break;
5729             case SHF_STRINGS:           sindex = 4; break;
5730             case SHF_INFO_LINK:         sindex = 5; break;
5731             case SHF_LINK_ORDER:        sindex = 6; break;
5732             case SHF_OS_NONCONFORMING:  sindex = 7; break;
5733             case SHF_GROUP:             sindex = 8; break;
5734             case SHF_TLS:               sindex = 9; break;
5735             case SHF_EXCLUDE:           sindex = 18; break;
5736             case SHF_COMPRESSED:        sindex = 20; break;
5737             case SHF_GNU_MBIND:         sindex = 24; break;
5738
5739             default:
5740               sindex = -1;
5741               switch (filedata->file_header.e_machine)
5742                 {
5743                 case EM_IA_64:
5744                   if (flag == SHF_IA_64_SHORT)
5745                     sindex = 10;
5746                   else if (flag == SHF_IA_64_NORECOV)
5747                     sindex = 11;
5748 #ifdef BFD64
5749                   else if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5750                     switch (flag)
5751                       {
5752                       case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
5753                       case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
5754                       case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
5755                       case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
5756                       case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5757                       case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
5758                       default:                        break;
5759                       }
5760 #endif
5761                   break;
5762
5763                 case EM_386:
5764                 case EM_IAMCU:
5765                 case EM_X86_64:
5766                 case EM_L1OM:
5767                 case EM_K1OM:
5768                 case EM_OLD_SPARCV9:
5769                 case EM_SPARC32PLUS:
5770                 case EM_SPARCV9:
5771                 case EM_SPARC:
5772                   if (flag == SHF_ORDERED)
5773                     sindex = 19;
5774                   break;
5775
5776                 case EM_ARM:
5777                   switch (flag)
5778                     {
5779                     case SHF_ENTRYSECT: sindex = 21; break;
5780                     case SHF_ARM_PURECODE: sindex = 22; break;
5781                     case SHF_COMDEF: sindex = 23; break;
5782                     default: break;
5783                     }
5784                   break;
5785                 case EM_PPC:
5786                   if (flag == SHF_PPC_VLE)
5787                     sindex = 25;
5788                   break;
5789
5790                 default:
5791                   break;
5792                 }
5793             }
5794
5795           if (sindex != -1)
5796             {
5797               if (p != buff + field_size + 4)
5798                 {
5799                   if (size < (10 + 2))
5800                     {
5801                       warn (_("Internal error: not enough buffer room for section flag info"));
5802                       return _("<unknown>");
5803                     }
5804                   size -= 2;
5805                   *p++ = ',';
5806                   *p++ = ' ';
5807                 }
5808
5809               size -= flags [sindex].len;
5810               p = stpcpy (p, flags [sindex].str);
5811             }
5812           else if (flag & SHF_MASKOS)
5813             os_flags |= flag;
5814           else if (flag & SHF_MASKPROC)
5815             proc_flags |= flag;
5816           else
5817             unknown_flags |= flag;
5818         }
5819       else
5820         {
5821           switch (flag)
5822             {
5823             case SHF_WRITE:             *p = 'W'; break;
5824             case SHF_ALLOC:             *p = 'A'; break;
5825             case SHF_EXECINSTR:         *p = 'X'; break;
5826             case SHF_MERGE:             *p = 'M'; break;
5827             case SHF_STRINGS:           *p = 'S'; break;
5828             case SHF_INFO_LINK:         *p = 'I'; break;
5829             case SHF_LINK_ORDER:        *p = 'L'; break;
5830             case SHF_OS_NONCONFORMING:  *p = 'O'; break;
5831             case SHF_GROUP:             *p = 'G'; break;
5832             case SHF_TLS:               *p = 'T'; break;
5833             case SHF_EXCLUDE:           *p = 'E'; break;
5834             case SHF_COMPRESSED:        *p = 'C'; break;
5835             case SHF_GNU_MBIND:         *p = 'D'; break;
5836
5837             default:
5838               if ((filedata->file_header.e_machine == EM_X86_64
5839                    || filedata->file_header.e_machine == EM_L1OM
5840                    || filedata->file_header.e_machine == EM_K1OM)
5841                   && flag == SHF_X86_64_LARGE)
5842                 *p = 'l';
5843               else if (filedata->file_header.e_machine == EM_ARM
5844                        && flag == SHF_ARM_PURECODE)
5845                   *p = 'y';
5846               else if (filedata->file_header.e_machine == EM_PPC
5847                        && flag == SHF_PPC_VLE)
5848                   *p = 'v';
5849               else if (flag & SHF_MASKOS)
5850                 {
5851                   *p = 'o';
5852                   sh_flags &= ~ SHF_MASKOS;
5853                 }
5854               else if (flag & SHF_MASKPROC)
5855                 {
5856                   *p = 'p';
5857                   sh_flags &= ~ SHF_MASKPROC;
5858                 }
5859               else
5860                 *p = 'x';
5861               break;
5862             }
5863           p++;
5864         }
5865     }
5866
5867   if (do_section_details)
5868     {
5869       if (os_flags)
5870         {
5871           size -= 5 + field_size;
5872           if (p != buff + field_size + 4)
5873             {
5874               if (size < (2 + 1))
5875                 {
5876                   warn (_("Internal error: not enough buffer room for section flag info"));
5877                   return _("<unknown>");
5878                 }
5879               size -= 2;
5880               *p++ = ',';
5881               *p++ = ' ';
5882             }
5883           sprintf (p, "OS (%*.*lx)", field_size, field_size,
5884                    (unsigned long) os_flags);
5885           p += 5 + field_size;
5886         }
5887       if (proc_flags)
5888         {
5889           size -= 7 + field_size;
5890           if (p != buff + field_size + 4)
5891             {
5892               if (size < (2 + 1))
5893                 {
5894                   warn (_("Internal error: not enough buffer room for section flag info"));
5895                   return _("<unknown>");
5896                 }
5897               size -= 2;
5898               *p++ = ',';
5899               *p++ = ' ';
5900             }
5901           sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5902                    (unsigned long) proc_flags);
5903           p += 7 + field_size;
5904         }
5905       if (unknown_flags)
5906         {
5907           size -= 10 + field_size;
5908           if (p != buff + field_size + 4)
5909             {
5910               if (size < (2 + 1))
5911                 {
5912                   warn (_("Internal error: not enough buffer room for section flag info"));
5913                   return _("<unknown>");
5914                 }
5915               size -= 2;
5916               *p++ = ',';
5917               *p++ = ' ';
5918             }
5919           sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5920                    (unsigned long) unknown_flags);
5921           p += 10 + field_size;
5922         }
5923     }
5924
5925   *p = '\0';
5926   return buff;
5927 }
5928
5929 static unsigned int
5930 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf, bfd_size_type size)
5931 {
5932   if (is_32bit_elf)
5933     {
5934       Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5935
5936       if (size < sizeof (* echdr))
5937         {
5938           error (_("Compressed section is too small even for a compression header\n"));
5939           return 0;
5940         }
5941
5942       chdr->ch_type = BYTE_GET (echdr->ch_type);
5943       chdr->ch_size = BYTE_GET (echdr->ch_size);
5944       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5945       return sizeof (*echdr);
5946     }
5947   else
5948     {
5949       Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
5950
5951       if (size < sizeof (* echdr))
5952         {
5953           error (_("Compressed section is too small even for a compression header\n"));
5954           return 0;
5955         }
5956
5957       chdr->ch_type = BYTE_GET (echdr->ch_type);
5958       chdr->ch_size = BYTE_GET (echdr->ch_size);
5959       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5960       return sizeof (*echdr);
5961     }
5962 }
5963
5964 static bfd_boolean
5965 process_section_headers (Filedata * filedata)
5966 {
5967   Elf_Internal_Shdr * section;
5968   unsigned int i;
5969
5970   filedata->section_headers = NULL;
5971
5972   if (filedata->file_header.e_shnum == 0)
5973     {
5974       /* PR binutils/12467.  */
5975       if (filedata->file_header.e_shoff != 0)
5976         {
5977           warn (_("possibly corrupt ELF file header - it has a non-zero"
5978                   " section header offset, but no section headers\n"));
5979           return FALSE;
5980         }
5981       else if (do_sections)
5982         printf (_("\nThere are no sections in this file.\n"));
5983
5984       return TRUE;
5985     }
5986
5987   if (do_sections && !do_header)
5988     printf (ngettext ("There is %d section header, "
5989                       "starting at offset 0x%lx:\n",
5990                       "There are %d section headers, "
5991                       "starting at offset 0x%lx:\n",
5992                       filedata->file_header.e_shnum),
5993             filedata->file_header.e_shnum,
5994             (unsigned long) filedata->file_header.e_shoff);
5995
5996   if (is_32bit_elf)
5997     {
5998       if (! get_32bit_section_headers (filedata, FALSE))
5999         return FALSE;
6000     }
6001   else
6002     {
6003       if (! get_64bit_section_headers (filedata, FALSE))
6004         return FALSE;
6005     }
6006
6007   /* Read in the string table, so that we have names to display.  */
6008   if (filedata->file_header.e_shstrndx != SHN_UNDEF
6009        && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
6010     {
6011       section = filedata->section_headers + filedata->file_header.e_shstrndx;
6012
6013       if (section->sh_size != 0)
6014         {
6015           filedata->string_table = (char *) get_data (NULL, filedata, section->sh_offset,
6016                                                       1, section->sh_size,
6017                                                       _("string table"));
6018
6019           filedata->string_table_length = filedata->string_table != NULL ? section->sh_size : 0;
6020         }
6021     }
6022
6023   /* Scan the sections for the dynamic symbol table
6024      and dynamic string table and debug sections.  */
6025   dynamic_symbols = NULL;
6026   dynamic_strings = NULL;
6027   dynamic_syminfo = NULL;
6028   symtab_shndx_list = NULL;
6029
6030   eh_addr_size = is_32bit_elf ? 4 : 8;
6031   switch (filedata->file_header.e_machine)
6032     {
6033     case EM_MIPS:
6034     case EM_MIPS_RS3_LE:
6035       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
6036          FDE addresses.  However, the ABI also has a semi-official ILP32
6037          variant for which the normal FDE address size rules apply.
6038
6039          GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
6040          section, where XX is the size of longs in bits.  Unfortunately,
6041          earlier compilers provided no way of distinguishing ILP32 objects
6042          from LP64 objects, so if there's any doubt, we should assume that
6043          the official LP64 form is being used.  */
6044       if ((filedata->file_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
6045           && find_section (filedata, ".gcc_compiled_long32") == NULL)
6046         eh_addr_size = 8;
6047       break;
6048
6049     case EM_H8_300:
6050     case EM_H8_300H:
6051       switch (filedata->file_header.e_flags & EF_H8_MACH)
6052         {
6053         case E_H8_MACH_H8300:
6054         case E_H8_MACH_H8300HN:
6055         case E_H8_MACH_H8300SN:
6056         case E_H8_MACH_H8300SXN:
6057           eh_addr_size = 2;
6058           break;
6059         case E_H8_MACH_H8300H:
6060         case E_H8_MACH_H8300S:
6061         case E_H8_MACH_H8300SX:
6062           eh_addr_size = 4;
6063           break;
6064         }
6065       break;
6066
6067     case EM_M32C_OLD:
6068     case EM_M32C:
6069       switch (filedata->file_header.e_flags & EF_M32C_CPU_MASK)
6070         {
6071         case EF_M32C_CPU_M16C:
6072           eh_addr_size = 2;
6073           break;
6074         }
6075       break;
6076     }
6077
6078 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64)                \
6079   do                                                                    \
6080     {                                                                   \
6081       bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64;  \
6082       if (section->sh_entsize != expected_entsize)                      \
6083         {                                                               \
6084           char buf[40];                                                 \
6085           sprintf_vma (buf, section->sh_entsize);                       \
6086           /* Note: coded this way so that there is a single string for  \
6087              translation.  */ \
6088           error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
6089           error (_("(Using the expected size of %u for the rest of this dump)\n"), \
6090                    (unsigned) expected_entsize);                        \
6091           section->sh_entsize = expected_entsize;                       \
6092         }                                                               \
6093     }                                                                   \
6094   while (0)
6095
6096 #define CHECK_ENTSIZE(section, i, type)                                 \
6097   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),         \
6098                         sizeof (Elf64_External_##type))
6099
6100   for (i = 0, section = filedata->section_headers;
6101        i < filedata->file_header.e_shnum;
6102        i++, section++)
6103     {
6104       char * name = SECTION_NAME (section);
6105
6106       if (section->sh_type == SHT_DYNSYM)
6107         {
6108           if (dynamic_symbols != NULL)
6109             {
6110               error (_("File contains multiple dynamic symbol tables\n"));
6111               continue;
6112             }
6113
6114           CHECK_ENTSIZE (section, i, Sym);
6115           dynamic_symbols = GET_ELF_SYMBOLS (filedata, section, & num_dynamic_syms);
6116         }
6117       else if (section->sh_type == SHT_STRTAB
6118                && streq (name, ".dynstr"))
6119         {
6120           if (dynamic_strings != NULL)
6121             {
6122               error (_("File contains multiple dynamic string tables\n"));
6123               continue;
6124             }
6125
6126           dynamic_strings = (char *) get_data (NULL, filedata, section->sh_offset,
6127                                                1, section->sh_size,
6128                                                _("dynamic strings"));
6129           dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
6130         }
6131       else if (section->sh_type == SHT_SYMTAB_SHNDX)
6132         {
6133           elf_section_list * entry = xmalloc (sizeof * entry);
6134
6135           entry->hdr = section;
6136           entry->next = symtab_shndx_list;
6137           symtab_shndx_list = entry;
6138         }
6139       else if (section->sh_type == SHT_SYMTAB)
6140         CHECK_ENTSIZE (section, i, Sym);
6141       else if (section->sh_type == SHT_GROUP)
6142         CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
6143       else if (section->sh_type == SHT_REL)
6144         CHECK_ENTSIZE (section, i, Rel);
6145       else if (section->sh_type == SHT_RELA)
6146         CHECK_ENTSIZE (section, i, Rela);
6147       else if ((do_debugging || do_debug_info || do_debug_abbrevs
6148                 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
6149                 || do_debug_aranges || do_debug_frames || do_debug_macinfo
6150                 || do_debug_str || do_debug_loc || do_debug_ranges
6151                 || do_debug_addr || do_debug_cu_index || do_debug_links)
6152                && (const_strneq (name, ".debug_")
6153                    || const_strneq (name, ".zdebug_")))
6154         {
6155           if (name[1] == 'z')
6156             name += sizeof (".zdebug_") - 1;
6157           else
6158             name += sizeof (".debug_") - 1;
6159
6160           if (do_debugging
6161               || (do_debug_info     && const_strneq (name, "info"))
6162               || (do_debug_info     && const_strneq (name, "types"))
6163               || (do_debug_abbrevs  && const_strneq (name, "abbrev"))
6164               || (do_debug_lines    && strcmp (name, "line") == 0)
6165               || (do_debug_lines    && const_strneq (name, "line."))
6166               || (do_debug_pubnames && const_strneq (name, "pubnames"))
6167               || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
6168               || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
6169               || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
6170               || (do_debug_aranges  && const_strneq (name, "aranges"))
6171               || (do_debug_ranges   && const_strneq (name, "ranges"))
6172               || (do_debug_ranges   && const_strneq (name, "rnglists"))
6173               || (do_debug_frames   && const_strneq (name, "frame"))
6174               || (do_debug_macinfo  && const_strneq (name, "macinfo"))
6175               || (do_debug_macinfo  && const_strneq (name, "macro"))
6176               || (do_debug_str      && const_strneq (name, "str"))
6177               || (do_debug_loc      && const_strneq (name, "loc"))
6178               || (do_debug_loc      && const_strneq (name, "loclists"))
6179               || (do_debug_addr     && const_strneq (name, "addr"))
6180               || (do_debug_cu_index && const_strneq (name, "cu_index"))
6181               || (do_debug_cu_index && const_strneq (name, "tu_index"))
6182               )
6183             request_dump_bynumber (filedata, i, DEBUG_DUMP);
6184         }
6185       /* Linkonce section to be combined with .debug_info at link time.  */
6186       else if ((do_debugging || do_debug_info)
6187                && const_strneq (name, ".gnu.linkonce.wi."))
6188         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6189       else if (do_debug_frames && streq (name, ".eh_frame"))
6190         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6191       else if (do_gdb_index && (streq (name, ".gdb_index")
6192                                 || streq (name, ".debug_names")))
6193         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6194       /* Trace sections for Itanium VMS.  */
6195       else if ((do_debugging || do_trace_info || do_trace_abbrevs
6196                 || do_trace_aranges)
6197                && const_strneq (name, ".trace_"))
6198         {
6199           name += sizeof (".trace_") - 1;
6200
6201           if (do_debugging
6202               || (do_trace_info     && streq (name, "info"))
6203               || (do_trace_abbrevs  && streq (name, "abbrev"))
6204               || (do_trace_aranges  && streq (name, "aranges"))
6205               )
6206             request_dump_bynumber (filedata, i, DEBUG_DUMP);
6207         }
6208       else if ((do_debugging || do_debug_links)
6209                && (const_strneq (name, ".gnu_debuglink")
6210                    || const_strneq (name, ".gnu_debugaltlink")))
6211         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6212     }
6213
6214   if (! do_sections)
6215     return TRUE;
6216
6217   if (filedata->file_header.e_shnum > 1)
6218     printf (_("\nSection Headers:\n"));
6219   else
6220     printf (_("\nSection Header:\n"));
6221
6222   if (is_32bit_elf)
6223     {
6224       if (do_section_details)
6225         {
6226           printf (_("  [Nr] Name\n"));
6227           printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
6228         }
6229       else
6230         printf
6231           (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
6232     }
6233   else if (do_wide)
6234     {
6235       if (do_section_details)
6236         {
6237           printf (_("  [Nr] Name\n"));
6238           printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
6239         }
6240       else
6241         printf
6242           (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
6243     }
6244   else
6245     {
6246       if (do_section_details)
6247         {
6248           printf (_("  [Nr] Name\n"));
6249           printf (_("       Type              Address          Offset            Link\n"));
6250           printf (_("       Size              EntSize          Info              Align\n"));
6251         }
6252       else
6253         {
6254           printf (_("  [Nr] Name              Type             Address           Offset\n"));
6255           printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
6256         }
6257     }
6258
6259   if (do_section_details)
6260     printf (_("       Flags\n"));
6261
6262   for (i = 0, section = filedata->section_headers;
6263        i < filedata->file_header.e_shnum;
6264        i++, section++)
6265     {
6266       /* Run some sanity checks on the section header.  */
6267
6268       /* Check the sh_link field.  */
6269       switch (section->sh_type)
6270         {
6271         case SHT_SYMTAB_SHNDX:
6272         case SHT_GROUP:
6273         case SHT_HASH:
6274         case SHT_GNU_HASH:
6275         case SHT_GNU_versym:
6276         case SHT_REL:
6277         case SHT_RELA:
6278           if (section->sh_link < 1
6279               || section->sh_link >= filedata->file_header.e_shnum
6280               || (filedata->section_headers[section->sh_link].sh_type != SHT_SYMTAB
6281                   && filedata->section_headers[section->sh_link].sh_type != SHT_DYNSYM))
6282             warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6283                   i, section->sh_link);
6284           break;
6285
6286         case SHT_DYNAMIC:
6287         case SHT_SYMTAB:
6288         case SHT_DYNSYM:
6289         case SHT_GNU_verneed:
6290         case SHT_GNU_verdef:
6291         case SHT_GNU_LIBLIST:
6292           if (section->sh_link < 1
6293               || section->sh_link >= filedata->file_header.e_shnum
6294               || filedata->section_headers[section->sh_link].sh_type != SHT_STRTAB)
6295             warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6296                   i, section->sh_link);
6297           break;
6298
6299         case SHT_INIT_ARRAY:
6300         case SHT_FINI_ARRAY:
6301         case SHT_PREINIT_ARRAY:
6302           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6303             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6304                   i, section->sh_link);
6305           break;
6306
6307         default:
6308           /* FIXME: Add support for target specific section types.  */
6309 #if 0     /* Currently we do not check other section types as there are too
6310              many special cases.  Stab sections for example have a type
6311              of SHT_PROGBITS but an sh_link field that links to the .stabstr
6312              section.  */
6313           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6314             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6315                   i, section->sh_link);
6316 #endif
6317           break;
6318         }
6319
6320       /* Check the sh_info field.  */
6321       switch (section->sh_type)
6322         {
6323         case SHT_REL:
6324         case SHT_RELA:
6325           if (section->sh_info < 1
6326               || section->sh_info >= filedata->file_header.e_shnum
6327               || (filedata->section_headers[section->sh_info].sh_type != SHT_PROGBITS
6328                   && filedata->section_headers[section->sh_info].sh_type != SHT_NOBITS
6329                   && filedata->section_headers[section->sh_info].sh_type != SHT_NOTE
6330                   && filedata->section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
6331                   /* FIXME: Are other section types valid ?  */
6332                   && filedata->section_headers[section->sh_info].sh_type < SHT_LOOS))
6333             {
6334               if (section->sh_info == 0
6335                   && (filedata->file_header.e_type == ET_EXEC
6336                       || filedata->file_header.e_type == ET_DYN
6337                       /* These next two tests may be redundant, but
6338                          they have been left in for paranoia's sake.  */
6339                       || streq (SECTION_NAME (section), ".rel.dyn")
6340                       || streq (SECTION_NAME (section), ".rela.dyn")))
6341                 /* Dynamic relocations apply to segments, not sections, so
6342                    they do not need an sh_info value.  */
6343                 ;
6344               else
6345                 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6346                       i, section->sh_info);
6347             }
6348           break;
6349
6350         case SHT_DYNAMIC:
6351         case SHT_HASH:
6352         case SHT_SYMTAB_SHNDX:
6353         case SHT_INIT_ARRAY:
6354         case SHT_FINI_ARRAY:
6355         case SHT_PREINIT_ARRAY:
6356           if (section->sh_info != 0)
6357             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6358                   i, section->sh_info);
6359           break;
6360
6361         case SHT_GROUP:
6362         case SHT_SYMTAB:
6363         case SHT_DYNSYM:
6364           /* A symbol index - we assume that it is valid.  */
6365           break;
6366
6367         default:
6368           /* FIXME: Add support for target specific section types.  */
6369           if (section->sh_type == SHT_NOBITS)
6370             /* NOBITS section headers with non-zero sh_info fields can be
6371                created when a binary is stripped of everything but its debug
6372                information.  The stripped sections have their headers
6373                preserved but their types set to SHT_NOBITS.  So do not check
6374                this type of section.  */
6375             ;
6376           else if (section->sh_flags & SHF_INFO_LINK)
6377             {
6378               if (section->sh_info < 1 || section->sh_info >= filedata->file_header.e_shnum)
6379                 warn (_("[%2u]: Expected link to another section in info field"), i);
6380             }
6381           else if (section->sh_type < SHT_LOOS
6382                    && (section->sh_flags & SHF_GNU_MBIND) == 0
6383                    && section->sh_info != 0)
6384             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6385                   i, section->sh_info);
6386           break;
6387         }
6388
6389       /* Check the sh_size field.  */
6390       if (section->sh_size > filedata->file_size
6391           && section->sh_type != SHT_NOBITS
6392           && section->sh_type != SHT_NULL
6393           && section->sh_type < SHT_LOOS)
6394         warn (_("Size of section %u is larger than the entire file!\n"), i);
6395
6396       printf ("  [%2u] ", i);
6397       if (do_section_details)
6398         printf ("%s\n      ", printable_section_name (filedata, section));
6399       else
6400         print_symbol (-17, SECTION_NAME (section));
6401
6402       printf (do_wide ? " %-15s " : " %-15.15s ",
6403               get_section_type_name (filedata, section->sh_type));
6404
6405       if (is_32bit_elf)
6406         {
6407           const char * link_too_big = NULL;
6408
6409           print_vma (section->sh_addr, LONG_HEX);
6410
6411           printf ( " %6.6lx %6.6lx %2.2lx",
6412                    (unsigned long) section->sh_offset,
6413                    (unsigned long) section->sh_size,
6414                    (unsigned long) section->sh_entsize);
6415
6416           if (do_section_details)
6417             fputs ("  ", stdout);
6418           else
6419             printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6420
6421           if (section->sh_link >= filedata->file_header.e_shnum)
6422             {
6423               link_too_big = "";
6424               /* The sh_link value is out of range.  Normally this indicates
6425                  an error but it can have special values in Solaris binaries.  */
6426               switch (filedata->file_header.e_machine)
6427                 {
6428                 case EM_386:
6429                 case EM_IAMCU:
6430                 case EM_X86_64:
6431                 case EM_L1OM:
6432                 case EM_K1OM:
6433                 case EM_OLD_SPARCV9:
6434                 case EM_SPARC32PLUS:
6435                 case EM_SPARCV9:
6436                 case EM_SPARC:
6437                   if (section->sh_link == (SHN_BEFORE & 0xffff))
6438                     link_too_big = "BEFORE";
6439                   else if (section->sh_link == (SHN_AFTER & 0xffff))
6440                     link_too_big = "AFTER";
6441                   break;
6442                 default:
6443                   break;
6444                 }
6445             }
6446
6447           if (do_section_details)
6448             {
6449               if (link_too_big != NULL && * link_too_big)
6450                 printf ("<%s> ", link_too_big);
6451               else
6452                 printf ("%2u ", section->sh_link);
6453               printf ("%3u %2lu\n", section->sh_info,
6454                       (unsigned long) section->sh_addralign);
6455             }
6456           else
6457             printf ("%2u %3u %2lu\n",
6458                     section->sh_link,
6459                     section->sh_info,
6460                     (unsigned long) section->sh_addralign);
6461
6462           if (link_too_big && ! * link_too_big)
6463             warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6464                   i, section->sh_link);
6465         }
6466       else if (do_wide)
6467         {
6468           print_vma (section->sh_addr, LONG_HEX);
6469
6470           if ((long) section->sh_offset == section->sh_offset)
6471             printf (" %6.6lx", (unsigned long) section->sh_offset);
6472           else
6473             {
6474               putchar (' ');
6475               print_vma (section->sh_offset, LONG_HEX);
6476             }
6477
6478           if ((unsigned long) section->sh_size == section->sh_size)
6479             printf (" %6.6lx", (unsigned long) section->sh_size);
6480           else
6481             {
6482               putchar (' ');
6483               print_vma (section->sh_size, LONG_HEX);
6484             }
6485
6486           if ((unsigned long) section->sh_entsize == section->sh_entsize)
6487             printf (" %2.2lx", (unsigned long) section->sh_entsize);
6488           else
6489             {
6490               putchar (' ');
6491               print_vma (section->sh_entsize, LONG_HEX);
6492             }
6493
6494           if (do_section_details)
6495             fputs ("  ", stdout);
6496           else
6497             printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6498
6499           printf ("%2u %3u ", section->sh_link, section->sh_info);
6500
6501           if ((unsigned long) section->sh_addralign == section->sh_addralign)
6502             printf ("%2lu\n", (unsigned long) section->sh_addralign);
6503           else
6504             {
6505               print_vma (section->sh_addralign, DEC);
6506               putchar ('\n');
6507             }
6508         }
6509       else if (do_section_details)
6510         {
6511           putchar (' ');
6512           print_vma (section->sh_addr, LONG_HEX);
6513           if ((long) section->sh_offset == section->sh_offset)
6514             printf ("  %16.16lx", (unsigned long) section->sh_offset);
6515           else
6516             {
6517               printf ("  ");
6518               print_vma (section->sh_offset, LONG_HEX);
6519             }
6520           printf ("  %u\n       ", section->sh_link);
6521           print_vma (section->sh_size, LONG_HEX);
6522           putchar (' ');
6523           print_vma (section->sh_entsize, LONG_HEX);
6524
6525           printf ("  %-16u  %lu\n",
6526                   section->sh_info,
6527                   (unsigned long) section->sh_addralign);
6528         }
6529       else
6530         {
6531           putchar (' ');
6532           print_vma (section->sh_addr, LONG_HEX);
6533           if ((long) section->sh_offset == section->sh_offset)
6534             printf ("  %8.8lx", (unsigned long) section->sh_offset);
6535           else
6536             {
6537               printf ("  ");
6538               print_vma (section->sh_offset, LONG_HEX);
6539             }
6540           printf ("\n       ");
6541           print_vma (section->sh_size, LONG_HEX);
6542           printf ("  ");
6543           print_vma (section->sh_entsize, LONG_HEX);
6544
6545           printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6546
6547           printf ("     %2u   %3u     %lu\n",
6548                   section->sh_link,
6549                   section->sh_info,
6550                   (unsigned long) section->sh_addralign);
6551         }
6552
6553       if (do_section_details)
6554         {
6555           printf ("       %s\n", get_elf_section_flags (filedata, section->sh_flags));
6556           if ((section->sh_flags & SHF_COMPRESSED) != 0)
6557             {
6558               /* Minimum section size is 12 bytes for 32-bit compression
6559                  header + 12 bytes for compressed data header.  */
6560               unsigned char buf[24];
6561
6562               assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6563               if (get_data (&buf, filedata, section->sh_offset, 1,
6564                             sizeof (buf), _("compression header")))
6565                 {
6566                   Elf_Internal_Chdr chdr;
6567
6568                   (void) get_compression_header (&chdr, buf, sizeof (buf));
6569
6570                   if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6571                     printf ("       ZLIB, ");
6572                   else
6573                     printf (_("       [<unknown>: 0x%x], "),
6574                             chdr.ch_type);
6575                   print_vma (chdr.ch_size, LONG_HEX);
6576                   printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6577                 }
6578             }
6579         }
6580     }
6581
6582   if (!do_section_details)
6583     {
6584       /* The ordering of the letters shown here matches the ordering of the
6585          corresponding SHF_xxx values, and hence the order in which these
6586          letters will be displayed to the user.  */
6587       printf (_("Key to Flags:\n\
6588   W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6589   L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6590   C (compressed), x (unknown), o (OS specific), E (exclude),\n  "));
6591       if (filedata->file_header.e_machine == EM_X86_64
6592           || filedata->file_header.e_machine == EM_L1OM
6593           || filedata->file_header.e_machine == EM_K1OM)
6594         printf (_("l (large), "));
6595       else if (filedata->file_header.e_machine == EM_ARM)
6596         printf (_("y (purecode), "));
6597       else if (filedata->file_header.e_machine == EM_PPC)
6598         printf (_("v (VLE), "));
6599       printf ("p (processor specific)\n");
6600     }
6601
6602   return TRUE;
6603 }
6604
6605 static const char *
6606 get_group_flags (unsigned int flags)
6607 {
6608   static char buff[128];
6609
6610   if (flags == 0)
6611     return "";
6612   else if (flags == GRP_COMDAT)
6613     return "COMDAT ";
6614
6615   snprintf (buff, 14, _("[0x%x: "), flags);
6616
6617   flags &= ~ GRP_COMDAT;
6618   if (flags & GRP_MASKOS)
6619     {
6620       strcat (buff, "<OS specific>");
6621       flags &= ~ GRP_MASKOS;
6622     }
6623
6624   if (flags & GRP_MASKPROC)
6625     {
6626       strcat (buff, "<PROC specific>");
6627       flags &= ~ GRP_MASKPROC;
6628     }
6629
6630   if (flags)
6631     strcat (buff, "<unknown>");
6632
6633   strcat (buff, "]");
6634   return buff;
6635 }
6636
6637 static bfd_boolean
6638 process_section_groups (Filedata * filedata)
6639 {
6640   Elf_Internal_Shdr * section;
6641   unsigned int i;
6642   struct group * group;
6643   Elf_Internal_Shdr * symtab_sec;
6644   Elf_Internal_Shdr * strtab_sec;
6645   Elf_Internal_Sym * symtab;
6646   unsigned long num_syms;
6647   char * strtab;
6648   size_t strtab_size;
6649
6650   /* Don't process section groups unless needed.  */
6651   if (!do_unwind && !do_section_groups)
6652     return TRUE;
6653
6654   if (filedata->file_header.e_shnum == 0)
6655     {
6656       if (do_section_groups)
6657         printf (_("\nThere are no sections to group in this file.\n"));
6658
6659       return TRUE;
6660     }
6661
6662   if (filedata->section_headers == NULL)
6663     {
6664       error (_("Section headers are not available!\n"));
6665       /* PR 13622: This can happen with a corrupt ELF header.  */
6666       return FALSE;
6667     }
6668
6669   section_headers_groups = (struct group **) calloc (filedata->file_header.e_shnum,
6670                                                      sizeof (struct group *));
6671
6672   if (section_headers_groups == NULL)
6673     {
6674       error (_("Out of memory reading %u section group headers\n"),
6675              filedata->file_header.e_shnum);
6676       return FALSE;
6677     }
6678
6679   /* Scan the sections for the group section.  */
6680   group_count = 0;
6681   for (i = 0, section = filedata->section_headers;
6682        i < filedata->file_header.e_shnum;
6683        i++, section++)
6684     if (section->sh_type == SHT_GROUP)
6685       group_count++;
6686
6687   if (group_count == 0)
6688     {
6689       if (do_section_groups)
6690         printf (_("\nThere are no section groups in this file.\n"));
6691
6692       return TRUE;
6693     }
6694
6695   section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6696
6697   if (section_groups == NULL)
6698     {
6699       error (_("Out of memory reading %lu groups\n"),
6700              (unsigned long) group_count);
6701       return FALSE;
6702     }
6703
6704   symtab_sec = NULL;
6705   strtab_sec = NULL;
6706   symtab = NULL;
6707   num_syms = 0;
6708   strtab = NULL;
6709   strtab_size = 0;
6710   for (i = 0, section = filedata->section_headers, group = section_groups;
6711        i < filedata->file_header.e_shnum;
6712        i++, section++)
6713     {
6714       if (section->sh_type == SHT_GROUP)
6715         {
6716           const char * name = printable_section_name (filedata, section);
6717           const char * group_name;
6718           unsigned char * start;
6719           unsigned char * indices;
6720           unsigned int entry, j, size;
6721           Elf_Internal_Shdr * sec;
6722           Elf_Internal_Sym * sym;
6723
6724           /* Get the symbol table.  */
6725           if (section->sh_link >= filedata->file_header.e_shnum
6726               || ((sec = filedata->section_headers + section->sh_link)->sh_type
6727                   != SHT_SYMTAB))
6728             {
6729               error (_("Bad sh_link in group section `%s'\n"), name);
6730               continue;
6731             }
6732
6733           if (symtab_sec != sec)
6734             {
6735               symtab_sec = sec;
6736               if (symtab)
6737                 free (symtab);
6738               symtab = GET_ELF_SYMBOLS (filedata, symtab_sec, & num_syms);
6739             }
6740
6741           if (symtab == NULL)
6742             {
6743               error (_("Corrupt header in group section `%s'\n"), name);
6744               continue;
6745             }
6746
6747           if (section->sh_info >= num_syms)
6748             {
6749               error (_("Bad sh_info in group section `%s'\n"), name);
6750               continue;
6751             }
6752
6753           sym = symtab + section->sh_info;
6754
6755           if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6756             {
6757               if (sym->st_shndx == 0
6758                   || sym->st_shndx >= filedata->file_header.e_shnum)
6759                 {
6760                   error (_("Bad sh_info in group section `%s'\n"), name);
6761                   continue;
6762                 }
6763
6764               group_name = SECTION_NAME (filedata->section_headers + sym->st_shndx);
6765               strtab_sec = NULL;
6766               if (strtab)
6767                 free (strtab);
6768               strtab = NULL;
6769               strtab_size = 0;
6770             }
6771           else
6772             {
6773               /* Get the string table.  */
6774               if (symtab_sec->sh_link >= filedata->file_header.e_shnum)
6775                 {
6776                   strtab_sec = NULL;
6777                   if (strtab)
6778                     free (strtab);
6779                   strtab = NULL;
6780                   strtab_size = 0;
6781                 }
6782               else if (strtab_sec
6783                        != (sec = filedata->section_headers + symtab_sec->sh_link))
6784                 {
6785                   strtab_sec = sec;
6786                   if (strtab)
6787                     free (strtab);
6788
6789                   strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
6790                                               1, strtab_sec->sh_size,
6791                                               _("string table"));
6792                   strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6793                 }
6794               group_name = sym->st_name < strtab_size
6795                 ? strtab + sym->st_name : _("<corrupt>");
6796             }
6797
6798           /* PR 17531: file: loop.  */
6799           if (section->sh_entsize > section->sh_size)
6800             {
6801               error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6802                      printable_section_name (filedata, section),
6803                      (unsigned long) section->sh_entsize,
6804                      (unsigned long) section->sh_size);
6805               break;
6806             }
6807
6808           start = (unsigned char *) get_data (NULL, filedata, section->sh_offset,
6809                                               1, section->sh_size,
6810                                               _("section data"));
6811           if (start == NULL)
6812             continue;
6813
6814           indices = start;
6815           size = (section->sh_size / section->sh_entsize) - 1;
6816           entry = byte_get (indices, 4);
6817           indices += 4;
6818
6819           if (do_section_groups)
6820             {
6821               printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6822                       get_group_flags (entry), i, name, group_name, size);
6823
6824               printf (_("   [Index]    Name\n"));
6825             }
6826
6827           group->group_index = i;
6828
6829           for (j = 0; j < size; j++)
6830             {
6831               struct group_list * g;
6832
6833               entry = byte_get (indices, 4);
6834               indices += 4;
6835
6836               if (entry >= filedata->file_header.e_shnum)
6837                 {
6838                   static unsigned num_group_errors = 0;
6839
6840                   if (num_group_errors ++ < 10)
6841                     {
6842                       error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6843                              entry, i, filedata->file_header.e_shnum - 1);
6844                       if (num_group_errors == 10)
6845                         warn (_("Further error messages about overlarge group section indicies suppressed\n"));
6846                     }
6847                   continue;
6848                 }
6849
6850               if (section_headers_groups [entry] != NULL)
6851                 {
6852                   if (entry)
6853                     {
6854                       static unsigned num_errs = 0;
6855
6856                       if (num_errs ++ < 10)
6857                         {
6858                           error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6859                                  entry, i,
6860                                  section_headers_groups [entry]->group_index);
6861                           if (num_errs == 10)
6862                             warn (_("Further error messages about already contained group sections suppressed\n"));
6863                         }
6864                       continue;
6865                     }
6866                   else
6867                     {
6868                       /* Intel C/C++ compiler may put section 0 in a
6869                          section group.  We just warn it the first time
6870                          and ignore it afterwards.  */
6871                       static bfd_boolean warned = FALSE;
6872                       if (!warned)
6873                         {
6874                           error (_("section 0 in group section [%5u]\n"),
6875                                  section_headers_groups [entry]->group_index);
6876                           warned = TRUE;
6877                         }
6878                     }
6879                 }
6880
6881               section_headers_groups [entry] = group;
6882
6883               if (do_section_groups)
6884                 {
6885                   sec = filedata->section_headers + entry;
6886                   printf ("   [%5u]   %s\n", entry, printable_section_name (filedata, sec));
6887                 }
6888
6889               g = (struct group_list *) xmalloc (sizeof (struct group_list));
6890               g->section_index = entry;
6891               g->next = group->root;
6892               group->root = g;
6893             }
6894
6895           if (start)
6896             free (start);
6897
6898           group++;
6899         }
6900     }
6901
6902   if (symtab)
6903     free (symtab);
6904   if (strtab)
6905     free (strtab);
6906   return TRUE;
6907 }
6908
6909 /* Data used to display dynamic fixups.  */
6910
6911 struct ia64_vms_dynfixup
6912 {
6913   bfd_vma needed_ident;         /* Library ident number.  */
6914   bfd_vma needed;               /* Index in the dstrtab of the library name.  */
6915   bfd_vma fixup_needed;         /* Index of the library.  */
6916   bfd_vma fixup_rela_cnt;       /* Number of fixups.  */
6917   bfd_vma fixup_rela_off;       /* Fixups offset in the dynamic segment.  */
6918 };
6919
6920 /* Data used to display dynamic relocations.  */
6921
6922 struct ia64_vms_dynimgrela
6923 {
6924   bfd_vma img_rela_cnt;         /* Number of relocations.  */
6925   bfd_vma img_rela_off;         /* Reloc offset in the dynamic segment.  */
6926 };
6927
6928 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6929    library).  */
6930
6931 static bfd_boolean
6932 dump_ia64_vms_dynamic_fixups (Filedata *                  filedata,
6933                               struct ia64_vms_dynfixup *  fixup,
6934                               const char *                strtab,
6935                               unsigned int                strtab_sz)
6936 {
6937   Elf64_External_VMS_IMAGE_FIXUP * imfs;
6938   long i;
6939   const char * lib_name;
6940
6941   imfs = get_data (NULL, filedata, dynamic_addr + fixup->fixup_rela_off,
6942                    1, fixup->fixup_rela_cnt * sizeof (*imfs),
6943                    _("dynamic section image fixups"));
6944   if (!imfs)
6945     return FALSE;
6946
6947   if (fixup->needed < strtab_sz)
6948     lib_name = strtab + fixup->needed;
6949   else
6950     {
6951       warn (_("corrupt library name index of 0x%lx found in dynamic entry"),
6952             (unsigned long) fixup->needed);
6953       lib_name = "???";
6954     }
6955   printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6956           (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6957   printf
6958     (_("Seg Offset           Type                             SymVec DataType\n"));
6959
6960   for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6961     {
6962       unsigned int type;
6963       const char *rtype;
6964
6965       printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6966       printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6967       type = BYTE_GET (imfs [i].type);
6968       rtype = elf_ia64_reloc_type (type);
6969       if (rtype == NULL)
6970         printf (" 0x%08x                       ", type);
6971       else
6972         printf (" %-32s ", rtype);
6973       printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6974       printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6975     }
6976
6977   free (imfs);
6978   return TRUE;
6979 }
6980
6981 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
6982
6983 static bfd_boolean
6984 dump_ia64_vms_dynamic_relocs (Filedata * filedata, struct ia64_vms_dynimgrela *imgrela)
6985 {
6986   Elf64_External_VMS_IMAGE_RELA *imrs;
6987   long i;
6988
6989   imrs = get_data (NULL, filedata, dynamic_addr + imgrela->img_rela_off,
6990                    1, imgrela->img_rela_cnt * sizeof (*imrs),
6991                    _("dynamic section image relocations"));
6992   if (!imrs)
6993     return FALSE;
6994
6995   printf (_("\nImage relocs\n"));
6996   printf
6997     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
6998
6999   for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
7000     {
7001       unsigned int type;
7002       const char *rtype;
7003
7004       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
7005       printf ("%08" BFD_VMA_FMT "x ",
7006               (bfd_vma) BYTE_GET (imrs [i].rela_offset));
7007       type = BYTE_GET (imrs [i].type);
7008       rtype = elf_ia64_reloc_type (type);
7009       if (rtype == NULL)
7010         printf ("0x%08x                      ", type);
7011       else
7012         printf ("%-31s ", rtype);
7013       print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
7014       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
7015       printf ("%08" BFD_VMA_FMT "x\n",
7016               (bfd_vma) BYTE_GET (imrs [i].sym_offset));
7017     }
7018
7019   free (imrs);
7020   return TRUE;
7021 }
7022
7023 /* Display IA-64 OpenVMS dynamic relocations and fixups.  */
7024
7025 static bfd_boolean
7026 process_ia64_vms_dynamic_relocs (Filedata * filedata)
7027 {
7028   struct ia64_vms_dynfixup fixup;
7029   struct ia64_vms_dynimgrela imgrela;
7030   Elf_Internal_Dyn *entry;
7031   bfd_vma strtab_off = 0;
7032   bfd_vma strtab_sz = 0;
7033   char *strtab = NULL;
7034   bfd_boolean res = TRUE;
7035
7036   memset (&fixup, 0, sizeof (fixup));
7037   memset (&imgrela, 0, sizeof (imgrela));
7038
7039   /* Note: the order of the entries is specified by the OpenVMS specs.  */
7040   for (entry = dynamic_section;
7041        entry < dynamic_section + dynamic_nent;
7042        entry++)
7043     {
7044       switch (entry->d_tag)
7045         {
7046         case DT_IA_64_VMS_STRTAB_OFFSET:
7047           strtab_off = entry->d_un.d_val;
7048           break;
7049         case DT_STRSZ:
7050           strtab_sz = entry->d_un.d_val;
7051           if (strtab == NULL)
7052             strtab = get_data (NULL, filedata, dynamic_addr + strtab_off,
7053                                1, strtab_sz, _("dynamic string section"));
7054           break;
7055
7056         case DT_IA_64_VMS_NEEDED_IDENT:
7057           fixup.needed_ident = entry->d_un.d_val;
7058           break;
7059         case DT_NEEDED:
7060           fixup.needed = entry->d_un.d_val;
7061           break;
7062         case DT_IA_64_VMS_FIXUP_NEEDED:
7063           fixup.fixup_needed = entry->d_un.d_val;
7064           break;
7065         case DT_IA_64_VMS_FIXUP_RELA_CNT:
7066           fixup.fixup_rela_cnt = entry->d_un.d_val;
7067           break;
7068         case DT_IA_64_VMS_FIXUP_RELA_OFF:
7069           fixup.fixup_rela_off = entry->d_un.d_val;
7070           if (! dump_ia64_vms_dynamic_fixups (filedata, &fixup, strtab, strtab_sz))
7071             res = FALSE;
7072           break;
7073         case DT_IA_64_VMS_IMG_RELA_CNT:
7074           imgrela.img_rela_cnt = entry->d_un.d_val;
7075           break;
7076         case DT_IA_64_VMS_IMG_RELA_OFF:
7077           imgrela.img_rela_off = entry->d_un.d_val;
7078           if (! dump_ia64_vms_dynamic_relocs (filedata, &imgrela))
7079             res = FALSE;
7080           break;
7081
7082         default:
7083           break;
7084         }
7085     }
7086
7087   if (strtab != NULL)
7088     free (strtab);
7089
7090   return res;
7091 }
7092
7093 static struct
7094 {
7095   const char * name;
7096   int reloc;
7097   int size;
7098   int rela;
7099 }
7100   dynamic_relocations [] =
7101 {
7102   { "REL", DT_REL, DT_RELSZ, FALSE },
7103   { "RELA", DT_RELA, DT_RELASZ, TRUE },
7104   { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
7105 };
7106
7107 /* Process the reloc section.  */
7108
7109 static bfd_boolean
7110 process_relocs (Filedata * filedata)
7111 {
7112   unsigned long rel_size;
7113   unsigned long rel_offset;
7114
7115   if (!do_reloc)
7116     return TRUE;
7117
7118   if (do_using_dynamic)
7119     {
7120       int          is_rela;
7121       const char * name;
7122       bfd_boolean  has_dynamic_reloc;
7123       unsigned int i;
7124
7125       has_dynamic_reloc = FALSE;
7126
7127       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7128         {
7129           is_rela = dynamic_relocations [i].rela;
7130           name = dynamic_relocations [i].name;
7131           rel_size = dynamic_info [dynamic_relocations [i].size];
7132           rel_offset = dynamic_info [dynamic_relocations [i].reloc];
7133
7134           if (rel_size)
7135             has_dynamic_reloc = TRUE;
7136
7137           if (is_rela == UNKNOWN)
7138             {
7139               if (dynamic_relocations [i].reloc == DT_JMPREL)
7140                 switch (dynamic_info[DT_PLTREL])
7141                   {
7142                   case DT_REL:
7143                     is_rela = FALSE;
7144                     break;
7145                   case DT_RELA:
7146                     is_rela = TRUE;
7147                     break;
7148                   }
7149             }
7150
7151           if (rel_size)
7152             {
7153               printf
7154                 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
7155                  name, rel_offset, rel_size);
7156
7157               dump_relocations (filedata,
7158                                 offset_from_vma (filedata, rel_offset, rel_size),
7159                                 rel_size,
7160                                 dynamic_symbols, num_dynamic_syms,
7161                                 dynamic_strings, dynamic_strings_length,
7162                                 is_rela, TRUE /* is_dynamic */);
7163             }
7164         }
7165
7166       if (is_ia64_vms (filedata))
7167         if (process_ia64_vms_dynamic_relocs (filedata))
7168           has_dynamic_reloc = TRUE;
7169
7170       if (! has_dynamic_reloc)
7171         printf (_("\nThere are no dynamic relocations in this file.\n"));
7172     }
7173   else
7174     {
7175       Elf_Internal_Shdr * section;
7176       unsigned long i;
7177       bfd_boolean found = FALSE;
7178
7179       for (i = 0, section = filedata->section_headers;
7180            i < filedata->file_header.e_shnum;
7181            i++, section++)
7182         {
7183           if (   section->sh_type != SHT_RELA
7184               && section->sh_type != SHT_REL)
7185             continue;
7186
7187           rel_offset = section->sh_offset;
7188           rel_size   = section->sh_size;
7189
7190           if (rel_size)
7191             {
7192               Elf_Internal_Shdr * strsec;
7193               int is_rela;
7194               unsigned long num_rela;
7195
7196               printf (_("\nRelocation section "));
7197
7198               if (filedata->string_table == NULL)
7199                 printf ("%d", section->sh_name);
7200               else
7201                 printf ("'%s'", printable_section_name (filedata, section));
7202
7203               num_rela = rel_size / section->sh_entsize;
7204               printf (ngettext (" at offset 0x%lx contains %lu entry:\n",
7205                                 " at offset 0x%lx contains %lu entries:\n",
7206                                 num_rela),
7207                       rel_offset, num_rela);
7208
7209               is_rela = section->sh_type == SHT_RELA;
7210
7211               if (section->sh_link != 0
7212                   && section->sh_link < filedata->file_header.e_shnum)
7213                 {
7214                   Elf_Internal_Shdr * symsec;
7215                   Elf_Internal_Sym *  symtab;
7216                   unsigned long nsyms;
7217                   unsigned long strtablen = 0;
7218                   char * strtab = NULL;
7219
7220                   symsec = filedata->section_headers + section->sh_link;
7221                   if (symsec->sh_type != SHT_SYMTAB
7222                       && symsec->sh_type != SHT_DYNSYM)
7223                     continue;
7224
7225                   symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
7226
7227                   if (symtab == NULL)
7228                     continue;
7229
7230                   if (symsec->sh_link != 0
7231                       && symsec->sh_link < filedata->file_header.e_shnum)
7232                     {
7233                       strsec = filedata->section_headers + symsec->sh_link;
7234
7235                       strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7236                                                   1, strsec->sh_size,
7237                                                   _("string table"));
7238                       strtablen = strtab == NULL ? 0 : strsec->sh_size;
7239                     }
7240
7241                   dump_relocations (filedata, rel_offset, rel_size,
7242                                     symtab, nsyms, strtab, strtablen,
7243                                     is_rela,
7244                                     symsec->sh_type == SHT_DYNSYM);
7245                   if (strtab)
7246                     free (strtab);
7247                   free (symtab);
7248                 }
7249               else
7250                 dump_relocations (filedata, rel_offset, rel_size,
7251                                   NULL, 0, NULL, 0, is_rela,
7252                                   FALSE /* is_dynamic */);
7253
7254               found = TRUE;
7255             }
7256         }
7257
7258       if (! found)
7259         {
7260           /* Users sometimes forget the -D option, so try to be helpful.  */
7261           for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7262             {
7263               if (dynamic_info [dynamic_relocations [i].size])
7264                 {
7265                   printf (_("\nThere are no static relocations in this file."));
7266                   printf (_("\nTo see the dynamic relocations add --use-dynamic to the command line.\n"));
7267
7268                   break;
7269                 }
7270             }
7271           if (i == ARRAY_SIZE (dynamic_relocations))
7272             printf (_("\nThere are no relocations in this file.\n"));
7273         }
7274     }
7275
7276   return TRUE;
7277 }
7278
7279 /* An absolute address consists of a section and an offset.  If the
7280    section is NULL, the offset itself is the address, otherwise, the
7281    address equals to LOAD_ADDRESS(section) + offset.  */
7282
7283 struct absaddr
7284 {
7285   unsigned short section;
7286   bfd_vma offset;
7287 };
7288
7289 #define ABSADDR(a) \
7290   ((a).section \
7291    ? filedata->section_headers [(a).section].sh_addr + (a).offset \
7292    : (a).offset)
7293
7294 /* Find the nearest symbol at or below ADDR.  Returns the symbol
7295    name, if found, and the offset from the symbol to ADDR.  */
7296
7297 static void
7298 find_symbol_for_address (Filedata *          filedata,
7299                          Elf_Internal_Sym *  symtab,
7300                          unsigned long       nsyms,
7301                          const char *        strtab,
7302                          unsigned long       strtab_size,
7303                          struct absaddr      addr,
7304                          const char **       symname,
7305                          bfd_vma *           offset)
7306 {
7307   bfd_vma dist = 0x100000;
7308   Elf_Internal_Sym * sym;
7309   Elf_Internal_Sym * beg;
7310   Elf_Internal_Sym * end;
7311   Elf_Internal_Sym * best = NULL;
7312
7313   REMOVE_ARCH_BITS (addr.offset);
7314   beg = symtab;
7315   end = symtab + nsyms;
7316
7317   while (beg < end)
7318     {
7319       bfd_vma value;
7320
7321       sym = beg + (end - beg) / 2;
7322
7323       value = sym->st_value;
7324       REMOVE_ARCH_BITS (value);
7325
7326       if (sym->st_name != 0
7327           && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
7328           && addr.offset >= value
7329           && addr.offset - value < dist)
7330         {
7331           best = sym;
7332           dist = addr.offset - value;
7333           if (!dist)
7334             break;
7335         }
7336
7337       if (addr.offset < value)
7338         end = sym;
7339       else
7340         beg = sym + 1;
7341     }
7342
7343   if (best)
7344     {
7345       *symname = (best->st_name >= strtab_size
7346                   ? _("<corrupt>") : strtab + best->st_name);
7347       *offset = dist;
7348       return;
7349     }
7350
7351   *symname = NULL;
7352   *offset = addr.offset;
7353 }
7354
7355 static /* signed */ int
7356 symcmp (const void *p, const void *q)
7357 {
7358   Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7359   Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7360
7361   return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7362 }
7363
7364 /* Process the unwind section.  */
7365
7366 #include "unwind-ia64.h"
7367
7368 struct ia64_unw_table_entry
7369 {
7370   struct absaddr start;
7371   struct absaddr end;
7372   struct absaddr info;
7373 };
7374
7375 struct ia64_unw_aux_info
7376 {
7377   struct ia64_unw_table_entry * table;          /* Unwind table.  */
7378   unsigned long                 table_len;      /* Length of unwind table.  */
7379   unsigned char *               info;           /* Unwind info.  */
7380   unsigned long                 info_size;      /* Size of unwind info.  */
7381   bfd_vma                       info_addr;      /* Starting address of unwind info.  */
7382   bfd_vma                       seg_base;       /* Starting address of segment.  */
7383   Elf_Internal_Sym *            symtab;         /* The symbol table.  */
7384   unsigned long                 nsyms;          /* Number of symbols.  */
7385   Elf_Internal_Sym *            funtab;         /* Sorted table of STT_FUNC symbols.  */
7386   unsigned long                 nfuns;          /* Number of entries in funtab.  */
7387   char *                        strtab;         /* The string table.  */
7388   unsigned long                 strtab_size;    /* Size of string table.  */
7389 };
7390
7391 static bfd_boolean
7392 dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
7393 {
7394   struct ia64_unw_table_entry * tp;
7395   unsigned long j, nfuns;
7396   int in_body;
7397   bfd_boolean res = TRUE;
7398
7399   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7400   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7401     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7402       aux->funtab[nfuns++] = aux->symtab[j];
7403   aux->nfuns = nfuns;
7404   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7405
7406   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7407     {
7408       bfd_vma stamp;
7409       bfd_vma offset;
7410       const unsigned char * dp;
7411       const unsigned char * head;
7412       const unsigned char * end;
7413       const char * procname;
7414
7415       find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7416                                aux->strtab_size, tp->start, &procname, &offset);
7417
7418       fputs ("\n<", stdout);
7419
7420       if (procname)
7421         {
7422           fputs (procname, stdout);
7423
7424           if (offset)
7425             printf ("+%lx", (unsigned long) offset);
7426         }
7427
7428       fputs (">: [", stdout);
7429       print_vma (tp->start.offset, PREFIX_HEX);
7430       fputc ('-', stdout);
7431       print_vma (tp->end.offset, PREFIX_HEX);
7432       printf ("], info at +0x%lx\n",
7433               (unsigned long) (tp->info.offset - aux->seg_base));
7434
7435       /* PR 17531: file: 86232b32.  */
7436       if (aux->info == NULL)
7437         continue;
7438
7439       /* PR 17531: file: 0997b4d1.  */
7440       if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7441         {
7442           warn (_("Invalid offset %lx in table entry %ld\n"),
7443                 (long) tp->info.offset, (long) (tp - aux->table));
7444           res = FALSE;
7445           continue;
7446         }
7447
7448       head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
7449       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7450
7451       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7452               (unsigned) UNW_VER (stamp),
7453               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7454               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7455               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7456               (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7457
7458       if (UNW_VER (stamp) != 1)
7459         {
7460           printf (_("\tUnknown version.\n"));
7461           continue;
7462         }
7463
7464       in_body = 0;
7465       end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7466       /* PR 17531: file: 16ceda89.  */
7467       if (end > aux->info + aux->info_size)
7468         end = aux->info + aux->info_size;
7469       for (dp = head + 8; dp < end;)
7470         dp = unw_decode (dp, in_body, & in_body, end);
7471     }
7472
7473   free (aux->funtab);
7474
7475   return res;
7476 }
7477
7478 static bfd_boolean
7479 slurp_ia64_unwind_table (Filedata *                  filedata,
7480                          struct ia64_unw_aux_info *  aux,
7481                          Elf_Internal_Shdr *         sec)
7482 {
7483   unsigned long size, nrelas, i;
7484   Elf_Internal_Phdr * seg;
7485   struct ia64_unw_table_entry * tep;
7486   Elf_Internal_Shdr * relsec;
7487   Elf_Internal_Rela * rela;
7488   Elf_Internal_Rela * rp;
7489   unsigned char * table;
7490   unsigned char * tp;
7491   Elf_Internal_Sym * sym;
7492   const char * relname;
7493
7494   aux->table_len = 0;
7495
7496   /* First, find the starting address of the segment that includes
7497      this section: */
7498
7499   if (filedata->file_header.e_phnum)
7500     {
7501       if (! get_program_headers (filedata))
7502           return FALSE;
7503
7504       for (seg = filedata->program_headers;
7505            seg < filedata->program_headers + filedata->file_header.e_phnum;
7506            ++seg)
7507         {
7508           if (seg->p_type != PT_LOAD)
7509             continue;
7510
7511           if (sec->sh_addr >= seg->p_vaddr
7512               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7513             {
7514               aux->seg_base = seg->p_vaddr;
7515               break;
7516             }
7517         }
7518     }
7519
7520   /* Second, build the unwind table from the contents of the unwind section:  */
7521   size = sec->sh_size;
7522   table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7523                                       _("unwind table"));
7524   if (!table)
7525     return FALSE;
7526
7527   aux->table_len = size / (3 * eh_addr_size);
7528   aux->table = (struct ia64_unw_table_entry *)
7529     xcmalloc (aux->table_len, sizeof (aux->table[0]));
7530   tep = aux->table;
7531
7532   for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7533     {
7534       tep->start.section = SHN_UNDEF;
7535       tep->end.section   = SHN_UNDEF;
7536       tep->info.section  = SHN_UNDEF;
7537       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7538       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7539       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7540       tep->start.offset += aux->seg_base;
7541       tep->end.offset   += aux->seg_base;
7542       tep->info.offset  += aux->seg_base;
7543     }
7544   free (table);
7545
7546   /* Third, apply any relocations to the unwind table:  */
7547   for (relsec = filedata->section_headers;
7548        relsec < filedata->section_headers + filedata->file_header.e_shnum;
7549        ++relsec)
7550     {
7551       if (relsec->sh_type != SHT_RELA
7552           || relsec->sh_info >= filedata->file_header.e_shnum
7553           || filedata->section_headers + relsec->sh_info != sec)
7554         continue;
7555
7556       if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
7557                               & rela, & nrelas))
7558         {
7559           free (aux->table);
7560           aux->table = NULL;
7561           aux->table_len = 0;
7562           return FALSE;
7563         }
7564
7565       for (rp = rela; rp < rela + nrelas; ++rp)
7566         {
7567           relname = elf_ia64_reloc_type (get_reloc_type (filedata, rp->r_info));
7568           sym = aux->symtab + get_reloc_symindex (rp->r_info);
7569
7570           /* PR 17531: file: 9fa67536.  */
7571           if (relname == NULL)
7572             {
7573               warn (_("Skipping unknown relocation type: %u\n"),
7574                     get_reloc_type (filedata, rp->r_info));
7575               continue;
7576             }
7577
7578           if (! const_strneq (relname, "R_IA64_SEGREL"))
7579             {
7580               warn (_("Skipping unexpected relocation type: %s\n"), relname);
7581               continue;
7582             }
7583
7584           i = rp->r_offset / (3 * eh_addr_size);
7585
7586           /* PR 17531: file: 5bc8d9bf.  */
7587           if (i >= aux->table_len)
7588             {
7589               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7590               continue;
7591             }
7592
7593           switch (rp->r_offset / eh_addr_size % 3)
7594             {
7595             case 0:
7596               aux->table[i].start.section = sym->st_shndx;
7597               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
7598               break;
7599             case 1:
7600               aux->table[i].end.section   = sym->st_shndx;
7601               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
7602               break;
7603             case 2:
7604               aux->table[i].info.section  = sym->st_shndx;
7605               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
7606               break;
7607             default:
7608               break;
7609             }
7610         }
7611
7612       free (rela);
7613     }
7614
7615   return TRUE;
7616 }
7617
7618 static bfd_boolean
7619 ia64_process_unwind (Filedata * filedata)
7620 {
7621   Elf_Internal_Shdr * sec;
7622   Elf_Internal_Shdr * unwsec = NULL;
7623   Elf_Internal_Shdr * strsec;
7624   unsigned long i, unwcount = 0, unwstart = 0;
7625   struct ia64_unw_aux_info aux;
7626   bfd_boolean res = TRUE;
7627
7628   memset (& aux, 0, sizeof (aux));
7629
7630   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
7631     {
7632       if (sec->sh_type == SHT_SYMTAB
7633           && sec->sh_link < filedata->file_header.e_shnum)
7634         {
7635           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
7636
7637           strsec = filedata->section_headers + sec->sh_link;
7638           if (aux.strtab != NULL)
7639             {
7640               error (_("Multiple auxillary string tables encountered\n"));
7641               free (aux.strtab);
7642               res = FALSE;
7643             }
7644           aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7645                                           1, strsec->sh_size,
7646                                           _("string table"));
7647           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7648         }
7649       else if (sec->sh_type == SHT_IA_64_UNWIND)
7650         unwcount++;
7651     }
7652
7653   if (!unwcount)
7654     printf (_("\nThere are no unwind sections in this file.\n"));
7655
7656   while (unwcount-- > 0)
7657     {
7658       char * suffix;
7659       size_t len, len2;
7660
7661       for (i = unwstart, sec = filedata->section_headers + unwstart, unwsec = NULL;
7662            i < filedata->file_header.e_shnum; ++i, ++sec)
7663         if (sec->sh_type == SHT_IA_64_UNWIND)
7664           {
7665             unwsec = sec;
7666             break;
7667           }
7668       /* We have already counted the number of SHT_IA64_UNWIND
7669          sections so the loop above should never fail.  */
7670       assert (unwsec != NULL);
7671
7672       unwstart = i + 1;
7673       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7674
7675       if ((unwsec->sh_flags & SHF_GROUP) != 0)
7676         {
7677           /* We need to find which section group it is in.  */
7678           struct group_list * g;
7679
7680           if (section_headers_groups == NULL
7681               || section_headers_groups [i] == NULL)
7682             i = filedata->file_header.e_shnum;
7683           else
7684             {
7685               g = section_headers_groups [i]->root;
7686
7687               for (; g != NULL; g = g->next)
7688                 {
7689                   sec = filedata->section_headers + g->section_index;
7690
7691                   if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7692                     break;
7693                 }
7694
7695               if (g == NULL)
7696                 i = filedata->file_header.e_shnum;
7697             }
7698         }
7699       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7700         {
7701           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
7702           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7703           suffix = SECTION_NAME (unwsec) + len;
7704           for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7705                ++i, ++sec)
7706             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7707                 && streq (SECTION_NAME (sec) + len2, suffix))
7708               break;
7709         }
7710       else
7711         {
7712           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7713              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
7714           len = sizeof (ELF_STRING_ia64_unwind) - 1;
7715           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7716           suffix = "";
7717           if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7718             suffix = SECTION_NAME (unwsec) + len;
7719           for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7720                ++i, ++sec)
7721             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7722                 && streq (SECTION_NAME (sec) + len2, suffix))
7723               break;
7724         }
7725
7726       if (i == filedata->file_header.e_shnum)
7727         {
7728           printf (_("\nCould not find unwind info section for "));
7729
7730           if (filedata->string_table == NULL)
7731             printf ("%d", unwsec->sh_name);
7732           else
7733             printf ("'%s'", printable_section_name (filedata, unwsec));
7734         }
7735       else
7736         {
7737           aux.info_addr = sec->sh_addr;
7738           aux.info = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1,
7739                                                  sec->sh_size,
7740                                                  _("unwind info"));
7741           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7742
7743           printf (_("\nUnwind section "));
7744
7745           if (filedata->string_table == NULL)
7746             printf ("%d", unwsec->sh_name);
7747           else
7748             printf ("'%s'", printable_section_name (filedata, unwsec));
7749
7750           printf (_(" at offset 0x%lx contains %lu entries:\n"),
7751                   (unsigned long) unwsec->sh_offset,
7752                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7753
7754           if (slurp_ia64_unwind_table (filedata, & aux, unwsec)
7755               && aux.table_len > 0)
7756             dump_ia64_unwind (filedata, & aux);
7757
7758           if (aux.table)
7759             free ((char *) aux.table);
7760           if (aux.info)
7761             free ((char *) aux.info);
7762           aux.table = NULL;
7763           aux.info = NULL;
7764         }
7765     }
7766
7767   if (aux.symtab)
7768     free (aux.symtab);
7769   if (aux.strtab)
7770     free ((char *) aux.strtab);
7771
7772   return res;
7773 }
7774
7775 struct hppa_unw_table_entry
7776 {
7777   struct absaddr start;
7778   struct absaddr end;
7779   unsigned int Cannot_unwind:1;                 /* 0 */
7780   unsigned int Millicode:1;                     /* 1 */
7781   unsigned int Millicode_save_sr0:1;            /* 2 */
7782   unsigned int Region_description:2;            /* 3..4 */
7783   unsigned int reserved1:1;                     /* 5 */
7784   unsigned int Entry_SR:1;                      /* 6 */
7785   unsigned int Entry_FR:4;     /* Number saved     7..10 */
7786   unsigned int Entry_GR:5;     /* Number saved     11..15 */
7787   unsigned int Args_stored:1;                   /* 16 */
7788   unsigned int Variable_Frame:1;                /* 17 */
7789   unsigned int Separate_Package_Body:1;         /* 18 */
7790   unsigned int Frame_Extension_Millicode:1;     /* 19 */
7791   unsigned int Stack_Overflow_Check:1;          /* 20 */
7792   unsigned int Two_Instruction_SP_Increment:1;  /* 21 */
7793   unsigned int Ada_Region:1;                    /* 22 */
7794   unsigned int cxx_info:1;                      /* 23 */
7795   unsigned int cxx_try_catch:1;                 /* 24 */
7796   unsigned int sched_entry_seq:1;               /* 25 */
7797   unsigned int reserved2:1;                     /* 26 */
7798   unsigned int Save_SP:1;                       /* 27 */
7799   unsigned int Save_RP:1;                       /* 28 */
7800   unsigned int Save_MRP_in_frame:1;             /* 29 */
7801   unsigned int extn_ptr_defined:1;              /* 30 */
7802   unsigned int Cleanup_defined:1;               /* 31 */
7803
7804   unsigned int MPE_XL_interrupt_marker:1;       /* 0 */
7805   unsigned int HP_UX_interrupt_marker:1;        /* 1 */
7806   unsigned int Large_frame:1;                   /* 2 */
7807   unsigned int Pseudo_SP_Set:1;                 /* 3 */
7808   unsigned int reserved4:1;                     /* 4 */
7809   unsigned int Total_frame_size:27;             /* 5..31 */
7810 };
7811
7812 struct hppa_unw_aux_info
7813 {
7814   struct hppa_unw_table_entry *  table;         /* Unwind table.  */
7815   unsigned long                  table_len;     /* Length of unwind table.  */
7816   bfd_vma                        seg_base;      /* Starting address of segment.  */
7817   Elf_Internal_Sym *             symtab;        /* The symbol table.  */
7818   unsigned long                  nsyms;         /* Number of symbols.  */
7819   Elf_Internal_Sym *             funtab;        /* Sorted table of STT_FUNC symbols.  */
7820   unsigned long                  nfuns;         /* Number of entries in funtab.  */
7821   char *                         strtab;        /* The string table.  */
7822   unsigned long                  strtab_size;   /* Size of string table.  */
7823 };
7824
7825 static bfd_boolean
7826 dump_hppa_unwind (Filedata * filedata, struct hppa_unw_aux_info * aux)
7827 {
7828   struct hppa_unw_table_entry * tp;
7829   unsigned long j, nfuns;
7830   bfd_boolean res = TRUE;
7831
7832   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7833   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7834     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7835       aux->funtab[nfuns++] = aux->symtab[j];
7836   aux->nfuns = nfuns;
7837   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7838
7839   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7840     {
7841       bfd_vma offset;
7842       const char * procname;
7843
7844       find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7845                                aux->strtab_size, tp->start, &procname,
7846                                &offset);
7847
7848       fputs ("\n<", stdout);
7849
7850       if (procname)
7851         {
7852           fputs (procname, stdout);
7853
7854           if (offset)
7855             printf ("+%lx", (unsigned long) offset);
7856         }
7857
7858       fputs (">: [", stdout);
7859       print_vma (tp->start.offset, PREFIX_HEX);
7860       fputc ('-', stdout);
7861       print_vma (tp->end.offset, PREFIX_HEX);
7862       printf ("]\n\t");
7863
7864 #define PF(_m) if (tp->_m) printf (#_m " ");
7865 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7866       PF(Cannot_unwind);
7867       PF(Millicode);
7868       PF(Millicode_save_sr0);
7869       /* PV(Region_description);  */
7870       PF(Entry_SR);
7871       PV(Entry_FR);
7872       PV(Entry_GR);
7873       PF(Args_stored);
7874       PF(Variable_Frame);
7875       PF(Separate_Package_Body);
7876       PF(Frame_Extension_Millicode);
7877       PF(Stack_Overflow_Check);
7878       PF(Two_Instruction_SP_Increment);
7879       PF(Ada_Region);
7880       PF(cxx_info);
7881       PF(cxx_try_catch);
7882       PF(sched_entry_seq);
7883       PF(Save_SP);
7884       PF(Save_RP);
7885       PF(Save_MRP_in_frame);
7886       PF(extn_ptr_defined);
7887       PF(Cleanup_defined);
7888       PF(MPE_XL_interrupt_marker);
7889       PF(HP_UX_interrupt_marker);
7890       PF(Large_frame);
7891       PF(Pseudo_SP_Set);
7892       PV(Total_frame_size);
7893 #undef PF
7894 #undef PV
7895     }
7896
7897   printf ("\n");
7898
7899   free (aux->funtab);
7900
7901   return res;
7902 }
7903
7904 static bfd_boolean
7905 slurp_hppa_unwind_table (Filedata *                  filedata,
7906                          struct hppa_unw_aux_info *  aux,
7907                          Elf_Internal_Shdr *         sec)
7908 {
7909   unsigned long size, unw_ent_size, nentries, nrelas, i;
7910   Elf_Internal_Phdr * seg;
7911   struct hppa_unw_table_entry * tep;
7912   Elf_Internal_Shdr * relsec;
7913   Elf_Internal_Rela * rela;
7914   Elf_Internal_Rela * rp;
7915   unsigned char * table;
7916   unsigned char * tp;
7917   Elf_Internal_Sym * sym;
7918   const char * relname;
7919
7920   /* First, find the starting address of the segment that includes
7921      this section.  */
7922   if (filedata->file_header.e_phnum)
7923     {
7924       if (! get_program_headers (filedata))
7925         return FALSE;
7926
7927       for (seg = filedata->program_headers;
7928            seg < filedata->program_headers + filedata->file_header.e_phnum;
7929            ++seg)
7930         {
7931           if (seg->p_type != PT_LOAD)
7932             continue;
7933
7934           if (sec->sh_addr >= seg->p_vaddr
7935               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7936             {
7937               aux->seg_base = seg->p_vaddr;
7938               break;
7939             }
7940         }
7941     }
7942
7943   /* Second, build the unwind table from the contents of the unwind
7944      section.  */
7945   size = sec->sh_size;
7946   table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7947                                       _("unwind table"));
7948   if (!table)
7949     return FALSE;
7950
7951   unw_ent_size = 16;
7952   nentries = size / unw_ent_size;
7953   size = unw_ent_size * nentries;
7954
7955   tep = aux->table = (struct hppa_unw_table_entry *)
7956       xcmalloc (nentries, sizeof (aux->table[0]));
7957
7958   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7959     {
7960       unsigned int tmp1, tmp2;
7961
7962       tep->start.section = SHN_UNDEF;
7963       tep->end.section   = SHN_UNDEF;
7964
7965       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7966       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7967       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7968       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7969
7970       tep->start.offset += aux->seg_base;
7971       tep->end.offset   += aux->seg_base;
7972
7973       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7974       tep->Millicode = (tmp1 >> 30) & 0x1;
7975       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7976       tep->Region_description = (tmp1 >> 27) & 0x3;
7977       tep->reserved1 = (tmp1 >> 26) & 0x1;
7978       tep->Entry_SR = (tmp1 >> 25) & 0x1;
7979       tep->Entry_FR = (tmp1 >> 21) & 0xf;
7980       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7981       tep->Args_stored = (tmp1 >> 15) & 0x1;
7982       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7983       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7984       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7985       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7986       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7987       tep->Ada_Region = (tmp1 >> 9) & 0x1;
7988       tep->cxx_info = (tmp1 >> 8) & 0x1;
7989       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7990       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7991       tep->reserved2 = (tmp1 >> 5) & 0x1;
7992       tep->Save_SP = (tmp1 >> 4) & 0x1;
7993       tep->Save_RP = (tmp1 >> 3) & 0x1;
7994       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7995       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7996       tep->Cleanup_defined = tmp1 & 0x1;
7997
7998       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7999       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
8000       tep->Large_frame = (tmp2 >> 29) & 0x1;
8001       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
8002       tep->reserved4 = (tmp2 >> 27) & 0x1;
8003       tep->Total_frame_size = tmp2 & 0x7ffffff;
8004     }
8005   free (table);
8006
8007   /* Third, apply any relocations to the unwind table.  */
8008   for (relsec = filedata->section_headers;
8009        relsec < filedata->section_headers + filedata->file_header.e_shnum;
8010        ++relsec)
8011     {
8012       if (relsec->sh_type != SHT_RELA
8013           || relsec->sh_info >= filedata->file_header.e_shnum
8014           || filedata->section_headers + relsec->sh_info != sec)
8015         continue;
8016
8017       if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
8018                               & rela, & nrelas))
8019         return FALSE;
8020
8021       for (rp = rela; rp < rela + nrelas; ++rp)
8022         {
8023           relname = elf_hppa_reloc_type (get_reloc_type (filedata, rp->r_info));
8024           sym = aux->symtab + get_reloc_symindex (rp->r_info);
8025
8026           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
8027           if (! const_strneq (relname, "R_PARISC_SEGREL"))
8028             {
8029               warn (_("Skipping unexpected relocation type %s\n"), relname);
8030               continue;
8031             }
8032
8033           i = rp->r_offset / unw_ent_size;
8034
8035           switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
8036             {
8037             case 0:
8038               aux->table[i].start.section = sym->st_shndx;
8039               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
8040               break;
8041             case 1:
8042               aux->table[i].end.section   = sym->st_shndx;
8043               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
8044               break;
8045             default:
8046               break;
8047             }
8048         }
8049
8050       free (rela);
8051     }
8052
8053   aux->table_len = nentries;
8054
8055   return TRUE;
8056 }
8057
8058 static bfd_boolean
8059 hppa_process_unwind (Filedata * filedata)
8060 {
8061   struct hppa_unw_aux_info aux;
8062   Elf_Internal_Shdr * unwsec = NULL;
8063   Elf_Internal_Shdr * strsec;
8064   Elf_Internal_Shdr * sec;
8065   unsigned long i;
8066   bfd_boolean res = TRUE;
8067
8068   if (filedata->string_table == NULL)
8069     return FALSE;
8070
8071   memset (& aux, 0, sizeof (aux));
8072
8073   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8074     {
8075       if (sec->sh_type == SHT_SYMTAB
8076           && sec->sh_link < filedata->file_header.e_shnum)
8077         {
8078           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
8079
8080           strsec = filedata->section_headers + sec->sh_link;
8081           if (aux.strtab != NULL)
8082             {
8083               error (_("Multiple auxillary string tables encountered\n"));
8084               free (aux.strtab);
8085               res = FALSE;
8086             }
8087           aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
8088                                           1, strsec->sh_size,
8089                                           _("string table"));
8090           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8091         }
8092       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8093         unwsec = sec;
8094     }
8095
8096   if (!unwsec)
8097     printf (_("\nThere are no unwind sections in this file.\n"));
8098
8099   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8100     {
8101       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8102         {
8103           unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size + 8);
8104
8105           printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
8106                             "contains %lu entry:\n",
8107                             "\nUnwind section '%s' at offset 0x%lx "
8108                             "contains %lu entries:\n",
8109                             num_unwind),
8110                   printable_section_name (filedata, sec),
8111                   (unsigned long) sec->sh_offset,
8112                   num_unwind);
8113
8114           if (! slurp_hppa_unwind_table (filedata, &aux, sec))
8115             res = FALSE;
8116         
8117           if (aux.table_len > 0)
8118             {
8119               if (! dump_hppa_unwind (filedata, &aux))
8120                 res = FALSE;
8121             }
8122
8123           if (aux.table)
8124             free ((char *) aux.table);
8125           aux.table = NULL;
8126         }
8127     }
8128
8129   if (aux.symtab)
8130     free (aux.symtab);
8131   if (aux.strtab)
8132     free ((char *) aux.strtab);
8133
8134   return res;
8135 }
8136
8137 struct arm_section
8138 {
8139   unsigned char *      data;            /* The unwind data.  */
8140   Elf_Internal_Shdr *  sec;             /* The cached unwind section header.  */
8141   Elf_Internal_Rela *  rela;            /* The cached relocations for this section.  */
8142   unsigned long        nrelas;          /* The number of relocations.  */
8143   unsigned int         rel_type;        /* REL or RELA ?  */
8144   Elf_Internal_Rela *  next_rela;       /* Cyclic pointer to the next reloc to process.  */
8145 };
8146
8147 struct arm_unw_aux_info
8148 {
8149   Filedata *          filedata;         /* The file containing the unwind sections.  */
8150   Elf_Internal_Sym *  symtab;           /* The file's symbol table.  */
8151   unsigned long       nsyms;            /* Number of symbols.  */
8152   Elf_Internal_Sym *  funtab;           /* Sorted table of STT_FUNC symbols.  */
8153   unsigned long       nfuns;            /* Number of these symbols.  */
8154   char *              strtab;           /* The file's string table.  */
8155   unsigned long       strtab_size;      /* Size of string table.  */
8156 };
8157
8158 static const char *
8159 arm_print_vma_and_name (Filedata *                 filedata,
8160                         struct arm_unw_aux_info *  aux,
8161                         bfd_vma                    fn,
8162                         struct absaddr             addr)
8163 {
8164   const char *procname;
8165   bfd_vma sym_offset;
8166
8167   if (addr.section == SHN_UNDEF)
8168     addr.offset = fn;
8169
8170   find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
8171                            aux->strtab_size, addr, &procname,
8172                            &sym_offset);
8173
8174   print_vma (fn, PREFIX_HEX);
8175
8176   if (procname)
8177     {
8178       fputs (" <", stdout);
8179       fputs (procname, stdout);
8180
8181       if (sym_offset)
8182         printf ("+0x%lx", (unsigned long) sym_offset);
8183       fputc ('>', stdout);
8184     }
8185
8186   return procname;
8187 }
8188
8189 static void
8190 arm_free_section (struct arm_section *arm_sec)
8191 {
8192   if (arm_sec->data != NULL)
8193     free (arm_sec->data);
8194
8195   if (arm_sec->rela != NULL)
8196     free (arm_sec->rela);
8197 }
8198
8199 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
8200       cached section and install SEC instead.
8201    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
8202       and return its valued in * WORDP, relocating if necessary.
8203    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
8204       relocation's offset in ADDR.
8205    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
8206       into the string table of the symbol associated with the reloc.  If no
8207       reloc was applied store -1 there.
8208    5) Return TRUE upon success, FALSE otherwise.  */
8209
8210 static bfd_boolean
8211 get_unwind_section_word (Filedata *                 filedata,
8212                          struct arm_unw_aux_info *  aux,
8213                          struct arm_section *       arm_sec,
8214                          Elf_Internal_Shdr *        sec,
8215                          bfd_vma                    word_offset,
8216                          unsigned int *             wordp,
8217                          struct absaddr *           addr,
8218                          bfd_vma *                  sym_name)
8219 {
8220   Elf_Internal_Rela *rp;
8221   Elf_Internal_Sym *sym;
8222   const char * relname;
8223   unsigned int word;
8224   bfd_boolean wrapped;
8225
8226   if (sec == NULL || arm_sec == NULL)
8227     return FALSE;
8228
8229   addr->section = SHN_UNDEF;
8230   addr->offset = 0;
8231
8232   if (sym_name != NULL)
8233     *sym_name = (bfd_vma) -1;
8234
8235   /* If necessary, update the section cache.  */
8236   if (sec != arm_sec->sec)
8237     {
8238       Elf_Internal_Shdr *relsec;
8239
8240       arm_free_section (arm_sec);
8241
8242       arm_sec->sec = sec;
8243       arm_sec->data = get_data (NULL, aux->filedata, sec->sh_offset, 1,
8244                                 sec->sh_size, _("unwind data"));
8245       arm_sec->rela = NULL;
8246       arm_sec->nrelas = 0;
8247
8248       for (relsec = filedata->section_headers;
8249            relsec < filedata->section_headers + filedata->file_header.e_shnum;
8250            ++relsec)
8251         {
8252           if (relsec->sh_info >= filedata->file_header.e_shnum
8253               || filedata->section_headers + relsec->sh_info != sec
8254               /* PR 15745: Check the section type as well.  */
8255               || (relsec->sh_type != SHT_REL
8256                   && relsec->sh_type != SHT_RELA))
8257             continue;
8258
8259           arm_sec->rel_type = relsec->sh_type;
8260           if (relsec->sh_type == SHT_REL)
8261             {
8262               if (!slurp_rel_relocs (aux->filedata, relsec->sh_offset,
8263                                      relsec->sh_size,
8264                                      & arm_sec->rela, & arm_sec->nrelas))
8265                 return FALSE;
8266             }
8267           else /* relsec->sh_type == SHT_RELA */
8268             {
8269               if (!slurp_rela_relocs (aux->filedata, relsec->sh_offset,
8270                                       relsec->sh_size,
8271                                       & arm_sec->rela, & arm_sec->nrelas))
8272                 return FALSE;
8273             }
8274           break;
8275         }
8276
8277       arm_sec->next_rela = arm_sec->rela;
8278     }
8279
8280   /* If there is no unwind data we can do nothing.  */
8281   if (arm_sec->data == NULL)
8282     return FALSE;
8283
8284   /* If the offset is invalid then fail.  */
8285   if (/* PR 21343 *//* PR 18879 */
8286       sec->sh_size < 4
8287       || word_offset > (sec->sh_size - 4)
8288       || ((bfd_signed_vma) word_offset) < 0)
8289     return FALSE;
8290
8291   /* Get the word at the required offset.  */
8292   word = byte_get (arm_sec->data + word_offset, 4);
8293
8294   /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128.  */
8295   if (arm_sec->rela == NULL)
8296     {
8297       * wordp = word;
8298       return TRUE;
8299     }
8300
8301   /* Look through the relocs to find the one that applies to the provided offset.  */
8302   wrapped = FALSE;
8303   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
8304     {
8305       bfd_vma prelval, offset;
8306
8307       if (rp->r_offset > word_offset && !wrapped)
8308         {
8309           rp = arm_sec->rela;
8310           wrapped = TRUE;
8311         }
8312       if (rp->r_offset > word_offset)
8313         break;
8314
8315       if (rp->r_offset & 3)
8316         {
8317           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8318                 (unsigned long) rp->r_offset);
8319           continue;
8320         }
8321
8322       if (rp->r_offset < word_offset)
8323         continue;
8324
8325       /* PR 17531: file: 027-161405-0.004  */
8326       if (aux->symtab == NULL)
8327         continue;
8328
8329       if (arm_sec->rel_type == SHT_REL)
8330         {
8331           offset = word & 0x7fffffff;
8332           if (offset & 0x40000000)
8333             offset |= ~ (bfd_vma) 0x7fffffff;
8334         }
8335       else if (arm_sec->rel_type == SHT_RELA)
8336         offset = rp->r_addend;
8337       else
8338         {
8339           error (_("Unknown section relocation type %d encountered\n"),
8340                  arm_sec->rel_type);
8341           break;
8342         }
8343
8344       /* PR 17531 file: 027-1241568-0.004.  */
8345       if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8346         {
8347           error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8348                  (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8349           break;
8350         }
8351
8352       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
8353       offset += sym->st_value;
8354       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8355
8356       /* Check that we are processing the expected reloc type.  */
8357       if (filedata->file_header.e_machine == EM_ARM)
8358         {
8359           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
8360           if (relname == NULL)
8361             {
8362               warn (_("Skipping unknown ARM relocation type: %d\n"),
8363                     (int) ELF32_R_TYPE (rp->r_info));
8364               continue;
8365             }
8366
8367           if (streq (relname, "R_ARM_NONE"))
8368               continue;
8369
8370           if (! streq (relname, "R_ARM_PREL31"))
8371             {
8372               warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
8373               continue;
8374             }
8375         }
8376       else if (filedata->file_header.e_machine == EM_TI_C6000)
8377         {
8378           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
8379           if (relname == NULL)
8380             {
8381               warn (_("Skipping unknown C6000 relocation type: %d\n"),
8382                     (int) ELF32_R_TYPE (rp->r_info));
8383               continue;
8384             }
8385
8386           if (streq (relname, "R_C6000_NONE"))
8387             continue;
8388
8389           if (! streq (relname, "R_C6000_PREL31"))
8390             {
8391               warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
8392               continue;
8393             }
8394
8395           prelval >>= 1;
8396         }
8397       else
8398         {
8399           /* This function currently only supports ARM and TI unwinders.  */
8400           warn (_("Only TI and ARM unwinders are currently supported\n"));
8401           break;
8402         }
8403
8404       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8405       addr->section = sym->st_shndx;
8406       addr->offset = offset;
8407
8408       if (sym_name)
8409         * sym_name = sym->st_name;
8410       break;
8411     }
8412
8413   *wordp = word;
8414   arm_sec->next_rela = rp;
8415
8416   return TRUE;
8417 }
8418
8419 static const char *tic6x_unwind_regnames[16] =
8420 {
8421   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8422   "A14", "A13", "A12", "A11", "A10",
8423   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8424 };
8425
8426 static void
8427 decode_tic6x_unwind_regmask (unsigned int mask)
8428 {
8429   int i;
8430
8431   for (i = 12; mask; mask >>= 1, i--)
8432     {
8433       if (mask & 1)
8434         {
8435           fputs (tic6x_unwind_regnames[i], stdout);
8436           if (mask > 1)
8437             fputs (", ", stdout);
8438         }
8439     }
8440 }
8441
8442 #define ADVANCE                                                 \
8443   if (remaining == 0 && more_words)                             \
8444     {                                                           \
8445       data_offset += 4;                                         \
8446       if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec,     \
8447                                      data_offset, & word, & addr, NULL))        \
8448         return FALSE;                                           \
8449       remaining = 4;                                            \
8450       more_words--;                                             \
8451     }                                                           \
8452
8453 #define GET_OP(OP)                      \
8454   ADVANCE;                              \
8455   if (remaining)                        \
8456     {                                   \
8457       remaining--;                      \
8458       (OP) = word >> 24;                \
8459       word <<= 8;                       \
8460     }                                   \
8461   else                                  \
8462     {                                   \
8463       printf (_("[Truncated opcode]\n"));       \
8464       return FALSE;                     \
8465     }                                   \
8466   printf ("0x%02x ", OP)
8467
8468 static bfd_boolean
8469 decode_arm_unwind_bytecode (Filedata *                 filedata,
8470                             struct arm_unw_aux_info *  aux,
8471                             unsigned int               word,
8472                             unsigned int               remaining,
8473                             unsigned int               more_words,
8474                             bfd_vma                    data_offset,
8475                             Elf_Internal_Shdr *        data_sec,
8476                             struct arm_section *       data_arm_sec)
8477 {
8478   struct absaddr addr;
8479   bfd_boolean res = TRUE;
8480
8481   /* Decode the unwinding instructions.  */
8482   while (1)
8483     {
8484       unsigned int op, op2;
8485
8486       ADVANCE;
8487       if (remaining == 0)
8488         break;
8489       remaining--;
8490       op = word >> 24;
8491       word <<= 8;
8492
8493       printf ("  0x%02x ", op);
8494
8495       if ((op & 0xc0) == 0x00)
8496         {
8497           int offset = ((op & 0x3f) << 2) + 4;
8498
8499           printf ("     vsp = vsp + %d", offset);
8500         }
8501       else if ((op & 0xc0) == 0x40)
8502         {
8503           int offset = ((op & 0x3f) << 2) + 4;
8504
8505           printf ("     vsp = vsp - %d", offset);
8506         }
8507       else if ((op & 0xf0) == 0x80)
8508         {
8509           GET_OP (op2);
8510           if (op == 0x80 && op2 == 0)
8511             printf (_("Refuse to unwind"));
8512           else
8513             {
8514               unsigned int mask = ((op & 0x0f) << 8) | op2;
8515               bfd_boolean first = TRUE;
8516               int i;
8517
8518               printf ("pop {");
8519               for (i = 0; i < 12; i++)
8520                 if (mask & (1 << i))
8521                   {
8522                     if (first)
8523                       first = FALSE;
8524                     else
8525                       printf (", ");
8526                     printf ("r%d", 4 + i);
8527                   }
8528               printf ("}");
8529             }
8530         }
8531       else if ((op & 0xf0) == 0x90)
8532         {
8533           if (op == 0x9d || op == 0x9f)
8534             printf (_("     [Reserved]"));
8535           else
8536             printf ("     vsp = r%d", op & 0x0f);
8537         }
8538       else if ((op & 0xf0) == 0xa0)
8539         {
8540           int end = 4 + (op & 0x07);
8541           bfd_boolean first = TRUE;
8542           int i;
8543
8544           printf ("     pop {");
8545           for (i = 4; i <= end; i++)
8546             {
8547               if (first)
8548                 first = FALSE;
8549               else
8550                 printf (", ");
8551               printf ("r%d", i);
8552             }
8553           if (op & 0x08)
8554             {
8555               if (!first)
8556                 printf (", ");
8557               printf ("r14");
8558             }
8559           printf ("}");
8560         }
8561       else if (op == 0xb0)
8562         printf (_("     finish"));
8563       else if (op == 0xb1)
8564         {
8565           GET_OP (op2);
8566           if (op2 == 0 || (op2 & 0xf0) != 0)
8567             printf (_("[Spare]"));
8568           else
8569             {
8570               unsigned int mask = op2 & 0x0f;
8571               bfd_boolean first = TRUE;
8572               int i;
8573
8574               printf ("pop {");
8575               for (i = 0; i < 12; i++)
8576                 if (mask & (1 << i))
8577                   {
8578                     if (first)
8579                       first = FALSE;
8580                     else
8581                       printf (", ");
8582                     printf ("r%d", i);
8583                   }
8584               printf ("}");
8585             }
8586         }
8587       else if (op == 0xb2)
8588         {
8589           unsigned char buf[9];
8590           unsigned int i, len;
8591           unsigned long offset;
8592
8593           for (i = 0; i < sizeof (buf); i++)
8594             {
8595               GET_OP (buf[i]);
8596               if ((buf[i] & 0x80) == 0)
8597                 break;
8598             }
8599           if (i == sizeof (buf))
8600             {
8601               error (_("corrupt change to vsp"));
8602               res = FALSE;
8603             }
8604           else
8605             {
8606               offset = read_uleb128 (buf, &len, buf + i + 1);
8607               assert (len == i + 1);
8608               offset = offset * 4 + 0x204;
8609               printf ("vsp = vsp + %ld", offset);
8610             }
8611         }
8612       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8613         {
8614           unsigned int first, last;
8615
8616           GET_OP (op2);
8617           first = op2 >> 4;
8618           last = op2 & 0x0f;
8619           if (op == 0xc8)
8620             first = first + 16;
8621           printf ("pop {D%d", first);
8622           if (last)
8623             printf ("-D%d", first + last);
8624           printf ("}");
8625         }
8626       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8627         {
8628           unsigned int count = op & 0x07;
8629
8630           printf ("pop {D8");
8631           if (count)
8632             printf ("-D%d", 8 + count);
8633           printf ("}");
8634         }
8635       else if (op >= 0xc0 && op <= 0xc5)
8636         {
8637           unsigned int count = op & 0x07;
8638
8639           printf ("     pop {wR10");
8640           if (count)
8641             printf ("-wR%d", 10 + count);
8642           printf ("}");
8643         }
8644       else if (op == 0xc6)
8645         {
8646           unsigned int first, last;
8647
8648           GET_OP (op2);
8649           first = op2 >> 4;
8650           last = op2 & 0x0f;
8651           printf ("pop {wR%d", first);
8652           if (last)
8653             printf ("-wR%d", first + last);
8654           printf ("}");
8655         }
8656       else if (op == 0xc7)
8657         {
8658           GET_OP (op2);
8659           if (op2 == 0 || (op2 & 0xf0) != 0)
8660             printf (_("[Spare]"));
8661           else
8662             {
8663               unsigned int mask = op2 & 0x0f;
8664               bfd_boolean first = TRUE;
8665               int i;
8666
8667               printf ("pop {");
8668               for (i = 0; i < 4; i++)
8669                 if (mask & (1 << i))
8670                   {
8671                     if (first)
8672                       first = FALSE;
8673                     else
8674                       printf (", ");
8675                     printf ("wCGR%d", i);
8676                   }
8677               printf ("}");
8678             }
8679         }
8680       else
8681         {
8682           printf (_("     [unsupported opcode]"));
8683           res = FALSE;
8684         }
8685
8686       printf ("\n");
8687     }
8688
8689   return res;
8690 }
8691
8692 static bfd_boolean
8693 decode_tic6x_unwind_bytecode (Filedata *                 filedata,
8694                               struct arm_unw_aux_info *  aux,
8695                               unsigned int               word,
8696                               unsigned int               remaining,
8697                               unsigned int               more_words,
8698                               bfd_vma                    data_offset,
8699                               Elf_Internal_Shdr *        data_sec,
8700                               struct arm_section *       data_arm_sec)
8701 {
8702   struct absaddr addr;
8703
8704   /* Decode the unwinding instructions.  */
8705   while (1)
8706     {
8707       unsigned int op, op2;
8708
8709       ADVANCE;
8710       if (remaining == 0)
8711         break;
8712       remaining--;
8713       op = word >> 24;
8714       word <<= 8;
8715
8716       printf ("  0x%02x ", op);
8717
8718       if ((op & 0xc0) == 0x00)
8719         {
8720           int offset = ((op & 0x3f) << 3) + 8;
8721           printf ("     sp = sp + %d", offset);
8722         }
8723       else if ((op & 0xc0) == 0x80)
8724         {
8725           GET_OP (op2);
8726           if (op == 0x80 && op2 == 0)
8727             printf (_("Refuse to unwind"));
8728           else
8729             {
8730               unsigned int mask = ((op & 0x1f) << 8) | op2;
8731               if (op & 0x20)
8732                 printf ("pop compact {");
8733               else
8734                 printf ("pop {");
8735
8736               decode_tic6x_unwind_regmask (mask);
8737               printf("}");
8738             }
8739         }
8740       else if ((op & 0xf0) == 0xc0)
8741         {
8742           unsigned int reg;
8743           unsigned int nregs;
8744           unsigned int i;
8745           const char *name;
8746           struct
8747           {
8748             unsigned int offset;
8749             unsigned int reg;
8750           } regpos[16];
8751
8752           /* Scan entire instruction first so that GET_OP output is not
8753              interleaved with disassembly.  */
8754           nregs = 0;
8755           for (i = 0; nregs < (op & 0xf); i++)
8756             {
8757               GET_OP (op2);
8758               reg = op2 >> 4;
8759               if (reg != 0xf)
8760                 {
8761                   regpos[nregs].offset = i * 2;
8762                   regpos[nregs].reg = reg;
8763                   nregs++;
8764                 }
8765
8766               reg = op2 & 0xf;
8767               if (reg != 0xf)
8768                 {
8769                   regpos[nregs].offset = i * 2 + 1;
8770                   regpos[nregs].reg = reg;
8771                   nregs++;
8772                 }
8773             }
8774
8775           printf (_("pop frame {"));
8776           reg = nregs - 1;
8777           for (i = i * 2; i > 0; i--)
8778             {
8779               if (regpos[reg].offset == i - 1)
8780                 {
8781                   name = tic6x_unwind_regnames[regpos[reg].reg];
8782                   if (reg > 0)
8783                     reg--;
8784                 }
8785               else
8786                 name = _("[pad]");
8787
8788               fputs (name, stdout);
8789               if (i > 1)
8790                 printf (", ");
8791             }
8792
8793           printf ("}");
8794         }
8795       else if (op == 0xd0)
8796         printf ("     MOV FP, SP");
8797       else if (op == 0xd1)
8798         printf ("     __c6xabi_pop_rts");
8799       else if (op == 0xd2)
8800         {
8801           unsigned char buf[9];
8802           unsigned int i, len;
8803           unsigned long offset;
8804
8805           for (i = 0; i < sizeof (buf); i++)
8806             {
8807               GET_OP (buf[i]);
8808               if ((buf[i] & 0x80) == 0)
8809                 break;
8810             }
8811           /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2.  */
8812           if (i == sizeof (buf))
8813             {
8814               warn (_("Corrupt stack pointer adjustment detected\n"));
8815               return FALSE;
8816             }
8817
8818           offset = read_uleb128 (buf, &len, buf + i + 1);
8819           assert (len == i + 1);
8820           offset = offset * 8 + 0x408;
8821           printf (_("sp = sp + %ld"), offset);
8822         }
8823       else if ((op & 0xf0) == 0xe0)
8824         {
8825           if ((op & 0x0f) == 7)
8826             printf ("     RETURN");
8827           else
8828             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8829         }
8830       else
8831         {
8832           printf (_("     [unsupported opcode]"));
8833         }
8834       putchar ('\n');
8835     }
8836
8837   return TRUE;
8838 }
8839
8840 static bfd_vma
8841 arm_expand_prel31 (Filedata * filedata, bfd_vma word, bfd_vma where)
8842 {
8843   bfd_vma offset;
8844
8845   offset = word & 0x7fffffff;
8846   if (offset & 0x40000000)
8847     offset |= ~ (bfd_vma) 0x7fffffff;
8848
8849   if (filedata->file_header.e_machine == EM_TI_C6000)
8850     offset <<= 1;
8851
8852   return offset + where;
8853 }
8854
8855 static bfd_boolean
8856 decode_arm_unwind (Filedata *                 filedata,
8857                    struct arm_unw_aux_info *  aux,
8858                    unsigned int               word,
8859                    unsigned int               remaining,
8860                    bfd_vma                    data_offset,
8861                    Elf_Internal_Shdr *        data_sec,
8862                    struct arm_section *       data_arm_sec)
8863 {
8864   int per_index;
8865   unsigned int more_words = 0;
8866   struct absaddr addr;
8867   bfd_vma sym_name = (bfd_vma) -1;
8868   bfd_boolean res = TRUE;
8869
8870   if (remaining == 0)
8871     {
8872       /* Fetch the first word.
8873          Note - when decoding an object file the address extracted
8874          here will always be 0.  So we also pass in the sym_name
8875          parameter so that we can find the symbol associated with
8876          the personality routine.  */
8877       if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, data_offset,
8878                                      & word, & addr, & sym_name))
8879         return FALSE;
8880
8881       remaining = 4;
8882     }
8883
8884   if ((word & 0x80000000) == 0)
8885     {
8886       /* Expand prel31 for personality routine.  */
8887       bfd_vma fn;
8888       const char *procname;
8889
8890       fn = arm_expand_prel31 (filedata, word, data_sec->sh_addr + data_offset);
8891       printf (_("  Personality routine: "));
8892       if (fn == 0
8893           && addr.section == SHN_UNDEF && addr.offset == 0
8894           && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8895         {
8896           procname = aux->strtab + sym_name;
8897           print_vma (fn, PREFIX_HEX);
8898           if (procname)
8899             {
8900               fputs (" <", stdout);
8901               fputs (procname, stdout);
8902               fputc ('>', stdout);
8903             }
8904         }
8905       else
8906         procname = arm_print_vma_and_name (filedata, aux, fn, addr);
8907       fputc ('\n', stdout);
8908
8909       /* The GCC personality routines use the standard compact
8910          encoding, starting with one byte giving the number of
8911          words.  */
8912       if (procname != NULL
8913           && (const_strneq (procname, "__gcc_personality_v0")
8914               || const_strneq (procname, "__gxx_personality_v0")
8915               || const_strneq (procname, "__gcj_personality_v0")
8916               || const_strneq (procname, "__gnu_objc_personality_v0")))
8917         {
8918           remaining = 0;
8919           more_words = 1;
8920           ADVANCE;
8921           if (!remaining)
8922             {
8923               printf (_("  [Truncated data]\n"));
8924               return FALSE;
8925             }
8926           more_words = word >> 24;
8927           word <<= 8;
8928           remaining--;
8929           per_index = -1;
8930         }
8931       else
8932         return TRUE;
8933     }
8934   else
8935     {
8936       /* ARM EHABI Section 6.3:
8937
8938          An exception-handling table entry for the compact model looks like:
8939
8940            31 30-28 27-24 23-0
8941            -- ----- ----- ----
8942             1   0   index Data for personalityRoutine[index]    */
8943
8944       if (filedata->file_header.e_machine == EM_ARM
8945           && (word & 0x70000000))
8946         {
8947           warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8948           res = FALSE;
8949         }
8950
8951       per_index = (word >> 24) & 0x7f;
8952       printf (_("  Compact model index: %d\n"), per_index);
8953       if (per_index == 0)
8954         {
8955           more_words = 0;
8956           word <<= 8;
8957           remaining--;
8958         }
8959       else if (per_index < 3)
8960         {
8961           more_words = (word >> 16) & 0xff;
8962           word <<= 16;
8963           remaining -= 2;
8964         }
8965     }
8966
8967   switch (filedata->file_header.e_machine)
8968     {
8969     case EM_ARM:
8970       if (per_index < 3)
8971         {
8972           if (! decode_arm_unwind_bytecode (filedata, aux, word, remaining, more_words,
8973                                             data_offset, data_sec, data_arm_sec))
8974             res = FALSE;
8975         }
8976       else
8977         {
8978           warn (_("Unknown ARM compact model index encountered\n"));
8979           printf (_("  [reserved]\n"));
8980           res = FALSE;
8981         }
8982       break;
8983
8984     case EM_TI_C6000:
8985       if (per_index < 3)
8986         {
8987           if (! decode_tic6x_unwind_bytecode (filedata, aux, word, remaining, more_words,
8988                                               data_offset, data_sec, data_arm_sec))
8989             res = FALSE;
8990         }
8991       else if (per_index < 5)
8992         {
8993           if (((word >> 17) & 0x7f) == 0x7f)
8994             printf (_("  Restore stack from frame pointer\n"));
8995           else
8996             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
8997           printf (_("  Registers restored: "));
8998           if (per_index == 4)
8999             printf (" (compact) ");
9000           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
9001           putchar ('\n');
9002           printf (_("  Return register: %s\n"),
9003                   tic6x_unwind_regnames[word & 0xf]);
9004         }
9005       else
9006         printf (_("  [reserved (%d)]\n"), per_index);
9007       break;
9008
9009     default:
9010       error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
9011              filedata->file_header.e_machine);
9012       res = FALSE;
9013     }
9014
9015   /* Decode the descriptors.  Not implemented.  */
9016
9017   return res;
9018 }
9019
9020 static bfd_boolean
9021 dump_arm_unwind (Filedata *                 filedata,
9022                  struct arm_unw_aux_info *  aux,
9023                  Elf_Internal_Shdr *        exidx_sec)
9024 {
9025   struct arm_section exidx_arm_sec, extab_arm_sec;
9026   unsigned int i, exidx_len;
9027   unsigned long j, nfuns;
9028   bfd_boolean res = TRUE;
9029
9030   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
9031   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
9032   exidx_len = exidx_sec->sh_size / 8;
9033
9034   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
9035   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
9036     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
9037       aux->funtab[nfuns++] = aux->symtab[j];
9038   aux->nfuns = nfuns;
9039   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
9040
9041   for (i = 0; i < exidx_len; i++)
9042     {
9043       unsigned int exidx_fn, exidx_entry;
9044       struct absaddr fn_addr, entry_addr;
9045       bfd_vma fn;
9046
9047       fputc ('\n', stdout);
9048
9049       if (! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9050                                      8 * i, & exidx_fn, & fn_addr, NULL)
9051           || ! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9052                                         8 * i + 4, & exidx_entry, & entry_addr, NULL))
9053         {
9054           free (aux->funtab);
9055           arm_free_section (& exidx_arm_sec);
9056           arm_free_section (& extab_arm_sec);
9057           return FALSE;
9058         }
9059
9060       /* ARM EHABI, Section 5:
9061          An index table entry consists of 2 words.
9062          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
9063       if (exidx_fn & 0x80000000)
9064         {
9065           warn (_("corrupt index table entry: %x\n"), exidx_fn);
9066           res = FALSE;
9067         }
9068
9069       fn = arm_expand_prel31 (filedata, exidx_fn, exidx_sec->sh_addr + 8 * i);
9070
9071       arm_print_vma_and_name (filedata, aux, fn, fn_addr);
9072       fputs (": ", stdout);
9073
9074       if (exidx_entry == 1)
9075         {
9076           print_vma (exidx_entry, PREFIX_HEX);
9077           fputs (" [cantunwind]\n", stdout);
9078         }
9079       else if (exidx_entry & 0x80000000)
9080         {
9081           print_vma (exidx_entry, PREFIX_HEX);
9082           fputc ('\n', stdout);
9083           decode_arm_unwind (filedata, aux, exidx_entry, 4, 0, NULL, NULL);
9084         }
9085       else
9086         {
9087           bfd_vma table, table_offset = 0;
9088           Elf_Internal_Shdr *table_sec;
9089
9090           fputs ("@", stdout);
9091           table = arm_expand_prel31 (filedata, exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
9092           print_vma (table, PREFIX_HEX);
9093           printf ("\n");
9094
9095           /* Locate the matching .ARM.extab.  */
9096           if (entry_addr.section != SHN_UNDEF
9097               && entry_addr.section < filedata->file_header.e_shnum)
9098             {
9099               table_sec = filedata->section_headers + entry_addr.section;
9100               table_offset = entry_addr.offset;
9101               /* PR 18879 */
9102               if (table_offset > table_sec->sh_size
9103                   || ((bfd_signed_vma) table_offset) < 0)
9104                 {
9105                   warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
9106                         (unsigned long) table_offset,
9107                         printable_section_name (filedata, table_sec));
9108                   res = FALSE;
9109                   continue;
9110                 }
9111             }
9112           else
9113             {
9114               table_sec = find_section_by_address (filedata, table);
9115               if (table_sec != NULL)
9116                 table_offset = table - table_sec->sh_addr;
9117             }
9118
9119           if (table_sec == NULL)
9120             {
9121               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
9122                     (unsigned long) table);
9123               res = FALSE;
9124               continue;
9125             }
9126
9127           if (! decode_arm_unwind (filedata, aux, 0, 0, table_offset, table_sec,
9128                                    &extab_arm_sec))
9129             res = FALSE;
9130         }
9131     }
9132
9133   printf ("\n");
9134
9135   free (aux->funtab);
9136   arm_free_section (&exidx_arm_sec);
9137   arm_free_section (&extab_arm_sec);
9138
9139   return res;
9140 }
9141
9142 /* Used for both ARM and C6X unwinding tables.  */
9143
9144 static bfd_boolean
9145 arm_process_unwind (Filedata * filedata)
9146 {
9147   struct arm_unw_aux_info aux;
9148   Elf_Internal_Shdr *unwsec = NULL;
9149   Elf_Internal_Shdr *strsec;
9150   Elf_Internal_Shdr *sec;
9151   unsigned long i;
9152   unsigned int sec_type;
9153   bfd_boolean res = TRUE;
9154
9155   switch (filedata->file_header.e_machine)
9156     {
9157     case EM_ARM:
9158       sec_type = SHT_ARM_EXIDX;
9159       break;
9160
9161     case EM_TI_C6000:
9162       sec_type = SHT_C6000_UNWIND;
9163       break;
9164
9165     default:
9166       error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
9167              filedata->file_header.e_machine);
9168       return FALSE;
9169     }
9170
9171   if (filedata->string_table == NULL)
9172     return FALSE;
9173
9174   memset (& aux, 0, sizeof (aux));
9175   aux.filedata = filedata;
9176
9177   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9178     {
9179       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < filedata->file_header.e_shnum)
9180         {
9181           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
9182
9183           strsec = filedata->section_headers + sec->sh_link;
9184
9185           /* PR binutils/17531 file: 011-12666-0.004.  */
9186           if (aux.strtab != NULL)
9187             {
9188               error (_("Multiple string tables found in file.\n"));
9189               free (aux.strtab);
9190               res = FALSE;
9191             }
9192           aux.strtab = get_data (NULL, filedata, strsec->sh_offset,
9193                                  1, strsec->sh_size, _("string table"));
9194           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
9195         }
9196       else if (sec->sh_type == sec_type)
9197         unwsec = sec;
9198     }
9199
9200   if (unwsec == NULL)
9201     printf (_("\nThere are no unwind sections in this file.\n"));
9202   else
9203     for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9204       {
9205         if (sec->sh_type == sec_type)
9206           {
9207             unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size);
9208             printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
9209                               "contains %lu entry:\n",
9210                               "\nUnwind section '%s' at offset 0x%lx "
9211                               "contains %lu entries:\n",
9212                               num_unwind),
9213                     printable_section_name (filedata, sec),
9214                     (unsigned long) sec->sh_offset,
9215                     num_unwind);
9216
9217             if (! dump_arm_unwind (filedata, &aux, sec))
9218               res = FALSE;
9219           }
9220       }
9221
9222   if (aux.symtab)
9223     free (aux.symtab);
9224   if (aux.strtab)
9225     free ((char *) aux.strtab);
9226
9227   return res;
9228 }
9229
9230 static bfd_boolean
9231 process_unwind (Filedata * filedata)
9232 {
9233   struct unwind_handler
9234   {
9235     unsigned int machtype;
9236     bfd_boolean (* handler)(Filedata *);
9237   } handlers[] =
9238   {
9239     { EM_ARM, arm_process_unwind },
9240     { EM_IA_64, ia64_process_unwind },
9241     { EM_PARISC, hppa_process_unwind },
9242     { EM_TI_C6000, arm_process_unwind },
9243     { 0, NULL }
9244   };
9245   int i;
9246
9247   if (!do_unwind)
9248     return TRUE;
9249
9250   for (i = 0; handlers[i].handler != NULL; i++)
9251     if (filedata->file_header.e_machine == handlers[i].machtype)
9252       return handlers[i].handler (filedata);
9253
9254   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
9255           get_machine_name (filedata->file_header.e_machine));
9256   return TRUE;
9257 }
9258
9259 static void
9260 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
9261 {
9262   switch (entry->d_tag)
9263     {
9264     case DT_MIPS_FLAGS:
9265       if (entry->d_un.d_val == 0)
9266         printf (_("NONE"));
9267       else
9268         {
9269           static const char * opts[] =
9270           {
9271             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
9272             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
9273             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
9274             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
9275             "RLD_ORDER_SAFE"
9276           };
9277           unsigned int cnt;
9278           bfd_boolean first = TRUE;
9279
9280           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
9281             if (entry->d_un.d_val & (1 << cnt))
9282               {
9283                 printf ("%s%s", first ? "" : " ", opts[cnt]);
9284                 first = FALSE;
9285               }
9286         }
9287       break;
9288
9289     case DT_MIPS_IVERSION:
9290       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9291         printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
9292       else
9293         {
9294           char buf[40];
9295           sprintf_vma (buf, entry->d_un.d_ptr);
9296           /* Note: coded this way so that there is a single string for translation.  */
9297           printf (_("<corrupt: %s>"), buf);
9298         }
9299       break;
9300
9301     case DT_MIPS_TIME_STAMP:
9302       {
9303         char timebuf[128];
9304         struct tm * tmp;
9305         time_t atime = entry->d_un.d_val;
9306
9307         tmp = gmtime (&atime);
9308         /* PR 17531: file: 6accc532.  */
9309         if (tmp == NULL)
9310           snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
9311         else
9312           snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
9313                     tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9314                     tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9315         printf (_("Time Stamp: %s"), timebuf);
9316       }
9317       break;
9318
9319     case DT_MIPS_RLD_VERSION:
9320     case DT_MIPS_LOCAL_GOTNO:
9321     case DT_MIPS_CONFLICTNO:
9322     case DT_MIPS_LIBLISTNO:
9323     case DT_MIPS_SYMTABNO:
9324     case DT_MIPS_UNREFEXTNO:
9325     case DT_MIPS_HIPAGENO:
9326     case DT_MIPS_DELTA_CLASS_NO:
9327     case DT_MIPS_DELTA_INSTANCE_NO:
9328     case DT_MIPS_DELTA_RELOC_NO:
9329     case DT_MIPS_DELTA_SYM_NO:
9330     case DT_MIPS_DELTA_CLASSSYM_NO:
9331     case DT_MIPS_COMPACT_SIZE:
9332       print_vma (entry->d_un.d_val, DEC);
9333       break;
9334
9335     default:
9336       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9337     }
9338     putchar ('\n');
9339 }
9340
9341 static void
9342 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
9343 {
9344   switch (entry->d_tag)
9345     {
9346     case DT_HP_DLD_FLAGS:
9347       {
9348         static struct
9349         {
9350           long int bit;
9351           const char * str;
9352         }
9353         flags[] =
9354         {
9355           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
9356           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
9357           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
9358           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
9359           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
9360           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
9361           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9362           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9363           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9364           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
9365           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9366           { DT_HP_GST, "HP_GST" },
9367           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9368           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9369           { DT_HP_NODELETE, "HP_NODELETE" },
9370           { DT_HP_GROUP, "HP_GROUP" },
9371           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
9372         };
9373         bfd_boolean first = TRUE;
9374         size_t cnt;
9375         bfd_vma val = entry->d_un.d_val;
9376
9377         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
9378           if (val & flags[cnt].bit)
9379             {
9380               if (! first)
9381                 putchar (' ');
9382               fputs (flags[cnt].str, stdout);
9383               first = FALSE;
9384               val ^= flags[cnt].bit;
9385             }
9386
9387         if (val != 0 || first)
9388           {
9389             if (! first)
9390               putchar (' ');
9391             print_vma (val, HEX);
9392           }
9393       }
9394       break;
9395
9396     default:
9397       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9398       break;
9399     }
9400   putchar ('\n');
9401 }
9402
9403 #ifdef BFD64
9404
9405 /* VMS vs Unix time offset and factor.  */
9406
9407 #define VMS_EPOCH_OFFSET 35067168000000000LL
9408 #define VMS_GRANULARITY_FACTOR 10000000
9409
9410 /* Display a VMS time in a human readable format.  */
9411
9412 static void
9413 print_vms_time (bfd_int64_t vmstime)
9414 {
9415   struct tm *tm;
9416   time_t unxtime;
9417
9418   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9419   tm = gmtime (&unxtime);
9420   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9421           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9422           tm->tm_hour, tm->tm_min, tm->tm_sec);
9423 }
9424 #endif /* BFD64 */
9425
9426 static void
9427 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
9428 {
9429   switch (entry->d_tag)
9430     {
9431     case DT_IA_64_PLT_RESERVE:
9432       /* First 3 slots reserved.  */
9433       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9434       printf (" -- ");
9435       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
9436       break;
9437
9438     case DT_IA_64_VMS_LINKTIME:
9439 #ifdef BFD64
9440       print_vms_time (entry->d_un.d_val);
9441 #endif
9442       break;
9443
9444     case DT_IA_64_VMS_LNKFLAGS:
9445       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9446       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9447         printf (" CALL_DEBUG");
9448       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9449         printf (" NOP0BUFS");
9450       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9451         printf (" P0IMAGE");
9452       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9453         printf (" MKTHREADS");
9454       if (entry->d_un.d_val & VMS_LF_UPCALLS)
9455         printf (" UPCALLS");
9456       if (entry->d_un.d_val & VMS_LF_IMGSTA)
9457         printf (" IMGSTA");
9458       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9459         printf (" INITIALIZE");
9460       if (entry->d_un.d_val & VMS_LF_MAIN)
9461         printf (" MAIN");
9462       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9463         printf (" EXE_INIT");
9464       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9465         printf (" TBK_IN_IMG");
9466       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9467         printf (" DBG_IN_IMG");
9468       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9469         printf (" TBK_IN_DSF");
9470       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9471         printf (" DBG_IN_DSF");
9472       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9473         printf (" SIGNATURES");
9474       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9475         printf (" REL_SEG_OFF");
9476       break;
9477
9478     default:
9479       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9480       break;
9481     }
9482   putchar ('\n');
9483 }
9484
9485 static bfd_boolean
9486 get_32bit_dynamic_section (Filedata * filedata)
9487 {
9488   Elf32_External_Dyn * edyn;
9489   Elf32_External_Dyn * ext;
9490   Elf_Internal_Dyn * entry;
9491
9492   edyn = (Elf32_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9493                                           dynamic_size, _("dynamic section"));
9494   if (!edyn)
9495     return FALSE;
9496
9497   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9498      might not have the luxury of section headers.  Look for the DT_NULL
9499      terminator to determine the number of entries.  */
9500   for (ext = edyn, dynamic_nent = 0;
9501        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9502        ext++)
9503     {
9504       dynamic_nent++;
9505       if (BYTE_GET (ext->d_tag) == DT_NULL)
9506         break;
9507     }
9508
9509   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9510                                                   sizeof (* entry));
9511   if (dynamic_section == NULL)
9512     {
9513       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9514              (unsigned long) dynamic_nent);
9515       free (edyn);
9516       return FALSE;
9517     }
9518
9519   for (ext = edyn, entry = dynamic_section;
9520        entry < dynamic_section + dynamic_nent;
9521        ext++, entry++)
9522     {
9523       entry->d_tag      = BYTE_GET (ext->d_tag);
9524       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9525     }
9526
9527   free (edyn);
9528
9529   return TRUE;
9530 }
9531
9532 static bfd_boolean
9533 get_64bit_dynamic_section (Filedata * filedata)
9534 {
9535   Elf64_External_Dyn * edyn;
9536   Elf64_External_Dyn * ext;
9537   Elf_Internal_Dyn * entry;
9538
9539   /* Read in the data.  */
9540   edyn = (Elf64_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9541                                           dynamic_size, _("dynamic section"));
9542   if (!edyn)
9543     return FALSE;
9544
9545   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9546      might not have the luxury of section headers.  Look for the DT_NULL
9547      terminator to determine the number of entries.  */
9548   for (ext = edyn, dynamic_nent = 0;
9549        /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer.  */
9550        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9551        ext++)
9552     {
9553       dynamic_nent++;
9554       if (BYTE_GET (ext->d_tag) == DT_NULL)
9555         break;
9556     }
9557
9558   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9559                                                   sizeof (* entry));
9560   if (dynamic_section == NULL)
9561     {
9562       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9563              (unsigned long) dynamic_nent);
9564       free (edyn);
9565       return FALSE;
9566     }
9567
9568   /* Convert from external to internal formats.  */
9569   for (ext = edyn, entry = dynamic_section;
9570        entry < dynamic_section + dynamic_nent;
9571        ext++, entry++)
9572     {
9573       entry->d_tag      = BYTE_GET (ext->d_tag);
9574       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9575     }
9576
9577   free (edyn);
9578
9579   return TRUE;
9580 }
9581
9582 static void
9583 print_dynamic_flags (bfd_vma flags)
9584 {
9585   bfd_boolean first = TRUE;
9586
9587   while (flags)
9588     {
9589       bfd_vma flag;
9590
9591       flag = flags & - flags;
9592       flags &= ~ flag;
9593
9594       if (first)
9595         first = FALSE;
9596       else
9597         putc (' ', stdout);
9598
9599       switch (flag)
9600         {
9601         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
9602         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
9603         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
9604         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
9605         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
9606         default:                fputs (_("unknown"), stdout); break;
9607         }
9608     }
9609   puts ("");
9610 }
9611
9612 /* Parse and display the contents of the dynamic section.  */
9613
9614 static bfd_boolean
9615 process_dynamic_section (Filedata * filedata)
9616 {
9617   Elf_Internal_Dyn * entry;
9618
9619   if (dynamic_size == 0)
9620     {
9621       if (do_dynamic)
9622         printf (_("\nThere is no dynamic section in this file.\n"));
9623
9624       return TRUE;
9625     }
9626
9627   if (is_32bit_elf)
9628     {
9629       if (! get_32bit_dynamic_section (filedata))
9630         return FALSE;
9631     }
9632   else
9633     {
9634       if (! get_64bit_dynamic_section (filedata))
9635         return FALSE;
9636     }
9637
9638   /* Find the appropriate symbol table.  */
9639   if (dynamic_symbols == NULL)
9640     {
9641       for (entry = dynamic_section;
9642            entry < dynamic_section + dynamic_nent;
9643            ++entry)
9644         {
9645           Elf_Internal_Shdr section;
9646
9647           if (entry->d_tag != DT_SYMTAB)
9648             continue;
9649
9650           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9651
9652           /* Since we do not know how big the symbol table is,
9653              we default to reading in the entire file (!) and
9654              processing that.  This is overkill, I know, but it
9655              should work.  */
9656           section.sh_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9657           if ((bfd_size_type) section.sh_offset > filedata->file_size)
9658             {
9659               /* See PR 21379 for a reproducer.  */
9660               error (_("Invalid DT_SYMTAB entry: %lx"), (long) section.sh_offset);
9661               return FALSE;
9662             }
9663
9664           if (archive_file_offset != 0)
9665             section.sh_size = archive_file_size - section.sh_offset;
9666           else
9667             section.sh_size = filedata->file_size - section.sh_offset;
9668
9669           if (is_32bit_elf)
9670             section.sh_entsize = sizeof (Elf32_External_Sym);
9671           else
9672             section.sh_entsize = sizeof (Elf64_External_Sym);
9673           section.sh_name = filedata->string_table_length;
9674
9675           dynamic_symbols = GET_ELF_SYMBOLS (filedata, &section, & num_dynamic_syms);
9676           if (num_dynamic_syms < 1)
9677             {
9678               error (_("Unable to determine the number of symbols to load\n"));
9679               continue;
9680             }
9681         }
9682     }
9683
9684   /* Similarly find a string table.  */
9685   if (dynamic_strings == NULL)
9686     {
9687       for (entry = dynamic_section;
9688            entry < dynamic_section + dynamic_nent;
9689            ++entry)
9690         {
9691           unsigned long offset;
9692           long str_tab_len;
9693
9694           if (entry->d_tag != DT_STRTAB)
9695             continue;
9696
9697           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9698
9699           /* Since we do not know how big the string table is,
9700              we default to reading in the entire file (!) and
9701              processing that.  This is overkill, I know, but it
9702              should work.  */
9703
9704           offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9705
9706           if (archive_file_offset != 0)
9707             str_tab_len = archive_file_size - offset;
9708           else
9709             str_tab_len = filedata->file_size - offset;
9710
9711           if (str_tab_len < 1)
9712             {
9713               error
9714                 (_("Unable to determine the length of the dynamic string table\n"));
9715               continue;
9716             }
9717
9718           dynamic_strings = (char *) get_data (NULL, filedata, offset, 1,
9719                                                str_tab_len,
9720                                                _("dynamic string table"));
9721           dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9722           break;
9723         }
9724     }
9725
9726   /* And find the syminfo section if available.  */
9727   if (dynamic_syminfo == NULL)
9728     {
9729       unsigned long syminsz = 0;
9730
9731       for (entry = dynamic_section;
9732            entry < dynamic_section + dynamic_nent;
9733            ++entry)
9734         {
9735           if (entry->d_tag == DT_SYMINENT)
9736             {
9737               /* Note: these braces are necessary to avoid a syntax
9738                  error from the SunOS4 C compiler.  */
9739               /* PR binutils/17531: A corrupt file can trigger this test.
9740                  So do not use an assert, instead generate an error message.  */
9741               if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9742                 error (_("Bad value (%d) for SYMINENT entry\n"),
9743                        (int) entry->d_un.d_val);
9744             }
9745           else if (entry->d_tag == DT_SYMINSZ)
9746             syminsz = entry->d_un.d_val;
9747           else if (entry->d_tag == DT_SYMINFO)
9748             dynamic_syminfo_offset = offset_from_vma (filedata, entry->d_un.d_val,
9749                                                       syminsz);
9750         }
9751
9752       if (dynamic_syminfo_offset != 0 && syminsz != 0)
9753         {
9754           Elf_External_Syminfo * extsyminfo;
9755           Elf_External_Syminfo * extsym;
9756           Elf_Internal_Syminfo * syminfo;
9757
9758           /* There is a syminfo section.  Read the data.  */
9759           extsyminfo = (Elf_External_Syminfo *)
9760               get_data (NULL, filedata, dynamic_syminfo_offset, 1, syminsz,
9761                         _("symbol information"));
9762           if (!extsyminfo)
9763             return FALSE;
9764
9765           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9766           if (dynamic_syminfo == NULL)
9767             {
9768               error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9769                      (unsigned long) syminsz);
9770               return FALSE;
9771             }
9772
9773           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9774           for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9775                syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9776                ++syminfo, ++extsym)
9777             {
9778               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9779               syminfo->si_flags = BYTE_GET (extsym->si_flags);
9780             }
9781
9782           free (extsyminfo);
9783         }
9784     }
9785
9786   if (do_dynamic && dynamic_addr)
9787     printf (ngettext ("\nDynamic section at offset 0x%lx "
9788                       "contains %lu entry:\n",
9789                       "\nDynamic section at offset 0x%lx "
9790                       "contains %lu entries:\n",
9791                       dynamic_nent),
9792             dynamic_addr, (unsigned long) dynamic_nent);
9793   if (do_dynamic)
9794     printf (_("  Tag        Type                         Name/Value\n"));
9795
9796   for (entry = dynamic_section;
9797        entry < dynamic_section + dynamic_nent;
9798        entry++)
9799     {
9800       if (do_dynamic)
9801         {
9802           const char * dtype;
9803
9804           putchar (' ');
9805           print_vma (entry->d_tag, FULL_HEX);
9806           dtype = get_dynamic_type (filedata, entry->d_tag);
9807           printf (" (%s)%*s", dtype,
9808                   ((is_32bit_elf ? 27 : 19) - (int) strlen (dtype)), " ");
9809         }
9810
9811       switch (entry->d_tag)
9812         {
9813         case DT_FLAGS:
9814           if (do_dynamic)
9815             print_dynamic_flags (entry->d_un.d_val);
9816           break;
9817
9818         case DT_AUXILIARY:
9819         case DT_FILTER:
9820         case DT_CONFIG:
9821         case DT_DEPAUDIT:
9822         case DT_AUDIT:
9823           if (do_dynamic)
9824             {
9825               switch (entry->d_tag)
9826                 {
9827                 case DT_AUXILIARY:
9828                   printf (_("Auxiliary library"));
9829                   break;
9830
9831                 case DT_FILTER:
9832                   printf (_("Filter library"));
9833                   break;
9834
9835                 case DT_CONFIG:
9836                   printf (_("Configuration file"));
9837                   break;
9838
9839                 case DT_DEPAUDIT:
9840                   printf (_("Dependency audit library"));
9841                   break;
9842
9843                 case DT_AUDIT:
9844                   printf (_("Audit library"));
9845                   break;
9846                 }
9847
9848               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9849                 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9850               else
9851                 {
9852                   printf (": ");
9853                   print_vma (entry->d_un.d_val, PREFIX_HEX);
9854                   putchar ('\n');
9855                 }
9856             }
9857           break;
9858
9859         case DT_FEATURE:
9860           if (do_dynamic)
9861             {
9862               printf (_("Flags:"));
9863
9864               if (entry->d_un.d_val == 0)
9865                 printf (_(" None\n"));
9866               else
9867                 {
9868                   unsigned long int val = entry->d_un.d_val;
9869
9870                   if (val & DTF_1_PARINIT)
9871                     {
9872                       printf (" PARINIT");
9873                       val ^= DTF_1_PARINIT;
9874                     }
9875                   if (val & DTF_1_CONFEXP)
9876                     {
9877                       printf (" CONFEXP");
9878                       val ^= DTF_1_CONFEXP;
9879                     }
9880                   if (val != 0)
9881                     printf (" %lx", val);
9882                   puts ("");
9883                 }
9884             }
9885           break;
9886
9887         case DT_POSFLAG_1:
9888           if (do_dynamic)
9889             {
9890               printf (_("Flags:"));
9891
9892               if (entry->d_un.d_val == 0)
9893                 printf (_(" None\n"));
9894               else
9895                 {
9896                   unsigned long int val = entry->d_un.d_val;
9897
9898                   if (val & DF_P1_LAZYLOAD)
9899                     {
9900                       printf (" LAZYLOAD");
9901                       val ^= DF_P1_LAZYLOAD;
9902                     }
9903                   if (val & DF_P1_GROUPPERM)
9904                     {
9905                       printf (" GROUPPERM");
9906                       val ^= DF_P1_GROUPPERM;
9907                     }
9908                   if (val != 0)
9909                     printf (" %lx", val);
9910                   puts ("");
9911                 }
9912             }
9913           break;
9914
9915         case DT_FLAGS_1:
9916           if (do_dynamic)
9917             {
9918               printf (_("Flags:"));
9919               if (entry->d_un.d_val == 0)
9920                 printf (_(" None\n"));
9921               else
9922                 {
9923                   unsigned long int val = entry->d_un.d_val;
9924
9925                   if (val & DF_1_NOW)
9926                     {
9927                       printf (" NOW");
9928                       val ^= DF_1_NOW;
9929                     }
9930                   if (val & DF_1_GLOBAL)
9931                     {
9932                       printf (" GLOBAL");
9933                       val ^= DF_1_GLOBAL;
9934                     }
9935                   if (val & DF_1_GROUP)
9936                     {
9937                       printf (" GROUP");
9938                       val ^= DF_1_GROUP;
9939                     }
9940                   if (val & DF_1_NODELETE)
9941                     {
9942                       printf (" NODELETE");
9943                       val ^= DF_1_NODELETE;
9944                     }
9945                   if (val & DF_1_LOADFLTR)
9946                     {
9947                       printf (" LOADFLTR");
9948                       val ^= DF_1_LOADFLTR;
9949                     }
9950                   if (val & DF_1_INITFIRST)
9951                     {
9952                       printf (" INITFIRST");
9953                       val ^= DF_1_INITFIRST;
9954                     }
9955                   if (val & DF_1_NOOPEN)
9956                     {
9957                       printf (" NOOPEN");
9958                       val ^= DF_1_NOOPEN;
9959                     }
9960                   if (val & DF_1_ORIGIN)
9961                     {
9962                       printf (" ORIGIN");
9963                       val ^= DF_1_ORIGIN;
9964                     }
9965                   if (val & DF_1_DIRECT)
9966                     {
9967                       printf (" DIRECT");
9968                       val ^= DF_1_DIRECT;
9969                     }
9970                   if (val & DF_1_TRANS)
9971                     {
9972                       printf (" TRANS");
9973                       val ^= DF_1_TRANS;
9974                     }
9975                   if (val & DF_1_INTERPOSE)
9976                     {
9977                       printf (" INTERPOSE");
9978                       val ^= DF_1_INTERPOSE;
9979                     }
9980                   if (val & DF_1_NODEFLIB)
9981                     {
9982                       printf (" NODEFLIB");
9983                       val ^= DF_1_NODEFLIB;
9984                     }
9985                   if (val & DF_1_NODUMP)
9986                     {
9987                       printf (" NODUMP");
9988                       val ^= DF_1_NODUMP;
9989                     }
9990                   if (val & DF_1_CONFALT)
9991                     {
9992                       printf (" CONFALT");
9993                       val ^= DF_1_CONFALT;
9994                     }
9995                   if (val & DF_1_ENDFILTEE)
9996                     {
9997                       printf (" ENDFILTEE");
9998                       val ^= DF_1_ENDFILTEE;
9999                     }
10000                   if (val & DF_1_DISPRELDNE)
10001                     {
10002                       printf (" DISPRELDNE");
10003                       val ^= DF_1_DISPRELDNE;
10004                     }
10005                   if (val & DF_1_DISPRELPND)
10006                     {
10007                       printf (" DISPRELPND");
10008                       val ^= DF_1_DISPRELPND;
10009                     }
10010                   if (val & DF_1_NODIRECT)
10011                     {
10012                       printf (" NODIRECT");
10013                       val ^= DF_1_NODIRECT;
10014                     }
10015                   if (val & DF_1_IGNMULDEF)
10016                     {
10017                       printf (" IGNMULDEF");
10018                       val ^= DF_1_IGNMULDEF;
10019                     }
10020                   if (val & DF_1_NOKSYMS)
10021                     {
10022                       printf (" NOKSYMS");
10023                       val ^= DF_1_NOKSYMS;
10024                     }
10025                   if (val & DF_1_NOHDR)
10026                     {
10027                       printf (" NOHDR");
10028                       val ^= DF_1_NOHDR;
10029                     }
10030                   if (val & DF_1_EDITED)
10031                     {
10032                       printf (" EDITED");
10033                       val ^= DF_1_EDITED;
10034                     }
10035                   if (val & DF_1_NORELOC)
10036                     {
10037                       printf (" NORELOC");
10038                       val ^= DF_1_NORELOC;
10039                     }
10040                   if (val & DF_1_SYMINTPOSE)
10041                     {
10042                       printf (" SYMINTPOSE");
10043                       val ^= DF_1_SYMINTPOSE;
10044                     }
10045                   if (val & DF_1_GLOBAUDIT)
10046                     {
10047                       printf (" GLOBAUDIT");
10048                       val ^= DF_1_GLOBAUDIT;
10049                     }
10050                   if (val & DF_1_SINGLETON)
10051                     {
10052                       printf (" SINGLETON");
10053                       val ^= DF_1_SINGLETON;
10054                     }
10055                   if (val & DF_1_STUB)
10056                     {
10057                       printf (" STUB");
10058                       val ^= DF_1_STUB;
10059                     }
10060                   if (val & DF_1_PIE)
10061                     {
10062                       printf (" PIE");
10063                       val ^= DF_1_PIE;
10064                     }
10065                   if (val & DF_1_KMOD)
10066                     {
10067                       printf (" KMOD");
10068                       val ^= DF_1_KMOD;
10069                     }
10070                   if (val & DF_1_WEAKFILTER)
10071                     {
10072                       printf (" WEAKFILTER");
10073                       val ^= DF_1_WEAKFILTER;
10074                     }
10075                   if (val & DF_1_NOCOMMON)
10076                     {
10077                       printf (" NOCOMMON");
10078                       val ^= DF_1_NOCOMMON;
10079                     }
10080                   if (val != 0)
10081                     printf (" %lx", val);
10082                   puts ("");
10083                 }
10084             }
10085           break;
10086
10087         case DT_PLTREL:
10088           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10089           if (do_dynamic)
10090             puts (get_dynamic_type (filedata, entry->d_un.d_val));
10091           break;
10092
10093         case DT_NULL    :
10094         case DT_NEEDED  :
10095         case DT_PLTGOT  :
10096         case DT_HASH    :
10097         case DT_STRTAB  :
10098         case DT_SYMTAB  :
10099         case DT_RELA    :
10100         case DT_INIT    :
10101         case DT_FINI    :
10102         case DT_SONAME  :
10103         case DT_RPATH   :
10104         case DT_SYMBOLIC:
10105         case DT_REL     :
10106         case DT_DEBUG   :
10107         case DT_TEXTREL :
10108         case DT_JMPREL  :
10109         case DT_RUNPATH :
10110           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10111
10112           if (do_dynamic)
10113             {
10114               char * name;
10115
10116               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
10117                 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10118               else
10119                 name = NULL;
10120
10121               if (name)
10122                 {
10123                   switch (entry->d_tag)
10124                     {
10125                     case DT_NEEDED:
10126                       printf (_("Shared library: [%s]"), name);
10127
10128                       if (streq (name, program_interpreter))
10129                         printf (_(" program interpreter"));
10130                       break;
10131
10132                     case DT_SONAME:
10133                       printf (_("Library soname: [%s]"), name);
10134                       break;
10135
10136                     case DT_RPATH:
10137                       printf (_("Library rpath: [%s]"), name);
10138                       break;
10139
10140                     case DT_RUNPATH:
10141                       printf (_("Library runpath: [%s]"), name);
10142                       break;
10143
10144                     default:
10145                       print_vma (entry->d_un.d_val, PREFIX_HEX);
10146                       break;
10147                     }
10148                 }
10149               else
10150                 print_vma (entry->d_un.d_val, PREFIX_HEX);
10151
10152               putchar ('\n');
10153             }
10154           break;
10155
10156         case DT_PLTRELSZ:
10157         case DT_RELASZ  :
10158         case DT_STRSZ   :
10159         case DT_RELSZ   :
10160         case DT_RELAENT :
10161         case DT_SYMENT  :
10162         case DT_RELENT  :
10163           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10164           /* Fall through.  */
10165         case DT_PLTPADSZ:
10166         case DT_MOVEENT :
10167         case DT_MOVESZ  :
10168         case DT_INIT_ARRAYSZ:
10169         case DT_FINI_ARRAYSZ:
10170         case DT_GNU_CONFLICTSZ:
10171         case DT_GNU_LIBLISTSZ:
10172           if (do_dynamic)
10173             {
10174               print_vma (entry->d_un.d_val, UNSIGNED);
10175               printf (_(" (bytes)\n"));
10176             }
10177           break;
10178
10179         case DT_VERDEFNUM:
10180         case DT_VERNEEDNUM:
10181         case DT_RELACOUNT:
10182         case DT_RELCOUNT:
10183           if (do_dynamic)
10184             {
10185               print_vma (entry->d_un.d_val, UNSIGNED);
10186               putchar ('\n');
10187             }
10188           break;
10189
10190         case DT_SYMINSZ:
10191         case DT_SYMINENT:
10192         case DT_SYMINFO:
10193         case DT_USED:
10194         case DT_INIT_ARRAY:
10195         case DT_FINI_ARRAY:
10196           if (do_dynamic)
10197             {
10198               if (entry->d_tag == DT_USED
10199                   && VALID_DYNAMIC_NAME (entry->d_un.d_val))
10200                 {
10201                   char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10202
10203                   if (*name)
10204                     {
10205                       printf (_("Not needed object: [%s]\n"), name);
10206                       break;
10207                     }
10208                 }
10209
10210               print_vma (entry->d_un.d_val, PREFIX_HEX);
10211               putchar ('\n');
10212             }
10213           break;
10214
10215         case DT_BIND_NOW:
10216           /* The value of this entry is ignored.  */
10217           if (do_dynamic)
10218             putchar ('\n');
10219           break;
10220
10221         case DT_GNU_PRELINKED:
10222           if (do_dynamic)
10223             {
10224               struct tm * tmp;
10225               time_t atime = entry->d_un.d_val;
10226
10227               tmp = gmtime (&atime);
10228               /* PR 17533 file: 041-1244816-0.004.  */
10229               if (tmp == NULL)
10230                 printf (_("<corrupt time val: %lx"),
10231                         (unsigned long) atime);
10232               else
10233                 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
10234                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
10235                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
10236
10237             }
10238           break;
10239
10240         case DT_GNU_HASH:
10241           dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
10242           if (do_dynamic)
10243             {
10244               print_vma (entry->d_un.d_val, PREFIX_HEX);
10245               putchar ('\n');
10246             }
10247           break;
10248
10249         default:
10250           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
10251             version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
10252               entry->d_un.d_val;
10253
10254           if (do_dynamic)
10255             {
10256               switch (filedata->file_header.e_machine)
10257                 {
10258                 case EM_MIPS:
10259                 case EM_MIPS_RS3_LE:
10260                   dynamic_section_mips_val (entry);
10261                   break;
10262                 case EM_PARISC:
10263                   dynamic_section_parisc_val (entry);
10264                   break;
10265                 case EM_IA_64:
10266                   dynamic_section_ia64_val (entry);
10267                   break;
10268                 default:
10269                   print_vma (entry->d_un.d_val, PREFIX_HEX);
10270                   putchar ('\n');
10271                 }
10272             }
10273           break;
10274         }
10275     }
10276
10277   return TRUE;
10278 }
10279
10280 static char *
10281 get_ver_flags (unsigned int flags)
10282 {
10283   static char buff[128];
10284
10285   buff[0] = 0;
10286
10287   if (flags == 0)
10288     return _("none");
10289
10290   if (flags & VER_FLG_BASE)
10291     strcat (buff, "BASE");
10292
10293   if (flags & VER_FLG_WEAK)
10294     {
10295       if (flags & VER_FLG_BASE)
10296         strcat (buff, " | ");
10297
10298       strcat (buff, "WEAK");
10299     }
10300
10301   if (flags & VER_FLG_INFO)
10302     {
10303       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
10304         strcat (buff, " | ");
10305
10306       strcat (buff, "INFO");
10307     }
10308
10309   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10310     {
10311       if (flags & (VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10312         strcat (buff, " | ");
10313
10314       strcat (buff, _("<unknown>"));
10315     }
10316
10317   return buff;
10318 }
10319
10320 /* Display the contents of the version sections.  */
10321
10322 static bfd_boolean
10323 process_version_sections (Filedata * filedata)
10324 {
10325   Elf_Internal_Shdr * section;
10326   unsigned i;
10327   bfd_boolean found = FALSE;
10328
10329   if (! do_version)
10330     return TRUE;
10331
10332   for (i = 0, section = filedata->section_headers;
10333        i < filedata->file_header.e_shnum;
10334        i++, section++)
10335     {
10336       switch (section->sh_type)
10337         {
10338         case SHT_GNU_verdef:
10339           {
10340             Elf_External_Verdef * edefs;
10341             unsigned long idx;
10342             unsigned long cnt;
10343             char * endbuf;
10344
10345             found = TRUE;
10346
10347             printf (ngettext ("\nVersion definition section '%s' "
10348                               "contains %u entry:\n",
10349                               "\nVersion definition section '%s' "
10350                               "contains %u entries:\n",
10351                               section->sh_info),
10352                     printable_section_name (filedata, section),
10353                     section->sh_info);
10354
10355             printf (_("  Addr: 0x"));
10356             printf_vma (section->sh_addr);
10357             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10358                     (unsigned long) section->sh_offset, section->sh_link,
10359                     printable_section_name_from_index (filedata, section->sh_link));
10360
10361             edefs = (Elf_External_Verdef *)
10362                 get_data (NULL, filedata, section->sh_offset, 1,section->sh_size,
10363                           _("version definition section"));
10364             if (!edefs)
10365               break;
10366             endbuf = (char *) edefs + section->sh_size;
10367
10368             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10369               {
10370                 char * vstart;
10371                 Elf_External_Verdef * edef;
10372                 Elf_Internal_Verdef ent;
10373                 Elf_External_Verdaux * eaux;
10374                 Elf_Internal_Verdaux aux;
10375                 unsigned long isum;
10376                 int j;
10377
10378                 vstart = ((char *) edefs) + idx;
10379                 if (vstart + sizeof (*edef) > endbuf)
10380                   break;
10381
10382                 edef = (Elf_External_Verdef *) vstart;
10383
10384                 ent.vd_version = BYTE_GET (edef->vd_version);
10385                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
10386                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
10387                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
10388                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
10389                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
10390                 ent.vd_next    = BYTE_GET (edef->vd_next);
10391
10392                 printf (_("  %#06lx: Rev: %d  Flags: %s"),
10393                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
10394
10395                 printf (_("  Index: %d  Cnt: %d  "),
10396                         ent.vd_ndx, ent.vd_cnt);
10397
10398                 /* Check for overflow.  */
10399                 if (ent.vd_aux > (size_t) (endbuf - vstart))
10400                   break;
10401
10402                 vstart += ent.vd_aux;
10403
10404                 if (vstart + sizeof (*eaux) > endbuf)
10405                   break;
10406                 eaux = (Elf_External_Verdaux *) vstart;
10407
10408                 aux.vda_name = BYTE_GET (eaux->vda_name);
10409                 aux.vda_next = BYTE_GET (eaux->vda_next);
10410
10411                 if (VALID_DYNAMIC_NAME (aux.vda_name))
10412                   printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
10413                 else
10414                   printf (_("Name index: %ld\n"), aux.vda_name);
10415
10416                 isum = idx + ent.vd_aux;
10417
10418                 for (j = 1; j < ent.vd_cnt; j++)
10419                   {
10420                     if (aux.vda_next < sizeof (*eaux)
10421                         && !(j == ent.vd_cnt - 1 && aux.vda_next == 0))
10422                       {
10423                         warn (_("Invalid vda_next field of %lx\n"),
10424                               aux.vda_next);
10425                         j = ent.vd_cnt;
10426                         break;
10427                       }
10428                     /* Check for overflow.  */
10429                     if (aux.vda_next > (size_t) (endbuf - vstart))
10430                       break;
10431
10432                     isum   += aux.vda_next;
10433                     vstart += aux.vda_next;
10434
10435                     if (vstart + sizeof (*eaux) > endbuf)
10436                       break;
10437                     eaux = (Elf_External_Verdaux *) vstart;
10438
10439                     aux.vda_name = BYTE_GET (eaux->vda_name);
10440                     aux.vda_next = BYTE_GET (eaux->vda_next);
10441
10442                     if (VALID_DYNAMIC_NAME (aux.vda_name))
10443                       printf (_("  %#06lx: Parent %d: %s\n"),
10444                               isum, j, GET_DYNAMIC_NAME (aux.vda_name));
10445                     else
10446                       printf (_("  %#06lx: Parent %d, name index: %ld\n"),
10447                               isum, j, aux.vda_name);
10448                   }
10449
10450                 if (j < ent.vd_cnt)
10451                   printf (_("  Version def aux past end of section\n"));
10452
10453                 /* PR 17531:
10454                    file: id:000001,src:000172+005151,op:splice,rep:2.  */
10455                 if (ent.vd_next < sizeof (*edef)
10456                     && !(cnt == section->sh_info - 1 && ent.vd_next == 0))
10457                   {
10458                     warn (_("Invalid vd_next field of %lx\n"), ent.vd_next);
10459                     cnt = section->sh_info;
10460                     break;
10461                   }
10462                 if (ent.vd_next > (size_t) (endbuf - ((char *) edefs + idx)))
10463                   break;
10464
10465                 idx += ent.vd_next;
10466               }
10467
10468             if (cnt < section->sh_info)
10469               printf (_("  Version definition past end of section\n"));
10470
10471             free (edefs);
10472           }
10473           break;
10474
10475         case SHT_GNU_verneed:
10476           {
10477             Elf_External_Verneed * eneed;
10478             unsigned long idx;
10479             unsigned long cnt;
10480             char * endbuf;
10481
10482             found = TRUE;
10483
10484             printf (ngettext ("\nVersion needs section '%s' "
10485                               "contains %u entry:\n",
10486                               "\nVersion needs section '%s' "
10487                               "contains %u entries:\n",
10488                               section->sh_info),
10489                     printable_section_name (filedata, section), section->sh_info);
10490
10491             printf (_(" Addr: 0x"));
10492             printf_vma (section->sh_addr);
10493             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10494                     (unsigned long) section->sh_offset, section->sh_link,
10495                     printable_section_name_from_index (filedata, section->sh_link));
10496
10497             eneed = (Elf_External_Verneed *) get_data (NULL, filedata,
10498                                                        section->sh_offset, 1,
10499                                                        section->sh_size,
10500                                                        _("Version Needs section"));
10501             if (!eneed)
10502               break;
10503             endbuf = (char *) eneed + section->sh_size;
10504
10505             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10506               {
10507                 Elf_External_Verneed * entry;
10508                 Elf_Internal_Verneed ent;
10509                 unsigned long isum;
10510                 int j;
10511                 char * vstart;
10512
10513                 vstart = ((char *) eneed) + idx;
10514                 if (vstart + sizeof (*entry) > endbuf)
10515                   break;
10516
10517                 entry = (Elf_External_Verneed *) vstart;
10518
10519                 ent.vn_version = BYTE_GET (entry->vn_version);
10520                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
10521                 ent.vn_file    = BYTE_GET (entry->vn_file);
10522                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
10523                 ent.vn_next    = BYTE_GET (entry->vn_next);
10524
10525                 printf (_("  %#06lx: Version: %d"), idx, ent.vn_version);
10526
10527                 if (VALID_DYNAMIC_NAME (ent.vn_file))
10528                   printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
10529                 else
10530                   printf (_("  File: %lx"), ent.vn_file);
10531
10532                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
10533
10534                 /* Check for overflow.  */
10535                 if (ent.vn_aux > (size_t) (endbuf - vstart))
10536                   break;
10537                 vstart += ent.vn_aux;
10538
10539                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10540                   {
10541                     Elf_External_Vernaux * eaux;
10542                     Elf_Internal_Vernaux aux;
10543
10544                     if (vstart + sizeof (*eaux) > endbuf)
10545                       break;
10546                     eaux = (Elf_External_Vernaux *) vstart;
10547
10548                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
10549                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
10550                     aux.vna_other = BYTE_GET (eaux->vna_other);
10551                     aux.vna_name  = BYTE_GET (eaux->vna_name);
10552                     aux.vna_next  = BYTE_GET (eaux->vna_next);
10553
10554                     if (VALID_DYNAMIC_NAME (aux.vna_name))
10555                       printf (_("  %#06lx:   Name: %s"),
10556                               isum, GET_DYNAMIC_NAME (aux.vna_name));
10557                     else
10558                       printf (_("  %#06lx:   Name index: %lx"),
10559                               isum, aux.vna_name);
10560
10561                     printf (_("  Flags: %s  Version: %d\n"),
10562                             get_ver_flags (aux.vna_flags), aux.vna_other);
10563
10564                     if (aux.vna_next < sizeof (*eaux)
10565                         && !(j == ent.vn_cnt - 1 && aux.vna_next == 0))
10566                       {
10567                         warn (_("Invalid vna_next field of %lx\n"),
10568                               aux.vna_next);
10569                         j = ent.vn_cnt;
10570                         break;
10571                       }
10572                     /* Check for overflow.  */
10573                     if (aux.vna_next > (size_t) (endbuf - vstart))
10574                       break;
10575                     isum   += aux.vna_next;
10576                     vstart += aux.vna_next;
10577                   }
10578
10579                 if (j < ent.vn_cnt)
10580                   warn (_("Missing Version Needs auxillary information\n"));
10581
10582                 if (ent.vn_next < sizeof (*entry)
10583                     && !(cnt == section->sh_info - 1 && ent.vn_next == 0))
10584                   {
10585                     warn (_("Invalid vn_next field of %lx\n"), ent.vn_next);
10586                     cnt = section->sh_info;
10587                     break;
10588                   }
10589                 if (ent.vn_next > (size_t) (endbuf - ((char *) eneed + idx)))
10590                   break;
10591                 idx += ent.vn_next;
10592               }
10593
10594             if (cnt < section->sh_info)
10595               warn (_("Missing Version Needs information\n"));
10596
10597             free (eneed);
10598           }
10599           break;
10600
10601         case SHT_GNU_versym:
10602           {
10603             Elf_Internal_Shdr * link_section;
10604             size_t total;
10605             unsigned int cnt;
10606             unsigned char * edata;
10607             unsigned short * data;
10608             char * strtab;
10609             Elf_Internal_Sym * symbols;
10610             Elf_Internal_Shdr * string_sec;
10611             unsigned long num_syms;
10612             long off;
10613
10614             if (section->sh_link >= filedata->file_header.e_shnum)
10615               break;
10616
10617             link_section = filedata->section_headers + section->sh_link;
10618             total = section->sh_size / sizeof (Elf_External_Versym);
10619
10620             if (link_section->sh_link >= filedata->file_header.e_shnum)
10621               break;
10622
10623             found = TRUE;
10624
10625             symbols = GET_ELF_SYMBOLS (filedata, link_section, & num_syms);
10626             if (symbols == NULL)
10627               break;
10628
10629             string_sec = filedata->section_headers + link_section->sh_link;
10630
10631             strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
10632                                         string_sec->sh_size,
10633                                         _("version string table"));
10634             if (!strtab)
10635               {
10636                 free (symbols);
10637                 break;
10638               }
10639
10640             printf (ngettext ("\nVersion symbols section '%s' "
10641                               "contains %lu entry:\n",
10642                               "\nVersion symbols section '%s' "
10643                               "contains %lu entries:\n",
10644                               total),
10645                     printable_section_name (filedata, section), (unsigned long) total);
10646
10647             printf (_(" Addr: "));
10648             printf_vma (section->sh_addr);
10649             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10650                     (unsigned long) section->sh_offset, section->sh_link,
10651                     printable_section_name (filedata, link_section));
10652
10653             off = offset_from_vma (filedata,
10654                                    version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10655                                    total * sizeof (short));
10656             edata = (unsigned char *) get_data (NULL, filedata, off, total,
10657                                                 sizeof (short),
10658                                                 _("version symbol data"));
10659             if (!edata)
10660               {
10661                 free (strtab);
10662                 free (symbols);
10663                 break;
10664               }
10665
10666             data = (short unsigned int *) cmalloc (total, sizeof (short));
10667
10668             for (cnt = total; cnt --;)
10669               data[cnt] = byte_get (edata + cnt * sizeof (short),
10670                                     sizeof (short));
10671
10672             free (edata);
10673
10674             for (cnt = 0; cnt < total; cnt += 4)
10675               {
10676                 int j, nn;
10677                 char *name;
10678                 char *invalid = _("*invalid*");
10679
10680                 printf ("  %03x:", cnt);
10681
10682                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10683                   switch (data[cnt + j])
10684                     {
10685                     case 0:
10686                       fputs (_("   0 (*local*)    "), stdout);
10687                       break;
10688
10689                     case 1:
10690                       fputs (_("   1 (*global*)   "), stdout);
10691                       break;
10692
10693                     default:
10694                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10695                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10696
10697                       /* If this index value is greater than the size of the symbols
10698                          array, break to avoid an out-of-bounds read.  */
10699                       if ((unsigned long)(cnt + j) >= num_syms)
10700                         {
10701                           warn (_("invalid index into symbol array\n"));
10702                           break;
10703                         }
10704
10705                       name = NULL;
10706                       if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10707                         {
10708                           Elf_Internal_Verneed ivn;
10709                           unsigned long offset;
10710
10711                           offset = offset_from_vma
10712                             (filedata, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10713                              sizeof (Elf_External_Verneed));
10714
10715                           do
10716                             {
10717                               Elf_Internal_Vernaux ivna;
10718                               Elf_External_Verneed evn;
10719                               Elf_External_Vernaux evna;
10720                               unsigned long a_off;
10721
10722                               if (get_data (&evn, filedata, offset, sizeof (evn), 1,
10723                                             _("version need")) == NULL)
10724                                 break;
10725
10726                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10727                               ivn.vn_next = BYTE_GET (evn.vn_next);
10728
10729                               a_off = offset + ivn.vn_aux;
10730
10731                               do
10732                                 {
10733                                   if (get_data (&evna, filedata, a_off, sizeof (evna),
10734                                                 1, _("version need aux (2)")) == NULL)
10735                                     {
10736                                       ivna.vna_next  = 0;
10737                                       ivna.vna_other = 0;
10738                                     }
10739                                   else
10740                                     {
10741                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
10742                                       ivna.vna_other = BYTE_GET (evna.vna_other);
10743                                     }
10744
10745                                   a_off += ivna.vna_next;
10746                                 }
10747                               while (ivna.vna_other != data[cnt + j]
10748                                      && ivna.vna_next != 0);
10749
10750                               if (ivna.vna_other == data[cnt + j])
10751                                 {
10752                                   ivna.vna_name = BYTE_GET (evna.vna_name);
10753
10754                                   if (ivna.vna_name >= string_sec->sh_size)
10755                                     name = invalid;
10756                                   else
10757                                     name = strtab + ivna.vna_name;
10758                                   break;
10759                                 }
10760
10761                               offset += ivn.vn_next;
10762                             }
10763                           while (ivn.vn_next);
10764                         }
10765
10766                       if (data[cnt + j] != 0x8001
10767                           && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10768                         {
10769                           Elf_Internal_Verdef ivd;
10770                           Elf_External_Verdef evd;
10771                           unsigned long offset;
10772
10773                           offset = offset_from_vma
10774                             (filedata, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10775                              sizeof evd);
10776
10777                           do
10778                             {
10779                               if (get_data (&evd, filedata, offset, sizeof (evd), 1,
10780                                             _("version def")) == NULL)
10781                                 {
10782                                   ivd.vd_next = 0;
10783                                   /* PR 17531: file: 046-1082287-0.004.  */
10784                                   ivd.vd_ndx  = (data[cnt + j] & VERSYM_VERSION) + 1;
10785                                   break;
10786                                 }
10787                               else
10788                                 {
10789                                   ivd.vd_next = BYTE_GET (evd.vd_next);
10790                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
10791                                 }
10792
10793                               offset += ivd.vd_next;
10794                             }
10795                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10796                                  && ivd.vd_next != 0);
10797
10798                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10799                             {
10800                               Elf_External_Verdaux evda;
10801                               Elf_Internal_Verdaux ivda;
10802
10803                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
10804
10805                               if (get_data (&evda, filedata,
10806                                             offset - ivd.vd_next + ivd.vd_aux,
10807                                             sizeof (evda), 1,
10808                                             _("version def aux")) == NULL)
10809                                 break;
10810
10811                               ivda.vda_name = BYTE_GET (evda.vda_name);
10812
10813                               if (ivda.vda_name >= string_sec->sh_size)
10814                                 name = invalid;
10815                               else if (name != NULL && name != invalid)
10816                                 name = _("*both*");
10817                               else
10818                                 name = strtab + ivda.vda_name;
10819                             }
10820                         }
10821                       if (name != NULL)
10822                         nn += printf ("(%s%-*s",
10823                                       name,
10824                                       12 - (int) strlen (name),
10825                                       ")");
10826
10827                       if (nn < 18)
10828                         printf ("%*c", 18 - nn, ' ');
10829                     }
10830
10831                 putchar ('\n');
10832               }
10833
10834             free (data);
10835             free (strtab);
10836             free (symbols);
10837           }
10838           break;
10839
10840         default:
10841           break;
10842         }
10843     }
10844
10845   if (! found)
10846     printf (_("\nNo version information found in this file.\n"));
10847
10848   return TRUE;
10849 }
10850
10851 static const char *
10852 get_symbol_binding (Filedata * filedata, unsigned int binding)
10853 {
10854   static char buff[32];
10855
10856   switch (binding)
10857     {
10858     case STB_LOCAL:     return "LOCAL";
10859     case STB_GLOBAL:    return "GLOBAL";
10860     case STB_WEAK:      return "WEAK";
10861     default:
10862       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10863         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10864                   binding);
10865       else if (binding >= STB_LOOS && binding <= STB_HIOS)
10866         {
10867           if (binding == STB_GNU_UNIQUE
10868               && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10869                   /* GNU is still using the default value 0.  */
10870                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10871             return "UNIQUE";
10872           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10873         }
10874       else
10875         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
10876       return buff;
10877     }
10878 }
10879
10880 static const char *
10881 get_symbol_type (Filedata * filedata, unsigned int type)
10882 {
10883   static char buff[32];
10884
10885   switch (type)
10886     {
10887     case STT_NOTYPE:    return "NOTYPE";
10888     case STT_OBJECT:    return "OBJECT";
10889     case STT_FUNC:      return "FUNC";
10890     case STT_SECTION:   return "SECTION";
10891     case STT_FILE:      return "FILE";
10892     case STT_COMMON:    return "COMMON";
10893     case STT_TLS:       return "TLS";
10894     case STT_RELC:      return "RELC";
10895     case STT_SRELC:     return "SRELC";
10896     default:
10897       if (type >= STT_LOPROC && type <= STT_HIPROC)
10898         {
10899           if (filedata->file_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10900             return "THUMB_FUNC";
10901
10902           if (filedata->file_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
10903             return "REGISTER";
10904
10905           if (filedata->file_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10906             return "PARISC_MILLI";
10907
10908           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
10909         }
10910       else if (type >= STT_LOOS && type <= STT_HIOS)
10911         {
10912           if (filedata->file_header.e_machine == EM_PARISC)
10913             {
10914               if (type == STT_HP_OPAQUE)
10915                 return "HP_OPAQUE";
10916               if (type == STT_HP_STUB)
10917                 return "HP_STUB";
10918             }
10919
10920           if (type == STT_GNU_IFUNC
10921               && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10922                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
10923                   /* GNU is still using the default value 0.  */
10924                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10925             return "IFUNC";
10926
10927           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
10928         }
10929       else
10930         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
10931       return buff;
10932     }
10933 }
10934
10935 static const char *
10936 get_symbol_visibility (unsigned int visibility)
10937 {
10938   switch (visibility)
10939     {
10940     case STV_DEFAULT:   return "DEFAULT";
10941     case STV_INTERNAL:  return "INTERNAL";
10942     case STV_HIDDEN:    return "HIDDEN";
10943     case STV_PROTECTED: return "PROTECTED";
10944     default:
10945       error (_("Unrecognized visibility value: %u"), visibility);
10946       return _("<unknown>");
10947     }
10948 }
10949
10950 static const char *
10951 get_solaris_symbol_visibility (unsigned int visibility)
10952 {
10953   switch (visibility)
10954     {
10955     case 4: return "EXPORTED";
10956     case 5: return "SINGLETON";
10957     case 6: return "ELIMINATE";
10958     default: return get_symbol_visibility (visibility);
10959     }
10960 }
10961
10962 static const char *
10963 get_mips_symbol_other (unsigned int other)
10964 {
10965   switch (other)
10966     {
10967     case STO_OPTIONAL:      return "OPTIONAL";
10968     case STO_MIPS_PLT:      return "MIPS PLT";
10969     case STO_MIPS_PIC:      return "MIPS PIC";
10970     case STO_MICROMIPS:     return "MICROMIPS";
10971     case STO_MICROMIPS | STO_MIPS_PIC:      return "MICROMIPS, MIPS PIC";
10972     case STO_MIPS16:        return "MIPS16";
10973     default:                return NULL;
10974     }
10975 }
10976
10977 static const char *
10978 get_ia64_symbol_other (Filedata * filedata, unsigned int other)
10979 {
10980   if (is_ia64_vms (filedata))
10981     {
10982       static char res[32];
10983
10984       res[0] = 0;
10985
10986       /* Function types is for images and .STB files only.  */
10987       switch (filedata->file_header.e_type)
10988         {
10989         case ET_DYN:
10990         case ET_EXEC:
10991           switch (VMS_ST_FUNC_TYPE (other))
10992             {
10993             case VMS_SFT_CODE_ADDR:
10994               strcat (res, " CA");
10995               break;
10996             case VMS_SFT_SYMV_IDX:
10997               strcat (res, " VEC");
10998               break;
10999             case VMS_SFT_FD:
11000               strcat (res, " FD");
11001               break;
11002             case VMS_SFT_RESERVE:
11003               strcat (res, " RSV");
11004               break;
11005             default:
11006               warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
11007                     VMS_ST_FUNC_TYPE (other));
11008               strcat (res, " <unknown>");
11009               break;
11010             }
11011           break;
11012         default:
11013           break;
11014         }
11015       switch (VMS_ST_LINKAGE (other))
11016         {
11017         case VMS_STL_IGNORE:
11018           strcat (res, " IGN");
11019           break;
11020         case VMS_STL_RESERVE:
11021           strcat (res, " RSV");
11022           break;
11023         case VMS_STL_STD:
11024           strcat (res, " STD");
11025           break;
11026         case VMS_STL_LNK:
11027           strcat (res, " LNK");
11028           break;
11029         default:
11030           warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
11031                 VMS_ST_LINKAGE (other));
11032           strcat (res, " <unknown>");
11033           break;
11034         }
11035
11036       if (res[0] != 0)
11037         return res + 1;
11038       else
11039         return res;
11040     }
11041   return NULL;
11042 }
11043
11044 static const char *
11045 get_ppc64_symbol_other (unsigned int other)
11046 {
11047   if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
11048     {
11049       static char buf[32];
11050       snprintf (buf, sizeof buf, _("<localentry>: %d"),
11051                 PPC64_LOCAL_ENTRY_OFFSET (other));
11052       return buf;
11053     }
11054   return NULL;
11055 }
11056
11057 static const char *
11058 get_symbol_other (Filedata * filedata, unsigned int other)
11059 {
11060   const char * result = NULL;
11061   static char buff [32];
11062
11063   if (other == 0)
11064     return "";
11065
11066   switch (filedata->file_header.e_machine)
11067     {
11068     case EM_MIPS:
11069       result = get_mips_symbol_other (other);
11070       break;
11071     case EM_IA_64:
11072       result = get_ia64_symbol_other (filedata, other);
11073       break;
11074     case EM_PPC64:
11075       result = get_ppc64_symbol_other (other);
11076       break;
11077     default:
11078       result = NULL;
11079       break;
11080     }
11081
11082   if (result)
11083     return result;
11084
11085   snprintf (buff, sizeof buff, _("<other>: %x"), other);
11086   return buff;
11087 }
11088
11089 static const char *
11090 get_symbol_index_type (Filedata * filedata, unsigned int type)
11091 {
11092   static char buff[32];
11093
11094   switch (type)
11095     {
11096     case SHN_UNDEF:     return "UND";
11097     case SHN_ABS:       return "ABS";
11098     case SHN_COMMON:    return "COM";
11099     default:
11100       if (type == SHN_IA_64_ANSI_COMMON
11101           && filedata->file_header.e_machine == EM_IA_64
11102           && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
11103         return "ANSI_COM";
11104       else if ((filedata->file_header.e_machine == EM_X86_64
11105                 || filedata->file_header.e_machine == EM_L1OM
11106                 || filedata->file_header.e_machine == EM_K1OM)
11107                && type == SHN_X86_64_LCOMMON)
11108         return "LARGE_COM";
11109       else if ((type == SHN_MIPS_SCOMMON
11110                 && filedata->file_header.e_machine == EM_MIPS)
11111                || (type == SHN_TIC6X_SCOMMON
11112                    && filedata->file_header.e_machine == EM_TI_C6000))
11113         return "SCOM";
11114       else if (type == SHN_MIPS_SUNDEFINED
11115                && filedata->file_header.e_machine == EM_MIPS)
11116         return "SUND";
11117       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
11118         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
11119       else if (type >= SHN_LOOS && type <= SHN_HIOS)
11120         sprintf (buff, "OS [0x%04x]", type & 0xffff);
11121       else if (type >= SHN_LORESERVE)
11122         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
11123       else if (type >= filedata->file_header.e_shnum)
11124         sprintf (buff, _("bad section index[%3d]"), type);
11125       else
11126         sprintf (buff, "%3d", type);
11127       break;
11128     }
11129
11130   return buff;
11131 }
11132
11133 static bfd_vma *
11134 get_dynamic_data (Filedata * filedata, bfd_size_type number, unsigned int ent_size)
11135 {
11136   unsigned char * e_data;
11137   bfd_vma * i_data;
11138
11139   /* If the size_t type is smaller than the bfd_size_type, eg because
11140      you are building a 32-bit tool on a 64-bit host, then make sure
11141      that when (number) is cast to (size_t) no information is lost.  */
11142   if (sizeof (size_t) < sizeof (bfd_size_type)
11143       && (bfd_size_type) ((size_t) number) != number)
11144     {
11145       error (_("Size truncation prevents reading %s elements of size %u\n"),
11146              bfd_vmatoa ("u", number), ent_size);
11147       return NULL;
11148     }
11149
11150   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
11151      attempting to allocate memory when the read is bound to fail.  */
11152   if (ent_size * number > filedata->file_size)
11153     {
11154       error (_("Invalid number of dynamic entries: %s\n"),
11155              bfd_vmatoa ("u", number));
11156       return NULL;
11157     }
11158
11159   e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
11160   if (e_data == NULL)
11161     {
11162       error (_("Out of memory reading %s dynamic entries\n"),
11163              bfd_vmatoa ("u", number));
11164       return NULL;
11165     }
11166
11167   if (fread (e_data, ent_size, (size_t) number, filedata->handle) != number)
11168     {
11169       error (_("Unable to read in %s bytes of dynamic data\n"),
11170              bfd_vmatoa ("u", number * ent_size));
11171       free (e_data);
11172       return NULL;
11173     }
11174
11175   i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
11176   if (i_data == NULL)
11177     {
11178       error (_("Out of memory allocating space for %s dynamic entries\n"),
11179              bfd_vmatoa ("u", number));
11180       free (e_data);
11181       return NULL;
11182     }
11183
11184   while (number--)
11185     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
11186
11187   free (e_data);
11188
11189   return i_data;
11190 }
11191
11192 static void
11193 print_dynamic_symbol (Filedata * filedata, bfd_vma si, unsigned long hn)
11194 {
11195   Elf_Internal_Sym * psym;
11196   int n;
11197
11198   n = print_vma (si, DEC_5);
11199   if (n < 5)
11200     fputs (&"     "[n], stdout);
11201   printf (" %3lu: ", hn);
11202
11203   if (dynamic_symbols == NULL || si >= num_dynamic_syms)
11204     {
11205       printf (_("<No info available for dynamic symbol number %lu>\n"),
11206               (unsigned long) si);
11207       return;
11208     }
11209
11210   psym = dynamic_symbols + si;
11211   print_vma (psym->st_value, LONG_HEX);
11212   putchar (' ');
11213   print_vma (psym->st_size, DEC_5);
11214
11215   printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11216   printf (" %-6s",  get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11217
11218   if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11219     printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11220   else
11221     {
11222       unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11223
11224       printf (" %-7s",  get_symbol_visibility (vis));
11225       /* Check to see if any other bits in the st_other field are set.
11226          Note - displaying this information disrupts the layout of the
11227          table being generated, but for the moment this case is very
11228          rare.  */
11229       if (psym->st_other ^ vis)
11230         printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11231     }
11232
11233   printf (" %3.3s ", get_symbol_index_type (filedata, psym->st_shndx));
11234   if (VALID_DYNAMIC_NAME (psym->st_name))
11235     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11236   else
11237     printf (_(" <corrupt: %14ld>"), psym->st_name);
11238   putchar ('\n');
11239 }
11240
11241 static const char *
11242 get_symbol_version_string (Filedata *                   filedata,
11243                            bfd_boolean                  is_dynsym,
11244                            const char *                 strtab,
11245                            unsigned long int            strtab_size,
11246                            unsigned int                 si,
11247                            Elf_Internal_Sym *           psym,
11248                            enum versioned_symbol_info * sym_info,
11249                            unsigned short *             vna_other)
11250 {
11251   unsigned char data[2];
11252   unsigned short vers_data;
11253   unsigned long offset;
11254
11255   if (!is_dynsym
11256       || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
11257     return NULL;
11258
11259   offset = offset_from_vma (filedata, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
11260                             sizeof data + si * sizeof (vers_data));
11261
11262   if (get_data (&data, filedata, offset + si * sizeof (vers_data),
11263                 sizeof (data), 1, _("version data")) == NULL)
11264     return NULL;
11265
11266   vers_data = byte_get (data, 2);
11267
11268   if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data == 0)
11269     return NULL;
11270
11271   /* Usually we'd only see verdef for defined symbols, and verneed for
11272      undefined symbols.  However, symbols defined by the linker in
11273      .dynbss for variables copied from a shared library in order to
11274      avoid text relocations are defined yet have verneed.  We could
11275      use a heuristic to detect the special case, for example, check
11276      for verneed first on symbols defined in SHT_NOBITS sections, but
11277      it is simpler and more reliable to just look for both verdef and
11278      verneed.  .dynbss might not be mapped to a SHT_NOBITS section.  */
11279
11280   if (psym->st_shndx != SHN_UNDEF
11281       && vers_data != 0x8001
11282       && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
11283     {
11284       Elf_Internal_Verdef ivd;
11285       Elf_Internal_Verdaux ivda;
11286       Elf_External_Verdaux evda;
11287       unsigned long off;
11288
11289       off = offset_from_vma (filedata,
11290                              version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
11291                              sizeof (Elf_External_Verdef));
11292
11293       do
11294         {
11295           Elf_External_Verdef evd;
11296
11297           if (get_data (&evd, filedata, off, sizeof (evd), 1,
11298                         _("version def")) == NULL)
11299             {
11300               ivd.vd_ndx = 0;
11301               ivd.vd_aux = 0;
11302               ivd.vd_next = 0;
11303               ivd.vd_flags = 0;
11304             }
11305           else
11306             {
11307               ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
11308               ivd.vd_aux = BYTE_GET (evd.vd_aux);
11309               ivd.vd_next = BYTE_GET (evd.vd_next);
11310               ivd.vd_flags = BYTE_GET (evd.vd_flags);
11311             }
11312
11313           off += ivd.vd_next;
11314         }
11315       while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
11316
11317       if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
11318         {
11319           if (ivd.vd_ndx == 1 && ivd.vd_flags == VER_FLG_BASE) 
11320             return NULL;
11321
11322           off -= ivd.vd_next;
11323           off += ivd.vd_aux;
11324
11325           if (get_data (&evda, filedata, off, sizeof (evda), 1,
11326                         _("version def aux")) != NULL)
11327             {
11328               ivda.vda_name = BYTE_GET (evda.vda_name);
11329
11330               if (psym->st_name != ivda.vda_name)
11331                 {
11332                   *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
11333                                ? symbol_hidden : symbol_public);
11334                   return (ivda.vda_name < strtab_size
11335                           ? strtab + ivda.vda_name : _("<corrupt>"));
11336                 }
11337             }
11338         }
11339     }
11340
11341   if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
11342     {
11343       Elf_External_Verneed evn;
11344       Elf_Internal_Verneed ivn;
11345       Elf_Internal_Vernaux ivna;
11346
11347       offset = offset_from_vma (filedata,
11348                                 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
11349                                 sizeof evn);
11350       do
11351         {
11352           unsigned long vna_off;
11353
11354           if (get_data (&evn, filedata, offset, sizeof (evn), 1,
11355                         _("version need")) == NULL)
11356             {
11357               ivna.vna_next = 0;
11358               ivna.vna_other = 0;
11359               ivna.vna_name = 0;
11360               break;
11361             }
11362
11363           ivn.vn_aux  = BYTE_GET (evn.vn_aux);
11364           ivn.vn_next = BYTE_GET (evn.vn_next);
11365
11366           vna_off = offset + ivn.vn_aux;
11367
11368           do
11369             {
11370               Elf_External_Vernaux evna;
11371
11372               if (get_data (&evna, filedata, vna_off, sizeof (evna), 1,
11373                             _("version need aux (3)")) == NULL)
11374                 {
11375                   ivna.vna_next = 0;
11376                   ivna.vna_other = 0;
11377                   ivna.vna_name = 0;
11378                 }
11379               else
11380                 {
11381                   ivna.vna_other = BYTE_GET (evna.vna_other);
11382                   ivna.vna_next  = BYTE_GET (evna.vna_next);
11383                   ivna.vna_name  = BYTE_GET (evna.vna_name);
11384                 }
11385
11386               vna_off += ivna.vna_next;
11387             }
11388           while (ivna.vna_other != vers_data && ivna.vna_next != 0);
11389
11390           if (ivna.vna_other == vers_data)
11391             break;
11392
11393           offset += ivn.vn_next;
11394         }
11395       while (ivn.vn_next != 0);
11396
11397       if (ivna.vna_other == vers_data)
11398         {
11399           *sym_info = symbol_undefined;
11400           *vna_other = ivna.vna_other;
11401           return (ivna.vna_name < strtab_size
11402                   ? strtab + ivna.vna_name : _("<corrupt>"));
11403         }
11404     }
11405   return NULL;
11406 }
11407
11408 /* Dump the symbol table.  */
11409 static bfd_boolean
11410 process_symbol_table (Filedata * filedata)
11411 {
11412   Elf_Internal_Shdr * section;
11413   bfd_size_type nbuckets = 0;
11414   bfd_size_type nchains = 0;
11415   bfd_vma * buckets = NULL;
11416   bfd_vma * chains = NULL;
11417   bfd_vma ngnubuckets = 0;
11418   bfd_vma * gnubuckets = NULL;
11419   bfd_vma * gnuchains = NULL;
11420   bfd_vma gnusymidx = 0;
11421   bfd_size_type ngnuchains = 0;
11422
11423   if (!do_syms && !do_dyn_syms && !do_histogram)
11424     return TRUE;
11425
11426   if (dynamic_info[DT_HASH]
11427       && (do_histogram
11428           || (do_using_dynamic
11429               && !do_dyn_syms
11430               && dynamic_strings != NULL)))
11431     {
11432       unsigned char nb[8];
11433       unsigned char nc[8];
11434       unsigned int hash_ent_size = 4;
11435
11436       if ((filedata->file_header.e_machine == EM_ALPHA
11437            || filedata->file_header.e_machine == EM_S390
11438            || filedata->file_header.e_machine == EM_S390_OLD)
11439           && filedata->file_header.e_ident[EI_CLASS] == ELFCLASS64)
11440         hash_ent_size = 8;
11441
11442       if (fseek (filedata->handle,
11443                  (archive_file_offset
11444                   + offset_from_vma (filedata, dynamic_info[DT_HASH],
11445                                      sizeof nb + sizeof nc)),
11446                  SEEK_SET))
11447         {
11448           error (_("Unable to seek to start of dynamic information\n"));
11449           goto no_hash;
11450         }
11451
11452       if (fread (nb, hash_ent_size, 1, filedata->handle) != 1)
11453         {
11454           error (_("Failed to read in number of buckets\n"));
11455           goto no_hash;
11456         }
11457
11458       if (fread (nc, hash_ent_size, 1, filedata->handle) != 1)
11459         {
11460           error (_("Failed to read in number of chains\n"));
11461           goto no_hash;
11462         }
11463
11464       nbuckets = byte_get (nb, hash_ent_size);
11465       nchains  = byte_get (nc, hash_ent_size);
11466
11467       buckets = get_dynamic_data (filedata, nbuckets, hash_ent_size);
11468       chains  = get_dynamic_data (filedata, nchains, hash_ent_size);
11469
11470     no_hash:
11471       if (buckets == NULL || chains == NULL)
11472         {
11473           if (do_using_dynamic)
11474             return FALSE;
11475           free (buckets);
11476           free (chains);
11477           buckets = NULL;
11478           chains = NULL;
11479           nbuckets = 0;
11480           nchains = 0;
11481         }
11482     }
11483
11484   if (dynamic_info_DT_GNU_HASH
11485       && (do_histogram
11486           || (do_using_dynamic
11487               && !do_dyn_syms
11488               && dynamic_strings != NULL)))
11489     {
11490       unsigned char nb[16];
11491       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11492       bfd_vma buckets_vma;
11493
11494       if (fseek (filedata->handle,
11495                  (archive_file_offset
11496                   + offset_from_vma (filedata, dynamic_info_DT_GNU_HASH,
11497                                      sizeof nb)),
11498                  SEEK_SET))
11499         {
11500           error (_("Unable to seek to start of dynamic information\n"));
11501           goto no_gnu_hash;
11502         }
11503
11504       if (fread (nb, 16, 1, filedata->handle) != 1)
11505         {
11506           error (_("Failed to read in number of buckets\n"));
11507           goto no_gnu_hash;
11508         }
11509
11510       ngnubuckets = byte_get (nb, 4);
11511       gnusymidx = byte_get (nb + 4, 4);
11512       bitmaskwords = byte_get (nb + 8, 4);
11513       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
11514       if (is_32bit_elf)
11515         buckets_vma += bitmaskwords * 4;
11516       else
11517         buckets_vma += bitmaskwords * 8;
11518
11519       if (fseek (filedata->handle,
11520                  (archive_file_offset
11521                   + offset_from_vma (filedata, buckets_vma, 4)),
11522                  SEEK_SET))
11523         {
11524           error (_("Unable to seek to start of dynamic information\n"));
11525           goto no_gnu_hash;
11526         }
11527
11528       gnubuckets = get_dynamic_data (filedata, ngnubuckets, 4);
11529
11530       if (gnubuckets == NULL)
11531         goto no_gnu_hash;
11532
11533       for (i = 0; i < ngnubuckets; i++)
11534         if (gnubuckets[i] != 0)
11535           {
11536             if (gnubuckets[i] < gnusymidx)
11537               return FALSE;
11538
11539             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11540               maxchain = gnubuckets[i];
11541           }
11542
11543       if (maxchain == 0xffffffff)
11544         goto no_gnu_hash;
11545
11546       maxchain -= gnusymidx;
11547
11548       if (fseek (filedata->handle,
11549                  (archive_file_offset
11550                   + offset_from_vma (filedata, buckets_vma
11551                                            + 4 * (ngnubuckets + maxchain), 4)),
11552                  SEEK_SET))
11553         {
11554           error (_("Unable to seek to start of dynamic information\n"));
11555           goto no_gnu_hash;
11556         }
11557
11558       do
11559         {
11560           if (fread (nb, 4, 1, filedata->handle) != 1)
11561             {
11562               error (_("Failed to determine last chain length\n"));
11563               goto no_gnu_hash;
11564             }
11565
11566           if (maxchain + 1 == 0)
11567             goto no_gnu_hash;
11568
11569           ++maxchain;
11570         }
11571       while ((byte_get (nb, 4) & 1) == 0);
11572
11573       if (fseek (filedata->handle,
11574                  (archive_file_offset
11575                   + offset_from_vma (filedata, buckets_vma + 4 * ngnubuckets, 4)),
11576                  SEEK_SET))
11577         {
11578           error (_("Unable to seek to start of dynamic information\n"));
11579           goto no_gnu_hash;
11580         }
11581
11582       gnuchains = get_dynamic_data (filedata, maxchain, 4);
11583       ngnuchains = maxchain;
11584
11585     no_gnu_hash:
11586       if (gnuchains == NULL)
11587         {
11588           free (gnubuckets);
11589           gnubuckets = NULL;
11590           ngnubuckets = 0;
11591           if (do_using_dynamic)
11592             return FALSE;
11593         }
11594     }
11595
11596   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11597       && do_syms
11598       && do_using_dynamic
11599       && dynamic_strings != NULL
11600       && dynamic_symbols != NULL)
11601     {
11602       unsigned long hn;
11603
11604       if (dynamic_info[DT_HASH])
11605         {
11606           bfd_vma si;
11607           char *visited;
11608
11609           printf (_("\nSymbol table for image:\n"));
11610           if (is_32bit_elf)
11611             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11612           else
11613             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11614
11615           visited = xcmalloc (nchains, 1);
11616           memset (visited, 0, nchains);
11617           for (hn = 0; hn < nbuckets; hn++)
11618             {
11619               for (si = buckets[hn]; si > 0; si = chains[si])
11620                 {
11621                   print_dynamic_symbol (filedata, si, hn);
11622                   if (si >= nchains || visited[si])
11623                     {
11624                       error (_("histogram chain is corrupt\n"));
11625                       break;
11626                     }
11627                   visited[si] = 1;
11628                 }
11629             }
11630           free (visited);
11631         }
11632
11633       if (dynamic_info_DT_GNU_HASH)
11634         {
11635           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11636           if (is_32bit_elf)
11637             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11638           else
11639             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11640
11641           for (hn = 0; hn < ngnubuckets; ++hn)
11642             if (gnubuckets[hn] != 0)
11643               {
11644                 bfd_vma si = gnubuckets[hn];
11645                 bfd_vma off = si - gnusymidx;
11646
11647                 do
11648                   {
11649                     print_dynamic_symbol (filedata, si, hn);
11650                     si++;
11651                   }
11652                 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11653               }
11654         }
11655     }
11656   else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11657            && filedata->section_headers != NULL)
11658     {
11659       unsigned int i;
11660
11661       for (i = 0, section = filedata->section_headers;
11662            i < filedata->file_header.e_shnum;
11663            i++, section++)
11664         {
11665           unsigned int si;
11666           char * strtab = NULL;
11667           unsigned long int strtab_size = 0;
11668           Elf_Internal_Sym * symtab;
11669           Elf_Internal_Sym * psym;
11670           unsigned long num_syms;
11671
11672           if ((section->sh_type != SHT_SYMTAB
11673                && section->sh_type != SHT_DYNSYM)
11674               || (!do_syms
11675                   && section->sh_type == SHT_SYMTAB))
11676             continue;
11677
11678           if (section->sh_entsize == 0)
11679             {
11680               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11681                       printable_section_name (filedata, section));
11682               continue;
11683             }
11684
11685           num_syms = section->sh_size / section->sh_entsize;
11686           printf (ngettext ("\nSymbol table '%s' contains %lu entry:\n",
11687                             "\nSymbol table '%s' contains %lu entries:\n",
11688                             num_syms),
11689                   printable_section_name (filedata, section),
11690                   num_syms);
11691
11692           if (is_32bit_elf)
11693             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
11694           else
11695             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
11696
11697           symtab = GET_ELF_SYMBOLS (filedata, section, & num_syms);
11698           if (symtab == NULL)
11699             continue;
11700
11701           if (section->sh_link == filedata->file_header.e_shstrndx)
11702             {
11703               strtab = filedata->string_table;
11704               strtab_size = filedata->string_table_length;
11705             }
11706           else if (section->sh_link < filedata->file_header.e_shnum)
11707             {
11708               Elf_Internal_Shdr * string_sec;
11709
11710               string_sec = filedata->section_headers + section->sh_link;
11711
11712               strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset,
11713                                           1, string_sec->sh_size,
11714                                           _("string table"));
11715               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11716             }
11717
11718           for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11719             {
11720               const char *version_string;
11721               enum versioned_symbol_info sym_info;
11722               unsigned short vna_other;
11723
11724               printf ("%6d: ", si);
11725               print_vma (psym->st_value, LONG_HEX);
11726               putchar (' ');
11727               print_vma (psym->st_size, DEC_5);
11728               printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11729               printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11730               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11731                 printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11732               else
11733                 {
11734                   unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11735
11736                   printf (" %-7s", get_symbol_visibility (vis));
11737                   /* Check to see if any other bits in the st_other field are set.
11738                      Note - displaying this information disrupts the layout of the
11739                      table being generated, but for the moment this case is very rare.  */
11740                   if (psym->st_other ^ vis)
11741                     printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11742                 }
11743               printf (" %4s ", get_symbol_index_type (filedata, psym->st_shndx));
11744               print_symbol (25, psym->st_name < strtab_size
11745                             ? strtab + psym->st_name : _("<corrupt>"));
11746
11747               version_string
11748                 = get_symbol_version_string (filedata,
11749                                              section->sh_type == SHT_DYNSYM,
11750                                              strtab, strtab_size, si,
11751                                              psym, &sym_info, &vna_other);
11752               if (version_string)
11753                 {
11754                   if (sym_info == symbol_undefined)
11755                     printf ("@%s (%d)", version_string, vna_other);
11756                   else
11757                     printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11758                             version_string);
11759                 }
11760
11761               putchar ('\n');
11762
11763               if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
11764                   && si >= section->sh_info
11765                   /* Irix 5 and 6 MIPS binaries are known to ignore this requirement.  */
11766                   && filedata->file_header.e_machine != EM_MIPS
11767                   /* Solaris binaries have been found to violate this requirement as
11768                      well.  Not sure if this is a bug or an ABI requirement.  */
11769                   && filedata->file_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
11770                 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11771                       si, printable_section_name (filedata, section), section->sh_info);
11772             }
11773
11774           free (symtab);
11775           if (strtab != filedata->string_table)
11776             free (strtab);
11777         }
11778     }
11779   else if (do_syms)
11780     printf
11781       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11782
11783   if (do_histogram && buckets != NULL)
11784     {
11785       unsigned long * lengths;
11786       unsigned long * counts;
11787       unsigned long hn;
11788       bfd_vma si;
11789       unsigned long maxlength = 0;
11790       unsigned long nzero_counts = 0;
11791       unsigned long nsyms = 0;
11792       char *visited;
11793
11794       printf (ngettext ("\nHistogram for bucket list length "
11795                         "(total of %lu bucket):\n",
11796                         "\nHistogram for bucket list length "
11797                         "(total of %lu buckets):\n",
11798                         (unsigned long) nbuckets),
11799               (unsigned long) nbuckets);
11800
11801       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11802       if (lengths == NULL)
11803         {
11804           error (_("Out of memory allocating space for histogram buckets\n"));
11805           return FALSE;
11806         }
11807       visited = xcmalloc (nchains, 1);
11808       memset (visited, 0, nchains);
11809
11810       printf (_(" Length  Number     %% of total  Coverage\n"));
11811       for (hn = 0; hn < nbuckets; ++hn)
11812         {
11813           for (si = buckets[hn]; si > 0; si = chains[si])
11814             {
11815               ++nsyms;
11816               if (maxlength < ++lengths[hn])
11817                 ++maxlength;
11818               if (si >= nchains || visited[si])
11819                 {
11820                   error (_("histogram chain is corrupt\n"));
11821                   break;
11822                 }
11823               visited[si] = 1;
11824             }
11825         }
11826       free (visited);
11827
11828       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11829       if (counts == NULL)
11830         {
11831           free (lengths);
11832           error (_("Out of memory allocating space for histogram counts\n"));
11833           return FALSE;
11834         }
11835
11836       for (hn = 0; hn < nbuckets; ++hn)
11837         ++counts[lengths[hn]];
11838
11839       if (nbuckets > 0)
11840         {
11841           unsigned long i;
11842           printf ("      0  %-10lu (%5.1f%%)\n",
11843                   counts[0], (counts[0] * 100.0) / nbuckets);
11844           for (i = 1; i <= maxlength; ++i)
11845             {
11846               nzero_counts += counts[i] * i;
11847               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
11848                       i, counts[i], (counts[i] * 100.0) / nbuckets,
11849                       (nzero_counts * 100.0) / nsyms);
11850             }
11851         }
11852
11853       free (counts);
11854       free (lengths);
11855     }
11856
11857   if (buckets != NULL)
11858     {
11859       free (buckets);
11860       free (chains);
11861     }
11862
11863   if (do_histogram && gnubuckets != NULL)
11864     {
11865       unsigned long * lengths;
11866       unsigned long * counts;
11867       unsigned long hn;
11868       unsigned long maxlength = 0;
11869       unsigned long nzero_counts = 0;
11870       unsigned long nsyms = 0;
11871
11872       printf (ngettext ("\nHistogram for `.gnu.hash' bucket list length "
11873                         "(total of %lu bucket):\n",
11874                         "\nHistogram for `.gnu.hash' bucket list length "
11875                         "(total of %lu buckets):\n",
11876                         (unsigned long) ngnubuckets),
11877               (unsigned long) ngnubuckets);
11878
11879       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
11880       if (lengths == NULL)
11881         {
11882           error (_("Out of memory allocating space for gnu histogram buckets\n"));
11883           return FALSE;
11884         }
11885
11886       printf (_(" Length  Number     %% of total  Coverage\n"));
11887
11888       for (hn = 0; hn < ngnubuckets; ++hn)
11889         if (gnubuckets[hn] != 0)
11890           {
11891             bfd_vma off, length = 1;
11892
11893             for (off = gnubuckets[hn] - gnusymidx;
11894                  /* PR 17531 file: 010-77222-0.004.  */
11895                  off < ngnuchains && (gnuchains[off] & 1) == 0;
11896                  ++off)
11897               ++length;
11898             lengths[hn] = length;
11899             if (length > maxlength)
11900               maxlength = length;
11901             nsyms += length;
11902           }
11903
11904       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11905       if (counts == NULL)
11906         {
11907           free (lengths);
11908           error (_("Out of memory allocating space for gnu histogram counts\n"));
11909           return FALSE;
11910         }
11911
11912       for (hn = 0; hn < ngnubuckets; ++hn)
11913         ++counts[lengths[hn]];
11914
11915       if (ngnubuckets > 0)
11916         {
11917           unsigned long j;
11918           printf ("      0  %-10lu (%5.1f%%)\n",
11919                   counts[0], (counts[0] * 100.0) / ngnubuckets);
11920           for (j = 1; j <= maxlength; ++j)
11921             {
11922               nzero_counts += counts[j] * j;
11923               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
11924                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11925                       (nzero_counts * 100.0) / nsyms);
11926             }
11927         }
11928
11929       free (counts);
11930       free (lengths);
11931       free (gnubuckets);
11932       free (gnuchains);
11933     }
11934
11935   return TRUE;
11936 }
11937
11938 static bfd_boolean
11939 process_syminfo (Filedata * filedata ATTRIBUTE_UNUSED)
11940 {
11941   unsigned int i;
11942
11943   if (dynamic_syminfo == NULL
11944       || !do_dynamic)
11945     /* No syminfo, this is ok.  */
11946     return TRUE;
11947
11948   /* There better should be a dynamic symbol section.  */
11949   if (dynamic_symbols == NULL || dynamic_strings == NULL)
11950     return FALSE;
11951
11952   if (dynamic_addr)
11953     printf (ngettext ("\nDynamic info segment at offset 0x%lx "
11954                       "contains %d entry:\n",
11955                       "\nDynamic info segment at offset 0x%lx "
11956                       "contains %d entries:\n",
11957                       dynamic_syminfo_nent),
11958             dynamic_syminfo_offset, dynamic_syminfo_nent);
11959
11960   printf (_(" Num: Name                           BoundTo     Flags\n"));
11961   for (i = 0; i < dynamic_syminfo_nent; ++i)
11962     {
11963       unsigned short int flags = dynamic_syminfo[i].si_flags;
11964
11965       printf ("%4d: ", i);
11966       if (i >= num_dynamic_syms)
11967         printf (_("<corrupt index>"));
11968       else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
11969         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11970       else
11971         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
11972       putchar (' ');
11973
11974       switch (dynamic_syminfo[i].si_boundto)
11975         {
11976         case SYMINFO_BT_SELF:
11977           fputs ("SELF       ", stdout);
11978           break;
11979         case SYMINFO_BT_PARENT:
11980           fputs ("PARENT     ", stdout);
11981           break;
11982         default:
11983           if (dynamic_syminfo[i].si_boundto > 0
11984               && dynamic_syminfo[i].si_boundto < dynamic_nent
11985               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
11986             {
11987               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
11988               putchar (' ' );
11989             }
11990           else
11991             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11992           break;
11993         }
11994
11995       if (flags & SYMINFO_FLG_DIRECT)
11996         printf (" DIRECT");
11997       if (flags & SYMINFO_FLG_PASSTHRU)
11998         printf (" PASSTHRU");
11999       if (flags & SYMINFO_FLG_COPY)
12000         printf (" COPY");
12001       if (flags & SYMINFO_FLG_LAZYLOAD)
12002         printf (" LAZYLOAD");
12003
12004       puts ("");
12005     }
12006
12007   return TRUE;
12008 }
12009
12010 #define IN_RANGE(START,END,ADDR,OFF)            \
12011   (((ADDR) >= (START)) && ((ADDR) + (OFF) < (END)))
12012
12013 /* Check to see if the given reloc needs to be handled in a target specific
12014    manner.  If so then process the reloc and return TRUE otherwise return
12015    FALSE.
12016
12017    If called with reloc == NULL, then this is a signal that reloc processing
12018    for the current section has finished, and any saved state should be
12019    discarded.  */
12020
12021 static bfd_boolean
12022 target_specific_reloc_handling (Filedata *           filedata,
12023                                 Elf_Internal_Rela *  reloc,
12024                                 unsigned char *      start,
12025                                 unsigned char *      end,
12026                                 Elf_Internal_Sym *   symtab,
12027                                 unsigned long        num_syms)
12028 {
12029   unsigned int reloc_type = 0;
12030   unsigned long sym_index = 0;
12031
12032   if (reloc)
12033     {
12034       reloc_type = get_reloc_type (filedata, reloc->r_info);
12035       sym_index = get_reloc_symindex (reloc->r_info);
12036     }
12037
12038   switch (filedata->file_header.e_machine)
12039     {
12040     case EM_MSP430:
12041     case EM_MSP430_OLD:
12042       {
12043         static Elf_Internal_Sym * saved_sym = NULL;
12044
12045         if (reloc == NULL)
12046           {
12047             saved_sym = NULL;
12048             return TRUE;
12049           }
12050
12051         switch (reloc_type)
12052           {
12053           case 10: /* R_MSP430_SYM_DIFF */
12054             if (uses_msp430x_relocs (filedata))
12055               break;
12056             /* Fall through.  */
12057           case 21: /* R_MSP430X_SYM_DIFF */
12058             /* PR 21139.  */
12059             if (sym_index >= num_syms)
12060               error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
12061                      sym_index);
12062             else
12063               saved_sym = symtab + sym_index;
12064             return TRUE;
12065
12066           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
12067           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
12068             goto handle_sym_diff;
12069
12070           case 5: /* R_MSP430_16_BYTE */
12071           case 9: /* R_MSP430_8 */
12072             if (uses_msp430x_relocs (filedata))
12073               break;
12074             goto handle_sym_diff;
12075
12076           case 2: /* R_MSP430_ABS16 */
12077           case 15: /* R_MSP430X_ABS16 */
12078             if (! uses_msp430x_relocs (filedata))
12079               break;
12080             goto handle_sym_diff;
12081
12082           handle_sym_diff:
12083             if (saved_sym != NULL)
12084               {
12085                 int reloc_size = reloc_type == 1 ? 4 : 2;
12086                 bfd_vma value;
12087
12088                 if (sym_index >= num_syms)
12089                   error (_("MSP430 reloc contains invalid symbol index %lu\n"),
12090                          sym_index);
12091                 else
12092                   {
12093                     value = reloc->r_addend + (symtab[sym_index].st_value
12094                                                - saved_sym->st_value);
12095
12096                     if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12097                       byte_put (start + reloc->r_offset, value, reloc_size);
12098                     else
12099                       /* PR 21137 */
12100                       error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
12101                              (long) reloc->r_offset);
12102                   }
12103
12104                 saved_sym = NULL;
12105                 return TRUE;
12106               }
12107             break;
12108
12109           default:
12110             if (saved_sym != NULL)
12111               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
12112             break;
12113           }
12114         break;
12115       }
12116
12117     case EM_MN10300:
12118     case EM_CYGNUS_MN10300:
12119       {
12120         static Elf_Internal_Sym * saved_sym = NULL;
12121
12122         if (reloc == NULL)
12123           {
12124             saved_sym = NULL;
12125             return TRUE;
12126           }
12127
12128         switch (reloc_type)
12129           {
12130           case 34: /* R_MN10300_ALIGN */
12131             return TRUE;
12132           case 33: /* R_MN10300_SYM_DIFF */
12133             if (sym_index >= num_syms)
12134               error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
12135                      sym_index);
12136             else
12137               saved_sym = symtab + sym_index;
12138             return TRUE;
12139
12140           case 1: /* R_MN10300_32 */
12141           case 2: /* R_MN10300_16 */
12142             if (saved_sym != NULL)
12143               {
12144                 int reloc_size = reloc_type == 1 ? 4 : 2;
12145                 bfd_vma value;
12146
12147                 if (sym_index >= num_syms)
12148                   error (_("MN10300 reloc contains invalid symbol index %lu\n"),
12149                          sym_index);
12150                 else
12151                   {
12152                     value = reloc->r_addend + (symtab[sym_index].st_value
12153                                                - saved_sym->st_value);
12154
12155                     if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12156                       byte_put (start + reloc->r_offset, value, reloc_size);
12157                     else
12158                       error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
12159                              (long) reloc->r_offset);
12160                   }
12161
12162                 saved_sym = NULL;
12163                 return TRUE;
12164               }
12165             break;
12166           default:
12167             if (saved_sym != NULL)
12168               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
12169             break;
12170           }
12171         break;
12172       }
12173
12174     case EM_RL78:
12175       {
12176         static bfd_vma saved_sym1 = 0;
12177         static bfd_vma saved_sym2 = 0;
12178         static bfd_vma value;
12179
12180         if (reloc == NULL)
12181           {
12182             saved_sym1 = saved_sym2 = 0;
12183             return TRUE;
12184           }
12185
12186         switch (reloc_type)
12187           {
12188           case 0x80: /* R_RL78_SYM.  */
12189             saved_sym1 = saved_sym2;
12190             if (sym_index >= num_syms)
12191               error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
12192                      sym_index);
12193             else
12194               {
12195                 saved_sym2 = symtab[sym_index].st_value;
12196                 saved_sym2 += reloc->r_addend;
12197               }
12198             return TRUE;
12199
12200           case 0x83: /* R_RL78_OPsub.  */
12201             value = saved_sym1 - saved_sym2;
12202             saved_sym2 = saved_sym1 = 0;
12203             return TRUE;
12204             break;
12205
12206           case 0x41: /* R_RL78_ABS32.  */
12207             if (IN_RANGE (start, end, start + reloc->r_offset, 4))
12208               byte_put (start + reloc->r_offset, value, 4);
12209             else
12210               error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12211                      (long) reloc->r_offset);
12212             value = 0;
12213             return TRUE;
12214
12215           case 0x43: /* R_RL78_ABS16.  */
12216             if (IN_RANGE (start, end, start + reloc->r_offset, 2))
12217               byte_put (start + reloc->r_offset, value, 2);
12218             else
12219               error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12220                      (long) reloc->r_offset);
12221             value = 0;
12222             return TRUE;
12223
12224           default:
12225             break;
12226           }
12227         break;
12228       }
12229     }
12230
12231   return FALSE;
12232 }
12233
12234 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
12235    DWARF debug sections.  This is a target specific test.  Note - we do not
12236    go through the whole including-target-headers-multiple-times route, (as
12237    we have already done with <elf/h8.h>) because this would become very
12238    messy and even then this function would have to contain target specific
12239    information (the names of the relocs instead of their numeric values).
12240    FIXME: This is not the correct way to solve this problem.  The proper way
12241    is to have target specific reloc sizing and typing functions created by
12242    the reloc-macros.h header, in the same way that it already creates the
12243    reloc naming functions.  */
12244
12245 static bfd_boolean
12246 is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12247 {
12248   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12249   switch (filedata->file_header.e_machine)
12250     {
12251     case EM_386:
12252     case EM_IAMCU:
12253       return reloc_type == 1; /* R_386_32.  */
12254     case EM_68K:
12255       return reloc_type == 1; /* R_68K_32.  */
12256     case EM_860:
12257       return reloc_type == 1; /* R_860_32.  */
12258     case EM_960:
12259       return reloc_type == 2; /* R_960_32.  */
12260     case EM_AARCH64:
12261       return (reloc_type == 258
12262               || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
12263     case EM_ADAPTEVA_EPIPHANY:
12264       return reloc_type == 3;
12265     case EM_ALPHA:
12266       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
12267     case EM_ARC:
12268       return reloc_type == 1; /* R_ARC_32.  */
12269     case EM_ARC_COMPACT:
12270     case EM_ARC_COMPACT2:
12271       return reloc_type == 4; /* R_ARC_32.  */
12272     case EM_ARM:
12273       return reloc_type == 2; /* R_ARM_ABS32 */
12274     case EM_AVR_OLD:
12275     case EM_AVR:
12276       return reloc_type == 1;
12277     case EM_BLACKFIN:
12278       return reloc_type == 0x12; /* R_byte4_data.  */
12279     case EM_CRIS:
12280       return reloc_type == 3; /* R_CRIS_32.  */
12281     case EM_CR16:
12282       return reloc_type == 3; /* R_CR16_NUM32.  */
12283     case EM_CRX:
12284       return reloc_type == 15; /* R_CRX_NUM32.  */
12285     case EM_CYGNUS_FRV:
12286       return reloc_type == 1;
12287     case EM_CYGNUS_D10V:
12288     case EM_D10V:
12289       return reloc_type == 6; /* R_D10V_32.  */
12290     case EM_CYGNUS_D30V:
12291     case EM_D30V:
12292       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
12293     case EM_DLX:
12294       return reloc_type == 3; /* R_DLX_RELOC_32.  */
12295     case EM_CYGNUS_FR30:
12296     case EM_FR30:
12297       return reloc_type == 3; /* R_FR30_32.  */
12298     case EM_FT32:
12299       return reloc_type == 1; /* R_FT32_32.  */
12300     case EM_H8S:
12301     case EM_H8_300:
12302     case EM_H8_300H:
12303       return reloc_type == 1; /* R_H8_DIR32.  */
12304     case EM_IA_64:
12305       return (reloc_type == 0x64    /* R_IA64_SECREL32MSB.  */
12306               || reloc_type == 0x65 /* R_IA64_SECREL32LSB.  */
12307               || reloc_type == 0x24 /* R_IA64_DIR32MSB.  */
12308               || reloc_type == 0x25 /* R_IA64_DIR32LSB.  */);
12309     case EM_IP2K_OLD:
12310     case EM_IP2K:
12311       return reloc_type == 2; /* R_IP2K_32.  */
12312     case EM_IQ2000:
12313       return reloc_type == 2; /* R_IQ2000_32.  */
12314     case EM_LATTICEMICO32:
12315       return reloc_type == 3; /* R_LM32_32.  */
12316     case EM_M32C_OLD:
12317     case EM_M32C:
12318       return reloc_type == 3; /* R_M32C_32.  */
12319     case EM_M32R:
12320       return reloc_type == 34; /* R_M32R_32_RELA.  */
12321     case EM_68HC11:
12322     case EM_68HC12:
12323       return reloc_type == 6; /* R_M68HC11_32.  */
12324     case EM_S12Z:
12325       return reloc_type == 6; /* R_S12Z_EXT32.  */
12326     case EM_MCORE:
12327       return reloc_type == 1; /* R_MCORE_ADDR32.  */
12328     case EM_CYGNUS_MEP:
12329       return reloc_type == 4; /* R_MEP_32.  */
12330     case EM_METAG:
12331       return reloc_type == 2; /* R_METAG_ADDR32.  */
12332     case EM_MICROBLAZE:
12333       return reloc_type == 1; /* R_MICROBLAZE_32.  */
12334     case EM_MIPS:
12335       return reloc_type == 2; /* R_MIPS_32.  */
12336     case EM_MMIX:
12337       return reloc_type == 4; /* R_MMIX_32.  */
12338     case EM_CYGNUS_MN10200:
12339     case EM_MN10200:
12340       return reloc_type == 1; /* R_MN10200_32.  */
12341     case EM_CYGNUS_MN10300:
12342     case EM_MN10300:
12343       return reloc_type == 1; /* R_MN10300_32.  */
12344     case EM_MOXIE:
12345       return reloc_type == 1; /* R_MOXIE_32.  */
12346     case EM_MSP430_OLD:
12347     case EM_MSP430:
12348       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
12349     case EM_MT:
12350       return reloc_type == 2; /* R_MT_32.  */
12351     case EM_NDS32:
12352       return reloc_type == 20; /* R_NDS32_RELA.  */
12353     case EM_ALTERA_NIOS2:
12354       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
12355     case EM_NIOS32:
12356       return reloc_type == 1; /* R_NIOS_32.  */
12357     case EM_OR1K:
12358       return reloc_type == 1; /* R_OR1K_32.  */
12359     case EM_PARISC:
12360       return (reloc_type == 1 /* R_PARISC_DIR32.  */          
12361               || reloc_type == 2 /* R_PARISC_DIR21L.  */
12362               || reloc_type == 41); /* R_PARISC_SECREL32.  */
12363     case EM_PJ:
12364     case EM_PJ_OLD:
12365       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
12366     case EM_PPC64:
12367       return reloc_type == 1; /* R_PPC64_ADDR32.  */
12368     case EM_PPC:
12369       return reloc_type == 1; /* R_PPC_ADDR32.  */
12370     case EM_TI_PRU:
12371       return reloc_type == 11; /* R_PRU_BFD_RELOC_32.  */
12372     case EM_RISCV:
12373       return reloc_type == 1; /* R_RISCV_32.  */
12374     case EM_RL78:
12375       return reloc_type == 1; /* R_RL78_DIR32.  */
12376     case EM_RX:
12377       return reloc_type == 1; /* R_RX_DIR32.  */
12378     case EM_S370:
12379       return reloc_type == 1; /* R_I370_ADDR31.  */
12380     case EM_S390_OLD:
12381     case EM_S390:
12382       return reloc_type == 4; /* R_S390_32.  */
12383     case EM_SCORE:
12384       return reloc_type == 8; /* R_SCORE_ABS32.  */
12385     case EM_SH:
12386       return reloc_type == 1; /* R_SH_DIR32.  */
12387     case EM_SPARC32PLUS:
12388     case EM_SPARCV9:
12389     case EM_SPARC:
12390       return reloc_type == 3 /* R_SPARC_32.  */
12391         || reloc_type == 23; /* R_SPARC_UA32.  */
12392     case EM_SPU:
12393       return reloc_type == 6; /* R_SPU_ADDR32 */
12394     case EM_TI_C6000:
12395       return reloc_type == 1; /* R_C6000_ABS32.  */
12396     case EM_TILEGX:
12397       return reloc_type == 2; /* R_TILEGX_32.  */
12398     case EM_TILEPRO:
12399       return reloc_type == 1; /* R_TILEPRO_32.  */
12400     case EM_CYGNUS_V850:
12401     case EM_V850:
12402       return reloc_type == 6; /* R_V850_ABS32.  */
12403     case EM_V800:
12404       return reloc_type == 0x33; /* R_V810_WORD.  */
12405     case EM_VAX:
12406       return reloc_type == 1; /* R_VAX_32.  */
12407     case EM_VISIUM:
12408       return reloc_type == 3;  /* R_VISIUM_32. */
12409     case EM_WEBASSEMBLY:
12410       return reloc_type == 1;  /* R_WASM32_32.  */
12411     case EM_X86_64:
12412     case EM_L1OM:
12413     case EM_K1OM:
12414       return reloc_type == 10; /* R_X86_64_32.  */
12415     case EM_XC16X:
12416     case EM_C166:
12417       return reloc_type == 3; /* R_XC16C_ABS_32.  */
12418     case EM_XGATE:
12419       return reloc_type == 4; /* R_XGATE_32.  */
12420     case EM_XSTORMY16:
12421       return reloc_type == 1; /* R_XSTROMY16_32.  */
12422     case EM_XTENSA_OLD:
12423     case EM_XTENSA:
12424       return reloc_type == 1; /* R_XTENSA_32.  */
12425     default:
12426       {
12427         static unsigned int prev_warn = 0;
12428
12429         /* Avoid repeating the same warning multiple times.  */
12430         if (prev_warn != filedata->file_header.e_machine)
12431           error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
12432                  filedata->file_header.e_machine);
12433         prev_warn = filedata->file_header.e_machine;
12434         return FALSE;
12435       }
12436     }
12437 }
12438
12439 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12440    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
12441
12442 static bfd_boolean
12443 is_32bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12444 {
12445   switch (filedata->file_header.e_machine)
12446   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12447     {
12448     case EM_386:
12449     case EM_IAMCU:
12450       return reloc_type == 2;  /* R_386_PC32.  */
12451     case EM_68K:
12452       return reloc_type == 4;  /* R_68K_PC32.  */
12453     case EM_AARCH64:
12454       return reloc_type == 261; /* R_AARCH64_PREL32 */
12455     case EM_ADAPTEVA_EPIPHANY:
12456       return reloc_type == 6;
12457     case EM_ALPHA:
12458       return reloc_type == 10; /* R_ALPHA_SREL32.  */
12459     case EM_ARC_COMPACT:
12460     case EM_ARC_COMPACT2:
12461       return reloc_type == 49; /* R_ARC_32_PCREL.  */
12462     case EM_ARM:
12463       return reloc_type == 3;  /* R_ARM_REL32 */
12464     case EM_AVR_OLD:
12465     case EM_AVR:
12466       return reloc_type == 36; /* R_AVR_32_PCREL.  */
12467     case EM_MICROBLAZE:
12468       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
12469     case EM_OR1K:
12470       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
12471     case EM_PARISC:
12472       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
12473     case EM_PPC:
12474       return reloc_type == 26; /* R_PPC_REL32.  */
12475     case EM_PPC64:
12476       return reloc_type == 26; /* R_PPC64_REL32.  */
12477     case EM_S390_OLD:
12478     case EM_S390:
12479       return reloc_type == 5;  /* R_390_PC32.  */
12480     case EM_SH:
12481       return reloc_type == 2;  /* R_SH_REL32.  */
12482     case EM_SPARC32PLUS:
12483     case EM_SPARCV9:
12484     case EM_SPARC:
12485       return reloc_type == 6;  /* R_SPARC_DISP32.  */
12486     case EM_SPU:
12487       return reloc_type == 13; /* R_SPU_REL32.  */
12488     case EM_TILEGX:
12489       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
12490     case EM_TILEPRO:
12491       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
12492     case EM_VISIUM:
12493       return reloc_type == 6;  /* R_VISIUM_32_PCREL */
12494     case EM_X86_64:
12495     case EM_L1OM:
12496     case EM_K1OM:
12497       return reloc_type == 2;  /* R_X86_64_PC32.  */
12498     case EM_XTENSA_OLD:
12499     case EM_XTENSA:
12500       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
12501     default:
12502       /* Do not abort or issue an error message here.  Not all targets use
12503          pc-relative 32-bit relocs in their DWARF debug information and we
12504          have already tested for target coverage in is_32bit_abs_reloc.  A
12505          more helpful warning message will be generated by apply_relocations
12506          anyway, so just return.  */
12507       return FALSE;
12508     }
12509 }
12510
12511 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12512    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
12513
12514 static bfd_boolean
12515 is_64bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12516 {
12517   switch (filedata->file_header.e_machine)
12518     {
12519     case EM_AARCH64:
12520       return reloc_type == 257; /* R_AARCH64_ABS64.  */
12521     case EM_ALPHA:
12522       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
12523     case EM_IA_64:
12524       return (reloc_type == 0x26    /* R_IA64_DIR64MSB.  */
12525               || reloc_type == 0x27 /* R_IA64_DIR64LSB.  */);
12526     case EM_PARISC:
12527       return reloc_type == 80; /* R_PARISC_DIR64.  */
12528     case EM_PPC64:
12529       return reloc_type == 38; /* R_PPC64_ADDR64.  */
12530     case EM_RISCV:
12531       return reloc_type == 2; /* R_RISCV_64.  */
12532     case EM_SPARC32PLUS:
12533     case EM_SPARCV9:
12534     case EM_SPARC:
12535       return reloc_type == 32 /* R_SPARC_64.  */
12536         || reloc_type == 54; /* R_SPARC_UA64.  */
12537     case EM_X86_64:
12538     case EM_L1OM:
12539     case EM_K1OM:
12540       return reloc_type == 1; /* R_X86_64_64.  */
12541     case EM_S390_OLD:
12542     case EM_S390:
12543       return reloc_type == 22;  /* R_S390_64.  */
12544     case EM_TILEGX:
12545       return reloc_type == 1; /* R_TILEGX_64.  */
12546     case EM_MIPS:
12547       return reloc_type == 18;  /* R_MIPS_64.  */
12548     default:
12549       return FALSE;
12550     }
12551 }
12552
12553 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12554    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
12555
12556 static bfd_boolean
12557 is_64bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12558 {
12559   switch (filedata->file_header.e_machine)
12560     {
12561     case EM_AARCH64:
12562       return reloc_type == 260; /* R_AARCH64_PREL64.  */
12563     case EM_ALPHA:
12564       return reloc_type == 11; /* R_ALPHA_SREL64.  */
12565     case EM_IA_64:
12566       return (reloc_type == 0x4e    /* R_IA64_PCREL64MSB.  */
12567               || reloc_type == 0x4f /* R_IA64_PCREL64LSB.  */);
12568     case EM_PARISC:
12569       return reloc_type == 72; /* R_PARISC_PCREL64.  */
12570     case EM_PPC64:
12571       return reloc_type == 44; /* R_PPC64_REL64.  */
12572     case EM_SPARC32PLUS:
12573     case EM_SPARCV9:
12574     case EM_SPARC:
12575       return reloc_type == 46; /* R_SPARC_DISP64.  */
12576     case EM_X86_64:
12577     case EM_L1OM:
12578     case EM_K1OM:
12579       return reloc_type == 24; /* R_X86_64_PC64.  */
12580     case EM_S390_OLD:
12581     case EM_S390:
12582       return reloc_type == 23;  /* R_S390_PC64.  */
12583     case EM_TILEGX:
12584       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
12585     default:
12586       return FALSE;
12587     }
12588 }
12589
12590 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12591    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
12592
12593 static bfd_boolean
12594 is_24bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12595 {
12596   switch (filedata->file_header.e_machine)
12597     {
12598     case EM_CYGNUS_MN10200:
12599     case EM_MN10200:
12600       return reloc_type == 4; /* R_MN10200_24.  */
12601     case EM_FT32:
12602       return reloc_type == 5; /* R_FT32_20.  */
12603     default:
12604       return FALSE;
12605     }
12606 }
12607
12608 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12609    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
12610
12611 static bfd_boolean
12612 is_16bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12613 {
12614   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12615   switch (filedata->file_header.e_machine)
12616     {
12617     case EM_ARC:
12618     case EM_ARC_COMPACT:
12619     case EM_ARC_COMPACT2:
12620       return reloc_type == 2; /* R_ARC_16.  */
12621     case EM_ADAPTEVA_EPIPHANY:
12622       return reloc_type == 5;
12623     case EM_AVR_OLD:
12624     case EM_AVR:
12625       return reloc_type == 4; /* R_AVR_16.  */
12626     case EM_CYGNUS_D10V:
12627     case EM_D10V:
12628       return reloc_type == 3; /* R_D10V_16.  */
12629     case EM_FT32:
12630       return reloc_type == 2; /* R_FT32_16.  */
12631     case EM_H8S:
12632     case EM_H8_300:
12633     case EM_H8_300H:
12634       return reloc_type == R_H8_DIR16;
12635     case EM_IP2K_OLD:
12636     case EM_IP2K:
12637       return reloc_type == 1; /* R_IP2K_16.  */
12638     case EM_M32C_OLD:
12639     case EM_M32C:
12640       return reloc_type == 1; /* R_M32C_16 */
12641     case EM_CYGNUS_MN10200:
12642     case EM_MN10200:
12643       return reloc_type == 2; /* R_MN10200_16.  */
12644     case EM_CYGNUS_MN10300:
12645     case EM_MN10300:
12646       return reloc_type == 2; /* R_MN10300_16.  */
12647     case EM_MSP430:
12648       if (uses_msp430x_relocs (filedata))
12649         return reloc_type == 2; /* R_MSP430_ABS16.  */
12650       /* Fall through.  */
12651     case EM_MSP430_OLD:
12652       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
12653     case EM_NDS32:
12654       return reloc_type == 19; /* R_NDS32_RELA.  */
12655     case EM_ALTERA_NIOS2:
12656       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
12657     case EM_NIOS32:
12658       return reloc_type == 9; /* R_NIOS_16.  */
12659     case EM_OR1K:
12660       return reloc_type == 2; /* R_OR1K_16.  */
12661     case EM_RISCV:
12662       return reloc_type == 55; /* R_RISCV_SET16.  */
12663     case EM_TI_PRU:
12664       return reloc_type == 8; /* R_PRU_BFD_RELOC_16.  */
12665     case EM_TI_C6000:
12666       return reloc_type == 2; /* R_C6000_ABS16.  */
12667     case EM_VISIUM:
12668       return reloc_type == 2; /* R_VISIUM_16. */
12669     case EM_XC16X:
12670     case EM_C166:
12671       return reloc_type == 2; /* R_XC16C_ABS_16.  */
12672     case EM_XGATE:
12673       return reloc_type == 3; /* R_XGATE_16.  */
12674     default:
12675       return FALSE;
12676     }
12677 }
12678
12679 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12680    a 8-bit absolute RELA relocation used in DWARF debug sections.  */
12681
12682 static bfd_boolean
12683 is_8bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12684 {
12685   switch (filedata->file_header.e_machine)
12686     {
12687     case EM_RISCV:
12688       return reloc_type == 54; /* R_RISCV_SET8.  */
12689     default:
12690       return FALSE;
12691     }
12692 }
12693
12694 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12695    a 6-bit absolute RELA relocation used in DWARF debug sections.  */
12696
12697 static bfd_boolean
12698 is_6bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12699 {
12700   switch (filedata->file_header.e_machine)
12701     {
12702     case EM_RISCV:
12703       return reloc_type == 53; /* R_RISCV_SET6.  */
12704     default:
12705       return FALSE;
12706     }
12707 }
12708
12709 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12710    a 32-bit inplace add RELA relocation used in DWARF debug sections.  */
12711
12712 static bfd_boolean
12713 is_32bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12714 {
12715   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12716   switch (filedata->file_header.e_machine)
12717     {
12718     case EM_RISCV:
12719       return reloc_type == 35; /* R_RISCV_ADD32.  */
12720     default:
12721       return FALSE;
12722     }
12723 }
12724
12725 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12726    a 32-bit inplace sub RELA relocation used in DWARF debug sections.  */
12727
12728 static bfd_boolean
12729 is_32bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12730 {
12731   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12732   switch (filedata->file_header.e_machine)
12733     {
12734     case EM_RISCV:
12735       return reloc_type == 39; /* R_RISCV_SUB32.  */
12736     default:
12737       return FALSE;
12738     }
12739 }
12740
12741 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12742    a 64-bit inplace add RELA relocation used in DWARF debug sections.  */
12743
12744 static bfd_boolean
12745 is_64bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12746 {
12747   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12748   switch (filedata->file_header.e_machine)
12749     {
12750     case EM_RISCV:
12751       return reloc_type == 36; /* R_RISCV_ADD64.  */
12752     default:
12753       return FALSE;
12754     }
12755 }
12756
12757 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12758    a 64-bit inplace sub RELA relocation used in DWARF debug sections.  */
12759
12760 static bfd_boolean
12761 is_64bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12762 {
12763   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12764   switch (filedata->file_header.e_machine)
12765     {
12766     case EM_RISCV:
12767       return reloc_type == 40; /* R_RISCV_SUB64.  */
12768     default:
12769       return FALSE;
12770     }
12771 }
12772
12773 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12774    a 16-bit inplace add RELA relocation used in DWARF debug sections.  */
12775
12776 static bfd_boolean
12777 is_16bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12778 {
12779   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12780   switch (filedata->file_header.e_machine)
12781     {
12782     case EM_RISCV:
12783       return reloc_type == 34; /* R_RISCV_ADD16.  */
12784     default:
12785       return FALSE;
12786     }
12787 }
12788
12789 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12790    a 16-bit inplace sub RELA relocation used in DWARF debug sections.  */
12791
12792 static bfd_boolean
12793 is_16bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12794 {
12795   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12796   switch (filedata->file_header.e_machine)
12797     {
12798     case EM_RISCV:
12799       return reloc_type == 38; /* R_RISCV_SUB16.  */
12800     default:
12801       return FALSE;
12802     }
12803 }
12804
12805 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12806    a 8-bit inplace add RELA relocation used in DWARF debug sections.  */
12807
12808 static bfd_boolean
12809 is_8bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12810 {
12811   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12812   switch (filedata->file_header.e_machine)
12813     {
12814     case EM_RISCV:
12815       return reloc_type == 33; /* R_RISCV_ADD8.  */
12816     default:
12817       return FALSE;
12818     }
12819 }
12820
12821 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12822    a 8-bit inplace sub RELA relocation used in DWARF debug sections.  */
12823
12824 static bfd_boolean
12825 is_8bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12826 {
12827   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12828   switch (filedata->file_header.e_machine)
12829     {
12830     case EM_RISCV:
12831       return reloc_type == 37; /* R_RISCV_SUB8.  */
12832     default:
12833       return FALSE;
12834     }
12835 }
12836
12837 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12838    a 6-bit inplace sub RELA relocation used in DWARF debug sections.  */
12839
12840 static bfd_boolean
12841 is_6bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12842 {
12843   switch (filedata->file_header.e_machine)
12844     {
12845     case EM_RISCV:
12846       return reloc_type == 52; /* R_RISCV_SUB6.  */
12847     default:
12848       return FALSE;
12849     }
12850 }
12851
12852 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12853    relocation entries (possibly formerly used for SHT_GROUP sections).  */
12854
12855 static bfd_boolean
12856 is_none_reloc (Filedata * filedata, unsigned int reloc_type)
12857 {
12858   switch (filedata->file_header.e_machine)
12859     {
12860     case EM_386:     /* R_386_NONE.  */
12861     case EM_68K:     /* R_68K_NONE.  */
12862     case EM_ADAPTEVA_EPIPHANY:
12863     case EM_ALPHA:   /* R_ALPHA_NONE.  */
12864     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
12865     case EM_ARC:     /* R_ARC_NONE.  */
12866     case EM_ARC_COMPACT2: /* R_ARC_NONE.  */
12867     case EM_ARC_COMPACT: /* R_ARC_NONE.  */
12868     case EM_ARM:     /* R_ARM_NONE.  */
12869     case EM_C166:    /* R_XC16X_NONE.  */
12870     case EM_CRIS:    /* R_CRIS_NONE.  */
12871     case EM_FT32:    /* R_FT32_NONE.  */
12872     case EM_IA_64:   /* R_IA64_NONE.  */
12873     case EM_K1OM:    /* R_X86_64_NONE.  */
12874     case EM_L1OM:    /* R_X86_64_NONE.  */
12875     case EM_M32R:    /* R_M32R_NONE.  */
12876     case EM_MIPS:    /* R_MIPS_NONE.  */
12877     case EM_MN10300: /* R_MN10300_NONE.  */
12878     case EM_MOXIE:   /* R_MOXIE_NONE.  */
12879     case EM_NIOS32:  /* R_NIOS_NONE.  */
12880     case EM_OR1K:    /* R_OR1K_NONE. */
12881     case EM_PARISC:  /* R_PARISC_NONE.  */
12882     case EM_PPC64:   /* R_PPC64_NONE.  */
12883     case EM_PPC:     /* R_PPC_NONE.  */
12884     case EM_RISCV:   /* R_RISCV_NONE.  */
12885     case EM_S390:    /* R_390_NONE.  */
12886     case EM_S390_OLD:
12887     case EM_SH:      /* R_SH_NONE.  */
12888     case EM_SPARC32PLUS:
12889     case EM_SPARC:   /* R_SPARC_NONE.  */
12890     case EM_SPARCV9:
12891     case EM_TILEGX:  /* R_TILEGX_NONE.  */
12892     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
12893     case EM_TI_C6000:/* R_C6000_NONE.  */
12894     case EM_X86_64:  /* R_X86_64_NONE.  */
12895     case EM_XC16X:
12896     case EM_WEBASSEMBLY: /* R_WASM32_NONE.  */
12897       return reloc_type == 0;
12898
12899     case EM_AARCH64:
12900       return reloc_type == 0 || reloc_type == 256;
12901     case EM_AVR_OLD:
12902     case EM_AVR:
12903       return (reloc_type == 0 /* R_AVR_NONE.  */
12904               || reloc_type == 30 /* R_AVR_DIFF8.  */
12905               || reloc_type == 31 /* R_AVR_DIFF16.  */
12906               || reloc_type == 32 /* R_AVR_DIFF32.  */);
12907     case EM_METAG:
12908       return reloc_type == 3; /* R_METAG_NONE.  */
12909     case EM_NDS32:
12910       return (reloc_type == 0       /* R_XTENSA_NONE.  */
12911               || reloc_type == 204  /* R_NDS32_DIFF8.  */
12912               || reloc_type == 205  /* R_NDS32_DIFF16.  */
12913               || reloc_type == 206  /* R_NDS32_DIFF32.  */
12914               || reloc_type == 207  /* R_NDS32_ULEB128.  */);
12915     case EM_TI_PRU:
12916       return (reloc_type == 0       /* R_PRU_NONE.  */
12917               || reloc_type == 65   /* R_PRU_DIFF8.  */
12918               || reloc_type == 66   /* R_PRU_DIFF16.  */
12919               || reloc_type == 67   /* R_PRU_DIFF32.  */);
12920     case EM_XTENSA_OLD:
12921     case EM_XTENSA:
12922       return (reloc_type == 0      /* R_XTENSA_NONE.  */
12923               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
12924               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
12925               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
12926     }
12927   return FALSE;
12928 }
12929
12930 /* Returns TRUE if there is a relocation against
12931    section NAME at OFFSET bytes.  */
12932
12933 bfd_boolean
12934 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
12935 {
12936   Elf_Internal_Rela * relocs;
12937   Elf_Internal_Rela * rp;
12938
12939   if (dsec == NULL || dsec->reloc_info == NULL)
12940     return FALSE;
12941
12942   relocs = (Elf_Internal_Rela *) dsec->reloc_info;
12943
12944   for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
12945     if (rp->r_offset == offset)
12946       return TRUE;
12947
12948    return FALSE;
12949 }
12950
12951 /* Apply relocations to a section.
12952    Returns TRUE upon success, FALSE otherwise.
12953    If RELOCS_RETURN is non-NULL then it is set to point to the loaded relocs.
12954    It is then the caller's responsibility to free them.  NUM_RELOCS_RETURN
12955    will be set to the number of relocs loaded.
12956
12957    Note: So far support has been added only for those relocations
12958    which can be found in debug sections. FIXME: Add support for
12959    more relocations ?  */
12960
12961 static bfd_boolean
12962 apply_relocations (Filedata *                 filedata,
12963                    const Elf_Internal_Shdr *  section,
12964                    unsigned char *            start,
12965                    bfd_size_type              size,
12966                    void **                    relocs_return,
12967                    unsigned long *            num_relocs_return)
12968 {
12969   Elf_Internal_Shdr * relsec;
12970   unsigned char * end = start + size;
12971   bfd_boolean res = TRUE;
12972
12973   if (relocs_return != NULL)
12974     {
12975       * (Elf_Internal_Rela **) relocs_return = NULL;
12976       * num_relocs_return = 0;
12977     }
12978
12979   if (filedata->file_header.e_type != ET_REL)
12980     /* No relocs to apply.  */
12981     return TRUE;
12982
12983   /* Find the reloc section associated with the section.  */
12984   for (relsec = filedata->section_headers;
12985        relsec < filedata->section_headers + filedata->file_header.e_shnum;
12986        ++relsec)
12987     {
12988       bfd_boolean is_rela;
12989       unsigned long num_relocs;
12990       Elf_Internal_Rela * relocs;
12991       Elf_Internal_Rela * rp;
12992       Elf_Internal_Shdr * symsec;
12993       Elf_Internal_Sym * symtab;
12994       unsigned long num_syms;
12995       Elf_Internal_Sym * sym;
12996
12997       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12998           || relsec->sh_info >= filedata->file_header.e_shnum
12999           || filedata->section_headers + relsec->sh_info != section
13000           || relsec->sh_size == 0
13001           || relsec->sh_link >= filedata->file_header.e_shnum)
13002         continue;
13003
13004       is_rela = relsec->sh_type == SHT_RELA;
13005
13006       if (is_rela)
13007         {
13008           if (!slurp_rela_relocs (filedata, relsec->sh_offset,
13009                                   relsec->sh_size, & relocs, & num_relocs))
13010             return FALSE;
13011         }
13012       else
13013         {
13014           if (!slurp_rel_relocs (filedata, relsec->sh_offset,
13015                                  relsec->sh_size, & relocs, & num_relocs))
13016             return FALSE;
13017         }
13018
13019       /* SH uses RELA but uses in place value instead of the addend field.  */
13020       if (filedata->file_header.e_machine == EM_SH)
13021         is_rela = FALSE;
13022
13023       symsec = filedata->section_headers + relsec->sh_link;
13024       if (symsec->sh_type != SHT_SYMTAB
13025           && symsec->sh_type != SHT_DYNSYM)
13026         return FALSE;
13027       symtab = GET_ELF_SYMBOLS (filedata, symsec, & num_syms);
13028
13029       for (rp = relocs; rp < relocs + num_relocs; ++rp)
13030         {
13031           bfd_vma         addend;
13032           unsigned int    reloc_type;
13033           unsigned int    reloc_size;
13034           bfd_boolean     reloc_inplace = FALSE;
13035           bfd_boolean     reloc_subtract = FALSE;
13036           unsigned char * rloc;
13037           unsigned long   sym_index;
13038
13039           reloc_type = get_reloc_type (filedata, rp->r_info);
13040
13041           if (target_specific_reloc_handling (filedata, rp, start, end, symtab, num_syms))
13042             continue;
13043           else if (is_none_reloc (filedata, reloc_type))
13044             continue;
13045           else if (is_32bit_abs_reloc (filedata, reloc_type)
13046                    || is_32bit_pcrel_reloc (filedata, reloc_type))
13047             reloc_size = 4;
13048           else if (is_64bit_abs_reloc (filedata, reloc_type)
13049                    || is_64bit_pcrel_reloc (filedata, reloc_type))
13050             reloc_size = 8;
13051           else if (is_24bit_abs_reloc (filedata, reloc_type))
13052             reloc_size = 3;
13053           else if (is_16bit_abs_reloc (filedata, reloc_type))
13054             reloc_size = 2;
13055           else if (is_8bit_abs_reloc (filedata, reloc_type)
13056                    || is_6bit_abs_reloc (filedata, reloc_type))
13057             reloc_size = 1;
13058           else if ((reloc_subtract = is_32bit_inplace_sub_reloc (filedata,
13059                                                                  reloc_type))
13060                    || is_32bit_inplace_add_reloc (filedata, reloc_type))
13061             {
13062               reloc_size = 4;
13063               reloc_inplace = TRUE;
13064             }
13065           else if ((reloc_subtract = is_64bit_inplace_sub_reloc (filedata,
13066                                                                  reloc_type))
13067                    || is_64bit_inplace_add_reloc (filedata, reloc_type))
13068             {
13069               reloc_size = 8;
13070               reloc_inplace = TRUE;
13071             }
13072           else if ((reloc_subtract = is_16bit_inplace_sub_reloc (filedata,
13073                                                                  reloc_type))
13074                    || is_16bit_inplace_add_reloc (filedata, reloc_type))
13075             {
13076               reloc_size = 2;
13077               reloc_inplace = TRUE;
13078             }
13079           else if ((reloc_subtract = is_8bit_inplace_sub_reloc (filedata,
13080                                                                 reloc_type))
13081                    || is_8bit_inplace_add_reloc (filedata, reloc_type))
13082             {
13083               reloc_size = 1;
13084               reloc_inplace = TRUE;
13085             }
13086           else if ((reloc_subtract = is_6bit_inplace_sub_reloc (filedata,
13087                                                                 reloc_type)))
13088             {
13089               reloc_size = 1;
13090               reloc_inplace = TRUE;
13091             }
13092           else
13093             {
13094               static unsigned int prev_reloc = 0;
13095
13096               if (reloc_type != prev_reloc)
13097                 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
13098                       reloc_type, printable_section_name (filedata, section));
13099               prev_reloc = reloc_type;
13100               res = FALSE;
13101               continue;
13102             }
13103
13104           rloc = start + rp->r_offset;
13105           if ((rloc + reloc_size) > end || (rloc < start))
13106             {
13107               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
13108                     (unsigned long) rp->r_offset,
13109                     printable_section_name (filedata, section));
13110               res = FALSE;
13111               continue;
13112             }
13113
13114           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
13115           if (sym_index >= num_syms)
13116             {
13117               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
13118                     sym_index, printable_section_name (filedata, section));
13119               res = FALSE;
13120               continue;
13121             }
13122           sym = symtab + sym_index;
13123
13124           /* If the reloc has a symbol associated with it,
13125              make sure that it is of an appropriate type.
13126
13127              Relocations against symbols without type can happen.
13128              Gcc -feliminate-dwarf2-dups may generate symbols
13129              without type for debug info.
13130
13131              Icc generates relocations against function symbols
13132              instead of local labels.
13133
13134              Relocations against object symbols can happen, eg when
13135              referencing a global array.  For an example of this see
13136              the _clz.o binary in libgcc.a.  */
13137           if (sym != symtab
13138               && ELF_ST_TYPE (sym->st_info) != STT_COMMON
13139               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
13140             {
13141               warn (_("skipping unexpected symbol type %s in section %s relocation %ld\n"),
13142                     get_symbol_type (filedata, ELF_ST_TYPE (sym->st_info)),
13143                     printable_section_name (filedata, relsec),
13144                     (long int)(rp - relocs));
13145               res = FALSE;
13146               continue;
13147             }
13148
13149           addend = 0;
13150           if (is_rela)
13151             addend += rp->r_addend;
13152           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
13153              partial_inplace.  */
13154           if (!is_rela
13155               || (filedata->file_header.e_machine == EM_XTENSA
13156                   && reloc_type == 1)
13157               || ((filedata->file_header.e_machine == EM_PJ
13158                    || filedata->file_header.e_machine == EM_PJ_OLD)
13159                   && reloc_type == 1)
13160               || ((filedata->file_header.e_machine == EM_D30V
13161                    || filedata->file_header.e_machine == EM_CYGNUS_D30V)
13162                   && reloc_type == 12)
13163               || reloc_inplace)
13164             {
13165               if (is_6bit_inplace_sub_reloc (filedata, reloc_type))
13166                 addend += byte_get (rloc, reloc_size) & 0x3f;
13167               else
13168                 addend += byte_get (rloc, reloc_size);
13169             }
13170
13171           if (is_32bit_pcrel_reloc (filedata, reloc_type)
13172               || is_64bit_pcrel_reloc (filedata, reloc_type))
13173             {
13174               /* On HPPA, all pc-relative relocations are biased by 8.  */
13175               if (filedata->file_header.e_machine == EM_PARISC)
13176                 addend -= 8;
13177               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
13178                         reloc_size);
13179             }
13180           else if (is_6bit_abs_reloc (filedata, reloc_type)
13181                    || is_6bit_inplace_sub_reloc (filedata, reloc_type))
13182             {
13183               if (reloc_subtract)
13184                 addend -= sym->st_value;
13185               else
13186                 addend += sym->st_value;
13187               addend = (addend & 0x3f) | (byte_get (rloc, reloc_size) & 0xc0);
13188               byte_put (rloc, addend, reloc_size);
13189             }
13190           else if (reloc_subtract)
13191             byte_put (rloc, addend - sym->st_value, reloc_size);
13192           else
13193             byte_put (rloc, addend + sym->st_value, reloc_size);
13194         }
13195
13196       free (symtab);
13197       /* Let the target specific reloc processing code know that
13198          we have finished with these relocs.  */
13199       target_specific_reloc_handling (filedata, NULL, NULL, NULL, NULL, 0);
13200
13201       if (relocs_return)
13202         {
13203           * (Elf_Internal_Rela **) relocs_return = relocs;
13204           * num_relocs_return = num_relocs;
13205         }
13206       else
13207         free (relocs);
13208
13209       break;
13210     }
13211
13212   return res;
13213 }
13214
13215 #ifdef SUPPORT_DISASSEMBLY
13216 static bfd_boolean
13217 disassemble_section (Elf_Internal_Shdr * section, Filedata * filedata)
13218 {
13219   printf (_("\nAssembly dump of section %s\n"), printable_section_name (filedata, section));
13220
13221   /* FIXME: XXX -- to be done --- XXX */
13222
13223   return TRUE;
13224 }
13225 #endif
13226
13227 /* Reads in the contents of SECTION from FILE, returning a pointer
13228    to a malloc'ed buffer or NULL if something went wrong.  */
13229
13230 static char *
13231 get_section_contents (Elf_Internal_Shdr * section, Filedata * filedata)
13232 {
13233   bfd_size_type num_bytes = section->sh_size;
13234
13235   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
13236     {
13237       printf (_("Section '%s' has no data to dump.\n"),
13238               printable_section_name (filedata, section));
13239       return NULL;
13240     }
13241
13242   return  (char *) get_data (NULL, filedata, section->sh_offset, 1, num_bytes,
13243                              _("section contents"));
13244 }
13245
13246 /* Uncompresses a section that was compressed using zlib, in place.  */
13247
13248 static bfd_boolean
13249 uncompress_section_contents (unsigned char **   buffer,
13250                              dwarf_size_type    uncompressed_size,
13251                              dwarf_size_type *  size)
13252 {
13253   dwarf_size_type compressed_size = *size;
13254   unsigned char * compressed_buffer = *buffer;
13255   unsigned char * uncompressed_buffer;
13256   z_stream strm;
13257   int rc;
13258
13259   /* It is possible the section consists of several compressed
13260      buffers concatenated together, so we uncompress in a loop.  */
13261   /* PR 18313: The state field in the z_stream structure is supposed
13262      to be invisible to the user (ie us), but some compilers will
13263      still complain about it being used without initialisation.  So
13264      we first zero the entire z_stream structure and then set the fields
13265      that we need.  */
13266   memset (& strm, 0, sizeof strm);
13267   strm.avail_in = compressed_size;
13268   strm.next_in = (Bytef *) compressed_buffer;
13269   strm.avail_out = uncompressed_size;
13270   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
13271
13272   rc = inflateInit (& strm);
13273   while (strm.avail_in > 0)
13274     {
13275       if (rc != Z_OK)
13276         goto fail;
13277       strm.next_out = ((Bytef *) uncompressed_buffer
13278                        + (uncompressed_size - strm.avail_out));
13279       rc = inflate (&strm, Z_FINISH);
13280       if (rc != Z_STREAM_END)
13281         goto fail;
13282       rc = inflateReset (& strm);
13283     }
13284   rc = inflateEnd (& strm);
13285   if (rc != Z_OK
13286       || strm.avail_out != 0)
13287     goto fail;
13288
13289   *buffer = uncompressed_buffer;
13290   *size = uncompressed_size;
13291   return TRUE;
13292
13293  fail:
13294   free (uncompressed_buffer);
13295   /* Indicate decompression failure.  */
13296   *buffer = NULL;
13297   return FALSE;
13298 }
13299
13300 static bfd_boolean
13301 dump_section_as_strings (Elf_Internal_Shdr * section, Filedata * filedata)
13302 {
13303   Elf_Internal_Shdr *  relsec;
13304   bfd_size_type        num_bytes;
13305   unsigned char *      data;
13306   unsigned char *      end;
13307   unsigned char *      real_start;
13308   unsigned char *      start;
13309   bfd_boolean          some_strings_shown;
13310
13311   real_start = start = (unsigned char *) get_section_contents (section, filedata);
13312   if (start == NULL)
13313     /* PR 21820: Do not fail if the section was empty.  */
13314     return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13315
13316   num_bytes = section->sh_size;
13317
13318   printf (_("\nString dump of section '%s':\n"), printable_section_name (filedata, section));
13319
13320   if (decompress_dumps)
13321     {
13322       dwarf_size_type new_size = num_bytes;
13323       dwarf_size_type uncompressed_size = 0;
13324
13325       if ((section->sh_flags & SHF_COMPRESSED) != 0)
13326         {
13327           Elf_Internal_Chdr chdr;
13328           unsigned int compression_header_size
13329             = get_compression_header (& chdr, (unsigned char *) start,
13330                                       num_bytes);
13331
13332           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13333             {
13334               warn (_("section '%s' has unsupported compress type: %d\n"),
13335                     printable_section_name (filedata, section), chdr.ch_type);
13336               return FALSE;
13337             }
13338           else if (chdr.ch_addralign != section->sh_addralign)
13339             {
13340               warn (_("compressed section '%s' is corrupted\n"),
13341                     printable_section_name (filedata, section));
13342               return FALSE;
13343             }
13344           uncompressed_size = chdr.ch_size;
13345           start += compression_header_size;
13346           new_size -= compression_header_size;
13347         }
13348       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13349         {
13350           /* Read the zlib header.  In this case, it should be "ZLIB"
13351              followed by the uncompressed section size, 8 bytes in
13352              big-endian order.  */
13353           uncompressed_size = start[4]; uncompressed_size <<= 8;
13354           uncompressed_size += start[5]; uncompressed_size <<= 8;
13355           uncompressed_size += start[6]; uncompressed_size <<= 8;
13356           uncompressed_size += start[7]; uncompressed_size <<= 8;
13357           uncompressed_size += start[8]; uncompressed_size <<= 8;
13358           uncompressed_size += start[9]; uncompressed_size <<= 8;
13359           uncompressed_size += start[10]; uncompressed_size <<= 8;
13360           uncompressed_size += start[11];
13361           start += 12;
13362           new_size -= 12;
13363         }
13364
13365       if (uncompressed_size)
13366         {
13367           if (uncompress_section_contents (& start,
13368                                            uncompressed_size, & new_size))
13369             num_bytes = new_size;
13370           else
13371             {
13372               error (_("Unable to decompress section %s\n"),
13373                      printable_section_name (filedata, section));
13374               return FALSE;
13375             }
13376         }
13377       else
13378         start = real_start;
13379     }
13380
13381   /* If the section being dumped has relocations against it the user might
13382      be expecting these relocations to have been applied.  Check for this
13383      case and issue a warning message in order to avoid confusion.
13384      FIXME: Maybe we ought to have an option that dumps a section with
13385      relocs applied ?  */
13386   for (relsec = filedata->section_headers;
13387        relsec < filedata->section_headers + filedata->file_header.e_shnum;
13388        ++relsec)
13389     {
13390       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13391           || relsec->sh_info >= filedata->file_header.e_shnum
13392           || filedata->section_headers + relsec->sh_info != section
13393           || relsec->sh_size == 0
13394           || relsec->sh_link >= filedata->file_header.e_shnum)
13395         continue;
13396
13397       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13398       break;
13399     }
13400
13401   data = start;
13402   end  = start + num_bytes;
13403   some_strings_shown = FALSE;
13404
13405   while (data < end)
13406     {
13407       while (!ISPRINT (* data))
13408         if (++ data >= end)
13409           break;
13410
13411       if (data < end)
13412         {
13413           size_t maxlen = end - data;
13414
13415 #ifndef __MSVCRT__
13416           /* PR 11128: Use two separate invocations in order to work
13417              around bugs in the Solaris 8 implementation of printf.  */
13418           printf ("  [%6tx]  ", data - start);
13419 #else
13420           printf ("  [%6Ix]  ", (size_t) (data - start));
13421 #endif
13422           if (maxlen > 0)
13423             {
13424               print_symbol ((int) maxlen, (const char *) data);
13425               putchar ('\n');
13426               data += strnlen ((const char *) data, maxlen);
13427             }
13428           else
13429             {
13430               printf (_("<corrupt>\n"));
13431               data = end;
13432             }
13433           some_strings_shown = TRUE;
13434         }
13435     }
13436
13437   if (! some_strings_shown)
13438     printf (_("  No strings found in this section."));
13439
13440   free (real_start);
13441
13442   putchar ('\n');
13443   return TRUE;
13444 }
13445
13446 static bfd_boolean
13447 dump_section_as_bytes (Elf_Internal_Shdr *  section,
13448                        Filedata *           filedata,
13449                        bfd_boolean          relocate)
13450 {
13451   Elf_Internal_Shdr * relsec;
13452   bfd_size_type       bytes;
13453   bfd_size_type       section_size;
13454   bfd_vma             addr;
13455   unsigned char *     data;
13456   unsigned char *     real_start;
13457   unsigned char *     start;
13458
13459   real_start = start = (unsigned char *) get_section_contents (section, filedata);
13460   if (start == NULL)
13461     /* PR 21820: Do not fail if the section was empty.  */
13462     return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13463
13464   section_size = section->sh_size;
13465
13466   printf (_("\nHex dump of section '%s':\n"), printable_section_name (filedata, section));
13467
13468   if (decompress_dumps)
13469     {
13470       dwarf_size_type new_size = section_size;
13471       dwarf_size_type uncompressed_size = 0;
13472
13473       if ((section->sh_flags & SHF_COMPRESSED) != 0)
13474         {
13475           Elf_Internal_Chdr chdr;
13476           unsigned int compression_header_size
13477             = get_compression_header (& chdr, start, section_size);
13478
13479           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13480             {
13481               warn (_("section '%s' has unsupported compress type: %d\n"),
13482                     printable_section_name (filedata, section), chdr.ch_type);
13483               return FALSE;
13484             }
13485           else if (chdr.ch_addralign != section->sh_addralign)
13486             {
13487               warn (_("compressed section '%s' is corrupted\n"),
13488                     printable_section_name (filedata, section));
13489               return FALSE;
13490             }
13491           uncompressed_size = chdr.ch_size;
13492           start += compression_header_size;
13493           new_size -= compression_header_size;
13494         }
13495       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13496         {
13497           /* Read the zlib header.  In this case, it should be "ZLIB"
13498              followed by the uncompressed section size, 8 bytes in
13499              big-endian order.  */
13500           uncompressed_size = start[4]; uncompressed_size <<= 8;
13501           uncompressed_size += start[5]; uncompressed_size <<= 8;
13502           uncompressed_size += start[6]; uncompressed_size <<= 8;
13503           uncompressed_size += start[7]; uncompressed_size <<= 8;
13504           uncompressed_size += start[8]; uncompressed_size <<= 8;
13505           uncompressed_size += start[9]; uncompressed_size <<= 8;
13506           uncompressed_size += start[10]; uncompressed_size <<= 8;
13507           uncompressed_size += start[11];
13508           start += 12;
13509           new_size -= 12;
13510         }
13511
13512       if (uncompressed_size)
13513         {
13514           if (uncompress_section_contents (& start, uncompressed_size,
13515                                            & new_size))
13516             {
13517               section_size = new_size;
13518             }
13519           else
13520             {
13521               error (_("Unable to decompress section %s\n"),
13522                      printable_section_name (filedata, section));
13523               /* FIXME: Print the section anyway ?  */
13524               return FALSE;
13525             }
13526         }
13527       else
13528         start = real_start;
13529     }
13530
13531   if (relocate)
13532     {
13533       if (! apply_relocations (filedata, section, start, section_size, NULL, NULL))
13534         return FALSE;
13535     }
13536   else
13537     {
13538       /* If the section being dumped has relocations against it the user might
13539          be expecting these relocations to have been applied.  Check for this
13540          case and issue a warning message in order to avoid confusion.
13541          FIXME: Maybe we ought to have an option that dumps a section with
13542          relocs applied ?  */
13543       for (relsec = filedata->section_headers;
13544            relsec < filedata->section_headers + filedata->file_header.e_shnum;
13545            ++relsec)
13546         {
13547           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13548               || relsec->sh_info >= filedata->file_header.e_shnum
13549               || filedata->section_headers + relsec->sh_info != section
13550               || relsec->sh_size == 0
13551               || relsec->sh_link >= filedata->file_header.e_shnum)
13552             continue;
13553
13554           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13555           break;
13556         }
13557     }
13558
13559   addr = section->sh_addr;
13560   bytes = section_size;
13561   data = start;
13562
13563   while (bytes)
13564     {
13565       int j;
13566       int k;
13567       int lbytes;
13568
13569       lbytes = (bytes > 16 ? 16 : bytes);
13570
13571       printf ("  0x%8.8lx ", (unsigned long) addr);
13572
13573       for (j = 0; j < 16; j++)
13574         {
13575           if (j < lbytes)
13576             printf ("%2.2x", data[j]);
13577           else
13578             printf ("  ");
13579
13580           if ((j & 3) == 3)
13581             printf (" ");
13582         }
13583
13584       for (j = 0; j < lbytes; j++)
13585         {
13586           k = data[j];
13587           if (k >= ' ' && k < 0x7f)
13588             printf ("%c", k);
13589           else
13590             printf (".");
13591         }
13592
13593       putchar ('\n');
13594
13595       data  += lbytes;
13596       addr  += lbytes;
13597       bytes -= lbytes;
13598     }
13599
13600   free (real_start);
13601
13602   putchar ('\n');
13603   return TRUE;
13604 }
13605
13606 static bfd_boolean
13607 load_specific_debug_section (enum dwarf_section_display_enum  debug,
13608                              const Elf_Internal_Shdr *        sec,
13609                              void *                           data)
13610 {
13611   struct dwarf_section * section = &debug_displays [debug].section;
13612   char buf [64];
13613   Filedata * filedata = (Filedata *) data;
13614   
13615   if (section->start != NULL)
13616     {
13617       /* If it is already loaded, do nothing.  */
13618       if (streq (section->filename, filedata->file_name))
13619         return TRUE;
13620       free (section->start);
13621     }
13622
13623   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
13624   section->address = sec->sh_addr;
13625   section->user_data = NULL;
13626   section->filename = filedata->file_name;
13627   section->start = (unsigned char *) get_data (NULL, filedata,
13628                                                sec->sh_offset, 1,
13629                                                sec->sh_size, buf);
13630   if (section->start == NULL)
13631     section->size = 0;
13632   else
13633     {
13634       unsigned char *start = section->start;
13635       dwarf_size_type size = sec->sh_size;
13636       dwarf_size_type uncompressed_size = 0;
13637
13638       if ((sec->sh_flags & SHF_COMPRESSED) != 0)
13639         {
13640           Elf_Internal_Chdr chdr;
13641           unsigned int compression_header_size;
13642
13643           if (size < (is_32bit_elf
13644                       ? sizeof (Elf32_External_Chdr)
13645                       : sizeof (Elf64_External_Chdr)))
13646             {
13647               warn (_("compressed section %s is too small to contain a compression header"),
13648                     section->name);
13649               return FALSE;
13650             }
13651
13652           compression_header_size = get_compression_header (&chdr, start, size);
13653
13654           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13655             {
13656               warn (_("section '%s' has unsupported compress type: %d\n"),
13657                     section->name, chdr.ch_type);
13658               return FALSE;
13659             }
13660           else if (chdr.ch_addralign != sec->sh_addralign)
13661             {
13662               warn (_("compressed section '%s' is corrupted\n"),
13663                     section->name);
13664               return FALSE;
13665             }
13666           uncompressed_size = chdr.ch_size;
13667           start += compression_header_size;
13668           size -= compression_header_size;
13669         }
13670       else if (size > 12 && streq ((char *) start, "ZLIB"))
13671         {
13672           /* Read the zlib header.  In this case, it should be "ZLIB"
13673              followed by the uncompressed section size, 8 bytes in
13674              big-endian order.  */
13675           uncompressed_size = start[4]; uncompressed_size <<= 8;
13676           uncompressed_size += start[5]; uncompressed_size <<= 8;
13677           uncompressed_size += start[6]; uncompressed_size <<= 8;
13678           uncompressed_size += start[7]; uncompressed_size <<= 8;
13679           uncompressed_size += start[8]; uncompressed_size <<= 8;
13680           uncompressed_size += start[9]; uncompressed_size <<= 8;
13681           uncompressed_size += start[10]; uncompressed_size <<= 8;
13682           uncompressed_size += start[11];
13683           start += 12;
13684           size -= 12;
13685         }
13686
13687       if (uncompressed_size)
13688         {
13689           if (uncompress_section_contents (&start, uncompressed_size,
13690                                            &size))
13691             {
13692               /* Free the compressed buffer, update the section buffer
13693                  and the section size if uncompress is successful.  */
13694               free (section->start);
13695               section->start = start;
13696             }
13697           else
13698             {
13699               error (_("Unable to decompress section %s\n"),
13700                      printable_section_name (filedata, sec));
13701               return FALSE;
13702             }
13703         }
13704
13705       section->size = size;
13706     }
13707
13708   if (section->start == NULL)
13709     return FALSE;
13710
13711   if (debug_displays [debug].relocate)
13712     {
13713       if (! apply_relocations (filedata, sec, section->start, section->size,
13714                                & section->reloc_info, & section->num_relocs))
13715         return FALSE;
13716     }
13717   else
13718     {
13719       section->reloc_info = NULL;
13720       section->num_relocs = 0;
13721     }
13722
13723   return TRUE;
13724 }
13725
13726 /* If this is not NULL, load_debug_section will only look for sections
13727    within the list of sections given here.  */
13728 static unsigned int * section_subset = NULL;
13729
13730 bfd_boolean
13731 load_debug_section (enum dwarf_section_display_enum debug, void * data)
13732 {
13733   struct dwarf_section * section = &debug_displays [debug].section;
13734   Elf_Internal_Shdr * sec;
13735   Filedata * filedata = (Filedata *) data;
13736
13737   /* Without section headers we cannot find any sections.  */
13738   if (filedata->section_headers == NULL)
13739     return FALSE;
13740
13741   if (filedata->string_table == NULL
13742       && filedata->file_header.e_shstrndx != SHN_UNDEF
13743       && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
13744     {
13745       Elf_Internal_Shdr * strs;
13746
13747       /* Read in the string table, so that we have section names to scan.  */
13748       strs = filedata->section_headers + filedata->file_header.e_shstrndx;
13749
13750       if (strs != NULL && strs->sh_size != 0)
13751         {
13752           filedata->string_table
13753             = (char *) get_data (NULL, filedata, strs->sh_offset,
13754                                  1, strs->sh_size, _("string table"));
13755
13756           filedata->string_table_length
13757             = filedata->string_table != NULL ? strs->sh_size : 0;
13758         }
13759     }
13760
13761   /* Locate the debug section.  */
13762   sec = find_section_in_set (filedata, section->uncompressed_name, section_subset);
13763   if (sec != NULL)
13764     section->name = section->uncompressed_name;
13765   else
13766     {
13767       sec = find_section_in_set (filedata, section->compressed_name, section_subset);
13768       if (sec != NULL)
13769         section->name = section->compressed_name;
13770     }
13771   if (sec == NULL)
13772     return FALSE;
13773
13774   /* If we're loading from a subset of sections, and we've loaded
13775      a section matching this name before, it's likely that it's a
13776      different one.  */
13777   if (section_subset != NULL)
13778     free_debug_section (debug);
13779
13780   return load_specific_debug_section (debug, sec, data);
13781 }
13782
13783 void
13784 free_debug_section (enum dwarf_section_display_enum debug)
13785 {
13786   struct dwarf_section * section = &debug_displays [debug].section;
13787
13788   if (section->start == NULL)
13789     return;
13790
13791   free ((char *) section->start);
13792   section->start = NULL;
13793   section->address = 0;
13794   section->size = 0;
13795 }
13796
13797 static bfd_boolean
13798 display_debug_section (int shndx, Elf_Internal_Shdr * section, Filedata * filedata)
13799 {
13800   char * name = SECTION_NAME (section);
13801   const char * print_name = printable_section_name (filedata, section);
13802   bfd_size_type length;
13803   bfd_boolean result = TRUE;
13804   int i;
13805
13806   length = section->sh_size;
13807   if (length == 0)
13808     {
13809       printf (_("\nSection '%s' has no debugging data.\n"), print_name);
13810       return TRUE;
13811     }
13812   if (section->sh_type == SHT_NOBITS)
13813     {
13814       /* There is no point in dumping the contents of a debugging section
13815          which has the NOBITS type - the bits in the file will be random.
13816          This can happen when a file containing a .eh_frame section is
13817          stripped with the --only-keep-debug command line option.  */
13818       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
13819               print_name);
13820       return FALSE;
13821     }
13822
13823   if (const_strneq (name, ".gnu.linkonce.wi."))
13824     name = ".debug_info";
13825
13826   /* See if we know how to display the contents of this section.  */
13827   for (i = 0; i < max; i++)
13828     {
13829       enum dwarf_section_display_enum  id = (enum dwarf_section_display_enum) i;
13830       struct dwarf_section_display *   display = debug_displays + i;
13831       struct dwarf_section *           sec = & display->section;
13832
13833       if (streq (sec->uncompressed_name, name)
13834           || (id == line && const_strneq (name, ".debug_line."))
13835           || streq (sec->compressed_name, name))
13836         {
13837           bfd_boolean secondary = (section != find_section (filedata, name));
13838
13839           if (secondary)
13840             free_debug_section (id);
13841
13842           if (i == line && const_strneq (name, ".debug_line."))
13843             sec->name = name;
13844           else if (streq (sec->uncompressed_name, name))
13845             sec->name = sec->uncompressed_name;
13846           else
13847             sec->name = sec->compressed_name;
13848
13849           if (load_specific_debug_section (id, section, filedata))
13850             {
13851               /* If this debug section is part of a CU/TU set in a .dwp file,
13852                  restrict load_debug_section to the sections in that set.  */
13853               section_subset = find_cu_tu_set (filedata, shndx);
13854
13855               result &= display->display (sec, filedata);
13856
13857               section_subset = NULL;
13858
13859               if (secondary || (id != info && id != abbrev))
13860                 free_debug_section (id);
13861             }
13862           break;
13863         }
13864     }
13865
13866   if (i == max)
13867     {
13868       printf (_("Unrecognized debug section: %s\n"), print_name);
13869       result = FALSE;
13870     }
13871
13872   return result;
13873 }
13874
13875 /* Set DUMP_SECTS for all sections where dumps were requested
13876    based on section name.  */
13877
13878 static void
13879 initialise_dumps_byname (Filedata * filedata)
13880 {
13881   struct dump_list_entry * cur;
13882
13883   for (cur = dump_sects_byname; cur; cur = cur->next)
13884     {
13885       unsigned int i;
13886       bfd_boolean any = FALSE;
13887
13888       for (i = 0; i < filedata->file_header.e_shnum; i++)
13889         if (streq (SECTION_NAME (filedata->section_headers + i), cur->name))
13890           {
13891             request_dump_bynumber (filedata, i, cur->type);
13892             any = TRUE;
13893           }
13894
13895       if (!any)
13896         warn (_("Section '%s' was not dumped because it does not exist!\n"),
13897               cur->name);
13898     }
13899 }
13900
13901 static bfd_boolean
13902 process_section_contents (Filedata * filedata)
13903 {
13904   Elf_Internal_Shdr * section;
13905   unsigned int i;
13906   bfd_boolean res = TRUE;
13907
13908   if (! do_dump)
13909     return TRUE;
13910
13911   initialise_dumps_byname (filedata);
13912
13913   for (i = 0, section = filedata->section_headers;
13914        i < filedata->file_header.e_shnum && i < filedata->num_dump_sects;
13915        i++, section++)
13916     {
13917       dump_type dump = filedata->dump_sects[i];
13918
13919 #ifdef SUPPORT_DISASSEMBLY
13920       if (dump & DISASS_DUMP)
13921         {
13922           if (! disassemble_section (section, filedata))
13923             res = FALSE;
13924         }
13925 #endif
13926       if (dump & HEX_DUMP)
13927         {
13928           if (! dump_section_as_bytes (section, filedata, FALSE))
13929             res = FALSE;
13930         }
13931
13932       if (dump & RELOC_DUMP)
13933         {
13934           if (! dump_section_as_bytes (section, filedata, TRUE))
13935             res = FALSE;
13936         }
13937
13938       if (dump & STRING_DUMP)
13939         {
13940           if (! dump_section_as_strings (section, filedata))
13941             res = FALSE;
13942         }
13943
13944       if (dump & DEBUG_DUMP)
13945         {
13946           if (! display_debug_section (i, section, filedata))
13947             res = FALSE;
13948         }
13949     }
13950
13951   /* Check to see if the user requested a
13952      dump of a section that does not exist.  */
13953   while (i < filedata->num_dump_sects)
13954     {
13955       if (filedata->dump_sects[i])
13956         {
13957           warn (_("Section %d was not dumped because it does not exist!\n"), i);
13958           res = FALSE;
13959         }
13960       i++;
13961     }
13962
13963   return res;
13964 }
13965
13966 static void
13967 process_mips_fpe_exception (int mask)
13968 {
13969   if (mask)
13970     {
13971       bfd_boolean first = TRUE;
13972
13973       if (mask & OEX_FPU_INEX)
13974         fputs ("INEX", stdout), first = FALSE;
13975       if (mask & OEX_FPU_UFLO)
13976         printf ("%sUFLO", first ? "" : "|"), first = FALSE;
13977       if (mask & OEX_FPU_OFLO)
13978         printf ("%sOFLO", first ? "" : "|"), first = FALSE;
13979       if (mask & OEX_FPU_DIV0)
13980         printf ("%sDIV0", first ? "" : "|"), first = FALSE;
13981       if (mask & OEX_FPU_INVAL)
13982         printf ("%sINVAL", first ? "" : "|");
13983     }
13984   else
13985     fputs ("0", stdout);
13986 }
13987
13988 /* Display's the value of TAG at location P.  If TAG is
13989    greater than 0 it is assumed to be an unknown tag, and
13990    a message is printed to this effect.  Otherwise it is
13991    assumed that a message has already been printed.
13992
13993    If the bottom bit of TAG is set it assumed to have a
13994    string value, otherwise it is assumed to have an integer
13995    value.
13996
13997    Returns an updated P pointing to the first unread byte
13998    beyond the end of TAG's value.
13999
14000    Reads at or beyond END will not be made.  */
14001
14002 static unsigned char *
14003 display_tag_value (signed int tag,
14004                    unsigned char * p,
14005                    const unsigned char * const end)
14006 {
14007   unsigned long val;
14008
14009   if (tag > 0)
14010     printf ("  Tag_unknown_%d: ", tag);
14011
14012   if (p >= end)
14013     {
14014       warn (_("<corrupt tag>\n"));
14015     }
14016   else if (tag & 1)
14017     {
14018       /* PR 17531 file: 027-19978-0.004.  */
14019       size_t maxlen = (end - p) - 1;
14020
14021       putchar ('"');
14022       if (maxlen > 0)
14023         {
14024           print_symbol ((int) maxlen, (const char *) p);
14025           p += strnlen ((char *) p, maxlen) + 1;
14026         }
14027       else
14028         {
14029           printf (_("<corrupt string tag>"));
14030           p = (unsigned char *) end;
14031         }
14032       printf ("\"\n");
14033     }
14034   else
14035     {
14036       unsigned int len;
14037
14038       val = read_uleb128 (p, &len, end);
14039       p += len;
14040       printf ("%ld (0x%lx)\n", val, val);
14041     }
14042
14043   assert (p <= end);
14044   return p;
14045 }
14046
14047 /* ARC ABI attributes section.  */
14048
14049 static unsigned char *
14050 display_arc_attribute (unsigned char * p,
14051                        const unsigned char * const end)
14052 {
14053   unsigned int tag;
14054   unsigned int len;
14055   unsigned int val;
14056
14057   tag = read_uleb128 (p, &len, end);
14058   p += len;
14059
14060   switch (tag)
14061     {
14062     case Tag_ARC_PCS_config:
14063       val = read_uleb128 (p, &len, end);
14064       p += len;
14065       printf ("  Tag_ARC_PCS_config: ");
14066       switch (val)
14067         {
14068         case 0:
14069           printf (_("Absent/Non standard\n"));
14070           break;
14071         case 1:
14072           printf (_("Bare metal/mwdt\n"));
14073           break;
14074         case 2:
14075           printf (_("Bare metal/newlib\n"));
14076           break;
14077         case 3:
14078           printf (_("Linux/uclibc\n"));
14079           break;
14080         case 4:
14081           printf (_("Linux/glibc\n"));
14082           break;
14083         default:
14084           printf (_("Unknown\n"));
14085           break;
14086         }
14087       break;
14088
14089     case Tag_ARC_CPU_base:
14090       val = read_uleb128 (p, &len, end);
14091       p += len;
14092       printf ("  Tag_ARC_CPU_base: ");
14093       switch (val)
14094         {
14095         default:
14096         case TAG_CPU_NONE:
14097           printf (_("Absent\n"));
14098           break;
14099         case TAG_CPU_ARC6xx:
14100           printf ("ARC6xx\n");
14101           break;
14102         case TAG_CPU_ARC7xx:
14103           printf ("ARC7xx\n");
14104           break;
14105         case TAG_CPU_ARCEM:
14106           printf ("ARCEM\n");
14107           break;
14108         case TAG_CPU_ARCHS:
14109           printf ("ARCHS\n");
14110           break;
14111         }
14112       break;
14113
14114     case Tag_ARC_CPU_variation:
14115       val = read_uleb128 (p, &len, end);
14116       p += len;
14117       printf ("  Tag_ARC_CPU_variation: ");
14118       switch (val)
14119         {
14120         default:
14121           if (val > 0 && val < 16)
14122               printf ("Core%d\n", val);
14123           else
14124               printf ("Unknown\n");
14125           break;
14126
14127         case 0:
14128           printf (_("Absent\n"));
14129           break;
14130         }
14131       break;
14132
14133     case Tag_ARC_CPU_name:
14134       printf ("  Tag_ARC_CPU_name: ");
14135       p = display_tag_value (-1, p, end);
14136       break;
14137
14138     case Tag_ARC_ABI_rf16:
14139       val = read_uleb128 (p, &len, end);
14140       p += len;
14141       printf ("  Tag_ARC_ABI_rf16: %s\n", val ? _("yes") : _("no"));
14142       break;
14143
14144     case Tag_ARC_ABI_osver:
14145       val = read_uleb128 (p, &len, end);
14146       p += len;
14147       printf ("  Tag_ARC_ABI_osver: v%d\n", val);
14148       break;
14149
14150     case Tag_ARC_ABI_pic:
14151     case Tag_ARC_ABI_sda:
14152       val = read_uleb128 (p, &len, end);
14153       p += len;
14154       printf (tag == Tag_ARC_ABI_sda ? "  Tag_ARC_ABI_sda: "
14155               : "  Tag_ARC_ABI_pic: ");
14156       switch (val)
14157         {
14158         case 0:
14159           printf (_("Absent\n"));
14160           break;
14161         case 1:
14162           printf ("MWDT\n");
14163           break;
14164         case 2:
14165           printf ("GNU\n");
14166           break;
14167         default:
14168           printf (_("Unknown\n"));
14169           break;
14170         }
14171       break;
14172
14173     case Tag_ARC_ABI_tls:
14174       val = read_uleb128 (p, &len, end);
14175       p += len;
14176       printf ("  Tag_ARC_ABI_tls: %s\n", val ? "r25": "none");
14177       break;
14178
14179     case Tag_ARC_ABI_enumsize:
14180       val = read_uleb128 (p, &len, end);
14181       p += len;
14182       printf ("  Tag_ARC_ABI_enumsize: %s\n", val ? _("default") :
14183               _("smallest"));
14184       break;
14185
14186     case Tag_ARC_ABI_exceptions:
14187       val = read_uleb128 (p, &len, end);
14188       p += len;
14189       printf ("  Tag_ARC_ABI_exceptions: %s\n", val ? _("OPTFP")
14190               : _("default"));
14191       break;
14192
14193     case Tag_ARC_ABI_double_size:
14194       val = read_uleb128 (p, &len, end);
14195       p += len;
14196       printf ("  Tag_ARC_ABI_double_size: %d\n", val);
14197       break;
14198
14199     case Tag_ARC_ISA_config:
14200       printf ("  Tag_ARC_ISA_config: ");
14201       p = display_tag_value (-1, p, end);
14202       break;
14203
14204     case Tag_ARC_ISA_apex:
14205       printf ("  Tag_ARC_ISA_apex: ");
14206       p = display_tag_value (-1, p, end);
14207       break;
14208
14209     case Tag_ARC_ISA_mpy_option:
14210       val = read_uleb128 (p, &len, end);
14211       p += len;
14212       printf ("  Tag_ARC_ISA_mpy_option: %d\n", val);
14213       break;
14214
14215     default:
14216       return display_tag_value (tag & 1, p, end);
14217     }
14218
14219   return p;
14220 }
14221
14222 /* ARM EABI attributes section.  */
14223 typedef struct
14224 {
14225   unsigned int tag;
14226   const char * name;
14227   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
14228   unsigned int type;
14229   const char ** table;
14230 } arm_attr_public_tag;
14231
14232 static const char * arm_attr_tag_CPU_arch[] =
14233   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
14234    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "v8-R", "v8-M.baseline",
14235    "v8-M.mainline"};
14236 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
14237 static const char * arm_attr_tag_THUMB_ISA_use[] =
14238   {"No", "Thumb-1", "Thumb-2", "Yes"};
14239 static const char * arm_attr_tag_FP_arch[] =
14240   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
14241    "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
14242 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
14243 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
14244   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
14245    "NEON for ARMv8.1"};
14246 static const char * arm_attr_tag_PCS_config[] =
14247   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
14248    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
14249 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
14250   {"V6", "SB", "TLS", "Unused"};
14251 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
14252   {"Absolute", "PC-relative", "SB-relative", "None"};
14253 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
14254   {"Absolute", "PC-relative", "None"};
14255 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
14256   {"None", "direct", "GOT-indirect"};
14257 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
14258   {"None", "??? 1", "2", "??? 3", "4"};
14259 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
14260 static const char * arm_attr_tag_ABI_FP_denormal[] =
14261   {"Unused", "Needed", "Sign only"};
14262 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
14263 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
14264 static const char * arm_attr_tag_ABI_FP_number_model[] =
14265   {"Unused", "Finite", "RTABI", "IEEE 754"};
14266 static const char * arm_attr_tag_ABI_enum_size[] =
14267   {"Unused", "small", "int", "forced to int"};
14268 static const char * arm_attr_tag_ABI_HardFP_use[] =
14269   {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
14270 static const char * arm_attr_tag_ABI_VFP_args[] =
14271   {"AAPCS", "VFP registers", "custom", "compatible"};
14272 static const char * arm_attr_tag_ABI_WMMX_args[] =
14273   {"AAPCS", "WMMX registers", "custom"};
14274 static const char * arm_attr_tag_ABI_optimization_goals[] =
14275   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14276     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
14277 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
14278   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14279     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
14280 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
14281 static const char * arm_attr_tag_FP_HP_extension[] =
14282   {"Not Allowed", "Allowed"};
14283 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
14284   {"None", "IEEE 754", "Alternative Format"};
14285 static const char * arm_attr_tag_DSP_extension[] =
14286   {"Follow architecture", "Allowed"};
14287 static const char * arm_attr_tag_MPextension_use[] =
14288   {"Not Allowed", "Allowed"};
14289 static const char * arm_attr_tag_DIV_use[] =
14290   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
14291     "Allowed in v7-A with integer division extension"};
14292 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
14293 static const char * arm_attr_tag_Virtualization_use[] =
14294   {"Not Allowed", "TrustZone", "Virtualization Extensions",
14295     "TrustZone and Virtualization Extensions"};
14296 static const char * arm_attr_tag_MPextension_use_legacy[] =
14297   {"Not Allowed", "Allowed"};
14298
14299 #define LOOKUP(id, name) \
14300   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
14301 static arm_attr_public_tag arm_attr_public_tags[] =
14302 {
14303   {4, "CPU_raw_name", 1, NULL},
14304   {5, "CPU_name", 1, NULL},
14305   LOOKUP(6, CPU_arch),
14306   {7, "CPU_arch_profile", 0, NULL},
14307   LOOKUP(8, ARM_ISA_use),
14308   LOOKUP(9, THUMB_ISA_use),
14309   LOOKUP(10, FP_arch),
14310   LOOKUP(11, WMMX_arch),
14311   LOOKUP(12, Advanced_SIMD_arch),
14312   LOOKUP(13, PCS_config),
14313   LOOKUP(14, ABI_PCS_R9_use),
14314   LOOKUP(15, ABI_PCS_RW_data),
14315   LOOKUP(16, ABI_PCS_RO_data),
14316   LOOKUP(17, ABI_PCS_GOT_use),
14317   LOOKUP(18, ABI_PCS_wchar_t),
14318   LOOKUP(19, ABI_FP_rounding),
14319   LOOKUP(20, ABI_FP_denormal),
14320   LOOKUP(21, ABI_FP_exceptions),
14321   LOOKUP(22, ABI_FP_user_exceptions),
14322   LOOKUP(23, ABI_FP_number_model),
14323   {24, "ABI_align_needed", 0, NULL},
14324   {25, "ABI_align_preserved", 0, NULL},
14325   LOOKUP(26, ABI_enum_size),
14326   LOOKUP(27, ABI_HardFP_use),
14327   LOOKUP(28, ABI_VFP_args),
14328   LOOKUP(29, ABI_WMMX_args),
14329   LOOKUP(30, ABI_optimization_goals),
14330   LOOKUP(31, ABI_FP_optimization_goals),
14331   {32, "compatibility", 0, NULL},
14332   LOOKUP(34, CPU_unaligned_access),
14333   LOOKUP(36, FP_HP_extension),
14334   LOOKUP(38, ABI_FP_16bit_format),
14335   LOOKUP(42, MPextension_use),
14336   LOOKUP(44, DIV_use),
14337   LOOKUP(46, DSP_extension),
14338   {64, "nodefaults", 0, NULL},
14339   {65, "also_compatible_with", 0, NULL},
14340   LOOKUP(66, T2EE_use),
14341   {67, "conformance", 1, NULL},
14342   LOOKUP(68, Virtualization_use),
14343   LOOKUP(70, MPextension_use_legacy)
14344 };
14345 #undef LOOKUP
14346
14347 static unsigned char *
14348 display_arm_attribute (unsigned char * p,
14349                        const unsigned char * const end)
14350 {
14351   unsigned int tag;
14352   unsigned int len;
14353   unsigned int val;
14354   arm_attr_public_tag * attr;
14355   unsigned i;
14356   unsigned int type;
14357
14358   tag = read_uleb128 (p, &len, end);
14359   p += len;
14360   attr = NULL;
14361   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
14362     {
14363       if (arm_attr_public_tags[i].tag == tag)
14364         {
14365           attr = &arm_attr_public_tags[i];
14366           break;
14367         }
14368     }
14369
14370   if (attr)
14371     {
14372       printf ("  Tag_%s: ", attr->name);
14373       switch (attr->type)
14374         {
14375         case 0:
14376           switch (tag)
14377             {
14378             case 7: /* Tag_CPU_arch_profile.  */
14379               val = read_uleb128 (p, &len, end);
14380               p += len;
14381               switch (val)
14382                 {
14383                 case 0: printf (_("None\n")); break;
14384                 case 'A': printf (_("Application\n")); break;
14385                 case 'R': printf (_("Realtime\n")); break;
14386                 case 'M': printf (_("Microcontroller\n")); break;
14387                 case 'S': printf (_("Application or Realtime\n")); break;
14388                 default: printf ("??? (%d)\n", val); break;
14389                 }
14390               break;
14391
14392             case 24: /* Tag_align_needed.  */
14393               val = read_uleb128 (p, &len, end);
14394               p += len;
14395               switch (val)
14396                 {
14397                 case 0: printf (_("None\n")); break;
14398                 case 1: printf (_("8-byte\n")); break;
14399                 case 2: printf (_("4-byte\n")); break;
14400                 case 3: printf ("??? 3\n"); break;
14401                 default:
14402                   if (val <= 12)
14403                     printf (_("8-byte and up to %d-byte extended\n"),
14404                             1 << val);
14405                   else
14406                     printf ("??? (%d)\n", val);
14407                   break;
14408                 }
14409               break;
14410
14411             case 25: /* Tag_align_preserved.  */
14412               val = read_uleb128 (p, &len, end);
14413               p += len;
14414               switch (val)
14415                 {
14416                 case 0: printf (_("None\n")); break;
14417                 case 1: printf (_("8-byte, except leaf SP\n")); break;
14418                 case 2: printf (_("8-byte\n")); break;
14419                 case 3: printf ("??? 3\n"); break;
14420                 default:
14421                   if (val <= 12)
14422                     printf (_("8-byte and up to %d-byte extended\n"),
14423                             1 << val);
14424                   else
14425                     printf ("??? (%d)\n", val);
14426                   break;
14427                 }
14428               break;
14429
14430             case 32: /* Tag_compatibility.  */
14431               {
14432                 val = read_uleb128 (p, &len, end);
14433                 p += len;
14434                 printf (_("flag = %d, vendor = "), val);
14435                 if (p < end - 1)
14436                   {
14437                     size_t maxlen = (end - p) - 1;
14438
14439                     print_symbol ((int) maxlen, (const char *) p);
14440                     p += strnlen ((char *) p, maxlen) + 1;
14441                   }
14442                 else
14443                   {
14444                     printf (_("<corrupt>"));
14445                     p = (unsigned char *) end;
14446                   }
14447                 putchar ('\n');
14448               }
14449               break;
14450
14451             case 64: /* Tag_nodefaults.  */
14452               /* PR 17531: file: 001-505008-0.01.  */
14453               if (p < end)
14454                 p++;
14455               printf (_("True\n"));
14456               break;
14457
14458             case 65: /* Tag_also_compatible_with.  */
14459               val = read_uleb128 (p, &len, end);
14460               p += len;
14461               if (val == 6 /* Tag_CPU_arch.  */)
14462                 {
14463                   val = read_uleb128 (p, &len, end);
14464                   p += len;
14465                   if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
14466                     printf ("??? (%d)\n", val);
14467                   else
14468                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
14469                 }
14470               else
14471                 printf ("???\n");
14472               while (p < end && *(p++) != '\0' /* NUL terminator.  */)
14473                 ;
14474               break;
14475
14476             default:
14477               printf (_("<unknown: %d>\n"), tag);
14478               break;
14479             }
14480           return p;
14481
14482         case 1:
14483           return display_tag_value (-1, p, end);
14484         case 2:
14485           return display_tag_value (0, p, end);
14486
14487         default:
14488           assert (attr->type & 0x80);
14489           val = read_uleb128 (p, &len, end);
14490           p += len;
14491           type = attr->type & 0x7f;
14492           if (val >= type)
14493             printf ("??? (%d)\n", val);
14494           else
14495             printf ("%s\n", attr->table[val]);
14496           return p;
14497         }
14498     }
14499
14500   return display_tag_value (tag, p, end);
14501 }
14502
14503 static unsigned char *
14504 display_gnu_attribute (unsigned char * p,
14505                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const),
14506                        const unsigned char * const end)
14507 {
14508   int tag;
14509   unsigned int len;
14510   unsigned int val;
14511
14512   tag = read_uleb128 (p, &len, end);
14513   p += len;
14514
14515   /* Tag_compatibility is the only generic GNU attribute defined at
14516      present.  */
14517   if (tag == 32)
14518     {
14519       val = read_uleb128 (p, &len, end);
14520       p += len;
14521
14522       printf (_("flag = %d, vendor = "), val);
14523       if (p == end)
14524         {
14525           printf (_("<corrupt>\n"));
14526           warn (_("corrupt vendor attribute\n"));
14527         }
14528       else
14529         {
14530           if (p < end - 1)
14531             {
14532               size_t maxlen = (end - p) - 1;
14533
14534               print_symbol ((int) maxlen, (const char *) p);
14535               p += strnlen ((char *) p, maxlen) + 1;
14536             }
14537           else
14538             {
14539               printf (_("<corrupt>"));
14540               p = (unsigned char *) end;
14541             }
14542           putchar ('\n');
14543         }
14544       return p;
14545     }
14546
14547   if ((tag & 2) == 0 && display_proc_gnu_attribute)
14548     return display_proc_gnu_attribute (p, tag, end);
14549
14550   return display_tag_value (tag, p, end);
14551 }
14552
14553 static unsigned char *
14554 display_power_gnu_attribute (unsigned char * p,
14555                              unsigned int tag,
14556                              const unsigned char * const end)
14557 {
14558   unsigned int len;
14559   unsigned int val;
14560
14561   if (tag == Tag_GNU_Power_ABI_FP)
14562     {
14563       val = read_uleb128 (p, &len, end);
14564       p += len;
14565       printf ("  Tag_GNU_Power_ABI_FP: ");
14566       if (len == 0)
14567         {
14568           printf (_("<corrupt>\n"));
14569           return p;
14570         }
14571
14572       if (val > 15)
14573         printf ("(%#x), ", val);
14574
14575       switch (val & 3)
14576         {
14577         case 0:
14578           printf (_("unspecified hard/soft float, "));
14579           break;
14580         case 1:
14581           printf (_("hard float, "));
14582           break;
14583         case 2:
14584           printf (_("soft float, "));
14585           break;
14586         case 3:
14587           printf (_("single-precision hard float, "));
14588           break;
14589         }
14590
14591       switch (val & 0xC)
14592         {
14593         case 0:
14594           printf (_("unspecified long double\n"));
14595           break;
14596         case 4:
14597           printf (_("128-bit IBM long double\n"));
14598           break;
14599         case 8:
14600           printf (_("64-bit long double\n"));
14601           break;
14602         case 12:
14603           printf (_("128-bit IEEE long double\n"));
14604           break;
14605         }
14606       return p;
14607     }
14608
14609   if (tag == Tag_GNU_Power_ABI_Vector)
14610     {
14611       val = read_uleb128 (p, &len, end);
14612       p += len;
14613       printf ("  Tag_GNU_Power_ABI_Vector: ");
14614       if (len == 0)
14615         {
14616           printf (_("<corrupt>\n"));
14617           return p;
14618         }
14619
14620       if (val > 3)
14621         printf ("(%#x), ", val);
14622
14623       switch (val & 3)
14624         {
14625         case 0:
14626           printf (_("unspecified\n"));
14627           break;
14628         case 1:
14629           printf (_("generic\n"));
14630           break;
14631         case 2:
14632           printf ("AltiVec\n");
14633           break;
14634         case 3:
14635           printf ("SPE\n");
14636           break;
14637         }
14638       return p;
14639     }
14640
14641   if (tag == Tag_GNU_Power_ABI_Struct_Return)
14642     {
14643       val = read_uleb128 (p, &len, end);
14644       p += len;
14645       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
14646       if (len == 0)
14647         {
14648           printf (_("<corrupt>\n"));
14649           return p;
14650         }
14651
14652       if (val > 2)
14653         printf ("(%#x), ", val);
14654
14655       switch (val & 3)
14656         {
14657         case 0:
14658           printf (_("unspecified\n"));
14659           break;
14660         case 1:
14661           printf ("r3/r4\n");
14662           break;
14663         case 2:
14664           printf (_("memory\n"));
14665           break;
14666         case 3:
14667           printf ("???\n");
14668           break;
14669         }
14670       return p;
14671     }
14672
14673   return display_tag_value (tag & 1, p, end);
14674 }
14675
14676 static unsigned char *
14677 display_s390_gnu_attribute (unsigned char * p,
14678                             unsigned int tag,
14679                             const unsigned char * const end)
14680 {
14681   unsigned int len;
14682   int val;
14683
14684   if (tag == Tag_GNU_S390_ABI_Vector)
14685     {
14686       val = read_uleb128 (p, &len, end);
14687       p += len;
14688       printf ("  Tag_GNU_S390_ABI_Vector: ");
14689
14690       switch (val)
14691         {
14692         case 0:
14693           printf (_("any\n"));
14694           break;
14695         case 1:
14696           printf (_("software\n"));
14697           break;
14698         case 2:
14699           printf (_("hardware\n"));
14700           break;
14701         default:
14702           printf ("??? (%d)\n", val);
14703           break;
14704         }
14705       return p;
14706    }
14707
14708   return display_tag_value (tag & 1, p, end);
14709 }
14710
14711 static void
14712 display_sparc_hwcaps (unsigned int mask)
14713 {
14714   if (mask)
14715     {
14716       bfd_boolean first = TRUE;
14717
14718       if (mask & ELF_SPARC_HWCAP_MUL32)
14719         fputs ("mul32", stdout), first = FALSE;
14720       if (mask & ELF_SPARC_HWCAP_DIV32)
14721         printf ("%sdiv32", first ? "" : "|"), first = FALSE;
14722       if (mask & ELF_SPARC_HWCAP_FSMULD)
14723         printf ("%sfsmuld", first ? "" : "|"), first = FALSE;
14724       if (mask & ELF_SPARC_HWCAP_V8PLUS)
14725         printf ("%sv8plus", first ? "" : "|"), first = FALSE;
14726       if (mask & ELF_SPARC_HWCAP_POPC)
14727         printf ("%spopc", first ? "" : "|"), first = FALSE;
14728       if (mask & ELF_SPARC_HWCAP_VIS)
14729         printf ("%svis", first ? "" : "|"), first = FALSE;
14730       if (mask & ELF_SPARC_HWCAP_VIS2)
14731         printf ("%svis2", first ? "" : "|"), first = FALSE;
14732       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
14733         printf ("%sASIBlkInit", first ? "" : "|"), first = FALSE;
14734       if (mask & ELF_SPARC_HWCAP_FMAF)
14735         printf ("%sfmaf", first ? "" : "|"), first = FALSE;
14736       if (mask & ELF_SPARC_HWCAP_VIS3)
14737         printf ("%svis3", first ? "" : "|"), first = FALSE;
14738       if (mask & ELF_SPARC_HWCAP_HPC)
14739         printf ("%shpc", first ? "" : "|"), first = FALSE;
14740       if (mask & ELF_SPARC_HWCAP_RANDOM)
14741         printf ("%srandom", first ? "" : "|"), first = FALSE;
14742       if (mask & ELF_SPARC_HWCAP_TRANS)
14743         printf ("%strans", first ? "" : "|"), first = FALSE;
14744       if (mask & ELF_SPARC_HWCAP_FJFMAU)
14745         printf ("%sfjfmau", first ? "" : "|"), first = FALSE;
14746       if (mask & ELF_SPARC_HWCAP_IMA)
14747         printf ("%sima", first ? "" : "|"), first = FALSE;
14748       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
14749         printf ("%scspare", first ? "" : "|"), first = FALSE;
14750     }
14751   else
14752     fputc ('0', stdout);
14753   fputc ('\n', stdout);
14754 }
14755
14756 static void
14757 display_sparc_hwcaps2 (unsigned int mask)
14758 {
14759   if (mask)
14760     {
14761       bfd_boolean first = TRUE;
14762
14763       if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
14764         fputs ("fjathplus", stdout), first = FALSE;
14765       if (mask & ELF_SPARC_HWCAP2_VIS3B)
14766         printf ("%svis3b", first ? "" : "|"), first = FALSE;
14767       if (mask & ELF_SPARC_HWCAP2_ADP)
14768         printf ("%sadp", first ? "" : "|"), first = FALSE;
14769       if (mask & ELF_SPARC_HWCAP2_SPARC5)
14770         printf ("%ssparc5", first ? "" : "|"), first = FALSE;
14771       if (mask & ELF_SPARC_HWCAP2_MWAIT)
14772         printf ("%smwait", first ? "" : "|"), first = FALSE;
14773       if (mask & ELF_SPARC_HWCAP2_XMPMUL)
14774         printf ("%sxmpmul", first ? "" : "|"), first = FALSE;
14775       if (mask & ELF_SPARC_HWCAP2_XMONT)
14776         printf ("%sxmont2", first ? "" : "|"), first = FALSE;
14777       if (mask & ELF_SPARC_HWCAP2_NSEC)
14778         printf ("%snsec", first ? "" : "|"), first = FALSE;
14779       if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
14780         printf ("%sfjathhpc", first ? "" : "|"), first = FALSE;
14781       if (mask & ELF_SPARC_HWCAP2_FJDES)
14782         printf ("%sfjdes", first ? "" : "|"), first = FALSE;
14783       if (mask & ELF_SPARC_HWCAP2_FJAES)
14784         printf ("%sfjaes", first ? "" : "|"), first = FALSE;
14785     }
14786   else
14787     fputc ('0', stdout);
14788   fputc ('\n', stdout);
14789 }
14790
14791 static unsigned char *
14792 display_sparc_gnu_attribute (unsigned char * p,
14793                              unsigned int tag,
14794                              const unsigned char * const end)
14795 {
14796   unsigned int len;
14797   int val;
14798
14799   if (tag == Tag_GNU_Sparc_HWCAPS)
14800     {
14801       val = read_uleb128 (p, &len, end);
14802       p += len;
14803       printf ("  Tag_GNU_Sparc_HWCAPS: ");
14804       display_sparc_hwcaps (val);
14805       return p;
14806     }
14807   if (tag == Tag_GNU_Sparc_HWCAPS2)
14808     {
14809       val = read_uleb128 (p, &len, end);
14810       p += len;
14811       printf ("  Tag_GNU_Sparc_HWCAPS2: ");
14812       display_sparc_hwcaps2 (val);
14813       return p;
14814     }
14815
14816   return display_tag_value (tag, p, end);
14817 }
14818
14819 static void
14820 print_mips_fp_abi_value (unsigned int val)
14821 {
14822   switch (val)
14823     {
14824     case Val_GNU_MIPS_ABI_FP_ANY:
14825       printf (_("Hard or soft float\n"));
14826       break;
14827     case Val_GNU_MIPS_ABI_FP_DOUBLE:
14828       printf (_("Hard float (double precision)\n"));
14829       break;
14830     case Val_GNU_MIPS_ABI_FP_SINGLE:
14831       printf (_("Hard float (single precision)\n"));
14832       break;
14833     case Val_GNU_MIPS_ABI_FP_SOFT:
14834       printf (_("Soft float\n"));
14835       break;
14836     case Val_GNU_MIPS_ABI_FP_OLD_64:
14837       printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
14838       break;
14839     case Val_GNU_MIPS_ABI_FP_XX:
14840       printf (_("Hard float (32-bit CPU, Any FPU)\n"));
14841       break;
14842     case Val_GNU_MIPS_ABI_FP_64:
14843       printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
14844       break;
14845     case Val_GNU_MIPS_ABI_FP_64A:
14846       printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
14847       break;
14848     case Val_GNU_MIPS_ABI_FP_NAN2008:
14849       printf (_("NaN 2008 compatibility\n"));
14850       break;
14851     default:
14852       printf ("??? (%d)\n", val);
14853       break;
14854     }
14855 }
14856
14857 static unsigned char *
14858 display_mips_gnu_attribute (unsigned char * p,
14859                             unsigned int tag,
14860                             const unsigned char * const end)
14861 {
14862   if (tag == Tag_GNU_MIPS_ABI_FP)
14863     {
14864       unsigned int len;
14865       unsigned int val;
14866
14867       val = read_uleb128 (p, &len, end);
14868       p += len;
14869       printf ("  Tag_GNU_MIPS_ABI_FP: ");
14870
14871       print_mips_fp_abi_value (val);
14872
14873       return p;
14874    }
14875
14876   if (tag == Tag_GNU_MIPS_ABI_MSA)
14877     {
14878       unsigned int len;
14879       unsigned int val;
14880
14881       val = read_uleb128 (p, &len, end);
14882       p += len;
14883       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
14884
14885       switch (val)
14886         {
14887         case Val_GNU_MIPS_ABI_MSA_ANY:
14888           printf (_("Any MSA or not\n"));
14889           break;
14890         case Val_GNU_MIPS_ABI_MSA_128:
14891           printf (_("128-bit MSA\n"));
14892           break;
14893         default:
14894           printf ("??? (%d)\n", val);
14895           break;
14896         }
14897       return p;
14898     }
14899
14900   return display_tag_value (tag & 1, p, end);
14901 }
14902
14903 static unsigned char *
14904 display_tic6x_attribute (unsigned char * p,
14905                          const unsigned char * const end)
14906 {
14907   unsigned int tag;
14908   unsigned int len;
14909   int val;
14910
14911   tag = read_uleb128 (p, &len, end);
14912   p += len;
14913
14914   switch (tag)
14915     {
14916     case Tag_ISA:
14917       val = read_uleb128 (p, &len, end);
14918       p += len;
14919       printf ("  Tag_ISA: ");
14920
14921       switch (val)
14922         {
14923         case C6XABI_Tag_ISA_none:
14924           printf (_("None\n"));
14925           break;
14926         case C6XABI_Tag_ISA_C62X:
14927           printf ("C62x\n");
14928           break;
14929         case C6XABI_Tag_ISA_C67X:
14930           printf ("C67x\n");
14931           break;
14932         case C6XABI_Tag_ISA_C67XP:
14933           printf ("C67x+\n");
14934           break;
14935         case C6XABI_Tag_ISA_C64X:
14936           printf ("C64x\n");
14937           break;
14938         case C6XABI_Tag_ISA_C64XP:
14939           printf ("C64x+\n");
14940           break;
14941         case C6XABI_Tag_ISA_C674X:
14942           printf ("C674x\n");
14943           break;
14944         default:
14945           printf ("??? (%d)\n", val);
14946           break;
14947         }
14948       return p;
14949
14950     case Tag_ABI_wchar_t:
14951       val = read_uleb128 (p, &len, end);
14952       p += len;
14953       printf ("  Tag_ABI_wchar_t: ");
14954       switch (val)
14955         {
14956         case 0:
14957           printf (_("Not used\n"));
14958           break;
14959         case 1:
14960           printf (_("2 bytes\n"));
14961           break;
14962         case 2:
14963           printf (_("4 bytes\n"));
14964           break;
14965         default:
14966           printf ("??? (%d)\n", val);
14967           break;
14968         }
14969       return p;
14970
14971     case Tag_ABI_stack_align_needed:
14972       val = read_uleb128 (p, &len, end);
14973       p += len;
14974       printf ("  Tag_ABI_stack_align_needed: ");
14975       switch (val)
14976         {
14977         case 0:
14978           printf (_("8-byte\n"));
14979           break;
14980         case 1:
14981           printf (_("16-byte\n"));
14982           break;
14983         default:
14984           printf ("??? (%d)\n", val);
14985           break;
14986         }
14987       return p;
14988
14989     case Tag_ABI_stack_align_preserved:
14990       val = read_uleb128 (p, &len, end);
14991       p += len;
14992       printf ("  Tag_ABI_stack_align_preserved: ");
14993       switch (val)
14994         {
14995         case 0:
14996           printf (_("8-byte\n"));
14997           break;
14998         case 1:
14999           printf (_("16-byte\n"));
15000           break;
15001         default:
15002           printf ("??? (%d)\n", val);
15003           break;
15004         }
15005       return p;
15006
15007     case Tag_ABI_DSBT:
15008       val = read_uleb128 (p, &len, end);
15009       p += len;
15010       printf ("  Tag_ABI_DSBT: ");
15011       switch (val)
15012         {
15013         case 0:
15014           printf (_("DSBT addressing not used\n"));
15015           break;
15016         case 1:
15017           printf (_("DSBT addressing used\n"));
15018           break;
15019         default:
15020           printf ("??? (%d)\n", val);
15021           break;
15022         }
15023       return p;
15024
15025     case Tag_ABI_PID:
15026       val = read_uleb128 (p, &len, end);
15027       p += len;
15028       printf ("  Tag_ABI_PID: ");
15029       switch (val)
15030         {
15031         case 0:
15032           printf (_("Data addressing position-dependent\n"));
15033           break;
15034         case 1:
15035           printf (_("Data addressing position-independent, GOT near DP\n"));
15036           break;
15037         case 2:
15038           printf (_("Data addressing position-independent, GOT far from DP\n"));
15039           break;
15040         default:
15041           printf ("??? (%d)\n", val);
15042           break;
15043         }
15044       return p;
15045
15046     case Tag_ABI_PIC:
15047       val = read_uleb128 (p, &len, end);
15048       p += len;
15049       printf ("  Tag_ABI_PIC: ");
15050       switch (val)
15051         {
15052         case 0:
15053           printf (_("Code addressing position-dependent\n"));
15054           break;
15055         case 1:
15056           printf (_("Code addressing position-independent\n"));
15057           break;
15058         default:
15059           printf ("??? (%d)\n", val);
15060           break;
15061         }
15062       return p;
15063
15064     case Tag_ABI_array_object_alignment:
15065       val = read_uleb128 (p, &len, end);
15066       p += len;
15067       printf ("  Tag_ABI_array_object_alignment: ");
15068       switch (val)
15069         {
15070         case 0:
15071           printf (_("8-byte\n"));
15072           break;
15073         case 1:
15074           printf (_("4-byte\n"));
15075           break;
15076         case 2:
15077           printf (_("16-byte\n"));
15078           break;
15079         default:
15080           printf ("??? (%d)\n", val);
15081           break;
15082         }
15083       return p;
15084
15085     case Tag_ABI_array_object_align_expected:
15086       val = read_uleb128 (p, &len, end);
15087       p += len;
15088       printf ("  Tag_ABI_array_object_align_expected: ");
15089       switch (val)
15090         {
15091         case 0:
15092           printf (_("8-byte\n"));
15093           break;
15094         case 1:
15095           printf (_("4-byte\n"));
15096           break;
15097         case 2:
15098           printf (_("16-byte\n"));
15099           break;
15100         default:
15101           printf ("??? (%d)\n", val);
15102           break;
15103         }
15104       return p;
15105
15106     case Tag_ABI_compatibility:
15107       {
15108         val = read_uleb128 (p, &len, end);
15109         p += len;
15110         printf ("  Tag_ABI_compatibility: ");
15111         printf (_("flag = %d, vendor = "), val);
15112         if (p < end - 1)
15113           {
15114             size_t maxlen = (end - p) - 1;
15115
15116             print_symbol ((int) maxlen, (const char *) p);
15117             p += strnlen ((char *) p, maxlen) + 1;
15118           }
15119         else
15120           {
15121             printf (_("<corrupt>"));
15122             p = (unsigned char *) end;
15123           }
15124         putchar ('\n');
15125         return p;
15126       }
15127
15128     case Tag_ABI_conformance:
15129       {
15130         printf ("  Tag_ABI_conformance: \"");
15131         if (p < end - 1)
15132           {
15133             size_t maxlen = (end - p) - 1;
15134
15135             print_symbol ((int) maxlen, (const char *) p);
15136             p += strnlen ((char *) p, maxlen) + 1;
15137           }
15138         else
15139           {
15140             printf (_("<corrupt>"));
15141             p = (unsigned char *) end;
15142           }
15143         printf ("\"\n");
15144         return p;
15145       }
15146     }
15147
15148   return display_tag_value (tag, p, end);
15149 }
15150
15151 static void
15152 display_raw_attribute (unsigned char * p, unsigned char const * const end)
15153 {
15154   unsigned long addr = 0;
15155   size_t bytes = end - p;
15156
15157   assert (end > p);
15158   while (bytes)
15159     {
15160       int j;
15161       int k;
15162       int lbytes = (bytes > 16 ? 16 : bytes);
15163
15164       printf ("  0x%8.8lx ", addr);
15165
15166       for (j = 0; j < 16; j++)
15167         {
15168           if (j < lbytes)
15169             printf ("%2.2x", p[j]);
15170           else
15171             printf ("  ");
15172
15173           if ((j & 3) == 3)
15174             printf (" ");
15175         }
15176
15177       for (j = 0; j < lbytes; j++)
15178         {
15179           k = p[j];
15180           if (k >= ' ' && k < 0x7f)
15181             printf ("%c", k);
15182           else
15183             printf (".");
15184         }
15185
15186       putchar ('\n');
15187
15188       p  += lbytes;
15189       bytes -= lbytes;
15190       addr += lbytes;
15191     }
15192
15193   putchar ('\n');
15194 }
15195
15196 static unsigned char *
15197 display_msp430x_attribute (unsigned char * p,
15198                            const unsigned char * const end)
15199 {
15200   unsigned int len;
15201   unsigned int val;
15202   unsigned int tag;
15203
15204   tag = read_uleb128 (p, & len, end);
15205   p += len;
15206
15207   switch (tag)
15208     {
15209     case OFBA_MSPABI_Tag_ISA:
15210       val = read_uleb128 (p, &len, end);
15211       p += len;
15212       printf ("  Tag_ISA: ");
15213       switch (val)
15214         {
15215         case 0: printf (_("None\n")); break;
15216         case 1: printf (_("MSP430\n")); break;
15217         case 2: printf (_("MSP430X\n")); break;
15218         default: printf ("??? (%d)\n", val); break;
15219         }
15220       break;
15221
15222     case OFBA_MSPABI_Tag_Code_Model:
15223       val = read_uleb128 (p, &len, end);
15224       p += len;
15225       printf ("  Tag_Code_Model: ");
15226       switch (val)
15227         {
15228         case 0: printf (_("None\n")); break;
15229         case 1: printf (_("Small\n")); break;
15230         case 2: printf (_("Large\n")); break;
15231         default: printf ("??? (%d)\n", val); break;
15232         }
15233       break;
15234
15235     case OFBA_MSPABI_Tag_Data_Model:
15236       val = read_uleb128 (p, &len, end);
15237       p += len;
15238       printf ("  Tag_Data_Model: ");
15239       switch (val)
15240         {
15241         case 0: printf (_("None\n")); break;
15242         case 1: printf (_("Small\n")); break;
15243         case 2: printf (_("Large\n")); break;
15244         case 3: printf (_("Restricted Large\n")); break;
15245         default: printf ("??? (%d)\n", val); break;
15246         }
15247       break;
15248
15249     default:
15250       printf (_("  <unknown tag %d>: "), tag);
15251
15252       if (tag & 1)
15253         {
15254           putchar ('"');
15255           if (p < end - 1)
15256             {
15257               size_t maxlen = (end - p) - 1;
15258
15259               print_symbol ((int) maxlen, (const char *) p);
15260               p += strnlen ((char *) p, maxlen) + 1;
15261             }
15262           else
15263             {
15264               printf (_("<corrupt>"));
15265               p = (unsigned char *) end;
15266             }
15267           printf ("\"\n");
15268         }
15269       else
15270         {
15271           val = read_uleb128 (p, &len, end);
15272           p += len;
15273           printf ("%d (0x%x)\n", val, val);
15274         }
15275       break;
15276    }
15277
15278   assert (p <= end);
15279   return p;
15280 }
15281
15282 static bfd_boolean
15283 process_attributes (Filedata * filedata,
15284                     const char * public_name,
15285                     unsigned int proc_type,
15286                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
15287                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const))
15288 {
15289   Elf_Internal_Shdr * sect;
15290   unsigned i;
15291   bfd_boolean res = TRUE;
15292
15293   /* Find the section header so that we get the size.  */
15294   for (i = 0, sect = filedata->section_headers;
15295        i < filedata->file_header.e_shnum;
15296        i++, sect++)
15297     {
15298       unsigned char * contents;
15299       unsigned char * p;
15300
15301       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
15302         continue;
15303
15304       contents = (unsigned char *) get_data (NULL, filedata, sect->sh_offset, 1,
15305                                              sect->sh_size, _("attributes"));
15306       if (contents == NULL)
15307         {
15308           res = FALSE;
15309           continue;
15310         }
15311
15312       p = contents;
15313       /* The first character is the version of the attributes.
15314          Currently only version 1, (aka 'A') is recognised here.  */
15315       if (*p != 'A')
15316         {
15317           printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p);
15318           res = FALSE;
15319         }
15320       else
15321         {
15322           bfd_vma section_len;
15323
15324           section_len = sect->sh_size - 1;
15325           p++;
15326
15327           while (section_len > 0)
15328             {
15329               bfd_vma attr_len;
15330               unsigned int namelen;
15331               bfd_boolean public_section;
15332               bfd_boolean gnu_section;
15333
15334               if (section_len <= 4)
15335                 {
15336                   error (_("Tag section ends prematurely\n"));
15337                   res = FALSE;
15338                   break;
15339                 }
15340               attr_len = byte_get (p, 4);
15341               p += 4;
15342
15343               if (attr_len > section_len)
15344                 {
15345                   error (_("Bad attribute length (%u > %u)\n"),
15346                           (unsigned) attr_len, (unsigned) section_len);
15347                   attr_len = section_len;
15348                   res = FALSE;
15349                 }
15350               /* PR 17531: file: 001-101425-0.004  */
15351               else if (attr_len < 5)
15352                 {
15353                   error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
15354                   res = FALSE;
15355                   break;
15356                 }
15357
15358               section_len -= attr_len;
15359               attr_len -= 4;
15360
15361               namelen = strnlen ((char *) p, attr_len) + 1;
15362               if (namelen == 0 || namelen >= attr_len)
15363                 {
15364                   error (_("Corrupt attribute section name\n"));
15365                   res = FALSE;
15366                   break;
15367                 }
15368
15369               printf (_("Attribute Section: "));
15370               print_symbol (INT_MAX, (const char *) p);
15371               putchar ('\n');
15372
15373               if (public_name && streq ((char *) p, public_name))
15374                 public_section = TRUE;
15375               else
15376                 public_section = FALSE;
15377
15378               if (streq ((char *) p, "gnu"))
15379                 gnu_section = TRUE;
15380               else
15381                 gnu_section = FALSE;
15382
15383               p += namelen;
15384               attr_len -= namelen;
15385
15386               while (attr_len > 0 && p < contents + sect->sh_size)
15387                 {
15388                   int tag;
15389                   int val;
15390                   bfd_vma size;
15391                   unsigned char * end;
15392
15393                   /* PR binutils/17531: Safe handling of corrupt files.  */
15394                   if (attr_len < 6)
15395                     {
15396                       error (_("Unused bytes at end of section\n"));
15397                       res = FALSE;
15398                       section_len = 0;
15399                       break;
15400                     }
15401
15402                   tag = *(p++);
15403                   size = byte_get (p, 4);
15404                   if (size > attr_len)
15405                     {
15406                       error (_("Bad subsection length (%u > %u)\n"),
15407                               (unsigned) size, (unsigned) attr_len);
15408                       res = FALSE;
15409                       size = attr_len;
15410                     }
15411                   /* PR binutils/17531: Safe handling of corrupt files.  */
15412                   if (size < 6)
15413                     {
15414                       error (_("Bad subsection length (%u < 6)\n"),
15415                               (unsigned) size);
15416                       res = FALSE;
15417                       section_len = 0;
15418                       break;
15419                     }
15420
15421                   attr_len -= size;
15422                   end = p + size - 1;
15423                   assert (end <= contents + sect->sh_size);
15424                   p += 4;
15425
15426                   switch (tag)
15427                     {
15428                     case 1:
15429                       printf (_("File Attributes\n"));
15430                       break;
15431                     case 2:
15432                       printf (_("Section Attributes:"));
15433                       goto do_numlist;
15434                     case 3:
15435                       printf (_("Symbol Attributes:"));
15436                       /* Fall through.  */
15437                     do_numlist:
15438                       for (;;)
15439                         {
15440                           unsigned int j;
15441
15442                           val = read_uleb128 (p, &j, end);
15443                           p += j;
15444                           if (val == 0)
15445                             break;
15446                           printf (" %d", val);
15447                         }
15448                       printf ("\n");
15449                       break;
15450                     default:
15451                       printf (_("Unknown tag: %d\n"), tag);
15452                       public_section = FALSE;
15453                       break;
15454                     }
15455
15456                   if (public_section && display_pub_attribute != NULL)
15457                     {
15458                       while (p < end)
15459                         p = display_pub_attribute (p, end);
15460                       assert (p == end);
15461                     }
15462                   else if (gnu_section && display_proc_gnu_attribute != NULL)
15463                     {
15464                       while (p < end)
15465                         p = display_gnu_attribute (p,
15466                                                    display_proc_gnu_attribute,
15467                                                    end);
15468                       assert (p == end);
15469                     }
15470                   else if (p < end)
15471                     {
15472                       printf (_("  Unknown attribute:\n"));
15473                       display_raw_attribute (p, end);
15474                       p = end;
15475                     }
15476                   else
15477                     attr_len = 0;
15478                 }
15479             }
15480         }
15481
15482       free (contents);
15483     }
15484
15485   return res;
15486 }
15487
15488 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
15489    Print the Address, Access and Initial fields of an entry at VMA ADDR
15490    and return the VMA of the next entry, or -1 if there was a problem.
15491    Does not read from DATA_END or beyond.  */
15492
15493 static bfd_vma
15494 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
15495                       unsigned char * data_end)
15496 {
15497   printf ("  ");
15498   print_vma (addr, LONG_HEX);
15499   printf (" ");
15500   if (addr < pltgot + 0xfff0)
15501     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
15502   else
15503     printf ("%10s", "");
15504   printf (" ");
15505   if (data == NULL)
15506     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15507   else
15508     {
15509       bfd_vma entry;
15510       unsigned char * from = data + addr - pltgot;
15511
15512       if (from + (is_32bit_elf ? 4 : 8) > data_end)
15513         {
15514           warn (_("MIPS GOT entry extends beyond the end of available data\n"));
15515           printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
15516           return (bfd_vma) -1;
15517         }
15518       else
15519         {
15520           entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15521           print_vma (entry, LONG_HEX);
15522         }
15523     }
15524   return addr + (is_32bit_elf ? 4 : 8);
15525 }
15526
15527 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
15528    PLTGOT.  Print the Address and Initial fields of an entry at VMA
15529    ADDR and return the VMA of the next entry.  */
15530
15531 static bfd_vma
15532 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
15533 {
15534   printf ("  ");
15535   print_vma (addr, LONG_HEX);
15536   printf (" ");
15537   if (data == NULL)
15538     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15539   else
15540     {
15541       bfd_vma entry;
15542
15543       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15544       print_vma (entry, LONG_HEX);
15545     }
15546   return addr + (is_32bit_elf ? 4 : 8);
15547 }
15548
15549 static void
15550 print_mips_ases (unsigned int mask)
15551 {
15552   if (mask & AFL_ASE_DSP)
15553     fputs ("\n\tDSP ASE", stdout);
15554   if (mask & AFL_ASE_DSPR2)
15555     fputs ("\n\tDSP R2 ASE", stdout);
15556   if (mask & AFL_ASE_DSPR3)
15557     fputs ("\n\tDSP R3 ASE", stdout);
15558   if (mask & AFL_ASE_EVA)
15559     fputs ("\n\tEnhanced VA Scheme", stdout);
15560   if (mask & AFL_ASE_MCU)
15561     fputs ("\n\tMCU (MicroController) ASE", stdout);
15562   if (mask & AFL_ASE_MDMX)
15563     fputs ("\n\tMDMX ASE", stdout);
15564   if (mask & AFL_ASE_MIPS3D)
15565     fputs ("\n\tMIPS-3D ASE", stdout);
15566   if (mask & AFL_ASE_MT)
15567     fputs ("\n\tMT ASE", stdout);
15568   if (mask & AFL_ASE_SMARTMIPS)
15569     fputs ("\n\tSmartMIPS ASE", stdout);
15570   if (mask & AFL_ASE_VIRT)
15571     fputs ("\n\tVZ ASE", stdout);
15572   if (mask & AFL_ASE_MSA)
15573     fputs ("\n\tMSA ASE", stdout);
15574   if (mask & AFL_ASE_MIPS16)
15575     fputs ("\n\tMIPS16 ASE", stdout);
15576   if (mask & AFL_ASE_MICROMIPS)
15577     fputs ("\n\tMICROMIPS ASE", stdout);
15578   if (mask & AFL_ASE_XPA)
15579     fputs ("\n\tXPA ASE", stdout);
15580   if (mask & AFL_ASE_MIPS16E2)
15581     fputs ("\n\tMIPS16e2 ASE", stdout);
15582   if (mask & AFL_ASE_CRC)
15583     fputs ("\n\tCRC ASE", stdout);
15584   if (mask & AFL_ASE_GINV)
15585     fputs ("\n\tGINV ASE", stdout);
15586   if (mask == 0)
15587     fprintf (stdout, "\n\t%s", _("None"));
15588   else if ((mask & ~AFL_ASE_MASK) != 0)
15589     fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
15590 }
15591
15592 static void
15593 print_mips_isa_ext (unsigned int isa_ext)
15594 {
15595   switch (isa_ext)
15596     {
15597     case 0:
15598       fputs (_("None"), stdout);
15599       break;
15600     case AFL_EXT_XLR:
15601       fputs ("RMI XLR", stdout);
15602       break;
15603     case AFL_EXT_OCTEON3:
15604       fputs ("Cavium Networks Octeon3", stdout);
15605       break;
15606     case AFL_EXT_OCTEON2:
15607       fputs ("Cavium Networks Octeon2", stdout);
15608       break;
15609     case AFL_EXT_OCTEONP:
15610       fputs ("Cavium Networks OcteonP", stdout);
15611       break;
15612     case AFL_EXT_LOONGSON_3A:
15613       fputs ("Loongson 3A", stdout);
15614       break;
15615     case AFL_EXT_OCTEON:
15616       fputs ("Cavium Networks Octeon", stdout);
15617       break;
15618     case AFL_EXT_5900:
15619       fputs ("Toshiba R5900", stdout);
15620       break;
15621     case AFL_EXT_4650:
15622       fputs ("MIPS R4650", stdout);
15623       break;
15624     case AFL_EXT_4010:
15625       fputs ("LSI R4010", stdout);
15626       break;
15627     case AFL_EXT_4100:
15628       fputs ("NEC VR4100", stdout);
15629       break;
15630     case AFL_EXT_3900:
15631       fputs ("Toshiba R3900", stdout);
15632       break;
15633     case AFL_EXT_10000:
15634       fputs ("MIPS R10000", stdout);
15635       break;
15636     case AFL_EXT_SB1:
15637       fputs ("Broadcom SB-1", stdout);
15638       break;
15639     case AFL_EXT_4111:
15640       fputs ("NEC VR4111/VR4181", stdout);
15641       break;
15642     case AFL_EXT_4120:
15643       fputs ("NEC VR4120", stdout);
15644       break;
15645     case AFL_EXT_5400:
15646       fputs ("NEC VR5400", stdout);
15647       break;
15648     case AFL_EXT_5500:
15649       fputs ("NEC VR5500", stdout);
15650       break;
15651     case AFL_EXT_LOONGSON_2E:
15652       fputs ("ST Microelectronics Loongson 2E", stdout);
15653       break;
15654     case AFL_EXT_LOONGSON_2F:
15655       fputs ("ST Microelectronics Loongson 2F", stdout);
15656       break;
15657     case AFL_EXT_INTERAPTIV_MR2:
15658       fputs ("Imagination interAptiv MR2", stdout);
15659       break;
15660     default:
15661       fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
15662     }
15663 }
15664
15665 static signed int
15666 get_mips_reg_size (int reg_size)
15667 {
15668   return (reg_size == AFL_REG_NONE) ? 0
15669          : (reg_size == AFL_REG_32) ? 32
15670          : (reg_size == AFL_REG_64) ? 64
15671          : (reg_size == AFL_REG_128) ? 128
15672          : -1;
15673 }
15674
15675 static bfd_boolean
15676 process_mips_specific (Filedata * filedata)
15677 {
15678   Elf_Internal_Dyn * entry;
15679   Elf_Internal_Shdr *sect = NULL;
15680   size_t liblist_offset = 0;
15681   size_t liblistno = 0;
15682   size_t conflictsno = 0;
15683   size_t options_offset = 0;
15684   size_t conflicts_offset = 0;
15685   size_t pltrelsz = 0;
15686   size_t pltrel = 0;
15687   bfd_vma pltgot = 0;
15688   bfd_vma mips_pltgot = 0;
15689   bfd_vma jmprel = 0;
15690   bfd_vma local_gotno = 0;
15691   bfd_vma gotsym = 0;
15692   bfd_vma symtabno = 0;
15693   bfd_boolean res = TRUE;
15694
15695   if (! process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
15696                             display_mips_gnu_attribute))
15697     res = FALSE;
15698
15699   sect = find_section (filedata, ".MIPS.abiflags");
15700
15701   if (sect != NULL)
15702     {
15703       Elf_External_ABIFlags_v0 *abiflags_ext;
15704       Elf_Internal_ABIFlags_v0 abiflags_in;
15705
15706       if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
15707         {
15708           error (_("Corrupt MIPS ABI Flags section.\n"));
15709           res = FALSE;
15710         }
15711       else
15712         {
15713           abiflags_ext = get_data (NULL, filedata, sect->sh_offset, 1,
15714                                    sect->sh_size, _("MIPS ABI Flags section"));
15715           if (abiflags_ext)
15716             {
15717               abiflags_in.version = BYTE_GET (abiflags_ext->version);
15718               abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
15719               abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
15720               abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
15721               abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
15722               abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
15723               abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
15724               abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
15725               abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
15726               abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
15727               abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
15728
15729               printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
15730               printf ("\nISA: MIPS%d", abiflags_in.isa_level);
15731               if (abiflags_in.isa_rev > 1)
15732                 printf ("r%d", abiflags_in.isa_rev);
15733               printf ("\nGPR size: %d",
15734                       get_mips_reg_size (abiflags_in.gpr_size));
15735               printf ("\nCPR1 size: %d",
15736                       get_mips_reg_size (abiflags_in.cpr1_size));
15737               printf ("\nCPR2 size: %d",
15738                       get_mips_reg_size (abiflags_in.cpr2_size));
15739               fputs ("\nFP ABI: ", stdout);
15740               print_mips_fp_abi_value (abiflags_in.fp_abi);
15741               fputs ("ISA Extension: ", stdout);
15742               print_mips_isa_ext (abiflags_in.isa_ext);
15743               fputs ("\nASEs:", stdout);
15744               print_mips_ases (abiflags_in.ases);
15745               printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
15746               printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
15747               fputc ('\n', stdout);
15748               free (abiflags_ext);
15749             }
15750         }
15751     }
15752
15753   /* We have a lot of special sections.  Thanks SGI!  */
15754   if (dynamic_section == NULL)
15755     {
15756       /* No dynamic information available.  See if there is static GOT.  */
15757       sect = find_section (filedata, ".got");
15758       if (sect != NULL)
15759         {
15760           unsigned char *data_end;
15761           unsigned char *data;
15762           bfd_vma ent, end;
15763           int addr_size;
15764
15765           pltgot = sect->sh_addr;
15766
15767           ent = pltgot;
15768           addr_size = (is_32bit_elf ? 4 : 8);
15769           end = pltgot + sect->sh_size;
15770
15771           data = (unsigned char *) get_data (NULL, filedata, sect->sh_offset,
15772                                              end - pltgot, 1,
15773                                              _("Global Offset Table data"));
15774           /* PR 12855: Null data is handled gracefully throughout.  */
15775           data_end = data + (end - pltgot);
15776
15777           printf (_("\nStatic GOT:\n"));
15778           printf (_(" Canonical gp value: "));
15779           print_vma (ent + 0x7ff0, LONG_HEX);
15780           printf ("\n\n");
15781
15782           /* In a dynamic binary GOT[0] is reserved for the dynamic
15783              loader to store the lazy resolver pointer, however in
15784              a static binary it may well have been omitted and GOT
15785              reduced to a table of addresses.
15786              PR 21344: Check for the entry being fully available
15787              before fetching it.  */
15788           if (data
15789               && data + ent - pltgot + addr_size <= data_end
15790               && byte_get (data + ent - pltgot, addr_size) == 0)
15791             {
15792               printf (_(" Reserved entries:\n"));
15793               printf (_("  %*s %10s %*s\n"),
15794                       addr_size * 2, _("Address"), _("Access"),
15795                       addr_size * 2, _("Value"));
15796               ent = print_mips_got_entry (data, pltgot, ent, data_end);
15797               printf ("\n");
15798               if (ent == (bfd_vma) -1)
15799                 goto sgot_print_fail;
15800
15801               /* Check for the MSB of GOT[1] being set, identifying a
15802                  GNU object.  This entry will be used by some runtime
15803                  loaders, to store the module pointer.  Otherwise this
15804                  is an ordinary local entry.
15805                  PR 21344: Check for the entry being fully available
15806                  before fetching it.  */
15807               if (data
15808                   && data + ent - pltgot + addr_size <= data_end
15809                   && (byte_get (data + ent - pltgot, addr_size)
15810                       >> (addr_size * 8 - 1)) != 0)
15811                 {
15812                   ent = print_mips_got_entry (data, pltgot, ent, data_end);
15813                   printf ("\n");
15814                   if (ent == (bfd_vma) -1)
15815                     goto sgot_print_fail;
15816                 }
15817               printf ("\n");
15818             }
15819
15820           if (data != NULL && ent < end)
15821             {
15822               printf (_(" Local entries:\n"));
15823               printf ("  %*s %10s %*s\n",
15824                       addr_size * 2, _("Address"), _("Access"),
15825                       addr_size * 2, _("Value"));
15826               while (ent < end)
15827                 {
15828                   ent = print_mips_got_entry (data, pltgot, ent, data_end);
15829                   printf ("\n");
15830                   if (ent == (bfd_vma) -1)
15831                     goto sgot_print_fail;
15832                 }
15833               printf ("\n");
15834             }
15835
15836         sgot_print_fail:
15837           if (data)
15838             free (data);
15839         }
15840       return res;
15841     }
15842
15843   for (entry = dynamic_section;
15844        /* PR 17531 file: 012-50589-0.004.  */
15845        entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
15846        ++entry)
15847     switch (entry->d_tag)
15848       {
15849       case DT_MIPS_LIBLIST:
15850         liblist_offset
15851           = offset_from_vma (filedata, entry->d_un.d_val,
15852                              liblistno * sizeof (Elf32_External_Lib));
15853         break;
15854       case DT_MIPS_LIBLISTNO:
15855         liblistno = entry->d_un.d_val;
15856         break;
15857       case DT_MIPS_OPTIONS:
15858         options_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
15859         break;
15860       case DT_MIPS_CONFLICT:
15861         conflicts_offset
15862           = offset_from_vma (filedata, entry->d_un.d_val,
15863                              conflictsno * sizeof (Elf32_External_Conflict));
15864         break;
15865       case DT_MIPS_CONFLICTNO:
15866         conflictsno = entry->d_un.d_val;
15867         break;
15868       case DT_PLTGOT:
15869         pltgot = entry->d_un.d_ptr;
15870         break;
15871       case DT_MIPS_LOCAL_GOTNO:
15872         local_gotno = entry->d_un.d_val;
15873         break;
15874       case DT_MIPS_GOTSYM:
15875         gotsym = entry->d_un.d_val;
15876         break;
15877       case DT_MIPS_SYMTABNO:
15878         symtabno = entry->d_un.d_val;
15879         break;
15880       case DT_MIPS_PLTGOT:
15881         mips_pltgot = entry->d_un.d_ptr;
15882         break;
15883       case DT_PLTREL:
15884         pltrel = entry->d_un.d_val;
15885         break;
15886       case DT_PLTRELSZ:
15887         pltrelsz = entry->d_un.d_val;
15888         break;
15889       case DT_JMPREL:
15890         jmprel = entry->d_un.d_ptr;
15891         break;
15892       default:
15893         break;
15894       }
15895
15896   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
15897     {
15898       Elf32_External_Lib * elib;
15899       size_t cnt;
15900
15901       elib = (Elf32_External_Lib *) get_data (NULL, filedata, liblist_offset,
15902                                               liblistno,
15903                                               sizeof (Elf32_External_Lib),
15904                                               _("liblist section data"));
15905       if (elib)
15906         {
15907           printf (ngettext ("\nSection '.liblist' contains %lu entry:\n",
15908                             "\nSection '.liblist' contains %lu entries:\n",
15909                             (unsigned long) liblistno),
15910                   (unsigned long) liblistno);
15911           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
15912                  stdout);
15913
15914           for (cnt = 0; cnt < liblistno; ++cnt)
15915             {
15916               Elf32_Lib liblist;
15917               time_t atime;
15918               char timebuf[128];
15919               struct tm * tmp;
15920
15921               liblist.l_name = BYTE_GET (elib[cnt].l_name);
15922               atime = BYTE_GET (elib[cnt].l_time_stamp);
15923               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15924               liblist.l_version = BYTE_GET (elib[cnt].l_version);
15925               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15926
15927               tmp = gmtime (&atime);
15928               snprintf (timebuf, sizeof (timebuf),
15929                         "%04u-%02u-%02uT%02u:%02u:%02u",
15930                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15931                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
15932
15933               printf ("%3lu: ", (unsigned long) cnt);
15934               if (VALID_DYNAMIC_NAME (liblist.l_name))
15935                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
15936               else
15937                 printf (_("<corrupt: %9ld>"), liblist.l_name);
15938               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
15939                       liblist.l_version);
15940
15941               if (liblist.l_flags == 0)
15942                 puts (_(" NONE"));
15943               else
15944                 {
15945                   static const struct
15946                   {
15947                     const char * name;
15948                     int bit;
15949                   }
15950                   l_flags_vals[] =
15951                   {
15952                     { " EXACT_MATCH", LL_EXACT_MATCH },
15953                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
15954                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
15955                     { " EXPORTS", LL_EXPORTS },
15956                     { " DELAY_LOAD", LL_DELAY_LOAD },
15957                     { " DELTA", LL_DELTA }
15958                   };
15959                   int flags = liblist.l_flags;
15960                   size_t fcnt;
15961
15962                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
15963                     if ((flags & l_flags_vals[fcnt].bit) != 0)
15964                       {
15965                         fputs (l_flags_vals[fcnt].name, stdout);
15966                         flags ^= l_flags_vals[fcnt].bit;
15967                       }
15968                   if (flags != 0)
15969                     printf (" %#x", (unsigned int) flags);
15970
15971                   puts ("");
15972                 }
15973             }
15974
15975           free (elib);
15976         }
15977       else
15978         res = FALSE;
15979     }
15980
15981   if (options_offset != 0)
15982     {
15983       Elf_External_Options * eopt;
15984       Elf_Internal_Options * iopt;
15985       Elf_Internal_Options * option;
15986       size_t offset;
15987       int cnt;
15988       sect = filedata->section_headers;
15989
15990       /* Find the section header so that we get the size.  */
15991       sect = find_section_by_type (filedata, SHT_MIPS_OPTIONS);
15992       /* PR 17533 file: 012-277276-0.004.  */
15993       if (sect == NULL)
15994         {
15995           error (_("No MIPS_OPTIONS header found\n"));
15996           return FALSE;
15997         }
15998
15999       eopt = (Elf_External_Options *) get_data (NULL, filedata, options_offset, 1,
16000                                                 sect->sh_size, _("options"));
16001       if (eopt)
16002         {
16003           iopt = (Elf_Internal_Options *)
16004               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
16005           if (iopt == NULL)
16006             {
16007               error (_("Out of memory allocating space for MIPS options\n"));
16008               return FALSE;
16009             }
16010
16011           offset = cnt = 0;
16012           option = iopt;
16013
16014           while (offset <= sect->sh_size - sizeof (* eopt))
16015             {
16016               Elf_External_Options * eoption;
16017
16018               eoption = (Elf_External_Options *) ((char *) eopt + offset);
16019
16020               option->kind = BYTE_GET (eoption->kind);
16021               option->size = BYTE_GET (eoption->size);
16022               option->section = BYTE_GET (eoption->section);
16023               option->info = BYTE_GET (eoption->info);
16024
16025               /* PR 17531: file: ffa0fa3b.  */
16026               if (option->size < sizeof (* eopt)
16027                   || offset + option->size > sect->sh_size)
16028                 {
16029                   error (_("Invalid size (%u) for MIPS option\n"), option->size);
16030                   return FALSE;
16031                 }
16032               offset += option->size;
16033
16034               ++option;
16035               ++cnt;
16036             }
16037
16038           printf (ngettext ("\nSection '%s' contains %d entry:\n",
16039                             "\nSection '%s' contains %d entries:\n",
16040                             cnt),
16041                   printable_section_name (filedata, sect), cnt);
16042
16043           option = iopt;
16044           offset = 0;
16045
16046           while (cnt-- > 0)
16047             {
16048               size_t len;
16049
16050               switch (option->kind)
16051                 {
16052                 case ODK_NULL:
16053                   /* This shouldn't happen.  */
16054                   printf (" NULL       %d %lx", option->section, option->info);
16055                   break;
16056                 case ODK_REGINFO:
16057                   printf (" REGINFO    ");
16058                   if (filedata->file_header.e_machine == EM_MIPS)
16059                     {
16060                       /* 32bit form.  */
16061                       Elf32_External_RegInfo * ereg;
16062                       Elf32_RegInfo reginfo;
16063
16064                       ereg = (Elf32_External_RegInfo *) (option + 1);
16065                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
16066                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16067                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16068                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16069                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16070                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
16071
16072                       printf ("GPR %08lx  GP 0x%lx\n",
16073                               reginfo.ri_gprmask,
16074                               (unsigned long) reginfo.ri_gp_value);
16075                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
16076                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16077                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16078                     }
16079                   else
16080                     {
16081                       /* 64 bit form.  */
16082                       Elf64_External_RegInfo * ereg;
16083                       Elf64_Internal_RegInfo reginfo;
16084
16085                       ereg = (Elf64_External_RegInfo *) (option + 1);
16086                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
16087                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16088                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16089                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16090                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16091                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
16092
16093                       printf ("GPR %08lx  GP 0x",
16094                               reginfo.ri_gprmask);
16095                       printf_vma (reginfo.ri_gp_value);
16096                       printf ("\n");
16097
16098                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
16099                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16100                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16101                     }
16102                   ++option;
16103                   continue;
16104                 case ODK_EXCEPTIONS:
16105                   fputs (" EXCEPTIONS fpe_min(", stdout);
16106                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
16107                   fputs (") fpe_max(", stdout);
16108                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
16109                   fputs (")", stdout);
16110
16111                   if (option->info & OEX_PAGE0)
16112                     fputs (" PAGE0", stdout);
16113                   if (option->info & OEX_SMM)
16114                     fputs (" SMM", stdout);
16115                   if (option->info & OEX_FPDBUG)
16116                     fputs (" FPDBUG", stdout);
16117                   if (option->info & OEX_DISMISS)
16118                     fputs (" DISMISS", stdout);
16119                   break;
16120                 case ODK_PAD:
16121                   fputs (" PAD       ", stdout);
16122                   if (option->info & OPAD_PREFIX)
16123                     fputs (" PREFIX", stdout);
16124                   if (option->info & OPAD_POSTFIX)
16125                     fputs (" POSTFIX", stdout);
16126                   if (option->info & OPAD_SYMBOL)
16127                     fputs (" SYMBOL", stdout);
16128                   break;
16129                 case ODK_HWPATCH:
16130                   fputs (" HWPATCH   ", stdout);
16131                   if (option->info & OHW_R4KEOP)
16132                     fputs (" R4KEOP", stdout);
16133                   if (option->info & OHW_R8KPFETCH)
16134                     fputs (" R8KPFETCH", stdout);
16135                   if (option->info & OHW_R5KEOP)
16136                     fputs (" R5KEOP", stdout);
16137                   if (option->info & OHW_R5KCVTL)
16138                     fputs (" R5KCVTL", stdout);
16139                   break;
16140                 case ODK_FILL:
16141                   fputs (" FILL       ", stdout);
16142                   /* XXX Print content of info word?  */
16143                   break;
16144                 case ODK_TAGS:
16145                   fputs (" TAGS       ", stdout);
16146                   /* XXX Print content of info word?  */
16147                   break;
16148                 case ODK_HWAND:
16149                   fputs (" HWAND     ", stdout);
16150                   if (option->info & OHWA0_R4KEOP_CHECKED)
16151                     fputs (" R4KEOP_CHECKED", stdout);
16152                   if (option->info & OHWA0_R4KEOP_CLEAN)
16153                     fputs (" R4KEOP_CLEAN", stdout);
16154                   break;
16155                 case ODK_HWOR:
16156                   fputs (" HWOR      ", stdout);
16157                   if (option->info & OHWA0_R4KEOP_CHECKED)
16158                     fputs (" R4KEOP_CHECKED", stdout);
16159                   if (option->info & OHWA0_R4KEOP_CLEAN)
16160                     fputs (" R4KEOP_CLEAN", stdout);
16161                   break;
16162                 case ODK_GP_GROUP:
16163                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
16164                           option->info & OGP_GROUP,
16165                           (option->info & OGP_SELF) >> 16);
16166                   break;
16167                 case ODK_IDENT:
16168                   printf (" IDENT     %#06lx  self-contained %#06lx",
16169                           option->info & OGP_GROUP,
16170                           (option->info & OGP_SELF) >> 16);
16171                   break;
16172                 default:
16173                   /* This shouldn't happen.  */
16174                   printf (" %3d ???     %d %lx",
16175                           option->kind, option->section, option->info);
16176                   break;
16177                 }
16178
16179               len = sizeof (* eopt);
16180               while (len < option->size)
16181                 {
16182                   unsigned char datum = * ((unsigned char *) eopt + offset + len);
16183
16184                   if (ISPRINT (datum))
16185                     printf ("%c", datum);
16186                   else
16187                     printf ("\\%03o", datum);
16188                   len ++;
16189                 }
16190               fputs ("\n", stdout);
16191
16192               offset += option->size;
16193               ++option;
16194             }
16195
16196           free (eopt);
16197         }
16198       else
16199         res = FALSE;
16200     }
16201
16202   if (conflicts_offset != 0 && conflictsno != 0)
16203     {
16204       Elf32_Conflict * iconf;
16205       size_t cnt;
16206
16207       if (dynamic_symbols == NULL)
16208         {
16209           error (_("conflict list found without a dynamic symbol table\n"));
16210           return FALSE;
16211         }
16212
16213       /* PR 21345 - print a slightly more helpful error message
16214          if we are sure that the cmalloc will fail.  */
16215       if (conflictsno * sizeof (* iconf) > filedata->file_size)
16216         {
16217           error (_("Overlarge number of conflicts detected: %lx\n"),
16218                  (long) conflictsno);
16219           return FALSE;
16220         }
16221
16222       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
16223       if (iconf == NULL)
16224         {
16225           error (_("Out of memory allocating space for dynamic conflicts\n"));
16226           return FALSE;
16227         }
16228
16229       if (is_32bit_elf)
16230         {
16231           Elf32_External_Conflict * econf32;
16232
16233           econf32 = (Elf32_External_Conflict *)
16234               get_data (NULL, filedata, conflicts_offset, conflictsno,
16235                         sizeof (* econf32), _("conflict"));
16236           if (!econf32)
16237             return FALSE;
16238
16239           for (cnt = 0; cnt < conflictsno; ++cnt)
16240             iconf[cnt] = BYTE_GET (econf32[cnt]);
16241
16242           free (econf32);
16243         }
16244       else
16245         {
16246           Elf64_External_Conflict * econf64;
16247
16248           econf64 = (Elf64_External_Conflict *)
16249               get_data (NULL, filedata, conflicts_offset, conflictsno,
16250                         sizeof (* econf64), _("conflict"));
16251           if (!econf64)
16252             return FALSE;
16253
16254           for (cnt = 0; cnt < conflictsno; ++cnt)
16255             iconf[cnt] = BYTE_GET (econf64[cnt]);
16256
16257           free (econf64);
16258         }
16259
16260       printf (ngettext ("\nSection '.conflict' contains %lu entry:\n",
16261                         "\nSection '.conflict' contains %lu entries:\n",
16262                         (unsigned long) conflictsno),
16263               (unsigned long) conflictsno);
16264       puts (_("  Num:    Index       Value  Name"));
16265
16266       for (cnt = 0; cnt < conflictsno; ++cnt)
16267         {
16268           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
16269
16270           if (iconf[cnt] >= num_dynamic_syms)
16271             printf (_("<corrupt symbol index>"));
16272           else
16273             {
16274               Elf_Internal_Sym * psym;
16275
16276               psym = & dynamic_symbols[iconf[cnt]];
16277               print_vma (psym->st_value, FULL_HEX);
16278               putchar (' ');
16279               if (VALID_DYNAMIC_NAME (psym->st_name))
16280                 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
16281               else
16282                 printf (_("<corrupt: %14ld>"), psym->st_name);
16283             }
16284           putchar ('\n');
16285         }
16286
16287       free (iconf);
16288     }
16289
16290   if (pltgot != 0 && local_gotno != 0)
16291     {
16292       bfd_vma ent, local_end, global_end;
16293       size_t i, offset;
16294       unsigned char * data;
16295       unsigned char * data_end;
16296       int addr_size;
16297
16298       ent = pltgot;
16299       addr_size = (is_32bit_elf ? 4 : 8);
16300       local_end = pltgot + local_gotno * addr_size;
16301
16302       /* PR binutils/17533 file: 012-111227-0.004  */
16303       if (symtabno < gotsym)
16304         {
16305           error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
16306                  (unsigned long) gotsym, (unsigned long) symtabno);
16307           return FALSE;
16308         }
16309
16310       global_end = local_end + (symtabno - gotsym) * addr_size;
16311       /* PR 17531: file: 54c91a34.  */
16312       if (global_end < local_end)
16313         {
16314           error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
16315           return FALSE;
16316         }
16317
16318       offset = offset_from_vma (filedata, pltgot, global_end - pltgot);
16319       data = (unsigned char *) get_data (NULL, filedata, offset,
16320                                          global_end - pltgot, 1,
16321                                          _("Global Offset Table data"));
16322       /* PR 12855: Null data is handled gracefully throughout.  */
16323       data_end = data + (global_end - pltgot);
16324
16325       printf (_("\nPrimary GOT:\n"));
16326       printf (_(" Canonical gp value: "));
16327       print_vma (pltgot + 0x7ff0, LONG_HEX);
16328       printf ("\n\n");
16329
16330       printf (_(" Reserved entries:\n"));
16331       printf (_("  %*s %10s %*s Purpose\n"),
16332               addr_size * 2, _("Address"), _("Access"),
16333               addr_size * 2, _("Initial"));
16334       ent = print_mips_got_entry (data, pltgot, ent, data_end);
16335       printf (_(" Lazy resolver\n"));
16336       if (ent == (bfd_vma) -1)
16337         goto got_print_fail;
16338
16339       /* Check for the MSB of GOT[1] being set, denoting a GNU object.
16340          This entry will be used by some runtime loaders, to store the
16341          module pointer.  Otherwise this is an ordinary local entry.
16342          PR 21344: Check for the entry being fully available before
16343          fetching it.  */
16344       if (data
16345           && data + ent - pltgot + addr_size <= data_end
16346           && (byte_get (data + ent - pltgot, addr_size)
16347               >> (addr_size * 8 - 1)) != 0)
16348         {
16349           ent = print_mips_got_entry (data, pltgot, ent, data_end);
16350           printf (_(" Module pointer (GNU extension)\n"));
16351           if (ent == (bfd_vma) -1)
16352             goto got_print_fail;
16353         }
16354       printf ("\n");
16355
16356       if (data != NULL && ent < local_end)
16357         {
16358           printf (_(" Local entries:\n"));
16359           printf ("  %*s %10s %*s\n",
16360                   addr_size * 2, _("Address"), _("Access"),
16361                   addr_size * 2, _("Initial"));
16362           while (ent < local_end)
16363             {
16364               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16365               printf ("\n");
16366               if (ent == (bfd_vma) -1)
16367                 goto got_print_fail;
16368             }
16369           printf ("\n");
16370         }
16371
16372       if (data != NULL && gotsym < symtabno)
16373         {
16374           int sym_width;
16375
16376           printf (_(" Global entries:\n"));
16377           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
16378                   addr_size * 2, _("Address"),
16379                   _("Access"),
16380                   addr_size * 2, _("Initial"),
16381                   addr_size * 2, _("Sym.Val."),
16382                   _("Type"),
16383                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
16384                   _("Ndx"), _("Name"));
16385
16386           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
16387
16388           for (i = gotsym; i < symtabno; i++)
16389             {
16390               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16391               printf (" ");
16392
16393               if (dynamic_symbols == NULL)
16394                 printf (_("<no dynamic symbols>"));
16395               else if (i < num_dynamic_syms)
16396                 {
16397                   Elf_Internal_Sym * psym = dynamic_symbols + i;
16398
16399                   print_vma (psym->st_value, LONG_HEX);
16400                   printf (" %-7s %3s ",
16401                           get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16402                           get_symbol_index_type (filedata, psym->st_shndx));
16403
16404                   if (VALID_DYNAMIC_NAME (psym->st_name))
16405                     print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16406                   else
16407                     printf (_("<corrupt: %14ld>"), psym->st_name);
16408                 }
16409               else
16410                 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
16411                         (unsigned long) i);
16412
16413               printf ("\n");
16414               if (ent == (bfd_vma) -1)
16415                 break;
16416             }
16417           printf ("\n");
16418         }
16419
16420     got_print_fail:
16421       if (data)
16422         free (data);
16423     }
16424
16425   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
16426     {
16427       bfd_vma ent, end;
16428       size_t offset, rel_offset;
16429       unsigned long count, i;
16430       unsigned char * data;
16431       int addr_size, sym_width;
16432       Elf_Internal_Rela * rels;
16433
16434       rel_offset = offset_from_vma (filedata, jmprel, pltrelsz);
16435       if (pltrel == DT_RELA)
16436         {
16437           if (!slurp_rela_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16438             return FALSE;
16439         }
16440       else
16441         {
16442           if (!slurp_rel_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16443             return FALSE;
16444         }
16445
16446       ent = mips_pltgot;
16447       addr_size = (is_32bit_elf ? 4 : 8);
16448       end = mips_pltgot + (2 + count) * addr_size;
16449
16450       offset = offset_from_vma (filedata, mips_pltgot, end - mips_pltgot);
16451       data = (unsigned char *) get_data (NULL, filedata, offset, end - mips_pltgot,
16452                                          1, _("Procedure Linkage Table data"));
16453       if (data == NULL)
16454         return FALSE;
16455
16456       printf ("\nPLT GOT:\n\n");
16457       printf (_(" Reserved entries:\n"));
16458       printf (_("  %*s %*s Purpose\n"),
16459               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
16460       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16461       printf (_(" PLT lazy resolver\n"));
16462       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16463       printf (_(" Module pointer\n"));
16464       printf ("\n");
16465
16466       printf (_(" Entries:\n"));
16467       printf ("  %*s %*s %*s %-7s %3s %s\n",
16468               addr_size * 2, _("Address"),
16469               addr_size * 2, _("Initial"),
16470               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
16471       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
16472       for (i = 0; i < count; i++)
16473         {
16474           unsigned long idx = get_reloc_symindex (rels[i].r_info);
16475
16476           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16477           printf (" ");
16478
16479           if (idx >= num_dynamic_syms)
16480             printf (_("<corrupt symbol index: %lu>"), idx);
16481           else
16482             {
16483               Elf_Internal_Sym * psym = dynamic_symbols + idx;
16484
16485               print_vma (psym->st_value, LONG_HEX);
16486               printf (" %-7s %3s ",
16487                       get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16488                       get_symbol_index_type (filedata, psym->st_shndx));
16489               if (VALID_DYNAMIC_NAME (psym->st_name))
16490                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16491               else
16492                 printf (_("<corrupt: %14ld>"), psym->st_name);
16493             }
16494           printf ("\n");
16495         }
16496       printf ("\n");
16497
16498       if (data)
16499         free (data);
16500       free (rels);
16501     }
16502
16503   return res;
16504 }
16505
16506 static bfd_boolean
16507 process_nds32_specific (Filedata * filedata)
16508 {
16509   Elf_Internal_Shdr *sect = NULL;
16510
16511   sect = find_section (filedata, ".nds32_e_flags");
16512   if (sect != NULL)
16513     {
16514       unsigned int *flag;
16515
16516       printf ("\nNDS32 elf flags section:\n");
16517       flag = get_data (NULL, filedata, sect->sh_offset, 1,
16518                        sect->sh_size, _("NDS32 elf flags section"));
16519
16520       if (! flag)
16521         return FALSE;
16522
16523       switch ((*flag) & 0x3)
16524         {
16525         case 0:
16526           printf ("(VEC_SIZE):\tNo entry.\n");
16527           break;
16528         case 1:
16529           printf ("(VEC_SIZE):\t4 bytes\n");
16530           break;
16531         case 2:
16532           printf ("(VEC_SIZE):\t16 bytes\n");
16533           break;
16534         case 3:
16535           printf ("(VEC_SIZE):\treserved\n");
16536           break;
16537         }
16538     }
16539
16540   return TRUE;
16541 }
16542
16543 static bfd_boolean
16544 process_gnu_liblist (Filedata * filedata)
16545 {
16546   Elf_Internal_Shdr * section;
16547   Elf_Internal_Shdr * string_sec;
16548   Elf32_External_Lib * elib;
16549   char * strtab;
16550   size_t strtab_size;
16551   size_t cnt;
16552   unsigned long num_liblist;
16553   unsigned i;
16554   bfd_boolean res = TRUE;
16555
16556   if (! do_arch)
16557     return TRUE;
16558
16559   for (i = 0, section = filedata->section_headers;
16560        i < filedata->file_header.e_shnum;
16561        i++, section++)
16562     {
16563       switch (section->sh_type)
16564         {
16565         case SHT_GNU_LIBLIST:
16566           if (section->sh_link >= filedata->file_header.e_shnum)
16567             break;
16568
16569           elib = (Elf32_External_Lib *)
16570               get_data (NULL, filedata, section->sh_offset, 1, section->sh_size,
16571                         _("liblist section data"));
16572
16573           if (elib == NULL)
16574             {
16575               res = FALSE;
16576               break;
16577             }
16578
16579           string_sec = filedata->section_headers + section->sh_link;
16580           strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
16581                                       string_sec->sh_size,
16582                                       _("liblist string table"));
16583           if (strtab == NULL
16584               || section->sh_entsize != sizeof (Elf32_External_Lib))
16585             {
16586               free (elib);
16587               free (strtab);
16588               res = FALSE;
16589               break;
16590             }
16591           strtab_size = string_sec->sh_size;
16592
16593           num_liblist = section->sh_size / sizeof (Elf32_External_Lib);
16594           printf (ngettext ("\nLibrary list section '%s' contains %lu entries:\n",
16595                             "\nLibrary list section '%s' contains %lu entries:\n",
16596                             num_liblist),
16597                   printable_section_name (filedata, section),
16598                   num_liblist);
16599
16600           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
16601
16602           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
16603                ++cnt)
16604             {
16605               Elf32_Lib liblist;
16606               time_t atime;
16607               char timebuf[128];
16608               struct tm * tmp;
16609
16610               liblist.l_name = BYTE_GET (elib[cnt].l_name);
16611               atime = BYTE_GET (elib[cnt].l_time_stamp);
16612               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16613               liblist.l_version = BYTE_GET (elib[cnt].l_version);
16614               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16615
16616               tmp = gmtime (&atime);
16617               snprintf (timebuf, sizeof (timebuf),
16618                         "%04u-%02u-%02uT%02u:%02u:%02u",
16619                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16620                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16621
16622               printf ("%3lu: ", (unsigned long) cnt);
16623               if (do_wide)
16624                 printf ("%-20s", liblist.l_name < strtab_size
16625                         ? strtab + liblist.l_name : _("<corrupt>"));
16626               else
16627                 printf ("%-20.20s", liblist.l_name < strtab_size
16628                         ? strtab + liblist.l_name : _("<corrupt>"));
16629               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
16630                       liblist.l_version, liblist.l_flags);
16631             }
16632
16633           free (elib);
16634           free (strtab);
16635         }
16636     }
16637
16638   return res;
16639 }
16640
16641 static const char *
16642 get_note_type (Filedata * filedata, unsigned e_type)
16643 {
16644   static char buff[64];
16645
16646   if (filedata->file_header.e_type == ET_CORE)
16647     switch (e_type)
16648       {
16649       case NT_AUXV:
16650         return _("NT_AUXV (auxiliary vector)");
16651       case NT_PRSTATUS:
16652         return _("NT_PRSTATUS (prstatus structure)");
16653       case NT_FPREGSET:
16654         return _("NT_FPREGSET (floating point registers)");
16655       case NT_PRPSINFO:
16656         return _("NT_PRPSINFO (prpsinfo structure)");
16657       case NT_TASKSTRUCT:
16658         return _("NT_TASKSTRUCT (task structure)");
16659       case NT_PRXFPREG:
16660         return _("NT_PRXFPREG (user_xfpregs structure)");
16661       case NT_PPC_VMX:
16662         return _("NT_PPC_VMX (ppc Altivec registers)");
16663       case NT_PPC_VSX:
16664         return _("NT_PPC_VSX (ppc VSX registers)");
16665       case NT_PPC_TAR:
16666         return _("NT_PPC_TAR (ppc TAR register)");
16667       case NT_PPC_PPR:
16668         return _("NT_PPC_PPR (ppc PPR register)");
16669       case NT_PPC_DSCR:
16670         return _("NT_PPC_DSCR (ppc DSCR register)");
16671       case NT_PPC_EBB:
16672         return _("NT_PPC_EBB (ppc EBB registers)");
16673       case NT_PPC_PMU:
16674         return _("NT_PPC_PMU (ppc PMU registers)");
16675       case NT_PPC_TM_CGPR:
16676         return _("NT_PPC_TM_CGPR (ppc checkpointed GPR registers)");
16677       case NT_PPC_TM_CFPR:
16678         return _("NT_PPC_TM_CFPR (ppc checkpointed floating point registers)");
16679       case NT_PPC_TM_CVMX:
16680         return _("NT_PPC_TM_CVMX (ppc checkpointed Altivec registers)");
16681       case NT_PPC_TM_CVSX:
16682         return _("NT_PPC_TM_CVSX (ppc checkpointed VSX registers)");
16683       case NT_PPC_TM_SPR:
16684         return _("NT_PPC_TM_SPR (ppc TM special purpose registers)");
16685       case NT_PPC_TM_CTAR:
16686         return _("NT_PPC_TM_CTAR (ppc checkpointed TAR register)");
16687       case NT_PPC_TM_CPPR:
16688         return _("NT_PPC_TM_CPPR (ppc checkpointed PPR register)");
16689       case NT_PPC_TM_CDSCR:
16690         return _("NT_PPC_TM_CDSCR (ppc checkpointed DSCR register)");
16691       case NT_386_TLS:
16692         return _("NT_386_TLS (x86 TLS information)");
16693       case NT_386_IOPERM:
16694         return _("NT_386_IOPERM (x86 I/O permissions)");
16695       case NT_X86_XSTATE:
16696         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
16697       case NT_S390_HIGH_GPRS:
16698         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
16699       case NT_S390_TIMER:
16700         return _("NT_S390_TIMER (s390 timer register)");
16701       case NT_S390_TODCMP:
16702         return _("NT_S390_TODCMP (s390 TOD comparator register)");
16703       case NT_S390_TODPREG:
16704         return _("NT_S390_TODPREG (s390 TOD programmable register)");
16705       case NT_S390_CTRS:
16706         return _("NT_S390_CTRS (s390 control registers)");
16707       case NT_S390_PREFIX:
16708         return _("NT_S390_PREFIX (s390 prefix register)");
16709       case NT_S390_LAST_BREAK:
16710         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
16711       case NT_S390_SYSTEM_CALL:
16712         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
16713       case NT_S390_TDB:
16714         return _("NT_S390_TDB (s390 transaction diagnostic block)");
16715       case NT_S390_VXRS_LOW:
16716         return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
16717       case NT_S390_VXRS_HIGH:
16718         return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
16719       case NT_S390_GS_CB:
16720         return _("NT_S390_GS_CB (s390 guarded-storage registers)");
16721       case NT_S390_GS_BC:
16722         return _("NT_S390_GS_BC (s390 guarded-storage broadcast control)");
16723       case NT_ARM_VFP:
16724         return _("NT_ARM_VFP (arm VFP registers)");
16725       case NT_ARM_TLS:
16726         return _("NT_ARM_TLS (AArch TLS registers)");
16727       case NT_ARM_HW_BREAK:
16728         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
16729       case NT_ARM_HW_WATCH:
16730         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
16731       case NT_PSTATUS:
16732         return _("NT_PSTATUS (pstatus structure)");
16733       case NT_FPREGS:
16734         return _("NT_FPREGS (floating point registers)");
16735       case NT_PSINFO:
16736         return _("NT_PSINFO (psinfo structure)");
16737       case NT_LWPSTATUS:
16738         return _("NT_LWPSTATUS (lwpstatus_t structure)");
16739       case NT_LWPSINFO:
16740         return _("NT_LWPSINFO (lwpsinfo_t structure)");
16741       case NT_WIN32PSTATUS:
16742         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
16743       case NT_SIGINFO:
16744         return _("NT_SIGINFO (siginfo_t data)");
16745       case NT_FILE:
16746         return _("NT_FILE (mapped files)");
16747       default:
16748         break;
16749       }
16750   else
16751     switch (e_type)
16752       {
16753       case NT_VERSION:
16754         return _("NT_VERSION (version)");
16755       case NT_ARCH:
16756         return _("NT_ARCH (architecture)");
16757       case NT_GNU_BUILD_ATTRIBUTE_OPEN:
16758         return _("OPEN");
16759       case NT_GNU_BUILD_ATTRIBUTE_FUNC:
16760         return _("func");
16761       default:
16762         break;
16763       }
16764
16765   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16766   return buff;
16767 }
16768
16769 static bfd_boolean
16770 print_core_note (Elf_Internal_Note *pnote)
16771 {
16772   unsigned int addr_size = is_32bit_elf ? 4 : 8;
16773   bfd_vma count, page_size;
16774   unsigned char *descdata, *filenames, *descend;
16775
16776   if (pnote->type != NT_FILE)
16777     {
16778       if (do_wide)
16779         printf ("\n");
16780       return TRUE;
16781     }
16782
16783 #ifndef BFD64
16784   if (!is_32bit_elf)
16785     {
16786       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
16787       /* Still "successful".  */
16788       return TRUE;
16789     }
16790 #endif
16791
16792   if (pnote->descsz < 2 * addr_size)
16793     {
16794       error (_("    Malformed note - too short for header\n"));
16795       return FALSE;
16796     }
16797
16798   descdata = (unsigned char *) pnote->descdata;
16799   descend = descdata + pnote->descsz;
16800
16801   if (descdata[pnote->descsz - 1] != '\0')
16802     {
16803       error (_("    Malformed note - does not end with \\0\n"));
16804       return FALSE;
16805     }
16806
16807   count = byte_get (descdata, addr_size);
16808   descdata += addr_size;
16809
16810   page_size = byte_get (descdata, addr_size);
16811   descdata += addr_size;
16812
16813   if (count > ((bfd_vma) -1 - 2 * addr_size) / (3 * addr_size)
16814       || pnote->descsz < 2 * addr_size + count * 3 * addr_size)
16815     {
16816       error (_("    Malformed note - too short for supplied file count\n"));
16817       return FALSE;
16818     }
16819
16820   printf (_("    Page size: "));
16821   print_vma (page_size, DEC);
16822   printf ("\n");
16823
16824   printf (_("    %*s%*s%*s\n"),
16825           (int) (2 + 2 * addr_size), _("Start"),
16826           (int) (4 + 2 * addr_size), _("End"),
16827           (int) (4 + 2 * addr_size), _("Page Offset"));
16828   filenames = descdata + count * 3 * addr_size;
16829   while (count-- > 0)
16830     {
16831       bfd_vma start, end, file_ofs;
16832
16833       if (filenames == descend)
16834         {
16835           error (_("    Malformed note - filenames end too early\n"));
16836           return FALSE;
16837         }
16838
16839       start = byte_get (descdata, addr_size);
16840       descdata += addr_size;
16841       end = byte_get (descdata, addr_size);
16842       descdata += addr_size;
16843       file_ofs = byte_get (descdata, addr_size);
16844       descdata += addr_size;
16845
16846       printf ("    ");
16847       print_vma (start, FULL_HEX);
16848       printf ("  ");
16849       print_vma (end, FULL_HEX);
16850       printf ("  ");
16851       print_vma (file_ofs, FULL_HEX);
16852       printf ("\n        %s\n", filenames);
16853
16854       filenames += 1 + strlen ((char *) filenames);
16855     }
16856
16857   return TRUE;
16858 }
16859
16860 static const char *
16861 get_gnu_elf_note_type (unsigned e_type)
16862 {
16863   /* NB/ Keep this switch statement in sync with print_gnu_note ().  */
16864   switch (e_type)
16865     {
16866     case NT_GNU_ABI_TAG:
16867       return _("NT_GNU_ABI_TAG (ABI version tag)");
16868     case NT_GNU_HWCAP:
16869       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
16870     case NT_GNU_BUILD_ID:
16871       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
16872     case NT_GNU_GOLD_VERSION:
16873       return _("NT_GNU_GOLD_VERSION (gold version)");
16874     case NT_GNU_PROPERTY_TYPE_0:
16875       return _("NT_GNU_PROPERTY_TYPE_0");
16876     case NT_GNU_BUILD_ATTRIBUTE_OPEN:
16877       return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
16878     case NT_GNU_BUILD_ATTRIBUTE_FUNC:
16879       return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
16880     default:
16881       {
16882         static char buff[64];
16883
16884         snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16885         return buff;
16886       }
16887     }
16888 }
16889
16890 static void
16891 decode_x86_isa (unsigned int bitmask)
16892 {
16893   while (bitmask)
16894     {
16895       unsigned int bit = bitmask & (- bitmask);
16896
16897       bitmask &= ~ bit;
16898       switch (bit)
16899         {
16900         case GNU_PROPERTY_X86_ISA_1_486: printf ("i486"); break;
16901         case GNU_PROPERTY_X86_ISA_1_586: printf ("586"); break;
16902         case GNU_PROPERTY_X86_ISA_1_686: printf ("686"); break;
16903         case GNU_PROPERTY_X86_ISA_1_SSE: printf ("SSE"); break;
16904         case GNU_PROPERTY_X86_ISA_1_SSE2: printf ("SSE2"); break;
16905         case GNU_PROPERTY_X86_ISA_1_SSE3: printf ("SSE3"); break;
16906         case GNU_PROPERTY_X86_ISA_1_SSSE3: printf ("SSSE3"); break;
16907         case GNU_PROPERTY_X86_ISA_1_SSE4_1: printf ("SSE4_1"); break;
16908         case GNU_PROPERTY_X86_ISA_1_SSE4_2: printf ("SSE4_2"); break;
16909         case GNU_PROPERTY_X86_ISA_1_AVX: printf ("AVX"); break;
16910         case GNU_PROPERTY_X86_ISA_1_AVX2: printf ("AVX2"); break;
16911         case GNU_PROPERTY_X86_ISA_1_AVX512F: printf ("AVX512F"); break;
16912         case GNU_PROPERTY_X86_ISA_1_AVX512CD: printf ("AVX512CD"); break;
16913         case GNU_PROPERTY_X86_ISA_1_AVX512ER: printf ("AVX512ER"); break;
16914         case GNU_PROPERTY_X86_ISA_1_AVX512PF: printf ("AVX512PF"); break;
16915         case GNU_PROPERTY_X86_ISA_1_AVX512VL: printf ("AVX512VL"); break;
16916         case GNU_PROPERTY_X86_ISA_1_AVX512DQ: printf ("AVX512DQ"); break;
16917         case GNU_PROPERTY_X86_ISA_1_AVX512BW: printf ("AVX512BW"); break;
16918         default: printf (_("<unknown: %x>"), bit); break;
16919         }
16920       if (bitmask)
16921         printf (", ");
16922     }
16923 }
16924
16925 static void
16926 decode_x86_feature (unsigned int type, unsigned int bitmask)
16927 {
16928   while (bitmask)
16929     {
16930       unsigned int bit = bitmask & (- bitmask);
16931
16932       bitmask &= ~ bit;
16933       switch (bit)
16934         {
16935         case GNU_PROPERTY_X86_FEATURE_1_IBT:
16936           switch (type)
16937             {
16938             case GNU_PROPERTY_X86_FEATURE_1_AND:
16939               printf ("IBT");
16940               break;
16941             default:
16942               /* This should never happen.  */
16943               abort ();
16944             }
16945           break;
16946         case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
16947           switch (type)
16948             {
16949             case GNU_PROPERTY_X86_FEATURE_1_AND:
16950               printf ("SHSTK");
16951               break;
16952             default:
16953               /* This should never happen.  */
16954               abort ();
16955             }
16956           break;
16957         default:
16958           printf (_("<unknown: %x>"), bit);
16959           break;
16960         }
16961       if (bitmask)
16962         printf (", ");
16963     }
16964 }
16965
16966 static void
16967 print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
16968 {
16969   unsigned char * ptr = (unsigned char *) pnote->descdata;
16970   unsigned char * ptr_end = ptr + pnote->descsz;
16971   unsigned int    size = is_32bit_elf ? 4 : 8;
16972
16973   printf (_("      Properties: "));
16974
16975   if (pnote->descsz < 8 || (pnote->descsz % size) != 0)
16976     {
16977       printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz);
16978       return;
16979     }
16980
16981   while (ptr < ptr_end)
16982     {
16983       unsigned int j;
16984       unsigned int type;
16985       unsigned int datasz;
16986
16987       if ((size_t) (ptr_end - ptr) < 8)
16988         {
16989           printf (_("<corrupt descsz: %#lx>\n"), pnote->descsz);
16990           break;
16991         }
16992
16993       type = byte_get (ptr, 4);
16994       datasz = byte_get (ptr + 4, 4);
16995
16996       ptr += 8;
16997
16998       if (datasz > (size_t) (ptr_end - ptr))
16999         {
17000           printf (_("<corrupt type (%#x) datasz: %#x>\n"),
17001                   type, datasz);
17002           break;
17003         }
17004
17005       if (type >= GNU_PROPERTY_LOPROC && type <= GNU_PROPERTY_HIPROC)
17006         {
17007           if (filedata->file_header.e_machine == EM_X86_64
17008               || filedata->file_header.e_machine == EM_IAMCU
17009               || filedata->file_header.e_machine == EM_386)
17010             {
17011               switch (type)
17012                 {
17013                 case GNU_PROPERTY_X86_ISA_1_USED:
17014                   printf ("x86 ISA used: ");
17015                   if (datasz != 4)
17016                     printf (_("<corrupt length: %#x> "), datasz);
17017                   else
17018                     decode_x86_isa (byte_get (ptr, 4));
17019                   goto next;
17020
17021                 case GNU_PROPERTY_X86_ISA_1_NEEDED:
17022                   printf ("x86 ISA needed: ");
17023                   if (datasz != 4)
17024                     printf (_("<corrupt length: %#x> "), datasz);
17025                   else
17026                     decode_x86_isa (byte_get (ptr, 4));
17027                   goto next;
17028
17029                 case GNU_PROPERTY_X86_FEATURE_1_AND:
17030                   printf ("x86 feature: ");
17031                   if (datasz != 4)
17032                     printf (_("<corrupt length: %#x> "), datasz);
17033                   else
17034                     decode_x86_feature (type, byte_get (ptr, 4));
17035                   goto next;
17036
17037                 default:
17038                   break;
17039                 }
17040             }
17041         }
17042       else
17043         {
17044           switch (type)
17045             {
17046             case GNU_PROPERTY_STACK_SIZE:
17047               printf (_("stack size: "));
17048               if (datasz != size)
17049                 printf (_("<corrupt length: %#x> "), datasz);
17050               else
17051                 printf ("%#lx", (unsigned long) byte_get (ptr, size));
17052               goto next;
17053
17054             case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
17055               printf ("no copy on protected ");
17056               if (datasz)
17057                 printf (_("<corrupt length: %#x> "), datasz);
17058               goto next;
17059
17060             default:
17061               break;
17062             }
17063         }
17064
17065       if (type < GNU_PROPERTY_LOPROC)
17066         printf (_("<unknown type %#x data: "), type);
17067       else if (type < GNU_PROPERTY_LOUSER)
17068         printf (_("<procesor-specific type %#x data: "), type);
17069       else
17070         printf (_("<application-specific type %#x data: "), type);
17071       for (j = 0; j < datasz; ++j)
17072         printf ("%02x ", ptr[j] & 0xff);
17073       printf (">");
17074
17075 next:
17076       ptr += ((datasz + (size - 1)) & ~ (size - 1));
17077       if (ptr == ptr_end)
17078         break;
17079
17080       if (do_wide)
17081         printf (", ");
17082       else
17083         printf ("\n\t");
17084     }
17085
17086   printf ("\n");
17087 }
17088
17089 static bfd_boolean
17090 print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
17091 {
17092   /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type ().  */
17093   switch (pnote->type)
17094     {
17095     case NT_GNU_BUILD_ID:
17096       {
17097         unsigned long i;
17098
17099         printf (_("    Build ID: "));
17100         for (i = 0; i < pnote->descsz; ++i)
17101           printf ("%02x", pnote->descdata[i] & 0xff);
17102         printf ("\n");
17103       }
17104       break;
17105
17106     case NT_GNU_ABI_TAG:
17107       {
17108         unsigned long os, major, minor, subminor;
17109         const char *osname;
17110
17111         /* PR 17531: file: 030-599401-0.004.  */
17112         if (pnote->descsz < 16)
17113           {
17114             printf (_("    <corrupt GNU_ABI_TAG>\n"));
17115             break;
17116           }
17117
17118         os = byte_get ((unsigned char *) pnote->descdata, 4);
17119         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17120         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
17121         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
17122
17123         switch (os)
17124           {
17125           case GNU_ABI_TAG_LINUX:
17126             osname = "Linux";
17127             break;
17128           case GNU_ABI_TAG_HURD:
17129             osname = "Hurd";
17130             break;
17131           case GNU_ABI_TAG_SOLARIS:
17132             osname = "Solaris";
17133             break;
17134           case GNU_ABI_TAG_FREEBSD:
17135             osname = "FreeBSD";
17136             break;
17137           case GNU_ABI_TAG_NETBSD:
17138             osname = "NetBSD";
17139             break;
17140           case GNU_ABI_TAG_SYLLABLE:
17141             osname = "Syllable";
17142             break;
17143           case GNU_ABI_TAG_NACL:
17144             osname = "NaCl";
17145             break;
17146           default:
17147             osname = "Unknown";
17148             break;
17149           }
17150
17151         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
17152                 major, minor, subminor);
17153       }
17154       break;
17155
17156     case NT_GNU_GOLD_VERSION:
17157       {
17158         unsigned long i;
17159
17160         printf (_("    Version: "));
17161         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
17162           printf ("%c", pnote->descdata[i]);
17163         printf ("\n");
17164       }
17165       break;
17166
17167     case NT_GNU_HWCAP:
17168       {
17169         unsigned long num_entries, mask;
17170
17171         /* Hardware capabilities information.  Word 0 is the number of entries.
17172            Word 1 is a bitmask of enabled entries.  The rest of the descriptor
17173            is a series of entries, where each entry is a single byte followed
17174            by a nul terminated string.  The byte gives the bit number to test
17175            if enabled in the bitmask.  */
17176         printf (_("      Hardware Capabilities: "));
17177         if (pnote->descsz < 8)
17178           {
17179             error (_("<corrupt GNU_HWCAP>\n"));
17180             return FALSE;
17181           }
17182         num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
17183         mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17184         printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
17185         /* FIXME: Add code to display the entries... */
17186       }
17187       break;
17188
17189     case NT_GNU_PROPERTY_TYPE_0:
17190       print_gnu_property_note (filedata, pnote);
17191       break;
17192       
17193     default:
17194       /* Handle unrecognised types.  An error message should have already been
17195          created by get_gnu_elf_note_type(), so all that we need to do is to
17196          display the data.  */
17197       {
17198         unsigned long i;
17199
17200         printf (_("    Description data: "));
17201         for (i = 0; i < pnote->descsz; ++i)
17202           printf ("%02x ", pnote->descdata[i] & 0xff);
17203         printf ("\n");
17204       }
17205       break;
17206     }
17207
17208   return TRUE;
17209 }
17210
17211 static const char *
17212 get_v850_elf_note_type (enum v850_notes n_type)
17213 {
17214   static char buff[64];
17215
17216   switch (n_type)
17217     {
17218     case V850_NOTE_ALIGNMENT:  return _("Alignment of 8-byte objects");
17219     case V850_NOTE_DATA_SIZE:  return _("Sizeof double and long double");
17220     case V850_NOTE_FPU_INFO:   return _("Type of FPU support needed");
17221     case V850_NOTE_SIMD_INFO:  return _("Use of SIMD instructions");
17222     case V850_NOTE_CACHE_INFO: return _("Use of cache");
17223     case V850_NOTE_MMU_INFO:   return _("Use of MMU");
17224     default:
17225       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
17226       return buff;
17227     }
17228 }
17229
17230 static bfd_boolean
17231 print_v850_note (Elf_Internal_Note * pnote)
17232 {
17233   unsigned int val;
17234
17235   if (pnote->descsz != 4)
17236     return FALSE;
17237
17238   val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
17239
17240   if (val == 0)
17241     {
17242       printf (_("not set\n"));
17243       return TRUE;
17244     }
17245
17246   switch (pnote->type)
17247     {
17248     case V850_NOTE_ALIGNMENT:
17249       switch (val)
17250         {
17251         case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return TRUE;
17252         case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return TRUE;
17253         }
17254       break;
17255
17256     case V850_NOTE_DATA_SIZE:
17257       switch (val)
17258         {
17259         case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return TRUE;
17260         case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return TRUE;
17261         }
17262       break;
17263
17264     case V850_NOTE_FPU_INFO:
17265       switch (val)
17266         {
17267         case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return TRUE;
17268         case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return TRUE;
17269         }
17270       break;
17271
17272     case V850_NOTE_MMU_INFO:
17273     case V850_NOTE_CACHE_INFO:
17274     case V850_NOTE_SIMD_INFO:
17275       if (val == EF_RH850_SIMD)
17276         {
17277           printf (_("yes\n"));
17278           return TRUE;
17279         }
17280       break;
17281
17282     default:
17283       /* An 'unknown note type' message will already have been displayed.  */
17284       break;
17285     }
17286
17287   printf (_("unknown value: %x\n"), val);
17288   return FALSE;
17289 }
17290
17291 static bfd_boolean
17292 process_netbsd_elf_note (Elf_Internal_Note * pnote)
17293 {
17294   unsigned int version;
17295
17296   switch (pnote->type)
17297     {
17298     case NT_NETBSD_IDENT:
17299       version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
17300       if ((version / 10000) % 100)
17301         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
17302                 version, version / 100000000, (version / 1000000) % 100,
17303                 (version / 10000) % 100 > 26 ? "Z" : "",
17304                 'A' + (version / 10000) % 26);
17305       else
17306         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
17307                 version, version / 100000000, (version / 1000000) % 100,
17308                 (version / 100) % 100);
17309       return TRUE;
17310
17311     case NT_NETBSD_MARCH:
17312       printf ("  NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
17313               pnote->descdata);
17314       return TRUE;
17315
17316     default:
17317       printf ("  NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
17318               pnote->type);
17319       return FALSE;
17320     }
17321 }
17322
17323 static const char *
17324 get_freebsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17325 {
17326   switch (e_type)
17327     {
17328     case NT_FREEBSD_THRMISC:
17329       return _("NT_THRMISC (thrmisc structure)");
17330     case NT_FREEBSD_PROCSTAT_PROC:
17331       return _("NT_PROCSTAT_PROC (proc data)");
17332     case NT_FREEBSD_PROCSTAT_FILES:
17333       return _("NT_PROCSTAT_FILES (files data)");
17334     case NT_FREEBSD_PROCSTAT_VMMAP:
17335       return _("NT_PROCSTAT_VMMAP (vmmap data)");
17336     case NT_FREEBSD_PROCSTAT_GROUPS:
17337       return _("NT_PROCSTAT_GROUPS (groups data)");
17338     case NT_FREEBSD_PROCSTAT_UMASK:
17339       return _("NT_PROCSTAT_UMASK (umask data)");
17340     case NT_FREEBSD_PROCSTAT_RLIMIT:
17341       return _("NT_PROCSTAT_RLIMIT (rlimit data)");
17342     case NT_FREEBSD_PROCSTAT_OSREL:
17343       return _("NT_PROCSTAT_OSREL (osreldate data)");
17344     case NT_FREEBSD_PROCSTAT_PSSTRINGS:
17345       return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
17346     case NT_FREEBSD_PROCSTAT_AUXV:
17347       return _("NT_PROCSTAT_AUXV (auxv data)");
17348     case NT_FREEBSD_PTLWPINFO:
17349       return _("NT_PTLWPINFO (ptrace_lwpinfo structure)");
17350     }
17351   return get_note_type (filedata, e_type);
17352 }
17353
17354 static const char *
17355 get_netbsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17356 {
17357   static char buff[64];
17358
17359   if (e_type == NT_NETBSDCORE_PROCINFO)
17360     return _("NetBSD procinfo structure");
17361
17362   /* As of Jan 2002 there are no other machine-independent notes
17363      defined for NetBSD core files.  If the note type is less
17364      than the start of the machine-dependent note types, we don't
17365      understand it.  */
17366
17367   if (e_type < NT_NETBSDCORE_FIRSTMACH)
17368     {
17369       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17370       return buff;
17371     }
17372
17373   switch (filedata->file_header.e_machine)
17374     {
17375     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
17376        and PT_GETFPREGS == mach+2.  */
17377
17378     case EM_OLD_ALPHA:
17379     case EM_ALPHA:
17380     case EM_SPARC:
17381     case EM_SPARC32PLUS:
17382     case EM_SPARCV9:
17383       switch (e_type)
17384         {
17385         case NT_NETBSDCORE_FIRSTMACH + 0:
17386           return _("PT_GETREGS (reg structure)");
17387         case NT_NETBSDCORE_FIRSTMACH + 2:
17388           return _("PT_GETFPREGS (fpreg structure)");
17389         default:
17390           break;
17391         }
17392       break;
17393
17394     /* On all other arch's, PT_GETREGS == mach+1 and
17395        PT_GETFPREGS == mach+3.  */
17396     default:
17397       switch (e_type)
17398         {
17399         case NT_NETBSDCORE_FIRSTMACH + 1:
17400           return _("PT_GETREGS (reg structure)");
17401         case NT_NETBSDCORE_FIRSTMACH + 3:
17402           return _("PT_GETFPREGS (fpreg structure)");
17403         default:
17404           break;
17405         }
17406     }
17407
17408   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
17409             e_type - NT_NETBSDCORE_FIRSTMACH);
17410   return buff;
17411 }
17412
17413 static const char *
17414 get_stapsdt_note_type (unsigned e_type)
17415 {
17416   static char buff[64];
17417
17418   switch (e_type)
17419     {
17420     case NT_STAPSDT:
17421       return _("NT_STAPSDT (SystemTap probe descriptors)");
17422
17423     default:
17424       break;
17425     }
17426
17427   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17428   return buff;
17429 }
17430
17431 static bfd_boolean
17432 print_stapsdt_note (Elf_Internal_Note *pnote)
17433 {
17434   int addr_size = is_32bit_elf ? 4 : 8;
17435   char *data = pnote->descdata;
17436   char *data_end = pnote->descdata + pnote->descsz;
17437   bfd_vma pc, base_addr, semaphore;
17438   char *provider, *probe, *arg_fmt;
17439
17440   pc = byte_get ((unsigned char *) data, addr_size);
17441   data += addr_size;
17442   base_addr = byte_get ((unsigned char *) data, addr_size);
17443   data += addr_size;
17444   semaphore = byte_get ((unsigned char *) data, addr_size);
17445   data += addr_size;
17446
17447   provider = data;
17448   data += strlen (data) + 1;
17449   probe = data;
17450   data += strlen (data) + 1;
17451   arg_fmt = data;
17452   data += strlen (data) + 1;
17453
17454   printf (_("    Provider: %s\n"), provider);
17455   printf (_("    Name: %s\n"), probe);
17456   printf (_("    Location: "));
17457   print_vma (pc, FULL_HEX);
17458   printf (_(", Base: "));
17459   print_vma (base_addr, FULL_HEX);
17460   printf (_(", Semaphore: "));
17461   print_vma (semaphore, FULL_HEX);
17462   printf ("\n");
17463   printf (_("    Arguments: %s\n"), arg_fmt);
17464
17465   return data == data_end;
17466 }
17467
17468 static const char *
17469 get_ia64_vms_note_type (unsigned e_type)
17470 {
17471   static char buff[64];
17472
17473   switch (e_type)
17474     {
17475     case NT_VMS_MHD:
17476       return _("NT_VMS_MHD (module header)");
17477     case NT_VMS_LNM:
17478       return _("NT_VMS_LNM (language name)");
17479     case NT_VMS_SRC:
17480       return _("NT_VMS_SRC (source files)");
17481     case NT_VMS_TITLE:
17482       return "NT_VMS_TITLE";
17483     case NT_VMS_EIDC:
17484       return _("NT_VMS_EIDC (consistency check)");
17485     case NT_VMS_FPMODE:
17486       return _("NT_VMS_FPMODE (FP mode)");
17487     case NT_VMS_LINKTIME:
17488       return "NT_VMS_LINKTIME";
17489     case NT_VMS_IMGNAM:
17490       return _("NT_VMS_IMGNAM (image name)");
17491     case NT_VMS_IMGID:
17492       return _("NT_VMS_IMGID (image id)");
17493     case NT_VMS_LINKID:
17494       return _("NT_VMS_LINKID (link id)");
17495     case NT_VMS_IMGBID:
17496       return _("NT_VMS_IMGBID (build id)");
17497     case NT_VMS_GSTNAM:
17498       return _("NT_VMS_GSTNAM (sym table name)");
17499     case NT_VMS_ORIG_DYN:
17500       return "NT_VMS_ORIG_DYN";
17501     case NT_VMS_PATCHTIME:
17502       return "NT_VMS_PATCHTIME";
17503     default:
17504       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17505       return buff;
17506     }
17507 }
17508
17509 static bfd_boolean
17510 print_ia64_vms_note (Elf_Internal_Note * pnote)
17511 {
17512   switch (pnote->type)
17513     {
17514     case NT_VMS_MHD:
17515       if (pnote->descsz > 36)
17516         {
17517           size_t l = strlen (pnote->descdata + 34);
17518           printf (_("    Creation date  : %.17s\n"), pnote->descdata);
17519           printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
17520           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
17521           printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
17522         }
17523       else
17524         printf (_("    Invalid size\n"));
17525       break;
17526     case NT_VMS_LNM:
17527       printf (_("   Language: %s\n"), pnote->descdata);
17528       break;
17529 #ifdef BFD64
17530     case NT_VMS_FPMODE:
17531       printf (_("   Floating Point mode: "));
17532       printf ("0x%016" BFD_VMA_FMT "x\n",
17533               (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
17534       break;
17535     case NT_VMS_LINKTIME:
17536       printf (_("   Link time: "));
17537       print_vms_time
17538         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
17539       printf ("\n");
17540       break;
17541     case NT_VMS_PATCHTIME:
17542       printf (_("   Patch time: "));
17543       print_vms_time
17544         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
17545       printf ("\n");
17546       break;
17547     case NT_VMS_ORIG_DYN:
17548       printf (_("   Major id: %u,  minor id: %u\n"),
17549               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
17550               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
17551       printf (_("   Last modified  : "));
17552       print_vms_time
17553         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
17554       printf (_("\n   Link flags  : "));
17555       printf ("0x%016" BFD_VMA_FMT "x\n",
17556               (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
17557       printf (_("   Header flags: 0x%08x\n"),
17558               (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
17559       printf (_("   Image id    : %s\n"), pnote->descdata + 32);
17560       break;
17561 #endif
17562     case NT_VMS_IMGNAM:
17563       printf (_("    Image name: %s\n"), pnote->descdata);
17564       break;
17565     case NT_VMS_GSTNAM:
17566       printf (_("    Global symbol table name: %s\n"), pnote->descdata);
17567       break;
17568     case NT_VMS_IMGID:
17569       printf (_("    Image id: %s\n"), pnote->descdata);
17570       break;
17571     case NT_VMS_LINKID:
17572       printf (_("    Linker id: %s\n"), pnote->descdata);
17573       break;
17574     default:
17575       return FALSE;
17576     }
17577   return TRUE;
17578 }
17579
17580 /* Find the symbol associated with a build attribute that is attached
17581    to address OFFSET.  If PNAME is non-NULL then store the name of
17582    the symbol (if found) in the provided pointer,  Returns NULL if a
17583    symbol could not be found.  */
17584
17585 static Elf_Internal_Sym *
17586 get_symbol_for_build_attribute (Filedata *       filedata,
17587                                 unsigned long    offset,
17588                                 bfd_boolean      is_open_attr,
17589                                 const char **    pname)
17590 {
17591   static Filedata *         saved_filedata = NULL;
17592   static char *             strtab;
17593   static unsigned long      strtablen;
17594   static Elf_Internal_Sym * symtab;
17595   static unsigned long      nsyms;
17596   Elf_Internal_Sym *        saved_sym = NULL;
17597   Elf_Internal_Sym *        sym;
17598
17599   if (filedata->section_headers != NULL
17600       && (saved_filedata == NULL || filedata != saved_filedata))
17601     {
17602       Elf_Internal_Shdr * symsec;
17603
17604       /* Load the symbol and string sections.  */
17605       for (symsec = filedata->section_headers;
17606            symsec < filedata->section_headers + filedata->file_header.e_shnum;
17607            symsec ++)
17608         {
17609           if (symsec->sh_type == SHT_SYMTAB)
17610             {
17611               symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
17612
17613               if (symsec->sh_link < filedata->file_header.e_shnum)
17614                 {
17615                   Elf_Internal_Shdr * strtab_sec = filedata->section_headers + symsec->sh_link;
17616
17617                   strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
17618                                               1, strtab_sec->sh_size,
17619                                               _("string table"));
17620                   strtablen = strtab != NULL ? strtab_sec->sh_size : 0;
17621                 }
17622             }
17623         }
17624       saved_filedata = filedata;
17625     }
17626
17627   if (symtab == NULL || strtab == NULL)
17628     return NULL;
17629
17630   /* Find a symbol whose value matches offset.  */
17631   for (sym = symtab; sym < symtab + nsyms; sym ++)
17632     if (sym->st_value == offset)
17633       {
17634         if (sym->st_name >= strtablen)
17635           /* Huh ?  This should not happen.  */
17636           continue;
17637
17638         if (strtab[sym->st_name] == 0)
17639           continue;
17640
17641         /* The AArch64 and ARM architectures define mapping symbols
17642            (eg $d, $x, $t) which we want to ignore.  */
17643         if (strtab[sym->st_name] == '$'
17644             && strtab[sym->st_name + 1] != 0
17645             && strtab[sym->st_name + 2] == 0)
17646           continue;
17647
17648         if (is_open_attr)
17649           {
17650             /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
17651                and FILE or OBJECT symbols over NOTYPE symbols.  We skip
17652                FUNC symbols entirely.  */
17653             switch (ELF_ST_TYPE (sym->st_info))
17654               {
17655               case STT_OBJECT:
17656               case STT_FILE:
17657                 saved_sym = sym;
17658                 if (sym->st_size)
17659                   {
17660                     /* If the symbol has a size associated
17661                        with it then we can stop searching.  */
17662                     sym = symtab + nsyms;
17663                   }
17664                 continue;
17665
17666               case STT_FUNC:
17667                 /* Ignore function symbols.  */
17668                 continue;
17669
17670               default:
17671                 break;
17672               }
17673
17674             switch (ELF_ST_BIND (sym->st_info))
17675               {
17676               case STB_GLOBAL:
17677                 if (saved_sym == NULL
17678                     || ELF_ST_TYPE (saved_sym->st_info) != STT_OBJECT)
17679                   saved_sym = sym;
17680                 break;
17681
17682               case STB_LOCAL:
17683                 if (saved_sym == NULL)
17684                   saved_sym = sym;
17685                 break;
17686
17687               default:
17688                 break;
17689               }
17690           }
17691         else
17692           {
17693             if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
17694               continue;
17695
17696             saved_sym = sym;
17697             break;
17698           }
17699       }
17700
17701   if (saved_sym && pname)
17702     * pname = strtab + saved_sym->st_name;
17703
17704   return saved_sym;
17705 }
17706
17707 /* Returns true iff addr1 and addr2 are in the same section.  */
17708
17709 static bfd_boolean
17710 same_section (Filedata * filedata, unsigned long addr1, unsigned long addr2)
17711 {
17712   Elf_Internal_Shdr * a1;
17713   Elf_Internal_Shdr * a2;
17714
17715   a1 = find_section_by_address (filedata, addr1);
17716   a2 = find_section_by_address (filedata, addr2);
17717   
17718   return a1 == a2 && a1 != NULL;
17719 }
17720
17721 static bfd_boolean
17722 print_gnu_build_attribute_description (Elf_Internal_Note *  pnote,
17723                                        Filedata *           filedata)
17724 {
17725   static unsigned long  global_offset = 0;
17726   static unsigned long  global_end = 0;
17727   static unsigned long  func_offset = 0;
17728   static unsigned long  func_end = 0;
17729
17730   Elf_Internal_Sym *    sym;
17731   const char *          name;
17732   unsigned long         start;
17733   unsigned long         end;
17734   bfd_boolean           is_open_attr = pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN;
17735
17736   switch (pnote->descsz)
17737     {
17738     case 0:
17739       /* A zero-length description means that the range of
17740          the previous note of the same type should be used.  */
17741       if (is_open_attr)
17742         {
17743           if (global_end > global_offset)
17744             printf (_("    Applies to region from %#lx to %#lx\n"),
17745                     global_offset, global_end);
17746           else
17747             printf (_("    Applies to region from %#lx\n"), global_offset);
17748         }
17749       else
17750         {
17751           if (func_end > func_offset)
17752             printf (_("    Applies to region from %#lx to %#lx\n"), func_offset, func_end);
17753           else
17754             printf (_("    Applies to region from %#lx\n"), func_offset);
17755         }
17756       return TRUE;
17757
17758     case 4:
17759       start = byte_get ((unsigned char *) pnote->descdata, 4);
17760       end = 0;
17761       break;
17762
17763     case 8:
17764       if (is_32bit_elf)
17765         {
17766           /* FIXME: We should check that version 3+ notes are being used here...  */
17767           start = byte_get ((unsigned char *) pnote->descdata, 4);
17768           end = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17769         }
17770       else
17771         {
17772           start = byte_get ((unsigned char *) pnote->descdata, 8);
17773           end = 0;
17774         }
17775       break;
17776
17777     case 16:
17778       start = byte_get ((unsigned char *) pnote->descdata, 8);
17779       end = byte_get ((unsigned char *) pnote->descdata + 8, 8);
17780       break;
17781       
17782     default:
17783       error (_("    <invalid description size: %lx>\n"), pnote->descsz);
17784       printf (_("    <invalid descsz>"));
17785       return FALSE;
17786     }
17787
17788   name = NULL;
17789   sym = get_symbol_for_build_attribute (filedata, start, is_open_attr, & name);
17790   /* As of version 5 of the annobin plugin, filename symbols are biased by 2
17791      in order to avoid them being confused with the start address of the
17792      first function in the file...  */
17793   if (sym == NULL && is_open_attr)
17794     sym = get_symbol_for_build_attribute (filedata, start + 2, is_open_attr,
17795                                           & name);
17796
17797   if (end == 0 && sym != NULL && sym->st_size > 0)
17798     end = start + sym->st_size;
17799
17800   if (is_open_attr)
17801     {
17802       /* FIXME: Need to properly allow for section alignment.
17803          16 is just the alignment used on x86_64.  */
17804       if (global_end > 0
17805           && start > BFD_ALIGN (global_end, 16)
17806           /* Build notes are not guaranteed to be organised in order of
17807              increasing address, but we should find the all of the notes
17808              for one section in the same place.  */
17809           && same_section (filedata, start, global_end))
17810         warn (_("Gap in build notes detected from %#lx to %#lx\n"),
17811               global_end + 1, start - 1);
17812
17813       printf (_("    Applies to region from %#lx"), start);
17814       global_offset = start;
17815
17816       if (end)
17817         {
17818           printf (_(" to %#lx"), end);
17819           global_end = end;
17820         }
17821     }
17822   else
17823     {
17824       printf (_("    Applies to region from %#lx"), start);
17825       func_offset = start;
17826
17827       if (end)
17828         {
17829           printf (_(" to %#lx"), end);
17830           func_end = end;
17831         }
17832     }
17833
17834   if (sym && name)
17835     printf (_(" (%s)"), name);
17836
17837   printf ("\n");
17838   return TRUE;
17839 }
17840
17841 static bfd_boolean
17842 print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
17843 {
17844   static const char string_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_STRING, 0 };
17845   static const char number_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC, 0 };
17846   static const char bool_expected [3] = { GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE, GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE, 0 };
17847   char         name_type;
17848   char         name_attribute;
17849   const char * expected_types;
17850   const char * name = pnote->namedata;
17851   const char * text;
17852   signed int   left;
17853
17854   if (name == NULL || pnote->namesz < 2)
17855     {
17856       error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
17857       print_symbol (-20, _("  <corrupt name>"));
17858       return FALSE;
17859     }
17860
17861   if (do_wide)
17862     left = 28;
17863   else
17864     left = 20;
17865
17866   /* Version 2 of the spec adds a "GA" prefix to the name field.  */
17867   if (name[0] == 'G' && name[1] == 'A')
17868     {
17869       if (pnote->namesz < 4)
17870         {
17871           error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
17872           print_symbol (-20, _("  <corrupt name>"));
17873           return FALSE;
17874         }
17875
17876       printf ("GA");
17877       name += 2;
17878       left -= 2;
17879     }
17880
17881   switch ((name_type = * name))
17882     {
17883     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
17884     case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
17885     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
17886     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
17887       printf ("%c", * name);
17888       left --;
17889       break;
17890     default:
17891       error (_("unrecognised attribute type in name field: %d\n"), name_type);
17892       print_symbol (-20, _("<unknown name type>"));
17893       return FALSE;
17894     }
17895
17896   ++ name;
17897   text = NULL;
17898
17899   switch ((name_attribute = * name))
17900     {
17901     case GNU_BUILD_ATTRIBUTE_VERSION:
17902       text = _("<version>");
17903       expected_types = string_expected;
17904       ++ name;
17905       break;
17906     case GNU_BUILD_ATTRIBUTE_STACK_PROT:
17907       text = _("<stack prot>");
17908       expected_types = "!+*";
17909       ++ name;
17910       break;
17911     case GNU_BUILD_ATTRIBUTE_RELRO:
17912       text = _("<relro>");
17913       expected_types = bool_expected;
17914       ++ name;
17915       break;
17916     case GNU_BUILD_ATTRIBUTE_STACK_SIZE:
17917       text = _("<stack size>");
17918       expected_types = number_expected;
17919       ++ name;
17920       break;
17921     case GNU_BUILD_ATTRIBUTE_TOOL:
17922       text = _("<tool>");
17923       expected_types = string_expected;
17924       ++ name;
17925       break;
17926     case GNU_BUILD_ATTRIBUTE_ABI:
17927       text = _("<ABI>");
17928       expected_types = "$*";
17929       ++ name;
17930       break;
17931     case GNU_BUILD_ATTRIBUTE_PIC:
17932       text = _("<PIC>");
17933       expected_types = number_expected;
17934       ++ name;
17935       break;
17936     case GNU_BUILD_ATTRIBUTE_SHORT_ENUM:
17937       text = _("<short enum>");
17938       expected_types = bool_expected;
17939       ++ name;
17940       break;
17941     default:
17942       if (ISPRINT (* name))
17943         {
17944           int len = strnlen (name, pnote->namesz - (name - pnote->namedata)) + 1;
17945
17946           if (len > left && ! do_wide)
17947             len = left;
17948           printf ("%.*s:", len, name);
17949           left -= len;
17950           name += len;
17951         }
17952       else
17953         {
17954           static char tmpbuf [128];
17955
17956           error (_("unrecognised byte in name field: %d\n"), * name);
17957           sprintf (tmpbuf, _("<unknown:_%d>"), * name);
17958           text = tmpbuf;
17959           name ++;
17960         }
17961       expected_types = "*$!+";
17962       break;
17963     }
17964
17965   if (text)
17966     left -= printf ("%s", text);
17967
17968   if (strchr (expected_types, name_type) == NULL)
17969     warn (_("attribute does not have an expected type (%c)\n"), name_type);
17970
17971   if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
17972     {
17973       error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
17974              (unsigned long) pnote->namesz,
17975              (long) (name - pnote->namedata));
17976       return FALSE;
17977     }
17978
17979   if (left < 1 && ! do_wide)
17980     return TRUE;
17981
17982   switch (name_type)
17983     {
17984     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
17985       {
17986         unsigned int        bytes;
17987         unsigned long long  val = 0;
17988         unsigned int        shift = 0;
17989         char *              decoded = NULL;
17990
17991         bytes = pnote->namesz - (name - pnote->namedata);
17992         if (bytes > 0)
17993           /* The -1 is because the name field is always 0 terminated, and we
17994              want to be able to ensure that the shift in the while loop below
17995              will not overflow.  */
17996           -- bytes;
17997
17998         if (bytes > sizeof (val))
17999           {
18000             error (_("corrupt numeric name field: too many bytes in the value: %x\n"),
18001                    bytes);
18002             bytes = sizeof (val);
18003           }
18004         /* We do not bother to warn if bytes == 0 as this can
18005            happen with some early versions of the gcc plugin.  */
18006
18007         while (bytes --)
18008           {
18009             unsigned long byte = (* name ++) & 0xff;
18010
18011             val |= byte << shift;
18012             shift += 8;
18013           }
18014
18015         switch (name_attribute)
18016           {
18017           case GNU_BUILD_ATTRIBUTE_PIC:
18018             switch (val)
18019               {
18020               case 0: decoded = "static"; break;
18021               case 1: decoded = "pic"; break;
18022               case 2: decoded = "PIC"; break;
18023               case 3: decoded = "pie"; break;
18024               case 4: decoded = "PIE"; break;
18025               default: break;
18026               }
18027             break;
18028           case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18029             switch (val)
18030               {
18031                 /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c.  */
18032               case 0: decoded = "off"; break;
18033               case 1: decoded = "on"; break;
18034               case 2: decoded = "all"; break;
18035               case 3: decoded = "strong"; break;
18036               case 4: decoded = "explicit"; break;
18037               default: break;
18038               }
18039             break;
18040           default:
18041             break;
18042           }
18043
18044         if (decoded != NULL)
18045           {
18046             print_symbol (-left, decoded);
18047             left = 0;
18048           }
18049         else if (val == 0)
18050           {
18051             printf ("0x0");
18052             left -= 3;
18053           }
18054         else
18055           {
18056             if (do_wide)
18057               left -= printf ("0x%llx", val);
18058             else
18059               left -= printf ("0x%-.*llx", left, val);
18060           }
18061       }
18062       break;
18063     case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
18064       left -= print_symbol (- left, name);
18065       break;
18066     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
18067       left -= print_symbol (- left, "true");
18068       break;
18069     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
18070       left -= print_symbol (- left, "false");
18071       break;
18072     }
18073
18074   if (do_wide && left > 0)
18075     printf ("%-*s", left, " ");
18076     
18077   return TRUE;
18078 }
18079
18080 /* Note that by the ELF standard, the name field is already null byte
18081    terminated, and namesz includes the terminating null byte.
18082    I.E. the value of namesz for the name "FSF" is 4.
18083
18084    If the value of namesz is zero, there is no name present.  */
18085
18086 static bfd_boolean
18087 process_note (Elf_Internal_Note *  pnote,
18088               Filedata *           filedata)
18089 {
18090   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
18091   const char * nt;
18092
18093   if (pnote->namesz == 0)
18094     /* If there is no note name, then use the default set of
18095        note type strings.  */
18096     nt = get_note_type (filedata, pnote->type);
18097
18098   else if (const_strneq (pnote->namedata, "GNU"))
18099     /* GNU-specific object file notes.  */
18100     nt = get_gnu_elf_note_type (pnote->type);
18101
18102   else if (const_strneq (pnote->namedata, "FreeBSD"))
18103     /* FreeBSD-specific core file notes.  */
18104     nt = get_freebsd_elfcore_note_type (filedata, pnote->type);
18105
18106   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
18107     /* NetBSD-specific core file notes.  */
18108     nt = get_netbsd_elfcore_note_type (filedata, pnote->type);
18109
18110   else if (const_strneq (pnote->namedata, "NetBSD"))
18111     /* NetBSD-specific core file notes.  */
18112     return process_netbsd_elf_note (pnote);
18113
18114   else if (strneq (pnote->namedata, "SPU/", 4))
18115     {
18116       /* SPU-specific core file notes.  */
18117       nt = pnote->namedata + 4;
18118       name = "SPU";
18119     }
18120
18121   else if (const_strneq (pnote->namedata, "IPF/VMS"))
18122     /* VMS/ia64-specific file notes.  */
18123     nt = get_ia64_vms_note_type (pnote->type);
18124
18125   else if (const_strneq (pnote->namedata, "stapsdt"))
18126     nt = get_stapsdt_note_type (pnote->type);
18127
18128   else
18129     /* Don't recognize this note name; just use the default set of
18130        note type strings.  */
18131     nt = get_note_type (filedata, pnote->type);
18132
18133   printf ("  ");
18134
18135   if (((const_strneq (pnote->namedata, "GA")
18136         && strchr ("*$!+", pnote->namedata[2]) != NULL)
18137        || strchr ("*$!+", pnote->namedata[0]) != NULL)
18138       && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18139           || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
18140     print_gnu_build_attribute_name (pnote);
18141   else
18142     print_symbol (-20, name);
18143
18144   if (do_wide)
18145     printf (" 0x%08lx\t%s\t", pnote->descsz, nt);
18146   else
18147     printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
18148
18149   if (const_strneq (pnote->namedata, "IPF/VMS"))
18150     return print_ia64_vms_note (pnote);
18151   else if (const_strneq (pnote->namedata, "GNU"))
18152     return print_gnu_note (filedata, pnote);
18153   else if (const_strneq (pnote->namedata, "stapsdt"))
18154     return print_stapsdt_note (pnote);
18155   else if (const_strneq (pnote->namedata, "CORE"))
18156     return print_core_note (pnote);
18157   else if (((const_strneq (pnote->namedata, "GA")
18158              && strchr ("*$!+", pnote->namedata[2]) != NULL)
18159             || strchr ("*$!+", pnote->namedata[0]) != NULL)
18160            && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18161                || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
18162     return print_gnu_build_attribute_description (pnote, filedata);
18163
18164   if (pnote->descsz)
18165     {
18166       unsigned long i;
18167
18168       printf (_("   description data: "));
18169       for (i = 0; i < pnote->descsz; i++)
18170         printf ("%02x ", pnote->descdata[i]);
18171       if (!do_wide)
18172         printf ("\n");
18173     }
18174
18175   if (do_wide)
18176     printf ("\n");
18177
18178   return TRUE;
18179 }
18180
18181 static bfd_boolean
18182 process_notes_at (Filedata *           filedata,
18183                   Elf_Internal_Shdr *  section,
18184                   bfd_vma              offset,
18185                   bfd_vma              length,
18186                   bfd_vma              align)
18187 {
18188   Elf_External_Note * pnotes;
18189   Elf_External_Note * external;
18190   char *              end;
18191   bfd_boolean         res = TRUE;
18192
18193   if (length <= 0)
18194     return FALSE;
18195
18196   if (section)
18197     {
18198       pnotes = (Elf_External_Note *) get_section_contents (section, filedata);
18199       if (pnotes)
18200         {
18201           if (! apply_relocations (filedata, section, (unsigned char *) pnotes, length, NULL, NULL))
18202             return FALSE;
18203         }
18204     }
18205   else
18206     pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18207                                              _("notes"));
18208
18209   if (pnotes == NULL)
18210     return FALSE;
18211
18212   external = pnotes;
18213
18214   if (section)
18215     printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (filedata, section));
18216   else
18217     printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
18218             (unsigned long) offset, (unsigned long) length);
18219
18220   /* NB: Some note sections may have alignment value of 0 or 1.  gABI
18221      specifies that notes should be aligned to 4 bytes in 32-bit
18222      objects and to 8 bytes in 64-bit objects.  As a Linux extension,
18223      we also support 4 byte alignment in 64-bit objects.  If section
18224      alignment is less than 4, we treate alignment as 4 bytes.   */
18225   if (align < 4)
18226     align = 4;
18227   else if (align != 4 && align != 8)
18228     {
18229       warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
18230             (long) align);
18231       return FALSE;
18232     }
18233
18234   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
18235
18236   end = (char *) pnotes + length;
18237   while ((char *) external < end)
18238     {
18239       Elf_Internal_Note inote;
18240       size_t min_notesz;
18241       char * next;
18242       char * temp = NULL;
18243       size_t data_remaining = end - (char *) external;
18244
18245       if (!is_ia64_vms (filedata))
18246         {
18247           /* PR binutils/15191
18248              Make sure that there is enough data to read.  */
18249           min_notesz = offsetof (Elf_External_Note, name);
18250           if (data_remaining < min_notesz)
18251             {
18252               warn (ngettext ("Corrupt note: only %ld byte remains, "
18253                               "not enough for a full note\n",
18254                               "Corrupt note: only %ld bytes remain, "
18255                               "not enough for a full note\n",
18256                               data_remaining),
18257                     (long) data_remaining);
18258               break;
18259             }
18260           data_remaining -= min_notesz;
18261
18262           inote.type     = BYTE_GET (external->type);
18263           inote.namesz   = BYTE_GET (external->namesz);
18264           inote.namedata = external->name;
18265           inote.descsz   = BYTE_GET (external->descsz);
18266           inote.descdata = ((char *) external
18267                             + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
18268           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
18269           next = ((char *) external
18270                   + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
18271         }
18272       else
18273         {
18274           Elf64_External_VMS_Note *vms_external;
18275
18276           /* PR binutils/15191
18277              Make sure that there is enough data to read.  */
18278           min_notesz = offsetof (Elf64_External_VMS_Note, name);
18279           if (data_remaining < min_notesz)
18280             {
18281               warn (ngettext ("Corrupt note: only %ld byte remains, "
18282                               "not enough for a full note\n",
18283                               "Corrupt note: only %ld bytes remain, "
18284                               "not enough for a full note\n",
18285                               data_remaining),
18286                     (long) data_remaining);
18287               break;
18288             }
18289           data_remaining -= min_notesz;
18290
18291           vms_external = (Elf64_External_VMS_Note *) external;
18292           inote.type     = BYTE_GET (vms_external->type);
18293           inote.namesz   = BYTE_GET (vms_external->namesz);
18294           inote.namedata = vms_external->name;
18295           inote.descsz   = BYTE_GET (vms_external->descsz);
18296           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
18297           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
18298           next = inote.descdata + align_power (inote.descsz, 3);
18299         }
18300
18301       /* PR 17531: file: 3443835e.  */
18302       /* PR 17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4.  */
18303       if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
18304           || (size_t) (inote.descdata - inote.namedata) > data_remaining
18305           || (size_t) (next - inote.descdata) < inote.descsz
18306           || ((size_t) (next - inote.descdata)
18307               > data_remaining - (size_t) (inote.descdata - inote.namedata)))
18308         {
18309           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
18310                 (unsigned long) ((char *) external - (char *) pnotes));
18311           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
18312                 inote.type, inote.namesz, inote.descsz, (int) align);
18313           break;
18314         }
18315
18316       external = (Elf_External_Note *) next;
18317
18318       /* Verify that name is null terminated.  It appears that at least
18319          one version of Linux (RedHat 6.0) generates corefiles that don't
18320          comply with the ELF spec by failing to include the null byte in
18321          namesz.  */
18322       if (inote.namedata[inote.namesz - 1] != '\0')
18323         {
18324           if ((size_t) (inote.descdata - inote.namedata) == inote.namesz)
18325             {
18326               temp = (char *) malloc (inote.namesz + 1);
18327               if (temp == NULL)
18328                 {
18329                   error (_("Out of memory allocating space for inote name\n"));
18330                   res = FALSE;
18331                   break;
18332                 }
18333
18334               memcpy (temp, inote.namedata, inote.namesz);
18335               inote.namedata = temp;
18336             }
18337           inote.namedata[inote.namesz] = 0;
18338         }
18339
18340       if (! process_note (& inote, filedata))
18341         res = FALSE;
18342
18343       if (temp != NULL)
18344         {
18345           free (temp);
18346           temp = NULL;
18347         }
18348     }
18349
18350   free (pnotes);
18351
18352   return res;
18353 }
18354
18355 static bfd_boolean
18356 process_corefile_note_segments (Filedata * filedata)
18357 {
18358   Elf_Internal_Phdr * segment;
18359   unsigned int i;
18360   bfd_boolean res = TRUE;
18361
18362   if (! get_program_headers (filedata))
18363     return TRUE;
18364
18365   for (i = 0, segment = filedata->program_headers;
18366        i < filedata->file_header.e_phnum;
18367        i++, segment++)
18368     {
18369       if (segment->p_type == PT_NOTE)
18370         if (! process_notes_at (filedata, NULL,
18371                                 (bfd_vma) segment->p_offset,
18372                                 (bfd_vma) segment->p_filesz,
18373                                 (bfd_vma) segment->p_align))
18374           res = FALSE;
18375     }
18376
18377   return res;
18378 }
18379
18380 static bfd_boolean
18381 process_v850_notes (Filedata * filedata, bfd_vma offset, bfd_vma length)
18382 {
18383   Elf_External_Note * pnotes;
18384   Elf_External_Note * external;
18385   char * end;
18386   bfd_boolean res = TRUE;
18387
18388   if (length <= 0)
18389     return FALSE;
18390
18391   pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18392                                            _("v850 notes"));
18393   if (pnotes == NULL)
18394     return FALSE;
18395
18396   external = pnotes;
18397   end = (char*) pnotes + length;
18398
18399   printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
18400           (unsigned long) offset, (unsigned long) length);
18401
18402   while ((char *) external + sizeof (Elf_External_Note) < end)
18403     {
18404       Elf_External_Note * next;
18405       Elf_Internal_Note inote;
18406
18407       inote.type     = BYTE_GET (external->type);
18408       inote.namesz   = BYTE_GET (external->namesz);
18409       inote.namedata = external->name;
18410       inote.descsz   = BYTE_GET (external->descsz);
18411       inote.descdata = inote.namedata + align_power (inote.namesz, 2);
18412       inote.descpos  = offset + (inote.descdata - (char *) pnotes);
18413
18414       if (inote.descdata < (char *) pnotes || inote.descdata >= end)
18415         {
18416           warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
18417           inote.descdata = inote.namedata;
18418           inote.namesz   = 0;
18419         }
18420
18421       next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
18422
18423       if (   ((char *) next > end)
18424           || ((char *) next <  (char *) pnotes))
18425         {
18426           warn (_("corrupt descsz found in note at offset 0x%lx\n"),
18427                 (unsigned long) ((char *) external - (char *) pnotes));
18428           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
18429                 inote.type, inote.namesz, inote.descsz);
18430           break;
18431         }
18432
18433       external = next;
18434
18435       /* Prevent out-of-bounds indexing.  */
18436       if (   inote.namedata + inote.namesz > end
18437           || inote.namedata + inote.namesz < inote.namedata)
18438         {
18439           warn (_("corrupt namesz found in note at offset 0x%lx\n"),
18440                 (unsigned long) ((char *) external - (char *) pnotes));
18441           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
18442                 inote.type, inote.namesz, inote.descsz);
18443           break;
18444         }
18445
18446       printf ("  %s: ", get_v850_elf_note_type (inote.type));
18447
18448       if (! print_v850_note (& inote))
18449         {
18450           res = FALSE;
18451           printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
18452                   inote.namesz, inote.descsz);
18453         }
18454     }
18455
18456   free (pnotes);
18457
18458   return res;
18459 }
18460
18461 static bfd_boolean
18462 process_note_sections (Filedata * filedata)
18463 {
18464   Elf_Internal_Shdr * section;
18465   unsigned long i;
18466   unsigned int n = 0;
18467   bfd_boolean res = TRUE;
18468
18469   for (i = 0, section = filedata->section_headers;
18470        i < filedata->file_header.e_shnum && section != NULL;
18471        i++, section++)
18472     {
18473       if (section->sh_type == SHT_NOTE)
18474         {
18475           if (! process_notes_at (filedata, section,
18476                                   (bfd_vma) section->sh_offset,
18477                                   (bfd_vma) section->sh_size,
18478                                   (bfd_vma) section->sh_addralign))
18479             res = FALSE;
18480           n++;
18481         }
18482
18483       if ((   filedata->file_header.e_machine == EM_V800
18484            || filedata->file_header.e_machine == EM_V850
18485            || filedata->file_header.e_machine == EM_CYGNUS_V850)
18486           && section->sh_type == SHT_RENESAS_INFO)
18487         {
18488           if (! process_v850_notes (filedata,
18489                                     (bfd_vma) section->sh_offset,
18490                                     (bfd_vma) section->sh_size))
18491             res = FALSE;
18492           n++;
18493         }
18494     }
18495
18496   if (n == 0)
18497     /* Try processing NOTE segments instead.  */
18498     return process_corefile_note_segments (filedata);
18499
18500   return res;
18501 }
18502
18503 static bfd_boolean
18504 process_notes (Filedata * filedata)
18505 {
18506   /* If we have not been asked to display the notes then do nothing.  */
18507   if (! do_notes)
18508     return TRUE;
18509
18510   if (filedata->file_header.e_type != ET_CORE)
18511     return process_note_sections (filedata);
18512
18513   /* No program headers means no NOTE segment.  */
18514   if (filedata->file_header.e_phnum > 0)
18515     return process_corefile_note_segments (filedata);
18516
18517   printf (_("No note segments present in the core file.\n"));
18518   return TRUE;
18519 }
18520
18521 static unsigned char *
18522 display_public_gnu_attributes (unsigned char * start,
18523                                const unsigned char * const end)
18524 {
18525   printf (_("  Unknown GNU attribute: %s\n"), start);
18526
18527   start += strnlen ((char *) start, end - start);
18528   display_raw_attribute (start, end);
18529
18530   return (unsigned char *) end;
18531 }
18532
18533 static unsigned char *
18534 display_generic_attribute (unsigned char * start,
18535                            unsigned int tag,
18536                            const unsigned char * const end)
18537 {
18538   if (tag == 0)
18539     return (unsigned char *) end;
18540
18541   return display_tag_value (tag, start, end);
18542 }
18543
18544 static bfd_boolean
18545 process_arch_specific (Filedata * filedata)
18546 {
18547   if (! do_arch)
18548     return TRUE;
18549
18550   switch (filedata->file_header.e_machine)
18551     {
18552     case EM_ARC:
18553     case EM_ARC_COMPACT:
18554     case EM_ARC_COMPACT2:
18555       return process_attributes (filedata, "ARC", SHT_ARC_ATTRIBUTES,
18556                                  display_arc_attribute,
18557                                  display_generic_attribute);
18558     case EM_ARM:
18559       return process_attributes (filedata, "aeabi", SHT_ARM_ATTRIBUTES,
18560                                  display_arm_attribute,
18561                                  display_generic_attribute);
18562
18563     case EM_MIPS:
18564     case EM_MIPS_RS3_LE:
18565       return process_mips_specific (filedata);
18566
18567     case EM_MSP430:
18568      return process_attributes (filedata, "mspabi", SHT_MSP430_ATTRIBUTES,
18569                                 display_msp430x_attribute,
18570                                 display_generic_attribute);
18571
18572     case EM_NDS32:
18573       return process_nds32_specific (filedata);
18574
18575     case EM_PPC:
18576     case EM_PPC64:
18577       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
18578                                  display_power_gnu_attribute);
18579
18580     case EM_S390:
18581     case EM_S390_OLD:
18582       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
18583                                  display_s390_gnu_attribute);
18584
18585     case EM_SPARC:
18586     case EM_SPARC32PLUS:
18587     case EM_SPARCV9:
18588       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
18589                                  display_sparc_gnu_attribute);
18590
18591     case EM_TI_C6000:
18592       return process_attributes (filedata, "c6xabi", SHT_C6000_ATTRIBUTES,
18593                                  display_tic6x_attribute,
18594                                  display_generic_attribute);
18595
18596     default:
18597       return process_attributes (filedata, "gnu", SHT_GNU_ATTRIBUTES,
18598                                  display_public_gnu_attributes,
18599                                  display_generic_attribute);
18600     }
18601 }
18602
18603 static bfd_boolean
18604 get_file_header (Filedata * filedata)
18605 {
18606   /* Read in the identity array.  */
18607   if (fread (filedata->file_header.e_ident, EI_NIDENT, 1, filedata->handle) != 1)
18608     return FALSE;
18609
18610   /* Determine how to read the rest of the header.  */
18611   switch (filedata->file_header.e_ident[EI_DATA])
18612     {
18613     default:
18614     case ELFDATANONE:
18615     case ELFDATA2LSB:
18616       byte_get = byte_get_little_endian;
18617       byte_put = byte_put_little_endian;
18618       break;
18619     case ELFDATA2MSB:
18620       byte_get = byte_get_big_endian;
18621       byte_put = byte_put_big_endian;
18622       break;
18623     }
18624
18625   /* For now we only support 32 bit and 64 bit ELF files.  */
18626   is_32bit_elf = (filedata->file_header.e_ident[EI_CLASS] != ELFCLASS64);
18627
18628   /* Read in the rest of the header.  */
18629   if (is_32bit_elf)
18630     {
18631       Elf32_External_Ehdr ehdr32;
18632
18633       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, filedata->handle) != 1)
18634         return FALSE;
18635
18636       filedata->file_header.e_type      = BYTE_GET (ehdr32.e_type);
18637       filedata->file_header.e_machine   = BYTE_GET (ehdr32.e_machine);
18638       filedata->file_header.e_version   = BYTE_GET (ehdr32.e_version);
18639       filedata->file_header.e_entry     = BYTE_GET (ehdr32.e_entry);
18640       filedata->file_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
18641       filedata->file_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
18642       filedata->file_header.e_flags     = BYTE_GET (ehdr32.e_flags);
18643       filedata->file_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
18644       filedata->file_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
18645       filedata->file_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
18646       filedata->file_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
18647       filedata->file_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
18648       filedata->file_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
18649     }
18650   else
18651     {
18652       Elf64_External_Ehdr ehdr64;
18653
18654       /* If we have been compiled with sizeof (bfd_vma) == 4, then
18655          we will not be able to cope with the 64bit data found in
18656          64 ELF files.  Detect this now and abort before we start
18657          overwriting things.  */
18658       if (sizeof (bfd_vma) < 8)
18659         {
18660           error (_("This instance of readelf has been built without support for a\n\
18661 64 bit data type and so it cannot read 64 bit ELF files.\n"));
18662           return FALSE;
18663         }
18664
18665       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, filedata->handle) != 1)
18666         return FALSE;
18667
18668       filedata->file_header.e_type      = BYTE_GET (ehdr64.e_type);
18669       filedata->file_header.e_machine   = BYTE_GET (ehdr64.e_machine);
18670       filedata->file_header.e_version   = BYTE_GET (ehdr64.e_version);
18671       filedata->file_header.e_entry     = BYTE_GET (ehdr64.e_entry);
18672       filedata->file_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
18673       filedata->file_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
18674       filedata->file_header.e_flags     = BYTE_GET (ehdr64.e_flags);
18675       filedata->file_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
18676       filedata->file_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
18677       filedata->file_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
18678       filedata->file_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
18679       filedata->file_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
18680       filedata->file_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
18681     }
18682
18683   if (filedata->file_header.e_shoff)
18684     {
18685       /* There may be some extensions in the first section header.  Don't
18686          bomb if we can't read it.  */
18687       if (is_32bit_elf)
18688         get_32bit_section_headers (filedata, TRUE);
18689       else
18690         get_64bit_section_headers (filedata, TRUE);
18691     }
18692
18693   return TRUE;
18694 }
18695
18696 static void
18697 close_file (Filedata * filedata)
18698 {
18699   if (filedata)
18700     {
18701       if (filedata->handle)
18702         fclose (filedata->handle);
18703       free (filedata);
18704     }
18705 }
18706
18707 void
18708 close_debug_file (void * data)
18709 {
18710   close_file ((Filedata *) data);
18711 }
18712
18713 static Filedata *
18714 open_file (const char * pathname)
18715 {
18716   struct stat  statbuf;
18717   Filedata *   filedata = NULL;
18718
18719   if (stat (pathname, & statbuf) < 0
18720       || ! S_ISREG (statbuf.st_mode))
18721     goto fail;
18722
18723   filedata = calloc (1, sizeof * filedata);
18724   if (filedata == NULL)
18725     goto fail;
18726
18727   filedata->handle = fopen (pathname, "rb");
18728   if (filedata->handle == NULL)
18729     goto fail;
18730
18731   filedata->file_size = (bfd_size_type) statbuf.st_size;
18732   filedata->file_name = pathname;
18733
18734   if (! get_file_header (filedata))
18735     goto fail;
18736
18737   if (filedata->file_header.e_shoff)
18738     {
18739       bfd_boolean res;
18740
18741       /* Read the section headers again, this time for real.  */
18742       if (is_32bit_elf)
18743         res = get_32bit_section_headers (filedata, FALSE);
18744       else
18745         res = get_64bit_section_headers (filedata, FALSE);
18746
18747       if (!res)
18748         goto fail;
18749     }
18750
18751   return filedata;
18752
18753  fail:
18754   if (filedata)
18755     {
18756       if (filedata->handle)
18757         fclose (filedata->handle);
18758       free (filedata);
18759     }
18760   return NULL;
18761 }
18762
18763 void *
18764 open_debug_file (const char * pathname)
18765 {
18766   return open_file (pathname);
18767 }
18768
18769 /* Process one ELF object file according to the command line options.
18770    This file may actually be stored in an archive.  The file is
18771    positioned at the start of the ELF object.  Returns TRUE if no
18772    problems were encountered, FALSE otherwise.  */
18773
18774 static bfd_boolean
18775 process_object (Filedata * filedata)
18776 {
18777   Filedata * separates;
18778   unsigned int i;
18779   bfd_boolean res = TRUE;
18780
18781   if (! get_file_header (filedata))
18782     {
18783       error (_("%s: Failed to read file header\n"), filedata->file_name);
18784       return FALSE;
18785     }
18786
18787   /* Initialise per file variables.  */
18788   for (i = ARRAY_SIZE (version_info); i--;)
18789     version_info[i] = 0;
18790
18791   for (i = ARRAY_SIZE (dynamic_info); i--;)
18792     dynamic_info[i] = 0;
18793   dynamic_info_DT_GNU_HASH = 0;
18794
18795   /* Process the file.  */
18796   if (show_name)
18797     printf (_("\nFile: %s\n"), filedata->file_name);
18798
18799   /* Initialise the dump_sects array from the cmdline_dump_sects array.
18800      Note we do this even if cmdline_dump_sects is empty because we
18801      must make sure that the dump_sets array is zeroed out before each
18802      object file is processed.  */
18803   if (filedata->num_dump_sects > cmdline.num_dump_sects)
18804     memset (filedata->dump_sects, 0, filedata->num_dump_sects * sizeof (* filedata->dump_sects));
18805
18806   if (cmdline.num_dump_sects > 0)
18807     {
18808       if (filedata->num_dump_sects == 0)
18809         /* A sneaky way of allocating the dump_sects array.  */
18810         request_dump_bynumber (filedata, cmdline.num_dump_sects, 0);
18811
18812       assert (filedata->num_dump_sects >= cmdline.num_dump_sects);
18813       memcpy (filedata->dump_sects, cmdline.dump_sects,
18814               cmdline.num_dump_sects * sizeof (* filedata->dump_sects));
18815     }
18816
18817   if (! process_file_header (filedata))
18818     return FALSE;
18819
18820   if (! process_section_headers (filedata))
18821     {
18822       /* Without loaded section headers we cannot process lots of things.  */
18823       do_unwind = do_version = do_dump = do_arch = FALSE;
18824
18825       if (! do_using_dynamic)
18826         do_syms = do_dyn_syms = do_reloc = FALSE;
18827     }
18828
18829   if (! process_section_groups (filedata))
18830     /* Without loaded section groups we cannot process unwind.  */
18831     do_unwind = FALSE;
18832
18833   if (process_program_headers (filedata))
18834     process_dynamic_section (filedata);
18835   else
18836     res = FALSE;
18837
18838   if (! process_relocs (filedata))
18839     res = FALSE;
18840
18841   if (! process_unwind (filedata))
18842     res = FALSE;
18843
18844   if (! process_symbol_table (filedata))
18845     res = FALSE;
18846
18847   if (! process_syminfo (filedata))
18848     res = FALSE;
18849
18850   if (! process_version_sections (filedata))
18851     res = FALSE;
18852
18853   if (filedata->file_header.e_shstrndx != SHN_UNDEF)
18854     separates = load_separate_debug_file (filedata, filedata->file_name);
18855   else
18856     separates = NULL;
18857
18858   if (! process_section_contents (filedata))
18859     res = FALSE;
18860
18861   if (separates)
18862     {
18863       if (! process_section_headers (separates))
18864         res = FALSE;
18865       else if (! process_section_contents (separates))
18866         res = FALSE;
18867     }
18868
18869   if (! process_notes (filedata))
18870     res = FALSE;
18871
18872   if (! process_gnu_liblist (filedata))
18873     res = FALSE;
18874
18875   if (! process_arch_specific (filedata))
18876     res = FALSE;
18877
18878   free (filedata->program_headers);
18879   filedata->program_headers = NULL;
18880
18881   free (filedata->section_headers);
18882   filedata->section_headers = NULL;
18883
18884   free (filedata->string_table);
18885   filedata->string_table = NULL;
18886   filedata->string_table_length = 0;
18887
18888   if (dynamic_strings)
18889     {
18890       free (dynamic_strings);
18891       dynamic_strings = NULL;
18892       dynamic_strings_length = 0;
18893     }
18894
18895   if (dynamic_symbols)
18896     {
18897       free (dynamic_symbols);
18898       dynamic_symbols = NULL;
18899       num_dynamic_syms = 0;
18900     }
18901
18902   if (dynamic_syminfo)
18903     {
18904       free (dynamic_syminfo);
18905       dynamic_syminfo = NULL;
18906     }
18907
18908   if (dynamic_section)
18909     {
18910       free (dynamic_section);
18911       dynamic_section = NULL;
18912     }
18913
18914   if (section_headers_groups)
18915     {
18916       free (section_headers_groups);
18917       section_headers_groups = NULL;
18918     }
18919
18920   if (section_groups)
18921     {
18922       struct group_list * g;
18923       struct group_list * next;
18924
18925       for (i = 0; i < group_count; i++)
18926         {
18927           for (g = section_groups [i].root; g != NULL; g = next)
18928             {
18929               next = g->next;
18930               free (g);
18931             }
18932         }
18933
18934       free (section_groups);
18935       section_groups = NULL;
18936     }
18937
18938   free_debug_memory ();
18939
18940   return res;
18941 }
18942
18943 /* Process an ELF archive.
18944    On entry the file is positioned just after the ARMAG string.
18945    Returns TRUE upon success, FALSE otherwise.  */
18946
18947 static bfd_boolean
18948 process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
18949 {
18950   struct archive_info arch;
18951   struct archive_info nested_arch;
18952   size_t got;
18953   bfd_boolean ret = TRUE;
18954
18955   show_name = TRUE;
18956
18957   /* The ARCH structure is used to hold information about this archive.  */
18958   arch.file_name = NULL;
18959   arch.file = NULL;
18960   arch.index_array = NULL;
18961   arch.sym_table = NULL;
18962   arch.longnames = NULL;
18963
18964   /* The NESTED_ARCH structure is used as a single-item cache of information
18965      about a nested archive (when members of a thin archive reside within
18966      another regular archive file).  */
18967   nested_arch.file_name = NULL;
18968   nested_arch.file = NULL;
18969   nested_arch.index_array = NULL;
18970   nested_arch.sym_table = NULL;
18971   nested_arch.longnames = NULL;
18972
18973   if (setup_archive (&arch, filedata->file_name, filedata->handle,
18974                      is_thin_archive, do_archive_index) != 0)
18975     {
18976       ret = FALSE;
18977       goto out;
18978     }
18979
18980   if (do_archive_index)
18981     {
18982       if (arch.sym_table == NULL)
18983         error (_("%s: unable to dump the index as none was found\n"), filedata->file_name);
18984       else
18985         {
18986           unsigned long i, l;
18987           unsigned long current_pos;
18988
18989           printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
18990                   filedata->file_name, (unsigned long) arch.index_num, arch.sym_size);
18991
18992           current_pos = ftell (filedata->handle);
18993
18994           for (i = l = 0; i < arch.index_num; i++)
18995             {
18996               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
18997                 {
18998                   char * member_name;
18999
19000                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
19001
19002                   if (member_name != NULL)
19003                     {
19004                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
19005
19006                       if (qualified_name != NULL)
19007                         {
19008                           printf (_("Contents of binary %s at offset "), qualified_name);
19009                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
19010                           putchar ('\n');
19011                           free (qualified_name);
19012                         }
19013                     }
19014                 }
19015
19016               if (l >= arch.sym_size)
19017                 {
19018                   error (_("%s: end of the symbol table reached before the end of the index\n"),
19019                          filedata->file_name);
19020                   ret = FALSE;
19021                   break;
19022                 }
19023               /* PR 17531: file: 0b6630b2.  */
19024               printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
19025               l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
19026             }
19027
19028           if (arch.uses_64bit_indicies)
19029             l = (l + 7) & ~ 7;
19030           else
19031             l += l & 1;
19032
19033           if (l < arch.sym_size)
19034             {
19035               error (ngettext ("%s: %ld byte remains in the symbol table, "
19036                                "but without corresponding entries in "
19037                                "the index table\n",
19038                                "%s: %ld bytes remain in the symbol table, "
19039                                "but without corresponding entries in "
19040                                "the index table\n",
19041                                arch.sym_size - l),
19042                      filedata->file_name, arch.sym_size - l);
19043               ret = FALSE;
19044             }
19045
19046           if (fseek (filedata->handle, current_pos, SEEK_SET) != 0)
19047             {
19048               error (_("%s: failed to seek back to start of object files in the archive\n"),
19049                      filedata->file_name);
19050               ret = FALSE;
19051               goto out;
19052             }
19053         }
19054
19055       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
19056           && !do_segments && !do_header && !do_dump && !do_version
19057           && !do_histogram && !do_debugging && !do_arch && !do_notes
19058           && !do_section_groups && !do_dyn_syms)
19059         {
19060           ret = TRUE; /* Archive index only.  */
19061           goto out;
19062         }
19063     }
19064
19065   while (1)
19066     {
19067       char * name;
19068       size_t namelen;
19069       char * qualified_name;
19070
19071       /* Read the next archive header.  */
19072       if (fseek (filedata->handle, arch.next_arhdr_offset, SEEK_SET) != 0)
19073         {
19074           error (_("%s: failed to seek to next archive header\n"), filedata->file_name);
19075           return FALSE;
19076         }
19077       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, filedata->handle);
19078       if (got != sizeof arch.arhdr)
19079         {
19080           if (got == 0)
19081             break;
19082           error (_("%s: failed to read archive header\n"), filedata->file_name);
19083           ret = FALSE;
19084           break;
19085         }
19086       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
19087         {
19088           error (_("%s: did not find a valid archive header\n"), arch.file_name);
19089           ret = FALSE;
19090           break;
19091         }
19092
19093       arch.next_arhdr_offset += sizeof arch.arhdr;
19094
19095       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
19096       if (archive_file_size & 01)
19097         ++archive_file_size;
19098
19099       name = get_archive_member_name (&arch, &nested_arch);
19100       if (name == NULL)
19101         {
19102           error (_("%s: bad archive file name\n"), filedata->file_name);
19103           ret = FALSE;
19104           break;
19105         }
19106       namelen = strlen (name);
19107
19108       qualified_name = make_qualified_name (&arch, &nested_arch, name);
19109       if (qualified_name == NULL)
19110         {
19111           error (_("%s: bad archive file name\n"), filedata->file_name);
19112           ret = FALSE;
19113           break;
19114         }
19115
19116       if (is_thin_archive && arch.nested_member_origin == 0)
19117         {
19118           /* This is a proxy for an external member of a thin archive.  */
19119           Filedata * member_filedata;
19120           char * member_file_name = adjust_relative_path
19121             (filedata->file_name, name, namelen);
19122
19123           if (member_file_name == NULL)
19124             {
19125               ret = FALSE;
19126               break;
19127             }
19128
19129           member_filedata = open_file (member_file_name);
19130           if (member_filedata == NULL)
19131             {
19132               error (_("Input file '%s' is not readable.\n"), member_file_name);
19133               free (member_file_name);
19134               ret = FALSE;
19135               break;
19136             }
19137
19138           archive_file_offset = arch.nested_member_origin;
19139           member_filedata->file_name = qualified_name;
19140
19141           if (! process_object (member_filedata))
19142             ret = FALSE;
19143
19144           close_file (member_filedata);
19145           free (member_file_name);
19146         }
19147       else if (is_thin_archive)
19148         {
19149           Filedata thin_filedata;
19150
19151           memset (&thin_filedata, 0, sizeof (thin_filedata));
19152
19153           /* PR 15140: Allow for corrupt thin archives.  */
19154           if (nested_arch.file == NULL)
19155             {
19156               error (_("%s: contains corrupt thin archive: %s\n"),
19157                      filedata->file_name, name);
19158               ret = FALSE;
19159               break;
19160             }
19161
19162           /* This is a proxy for a member of a nested archive.  */
19163           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
19164
19165           /* The nested archive file will have been opened and setup by
19166              get_archive_member_name.  */
19167           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
19168             {
19169               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
19170               ret = FALSE;
19171               break;
19172             }
19173
19174           thin_filedata.handle = nested_arch.file;
19175           thin_filedata.file_name = qualified_name;
19176           
19177           if (! process_object (& thin_filedata))
19178             ret = FALSE;
19179         }
19180       else
19181         {
19182           archive_file_offset = arch.next_arhdr_offset;
19183           arch.next_arhdr_offset += archive_file_size;
19184
19185           filedata->file_name = qualified_name;
19186           if (! process_object (filedata))
19187             ret = FALSE;
19188         }
19189
19190       if (filedata->dump_sects != NULL)
19191         {
19192           free (filedata->dump_sects);
19193           filedata->dump_sects = NULL;
19194           filedata->num_dump_sects = 0;
19195         }
19196
19197       free (qualified_name);
19198     }
19199
19200  out:
19201   if (nested_arch.file != NULL)
19202     fclose (nested_arch.file);
19203   release_archive (&nested_arch);
19204   release_archive (&arch);
19205
19206   return ret;
19207 }
19208
19209 static bfd_boolean
19210 process_file (char * file_name)
19211 {
19212   Filedata * filedata = NULL;
19213   struct stat statbuf;
19214   char armag[SARMAG];
19215   bfd_boolean ret = TRUE;
19216
19217   if (stat (file_name, &statbuf) < 0)
19218     {
19219       if (errno == ENOENT)
19220         error (_("'%s': No such file\n"), file_name);
19221       else
19222         error (_("Could not locate '%s'.  System error message: %s\n"),
19223                file_name, strerror (errno));
19224       return FALSE;
19225     }
19226
19227   if (! S_ISREG (statbuf.st_mode))
19228     {
19229       error (_("'%s' is not an ordinary file\n"), file_name);
19230       return FALSE;
19231     }
19232
19233   filedata = calloc (1, sizeof * filedata);
19234   if (filedata == NULL)
19235     {
19236       error (_("Out of memory allocating file data structure\n"));
19237       return FALSE;
19238     }
19239
19240   filedata->file_name = file_name;
19241   filedata->handle = fopen (file_name, "rb");
19242   if (filedata->handle == NULL)
19243     {
19244       error (_("Input file '%s' is not readable.\n"), file_name);
19245       free (filedata);
19246       return FALSE;
19247     }
19248
19249   if (fread (armag, SARMAG, 1, filedata->handle) != 1)
19250     {
19251       error (_("%s: Failed to read file's magic number\n"), file_name);
19252       fclose (filedata->handle);
19253       free (filedata);
19254       return FALSE;
19255     }
19256
19257   filedata->file_size = (bfd_size_type) statbuf.st_size;
19258
19259   if (memcmp (armag, ARMAG, SARMAG) == 0)
19260     {
19261       if (! process_archive (filedata, FALSE))
19262         ret = FALSE;
19263     }
19264   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
19265     {
19266       if ( ! process_archive (filedata, TRUE))
19267         ret = FALSE;
19268     }
19269   else
19270     {
19271       if (do_archive_index)
19272         error (_("File %s is not an archive so its index cannot be displayed.\n"),
19273                file_name);
19274
19275       rewind (filedata->handle);
19276       archive_file_size = archive_file_offset = 0;
19277
19278       if (! process_object (filedata))
19279         ret = FALSE;
19280     }
19281
19282   fclose (filedata->handle);
19283   free (filedata);
19284
19285   return ret;
19286 }
19287
19288 #ifdef SUPPORT_DISASSEMBLY
19289 /* Needed by the i386 disassembler.  For extra credit, someone could
19290    fix this so that we insert symbolic addresses here, esp for GOT/PLT
19291    symbols.  */
19292
19293 void
19294 print_address (unsigned int addr, FILE * outfile)
19295 {
19296   fprintf (outfile,"0x%8.8x", addr);
19297 }
19298
19299 /* Needed by the i386 disassembler.  */
19300
19301 void
19302 db_task_printsym (unsigned int addr)
19303 {
19304   print_address (addr, stderr);
19305 }
19306 #endif
19307
19308 int
19309 main (int argc, char ** argv)
19310 {
19311   int err;
19312
19313 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
19314   setlocale (LC_MESSAGES, "");
19315 #endif
19316 #if defined (HAVE_SETLOCALE)
19317   setlocale (LC_CTYPE, "");
19318 #endif
19319   bindtextdomain (PACKAGE, LOCALEDIR);
19320   textdomain (PACKAGE);
19321
19322   expandargv (&argc, &argv);
19323
19324   cmdline.file_name = "<cmdline>";
19325   parse_args (& cmdline, argc, argv);
19326
19327   if (optind < (argc - 1))
19328     show_name = TRUE;
19329   else if (optind >= argc)
19330     {
19331       warn (_("Nothing to do.\n"));
19332       usage (stderr);
19333     }
19334
19335   err = FALSE;
19336   while (optind < argc)
19337     if (! process_file (argv[optind++]))
19338       err = TRUE;
19339
19340   if (cmdline.dump_sects != NULL)
19341     free (cmdline.dump_sects);
19342
19343   return err ? EXIT_FAILURE : EXIT_SUCCESS;
19344 }