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