Add support for the Freescale s12z processor.
[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           switch (e_flags & EF_RISCV_FLOAT_ABI)
3476             {
3477             case EF_RISCV_FLOAT_ABI_SOFT:
3478               strcat (buf, ", soft-float ABI");
3479               break;
3480
3481             case EF_RISCV_FLOAT_ABI_SINGLE:
3482               strcat (buf, ", single-float ABI");
3483               break;
3484
3485             case EF_RISCV_FLOAT_ABI_DOUBLE:
3486               strcat (buf, ", double-float ABI");
3487               break;
3488
3489             case EF_RISCV_FLOAT_ABI_QUAD:
3490               strcat (buf, ", quad-float ABI");
3491               break;
3492             }
3493           break;
3494
3495         case EM_SH:
3496           switch ((e_flags & EF_SH_MACH_MASK))
3497             {
3498             case EF_SH1: strcat (buf, ", sh1"); break;
3499             case EF_SH2: strcat (buf, ", sh2"); break;
3500             case EF_SH3: strcat (buf, ", sh3"); break;
3501             case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3502             case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3503             case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3504             case EF_SH3E: strcat (buf, ", sh3e"); break;
3505             case EF_SH4: strcat (buf, ", sh4"); break;
3506             case EF_SH5: strcat (buf, ", sh5"); break;
3507             case EF_SH2E: strcat (buf, ", sh2e"); break;
3508             case EF_SH4A: strcat (buf, ", sh4a"); break;
3509             case EF_SH2A: strcat (buf, ", sh2a"); break;
3510             case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3511             case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3512             case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3513             case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3514             case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3515             case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3516             case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3517             case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3518             case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3519             default: strcat (buf, _(", unknown ISA")); break;
3520             }
3521
3522           if (e_flags & EF_SH_PIC)
3523             strcat (buf, ", pic");
3524
3525           if (e_flags & EF_SH_FDPIC)
3526             strcat (buf, ", fdpic");
3527           break;
3528
3529         case EM_OR1K:
3530           if (e_flags & EF_OR1K_NODELAY)
3531             strcat (buf, ", no delay");
3532           break;
3533
3534         case EM_SPARCV9:
3535           if (e_flags & EF_SPARC_32PLUS)
3536             strcat (buf, ", v8+");
3537
3538           if (e_flags & EF_SPARC_SUN_US1)
3539             strcat (buf, ", ultrasparcI");
3540
3541           if (e_flags & EF_SPARC_SUN_US3)
3542             strcat (buf, ", ultrasparcIII");
3543
3544           if (e_flags & EF_SPARC_HAL_R1)
3545             strcat (buf, ", halr1");
3546
3547           if (e_flags & EF_SPARC_LEDATA)
3548             strcat (buf, ", ledata");
3549
3550           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3551             strcat (buf, ", tso");
3552
3553           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3554             strcat (buf, ", pso");
3555
3556           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3557             strcat (buf, ", rmo");
3558           break;
3559
3560         case EM_PARISC:
3561           switch (e_flags & EF_PARISC_ARCH)
3562             {
3563             case EFA_PARISC_1_0:
3564               strcpy (buf, ", PA-RISC 1.0");
3565               break;
3566             case EFA_PARISC_1_1:
3567               strcpy (buf, ", PA-RISC 1.1");
3568               break;
3569             case EFA_PARISC_2_0:
3570               strcpy (buf, ", PA-RISC 2.0");
3571               break;
3572             default:
3573               break;
3574             }
3575           if (e_flags & EF_PARISC_TRAPNIL)
3576             strcat (buf, ", trapnil");
3577           if (e_flags & EF_PARISC_EXT)
3578             strcat (buf, ", ext");
3579           if (e_flags & EF_PARISC_LSB)
3580             strcat (buf, ", lsb");
3581           if (e_flags & EF_PARISC_WIDE)
3582             strcat (buf, ", wide");
3583           if (e_flags & EF_PARISC_NO_KABP)
3584             strcat (buf, ", no kabp");
3585           if (e_flags & EF_PARISC_LAZYSWAP)
3586             strcat (buf, ", lazyswap");
3587           break;
3588
3589         case EM_PJ:
3590         case EM_PJ_OLD:
3591           if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3592             strcat (buf, ", new calling convention");
3593
3594           if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3595             strcat (buf, ", gnu calling convention");
3596           break;
3597
3598         case EM_IA_64:
3599           if ((e_flags & EF_IA_64_ABI64))
3600             strcat (buf, ", 64-bit");
3601           else
3602             strcat (buf, ", 32-bit");
3603           if ((e_flags & EF_IA_64_REDUCEDFP))
3604             strcat (buf, ", reduced fp model");
3605           if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3606             strcat (buf, ", no function descriptors, constant gp");
3607           else if ((e_flags & EF_IA_64_CONS_GP))
3608             strcat (buf, ", constant gp");
3609           if ((e_flags & EF_IA_64_ABSOLUTE))
3610             strcat (buf, ", absolute");
3611           if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3612             {
3613               if ((e_flags & EF_IA_64_VMS_LINKAGES))
3614                 strcat (buf, ", vms_linkages");
3615               switch ((e_flags & EF_IA_64_VMS_COMCOD))
3616                 {
3617                 case EF_IA_64_VMS_COMCOD_SUCCESS:
3618                   break;
3619                 case EF_IA_64_VMS_COMCOD_WARNING:
3620                   strcat (buf, ", warning");
3621                   break;
3622                 case EF_IA_64_VMS_COMCOD_ERROR:
3623                   strcat (buf, ", error");
3624                   break;
3625                 case EF_IA_64_VMS_COMCOD_ABORT:
3626                   strcat (buf, ", abort");
3627                   break;
3628                 default:
3629                   warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3630                         e_flags & EF_IA_64_VMS_COMCOD);
3631                   strcat (buf, ", <unknown>");
3632                 }
3633             }
3634           break;
3635
3636         case EM_VAX:
3637           if ((e_flags & EF_VAX_NONPIC))
3638             strcat (buf, ", non-PIC");
3639           if ((e_flags & EF_VAX_DFLOAT))
3640             strcat (buf, ", D-Float");
3641           if ((e_flags & EF_VAX_GFLOAT))
3642             strcat (buf, ", G-Float");
3643           break;
3644
3645         case EM_VISIUM:
3646           if (e_flags & EF_VISIUM_ARCH_MCM)
3647             strcat (buf, ", mcm");
3648           else if (e_flags & EF_VISIUM_ARCH_MCM24)
3649             strcat (buf, ", mcm24");
3650           if (e_flags & EF_VISIUM_ARCH_GR6)
3651             strcat (buf, ", gr6");
3652           break;
3653
3654         case EM_RL78:
3655           switch (e_flags & E_FLAG_RL78_CPU_MASK)
3656             {
3657             case E_FLAG_RL78_ANY_CPU: break;
3658             case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3659             case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3660             case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3661             }
3662           if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3663             strcat (buf, ", 64-bit doubles");
3664           break;
3665
3666         case EM_RX:
3667           if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3668             strcat (buf, ", 64-bit doubles");
3669           if (e_flags & E_FLAG_RX_DSP)
3670             strcat (buf, ", dsp");
3671           if (e_flags & E_FLAG_RX_PID)
3672             strcat (buf, ", pid");
3673           if (e_flags & E_FLAG_RX_ABI)
3674             strcat (buf, ", RX ABI");
3675           if (e_flags & E_FLAG_RX_SINSNS_SET)
3676             strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3677                     ? ", uses String instructions" : ", bans String instructions");
3678           if (e_flags & E_FLAG_RX_V2)
3679             strcat (buf, ", V2");
3680           break;
3681
3682         case EM_S390:
3683           if (e_flags & EF_S390_HIGH_GPRS)
3684             strcat (buf, ", highgprs");
3685           break;
3686
3687         case EM_TI_C6000:
3688           if ((e_flags & EF_C6000_REL))
3689             strcat (buf, ", relocatable module");
3690           break;
3691
3692         case EM_MSP430:
3693           strcat (buf, _(": architecture variant: "));
3694           switch (e_flags & EF_MSP430_MACH)
3695             {
3696             case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3697             case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3698             case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3699             case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3700             case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3701             case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3702             case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3703             case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3704             case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3705             case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3706             case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3707             case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3708             case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3709             case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3710             case E_MSP430_MACH_MSP430X  : strcat (buf, "MSP430X"); break;
3711             default:
3712               strcat (buf, _(": unknown")); break;
3713             }
3714
3715           if (e_flags & ~ EF_MSP430_MACH)
3716             strcat (buf, _(": unknown extra flag bits also present"));
3717         }
3718     }
3719
3720   return buf;
3721 }
3722
3723 static const char *
3724 get_osabi_name (Filedata * filedata, unsigned int osabi)
3725 {
3726   static char buff[32];
3727
3728   switch (osabi)
3729     {
3730     case ELFOSABI_NONE:         return "UNIX - System V";
3731     case ELFOSABI_HPUX:         return "UNIX - HP-UX";
3732     case ELFOSABI_NETBSD:       return "UNIX - NetBSD";
3733     case ELFOSABI_GNU:          return "UNIX - GNU";
3734     case ELFOSABI_SOLARIS:      return "UNIX - Solaris";
3735     case ELFOSABI_AIX:          return "UNIX - AIX";
3736     case ELFOSABI_IRIX:         return "UNIX - IRIX";
3737     case ELFOSABI_FREEBSD:      return "UNIX - FreeBSD";
3738     case ELFOSABI_TRU64:        return "UNIX - TRU64";
3739     case ELFOSABI_MODESTO:      return "Novell - Modesto";
3740     case ELFOSABI_OPENBSD:      return "UNIX - OpenBSD";
3741     case ELFOSABI_OPENVMS:      return "VMS - OpenVMS";
3742     case ELFOSABI_NSK:          return "HP - Non-Stop Kernel";
3743     case ELFOSABI_AROS:         return "AROS";
3744     case ELFOSABI_FENIXOS:      return "FenixOS";
3745     case ELFOSABI_CLOUDABI:     return "Nuxi CloudABI";
3746     case ELFOSABI_OPENVOS:      return "Stratus Technologies OpenVOS";
3747     default:
3748       if (osabi >= 64)
3749         switch (filedata->file_header.e_machine)
3750           {
3751           case EM_ARM:
3752             switch (osabi)
3753               {
3754               case ELFOSABI_ARM:        return "ARM";
3755               case ELFOSABI_ARM_FDPIC:  return "ARM FDPIC";
3756               default:
3757                 break;
3758               }
3759             break;
3760
3761           case EM_MSP430:
3762           case EM_MSP430_OLD:
3763           case EM_VISIUM:
3764             switch (osabi)
3765               {
3766               case ELFOSABI_STANDALONE: return _("Standalone App");
3767               default:
3768                 break;
3769               }
3770             break;
3771
3772           case EM_TI_C6000:
3773             switch (osabi)
3774               {
3775               case ELFOSABI_C6000_ELFABI:       return _("Bare-metal C6000");
3776               case ELFOSABI_C6000_LINUX:        return "Linux C6000";
3777               default:
3778                 break;
3779               }
3780             break;
3781
3782           default:
3783             break;
3784           }
3785       snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3786       return buff;
3787     }
3788 }
3789
3790 static const char *
3791 get_aarch64_segment_type (unsigned long type)
3792 {
3793   switch (type)
3794     {
3795     case PT_AARCH64_ARCHEXT:  return "AARCH64_ARCHEXT";
3796     default:                  return NULL;
3797     }
3798 }
3799
3800 static const char *
3801 get_arm_segment_type (unsigned long type)
3802 {
3803   switch (type)
3804     {
3805     case PT_ARM_EXIDX: return "EXIDX";
3806     default:           return NULL;
3807     }
3808 }
3809
3810 static const char *
3811 get_s390_segment_type (unsigned long type)
3812 {
3813   switch (type)
3814     {
3815     case PT_S390_PGSTE: return "S390_PGSTE";
3816     default:            return NULL;
3817     }
3818 }
3819
3820 static const char *
3821 get_mips_segment_type (unsigned long type)
3822 {
3823   switch (type)
3824     {
3825     case PT_MIPS_REGINFO:   return "REGINFO";
3826     case PT_MIPS_RTPROC:    return "RTPROC";
3827     case PT_MIPS_OPTIONS:   return "OPTIONS";
3828     case PT_MIPS_ABIFLAGS:  return "ABIFLAGS";
3829     default:                return NULL;
3830     }
3831 }
3832
3833 static const char *
3834 get_parisc_segment_type (unsigned long type)
3835 {
3836   switch (type)
3837     {
3838     case PT_HP_TLS:             return "HP_TLS";
3839     case PT_HP_CORE_NONE:       return "HP_CORE_NONE";
3840     case PT_HP_CORE_VERSION:    return "HP_CORE_VERSION";
3841     case PT_HP_CORE_KERNEL:     return "HP_CORE_KERNEL";
3842     case PT_HP_CORE_COMM:       return "HP_CORE_COMM";
3843     case PT_HP_CORE_PROC:       return "HP_CORE_PROC";
3844     case PT_HP_CORE_LOADABLE:   return "HP_CORE_LOADABLE";
3845     case PT_HP_CORE_STACK:      return "HP_CORE_STACK";
3846     case PT_HP_CORE_SHM:        return "HP_CORE_SHM";
3847     case PT_HP_CORE_MMF:        return "HP_CORE_MMF";
3848     case PT_HP_PARALLEL:        return "HP_PARALLEL";
3849     case PT_HP_FASTBIND:        return "HP_FASTBIND";
3850     case PT_HP_OPT_ANNOT:       return "HP_OPT_ANNOT";
3851     case PT_HP_HSL_ANNOT:       return "HP_HSL_ANNOT";
3852     case PT_HP_STACK:           return "HP_STACK";
3853     case PT_HP_CORE_UTSNAME:    return "HP_CORE_UTSNAME";
3854     case PT_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
3855     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
3856     case PT_PARISC_WEAKORDER:   return "PARISC_WEAKORDER";
3857     default:                    return NULL;
3858     }
3859 }
3860
3861 static const char *
3862 get_ia64_segment_type (unsigned long type)
3863 {
3864   switch (type)
3865     {
3866     case PT_IA_64_ARCHEXT:      return "IA_64_ARCHEXT";
3867     case PT_IA_64_UNWIND:       return "IA_64_UNWIND";
3868     case PT_HP_TLS:             return "HP_TLS";
3869     case PT_IA_64_HP_OPT_ANOT:  return "HP_OPT_ANNOT";
3870     case PT_IA_64_HP_HSL_ANOT:  return "HP_HSL_ANNOT";
3871     case PT_IA_64_HP_STACK:     return "HP_STACK";
3872     default:                    return NULL;
3873     }
3874 }
3875
3876 static const char *
3877 get_tic6x_segment_type (unsigned long type)
3878 {
3879   switch (type)
3880     {
3881     case PT_C6000_PHATTR:  return "C6000_PHATTR";
3882     default:               return NULL;
3883     }
3884 }
3885
3886 static const char *
3887 get_solaris_segment_type (unsigned long type)
3888 {
3889   switch (type)
3890     {
3891     case 0x6464e550: return "PT_SUNW_UNWIND";
3892     case 0x6474e550: return "PT_SUNW_EH_FRAME";
3893     case 0x6ffffff7: return "PT_LOSUNW";
3894     case 0x6ffffffa: return "PT_SUNWBSS";
3895     case 0x6ffffffb: return "PT_SUNWSTACK";
3896     case 0x6ffffffc: return "PT_SUNWDTRACE";
3897     case 0x6ffffffd: return "PT_SUNWCAP";
3898     case 0x6fffffff: return "PT_HISUNW";
3899     default:         return NULL;
3900     }
3901 }
3902
3903 static const char *
3904 get_segment_type (Filedata * filedata, unsigned long p_type)
3905 {
3906   static char buff[32];
3907
3908   switch (p_type)
3909     {
3910     case PT_NULL:       return "NULL";
3911     case PT_LOAD:       return "LOAD";
3912     case PT_DYNAMIC:    return "DYNAMIC";
3913     case PT_INTERP:     return "INTERP";
3914     case PT_NOTE:       return "NOTE";
3915     case PT_SHLIB:      return "SHLIB";
3916     case PT_PHDR:       return "PHDR";
3917     case PT_TLS:        return "TLS";
3918     case PT_GNU_EH_FRAME: return "GNU_EH_FRAME";
3919     case PT_GNU_STACK:  return "GNU_STACK";
3920     case PT_GNU_RELRO:  return "GNU_RELRO";
3921
3922     default:
3923       if (p_type >= PT_GNU_MBIND_LO && p_type <= PT_GNU_MBIND_HI)
3924         {
3925           sprintf (buff, "GNU_MBIND+%#lx",
3926                    p_type - PT_GNU_MBIND_LO);
3927         }
3928       else if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3929         {
3930           const char * result;
3931
3932           switch (filedata->file_header.e_machine)
3933             {
3934             case EM_AARCH64:
3935               result = get_aarch64_segment_type (p_type);
3936               break;
3937             case EM_ARM:
3938               result = get_arm_segment_type (p_type);
3939               break;
3940             case EM_MIPS:
3941             case EM_MIPS_RS3_LE:
3942               result = get_mips_segment_type (p_type);
3943               break;
3944             case EM_PARISC:
3945               result = get_parisc_segment_type (p_type);
3946               break;
3947             case EM_IA_64:
3948               result = get_ia64_segment_type (p_type);
3949               break;
3950             case EM_TI_C6000:
3951               result = get_tic6x_segment_type (p_type);
3952               break;
3953             case EM_S390:
3954             case EM_S390_OLD:
3955               result = get_s390_segment_type (p_type);
3956               break;
3957             default:
3958               result = NULL;
3959               break;
3960             }
3961
3962           if (result != NULL)
3963             return result;
3964
3965           sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
3966         }
3967       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3968         {
3969           const char * result;
3970
3971           switch (filedata->file_header.e_machine)
3972             {
3973             case EM_PARISC:
3974               result = get_parisc_segment_type (p_type);
3975               break;
3976             case EM_IA_64:
3977               result = get_ia64_segment_type (p_type);
3978               break;
3979             default:
3980               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
3981                 result = get_solaris_segment_type (p_type);
3982               else
3983                 result = NULL;
3984               break;
3985             }
3986
3987           if (result != NULL)
3988             return result;
3989
3990           sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
3991         }
3992       else
3993         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3994
3995       return buff;
3996     }
3997 }
3998
3999 static const char *
4000 get_arc_section_type_name (unsigned int sh_type)
4001 {
4002   switch (sh_type)
4003     {
4004     case SHT_ARC_ATTRIBUTES:      return "ARC_ATTRIBUTES";
4005     default:
4006       break;
4007     }
4008   return NULL;
4009 }
4010
4011 static const char *
4012 get_mips_section_type_name (unsigned int sh_type)
4013 {
4014   switch (sh_type)
4015     {
4016     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
4017     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
4018     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
4019     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
4020     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
4021     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
4022     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
4023     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
4024     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
4025     case SHT_MIPS_RELD:          return "MIPS_RELD";
4026     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
4027     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
4028     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
4029     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
4030     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
4031     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
4032     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
4033     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
4034     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
4035     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
4036     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
4037     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
4038     case SHT_MIPS_LINE:          return "MIPS_LINE";
4039     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
4040     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
4041     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
4042     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
4043     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
4044     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
4045     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
4046     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
4047     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
4048     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
4049     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
4050     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
4051     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
4052     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
4053     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
4054     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
4055     case SHT_MIPS_ABIFLAGS:      return "MIPS_ABIFLAGS";
4056     default:
4057       break;
4058     }
4059   return NULL;
4060 }
4061
4062 static const char *
4063 get_parisc_section_type_name (unsigned int sh_type)
4064 {
4065   switch (sh_type)
4066     {
4067     case SHT_PARISC_EXT:        return "PARISC_EXT";
4068     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
4069     case SHT_PARISC_DOC:        return "PARISC_DOC";
4070     case SHT_PARISC_ANNOT:      return "PARISC_ANNOT";
4071     case SHT_PARISC_SYMEXTN:    return "PARISC_SYMEXTN";
4072     case SHT_PARISC_STUBS:      return "PARISC_STUBS";
4073     case SHT_PARISC_DLKM:       return "PARISC_DLKM";
4074     default:                    return NULL;
4075     }
4076 }
4077
4078 static const char *
4079 get_ia64_section_type_name (Filedata * filedata, unsigned int sh_type)
4080 {
4081   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
4082   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
4083     return get_osabi_name (filedata, (sh_type & 0x00FF0000) >> 16);
4084
4085   switch (sh_type)
4086     {
4087     case SHT_IA_64_EXT:                return "IA_64_EXT";
4088     case SHT_IA_64_UNWIND:             return "IA_64_UNWIND";
4089     case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
4090     case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
4091     case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
4092     case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
4093     case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
4094     case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
4095     case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
4096     case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
4097     default:
4098       break;
4099     }
4100   return NULL;
4101 }
4102
4103 static const char *
4104 get_x86_64_section_type_name (unsigned int sh_type)
4105 {
4106   switch (sh_type)
4107     {
4108     case SHT_X86_64_UNWIND:     return "X86_64_UNWIND";
4109     default:                    return NULL;
4110     }
4111 }
4112
4113 static const char *
4114 get_aarch64_section_type_name (unsigned int sh_type)
4115 {
4116   switch (sh_type)
4117     {
4118     case SHT_AARCH64_ATTRIBUTES: return "AARCH64_ATTRIBUTES";
4119     default:                     return NULL;
4120     }
4121 }
4122
4123 static const char *
4124 get_arm_section_type_name (unsigned int sh_type)
4125 {
4126   switch (sh_type)
4127     {
4128     case SHT_ARM_EXIDX:           return "ARM_EXIDX";
4129     case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
4130     case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
4131     case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
4132     case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
4133     default:                      return NULL;
4134     }
4135 }
4136
4137 static const char *
4138 get_tic6x_section_type_name (unsigned int sh_type)
4139 {
4140   switch (sh_type)
4141     {
4142     case SHT_C6000_UNWIND:      return "C6000_UNWIND";
4143     case SHT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
4144     case SHT_C6000_ATTRIBUTES:  return "C6000_ATTRIBUTES";
4145     case SHT_TI_ICODE:          return "TI_ICODE";
4146     case SHT_TI_XREF:           return "TI_XREF";
4147     case SHT_TI_HANDLER:        return "TI_HANDLER";
4148     case SHT_TI_INITINFO:       return "TI_INITINFO";
4149     case SHT_TI_PHATTRS:        return "TI_PHATTRS";
4150     default:                    return NULL;
4151     }
4152 }
4153
4154 static const char *
4155 get_msp430x_section_type_name (unsigned int sh_type)
4156 {
4157   switch (sh_type)
4158     {
4159     case SHT_MSP430_SEC_FLAGS:    return "MSP430_SEC_FLAGS";
4160     case SHT_MSP430_SYM_ALIASES:  return "MSP430_SYM_ALIASES";
4161     case SHT_MSP430_ATTRIBUTES:   return "MSP430_ATTRIBUTES";
4162     default:                      return NULL;
4163     }
4164 }
4165
4166 static const char *
4167 get_nfp_section_type_name (unsigned int sh_type)
4168 {
4169   switch (sh_type)
4170     {
4171     case SHT_NFP_MECONFIG:      return "NFP_MECONFIG";
4172     case SHT_NFP_INITREG:       return "NFP_INITREG";
4173     case SHT_NFP_UDEBUG:        return "NFP_UDEBUG";
4174     default:                    return NULL;
4175     }
4176 }
4177
4178 static const char *
4179 get_v850_section_type_name (unsigned int sh_type)
4180 {
4181   switch (sh_type)
4182     {
4183     case SHT_V850_SCOMMON:  return "V850 Small Common";
4184     case SHT_V850_TCOMMON:  return "V850 Tiny Common";
4185     case SHT_V850_ZCOMMON:  return "V850 Zero Common";
4186     case SHT_RENESAS_IOP:   return "RENESAS IOP";
4187     case SHT_RENESAS_INFO:  return "RENESAS INFO";
4188     default:                return NULL;
4189     }
4190 }
4191
4192 static const char *
4193 get_section_type_name (Filedata * filedata, unsigned int sh_type)
4194 {
4195   static char buff[32];
4196   const char * result;
4197
4198   switch (sh_type)
4199     {
4200     case SHT_NULL:              return "NULL";
4201     case SHT_PROGBITS:          return "PROGBITS";
4202     case SHT_SYMTAB:            return "SYMTAB";
4203     case SHT_STRTAB:            return "STRTAB";
4204     case SHT_RELA:              return "RELA";
4205     case SHT_HASH:              return "HASH";
4206     case SHT_DYNAMIC:           return "DYNAMIC";
4207     case SHT_NOTE:              return "NOTE";
4208     case SHT_NOBITS:            return "NOBITS";
4209     case SHT_REL:               return "REL";
4210     case SHT_SHLIB:             return "SHLIB";
4211     case SHT_DYNSYM:            return "DYNSYM";
4212     case SHT_INIT_ARRAY:        return "INIT_ARRAY";
4213     case SHT_FINI_ARRAY:        return "FINI_ARRAY";
4214     case SHT_PREINIT_ARRAY:     return "PREINIT_ARRAY";
4215     case SHT_GNU_HASH:          return "GNU_HASH";
4216     case SHT_GROUP:             return "GROUP";
4217     case SHT_SYMTAB_SHNDX:      return "SYMTAB SECTION INDICIES";
4218     case SHT_GNU_verdef:        return "VERDEF";
4219     case SHT_GNU_verneed:       return "VERNEED";
4220     case SHT_GNU_versym:        return "VERSYM";
4221     case 0x6ffffff0:            return "VERSYM";
4222     case 0x6ffffffc:            return "VERDEF";
4223     case 0x7ffffffd:            return "AUXILIARY";
4224     case 0x7fffffff:            return "FILTER";
4225     case SHT_GNU_LIBLIST:       return "GNU_LIBLIST";
4226
4227     default:
4228       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4229         {
4230           switch (filedata->file_header.e_machine)
4231             {
4232             case EM_ARC:
4233             case EM_ARC_COMPACT:
4234             case EM_ARC_COMPACT2:
4235               result = get_arc_section_type_name (sh_type);
4236               break;
4237             case EM_MIPS:
4238             case EM_MIPS_RS3_LE:
4239               result = get_mips_section_type_name (sh_type);
4240               break;
4241             case EM_PARISC:
4242               result = get_parisc_section_type_name (sh_type);
4243               break;
4244             case EM_IA_64:
4245               result = get_ia64_section_type_name (filedata, sh_type);
4246               break;
4247             case EM_X86_64:
4248             case EM_L1OM:
4249             case EM_K1OM:
4250               result = get_x86_64_section_type_name (sh_type);
4251               break;
4252             case EM_AARCH64:
4253               result = get_aarch64_section_type_name (sh_type);
4254               break;
4255             case EM_ARM:
4256               result = get_arm_section_type_name (sh_type);
4257               break;
4258             case EM_TI_C6000:
4259               result = get_tic6x_section_type_name (sh_type);
4260               break;
4261             case EM_MSP430:
4262               result = get_msp430x_section_type_name (sh_type);
4263               break;
4264             case EM_NFP:
4265               result = get_nfp_section_type_name (sh_type);
4266               break;
4267             case EM_V800:
4268             case EM_V850:
4269             case EM_CYGNUS_V850:
4270               result = get_v850_section_type_name (sh_type);
4271               break;
4272             default:
4273               result = NULL;
4274               break;
4275             }
4276
4277           if (result != NULL)
4278             return result;
4279
4280           sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4281         }
4282       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4283         {
4284           switch (filedata->file_header.e_machine)
4285             {
4286             case EM_IA_64:
4287               result = get_ia64_section_type_name (filedata, sh_type);
4288               break;
4289             default:
4290               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4291                 result = get_solaris_section_type (sh_type);
4292               else
4293                 {
4294                   switch (sh_type)
4295                     {
4296                     case SHT_GNU_INCREMENTAL_INPUTS: result = "GNU_INCREMENTAL_INPUTS"; break;
4297                     case SHT_GNU_ATTRIBUTES: result = "GNU_ATTRIBUTES"; break;
4298                     case SHT_GNU_HASH: result = "GNU_HASH"; break;
4299                     case SHT_GNU_LIBLIST: result = "GNU_LIBLIST"; break;
4300                     default:
4301                       result = NULL;
4302                       break;
4303                     }
4304                 }
4305               break;
4306             }
4307
4308           if (result != NULL)
4309             return result;
4310
4311           sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4312         }
4313       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4314         {
4315           switch (filedata->file_header.e_machine)
4316             {
4317             case EM_V800:
4318             case EM_V850:
4319             case EM_CYGNUS_V850:
4320               result = get_v850_section_type_name (sh_type);
4321               break;
4322             default:
4323               result = NULL;
4324               break;
4325             }
4326
4327           if (result != NULL)
4328             return result;
4329
4330           sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4331         }
4332       else
4333         /* This message is probably going to be displayed in a 15
4334            character wide field, so put the hex value first.  */
4335         snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4336
4337       return buff;
4338     }
4339 }
4340
4341 #define OPTION_DEBUG_DUMP       512
4342 #define OPTION_DYN_SYMS         513
4343 #define OPTION_DWARF_DEPTH      514
4344 #define OPTION_DWARF_START      515
4345 #define OPTION_DWARF_CHECK      516
4346
4347 static struct option options[] =
4348 {
4349   {"all",              no_argument, 0, 'a'},
4350   {"file-header",      no_argument, 0, 'h'},
4351   {"program-headers",  no_argument, 0, 'l'},
4352   {"headers",          no_argument, 0, 'e'},
4353   {"histogram",        no_argument, 0, 'I'},
4354   {"segments",         no_argument, 0, 'l'},
4355   {"sections",         no_argument, 0, 'S'},
4356   {"section-headers",  no_argument, 0, 'S'},
4357   {"section-groups",   no_argument, 0, 'g'},
4358   {"section-details",  no_argument, 0, 't'},
4359   {"full-section-name",no_argument, 0, 'N'},
4360   {"symbols",          no_argument, 0, 's'},
4361   {"syms",             no_argument, 0, 's'},
4362   {"dyn-syms",         no_argument, 0, OPTION_DYN_SYMS},
4363   {"relocs",           no_argument, 0, 'r'},
4364   {"notes",            no_argument, 0, 'n'},
4365   {"dynamic",          no_argument, 0, 'd'},
4366   {"arch-specific",    no_argument, 0, 'A'},
4367   {"version-info",     no_argument, 0, 'V'},
4368   {"use-dynamic",      no_argument, 0, 'D'},
4369   {"unwind",           no_argument, 0, 'u'},
4370   {"archive-index",    no_argument, 0, 'c'},
4371   {"hex-dump",         required_argument, 0, 'x'},
4372   {"relocated-dump",   required_argument, 0, 'R'},
4373   {"string-dump",      required_argument, 0, 'p'},
4374   {"decompress",       no_argument, 0, 'z'},
4375 #ifdef SUPPORT_DISASSEMBLY
4376   {"instruction-dump", required_argument, 0, 'i'},
4377 #endif
4378   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
4379
4380   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
4381   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
4382   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
4383
4384   {"version",          no_argument, 0, 'v'},
4385   {"wide",             no_argument, 0, 'W'},
4386   {"help",             no_argument, 0, 'H'},
4387   {0,                  no_argument, 0, 0}
4388 };
4389
4390 static void
4391 usage (FILE * stream)
4392 {
4393   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4394   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4395   fprintf (stream, _(" Options are:\n\
4396   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4397   -h --file-header       Display the ELF file header\n\
4398   -l --program-headers   Display the program headers\n\
4399      --segments          An alias for --program-headers\n\
4400   -S --section-headers   Display the sections' header\n\
4401      --sections          An alias for --section-headers\n\
4402   -g --section-groups    Display the section groups\n\
4403   -t --section-details   Display the section details\n\
4404   -e --headers           Equivalent to: -h -l -S\n\
4405   -s --syms              Display the symbol table\n\
4406      --symbols           An alias for --syms\n\
4407   --dyn-syms             Display the dynamic symbol table\n\
4408   -n --notes             Display the core notes (if present)\n\
4409   -r --relocs            Display the relocations (if present)\n\
4410   -u --unwind            Display the unwind info (if present)\n\
4411   -d --dynamic           Display the dynamic section (if present)\n\
4412   -V --version-info      Display the version sections (if present)\n\
4413   -A --arch-specific     Display architecture specific information (if any)\n\
4414   -c --archive-index     Display the symbol/file index in an archive\n\
4415   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
4416   -x --hex-dump=<number|name>\n\
4417                          Dump the contents of section <number|name> as bytes\n\
4418   -p --string-dump=<number|name>\n\
4419                          Dump the contents of section <number|name> as strings\n\
4420   -R --relocated-dump=<number|name>\n\
4421                          Dump the contents of section <number|name> as relocated bytes\n\
4422   -z --decompress        Decompress section before dumping it\n\
4423   -w[lLiaprmfFsoRtUuTgAckK] or\n\
4424   --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4425                =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4426                =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4427                =addr,=cu_index,=links,=follow-links]\n\
4428                          Display the contents of DWARF debug sections\n"));
4429   fprintf (stream, _("\
4430   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
4431   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
4432                          or deeper\n"));
4433 #ifdef SUPPORT_DISASSEMBLY
4434   fprintf (stream, _("\
4435   -i --instruction-dump=<number|name>\n\
4436                          Disassemble the contents of section <number|name>\n"));
4437 #endif
4438   fprintf (stream, _("\
4439   -I --histogram         Display histogram of bucket list lengths\n\
4440   -W --wide              Allow output width to exceed 80 characters\n\
4441   @<file>                Read options from <file>\n\
4442   -H --help              Display this information\n\
4443   -v --version           Display the version number of readelf\n"));
4444
4445   if (REPORT_BUGS_TO[0] && stream == stdout)
4446     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4447
4448   exit (stream == stdout ? 0 : 1);
4449 }
4450
4451 /* Record the fact that the user wants the contents of section number
4452    SECTION to be displayed using the method(s) encoded as flags bits
4453    in TYPE.  Note, TYPE can be zero if we are creating the array for
4454    the first time.  */
4455
4456 static void
4457 request_dump_bynumber (Filedata * filedata, unsigned int section, dump_type type)
4458 {
4459   if (section >= filedata->num_dump_sects)
4460     {
4461       dump_type * new_dump_sects;
4462
4463       new_dump_sects = (dump_type *) calloc (section + 1,
4464                                              sizeof (* new_dump_sects));
4465
4466       if (new_dump_sects == NULL)
4467         error (_("Out of memory allocating dump request table.\n"));
4468       else
4469         {
4470           if (filedata->dump_sects)
4471             {
4472               /* Copy current flag settings.  */
4473               memcpy (new_dump_sects, filedata->dump_sects,
4474                       filedata->num_dump_sects * sizeof (* new_dump_sects));
4475
4476               free (filedata->dump_sects);
4477             }
4478
4479           filedata->dump_sects = new_dump_sects;
4480           filedata->num_dump_sects = section + 1;
4481         }
4482     }
4483
4484   if (filedata->dump_sects)
4485     filedata->dump_sects[section] |= type;
4486 }
4487
4488 /* Request a dump by section name.  */
4489
4490 static void
4491 request_dump_byname (const char * section, dump_type type)
4492 {
4493   struct dump_list_entry * new_request;
4494
4495   new_request = (struct dump_list_entry *)
4496       malloc (sizeof (struct dump_list_entry));
4497   if (!new_request)
4498     error (_("Out of memory allocating dump request table.\n"));
4499
4500   new_request->name = strdup (section);
4501   if (!new_request->name)
4502     error (_("Out of memory allocating dump request table.\n"));
4503
4504   new_request->type = type;
4505
4506   new_request->next = dump_sects_byname;
4507   dump_sects_byname = new_request;
4508 }
4509
4510 static inline void
4511 request_dump (Filedata * filedata, dump_type type)
4512 {
4513   int section;
4514   char * cp;
4515
4516   do_dump++;
4517   section = strtoul (optarg, & cp, 0);
4518
4519   if (! *cp && section >= 0)
4520     request_dump_bynumber (filedata, section, type);
4521   else
4522     request_dump_byname (optarg, type);
4523 }
4524
4525 static void
4526 parse_args (Filedata * filedata, int argc, char ** argv)
4527 {
4528   int c;
4529
4530   if (argc < 2)
4531     usage (stderr);
4532
4533   while ((c = getopt_long
4534           (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4535     {
4536       switch (c)
4537         {
4538         case 0:
4539           /* Long options.  */
4540           break;
4541         case 'H':
4542           usage (stdout);
4543           break;
4544
4545         case 'a':
4546           do_syms = TRUE;
4547           do_reloc = TRUE;
4548           do_unwind = TRUE;
4549           do_dynamic = TRUE;
4550           do_header = TRUE;
4551           do_sections = TRUE;
4552           do_section_groups = TRUE;
4553           do_segments = TRUE;
4554           do_version = TRUE;
4555           do_histogram = TRUE;
4556           do_arch = TRUE;
4557           do_notes = TRUE;
4558           break;
4559         case 'g':
4560           do_section_groups = TRUE;
4561           break;
4562         case 't':
4563         case 'N':
4564           do_sections = TRUE;
4565           do_section_details = TRUE;
4566           break;
4567         case 'e':
4568           do_header = TRUE;
4569           do_sections = TRUE;
4570           do_segments = TRUE;
4571           break;
4572         case 'A':
4573           do_arch = TRUE;
4574           break;
4575         case 'D':
4576           do_using_dynamic = TRUE;
4577           break;
4578         case 'r':
4579           do_reloc = TRUE;
4580           break;
4581         case 'u':
4582           do_unwind = TRUE;
4583           break;
4584         case 'h':
4585           do_header = TRUE;
4586           break;
4587         case 'l':
4588           do_segments = TRUE;
4589           break;
4590         case 's':
4591           do_syms = TRUE;
4592           break;
4593         case 'S':
4594           do_sections = TRUE;
4595           break;
4596         case 'd':
4597           do_dynamic = TRUE;
4598           break;
4599         case 'I':
4600           do_histogram = TRUE;
4601           break;
4602         case 'n':
4603           do_notes = TRUE;
4604           break;
4605         case 'c':
4606           do_archive_index = TRUE;
4607           break;
4608         case 'x':
4609           request_dump (filedata, HEX_DUMP);
4610           break;
4611         case 'p':
4612           request_dump (filedata, STRING_DUMP);
4613           break;
4614         case 'R':
4615           request_dump (filedata, RELOC_DUMP);
4616           break;
4617         case 'z':
4618           decompress_dumps = TRUE;
4619           break;
4620         case 'w':
4621           do_dump = TRUE;
4622           if (optarg == 0)
4623             {
4624               do_debugging = TRUE;
4625               dwarf_select_sections_all ();
4626             }
4627           else
4628             {
4629               do_debugging = FALSE;
4630               dwarf_select_sections_by_letters (optarg);
4631             }
4632           break;
4633         case OPTION_DEBUG_DUMP:
4634           do_dump = TRUE;
4635           if (optarg == 0)
4636             do_debugging = TRUE;
4637           else
4638             {
4639               do_debugging = FALSE;
4640               dwarf_select_sections_by_names (optarg);
4641             }
4642           break;
4643         case OPTION_DWARF_DEPTH:
4644           {
4645             char *cp;
4646
4647             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4648           }
4649           break;
4650         case OPTION_DWARF_START:
4651           {
4652             char *cp;
4653
4654             dwarf_start_die = strtoul (optarg, & cp, 0);
4655           }
4656           break;
4657         case OPTION_DWARF_CHECK:
4658           dwarf_check = TRUE;
4659           break;
4660         case OPTION_DYN_SYMS:
4661           do_dyn_syms = TRUE;
4662           break;
4663 #ifdef SUPPORT_DISASSEMBLY
4664         case 'i':
4665           request_dump (filedata, DISASS_DUMP);
4666           break;
4667 #endif
4668         case 'v':
4669           print_version (program_name);
4670           break;
4671         case 'V':
4672           do_version = TRUE;
4673           break;
4674         case 'W':
4675           do_wide = TRUE;
4676           break;
4677         default:
4678           /* xgettext:c-format */
4679           error (_("Invalid option '-%c'\n"), c);
4680           /* Fall through.  */
4681         case '?':
4682           usage (stderr);
4683         }
4684     }
4685
4686   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4687       && !do_segments && !do_header && !do_dump && !do_version
4688       && !do_histogram && !do_debugging && !do_arch && !do_notes
4689       && !do_section_groups && !do_archive_index
4690       && !do_dyn_syms)
4691     usage (stderr);
4692 }
4693
4694 static const char *
4695 get_elf_class (unsigned int elf_class)
4696 {
4697   static char buff[32];
4698
4699   switch (elf_class)
4700     {
4701     case ELFCLASSNONE: return _("none");
4702     case ELFCLASS32:   return "ELF32";
4703     case ELFCLASS64:   return "ELF64";
4704     default:
4705       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4706       return buff;
4707     }
4708 }
4709
4710 static const char *
4711 get_data_encoding (unsigned int encoding)
4712 {
4713   static char buff[32];
4714
4715   switch (encoding)
4716     {
4717     case ELFDATANONE: return _("none");
4718     case ELFDATA2LSB: return _("2's complement, little endian");
4719     case ELFDATA2MSB: return _("2's complement, big endian");
4720     default:
4721       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4722       return buff;
4723     }
4724 }
4725
4726 /* Decode the data held in 'filedata->file_header'.  */
4727
4728 static bfd_boolean
4729 process_file_header (Filedata * filedata)
4730 {
4731   Elf_Internal_Ehdr * header = & filedata->file_header;
4732
4733   if (   header->e_ident[EI_MAG0] != ELFMAG0
4734       || header->e_ident[EI_MAG1] != ELFMAG1
4735       || header->e_ident[EI_MAG2] != ELFMAG2
4736       || header->e_ident[EI_MAG3] != ELFMAG3)
4737     {
4738       error
4739         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4740       return FALSE;
4741     }
4742
4743   init_dwarf_regnames (header->e_machine);
4744
4745   if (do_header)
4746     {
4747       unsigned i;
4748
4749       printf (_("ELF Header:\n"));
4750       printf (_("  Magic:   "));
4751       for (i = 0; i < EI_NIDENT; i++)
4752         printf ("%2.2x ", header->e_ident[i]);
4753       printf ("\n");
4754       printf (_("  Class:                             %s\n"),
4755               get_elf_class (header->e_ident[EI_CLASS]));
4756       printf (_("  Data:                              %s\n"),
4757               get_data_encoding (header->e_ident[EI_DATA]));
4758       printf (_("  Version:                           %d %s\n"),
4759               header->e_ident[EI_VERSION],
4760               (header->e_ident[EI_VERSION] == EV_CURRENT
4761                ? "(current)"
4762                : (header->e_ident[EI_VERSION] != EV_NONE
4763                   ? _("<unknown: %lx>")
4764                   : "")));
4765       printf (_("  OS/ABI:                            %s\n"),
4766               get_osabi_name (filedata, header->e_ident[EI_OSABI]));
4767       printf (_("  ABI Version:                       %d\n"),
4768               header->e_ident[EI_ABIVERSION]);
4769       printf (_("  Type:                              %s\n"),
4770               get_file_type (header->e_type));
4771       printf (_("  Machine:                           %s\n"),
4772               get_machine_name (header->e_machine));
4773       printf (_("  Version:                           0x%lx\n"),
4774               (unsigned long) header->e_version);
4775
4776       printf (_("  Entry point address:               "));
4777       print_vma ((bfd_vma) header->e_entry, PREFIX_HEX);
4778       printf (_("\n  Start of program headers:          "));
4779       print_vma ((bfd_vma) header->e_phoff, DEC);
4780       printf (_(" (bytes into file)\n  Start of section headers:          "));
4781       print_vma ((bfd_vma) header->e_shoff, DEC);
4782       printf (_(" (bytes into file)\n"));
4783
4784       printf (_("  Flags:                             0x%lx%s\n"),
4785               (unsigned long) header->e_flags,
4786               get_machine_flags (filedata, header->e_flags, header->e_machine));
4787       printf (_("  Size of this header:               %ld (bytes)\n"),
4788               (long) header->e_ehsize);
4789       printf (_("  Size of program headers:           %ld (bytes)\n"),
4790               (long) header->e_phentsize);
4791       printf (_("  Number of program headers:         %ld"),
4792               (long) header->e_phnum);
4793       if (filedata->section_headers != NULL
4794           && header->e_phnum == PN_XNUM
4795           && filedata->section_headers[0].sh_info != 0)
4796         printf (" (%ld)", (long) filedata->section_headers[0].sh_info);
4797       putc ('\n', stdout);
4798       printf (_("  Size of section headers:           %ld (bytes)\n"),
4799               (long) header->e_shentsize);
4800       printf (_("  Number of section headers:         %ld"),
4801               (long) header->e_shnum);
4802       if (filedata->section_headers != NULL && header->e_shnum == SHN_UNDEF)
4803         printf (" (%ld)", (long) filedata->section_headers[0].sh_size);
4804       putc ('\n', stdout);
4805       printf (_("  Section header string table index: %ld"),
4806               (long) header->e_shstrndx);
4807       if (filedata->section_headers != NULL
4808           && header->e_shstrndx == (SHN_XINDEX & 0xffff))
4809         printf (" (%u)", filedata->section_headers[0].sh_link);
4810       else if (header->e_shstrndx != SHN_UNDEF
4811                && header->e_shstrndx >= header->e_shnum)
4812         printf (_(" <corrupt: out of range>"));
4813       putc ('\n', stdout);
4814     }
4815
4816   if (filedata->section_headers != NULL)
4817     {
4818       if (header->e_phnum == PN_XNUM
4819           && filedata->section_headers[0].sh_info != 0)
4820         header->e_phnum = filedata->section_headers[0].sh_info;
4821       if (header->e_shnum == SHN_UNDEF)
4822         header->e_shnum = filedata->section_headers[0].sh_size;
4823       if (header->e_shstrndx == (SHN_XINDEX & 0xffff))
4824         header->e_shstrndx = filedata->section_headers[0].sh_link;
4825       if (header->e_shstrndx >= header->e_shnum)
4826         header->e_shstrndx = SHN_UNDEF;
4827       free (filedata->section_headers);
4828       filedata->section_headers = NULL;
4829     }
4830
4831   return TRUE;
4832 }
4833
4834 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4835    Returns TRUE upon success, FALSE otherwise.  Loads 32-bit headers.  */
4836
4837 static bfd_boolean
4838 get_32bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4839 {
4840   Elf32_External_Phdr * phdrs;
4841   Elf32_External_Phdr * external;
4842   Elf_Internal_Phdr *   internal;
4843   unsigned int i;
4844   unsigned int size = filedata->file_header.e_phentsize;
4845   unsigned int num  = filedata->file_header.e_phnum;
4846
4847   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4848   if (size == 0 || num == 0)
4849     return FALSE;
4850   if (size < sizeof * phdrs)
4851     {
4852       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4853       return FALSE;
4854     }
4855   if (size > sizeof * phdrs)
4856     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4857
4858   phdrs = (Elf32_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4859                                             size, num, _("program headers"));
4860   if (phdrs == NULL)
4861     return FALSE;
4862
4863   for (i = 0, internal = pheaders, external = phdrs;
4864        i < filedata->file_header.e_phnum;
4865        i++, internal++, external++)
4866     {
4867       internal->p_type   = BYTE_GET (external->p_type);
4868       internal->p_offset = BYTE_GET (external->p_offset);
4869       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4870       internal->p_paddr  = BYTE_GET (external->p_paddr);
4871       internal->p_filesz = BYTE_GET (external->p_filesz);
4872       internal->p_memsz  = BYTE_GET (external->p_memsz);
4873       internal->p_flags  = BYTE_GET (external->p_flags);
4874       internal->p_align  = BYTE_GET (external->p_align);
4875     }
4876
4877   free (phdrs);
4878   return TRUE;
4879 }
4880
4881 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4882    Returns TRUE upon success, FALSE otherwise.  Loads 64-bit headers.  */
4883
4884 static bfd_boolean
4885 get_64bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4886 {
4887   Elf64_External_Phdr * phdrs;
4888   Elf64_External_Phdr * external;
4889   Elf_Internal_Phdr *   internal;
4890   unsigned int i;
4891   unsigned int size = filedata->file_header.e_phentsize;
4892   unsigned int num  = filedata->file_header.e_phnum;
4893
4894   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4895   if (size == 0 || num == 0)
4896     return FALSE;
4897   if (size < sizeof * phdrs)
4898     {
4899       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4900       return FALSE;
4901     }
4902   if (size > sizeof * phdrs)
4903     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4904
4905   phdrs = (Elf64_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4906                                             size, num, _("program headers"));
4907   if (!phdrs)
4908     return FALSE;
4909
4910   for (i = 0, internal = pheaders, external = phdrs;
4911        i < filedata->file_header.e_phnum;
4912        i++, internal++, external++)
4913     {
4914       internal->p_type   = BYTE_GET (external->p_type);
4915       internal->p_flags  = BYTE_GET (external->p_flags);
4916       internal->p_offset = BYTE_GET (external->p_offset);
4917       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4918       internal->p_paddr  = BYTE_GET (external->p_paddr);
4919       internal->p_filesz = BYTE_GET (external->p_filesz);
4920       internal->p_memsz  = BYTE_GET (external->p_memsz);
4921       internal->p_align  = BYTE_GET (external->p_align);
4922     }
4923
4924   free (phdrs);
4925   return TRUE;
4926 }
4927
4928 /* Returns TRUE if the program headers were read into `program_headers'.  */
4929
4930 static bfd_boolean
4931 get_program_headers (Filedata * filedata)
4932 {
4933   Elf_Internal_Phdr * phdrs;
4934
4935   /* Check cache of prior read.  */
4936   if (filedata->program_headers != NULL)
4937     return TRUE;
4938
4939   /* Be kind to memory checkers by looking for
4940      e_phnum values which we know must be invalid.  */
4941   if (filedata->file_header.e_phnum
4942       * (is_32bit_elf ? sizeof (Elf32_External_Phdr) : sizeof (Elf64_External_Phdr))
4943       >= filedata->file_size)
4944     {
4945       error (_("Too many program headers - %#x - the file is not that big\n"),
4946              filedata->file_header.e_phnum);
4947       return FALSE;
4948     }
4949
4950   phdrs = (Elf_Internal_Phdr *) cmalloc (filedata->file_header.e_phnum,
4951                                          sizeof (Elf_Internal_Phdr));
4952   if (phdrs == NULL)
4953     {
4954       error (_("Out of memory reading %u program headers\n"),
4955              filedata->file_header.e_phnum);
4956       return FALSE;
4957     }
4958
4959   if (is_32bit_elf
4960       ? get_32bit_program_headers (filedata, phdrs)
4961       : get_64bit_program_headers (filedata, phdrs))
4962     {
4963       filedata->program_headers = phdrs;
4964       return TRUE;
4965     }
4966
4967   free (phdrs);
4968   return FALSE;
4969 }
4970
4971 /* Returns TRUE if the program headers were loaded.  */
4972
4973 static bfd_boolean
4974 process_program_headers (Filedata * filedata)
4975 {
4976   Elf_Internal_Phdr * segment;
4977   unsigned int i;
4978   Elf_Internal_Phdr * previous_load = NULL;
4979
4980   if (filedata->file_header.e_phnum == 0)
4981     {
4982       /* PR binutils/12467.  */
4983       if (filedata->file_header.e_phoff != 0)
4984         {
4985           warn (_("possibly corrupt ELF header - it has a non-zero program"
4986                   " header offset, but no program headers\n"));
4987           return FALSE;
4988         }
4989       else if (do_segments)
4990         printf (_("\nThere are no program headers in this file.\n"));
4991       return TRUE;
4992     }
4993
4994   if (do_segments && !do_header)
4995     {
4996       printf (_("\nElf file type is %s\n"), get_file_type (filedata->file_header.e_type));
4997       printf (_("Entry point 0x%s\n"), bfd_vmatoa ("x", filedata->file_header.e_entry));
4998       printf (ngettext ("There is %d program header, starting at offset %s\n",
4999                         "There are %d program headers, starting at offset %s\n",
5000                         filedata->file_header.e_phnum),
5001               filedata->file_header.e_phnum,
5002               bfd_vmatoa ("u", filedata->file_header.e_phoff));
5003     }
5004
5005   if (! get_program_headers (filedata))
5006     return TRUE;
5007
5008   if (do_segments)
5009     {
5010       if (filedata->file_header.e_phnum > 1)
5011         printf (_("\nProgram Headers:\n"));
5012       else
5013         printf (_("\nProgram Headers:\n"));
5014
5015       if (is_32bit_elf)
5016         printf
5017           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
5018       else if (do_wide)
5019         printf
5020           (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
5021       else
5022         {
5023           printf
5024             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
5025           printf
5026             (_("                 FileSiz            MemSiz              Flags  Align\n"));
5027         }
5028     }
5029
5030   dynamic_addr = 0;
5031   dynamic_size = 0;
5032
5033   for (i = 0, segment = filedata->program_headers;
5034        i < filedata->file_header.e_phnum;
5035        i++, segment++)
5036     {
5037       if (do_segments)
5038         {
5039           printf ("  %-14.14s ", get_segment_type (filedata, segment->p_type));
5040
5041           if (is_32bit_elf)
5042             {
5043               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5044               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
5045               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
5046               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
5047               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
5048               printf ("%c%c%c ",
5049                       (segment->p_flags & PF_R ? 'R' : ' '),
5050                       (segment->p_flags & PF_W ? 'W' : ' '),
5051                       (segment->p_flags & PF_X ? 'E' : ' '));
5052               printf ("%#lx", (unsigned long) segment->p_align);
5053             }
5054           else if (do_wide)
5055             {
5056               if ((unsigned long) segment->p_offset == segment->p_offset)
5057                 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5058               else
5059                 {
5060                   print_vma (segment->p_offset, FULL_HEX);
5061                   putchar (' ');
5062                 }
5063
5064               print_vma (segment->p_vaddr, FULL_HEX);
5065               putchar (' ');
5066               print_vma (segment->p_paddr, FULL_HEX);
5067               putchar (' ');
5068
5069               if ((unsigned long) segment->p_filesz == segment->p_filesz)
5070                 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
5071               else
5072                 {
5073                   print_vma (segment->p_filesz, FULL_HEX);
5074                   putchar (' ');
5075                 }
5076
5077               if ((unsigned long) segment->p_memsz == segment->p_memsz)
5078                 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
5079               else
5080                 {
5081                   print_vma (segment->p_memsz, FULL_HEX);
5082                 }
5083
5084               printf (" %c%c%c ",
5085                       (segment->p_flags & PF_R ? 'R' : ' '),
5086                       (segment->p_flags & PF_W ? 'W' : ' '),
5087                       (segment->p_flags & PF_X ? 'E' : ' '));
5088
5089               if ((unsigned long) segment->p_align == segment->p_align)
5090                 printf ("%#lx", (unsigned long) segment->p_align);
5091               else
5092                 {
5093                   print_vma (segment->p_align, PREFIX_HEX);
5094                 }
5095             }
5096           else
5097             {
5098               print_vma (segment->p_offset, FULL_HEX);
5099               putchar (' ');
5100               print_vma (segment->p_vaddr, FULL_HEX);
5101               putchar (' ');
5102               print_vma (segment->p_paddr, FULL_HEX);
5103               printf ("\n                 ");
5104               print_vma (segment->p_filesz, FULL_HEX);
5105               putchar (' ');
5106               print_vma (segment->p_memsz, FULL_HEX);
5107               printf ("  %c%c%c    ",
5108                       (segment->p_flags & PF_R ? 'R' : ' '),
5109                       (segment->p_flags & PF_W ? 'W' : ' '),
5110                       (segment->p_flags & PF_X ? 'E' : ' '));
5111               print_vma (segment->p_align, PREFIX_HEX);
5112             }
5113
5114           putc ('\n', stdout);
5115         }
5116
5117       switch (segment->p_type)
5118         {
5119         case PT_LOAD:
5120 #if 0 /* Do not warn about out of order PT_LOAD segments.  Although officially
5121          required by the ELF standard, several programs, including the Linux
5122          kernel, make use of non-ordered segments.  */
5123           if (previous_load
5124               && previous_load->p_vaddr > segment->p_vaddr)
5125             error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
5126 #endif
5127           if (segment->p_memsz < segment->p_filesz)
5128             error (_("the segment's file size is larger than its memory size\n"));
5129           previous_load = segment;
5130           break;
5131
5132         case PT_PHDR:
5133           /* PR 20815 - Verify that the program header is loaded into memory.  */
5134           if (i > 0 && previous_load != NULL)
5135             error (_("the PHDR segment must occur before any LOAD segment\n"));
5136           if (filedata->file_header.e_machine != EM_PARISC)
5137             {
5138               unsigned int j;
5139
5140               for (j = 1; j < filedata->file_header.e_phnum; j++)
5141                 if (filedata->program_headers[j].p_vaddr <= segment->p_vaddr
5142                     && (filedata->program_headers[j].p_vaddr
5143                         + filedata->program_headers[j].p_memsz)
5144                     >= (segment->p_vaddr + segment->p_filesz))
5145                   break;
5146               if (j == filedata->file_header.e_phnum)
5147                 error (_("the PHDR segment is not covered by a LOAD segment\n"));
5148             }
5149           break;
5150
5151         case PT_DYNAMIC:
5152           if (dynamic_addr)
5153             error (_("more than one dynamic segment\n"));
5154
5155           /* By default, assume that the .dynamic section is the first
5156              section in the DYNAMIC segment.  */
5157           dynamic_addr = segment->p_offset;
5158           dynamic_size = segment->p_filesz;
5159
5160           /* Try to locate the .dynamic section. If there is
5161              a section header table, we can easily locate it.  */
5162           if (filedata->section_headers != NULL)
5163             {
5164               Elf_Internal_Shdr * sec;
5165
5166               sec = find_section (filedata, ".dynamic");
5167               if (sec == NULL || sec->sh_size == 0)
5168                 {
5169                   /* A corresponding .dynamic section is expected, but on
5170                      IA-64/OpenVMS it is OK for it to be missing.  */
5171                   if (!is_ia64_vms (filedata))
5172                     error (_("no .dynamic section in the dynamic segment\n"));
5173                   break;
5174                 }
5175
5176               if (sec->sh_type == SHT_NOBITS)
5177                 {
5178                   dynamic_size = 0;
5179                   break;
5180                 }
5181
5182               dynamic_addr = sec->sh_offset;
5183               dynamic_size = sec->sh_size;
5184
5185               if (dynamic_addr < segment->p_offset
5186                   || dynamic_addr > segment->p_offset + segment->p_filesz)
5187                 warn (_("the .dynamic section is not contained"
5188                         " within the dynamic segment\n"));
5189               else if (dynamic_addr > segment->p_offset)
5190                 warn (_("the .dynamic section is not the first section"
5191                         " in the dynamic segment.\n"));
5192             }
5193
5194           /* PR binutils/17512: Avoid corrupt dynamic section info in the
5195              segment.  Check this after matching against the section headers
5196              so we don't warn on debuginfo file (which have NOBITS .dynamic
5197              sections).  */
5198           if (dynamic_addr + dynamic_size >= filedata->file_size)
5199             {
5200               error (_("the dynamic segment offset + size exceeds the size of the file\n"));
5201               dynamic_addr = dynamic_size = 0;
5202             }
5203           break;
5204
5205         case PT_INTERP:
5206           if (fseek (filedata->handle, archive_file_offset + (long) segment->p_offset,
5207                      SEEK_SET))
5208             error (_("Unable to find program interpreter name\n"));
5209           else
5210             {
5211               char fmt [32];
5212               int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
5213
5214               if (ret >= (int) sizeof (fmt) || ret < 0)
5215                 error (_("Internal error: failed to create format string to display program interpreter\n"));
5216
5217               program_interpreter[0] = 0;
5218               if (fscanf (filedata->handle, fmt, program_interpreter) <= 0)
5219                 error (_("Unable to read program interpreter name\n"));
5220
5221               if (do_segments)
5222                 printf (_("      [Requesting program interpreter: %s]\n"),
5223                     program_interpreter);
5224             }
5225           break;
5226         }
5227     }
5228
5229   if (do_segments
5230       && filedata->section_headers != NULL
5231       && filedata->string_table != NULL)
5232     {
5233       printf (_("\n Section to Segment mapping:\n"));
5234       printf (_("  Segment Sections...\n"));
5235
5236       for (i = 0; i < filedata->file_header.e_phnum; i++)
5237         {
5238           unsigned int j;
5239           Elf_Internal_Shdr * section;
5240
5241           segment = filedata->program_headers + i;
5242           section = filedata->section_headers + 1;
5243
5244           printf ("   %2.2d     ", i);
5245
5246           for (j = 1; j < filedata->file_header.e_shnum; j++, section++)
5247             {
5248               if (!ELF_TBSS_SPECIAL (section, segment)
5249                   && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
5250                 printf ("%s ", printable_section_name (filedata, section));
5251             }
5252
5253           putc ('\n',stdout);
5254         }
5255     }
5256
5257   return TRUE;
5258 }
5259
5260
5261 /* Find the file offset corresponding to VMA by using the program headers.  */
5262
5263 static long
5264 offset_from_vma (Filedata * filedata, bfd_vma vma, bfd_size_type size)
5265 {
5266   Elf_Internal_Phdr * seg;
5267
5268   if (! get_program_headers (filedata))
5269     {
5270       warn (_("Cannot interpret virtual addresses without program headers.\n"));
5271       return (long) vma;
5272     }
5273
5274   for (seg = filedata->program_headers;
5275        seg < filedata->program_headers + filedata->file_header.e_phnum;
5276        ++seg)
5277     {
5278       if (seg->p_type != PT_LOAD)
5279         continue;
5280
5281       if (vma >= (seg->p_vaddr & -seg->p_align)
5282           && vma + size <= seg->p_vaddr + seg->p_filesz)
5283         return vma - seg->p_vaddr + seg->p_offset;
5284     }
5285
5286   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
5287         (unsigned long) vma);
5288   return (long) vma;
5289 }
5290
5291
5292 /* Allocate memory and load the sections headers into FILEDATA->filedata->section_headers.
5293    If PROBE is true, this is just a probe and we do not generate any error
5294    messages if the load fails.  */
5295
5296 static bfd_boolean
5297 get_32bit_section_headers (Filedata * filedata, bfd_boolean probe)
5298 {
5299   Elf32_External_Shdr * shdrs;
5300   Elf_Internal_Shdr *   internal;
5301   unsigned int          i;
5302   unsigned int          size = filedata->file_header.e_shentsize;
5303   unsigned int          num = probe ? 1 : filedata->file_header.e_shnum;
5304
5305   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5306   if (size == 0 || num == 0)
5307     return FALSE;
5308   if (size < sizeof * shdrs)
5309     {
5310       if (! probe)
5311         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5312       return FALSE;
5313     }
5314   if (!probe && size > sizeof * shdrs)
5315     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5316
5317   shdrs = (Elf32_External_Shdr *) get_data (NULL, filedata, filedata->file_header.e_shoff,
5318                                             size, num,
5319                                             probe ? NULL : _("section headers"));
5320   if (shdrs == NULL)
5321     return FALSE;
5322
5323   free (filedata->section_headers);
5324   filedata->section_headers = (Elf_Internal_Shdr *)
5325     cmalloc (num, sizeof (Elf_Internal_Shdr));
5326   if (filedata->section_headers == NULL)
5327     {
5328       if (!probe)
5329         error (_("Out of memory reading %u section headers\n"), num);
5330       return FALSE;
5331     }
5332
5333   for (i = 0, internal = filedata->section_headers;
5334        i < num;
5335        i++, internal++)
5336     {
5337       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5338       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5339       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5340       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5341       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5342       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5343       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5344       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5345       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5346       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5347       if (!probe && internal->sh_link > num)
5348         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5349       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5350         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5351     }
5352
5353   free (shdrs);
5354   return TRUE;
5355 }
5356
5357 /* Like get_32bit_section_headers, except that it fetches 64-bit headers.  */
5358
5359 static bfd_boolean
5360 get_64bit_section_headers (Filedata * filedata, bfd_boolean probe)
5361 {
5362   Elf64_External_Shdr *  shdrs;
5363   Elf_Internal_Shdr *    internal;
5364   unsigned int           i;
5365   unsigned int           size = filedata->file_header.e_shentsize;
5366   unsigned int           num = probe ? 1 : filedata->file_header.e_shnum;
5367
5368   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5369   if (size == 0 || num == 0)
5370     return FALSE;
5371
5372   if (size < sizeof * shdrs)
5373     {
5374       if (! probe)
5375         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5376       return FALSE;
5377     }
5378
5379   if (! probe && size > sizeof * shdrs)
5380     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5381
5382   shdrs = (Elf64_External_Shdr *) get_data (NULL, filedata,
5383                                             filedata->file_header.e_shoff,
5384                                             size, num,
5385                                             probe ? NULL : _("section headers"));
5386   if (shdrs == NULL)
5387     return FALSE;
5388
5389   free (filedata->section_headers);
5390   filedata->section_headers = (Elf_Internal_Shdr *)
5391     cmalloc (num, sizeof (Elf_Internal_Shdr));
5392   if (filedata->section_headers == NULL)
5393     {
5394       if (! probe)
5395         error (_("Out of memory reading %u section headers\n"), num);
5396       return FALSE;
5397     }
5398
5399   for (i = 0, internal = filedata->section_headers;
5400        i < num;
5401        i++, internal++)
5402     {
5403       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5404       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5405       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5406       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5407       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5408       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5409       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5410       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5411       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5412       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5413       if (!probe && internal->sh_link > num)
5414         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5415       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5416         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5417     }
5418
5419   free (shdrs);
5420   return TRUE;
5421 }
5422
5423 static Elf_Internal_Sym *
5424 get_32bit_elf_symbols (Filedata *           filedata,
5425                        Elf_Internal_Shdr *  section,
5426                        unsigned long *      num_syms_return)
5427 {
5428   unsigned long number = 0;
5429   Elf32_External_Sym * esyms = NULL;
5430   Elf_External_Sym_Shndx * shndx = NULL;
5431   Elf_Internal_Sym * isyms = NULL;
5432   Elf_Internal_Sym * psym;
5433   unsigned int j;
5434
5435   if (section->sh_size == 0)
5436     {
5437       if (num_syms_return != NULL)
5438         * num_syms_return = 0;
5439       return NULL;
5440     }
5441
5442   /* Run some sanity checks first.  */
5443   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5444     {
5445       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5446              printable_section_name (filedata, section),
5447              (unsigned long) section->sh_entsize);
5448       goto exit_point;
5449     }
5450
5451   if (section->sh_size > filedata->file_size)
5452     {
5453       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5454              printable_section_name (filedata, section),
5455              (unsigned long) section->sh_size);
5456       goto exit_point;
5457     }
5458
5459   number = section->sh_size / section->sh_entsize;
5460
5461   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5462     {
5463       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5464              (unsigned long) section->sh_size,
5465              printable_section_name (filedata, section),
5466              (unsigned long) section->sh_entsize);
5467       goto exit_point;
5468     }
5469
5470   esyms = (Elf32_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5471                                            section->sh_size, _("symbols"));
5472   if (esyms == NULL)
5473     goto exit_point;
5474
5475   {
5476     elf_section_list * entry;
5477
5478     shndx = NULL;
5479     for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5480       if (entry->hdr->sh_link == (unsigned long) (section - filedata->section_headers))
5481         {
5482           shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5483                                                        entry->hdr->sh_offset,
5484                                                        1, entry->hdr->sh_size,
5485                                                        _("symbol table section indicies"));
5486           if (shndx == NULL)
5487             goto exit_point;
5488           /* PR17531: file: heap-buffer-overflow */
5489           else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5490             {
5491               error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5492                      printable_section_name (filedata, entry->hdr),
5493                      (unsigned long) entry->hdr->sh_size,
5494                      (unsigned long) section->sh_size);
5495               goto exit_point;
5496             }
5497         }
5498   }
5499
5500   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5501
5502   if (isyms == NULL)
5503     {
5504       error (_("Out of memory reading %lu symbols\n"),
5505              (unsigned long) number);
5506       goto exit_point;
5507     }
5508
5509   for (j = 0, psym = isyms; j < number; j++, psym++)
5510     {
5511       psym->st_name  = BYTE_GET (esyms[j].st_name);
5512       psym->st_value = BYTE_GET (esyms[j].st_value);
5513       psym->st_size  = BYTE_GET (esyms[j].st_size);
5514       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5515       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5516         psym->st_shndx
5517           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5518       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5519         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5520       psym->st_info  = BYTE_GET (esyms[j].st_info);
5521       psym->st_other = BYTE_GET (esyms[j].st_other);
5522     }
5523
5524  exit_point:
5525   if (shndx != NULL)
5526     free (shndx);
5527   if (esyms != NULL)
5528     free (esyms);
5529
5530   if (num_syms_return != NULL)
5531     * num_syms_return = isyms == NULL ? 0 : number;
5532
5533   return isyms;
5534 }
5535
5536 static Elf_Internal_Sym *
5537 get_64bit_elf_symbols (Filedata *           filedata,
5538                        Elf_Internal_Shdr *  section,
5539                        unsigned long *      num_syms_return)
5540 {
5541   unsigned long number = 0;
5542   Elf64_External_Sym * esyms = NULL;
5543   Elf_External_Sym_Shndx * shndx = NULL;
5544   Elf_Internal_Sym * isyms = NULL;
5545   Elf_Internal_Sym * psym;
5546   unsigned int j;
5547
5548   if (section->sh_size == 0)
5549     {
5550       if (num_syms_return != NULL)
5551         * num_syms_return = 0;
5552       return NULL;
5553     }
5554
5555   /* Run some sanity checks first.  */
5556   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5557     {
5558       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5559              printable_section_name (filedata, section),
5560              (unsigned long) section->sh_entsize);
5561       goto exit_point;
5562     }
5563
5564   if (section->sh_size > filedata->file_size)
5565     {
5566       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5567              printable_section_name (filedata, section),
5568              (unsigned long) section->sh_size);
5569       goto exit_point;
5570     }
5571
5572   number = section->sh_size / section->sh_entsize;
5573
5574   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5575     {
5576       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5577              (unsigned long) section->sh_size,
5578              printable_section_name (filedata, section),
5579              (unsigned long) section->sh_entsize);
5580       goto exit_point;
5581     }
5582
5583   esyms = (Elf64_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5584                                            section->sh_size, _("symbols"));
5585   if (!esyms)
5586     goto exit_point;
5587
5588   {
5589     elf_section_list * entry;
5590
5591     shndx = NULL;
5592     for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5593       if (entry->hdr->sh_link == (unsigned long) (section - filedata->section_headers))
5594         {
5595           shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5596                                                        entry->hdr->sh_offset,
5597                                                        1, entry->hdr->sh_size,
5598                                                        _("symbol table section indicies"));
5599           if (shndx == NULL)
5600             goto exit_point;
5601           /* PR17531: file: heap-buffer-overflow */
5602           else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5603             {
5604               error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5605                      printable_section_name (filedata, entry->hdr),
5606                      (unsigned long) entry->hdr->sh_size,
5607                      (unsigned long) section->sh_size);
5608               goto exit_point;
5609             }
5610         }
5611   }
5612
5613   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5614
5615   if (isyms == NULL)
5616     {
5617       error (_("Out of memory reading %lu symbols\n"),
5618              (unsigned long) number);
5619       goto exit_point;
5620     }
5621
5622   for (j = 0, psym = isyms; j < number; j++, psym++)
5623     {
5624       psym->st_name  = BYTE_GET (esyms[j].st_name);
5625       psym->st_info  = BYTE_GET (esyms[j].st_info);
5626       psym->st_other = BYTE_GET (esyms[j].st_other);
5627       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5628
5629       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5630         psym->st_shndx
5631           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5632       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5633         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5634
5635       psym->st_value = BYTE_GET (esyms[j].st_value);
5636       psym->st_size  = BYTE_GET (esyms[j].st_size);
5637     }
5638
5639  exit_point:
5640   if (shndx != NULL)
5641     free (shndx);
5642   if (esyms != NULL)
5643     free (esyms);
5644
5645   if (num_syms_return != NULL)
5646     * num_syms_return = isyms == NULL ? 0 : number;
5647
5648   return isyms;
5649 }
5650
5651 static const char *
5652 get_elf_section_flags (Filedata * filedata, bfd_vma sh_flags)
5653 {
5654   static char buff[1024];
5655   char * p = buff;
5656   unsigned int field_size = is_32bit_elf ? 8 : 16;
5657   signed int sindex;
5658   unsigned int size = sizeof (buff) - (field_size + 4 + 1);
5659   bfd_vma os_flags = 0;
5660   bfd_vma proc_flags = 0;
5661   bfd_vma unknown_flags = 0;
5662   static const struct
5663     {
5664       const char * str;
5665       unsigned int len;
5666     }
5667   flags [] =
5668     {
5669       /*  0 */ { STRING_COMMA_LEN ("WRITE") },
5670       /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
5671       /*  2 */ { STRING_COMMA_LEN ("EXEC") },
5672       /*  3 */ { STRING_COMMA_LEN ("MERGE") },
5673       /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
5674       /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
5675       /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5676       /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5677       /*  8 */ { STRING_COMMA_LEN ("GROUP") },
5678       /*  9 */ { STRING_COMMA_LEN ("TLS") },
5679       /* IA-64 specific.  */
5680       /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5681       /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5682       /* IA-64 OpenVMS specific.  */
5683       /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5684       /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5685       /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5686       /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5687       /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5688       /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5689       /* Generic.  */
5690       /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5691       /* SPARC specific.  */
5692       /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5693       /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5694       /* ARM specific.  */
5695       /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5696       /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5697       /* 23 */ { STRING_COMMA_LEN ("COMDEF") },
5698       /* GNU specific.  */
5699       /* 24 */ { STRING_COMMA_LEN ("GNU_MBIND") },
5700       /* VLE specific.  */
5701       /* 25 */ { STRING_COMMA_LEN ("VLE") },
5702     };
5703
5704   if (do_section_details)
5705     {
5706       sprintf (buff, "[%*.*lx]: ",
5707                field_size, field_size, (unsigned long) sh_flags);
5708       p += field_size + 4;
5709     }
5710
5711   while (sh_flags)
5712     {
5713       bfd_vma flag;
5714
5715       flag = sh_flags & - sh_flags;
5716       sh_flags &= ~ flag;
5717
5718       if (do_section_details)
5719         {
5720           switch (flag)
5721             {
5722             case SHF_WRITE:             sindex = 0; break;
5723             case SHF_ALLOC:             sindex = 1; break;
5724             case SHF_EXECINSTR:         sindex = 2; break;
5725             case SHF_MERGE:             sindex = 3; break;
5726             case SHF_STRINGS:           sindex = 4; break;
5727             case SHF_INFO_LINK:         sindex = 5; break;
5728             case SHF_LINK_ORDER:        sindex = 6; break;
5729             case SHF_OS_NONCONFORMING:  sindex = 7; break;
5730             case SHF_GROUP:             sindex = 8; break;
5731             case SHF_TLS:               sindex = 9; break;
5732             case SHF_EXCLUDE:           sindex = 18; break;
5733             case SHF_COMPRESSED:        sindex = 20; break;
5734             case SHF_GNU_MBIND:         sindex = 24; break;
5735
5736             default:
5737               sindex = -1;
5738               switch (filedata->file_header.e_machine)
5739                 {
5740                 case EM_IA_64:
5741                   if (flag == SHF_IA_64_SHORT)
5742                     sindex = 10;
5743                   else if (flag == SHF_IA_64_NORECOV)
5744                     sindex = 11;
5745 #ifdef BFD64
5746                   else if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5747                     switch (flag)
5748                       {
5749                       case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
5750                       case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
5751                       case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
5752                       case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
5753                       case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5754                       case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
5755                       default:                        break;
5756                       }
5757 #endif
5758                   break;
5759
5760                 case EM_386:
5761                 case EM_IAMCU:
5762                 case EM_X86_64:
5763                 case EM_L1OM:
5764                 case EM_K1OM:
5765                 case EM_OLD_SPARCV9:
5766                 case EM_SPARC32PLUS:
5767                 case EM_SPARCV9:
5768                 case EM_SPARC:
5769                   if (flag == SHF_ORDERED)
5770                     sindex = 19;
5771                   break;
5772
5773                 case EM_ARM:
5774                   switch (flag)
5775                     {
5776                     case SHF_ENTRYSECT: sindex = 21; break;
5777                     case SHF_ARM_PURECODE: sindex = 22; break;
5778                     case SHF_COMDEF: sindex = 23; break;
5779                     default: break;
5780                     }
5781                   break;
5782                 case EM_PPC:
5783                   if (flag == SHF_PPC_VLE)
5784                     sindex = 25;
5785                   break;
5786
5787                 default:
5788                   break;
5789                 }
5790             }
5791
5792           if (sindex != -1)
5793             {
5794               if (p != buff + field_size + 4)
5795                 {
5796                   if (size < (10 + 2))
5797                     {
5798                       warn (_("Internal error: not enough buffer room for section flag info"));
5799                       return _("<unknown>");
5800                     }
5801                   size -= 2;
5802                   *p++ = ',';
5803                   *p++ = ' ';
5804                 }
5805
5806               size -= flags [sindex].len;
5807               p = stpcpy (p, flags [sindex].str);
5808             }
5809           else if (flag & SHF_MASKOS)
5810             os_flags |= flag;
5811           else if (flag & SHF_MASKPROC)
5812             proc_flags |= flag;
5813           else
5814             unknown_flags |= flag;
5815         }
5816       else
5817         {
5818           switch (flag)
5819             {
5820             case SHF_WRITE:             *p = 'W'; break;
5821             case SHF_ALLOC:             *p = 'A'; break;
5822             case SHF_EXECINSTR:         *p = 'X'; break;
5823             case SHF_MERGE:             *p = 'M'; break;
5824             case SHF_STRINGS:           *p = 'S'; break;
5825             case SHF_INFO_LINK:         *p = 'I'; break;
5826             case SHF_LINK_ORDER:        *p = 'L'; break;
5827             case SHF_OS_NONCONFORMING:  *p = 'O'; break;
5828             case SHF_GROUP:             *p = 'G'; break;
5829             case SHF_TLS:               *p = 'T'; break;
5830             case SHF_EXCLUDE:           *p = 'E'; break;
5831             case SHF_COMPRESSED:        *p = 'C'; break;
5832             case SHF_GNU_MBIND:         *p = 'D'; break;
5833
5834             default:
5835               if ((filedata->file_header.e_machine == EM_X86_64
5836                    || filedata->file_header.e_machine == EM_L1OM
5837                    || filedata->file_header.e_machine == EM_K1OM)
5838                   && flag == SHF_X86_64_LARGE)
5839                 *p = 'l';
5840               else if (filedata->file_header.e_machine == EM_ARM
5841                        && flag == SHF_ARM_PURECODE)
5842                   *p = 'y';
5843               else if (filedata->file_header.e_machine == EM_PPC
5844                        && flag == SHF_PPC_VLE)
5845                   *p = 'v';
5846               else if (flag & SHF_MASKOS)
5847                 {
5848                   *p = 'o';
5849                   sh_flags &= ~ SHF_MASKOS;
5850                 }
5851               else if (flag & SHF_MASKPROC)
5852                 {
5853                   *p = 'p';
5854                   sh_flags &= ~ SHF_MASKPROC;
5855                 }
5856               else
5857                 *p = 'x';
5858               break;
5859             }
5860           p++;
5861         }
5862     }
5863
5864   if (do_section_details)
5865     {
5866       if (os_flags)
5867         {
5868           size -= 5 + field_size;
5869           if (p != buff + field_size + 4)
5870             {
5871               if (size < (2 + 1))
5872                 {
5873                   warn (_("Internal error: not enough buffer room for section flag info"));
5874                   return _("<unknown>");
5875                 }
5876               size -= 2;
5877               *p++ = ',';
5878               *p++ = ' ';
5879             }
5880           sprintf (p, "OS (%*.*lx)", field_size, field_size,
5881                    (unsigned long) os_flags);
5882           p += 5 + field_size;
5883         }
5884       if (proc_flags)
5885         {
5886           size -= 7 + field_size;
5887           if (p != buff + field_size + 4)
5888             {
5889               if (size < (2 + 1))
5890                 {
5891                   warn (_("Internal error: not enough buffer room for section flag info"));
5892                   return _("<unknown>");
5893                 }
5894               size -= 2;
5895               *p++ = ',';
5896               *p++ = ' ';
5897             }
5898           sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5899                    (unsigned long) proc_flags);
5900           p += 7 + field_size;
5901         }
5902       if (unknown_flags)
5903         {
5904           size -= 10 + field_size;
5905           if (p != buff + field_size + 4)
5906             {
5907               if (size < (2 + 1))
5908                 {
5909                   warn (_("Internal error: not enough buffer room for section flag info"));
5910                   return _("<unknown>");
5911                 }
5912               size -= 2;
5913               *p++ = ',';
5914               *p++ = ' ';
5915             }
5916           sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5917                    (unsigned long) unknown_flags);
5918           p += 10 + field_size;
5919         }
5920     }
5921
5922   *p = '\0';
5923   return buff;
5924 }
5925
5926 static unsigned int
5927 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf, bfd_size_type size)
5928 {
5929   if (is_32bit_elf)
5930     {
5931       Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5932
5933       if (size < sizeof (* echdr))
5934         {
5935           error (_("Compressed section is too small even for a compression header\n"));
5936           return 0;
5937         }
5938
5939       chdr->ch_type = BYTE_GET (echdr->ch_type);
5940       chdr->ch_size = BYTE_GET (echdr->ch_size);
5941       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5942       return sizeof (*echdr);
5943     }
5944   else
5945     {
5946       Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
5947
5948       if (size < sizeof (* echdr))
5949         {
5950           error (_("Compressed section is too small even for a compression header\n"));
5951           return 0;
5952         }
5953
5954       chdr->ch_type = BYTE_GET (echdr->ch_type);
5955       chdr->ch_size = BYTE_GET (echdr->ch_size);
5956       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5957       return sizeof (*echdr);
5958     }
5959 }
5960
5961 static bfd_boolean
5962 process_section_headers (Filedata * filedata)
5963 {
5964   Elf_Internal_Shdr * section;
5965   unsigned int i;
5966
5967   filedata->section_headers = NULL;
5968
5969   if (filedata->file_header.e_shnum == 0)
5970     {
5971       /* PR binutils/12467.  */
5972       if (filedata->file_header.e_shoff != 0)
5973         {
5974           warn (_("possibly corrupt ELF file header - it has a non-zero"
5975                   " section header offset, but no section headers\n"));
5976           return FALSE;
5977         }
5978       else if (do_sections)
5979         printf (_("\nThere are no sections in this file.\n"));
5980
5981       return TRUE;
5982     }
5983
5984   if (do_sections && !do_header)
5985     printf (ngettext ("There is %d section header, "
5986                       "starting at offset 0x%lx:\n",
5987                       "There are %d section headers, "
5988                       "starting at offset 0x%lx:\n",
5989                       filedata->file_header.e_shnum),
5990             filedata->file_header.e_shnum,
5991             (unsigned long) filedata->file_header.e_shoff);
5992
5993   if (is_32bit_elf)
5994     {
5995       if (! get_32bit_section_headers (filedata, FALSE))
5996         return FALSE;
5997     }
5998   else
5999     {
6000       if (! get_64bit_section_headers (filedata, FALSE))
6001         return FALSE;
6002     }
6003
6004   /* Read in the string table, so that we have names to display.  */
6005   if (filedata->file_header.e_shstrndx != SHN_UNDEF
6006        && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
6007     {
6008       section = filedata->section_headers + filedata->file_header.e_shstrndx;
6009
6010       if (section->sh_size != 0)
6011         {
6012           filedata->string_table = (char *) get_data (NULL, filedata, section->sh_offset,
6013                                                       1, section->sh_size,
6014                                                       _("string table"));
6015
6016           filedata->string_table_length = filedata->string_table != NULL ? section->sh_size : 0;
6017         }
6018     }
6019
6020   /* Scan the sections for the dynamic symbol table
6021      and dynamic string table and debug sections.  */
6022   dynamic_symbols = NULL;
6023   dynamic_strings = NULL;
6024   dynamic_syminfo = NULL;
6025   symtab_shndx_list = NULL;
6026
6027   eh_addr_size = is_32bit_elf ? 4 : 8;
6028   switch (filedata->file_header.e_machine)
6029     {
6030     case EM_MIPS:
6031     case EM_MIPS_RS3_LE:
6032       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
6033          FDE addresses.  However, the ABI also has a semi-official ILP32
6034          variant for which the normal FDE address size rules apply.
6035
6036          GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
6037          section, where XX is the size of longs in bits.  Unfortunately,
6038          earlier compilers provided no way of distinguishing ILP32 objects
6039          from LP64 objects, so if there's any doubt, we should assume that
6040          the official LP64 form is being used.  */
6041       if ((filedata->file_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
6042           && find_section (filedata, ".gcc_compiled_long32") == NULL)
6043         eh_addr_size = 8;
6044       break;
6045
6046     case EM_H8_300:
6047     case EM_H8_300H:
6048       switch (filedata->file_header.e_flags & EF_H8_MACH)
6049         {
6050         case E_H8_MACH_H8300:
6051         case E_H8_MACH_H8300HN:
6052         case E_H8_MACH_H8300SN:
6053         case E_H8_MACH_H8300SXN:
6054           eh_addr_size = 2;
6055           break;
6056         case E_H8_MACH_H8300H:
6057         case E_H8_MACH_H8300S:
6058         case E_H8_MACH_H8300SX:
6059           eh_addr_size = 4;
6060           break;
6061         }
6062       break;
6063
6064     case EM_M32C_OLD:
6065     case EM_M32C:
6066       switch (filedata->file_header.e_flags & EF_M32C_CPU_MASK)
6067         {
6068         case EF_M32C_CPU_M16C:
6069           eh_addr_size = 2;
6070           break;
6071         }
6072       break;
6073     }
6074
6075 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64)                \
6076   do                                                                    \
6077     {                                                                   \
6078       bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64;  \
6079       if (section->sh_entsize != expected_entsize)                      \
6080         {                                                               \
6081           char buf[40];                                                 \
6082           sprintf_vma (buf, section->sh_entsize);                       \
6083           /* Note: coded this way so that there is a single string for  \
6084              translation.  */ \
6085           error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
6086           error (_("(Using the expected size of %u for the rest of this dump)\n"), \
6087                    (unsigned) expected_entsize);                        \
6088           section->sh_entsize = expected_entsize;                       \
6089         }                                                               \
6090     }                                                                   \
6091   while (0)
6092
6093 #define CHECK_ENTSIZE(section, i, type)                                 \
6094   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),         \
6095                         sizeof (Elf64_External_##type))
6096
6097   for (i = 0, section = filedata->section_headers;
6098        i < filedata->file_header.e_shnum;
6099        i++, section++)
6100     {
6101       char * name = SECTION_NAME (section);
6102
6103       if (section->sh_type == SHT_DYNSYM)
6104         {
6105           if (dynamic_symbols != NULL)
6106             {
6107               error (_("File contains multiple dynamic symbol tables\n"));
6108               continue;
6109             }
6110
6111           CHECK_ENTSIZE (section, i, Sym);
6112           dynamic_symbols = GET_ELF_SYMBOLS (filedata, section, & num_dynamic_syms);
6113         }
6114       else if (section->sh_type == SHT_STRTAB
6115                && streq (name, ".dynstr"))
6116         {
6117           if (dynamic_strings != NULL)
6118             {
6119               error (_("File contains multiple dynamic string tables\n"));
6120               continue;
6121             }
6122
6123           dynamic_strings = (char *) get_data (NULL, filedata, section->sh_offset,
6124                                                1, section->sh_size,
6125                                                _("dynamic strings"));
6126           dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
6127         }
6128       else if (section->sh_type == SHT_SYMTAB_SHNDX)
6129         {
6130           elf_section_list * entry = xmalloc (sizeof * entry);
6131
6132           entry->hdr = section;
6133           entry->next = symtab_shndx_list;
6134           symtab_shndx_list = entry;
6135         }
6136       else if (section->sh_type == SHT_SYMTAB)
6137         CHECK_ENTSIZE (section, i, Sym);
6138       else if (section->sh_type == SHT_GROUP)
6139         CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
6140       else if (section->sh_type == SHT_REL)
6141         CHECK_ENTSIZE (section, i, Rel);
6142       else if (section->sh_type == SHT_RELA)
6143         CHECK_ENTSIZE (section, i, Rela);
6144       else if ((do_debugging || do_debug_info || do_debug_abbrevs
6145                 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
6146                 || do_debug_aranges || do_debug_frames || do_debug_macinfo
6147                 || do_debug_str || do_debug_loc || do_debug_ranges
6148                 || do_debug_addr || do_debug_cu_index || do_debug_links)
6149                && (const_strneq (name, ".debug_")
6150                    || const_strneq (name, ".zdebug_")))
6151         {
6152           if (name[1] == 'z')
6153             name += sizeof (".zdebug_") - 1;
6154           else
6155             name += sizeof (".debug_") - 1;
6156
6157           if (do_debugging
6158               || (do_debug_info     && const_strneq (name, "info"))
6159               || (do_debug_info     && const_strneq (name, "types"))
6160               || (do_debug_abbrevs  && const_strneq (name, "abbrev"))
6161               || (do_debug_lines    && strcmp (name, "line") == 0)
6162               || (do_debug_lines    && const_strneq (name, "line."))
6163               || (do_debug_pubnames && const_strneq (name, "pubnames"))
6164               || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
6165               || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
6166               || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
6167               || (do_debug_aranges  && const_strneq (name, "aranges"))
6168               || (do_debug_ranges   && const_strneq (name, "ranges"))
6169               || (do_debug_ranges   && const_strneq (name, "rnglists"))
6170               || (do_debug_frames   && const_strneq (name, "frame"))
6171               || (do_debug_macinfo  && const_strneq (name, "macinfo"))
6172               || (do_debug_macinfo  && const_strneq (name, "macro"))
6173               || (do_debug_str      && const_strneq (name, "str"))
6174               || (do_debug_loc      && const_strneq (name, "loc"))
6175               || (do_debug_loc      && const_strneq (name, "loclists"))
6176               || (do_debug_addr     && const_strneq (name, "addr"))
6177               || (do_debug_cu_index && const_strneq (name, "cu_index"))
6178               || (do_debug_cu_index && const_strneq (name, "tu_index"))
6179               )
6180             request_dump_bynumber (filedata, i, DEBUG_DUMP);
6181         }
6182       /* Linkonce section to be combined with .debug_info at link time.  */
6183       else if ((do_debugging || do_debug_info)
6184                && const_strneq (name, ".gnu.linkonce.wi."))
6185         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6186       else if (do_debug_frames && streq (name, ".eh_frame"))
6187         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6188       else if (do_gdb_index && (streq (name, ".gdb_index")
6189                                 || streq (name, ".debug_names")))
6190         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6191       /* Trace sections for Itanium VMS.  */
6192       else if ((do_debugging || do_trace_info || do_trace_abbrevs
6193                 || do_trace_aranges)
6194                && const_strneq (name, ".trace_"))
6195         {
6196           name += sizeof (".trace_") - 1;
6197
6198           if (do_debugging
6199               || (do_trace_info     && streq (name, "info"))
6200               || (do_trace_abbrevs  && streq (name, "abbrev"))
6201               || (do_trace_aranges  && streq (name, "aranges"))
6202               )
6203             request_dump_bynumber (filedata, i, DEBUG_DUMP);
6204         }
6205       else if ((do_debugging || do_debug_links)
6206                && (const_strneq (name, ".gnu_debuglink")
6207                    || const_strneq (name, ".gnu_debugaltlink")))
6208         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6209     }
6210
6211   if (! do_sections)
6212     return TRUE;
6213
6214   if (filedata->file_header.e_shnum > 1)
6215     printf (_("\nSection Headers:\n"));
6216   else
6217     printf (_("\nSection Header:\n"));
6218
6219   if (is_32bit_elf)
6220     {
6221       if (do_section_details)
6222         {
6223           printf (_("  [Nr] Name\n"));
6224           printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
6225         }
6226       else
6227         printf
6228           (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
6229     }
6230   else if (do_wide)
6231     {
6232       if (do_section_details)
6233         {
6234           printf (_("  [Nr] Name\n"));
6235           printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
6236         }
6237       else
6238         printf
6239           (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
6240     }
6241   else
6242     {
6243       if (do_section_details)
6244         {
6245           printf (_("  [Nr] Name\n"));
6246           printf (_("       Type              Address          Offset            Link\n"));
6247           printf (_("       Size              EntSize          Info              Align\n"));
6248         }
6249       else
6250         {
6251           printf (_("  [Nr] Name              Type             Address           Offset\n"));
6252           printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
6253         }
6254     }
6255
6256   if (do_section_details)
6257     printf (_("       Flags\n"));
6258
6259   for (i = 0, section = filedata->section_headers;
6260        i < filedata->file_header.e_shnum;
6261        i++, section++)
6262     {
6263       /* Run some sanity checks on the section header.  */
6264
6265       /* Check the sh_link field.  */
6266       switch (section->sh_type)
6267         {
6268         case SHT_SYMTAB_SHNDX:
6269         case SHT_GROUP:
6270         case SHT_HASH:
6271         case SHT_GNU_HASH:
6272         case SHT_GNU_versym:
6273         case SHT_REL:
6274         case SHT_RELA:
6275           if (section->sh_link < 1
6276               || section->sh_link >= filedata->file_header.e_shnum
6277               || (filedata->section_headers[section->sh_link].sh_type != SHT_SYMTAB
6278                   && filedata->section_headers[section->sh_link].sh_type != SHT_DYNSYM))
6279             warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6280                   i, section->sh_link);
6281           break;
6282
6283         case SHT_DYNAMIC:
6284         case SHT_SYMTAB:
6285         case SHT_DYNSYM:
6286         case SHT_GNU_verneed:
6287         case SHT_GNU_verdef:
6288         case SHT_GNU_LIBLIST:
6289           if (section->sh_link < 1
6290               || section->sh_link >= filedata->file_header.e_shnum
6291               || filedata->section_headers[section->sh_link].sh_type != SHT_STRTAB)
6292             warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6293                   i, section->sh_link);
6294           break;
6295
6296         case SHT_INIT_ARRAY:
6297         case SHT_FINI_ARRAY:
6298         case SHT_PREINIT_ARRAY:
6299           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6300             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6301                   i, section->sh_link);
6302           break;
6303
6304         default:
6305           /* FIXME: Add support for target specific section types.  */
6306 #if 0     /* Currently we do not check other section types as there are too
6307              many special cases.  Stab sections for example have a type
6308              of SHT_PROGBITS but an sh_link field that links to the .stabstr
6309              section.  */
6310           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6311             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6312                   i, section->sh_link);
6313 #endif
6314           break;
6315         }
6316
6317       /* Check the sh_info field.  */
6318       switch (section->sh_type)
6319         {
6320         case SHT_REL:
6321         case SHT_RELA:
6322           if (section->sh_info < 1
6323               || section->sh_info >= filedata->file_header.e_shnum
6324               || (filedata->section_headers[section->sh_info].sh_type != SHT_PROGBITS
6325                   && filedata->section_headers[section->sh_info].sh_type != SHT_NOBITS
6326                   && filedata->section_headers[section->sh_info].sh_type != SHT_NOTE
6327                   && filedata->section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
6328                   /* FIXME: Are other section types valid ?  */
6329                   && filedata->section_headers[section->sh_info].sh_type < SHT_LOOS))
6330             {
6331               if (section->sh_info == 0
6332                   && (filedata->file_header.e_type == ET_EXEC
6333                       || filedata->file_header.e_type == ET_DYN
6334                       /* These next two tests may be redundant, but
6335                          they have been left in for paranoia's sake.  */
6336                       || streq (SECTION_NAME (section), ".rel.dyn")
6337                       || streq (SECTION_NAME (section), ".rela.dyn")))
6338                 /* Dynamic relocations apply to segments, not sections, so
6339                    they do not need an sh_info value.  */
6340                 ;
6341               else
6342                 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6343                       i, section->sh_info);
6344             }
6345           break;
6346
6347         case SHT_DYNAMIC:
6348         case SHT_HASH:
6349         case SHT_SYMTAB_SHNDX:
6350         case SHT_INIT_ARRAY:
6351         case SHT_FINI_ARRAY:
6352         case SHT_PREINIT_ARRAY:
6353           if (section->sh_info != 0)
6354             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6355                   i, section->sh_info);
6356           break;
6357
6358         case SHT_GROUP:
6359         case SHT_SYMTAB:
6360         case SHT_DYNSYM:
6361           /* A symbol index - we assume that it is valid.  */
6362           break;
6363
6364         default:
6365           /* FIXME: Add support for target specific section types.  */
6366           if (section->sh_type == SHT_NOBITS)
6367             /* NOBITS section headers with non-zero sh_info fields can be
6368                created when a binary is stripped of everything but its debug
6369                information.  The stripped sections have their headers
6370                preserved but their types set to SHT_NOBITS.  So do not check
6371                this type of section.  */
6372             ;
6373           else if (section->sh_flags & SHF_INFO_LINK)
6374             {
6375               if (section->sh_info < 1 || section->sh_info >= filedata->file_header.e_shnum)
6376                 warn (_("[%2u]: Expected link to another section in info field"), i);
6377             }
6378           else if (section->sh_type < SHT_LOOS
6379                    && (section->sh_flags & SHF_GNU_MBIND) == 0
6380                    && section->sh_info != 0)
6381             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6382                   i, section->sh_info);
6383           break;
6384         }
6385
6386       /* Check the sh_size field.  */
6387       if (section->sh_size > filedata->file_size
6388           && section->sh_type != SHT_NOBITS
6389           && section->sh_type != SHT_NULL
6390           && section->sh_type < SHT_LOOS)
6391         warn (_("Size of section %u is larger than the entire file!\n"), i);
6392
6393       printf ("  [%2u] ", i);
6394       if (do_section_details)
6395         printf ("%s\n      ", printable_section_name (filedata, section));
6396       else
6397         print_symbol (-17, SECTION_NAME (section));
6398
6399       printf (do_wide ? " %-15s " : " %-15.15s ",
6400               get_section_type_name (filedata, section->sh_type));
6401
6402       if (is_32bit_elf)
6403         {
6404           const char * link_too_big = NULL;
6405
6406           print_vma (section->sh_addr, LONG_HEX);
6407
6408           printf ( " %6.6lx %6.6lx %2.2lx",
6409                    (unsigned long) section->sh_offset,
6410                    (unsigned long) section->sh_size,
6411                    (unsigned long) section->sh_entsize);
6412
6413           if (do_section_details)
6414             fputs ("  ", stdout);
6415           else
6416             printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6417
6418           if (section->sh_link >= filedata->file_header.e_shnum)
6419             {
6420               link_too_big = "";
6421               /* The sh_link value is out of range.  Normally this indicates
6422                  an error but it can have special values in Solaris binaries.  */
6423               switch (filedata->file_header.e_machine)
6424                 {
6425                 case EM_386:
6426                 case EM_IAMCU:
6427                 case EM_X86_64:
6428                 case EM_L1OM:
6429                 case EM_K1OM:
6430                 case EM_OLD_SPARCV9:
6431                 case EM_SPARC32PLUS:
6432                 case EM_SPARCV9:
6433                 case EM_SPARC:
6434                   if (section->sh_link == (SHN_BEFORE & 0xffff))
6435                     link_too_big = "BEFORE";
6436                   else if (section->sh_link == (SHN_AFTER & 0xffff))
6437                     link_too_big = "AFTER";
6438                   break;
6439                 default:
6440                   break;
6441                 }
6442             }
6443
6444           if (do_section_details)
6445             {
6446               if (link_too_big != NULL && * link_too_big)
6447                 printf ("<%s> ", link_too_big);
6448               else
6449                 printf ("%2u ", section->sh_link);
6450               printf ("%3u %2lu\n", section->sh_info,
6451                       (unsigned long) section->sh_addralign);
6452             }
6453           else
6454             printf ("%2u %3u %2lu\n",
6455                     section->sh_link,
6456                     section->sh_info,
6457                     (unsigned long) section->sh_addralign);
6458
6459           if (link_too_big && ! * link_too_big)
6460             warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6461                   i, section->sh_link);
6462         }
6463       else if (do_wide)
6464         {
6465           print_vma (section->sh_addr, LONG_HEX);
6466
6467           if ((long) section->sh_offset == section->sh_offset)
6468             printf (" %6.6lx", (unsigned long) section->sh_offset);
6469           else
6470             {
6471               putchar (' ');
6472               print_vma (section->sh_offset, LONG_HEX);
6473             }
6474
6475           if ((unsigned long) section->sh_size == section->sh_size)
6476             printf (" %6.6lx", (unsigned long) section->sh_size);
6477           else
6478             {
6479               putchar (' ');
6480               print_vma (section->sh_size, LONG_HEX);
6481             }
6482
6483           if ((unsigned long) section->sh_entsize == section->sh_entsize)
6484             printf (" %2.2lx", (unsigned long) section->sh_entsize);
6485           else
6486             {
6487               putchar (' ');
6488               print_vma (section->sh_entsize, LONG_HEX);
6489             }
6490
6491           if (do_section_details)
6492             fputs ("  ", stdout);
6493           else
6494             printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6495
6496           printf ("%2u %3u ", section->sh_link, section->sh_info);
6497
6498           if ((unsigned long) section->sh_addralign == section->sh_addralign)
6499             printf ("%2lu\n", (unsigned long) section->sh_addralign);
6500           else
6501             {
6502               print_vma (section->sh_addralign, DEC);
6503               putchar ('\n');
6504             }
6505         }
6506       else if (do_section_details)
6507         {
6508           printf ("       %-15.15s  ",
6509                   get_section_type_name (filedata, section->sh_type));
6510           print_vma (section->sh_addr, LONG_HEX);
6511           if ((long) section->sh_offset == section->sh_offset)
6512             printf ("  %16.16lx", (unsigned long) section->sh_offset);
6513           else
6514             {
6515               printf ("  ");
6516               print_vma (section->sh_offset, LONG_HEX);
6517             }
6518           printf ("  %u\n       ", section->sh_link);
6519           print_vma (section->sh_size, LONG_HEX);
6520           putchar (' ');
6521           print_vma (section->sh_entsize, LONG_HEX);
6522
6523           printf ("  %-16u  %lu\n",
6524                   section->sh_info,
6525                   (unsigned long) section->sh_addralign);
6526         }
6527       else
6528         {
6529           putchar (' ');
6530           print_vma (section->sh_addr, LONG_HEX);
6531           if ((long) section->sh_offset == section->sh_offset)
6532             printf ("  %8.8lx", (unsigned long) section->sh_offset);
6533           else
6534             {
6535               printf ("  ");
6536               print_vma (section->sh_offset, LONG_HEX);
6537             }
6538           printf ("\n       ");
6539           print_vma (section->sh_size, LONG_HEX);
6540           printf ("  ");
6541           print_vma (section->sh_entsize, LONG_HEX);
6542
6543           printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6544
6545           printf ("     %2u   %3u     %lu\n",
6546                   section->sh_link,
6547                   section->sh_info,
6548                   (unsigned long) section->sh_addralign);
6549         }
6550
6551       if (do_section_details)
6552         {
6553           printf ("       %s\n", get_elf_section_flags (filedata, section->sh_flags));
6554           if ((section->sh_flags & SHF_COMPRESSED) != 0)
6555             {
6556               /* Minimum section size is 12 bytes for 32-bit compression
6557                  header + 12 bytes for compressed data header.  */
6558               unsigned char buf[24];
6559
6560               assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6561               if (get_data (&buf, filedata, section->sh_offset, 1,
6562                             sizeof (buf), _("compression header")))
6563                 {
6564                   Elf_Internal_Chdr chdr;
6565
6566                   (void) get_compression_header (&chdr, buf, sizeof (buf));
6567
6568                   if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6569                     printf ("       ZLIB, ");
6570                   else
6571                     printf (_("       [<unknown>: 0x%x], "),
6572                             chdr.ch_type);
6573                   print_vma (chdr.ch_size, LONG_HEX);
6574                   printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6575                 }
6576             }
6577         }
6578     }
6579
6580   if (!do_section_details)
6581     {
6582       /* The ordering of the letters shown here matches the ordering of the
6583          corresponding SHF_xxx values, and hence the order in which these
6584          letters will be displayed to the user.  */
6585       printf (_("Key to Flags:\n\
6586   W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6587   L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6588   C (compressed), x (unknown), o (OS specific), E (exclude),\n  "));
6589       if (filedata->file_header.e_machine == EM_X86_64
6590           || filedata->file_header.e_machine == EM_L1OM
6591           || filedata->file_header.e_machine == EM_K1OM)
6592         printf (_("l (large), "));
6593       else if (filedata->file_header.e_machine == EM_ARM)
6594         printf (_("y (purecode), "));
6595       else if (filedata->file_header.e_machine == EM_PPC)
6596         printf (_("v (VLE), "));
6597       printf ("p (processor specific)\n");
6598     }
6599
6600   return TRUE;
6601 }
6602
6603 static const char *
6604 get_group_flags (unsigned int flags)
6605 {
6606   static char buff[128];
6607
6608   if (flags == 0)
6609     return "";
6610   else if (flags == GRP_COMDAT)
6611     return "COMDAT ";
6612
6613   snprintf (buff, 14, _("[0x%x: "), flags);
6614
6615   flags &= ~ GRP_COMDAT;
6616   if (flags & GRP_MASKOS)
6617     {
6618       strcat (buff, "<OS specific>");
6619       flags &= ~ GRP_MASKOS;
6620     }
6621
6622   if (flags & GRP_MASKPROC)
6623     {
6624       strcat (buff, "<PROC specific>");
6625       flags &= ~ GRP_MASKPROC;
6626     }
6627
6628   if (flags)
6629     strcat (buff, "<unknown>");
6630
6631   strcat (buff, "]");
6632   return buff;
6633 }
6634
6635 static bfd_boolean
6636 process_section_groups (Filedata * filedata)
6637 {
6638   Elf_Internal_Shdr * section;
6639   unsigned int i;
6640   struct group * group;
6641   Elf_Internal_Shdr * symtab_sec;
6642   Elf_Internal_Shdr * strtab_sec;
6643   Elf_Internal_Sym * symtab;
6644   unsigned long num_syms;
6645   char * strtab;
6646   size_t strtab_size;
6647
6648   /* Don't process section groups unless needed.  */
6649   if (!do_unwind && !do_section_groups)
6650     return TRUE;
6651
6652   if (filedata->file_header.e_shnum == 0)
6653     {
6654       if (do_section_groups)
6655         printf (_("\nThere are no sections to group in this file.\n"));
6656
6657       return TRUE;
6658     }
6659
6660   if (filedata->section_headers == NULL)
6661     {
6662       error (_("Section headers are not available!\n"));
6663       /* PR 13622: This can happen with a corrupt ELF header.  */
6664       return FALSE;
6665     }
6666
6667   section_headers_groups = (struct group **) calloc (filedata->file_header.e_shnum,
6668                                                      sizeof (struct group *));
6669
6670   if (section_headers_groups == NULL)
6671     {
6672       error (_("Out of memory reading %u section group headers\n"),
6673              filedata->file_header.e_shnum);
6674       return FALSE;
6675     }
6676
6677   /* Scan the sections for the group section.  */
6678   group_count = 0;
6679   for (i = 0, section = filedata->section_headers;
6680        i < filedata->file_header.e_shnum;
6681        i++, section++)
6682     if (section->sh_type == SHT_GROUP)
6683       group_count++;
6684
6685   if (group_count == 0)
6686     {
6687       if (do_section_groups)
6688         printf (_("\nThere are no section groups in this file.\n"));
6689
6690       return TRUE;
6691     }
6692
6693   section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6694
6695   if (section_groups == NULL)
6696     {
6697       error (_("Out of memory reading %lu groups\n"),
6698              (unsigned long) group_count);
6699       return FALSE;
6700     }
6701
6702   symtab_sec = NULL;
6703   strtab_sec = NULL;
6704   symtab = NULL;
6705   num_syms = 0;
6706   strtab = NULL;
6707   strtab_size = 0;
6708   for (i = 0, section = filedata->section_headers, group = section_groups;
6709        i < filedata->file_header.e_shnum;
6710        i++, section++)
6711     {
6712       if (section->sh_type == SHT_GROUP)
6713         {
6714           const char * name = printable_section_name (filedata, section);
6715           const char * group_name;
6716           unsigned char * start;
6717           unsigned char * indices;
6718           unsigned int entry, j, size;
6719           Elf_Internal_Shdr * sec;
6720           Elf_Internal_Sym * sym;
6721
6722           /* Get the symbol table.  */
6723           if (section->sh_link >= filedata->file_header.e_shnum
6724               || ((sec = filedata->section_headers + section->sh_link)->sh_type
6725                   != SHT_SYMTAB))
6726             {
6727               error (_("Bad sh_link in group section `%s'\n"), name);
6728               continue;
6729             }
6730
6731           if (symtab_sec != sec)
6732             {
6733               symtab_sec = sec;
6734               if (symtab)
6735                 free (symtab);
6736               symtab = GET_ELF_SYMBOLS (filedata, symtab_sec, & num_syms);
6737             }
6738
6739           if (symtab == NULL)
6740             {
6741               error (_("Corrupt header in group section `%s'\n"), name);
6742               continue;
6743             }
6744
6745           if (section->sh_info >= num_syms)
6746             {
6747               error (_("Bad sh_info in group section `%s'\n"), name);
6748               continue;
6749             }
6750
6751           sym = symtab + section->sh_info;
6752
6753           if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6754             {
6755               if (sym->st_shndx == 0
6756                   || sym->st_shndx >= filedata->file_header.e_shnum)
6757                 {
6758                   error (_("Bad sh_info in group section `%s'\n"), name);
6759                   continue;
6760                 }
6761
6762               group_name = SECTION_NAME (filedata->section_headers + sym->st_shndx);
6763               strtab_sec = NULL;
6764               if (strtab)
6765                 free (strtab);
6766               strtab = NULL;
6767               strtab_size = 0;
6768             }
6769           else
6770             {
6771               /* Get the string table.  */
6772               if (symtab_sec->sh_link >= filedata->file_header.e_shnum)
6773                 {
6774                   strtab_sec = NULL;
6775                   if (strtab)
6776                     free (strtab);
6777                   strtab = NULL;
6778                   strtab_size = 0;
6779                 }
6780               else if (strtab_sec
6781                        != (sec = filedata->section_headers + symtab_sec->sh_link))
6782                 {
6783                   strtab_sec = sec;
6784                   if (strtab)
6785                     free (strtab);
6786
6787                   strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
6788                                               1, strtab_sec->sh_size,
6789                                               _("string table"));
6790                   strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6791                 }
6792               group_name = sym->st_name < strtab_size
6793                 ? strtab + sym->st_name : _("<corrupt>");
6794             }
6795
6796           /* PR 17531: file: loop.  */
6797           if (section->sh_entsize > section->sh_size)
6798             {
6799               error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6800                      printable_section_name (filedata, section),
6801                      (unsigned long) section->sh_entsize,
6802                      (unsigned long) section->sh_size);
6803               break;
6804             }
6805
6806           start = (unsigned char *) get_data (NULL, filedata, section->sh_offset,
6807                                               1, section->sh_size,
6808                                               _("section data"));
6809           if (start == NULL)
6810             continue;
6811
6812           indices = start;
6813           size = (section->sh_size / section->sh_entsize) - 1;
6814           entry = byte_get (indices, 4);
6815           indices += 4;
6816
6817           if (do_section_groups)
6818             {
6819               printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6820                       get_group_flags (entry), i, name, group_name, size);
6821
6822               printf (_("   [Index]    Name\n"));
6823             }
6824
6825           group->group_index = i;
6826
6827           for (j = 0; j < size; j++)
6828             {
6829               struct group_list * g;
6830
6831               entry = byte_get (indices, 4);
6832               indices += 4;
6833
6834               if (entry >= filedata->file_header.e_shnum)
6835                 {
6836                   static unsigned num_group_errors = 0;
6837
6838                   if (num_group_errors ++ < 10)
6839                     {
6840                       error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6841                              entry, i, filedata->file_header.e_shnum - 1);
6842                       if (num_group_errors == 10)
6843                         warn (_("Further error messages about overlarge group section indicies suppressed\n"));
6844                     }
6845                   continue;
6846                 }
6847
6848               if (section_headers_groups [entry] != NULL)
6849                 {
6850                   if (entry)
6851                     {
6852                       static unsigned num_errs = 0;
6853
6854                       if (num_errs ++ < 10)
6855                         {
6856                           error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6857                                  entry, i,
6858                                  section_headers_groups [entry]->group_index);
6859                           if (num_errs == 10)
6860                             warn (_("Further error messages about already contained group sections suppressed\n"));
6861                         }
6862                       continue;
6863                     }
6864                   else
6865                     {
6866                       /* Intel C/C++ compiler may put section 0 in a
6867                          section group.  We just warn it the first time
6868                          and ignore it afterwards.  */
6869                       static bfd_boolean warned = FALSE;
6870                       if (!warned)
6871                         {
6872                           error (_("section 0 in group section [%5u]\n"),
6873                                  section_headers_groups [entry]->group_index);
6874                           warned = TRUE;
6875                         }
6876                     }
6877                 }
6878
6879               section_headers_groups [entry] = group;
6880
6881               if (do_section_groups)
6882                 {
6883                   sec = filedata->section_headers + entry;
6884                   printf ("   [%5u]   %s\n", entry, printable_section_name (filedata, sec));
6885                 }
6886
6887               g = (struct group_list *) xmalloc (sizeof (struct group_list));
6888               g->section_index = entry;
6889               g->next = group->root;
6890               group->root = g;
6891             }
6892
6893           if (start)
6894             free (start);
6895
6896           group++;
6897         }
6898     }
6899
6900   if (symtab)
6901     free (symtab);
6902   if (strtab)
6903     free (strtab);
6904   return TRUE;
6905 }
6906
6907 /* Data used to display dynamic fixups.  */
6908
6909 struct ia64_vms_dynfixup
6910 {
6911   bfd_vma needed_ident;         /* Library ident number.  */
6912   bfd_vma needed;               /* Index in the dstrtab of the library name.  */
6913   bfd_vma fixup_needed;         /* Index of the library.  */
6914   bfd_vma fixup_rela_cnt;       /* Number of fixups.  */
6915   bfd_vma fixup_rela_off;       /* Fixups offset in the dynamic segment.  */
6916 };
6917
6918 /* Data used to display dynamic relocations.  */
6919
6920 struct ia64_vms_dynimgrela
6921 {
6922   bfd_vma img_rela_cnt;         /* Number of relocations.  */
6923   bfd_vma img_rela_off;         /* Reloc offset in the dynamic segment.  */
6924 };
6925
6926 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6927    library).  */
6928
6929 static bfd_boolean
6930 dump_ia64_vms_dynamic_fixups (Filedata *                  filedata,
6931                               struct ia64_vms_dynfixup *  fixup,
6932                               const char *                strtab,
6933                               unsigned int                strtab_sz)
6934 {
6935   Elf64_External_VMS_IMAGE_FIXUP * imfs;
6936   long i;
6937   const char * lib_name;
6938
6939   imfs = get_data (NULL, filedata, dynamic_addr + fixup->fixup_rela_off,
6940                    1, fixup->fixup_rela_cnt * sizeof (*imfs),
6941                    _("dynamic section image fixups"));
6942   if (!imfs)
6943     return FALSE;
6944
6945   if (fixup->needed < strtab_sz)
6946     lib_name = strtab + fixup->needed;
6947   else
6948     {
6949       warn (_("corrupt library name index of 0x%lx found in dynamic entry"),
6950             (unsigned long) fixup->needed);
6951       lib_name = "???";
6952     }
6953   printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6954           (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6955   printf
6956     (_("Seg Offset           Type                             SymVec DataType\n"));
6957
6958   for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6959     {
6960       unsigned int type;
6961       const char *rtype;
6962
6963       printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6964       printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6965       type = BYTE_GET (imfs [i].type);
6966       rtype = elf_ia64_reloc_type (type);
6967       if (rtype == NULL)
6968         printf (" 0x%08x                       ", type);
6969       else
6970         printf (" %-32s ", rtype);
6971       printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6972       printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6973     }
6974
6975   free (imfs);
6976   return TRUE;
6977 }
6978
6979 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
6980
6981 static bfd_boolean
6982 dump_ia64_vms_dynamic_relocs (Filedata * filedata, struct ia64_vms_dynimgrela *imgrela)
6983 {
6984   Elf64_External_VMS_IMAGE_RELA *imrs;
6985   long i;
6986
6987   imrs = get_data (NULL, filedata, dynamic_addr + imgrela->img_rela_off,
6988                    1, imgrela->img_rela_cnt * sizeof (*imrs),
6989                    _("dynamic section image relocations"));
6990   if (!imrs)
6991     return FALSE;
6992
6993   printf (_("\nImage relocs\n"));
6994   printf
6995     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
6996
6997   for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6998     {
6999       unsigned int type;
7000       const char *rtype;
7001
7002       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
7003       printf ("%08" BFD_VMA_FMT "x ",
7004               (bfd_vma) BYTE_GET (imrs [i].rela_offset));
7005       type = BYTE_GET (imrs [i].type);
7006       rtype = elf_ia64_reloc_type (type);
7007       if (rtype == NULL)
7008         printf ("0x%08x                      ", type);
7009       else
7010         printf ("%-31s ", rtype);
7011       print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
7012       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
7013       printf ("%08" BFD_VMA_FMT "x\n",
7014               (bfd_vma) BYTE_GET (imrs [i].sym_offset));
7015     }
7016
7017   free (imrs);
7018   return TRUE;
7019 }
7020
7021 /* Display IA-64 OpenVMS dynamic relocations and fixups.  */
7022
7023 static bfd_boolean
7024 process_ia64_vms_dynamic_relocs (Filedata * filedata)
7025 {
7026   struct ia64_vms_dynfixup fixup;
7027   struct ia64_vms_dynimgrela imgrela;
7028   Elf_Internal_Dyn *entry;
7029   bfd_vma strtab_off = 0;
7030   bfd_vma strtab_sz = 0;
7031   char *strtab = NULL;
7032   bfd_boolean res = TRUE;
7033
7034   memset (&fixup, 0, sizeof (fixup));
7035   memset (&imgrela, 0, sizeof (imgrela));
7036
7037   /* Note: the order of the entries is specified by the OpenVMS specs.  */
7038   for (entry = dynamic_section;
7039        entry < dynamic_section + dynamic_nent;
7040        entry++)
7041     {
7042       switch (entry->d_tag)
7043         {
7044         case DT_IA_64_VMS_STRTAB_OFFSET:
7045           strtab_off = entry->d_un.d_val;
7046           break;
7047         case DT_STRSZ:
7048           strtab_sz = entry->d_un.d_val;
7049           if (strtab == NULL)
7050             strtab = get_data (NULL, filedata, dynamic_addr + strtab_off,
7051                                1, strtab_sz, _("dynamic string section"));
7052           break;
7053
7054         case DT_IA_64_VMS_NEEDED_IDENT:
7055           fixup.needed_ident = entry->d_un.d_val;
7056           break;
7057         case DT_NEEDED:
7058           fixup.needed = entry->d_un.d_val;
7059           break;
7060         case DT_IA_64_VMS_FIXUP_NEEDED:
7061           fixup.fixup_needed = entry->d_un.d_val;
7062           break;
7063         case DT_IA_64_VMS_FIXUP_RELA_CNT:
7064           fixup.fixup_rela_cnt = entry->d_un.d_val;
7065           break;
7066         case DT_IA_64_VMS_FIXUP_RELA_OFF:
7067           fixup.fixup_rela_off = entry->d_un.d_val;
7068           if (! dump_ia64_vms_dynamic_fixups (filedata, &fixup, strtab, strtab_sz))
7069             res = FALSE;
7070           break;
7071         case DT_IA_64_VMS_IMG_RELA_CNT:
7072           imgrela.img_rela_cnt = entry->d_un.d_val;
7073           break;
7074         case DT_IA_64_VMS_IMG_RELA_OFF:
7075           imgrela.img_rela_off = entry->d_un.d_val;
7076           if (! dump_ia64_vms_dynamic_relocs (filedata, &imgrela))
7077             res = FALSE;
7078           break;
7079
7080         default:
7081           break;
7082         }
7083     }
7084
7085   if (strtab != NULL)
7086     free (strtab);
7087
7088   return res;
7089 }
7090
7091 static struct
7092 {
7093   const char * name;
7094   int reloc;
7095   int size;
7096   int rela;
7097 }
7098   dynamic_relocations [] =
7099 {
7100   { "REL", DT_REL, DT_RELSZ, FALSE },
7101   { "RELA", DT_RELA, DT_RELASZ, TRUE },
7102   { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
7103 };
7104
7105 /* Process the reloc section.  */
7106
7107 static bfd_boolean
7108 process_relocs (Filedata * filedata)
7109 {
7110   unsigned long rel_size;
7111   unsigned long rel_offset;
7112
7113   if (!do_reloc)
7114     return TRUE;
7115
7116   if (do_using_dynamic)
7117     {
7118       int          is_rela;
7119       const char * name;
7120       bfd_boolean  has_dynamic_reloc;
7121       unsigned int i;
7122
7123       has_dynamic_reloc = FALSE;
7124
7125       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7126         {
7127           is_rela = dynamic_relocations [i].rela;
7128           name = dynamic_relocations [i].name;
7129           rel_size = dynamic_info [dynamic_relocations [i].size];
7130           rel_offset = dynamic_info [dynamic_relocations [i].reloc];
7131
7132           if (rel_size)
7133             has_dynamic_reloc = TRUE;
7134
7135           if (is_rela == UNKNOWN)
7136             {
7137               if (dynamic_relocations [i].reloc == DT_JMPREL)
7138                 switch (dynamic_info[DT_PLTREL])
7139                   {
7140                   case DT_REL:
7141                     is_rela = FALSE;
7142                     break;
7143                   case DT_RELA:
7144                     is_rela = TRUE;
7145                     break;
7146                   }
7147             }
7148
7149           if (rel_size)
7150             {
7151               printf
7152                 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
7153                  name, rel_offset, rel_size);
7154
7155               dump_relocations (filedata,
7156                                 offset_from_vma (filedata, rel_offset, rel_size),
7157                                 rel_size,
7158                                 dynamic_symbols, num_dynamic_syms,
7159                                 dynamic_strings, dynamic_strings_length,
7160                                 is_rela, TRUE /* is_dynamic */);
7161             }
7162         }
7163
7164       if (is_ia64_vms (filedata))
7165         if (process_ia64_vms_dynamic_relocs (filedata))
7166           has_dynamic_reloc = TRUE;
7167
7168       if (! has_dynamic_reloc)
7169         printf (_("\nThere are no dynamic relocations in this file.\n"));
7170     }
7171   else
7172     {
7173       Elf_Internal_Shdr * section;
7174       unsigned long i;
7175       bfd_boolean found = FALSE;
7176
7177       for (i = 0, section = filedata->section_headers;
7178            i < filedata->file_header.e_shnum;
7179            i++, section++)
7180         {
7181           if (   section->sh_type != SHT_RELA
7182               && section->sh_type != SHT_REL)
7183             continue;
7184
7185           rel_offset = section->sh_offset;
7186           rel_size   = section->sh_size;
7187
7188           if (rel_size)
7189             {
7190               Elf_Internal_Shdr * strsec;
7191               int is_rela;
7192               unsigned long num_rela;
7193
7194               printf (_("\nRelocation section "));
7195
7196               if (filedata->string_table == NULL)
7197                 printf ("%d", section->sh_name);
7198               else
7199                 printf ("'%s'", printable_section_name (filedata, section));
7200
7201               num_rela = rel_size / section->sh_entsize;
7202               printf (ngettext (" at offset 0x%lx contains %lu entry:\n",
7203                                 " at offset 0x%lx contains %lu entries:\n",
7204                                 num_rela),
7205                       rel_offset, num_rela);
7206
7207               is_rela = section->sh_type == SHT_RELA;
7208
7209               if (section->sh_link != 0
7210                   && section->sh_link < filedata->file_header.e_shnum)
7211                 {
7212                   Elf_Internal_Shdr * symsec;
7213                   Elf_Internal_Sym *  symtab;
7214                   unsigned long nsyms;
7215                   unsigned long strtablen = 0;
7216                   char * strtab = NULL;
7217
7218                   symsec = filedata->section_headers + section->sh_link;
7219                   if (symsec->sh_type != SHT_SYMTAB
7220                       && symsec->sh_type != SHT_DYNSYM)
7221                     continue;
7222
7223                   symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
7224
7225                   if (symtab == NULL)
7226                     continue;
7227
7228                   if (symsec->sh_link != 0
7229                       && symsec->sh_link < filedata->file_header.e_shnum)
7230                     {
7231                       strsec = filedata->section_headers + symsec->sh_link;
7232
7233                       strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7234                                                   1, strsec->sh_size,
7235                                                   _("string table"));
7236                       strtablen = strtab == NULL ? 0 : strsec->sh_size;
7237                     }
7238
7239                   dump_relocations (filedata, rel_offset, rel_size,
7240                                     symtab, nsyms, strtab, strtablen,
7241                                     is_rela,
7242                                     symsec->sh_type == SHT_DYNSYM);
7243                   if (strtab)
7244                     free (strtab);
7245                   free (symtab);
7246                 }
7247               else
7248                 dump_relocations (filedata, rel_offset, rel_size,
7249                                   NULL, 0, NULL, 0, is_rela,
7250                                   FALSE /* is_dynamic */);
7251
7252               found = TRUE;
7253             }
7254         }
7255
7256       if (! found)
7257         {
7258           /* Users sometimes forget the -D option, so try to be helpful.  */
7259           for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7260             {
7261               if (dynamic_info [dynamic_relocations [i].size])
7262                 {
7263                   printf (_("\nThere are no static relocations in this file."));
7264                   printf (_("\nTo see the dynamic relocations add --use-dynamic to the command line.\n"));
7265
7266                   break;
7267                 }
7268             }
7269           if (i == ARRAY_SIZE (dynamic_relocations))
7270             printf (_("\nThere are no relocations in this file.\n"));
7271         }
7272     }
7273
7274   return TRUE;
7275 }
7276
7277 /* An absolute address consists of a section and an offset.  If the
7278    section is NULL, the offset itself is the address, otherwise, the
7279    address equals to LOAD_ADDRESS(section) + offset.  */
7280
7281 struct absaddr
7282 {
7283   unsigned short section;
7284   bfd_vma offset;
7285 };
7286
7287 #define ABSADDR(a) \
7288   ((a).section \
7289    ? filedata->section_headers [(a).section].sh_addr + (a).offset \
7290    : (a).offset)
7291
7292 /* Find the nearest symbol at or below ADDR.  Returns the symbol
7293    name, if found, and the offset from the symbol to ADDR.  */
7294
7295 static void
7296 find_symbol_for_address (Filedata *          filedata,
7297                          Elf_Internal_Sym *  symtab,
7298                          unsigned long       nsyms,
7299                          const char *        strtab,
7300                          unsigned long       strtab_size,
7301                          struct absaddr      addr,
7302                          const char **       symname,
7303                          bfd_vma *           offset)
7304 {
7305   bfd_vma dist = 0x100000;
7306   Elf_Internal_Sym * sym;
7307   Elf_Internal_Sym * beg;
7308   Elf_Internal_Sym * end;
7309   Elf_Internal_Sym * best = NULL;
7310
7311   REMOVE_ARCH_BITS (addr.offset);
7312   beg = symtab;
7313   end = symtab + nsyms;
7314
7315   while (beg < end)
7316     {
7317       bfd_vma value;
7318
7319       sym = beg + (end - beg) / 2;
7320
7321       value = sym->st_value;
7322       REMOVE_ARCH_BITS (value);
7323
7324       if (sym->st_name != 0
7325           && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
7326           && addr.offset >= value
7327           && addr.offset - value < dist)
7328         {
7329           best = sym;
7330           dist = addr.offset - value;
7331           if (!dist)
7332             break;
7333         }
7334
7335       if (addr.offset < value)
7336         end = sym;
7337       else
7338         beg = sym + 1;
7339     }
7340
7341   if (best)
7342     {
7343       *symname = (best->st_name >= strtab_size
7344                   ? _("<corrupt>") : strtab + best->st_name);
7345       *offset = dist;
7346       return;
7347     }
7348
7349   *symname = NULL;
7350   *offset = addr.offset;
7351 }
7352
7353 static /* signed */ int
7354 symcmp (const void *p, const void *q)
7355 {
7356   Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7357   Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7358
7359   return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7360 }
7361
7362 /* Process the unwind section.  */
7363
7364 #include "unwind-ia64.h"
7365
7366 struct ia64_unw_table_entry
7367 {
7368   struct absaddr start;
7369   struct absaddr end;
7370   struct absaddr info;
7371 };
7372
7373 struct ia64_unw_aux_info
7374 {
7375   struct ia64_unw_table_entry * table;          /* Unwind table.  */
7376   unsigned long                 table_len;      /* Length of unwind table.  */
7377   unsigned char *               info;           /* Unwind info.  */
7378   unsigned long                 info_size;      /* Size of unwind info.  */
7379   bfd_vma                       info_addr;      /* Starting address of unwind info.  */
7380   bfd_vma                       seg_base;       /* Starting address of segment.  */
7381   Elf_Internal_Sym *            symtab;         /* The symbol table.  */
7382   unsigned long                 nsyms;          /* Number of symbols.  */
7383   Elf_Internal_Sym *            funtab;         /* Sorted table of STT_FUNC symbols.  */
7384   unsigned long                 nfuns;          /* Number of entries in funtab.  */
7385   char *                        strtab;         /* The string table.  */
7386   unsigned long                 strtab_size;    /* Size of string table.  */
7387 };
7388
7389 static bfd_boolean
7390 dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
7391 {
7392   struct ia64_unw_table_entry * tp;
7393   unsigned long j, nfuns;
7394   int in_body;
7395   bfd_boolean res = TRUE;
7396
7397   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7398   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7399     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7400       aux->funtab[nfuns++] = aux->symtab[j];
7401   aux->nfuns = nfuns;
7402   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7403
7404   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7405     {
7406       bfd_vma stamp;
7407       bfd_vma offset;
7408       const unsigned char * dp;
7409       const unsigned char * head;
7410       const unsigned char * end;
7411       const char * procname;
7412
7413       find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7414                                aux->strtab_size, tp->start, &procname, &offset);
7415
7416       fputs ("\n<", stdout);
7417
7418       if (procname)
7419         {
7420           fputs (procname, stdout);
7421
7422           if (offset)
7423             printf ("+%lx", (unsigned long) offset);
7424         }
7425
7426       fputs (">: [", stdout);
7427       print_vma (tp->start.offset, PREFIX_HEX);
7428       fputc ('-', stdout);
7429       print_vma (tp->end.offset, PREFIX_HEX);
7430       printf ("], info at +0x%lx\n",
7431               (unsigned long) (tp->info.offset - aux->seg_base));
7432
7433       /* PR 17531: file: 86232b32.  */
7434       if (aux->info == NULL)
7435         continue;
7436
7437       /* PR 17531: file: 0997b4d1.  */
7438       if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7439         {
7440           warn (_("Invalid offset %lx in table entry %ld\n"),
7441                 (long) tp->info.offset, (long) (tp - aux->table));
7442           res = FALSE;
7443           continue;
7444         }
7445
7446       head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
7447       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7448
7449       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7450               (unsigned) UNW_VER (stamp),
7451               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7452               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7453               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7454               (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7455
7456       if (UNW_VER (stamp) != 1)
7457         {
7458           printf (_("\tUnknown version.\n"));
7459           continue;
7460         }
7461
7462       in_body = 0;
7463       end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7464       /* PR 17531: file: 16ceda89.  */
7465       if (end > aux->info + aux->info_size)
7466         end = aux->info + aux->info_size;
7467       for (dp = head + 8; dp < end;)
7468         dp = unw_decode (dp, in_body, & in_body, end);
7469     }
7470
7471   free (aux->funtab);
7472
7473   return res;
7474 }
7475
7476 static bfd_boolean
7477 slurp_ia64_unwind_table (Filedata *                  filedata,
7478                          struct ia64_unw_aux_info *  aux,
7479                          Elf_Internal_Shdr *         sec)
7480 {
7481   unsigned long size, nrelas, i;
7482   Elf_Internal_Phdr * seg;
7483   struct ia64_unw_table_entry * tep;
7484   Elf_Internal_Shdr * relsec;
7485   Elf_Internal_Rela * rela;
7486   Elf_Internal_Rela * rp;
7487   unsigned char * table;
7488   unsigned char * tp;
7489   Elf_Internal_Sym * sym;
7490   const char * relname;
7491
7492   aux->table_len = 0;
7493
7494   /* First, find the starting address of the segment that includes
7495      this section: */
7496
7497   if (filedata->file_header.e_phnum)
7498     {
7499       if (! get_program_headers (filedata))
7500           return FALSE;
7501
7502       for (seg = filedata->program_headers;
7503            seg < filedata->program_headers + filedata->file_header.e_phnum;
7504            ++seg)
7505         {
7506           if (seg->p_type != PT_LOAD)
7507             continue;
7508
7509           if (sec->sh_addr >= seg->p_vaddr
7510               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7511             {
7512               aux->seg_base = seg->p_vaddr;
7513               break;
7514             }
7515         }
7516     }
7517
7518   /* Second, build the unwind table from the contents of the unwind section:  */
7519   size = sec->sh_size;
7520   table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7521                                       _("unwind table"));
7522   if (!table)
7523     return FALSE;
7524
7525   aux->table_len = size / (3 * eh_addr_size);
7526   aux->table = (struct ia64_unw_table_entry *)
7527     xcmalloc (aux->table_len, sizeof (aux->table[0]));
7528   tep = aux->table;
7529
7530   for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7531     {
7532       tep->start.section = SHN_UNDEF;
7533       tep->end.section   = SHN_UNDEF;
7534       tep->info.section  = SHN_UNDEF;
7535       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7536       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7537       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7538       tep->start.offset += aux->seg_base;
7539       tep->end.offset   += aux->seg_base;
7540       tep->info.offset  += aux->seg_base;
7541     }
7542   free (table);
7543
7544   /* Third, apply any relocations to the unwind table:  */
7545   for (relsec = filedata->section_headers;
7546        relsec < filedata->section_headers + filedata->file_header.e_shnum;
7547        ++relsec)
7548     {
7549       if (relsec->sh_type != SHT_RELA
7550           || relsec->sh_info >= filedata->file_header.e_shnum
7551           || filedata->section_headers + relsec->sh_info != sec)
7552         continue;
7553
7554       if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
7555                               & rela, & nrelas))
7556         {
7557           free (aux->table);
7558           aux->table = NULL;
7559           aux->table_len = 0;
7560           return FALSE;
7561         }
7562
7563       for (rp = rela; rp < rela + nrelas; ++rp)
7564         {
7565           relname = elf_ia64_reloc_type (get_reloc_type (filedata, rp->r_info));
7566           sym = aux->symtab + get_reloc_symindex (rp->r_info);
7567
7568           /* PR 17531: file: 9fa67536.  */
7569           if (relname == NULL)
7570             {
7571               warn (_("Skipping unknown relocation type: %u\n"),
7572                     get_reloc_type (filedata, rp->r_info));
7573               continue;
7574             }
7575
7576           if (! const_strneq (relname, "R_IA64_SEGREL"))
7577             {
7578               warn (_("Skipping unexpected relocation type: %s\n"), relname);
7579               continue;
7580             }
7581
7582           i = rp->r_offset / (3 * eh_addr_size);
7583
7584           /* PR 17531: file: 5bc8d9bf.  */
7585           if (i >= aux->table_len)
7586             {
7587               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7588               continue;
7589             }
7590
7591           switch (rp->r_offset / eh_addr_size % 3)
7592             {
7593             case 0:
7594               aux->table[i].start.section = sym->st_shndx;
7595               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
7596               break;
7597             case 1:
7598               aux->table[i].end.section   = sym->st_shndx;
7599               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
7600               break;
7601             case 2:
7602               aux->table[i].info.section  = sym->st_shndx;
7603               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
7604               break;
7605             default:
7606               break;
7607             }
7608         }
7609
7610       free (rela);
7611     }
7612
7613   return TRUE;
7614 }
7615
7616 static bfd_boolean
7617 ia64_process_unwind (Filedata * filedata)
7618 {
7619   Elf_Internal_Shdr * sec;
7620   Elf_Internal_Shdr * unwsec = NULL;
7621   Elf_Internal_Shdr * strsec;
7622   unsigned long i, unwcount = 0, unwstart = 0;
7623   struct ia64_unw_aux_info aux;
7624   bfd_boolean res = TRUE;
7625
7626   memset (& aux, 0, sizeof (aux));
7627
7628   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
7629     {
7630       if (sec->sh_type == SHT_SYMTAB
7631           && sec->sh_link < filedata->file_header.e_shnum)
7632         {
7633           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
7634
7635           strsec = filedata->section_headers + sec->sh_link;
7636           if (aux.strtab != NULL)
7637             {
7638               error (_("Multiple auxillary string tables encountered\n"));
7639               free (aux.strtab);
7640               res = FALSE;
7641             }
7642           aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7643                                           1, strsec->sh_size,
7644                                           _("string table"));
7645           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7646         }
7647       else if (sec->sh_type == SHT_IA_64_UNWIND)
7648         unwcount++;
7649     }
7650
7651   if (!unwcount)
7652     printf (_("\nThere are no unwind sections in this file.\n"));
7653
7654   while (unwcount-- > 0)
7655     {
7656       char * suffix;
7657       size_t len, len2;
7658
7659       for (i = unwstart, sec = filedata->section_headers + unwstart, unwsec = NULL;
7660            i < filedata->file_header.e_shnum; ++i, ++sec)
7661         if (sec->sh_type == SHT_IA_64_UNWIND)
7662           {
7663             unwsec = sec;
7664             break;
7665           }
7666       /* We have already counted the number of SHT_IA64_UNWIND
7667          sections so the loop above should never fail.  */
7668       assert (unwsec != NULL);
7669
7670       unwstart = i + 1;
7671       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7672
7673       if ((unwsec->sh_flags & SHF_GROUP) != 0)
7674         {
7675           /* We need to find which section group it is in.  */
7676           struct group_list * g;
7677
7678           if (section_headers_groups == NULL
7679               || section_headers_groups [i] == NULL)
7680             i = filedata->file_header.e_shnum;
7681           else
7682             {
7683               g = section_headers_groups [i]->root;
7684
7685               for (; g != NULL; g = g->next)
7686                 {
7687                   sec = filedata->section_headers + g->section_index;
7688
7689                   if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7690                     break;
7691                 }
7692
7693               if (g == NULL)
7694                 i = filedata->file_header.e_shnum;
7695             }
7696         }
7697       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7698         {
7699           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
7700           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7701           suffix = SECTION_NAME (unwsec) + len;
7702           for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7703                ++i, ++sec)
7704             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7705                 && streq (SECTION_NAME (sec) + len2, suffix))
7706               break;
7707         }
7708       else
7709         {
7710           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7711              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
7712           len = sizeof (ELF_STRING_ia64_unwind) - 1;
7713           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7714           suffix = "";
7715           if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7716             suffix = SECTION_NAME (unwsec) + len;
7717           for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7718                ++i, ++sec)
7719             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7720                 && streq (SECTION_NAME (sec) + len2, suffix))
7721               break;
7722         }
7723
7724       if (i == filedata->file_header.e_shnum)
7725         {
7726           printf (_("\nCould not find unwind info section for "));
7727
7728           if (filedata->string_table == NULL)
7729             printf ("%d", unwsec->sh_name);
7730           else
7731             printf ("'%s'", printable_section_name (filedata, unwsec));
7732         }
7733       else
7734         {
7735           aux.info_addr = sec->sh_addr;
7736           aux.info = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1,
7737                                                  sec->sh_size,
7738                                                  _("unwind info"));
7739           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7740
7741           printf (_("\nUnwind section "));
7742
7743           if (filedata->string_table == NULL)
7744             printf ("%d", unwsec->sh_name);
7745           else
7746             printf ("'%s'", printable_section_name (filedata, unwsec));
7747
7748           printf (_(" at offset 0x%lx contains %lu entries:\n"),
7749                   (unsigned long) unwsec->sh_offset,
7750                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7751
7752           if (slurp_ia64_unwind_table (filedata, & aux, unwsec)
7753               && aux.table_len > 0)
7754             dump_ia64_unwind (filedata, & aux);
7755
7756           if (aux.table)
7757             free ((char *) aux.table);
7758           if (aux.info)
7759             free ((char *) aux.info);
7760           aux.table = NULL;
7761           aux.info = NULL;
7762         }
7763     }
7764
7765   if (aux.symtab)
7766     free (aux.symtab);
7767   if (aux.strtab)
7768     free ((char *) aux.strtab);
7769
7770   return res;
7771 }
7772
7773 struct hppa_unw_table_entry
7774 {
7775   struct absaddr start;
7776   struct absaddr end;
7777   unsigned int Cannot_unwind:1;                 /* 0 */
7778   unsigned int Millicode:1;                     /* 1 */
7779   unsigned int Millicode_save_sr0:1;            /* 2 */
7780   unsigned int Region_description:2;            /* 3..4 */
7781   unsigned int reserved1:1;                     /* 5 */
7782   unsigned int Entry_SR:1;                      /* 6 */
7783   unsigned int Entry_FR:4;     /* Number saved     7..10 */
7784   unsigned int Entry_GR:5;     /* Number saved     11..15 */
7785   unsigned int Args_stored:1;                   /* 16 */
7786   unsigned int Variable_Frame:1;                /* 17 */
7787   unsigned int Separate_Package_Body:1;         /* 18 */
7788   unsigned int Frame_Extension_Millicode:1;     /* 19 */
7789   unsigned int Stack_Overflow_Check:1;          /* 20 */
7790   unsigned int Two_Instruction_SP_Increment:1;  /* 21 */
7791   unsigned int Ada_Region:1;                    /* 22 */
7792   unsigned int cxx_info:1;                      /* 23 */
7793   unsigned int cxx_try_catch:1;                 /* 24 */
7794   unsigned int sched_entry_seq:1;               /* 25 */
7795   unsigned int reserved2:1;                     /* 26 */
7796   unsigned int Save_SP:1;                       /* 27 */
7797   unsigned int Save_RP:1;                       /* 28 */
7798   unsigned int Save_MRP_in_frame:1;             /* 29 */
7799   unsigned int extn_ptr_defined:1;              /* 30 */
7800   unsigned int Cleanup_defined:1;               /* 31 */
7801
7802   unsigned int MPE_XL_interrupt_marker:1;       /* 0 */
7803   unsigned int HP_UX_interrupt_marker:1;        /* 1 */
7804   unsigned int Large_frame:1;                   /* 2 */
7805   unsigned int Pseudo_SP_Set:1;                 /* 3 */
7806   unsigned int reserved4:1;                     /* 4 */
7807   unsigned int Total_frame_size:27;             /* 5..31 */
7808 };
7809
7810 struct hppa_unw_aux_info
7811 {
7812   struct hppa_unw_table_entry *  table;         /* Unwind table.  */
7813   unsigned long                  table_len;     /* Length of unwind table.  */
7814   bfd_vma                        seg_base;      /* Starting address of segment.  */
7815   Elf_Internal_Sym *             symtab;        /* The symbol table.  */
7816   unsigned long                  nsyms;         /* Number of symbols.  */
7817   Elf_Internal_Sym *             funtab;        /* Sorted table of STT_FUNC symbols.  */
7818   unsigned long                  nfuns;         /* Number of entries in funtab.  */
7819   char *                         strtab;        /* The string table.  */
7820   unsigned long                  strtab_size;   /* Size of string table.  */
7821 };
7822
7823 static bfd_boolean
7824 dump_hppa_unwind (Filedata * filedata, struct hppa_unw_aux_info * aux)
7825 {
7826   struct hppa_unw_table_entry * tp;
7827   unsigned long j, nfuns;
7828   bfd_boolean res = TRUE;
7829
7830   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7831   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7832     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7833       aux->funtab[nfuns++] = aux->symtab[j];
7834   aux->nfuns = nfuns;
7835   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7836
7837   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7838     {
7839       bfd_vma offset;
7840       const char * procname;
7841
7842       find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7843                                aux->strtab_size, tp->start, &procname,
7844                                &offset);
7845
7846       fputs ("\n<", stdout);
7847
7848       if (procname)
7849         {
7850           fputs (procname, stdout);
7851
7852           if (offset)
7853             printf ("+%lx", (unsigned long) offset);
7854         }
7855
7856       fputs (">: [", stdout);
7857       print_vma (tp->start.offset, PREFIX_HEX);
7858       fputc ('-', stdout);
7859       print_vma (tp->end.offset, PREFIX_HEX);
7860       printf ("]\n\t");
7861
7862 #define PF(_m) if (tp->_m) printf (#_m " ");
7863 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7864       PF(Cannot_unwind);
7865       PF(Millicode);
7866       PF(Millicode_save_sr0);
7867       /* PV(Region_description);  */
7868       PF(Entry_SR);
7869       PV(Entry_FR);
7870       PV(Entry_GR);
7871       PF(Args_stored);
7872       PF(Variable_Frame);
7873       PF(Separate_Package_Body);
7874       PF(Frame_Extension_Millicode);
7875       PF(Stack_Overflow_Check);
7876       PF(Two_Instruction_SP_Increment);
7877       PF(Ada_Region);
7878       PF(cxx_info);
7879       PF(cxx_try_catch);
7880       PF(sched_entry_seq);
7881       PF(Save_SP);
7882       PF(Save_RP);
7883       PF(Save_MRP_in_frame);
7884       PF(extn_ptr_defined);
7885       PF(Cleanup_defined);
7886       PF(MPE_XL_interrupt_marker);
7887       PF(HP_UX_interrupt_marker);
7888       PF(Large_frame);
7889       PF(Pseudo_SP_Set);
7890       PV(Total_frame_size);
7891 #undef PF
7892 #undef PV
7893     }
7894
7895   printf ("\n");
7896
7897   free (aux->funtab);
7898
7899   return res;
7900 }
7901
7902 static bfd_boolean
7903 slurp_hppa_unwind_table (Filedata *                  filedata,
7904                          struct hppa_unw_aux_info *  aux,
7905                          Elf_Internal_Shdr *         sec)
7906 {
7907   unsigned long size, unw_ent_size, nentries, nrelas, i;
7908   Elf_Internal_Phdr * seg;
7909   struct hppa_unw_table_entry * tep;
7910   Elf_Internal_Shdr * relsec;
7911   Elf_Internal_Rela * rela;
7912   Elf_Internal_Rela * rp;
7913   unsigned char * table;
7914   unsigned char * tp;
7915   Elf_Internal_Sym * sym;
7916   const char * relname;
7917
7918   /* First, find the starting address of the segment that includes
7919      this section.  */
7920   if (filedata->file_header.e_phnum)
7921     {
7922       if (! get_program_headers (filedata))
7923         return FALSE;
7924
7925       for (seg = filedata->program_headers;
7926            seg < filedata->program_headers + filedata->file_header.e_phnum;
7927            ++seg)
7928         {
7929           if (seg->p_type != PT_LOAD)
7930             continue;
7931
7932           if (sec->sh_addr >= seg->p_vaddr
7933               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7934             {
7935               aux->seg_base = seg->p_vaddr;
7936               break;
7937             }
7938         }
7939     }
7940
7941   /* Second, build the unwind table from the contents of the unwind
7942      section.  */
7943   size = sec->sh_size;
7944   table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7945                                       _("unwind table"));
7946   if (!table)
7947     return FALSE;
7948
7949   unw_ent_size = 16;
7950   nentries = size / unw_ent_size;
7951   size = unw_ent_size * nentries;
7952
7953   tep = aux->table = (struct hppa_unw_table_entry *)
7954       xcmalloc (nentries, sizeof (aux->table[0]));
7955
7956   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7957     {
7958       unsigned int tmp1, tmp2;
7959
7960       tep->start.section = SHN_UNDEF;
7961       tep->end.section   = SHN_UNDEF;
7962
7963       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7964       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7965       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7966       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7967
7968       tep->start.offset += aux->seg_base;
7969       tep->end.offset   += aux->seg_base;
7970
7971       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7972       tep->Millicode = (tmp1 >> 30) & 0x1;
7973       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7974       tep->Region_description = (tmp1 >> 27) & 0x3;
7975       tep->reserved1 = (tmp1 >> 26) & 0x1;
7976       tep->Entry_SR = (tmp1 >> 25) & 0x1;
7977       tep->Entry_FR = (tmp1 >> 21) & 0xf;
7978       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7979       tep->Args_stored = (tmp1 >> 15) & 0x1;
7980       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7981       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7982       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7983       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7984       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7985       tep->Ada_Region = (tmp1 >> 9) & 0x1;
7986       tep->cxx_info = (tmp1 >> 8) & 0x1;
7987       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7988       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7989       tep->reserved2 = (tmp1 >> 5) & 0x1;
7990       tep->Save_SP = (tmp1 >> 4) & 0x1;
7991       tep->Save_RP = (tmp1 >> 3) & 0x1;
7992       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7993       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7994       tep->Cleanup_defined = tmp1 & 0x1;
7995
7996       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7997       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7998       tep->Large_frame = (tmp2 >> 29) & 0x1;
7999       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
8000       tep->reserved4 = (tmp2 >> 27) & 0x1;
8001       tep->Total_frame_size = tmp2 & 0x7ffffff;
8002     }
8003   free (table);
8004
8005   /* Third, apply any relocations to the unwind table.  */
8006   for (relsec = filedata->section_headers;
8007        relsec < filedata->section_headers + filedata->file_header.e_shnum;
8008        ++relsec)
8009     {
8010       if (relsec->sh_type != SHT_RELA
8011           || relsec->sh_info >= filedata->file_header.e_shnum
8012           || filedata->section_headers + relsec->sh_info != sec)
8013         continue;
8014
8015       if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
8016                               & rela, & nrelas))
8017         return FALSE;
8018
8019       for (rp = rela; rp < rela + nrelas; ++rp)
8020         {
8021           relname = elf_hppa_reloc_type (get_reloc_type (filedata, rp->r_info));
8022           sym = aux->symtab + get_reloc_symindex (rp->r_info);
8023
8024           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
8025           if (! const_strneq (relname, "R_PARISC_SEGREL"))
8026             {
8027               warn (_("Skipping unexpected relocation type %s\n"), relname);
8028               continue;
8029             }
8030
8031           i = rp->r_offset / unw_ent_size;
8032
8033           switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
8034             {
8035             case 0:
8036               aux->table[i].start.section = sym->st_shndx;
8037               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
8038               break;
8039             case 1:
8040               aux->table[i].end.section   = sym->st_shndx;
8041               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
8042               break;
8043             default:
8044               break;
8045             }
8046         }
8047
8048       free (rela);
8049     }
8050
8051   aux->table_len = nentries;
8052
8053   return TRUE;
8054 }
8055
8056 static bfd_boolean
8057 hppa_process_unwind (Filedata * filedata)
8058 {
8059   struct hppa_unw_aux_info aux;
8060   Elf_Internal_Shdr * unwsec = NULL;
8061   Elf_Internal_Shdr * strsec;
8062   Elf_Internal_Shdr * sec;
8063   unsigned long i;
8064   bfd_boolean res = TRUE;
8065
8066   if (filedata->string_table == NULL)
8067     return FALSE;
8068
8069   memset (& aux, 0, sizeof (aux));
8070
8071   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8072     {
8073       if (sec->sh_type == SHT_SYMTAB
8074           && sec->sh_link < filedata->file_header.e_shnum)
8075         {
8076           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
8077
8078           strsec = filedata->section_headers + sec->sh_link;
8079           if (aux.strtab != NULL)
8080             {
8081               error (_("Multiple auxillary string tables encountered\n"));
8082               free (aux.strtab);
8083               res = FALSE;
8084             }
8085           aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
8086                                           1, strsec->sh_size,
8087                                           _("string table"));
8088           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8089         }
8090       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8091         unwsec = sec;
8092     }
8093
8094   if (!unwsec)
8095     printf (_("\nThere are no unwind sections in this file.\n"));
8096
8097   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8098     {
8099       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8100         {
8101           unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size + 8);
8102
8103           printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
8104                             "contains %lu entry:\n",
8105                             "\nUnwind section '%s' at offset 0x%lx "
8106                             "contains %lu entries:\n",
8107                             num_unwind),
8108                   printable_section_name (filedata, sec),
8109                   (unsigned long) sec->sh_offset,
8110                   num_unwind);
8111
8112           if (! slurp_hppa_unwind_table (filedata, &aux, sec))
8113             res = FALSE;
8114         
8115           if (aux.table_len > 0)
8116             {
8117               if (! dump_hppa_unwind (filedata, &aux))
8118                 res = FALSE;
8119             }
8120
8121           if (aux.table)
8122             free ((char *) aux.table);
8123           aux.table = NULL;
8124         }
8125     }
8126
8127   if (aux.symtab)
8128     free (aux.symtab);
8129   if (aux.strtab)
8130     free ((char *) aux.strtab);
8131
8132   return res;
8133 }
8134
8135 struct arm_section
8136 {
8137   unsigned char *      data;            /* The unwind data.  */
8138   Elf_Internal_Shdr *  sec;             /* The cached unwind section header.  */
8139   Elf_Internal_Rela *  rela;            /* The cached relocations for this section.  */
8140   unsigned long        nrelas;          /* The number of relocations.  */
8141   unsigned int         rel_type;        /* REL or RELA ?  */
8142   Elf_Internal_Rela *  next_rela;       /* Cyclic pointer to the next reloc to process.  */
8143 };
8144
8145 struct arm_unw_aux_info
8146 {
8147   Filedata *          filedata;         /* The file containing the unwind sections.  */
8148   Elf_Internal_Sym *  symtab;           /* The file's symbol table.  */
8149   unsigned long       nsyms;            /* Number of symbols.  */
8150   Elf_Internal_Sym *  funtab;           /* Sorted table of STT_FUNC symbols.  */
8151   unsigned long       nfuns;            /* Number of these symbols.  */
8152   char *              strtab;           /* The file's string table.  */
8153   unsigned long       strtab_size;      /* Size of string table.  */
8154 };
8155
8156 static const char *
8157 arm_print_vma_and_name (Filedata *                 filedata,
8158                         struct arm_unw_aux_info *  aux,
8159                         bfd_vma                    fn,
8160                         struct absaddr             addr)
8161 {
8162   const char *procname;
8163   bfd_vma sym_offset;
8164
8165   if (addr.section == SHN_UNDEF)
8166     addr.offset = fn;
8167
8168   find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
8169                            aux->strtab_size, addr, &procname,
8170                            &sym_offset);
8171
8172   print_vma (fn, PREFIX_HEX);
8173
8174   if (procname)
8175     {
8176       fputs (" <", stdout);
8177       fputs (procname, stdout);
8178
8179       if (sym_offset)
8180         printf ("+0x%lx", (unsigned long) sym_offset);
8181       fputc ('>', stdout);
8182     }
8183
8184   return procname;
8185 }
8186
8187 static void
8188 arm_free_section (struct arm_section *arm_sec)
8189 {
8190   if (arm_sec->data != NULL)
8191     free (arm_sec->data);
8192
8193   if (arm_sec->rela != NULL)
8194     free (arm_sec->rela);
8195 }
8196
8197 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
8198       cached section and install SEC instead.
8199    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
8200       and return its valued in * WORDP, relocating if necessary.
8201    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
8202       relocation's offset in ADDR.
8203    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
8204       into the string table of the symbol associated with the reloc.  If no
8205       reloc was applied store -1 there.
8206    5) Return TRUE upon success, FALSE otherwise.  */
8207
8208 static bfd_boolean
8209 get_unwind_section_word (Filedata *                 filedata,
8210                          struct arm_unw_aux_info *  aux,
8211                          struct arm_section *       arm_sec,
8212                          Elf_Internal_Shdr *        sec,
8213                          bfd_vma                    word_offset,
8214                          unsigned int *             wordp,
8215                          struct absaddr *           addr,
8216                          bfd_vma *                  sym_name)
8217 {
8218   Elf_Internal_Rela *rp;
8219   Elf_Internal_Sym *sym;
8220   const char * relname;
8221   unsigned int word;
8222   bfd_boolean wrapped;
8223
8224   if (sec == NULL || arm_sec == NULL)
8225     return FALSE;
8226
8227   addr->section = SHN_UNDEF;
8228   addr->offset = 0;
8229
8230   if (sym_name != NULL)
8231     *sym_name = (bfd_vma) -1;
8232
8233   /* If necessary, update the section cache.  */
8234   if (sec != arm_sec->sec)
8235     {
8236       Elf_Internal_Shdr *relsec;
8237
8238       arm_free_section (arm_sec);
8239
8240       arm_sec->sec = sec;
8241       arm_sec->data = get_data (NULL, aux->filedata, sec->sh_offset, 1,
8242                                 sec->sh_size, _("unwind data"));
8243       arm_sec->rela = NULL;
8244       arm_sec->nrelas = 0;
8245
8246       for (relsec = filedata->section_headers;
8247            relsec < filedata->section_headers + filedata->file_header.e_shnum;
8248            ++relsec)
8249         {
8250           if (relsec->sh_info >= filedata->file_header.e_shnum
8251               || filedata->section_headers + relsec->sh_info != sec
8252               /* PR 15745: Check the section type as well.  */
8253               || (relsec->sh_type != SHT_REL
8254                   && relsec->sh_type != SHT_RELA))
8255             continue;
8256
8257           arm_sec->rel_type = relsec->sh_type;
8258           if (relsec->sh_type == SHT_REL)
8259             {
8260               if (!slurp_rel_relocs (aux->filedata, relsec->sh_offset,
8261                                      relsec->sh_size,
8262                                      & arm_sec->rela, & arm_sec->nrelas))
8263                 return FALSE;
8264             }
8265           else /* relsec->sh_type == SHT_RELA */
8266             {
8267               if (!slurp_rela_relocs (aux->filedata, relsec->sh_offset,
8268                                       relsec->sh_size,
8269                                       & arm_sec->rela, & arm_sec->nrelas))
8270                 return FALSE;
8271             }
8272           break;
8273         }
8274
8275       arm_sec->next_rela = arm_sec->rela;
8276     }
8277
8278   /* If there is no unwind data we can do nothing.  */
8279   if (arm_sec->data == NULL)
8280     return FALSE;
8281
8282   /* If the offset is invalid then fail.  */
8283   if (/* PR 21343 *//* PR 18879 */
8284       sec->sh_size < 4
8285       || word_offset > (sec->sh_size - 4)
8286       || ((bfd_signed_vma) word_offset) < 0)
8287     return FALSE;
8288
8289   /* Get the word at the required offset.  */
8290   word = byte_get (arm_sec->data + word_offset, 4);
8291
8292   /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128.  */
8293   if (arm_sec->rela == NULL)
8294     {
8295       * wordp = word;
8296       return TRUE;
8297     }
8298
8299   /* Look through the relocs to find the one that applies to the provided offset.  */
8300   wrapped = FALSE;
8301   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
8302     {
8303       bfd_vma prelval, offset;
8304
8305       if (rp->r_offset > word_offset && !wrapped)
8306         {
8307           rp = arm_sec->rela;
8308           wrapped = TRUE;
8309         }
8310       if (rp->r_offset > word_offset)
8311         break;
8312
8313       if (rp->r_offset & 3)
8314         {
8315           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8316                 (unsigned long) rp->r_offset);
8317           continue;
8318         }
8319
8320       if (rp->r_offset < word_offset)
8321         continue;
8322
8323       /* PR 17531: file: 027-161405-0.004  */
8324       if (aux->symtab == NULL)
8325         continue;
8326
8327       if (arm_sec->rel_type == SHT_REL)
8328         {
8329           offset = word & 0x7fffffff;
8330           if (offset & 0x40000000)
8331             offset |= ~ (bfd_vma) 0x7fffffff;
8332         }
8333       else if (arm_sec->rel_type == SHT_RELA)
8334         offset = rp->r_addend;
8335       else
8336         {
8337           error (_("Unknown section relocation type %d encountered\n"),
8338                  arm_sec->rel_type);
8339           break;
8340         }
8341
8342       /* PR 17531 file: 027-1241568-0.004.  */
8343       if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8344         {
8345           error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8346                  (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8347           break;
8348         }
8349
8350       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
8351       offset += sym->st_value;
8352       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8353
8354       /* Check that we are processing the expected reloc type.  */
8355       if (filedata->file_header.e_machine == EM_ARM)
8356         {
8357           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
8358           if (relname == NULL)
8359             {
8360               warn (_("Skipping unknown ARM relocation type: %d\n"),
8361                     (int) ELF32_R_TYPE (rp->r_info));
8362               continue;
8363             }
8364
8365           if (streq (relname, "R_ARM_NONE"))
8366               continue;
8367
8368           if (! streq (relname, "R_ARM_PREL31"))
8369             {
8370               warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
8371               continue;
8372             }
8373         }
8374       else if (filedata->file_header.e_machine == EM_TI_C6000)
8375         {
8376           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
8377           if (relname == NULL)
8378             {
8379               warn (_("Skipping unknown C6000 relocation type: %d\n"),
8380                     (int) ELF32_R_TYPE (rp->r_info));
8381               continue;
8382             }
8383
8384           if (streq (relname, "R_C6000_NONE"))
8385             continue;
8386
8387           if (! streq (relname, "R_C6000_PREL31"))
8388             {
8389               warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
8390               continue;
8391             }
8392
8393           prelval >>= 1;
8394         }
8395       else
8396         {
8397           /* This function currently only supports ARM and TI unwinders.  */
8398           warn (_("Only TI and ARM unwinders are currently supported\n"));
8399           break;
8400         }
8401
8402       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8403       addr->section = sym->st_shndx;
8404       addr->offset = offset;
8405
8406       if (sym_name)
8407         * sym_name = sym->st_name;
8408       break;
8409     }
8410
8411   *wordp = word;
8412   arm_sec->next_rela = rp;
8413
8414   return TRUE;
8415 }
8416
8417 static const char *tic6x_unwind_regnames[16] =
8418 {
8419   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8420   "A14", "A13", "A12", "A11", "A10",
8421   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8422 };
8423
8424 static void
8425 decode_tic6x_unwind_regmask (unsigned int mask)
8426 {
8427   int i;
8428
8429   for (i = 12; mask; mask >>= 1, i--)
8430     {
8431       if (mask & 1)
8432         {
8433           fputs (tic6x_unwind_regnames[i], stdout);
8434           if (mask > 1)
8435             fputs (", ", stdout);
8436         }
8437     }
8438 }
8439
8440 #define ADVANCE                                                 \
8441   if (remaining == 0 && more_words)                             \
8442     {                                                           \
8443       data_offset += 4;                                         \
8444       if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec,     \
8445                                      data_offset, & word, & addr, NULL))        \
8446         return FALSE;                                           \
8447       remaining = 4;                                            \
8448       more_words--;                                             \
8449     }                                                           \
8450
8451 #define GET_OP(OP)                      \
8452   ADVANCE;                              \
8453   if (remaining)                        \
8454     {                                   \
8455       remaining--;                      \
8456       (OP) = word >> 24;                \
8457       word <<= 8;                       \
8458     }                                   \
8459   else                                  \
8460     {                                   \
8461       printf (_("[Truncated opcode]\n"));       \
8462       return FALSE;                     \
8463     }                                   \
8464   printf ("0x%02x ", OP)
8465
8466 static bfd_boolean
8467 decode_arm_unwind_bytecode (Filedata *                 filedata,
8468                             struct arm_unw_aux_info *  aux,
8469                             unsigned int               word,
8470                             unsigned int               remaining,
8471                             unsigned int               more_words,
8472                             bfd_vma                    data_offset,
8473                             Elf_Internal_Shdr *        data_sec,
8474                             struct arm_section *       data_arm_sec)
8475 {
8476   struct absaddr addr;
8477   bfd_boolean res = TRUE;
8478
8479   /* Decode the unwinding instructions.  */
8480   while (1)
8481     {
8482       unsigned int op, op2;
8483
8484       ADVANCE;
8485       if (remaining == 0)
8486         break;
8487       remaining--;
8488       op = word >> 24;
8489       word <<= 8;
8490
8491       printf ("  0x%02x ", op);
8492
8493       if ((op & 0xc0) == 0x00)
8494         {
8495           int offset = ((op & 0x3f) << 2) + 4;
8496
8497           printf ("     vsp = vsp + %d", offset);
8498         }
8499       else if ((op & 0xc0) == 0x40)
8500         {
8501           int offset = ((op & 0x3f) << 2) + 4;
8502
8503           printf ("     vsp = vsp - %d", offset);
8504         }
8505       else if ((op & 0xf0) == 0x80)
8506         {
8507           GET_OP (op2);
8508           if (op == 0x80 && op2 == 0)
8509             printf (_("Refuse to unwind"));
8510           else
8511             {
8512               unsigned int mask = ((op & 0x0f) << 8) | op2;
8513               bfd_boolean first = TRUE;
8514               int i;
8515
8516               printf ("pop {");
8517               for (i = 0; i < 12; i++)
8518                 if (mask & (1 << i))
8519                   {
8520                     if (first)
8521                       first = FALSE;
8522                     else
8523                       printf (", ");
8524                     printf ("r%d", 4 + i);
8525                   }
8526               printf ("}");
8527             }
8528         }
8529       else if ((op & 0xf0) == 0x90)
8530         {
8531           if (op == 0x9d || op == 0x9f)
8532             printf (_("     [Reserved]"));
8533           else
8534             printf ("     vsp = r%d", op & 0x0f);
8535         }
8536       else if ((op & 0xf0) == 0xa0)
8537         {
8538           int end = 4 + (op & 0x07);
8539           bfd_boolean first = TRUE;
8540           int i;
8541
8542           printf ("     pop {");
8543           for (i = 4; i <= end; i++)
8544             {
8545               if (first)
8546                 first = FALSE;
8547               else
8548                 printf (", ");
8549               printf ("r%d", i);
8550             }
8551           if (op & 0x08)
8552             {
8553               if (!first)
8554                 printf (", ");
8555               printf ("r14");
8556             }
8557           printf ("}");
8558         }
8559       else if (op == 0xb0)
8560         printf (_("     finish"));
8561       else if (op == 0xb1)
8562         {
8563           GET_OP (op2);
8564           if (op2 == 0 || (op2 & 0xf0) != 0)
8565             printf (_("[Spare]"));
8566           else
8567             {
8568               unsigned int mask = op2 & 0x0f;
8569               bfd_boolean first = TRUE;
8570               int i;
8571
8572               printf ("pop {");
8573               for (i = 0; i < 12; i++)
8574                 if (mask & (1 << i))
8575                   {
8576                     if (first)
8577                       first = FALSE;
8578                     else
8579                       printf (", ");
8580                     printf ("r%d", i);
8581                   }
8582               printf ("}");
8583             }
8584         }
8585       else if (op == 0xb2)
8586         {
8587           unsigned char buf[9];
8588           unsigned int i, len;
8589           unsigned long offset;
8590
8591           for (i = 0; i < sizeof (buf); i++)
8592             {
8593               GET_OP (buf[i]);
8594               if ((buf[i] & 0x80) == 0)
8595                 break;
8596             }
8597           if (i == sizeof (buf))
8598             {
8599               error (_("corrupt change to vsp"));
8600               res = FALSE;
8601             }
8602           else
8603             {
8604               offset = read_uleb128 (buf, &len, buf + i + 1);
8605               assert (len == i + 1);
8606               offset = offset * 4 + 0x204;
8607               printf ("vsp = vsp + %ld", offset);
8608             }
8609         }
8610       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8611         {
8612           unsigned int first, last;
8613
8614           GET_OP (op2);
8615           first = op2 >> 4;
8616           last = op2 & 0x0f;
8617           if (op == 0xc8)
8618             first = first + 16;
8619           printf ("pop {D%d", first);
8620           if (last)
8621             printf ("-D%d", first + last);
8622           printf ("}");
8623         }
8624       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8625         {
8626           unsigned int count = op & 0x07;
8627
8628           printf ("pop {D8");
8629           if (count)
8630             printf ("-D%d", 8 + count);
8631           printf ("}");
8632         }
8633       else if (op >= 0xc0 && op <= 0xc5)
8634         {
8635           unsigned int count = op & 0x07;
8636
8637           printf ("     pop {wR10");
8638           if (count)
8639             printf ("-wR%d", 10 + count);
8640           printf ("}");
8641         }
8642       else if (op == 0xc6)
8643         {
8644           unsigned int first, last;
8645
8646           GET_OP (op2);
8647           first = op2 >> 4;
8648           last = op2 & 0x0f;
8649           printf ("pop {wR%d", first);
8650           if (last)
8651             printf ("-wR%d", first + last);
8652           printf ("}");
8653         }
8654       else if (op == 0xc7)
8655         {
8656           GET_OP (op2);
8657           if (op2 == 0 || (op2 & 0xf0) != 0)
8658             printf (_("[Spare]"));
8659           else
8660             {
8661               unsigned int mask = op2 & 0x0f;
8662               bfd_boolean first = TRUE;
8663               int i;
8664
8665               printf ("pop {");
8666               for (i = 0; i < 4; i++)
8667                 if (mask & (1 << i))
8668                   {
8669                     if (first)
8670                       first = FALSE;
8671                     else
8672                       printf (", ");
8673                     printf ("wCGR%d", i);
8674                   }
8675               printf ("}");
8676             }
8677         }
8678       else
8679         {
8680           printf (_("     [unsupported opcode]"));
8681           res = FALSE;
8682         }
8683
8684       printf ("\n");
8685     }
8686
8687   return res;
8688 }
8689
8690 static bfd_boolean
8691 decode_tic6x_unwind_bytecode (Filedata *                 filedata,
8692                               struct arm_unw_aux_info *  aux,
8693                               unsigned int               word,
8694                               unsigned int               remaining,
8695                               unsigned int               more_words,
8696                               bfd_vma                    data_offset,
8697                               Elf_Internal_Shdr *        data_sec,
8698                               struct arm_section *       data_arm_sec)
8699 {
8700   struct absaddr addr;
8701
8702   /* Decode the unwinding instructions.  */
8703   while (1)
8704     {
8705       unsigned int op, op2;
8706
8707       ADVANCE;
8708       if (remaining == 0)
8709         break;
8710       remaining--;
8711       op = word >> 24;
8712       word <<= 8;
8713
8714       printf ("  0x%02x ", op);
8715
8716       if ((op & 0xc0) == 0x00)
8717         {
8718           int offset = ((op & 0x3f) << 3) + 8;
8719           printf ("     sp = sp + %d", offset);
8720         }
8721       else if ((op & 0xc0) == 0x80)
8722         {
8723           GET_OP (op2);
8724           if (op == 0x80 && op2 == 0)
8725             printf (_("Refuse to unwind"));
8726           else
8727             {
8728               unsigned int mask = ((op & 0x1f) << 8) | op2;
8729               if (op & 0x20)
8730                 printf ("pop compact {");
8731               else
8732                 printf ("pop {");
8733
8734               decode_tic6x_unwind_regmask (mask);
8735               printf("}");
8736             }
8737         }
8738       else if ((op & 0xf0) == 0xc0)
8739         {
8740           unsigned int reg;
8741           unsigned int nregs;
8742           unsigned int i;
8743           const char *name;
8744           struct
8745           {
8746             unsigned int offset;
8747             unsigned int reg;
8748           } regpos[16];
8749
8750           /* Scan entire instruction first so that GET_OP output is not
8751              interleaved with disassembly.  */
8752           nregs = 0;
8753           for (i = 0; nregs < (op & 0xf); i++)
8754             {
8755               GET_OP (op2);
8756               reg = op2 >> 4;
8757               if (reg != 0xf)
8758                 {
8759                   regpos[nregs].offset = i * 2;
8760                   regpos[nregs].reg = reg;
8761                   nregs++;
8762                 }
8763
8764               reg = op2 & 0xf;
8765               if (reg != 0xf)
8766                 {
8767                   regpos[nregs].offset = i * 2 + 1;
8768                   regpos[nregs].reg = reg;
8769                   nregs++;
8770                 }
8771             }
8772
8773           printf (_("pop frame {"));
8774           reg = nregs - 1;
8775           for (i = i * 2; i > 0; i--)
8776             {
8777               if (regpos[reg].offset == i - 1)
8778                 {
8779                   name = tic6x_unwind_regnames[regpos[reg].reg];
8780                   if (reg > 0)
8781                     reg--;
8782                 }
8783               else
8784                 name = _("[pad]");
8785
8786               fputs (name, stdout);
8787               if (i > 1)
8788                 printf (", ");
8789             }
8790
8791           printf ("}");
8792         }
8793       else if (op == 0xd0)
8794         printf ("     MOV FP, SP");
8795       else if (op == 0xd1)
8796         printf ("     __c6xabi_pop_rts");
8797       else if (op == 0xd2)
8798         {
8799           unsigned char buf[9];
8800           unsigned int i, len;
8801           unsigned long offset;
8802
8803           for (i = 0; i < sizeof (buf); i++)
8804             {
8805               GET_OP (buf[i]);
8806               if ((buf[i] & 0x80) == 0)
8807                 break;
8808             }
8809           /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2.  */
8810           if (i == sizeof (buf))
8811             {
8812               warn (_("Corrupt stack pointer adjustment detected\n"));
8813               return FALSE;
8814             }
8815
8816           offset = read_uleb128 (buf, &len, buf + i + 1);
8817           assert (len == i + 1);
8818           offset = offset * 8 + 0x408;
8819           printf (_("sp = sp + %ld"), offset);
8820         }
8821       else if ((op & 0xf0) == 0xe0)
8822         {
8823           if ((op & 0x0f) == 7)
8824             printf ("     RETURN");
8825           else
8826             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8827         }
8828       else
8829         {
8830           printf (_("     [unsupported opcode]"));
8831         }
8832       putchar ('\n');
8833     }
8834
8835   return TRUE;
8836 }
8837
8838 static bfd_vma
8839 arm_expand_prel31 (Filedata * filedata, bfd_vma word, bfd_vma where)
8840 {
8841   bfd_vma offset;
8842
8843   offset = word & 0x7fffffff;
8844   if (offset & 0x40000000)
8845     offset |= ~ (bfd_vma) 0x7fffffff;
8846
8847   if (filedata->file_header.e_machine == EM_TI_C6000)
8848     offset <<= 1;
8849
8850   return offset + where;
8851 }
8852
8853 static bfd_boolean
8854 decode_arm_unwind (Filedata *                 filedata,
8855                    struct arm_unw_aux_info *  aux,
8856                    unsigned int               word,
8857                    unsigned int               remaining,
8858                    bfd_vma                    data_offset,
8859                    Elf_Internal_Shdr *        data_sec,
8860                    struct arm_section *       data_arm_sec)
8861 {
8862   int per_index;
8863   unsigned int more_words = 0;
8864   struct absaddr addr;
8865   bfd_vma sym_name = (bfd_vma) -1;
8866   bfd_boolean res = TRUE;
8867
8868   if (remaining == 0)
8869     {
8870       /* Fetch the first word.
8871          Note - when decoding an object file the address extracted
8872          here will always be 0.  So we also pass in the sym_name
8873          parameter so that we can find the symbol associated with
8874          the personality routine.  */
8875       if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, data_offset,
8876                                      & word, & addr, & sym_name))
8877         return FALSE;
8878
8879       remaining = 4;
8880     }
8881
8882   if ((word & 0x80000000) == 0)
8883     {
8884       /* Expand prel31 for personality routine.  */
8885       bfd_vma fn;
8886       const char *procname;
8887
8888       fn = arm_expand_prel31 (filedata, word, data_sec->sh_addr + data_offset);
8889       printf (_("  Personality routine: "));
8890       if (fn == 0
8891           && addr.section == SHN_UNDEF && addr.offset == 0
8892           && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8893         {
8894           procname = aux->strtab + sym_name;
8895           print_vma (fn, PREFIX_HEX);
8896           if (procname)
8897             {
8898               fputs (" <", stdout);
8899               fputs (procname, stdout);
8900               fputc ('>', stdout);
8901             }
8902         }
8903       else
8904         procname = arm_print_vma_and_name (filedata, aux, fn, addr);
8905       fputc ('\n', stdout);
8906
8907       /* The GCC personality routines use the standard compact
8908          encoding, starting with one byte giving the number of
8909          words.  */
8910       if (procname != NULL
8911           && (const_strneq (procname, "__gcc_personality_v0")
8912               || const_strneq (procname, "__gxx_personality_v0")
8913               || const_strneq (procname, "__gcj_personality_v0")
8914               || const_strneq (procname, "__gnu_objc_personality_v0")))
8915         {
8916           remaining = 0;
8917           more_words = 1;
8918           ADVANCE;
8919           if (!remaining)
8920             {
8921               printf (_("  [Truncated data]\n"));
8922               return FALSE;
8923             }
8924           more_words = word >> 24;
8925           word <<= 8;
8926           remaining--;
8927           per_index = -1;
8928         }
8929       else
8930         return TRUE;
8931     }
8932   else
8933     {
8934       /* ARM EHABI Section 6.3:
8935
8936          An exception-handling table entry for the compact model looks like:
8937
8938            31 30-28 27-24 23-0
8939            -- ----- ----- ----
8940             1   0   index Data for personalityRoutine[index]    */
8941
8942       if (filedata->file_header.e_machine == EM_ARM
8943           && (word & 0x70000000))
8944         {
8945           warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8946           res = FALSE;
8947         }
8948
8949       per_index = (word >> 24) & 0x7f;
8950       printf (_("  Compact model index: %d\n"), per_index);
8951       if (per_index == 0)
8952         {
8953           more_words = 0;
8954           word <<= 8;
8955           remaining--;
8956         }
8957       else if (per_index < 3)
8958         {
8959           more_words = (word >> 16) & 0xff;
8960           word <<= 16;
8961           remaining -= 2;
8962         }
8963     }
8964
8965   switch (filedata->file_header.e_machine)
8966     {
8967     case EM_ARM:
8968       if (per_index < 3)
8969         {
8970           if (! decode_arm_unwind_bytecode (filedata, aux, word, remaining, more_words,
8971                                             data_offset, data_sec, data_arm_sec))
8972             res = FALSE;
8973         }
8974       else
8975         {
8976           warn (_("Unknown ARM compact model index encountered\n"));
8977           printf (_("  [reserved]\n"));
8978           res = FALSE;
8979         }
8980       break;
8981
8982     case EM_TI_C6000:
8983       if (per_index < 3)
8984         {
8985           if (! decode_tic6x_unwind_bytecode (filedata, aux, word, remaining, more_words,
8986                                               data_offset, data_sec, data_arm_sec))
8987             res = FALSE;
8988         }
8989       else if (per_index < 5)
8990         {
8991           if (((word >> 17) & 0x7f) == 0x7f)
8992             printf (_("  Restore stack from frame pointer\n"));
8993           else
8994             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
8995           printf (_("  Registers restored: "));
8996           if (per_index == 4)
8997             printf (" (compact) ");
8998           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8999           putchar ('\n');
9000           printf (_("  Return register: %s\n"),
9001                   tic6x_unwind_regnames[word & 0xf]);
9002         }
9003       else
9004         printf (_("  [reserved (%d)]\n"), per_index);
9005       break;
9006
9007     default:
9008       error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
9009              filedata->file_header.e_machine);
9010       res = FALSE;
9011     }
9012
9013   /* Decode the descriptors.  Not implemented.  */
9014
9015   return res;
9016 }
9017
9018 static bfd_boolean
9019 dump_arm_unwind (Filedata *                 filedata,
9020                  struct arm_unw_aux_info *  aux,
9021                  Elf_Internal_Shdr *        exidx_sec)
9022 {
9023   struct arm_section exidx_arm_sec, extab_arm_sec;
9024   unsigned int i, exidx_len;
9025   unsigned long j, nfuns;
9026   bfd_boolean res = TRUE;
9027
9028   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
9029   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
9030   exidx_len = exidx_sec->sh_size / 8;
9031
9032   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
9033   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
9034     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
9035       aux->funtab[nfuns++] = aux->symtab[j];
9036   aux->nfuns = nfuns;
9037   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
9038
9039   for (i = 0; i < exidx_len; i++)
9040     {
9041       unsigned int exidx_fn, exidx_entry;
9042       struct absaddr fn_addr, entry_addr;
9043       bfd_vma fn;
9044
9045       fputc ('\n', stdout);
9046
9047       if (! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9048                                      8 * i, & exidx_fn, & fn_addr, NULL)
9049           || ! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9050                                         8 * i + 4, & exidx_entry, & entry_addr, NULL))
9051         {
9052           free (aux->funtab);
9053           arm_free_section (& exidx_arm_sec);
9054           arm_free_section (& extab_arm_sec);
9055           return FALSE;
9056         }
9057
9058       /* ARM EHABI, Section 5:
9059          An index table entry consists of 2 words.
9060          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
9061       if (exidx_fn & 0x80000000)
9062         {
9063           warn (_("corrupt index table entry: %x\n"), exidx_fn);
9064           res = FALSE;
9065         }
9066
9067       fn = arm_expand_prel31 (filedata, exidx_fn, exidx_sec->sh_addr + 8 * i);
9068
9069       arm_print_vma_and_name (filedata, aux, fn, fn_addr);
9070       fputs (": ", stdout);
9071
9072       if (exidx_entry == 1)
9073         {
9074           print_vma (exidx_entry, PREFIX_HEX);
9075           fputs (" [cantunwind]\n", stdout);
9076         }
9077       else if (exidx_entry & 0x80000000)
9078         {
9079           print_vma (exidx_entry, PREFIX_HEX);
9080           fputc ('\n', stdout);
9081           decode_arm_unwind (filedata, aux, exidx_entry, 4, 0, NULL, NULL);
9082         }
9083       else
9084         {
9085           bfd_vma table, table_offset = 0;
9086           Elf_Internal_Shdr *table_sec;
9087
9088           fputs ("@", stdout);
9089           table = arm_expand_prel31 (filedata, exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
9090           print_vma (table, PREFIX_HEX);
9091           printf ("\n");
9092
9093           /* Locate the matching .ARM.extab.  */
9094           if (entry_addr.section != SHN_UNDEF
9095               && entry_addr.section < filedata->file_header.e_shnum)
9096             {
9097               table_sec = filedata->section_headers + entry_addr.section;
9098               table_offset = entry_addr.offset;
9099               /* PR 18879 */
9100               if (table_offset > table_sec->sh_size
9101                   || ((bfd_signed_vma) table_offset) < 0)
9102                 {
9103                   warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
9104                         (unsigned long) table_offset,
9105                         printable_section_name (filedata, table_sec));
9106                   res = FALSE;
9107                   continue;
9108                 }
9109             }
9110           else
9111             {
9112               table_sec = find_section_by_address (filedata, table);
9113               if (table_sec != NULL)
9114                 table_offset = table - table_sec->sh_addr;
9115             }
9116
9117           if (table_sec == NULL)
9118             {
9119               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
9120                     (unsigned long) table);
9121               res = FALSE;
9122               continue;
9123             }
9124
9125           if (! decode_arm_unwind (filedata, aux, 0, 0, table_offset, table_sec,
9126                                    &extab_arm_sec))
9127             res = FALSE;
9128         }
9129     }
9130
9131   printf ("\n");
9132
9133   free (aux->funtab);
9134   arm_free_section (&exidx_arm_sec);
9135   arm_free_section (&extab_arm_sec);
9136
9137   return res;
9138 }
9139
9140 /* Used for both ARM and C6X unwinding tables.  */
9141
9142 static bfd_boolean
9143 arm_process_unwind (Filedata * filedata)
9144 {
9145   struct arm_unw_aux_info aux;
9146   Elf_Internal_Shdr *unwsec = NULL;
9147   Elf_Internal_Shdr *strsec;
9148   Elf_Internal_Shdr *sec;
9149   unsigned long i;
9150   unsigned int sec_type;
9151   bfd_boolean res = TRUE;
9152
9153   switch (filedata->file_header.e_machine)
9154     {
9155     case EM_ARM:
9156       sec_type = SHT_ARM_EXIDX;
9157       break;
9158
9159     case EM_TI_C6000:
9160       sec_type = SHT_C6000_UNWIND;
9161       break;
9162
9163     default:
9164       error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
9165              filedata->file_header.e_machine);
9166       return FALSE;
9167     }
9168
9169   if (filedata->string_table == NULL)
9170     return FALSE;
9171
9172   memset (& aux, 0, sizeof (aux));
9173   aux.filedata = filedata;
9174
9175   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9176     {
9177       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < filedata->file_header.e_shnum)
9178         {
9179           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
9180
9181           strsec = filedata->section_headers + sec->sh_link;
9182
9183           /* PR binutils/17531 file: 011-12666-0.004.  */
9184           if (aux.strtab != NULL)
9185             {
9186               error (_("Multiple string tables found in file.\n"));
9187               free (aux.strtab);
9188               res = FALSE;
9189             }
9190           aux.strtab = get_data (NULL, filedata, strsec->sh_offset,
9191                                  1, strsec->sh_size, _("string table"));
9192           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
9193         }
9194       else if (sec->sh_type == sec_type)
9195         unwsec = sec;
9196     }
9197
9198   if (unwsec == NULL)
9199     printf (_("\nThere are no unwind sections in this file.\n"));
9200   else
9201     for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9202       {
9203         if (sec->sh_type == sec_type)
9204           {
9205             unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size);
9206             printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
9207                               "contains %lu entry:\n",
9208                               "\nUnwind section '%s' at offset 0x%lx "
9209                               "contains %lu entries:\n",
9210                               num_unwind),
9211                     printable_section_name (filedata, sec),
9212                     (unsigned long) sec->sh_offset,
9213                     num_unwind);
9214
9215             if (! dump_arm_unwind (filedata, &aux, sec))
9216               res = FALSE;
9217           }
9218       }
9219
9220   if (aux.symtab)
9221     free (aux.symtab);
9222   if (aux.strtab)
9223     free ((char *) aux.strtab);
9224
9225   return res;
9226 }
9227
9228 static bfd_boolean
9229 process_unwind (Filedata * filedata)
9230 {
9231   struct unwind_handler
9232   {
9233     unsigned int machtype;
9234     bfd_boolean (* handler)(Filedata *);
9235   } handlers[] =
9236   {
9237     { EM_ARM, arm_process_unwind },
9238     { EM_IA_64, ia64_process_unwind },
9239     { EM_PARISC, hppa_process_unwind },
9240     { EM_TI_C6000, arm_process_unwind },
9241     { 0, NULL }
9242   };
9243   int i;
9244
9245   if (!do_unwind)
9246     return TRUE;
9247
9248   for (i = 0; handlers[i].handler != NULL; i++)
9249     if (filedata->file_header.e_machine == handlers[i].machtype)
9250       return handlers[i].handler (filedata);
9251
9252   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
9253           get_machine_name (filedata->file_header.e_machine));
9254   return TRUE;
9255 }
9256
9257 static void
9258 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
9259 {
9260   switch (entry->d_tag)
9261     {
9262     case DT_MIPS_FLAGS:
9263       if (entry->d_un.d_val == 0)
9264         printf (_("NONE"));
9265       else
9266         {
9267           static const char * opts[] =
9268           {
9269             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
9270             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
9271             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
9272             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
9273             "RLD_ORDER_SAFE"
9274           };
9275           unsigned int cnt;
9276           bfd_boolean first = TRUE;
9277
9278           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
9279             if (entry->d_un.d_val & (1 << cnt))
9280               {
9281                 printf ("%s%s", first ? "" : " ", opts[cnt]);
9282                 first = FALSE;
9283               }
9284         }
9285       break;
9286
9287     case DT_MIPS_IVERSION:
9288       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9289         printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
9290       else
9291         {
9292           char buf[40];
9293           sprintf_vma (buf, entry->d_un.d_ptr);
9294           /* Note: coded this way so that there is a single string for translation.  */
9295           printf (_("<corrupt: %s>"), buf);
9296         }
9297       break;
9298
9299     case DT_MIPS_TIME_STAMP:
9300       {
9301         char timebuf[128];
9302         struct tm * tmp;
9303         time_t atime = entry->d_un.d_val;
9304
9305         tmp = gmtime (&atime);
9306         /* PR 17531: file: 6accc532.  */
9307         if (tmp == NULL)
9308           snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
9309         else
9310           snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
9311                     tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9312                     tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9313         printf (_("Time Stamp: %s"), timebuf);
9314       }
9315       break;
9316
9317     case DT_MIPS_RLD_VERSION:
9318     case DT_MIPS_LOCAL_GOTNO:
9319     case DT_MIPS_CONFLICTNO:
9320     case DT_MIPS_LIBLISTNO:
9321     case DT_MIPS_SYMTABNO:
9322     case DT_MIPS_UNREFEXTNO:
9323     case DT_MIPS_HIPAGENO:
9324     case DT_MIPS_DELTA_CLASS_NO:
9325     case DT_MIPS_DELTA_INSTANCE_NO:
9326     case DT_MIPS_DELTA_RELOC_NO:
9327     case DT_MIPS_DELTA_SYM_NO:
9328     case DT_MIPS_DELTA_CLASSSYM_NO:
9329     case DT_MIPS_COMPACT_SIZE:
9330       print_vma (entry->d_un.d_val, DEC);
9331       break;
9332
9333     default:
9334       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9335     }
9336     putchar ('\n');
9337 }
9338
9339 static void
9340 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
9341 {
9342   switch (entry->d_tag)
9343     {
9344     case DT_HP_DLD_FLAGS:
9345       {
9346         static struct
9347         {
9348           long int bit;
9349           const char * str;
9350         }
9351         flags[] =
9352         {
9353           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
9354           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
9355           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
9356           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
9357           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
9358           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
9359           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9360           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9361           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9362           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
9363           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9364           { DT_HP_GST, "HP_GST" },
9365           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9366           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9367           { DT_HP_NODELETE, "HP_NODELETE" },
9368           { DT_HP_GROUP, "HP_GROUP" },
9369           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
9370         };
9371         bfd_boolean first = TRUE;
9372         size_t cnt;
9373         bfd_vma val = entry->d_un.d_val;
9374
9375         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
9376           if (val & flags[cnt].bit)
9377             {
9378               if (! first)
9379                 putchar (' ');
9380               fputs (flags[cnt].str, stdout);
9381               first = FALSE;
9382               val ^= flags[cnt].bit;
9383             }
9384
9385         if (val != 0 || first)
9386           {
9387             if (! first)
9388               putchar (' ');
9389             print_vma (val, HEX);
9390           }
9391       }
9392       break;
9393
9394     default:
9395       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9396       break;
9397     }
9398   putchar ('\n');
9399 }
9400
9401 #ifdef BFD64
9402
9403 /* VMS vs Unix time offset and factor.  */
9404
9405 #define VMS_EPOCH_OFFSET 35067168000000000LL
9406 #define VMS_GRANULARITY_FACTOR 10000000
9407
9408 /* Display a VMS time in a human readable format.  */
9409
9410 static void
9411 print_vms_time (bfd_int64_t vmstime)
9412 {
9413   struct tm *tm;
9414   time_t unxtime;
9415
9416   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9417   tm = gmtime (&unxtime);
9418   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9419           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9420           tm->tm_hour, tm->tm_min, tm->tm_sec);
9421 }
9422 #endif /* BFD64 */
9423
9424 static void
9425 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
9426 {
9427   switch (entry->d_tag)
9428     {
9429     case DT_IA_64_PLT_RESERVE:
9430       /* First 3 slots reserved.  */
9431       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9432       printf (" -- ");
9433       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
9434       break;
9435
9436     case DT_IA_64_VMS_LINKTIME:
9437 #ifdef BFD64
9438       print_vms_time (entry->d_un.d_val);
9439 #endif
9440       break;
9441
9442     case DT_IA_64_VMS_LNKFLAGS:
9443       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9444       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9445         printf (" CALL_DEBUG");
9446       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9447         printf (" NOP0BUFS");
9448       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9449         printf (" P0IMAGE");
9450       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9451         printf (" MKTHREADS");
9452       if (entry->d_un.d_val & VMS_LF_UPCALLS)
9453         printf (" UPCALLS");
9454       if (entry->d_un.d_val & VMS_LF_IMGSTA)
9455         printf (" IMGSTA");
9456       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9457         printf (" INITIALIZE");
9458       if (entry->d_un.d_val & VMS_LF_MAIN)
9459         printf (" MAIN");
9460       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9461         printf (" EXE_INIT");
9462       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9463         printf (" TBK_IN_IMG");
9464       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9465         printf (" DBG_IN_IMG");
9466       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9467         printf (" TBK_IN_DSF");
9468       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9469         printf (" DBG_IN_DSF");
9470       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9471         printf (" SIGNATURES");
9472       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9473         printf (" REL_SEG_OFF");
9474       break;
9475
9476     default:
9477       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9478       break;
9479     }
9480   putchar ('\n');
9481 }
9482
9483 static bfd_boolean
9484 get_32bit_dynamic_section (Filedata * filedata)
9485 {
9486   Elf32_External_Dyn * edyn;
9487   Elf32_External_Dyn * ext;
9488   Elf_Internal_Dyn * entry;
9489
9490   edyn = (Elf32_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9491                                           dynamic_size, _("dynamic section"));
9492   if (!edyn)
9493     return FALSE;
9494
9495   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9496      might not have the luxury of section headers.  Look for the DT_NULL
9497      terminator to determine the number of entries.  */
9498   for (ext = edyn, dynamic_nent = 0;
9499        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9500        ext++)
9501     {
9502       dynamic_nent++;
9503       if (BYTE_GET (ext->d_tag) == DT_NULL)
9504         break;
9505     }
9506
9507   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9508                                                   sizeof (* entry));
9509   if (dynamic_section == NULL)
9510     {
9511       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9512              (unsigned long) dynamic_nent);
9513       free (edyn);
9514       return FALSE;
9515     }
9516
9517   for (ext = edyn, entry = dynamic_section;
9518        entry < dynamic_section + dynamic_nent;
9519        ext++, entry++)
9520     {
9521       entry->d_tag      = BYTE_GET (ext->d_tag);
9522       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9523     }
9524
9525   free (edyn);
9526
9527   return TRUE;
9528 }
9529
9530 static bfd_boolean
9531 get_64bit_dynamic_section (Filedata * filedata)
9532 {
9533   Elf64_External_Dyn * edyn;
9534   Elf64_External_Dyn * ext;
9535   Elf_Internal_Dyn * entry;
9536
9537   /* Read in the data.  */
9538   edyn = (Elf64_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9539                                           dynamic_size, _("dynamic section"));
9540   if (!edyn)
9541     return FALSE;
9542
9543   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9544      might not have the luxury of section headers.  Look for the DT_NULL
9545      terminator to determine the number of entries.  */
9546   for (ext = edyn, dynamic_nent = 0;
9547        /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer.  */
9548        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9549        ext++)
9550     {
9551       dynamic_nent++;
9552       if (BYTE_GET (ext->d_tag) == DT_NULL)
9553         break;
9554     }
9555
9556   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9557                                                   sizeof (* entry));
9558   if (dynamic_section == NULL)
9559     {
9560       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9561              (unsigned long) dynamic_nent);
9562       free (edyn);
9563       return FALSE;
9564     }
9565
9566   /* Convert from external to internal formats.  */
9567   for (ext = edyn, entry = dynamic_section;
9568        entry < dynamic_section + dynamic_nent;
9569        ext++, entry++)
9570     {
9571       entry->d_tag      = BYTE_GET (ext->d_tag);
9572       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9573     }
9574
9575   free (edyn);
9576
9577   return TRUE;
9578 }
9579
9580 static void
9581 print_dynamic_flags (bfd_vma flags)
9582 {
9583   bfd_boolean first = TRUE;
9584
9585   while (flags)
9586     {
9587       bfd_vma flag;
9588
9589       flag = flags & - flags;
9590       flags &= ~ flag;
9591
9592       if (first)
9593         first = FALSE;
9594       else
9595         putc (' ', stdout);
9596
9597       switch (flag)
9598         {
9599         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
9600         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
9601         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
9602         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
9603         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
9604         default:                fputs (_("unknown"), stdout); break;
9605         }
9606     }
9607   puts ("");
9608 }
9609
9610 /* Parse and display the contents of the dynamic section.  */
9611
9612 static bfd_boolean
9613 process_dynamic_section (Filedata * filedata)
9614 {
9615   Elf_Internal_Dyn * entry;
9616
9617   if (dynamic_size == 0)
9618     {
9619       if (do_dynamic)
9620         printf (_("\nThere is no dynamic section in this file.\n"));
9621
9622       return TRUE;
9623     }
9624
9625   if (is_32bit_elf)
9626     {
9627       if (! get_32bit_dynamic_section (filedata))
9628         return FALSE;
9629     }
9630   else
9631     {
9632       if (! get_64bit_dynamic_section (filedata))
9633         return FALSE;
9634     }
9635
9636   /* Find the appropriate symbol table.  */
9637   if (dynamic_symbols == NULL)
9638     {
9639       for (entry = dynamic_section;
9640            entry < dynamic_section + dynamic_nent;
9641            ++entry)
9642         {
9643           Elf_Internal_Shdr section;
9644
9645           if (entry->d_tag != DT_SYMTAB)
9646             continue;
9647
9648           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9649
9650           /* Since we do not know how big the symbol table is,
9651              we default to reading in the entire file (!) and
9652              processing that.  This is overkill, I know, but it
9653              should work.  */
9654           section.sh_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9655           if ((bfd_size_type) section.sh_offset > filedata->file_size)
9656             {
9657               /* See PR 21379 for a reproducer.  */
9658               error (_("Invalid DT_SYMTAB entry: %lx"), (long) section.sh_offset);
9659               return FALSE;
9660             }
9661
9662           if (archive_file_offset != 0)
9663             section.sh_size = archive_file_size - section.sh_offset;
9664           else
9665             section.sh_size = filedata->file_size - section.sh_offset;
9666
9667           if (is_32bit_elf)
9668             section.sh_entsize = sizeof (Elf32_External_Sym);
9669           else
9670             section.sh_entsize = sizeof (Elf64_External_Sym);
9671           section.sh_name = filedata->string_table_length;
9672
9673           dynamic_symbols = GET_ELF_SYMBOLS (filedata, &section, & num_dynamic_syms);
9674           if (num_dynamic_syms < 1)
9675             {
9676               error (_("Unable to determine the number of symbols to load\n"));
9677               continue;
9678             }
9679         }
9680     }
9681
9682   /* Similarly find a string table.  */
9683   if (dynamic_strings == NULL)
9684     {
9685       for (entry = dynamic_section;
9686            entry < dynamic_section + dynamic_nent;
9687            ++entry)
9688         {
9689           unsigned long offset;
9690           long str_tab_len;
9691
9692           if (entry->d_tag != DT_STRTAB)
9693             continue;
9694
9695           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9696
9697           /* Since we do not know how big the string table is,
9698              we default to reading in the entire file (!) and
9699              processing that.  This is overkill, I know, but it
9700              should work.  */
9701
9702           offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9703
9704           if (archive_file_offset != 0)
9705             str_tab_len = archive_file_size - offset;
9706           else
9707             str_tab_len = filedata->file_size - offset;
9708
9709           if (str_tab_len < 1)
9710             {
9711               error
9712                 (_("Unable to determine the length of the dynamic string table\n"));
9713               continue;
9714             }
9715
9716           dynamic_strings = (char *) get_data (NULL, filedata, offset, 1,
9717                                                str_tab_len,
9718                                                _("dynamic string table"));
9719           dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9720           break;
9721         }
9722     }
9723
9724   /* And find the syminfo section if available.  */
9725   if (dynamic_syminfo == NULL)
9726     {
9727       unsigned long syminsz = 0;
9728
9729       for (entry = dynamic_section;
9730            entry < dynamic_section + dynamic_nent;
9731            ++entry)
9732         {
9733           if (entry->d_tag == DT_SYMINENT)
9734             {
9735               /* Note: these braces are necessary to avoid a syntax
9736                  error from the SunOS4 C compiler.  */
9737               /* PR binutils/17531: A corrupt file can trigger this test.
9738                  So do not use an assert, instead generate an error message.  */
9739               if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9740                 error (_("Bad value (%d) for SYMINENT entry\n"),
9741                        (int) entry->d_un.d_val);
9742             }
9743           else if (entry->d_tag == DT_SYMINSZ)
9744             syminsz = entry->d_un.d_val;
9745           else if (entry->d_tag == DT_SYMINFO)
9746             dynamic_syminfo_offset = offset_from_vma (filedata, entry->d_un.d_val,
9747                                                       syminsz);
9748         }
9749
9750       if (dynamic_syminfo_offset != 0 && syminsz != 0)
9751         {
9752           Elf_External_Syminfo * extsyminfo;
9753           Elf_External_Syminfo * extsym;
9754           Elf_Internal_Syminfo * syminfo;
9755
9756           /* There is a syminfo section.  Read the data.  */
9757           extsyminfo = (Elf_External_Syminfo *)
9758               get_data (NULL, filedata, dynamic_syminfo_offset, 1, syminsz,
9759                         _("symbol information"));
9760           if (!extsyminfo)
9761             return FALSE;
9762
9763           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9764           if (dynamic_syminfo == NULL)
9765             {
9766               error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9767                      (unsigned long) syminsz);
9768               return FALSE;
9769             }
9770
9771           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9772           for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9773                syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9774                ++syminfo, ++extsym)
9775             {
9776               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9777               syminfo->si_flags = BYTE_GET (extsym->si_flags);
9778             }
9779
9780           free (extsyminfo);
9781         }
9782     }
9783
9784   if (do_dynamic && dynamic_addr)
9785     printf (ngettext ("\nDynamic section at offset 0x%lx "
9786                       "contains %lu entry:\n",
9787                       "\nDynamic section at offset 0x%lx "
9788                       "contains %lu entries:\n",
9789                       dynamic_nent),
9790             dynamic_addr, (unsigned long) dynamic_nent);
9791   if (do_dynamic)
9792     printf (_("  Tag        Type                         Name/Value\n"));
9793
9794   for (entry = dynamic_section;
9795        entry < dynamic_section + dynamic_nent;
9796        entry++)
9797     {
9798       if (do_dynamic)
9799         {
9800           const char * dtype;
9801
9802           putchar (' ');
9803           print_vma (entry->d_tag, FULL_HEX);
9804           dtype = get_dynamic_type (filedata, entry->d_tag);
9805           printf (" (%s)%*s", dtype,
9806                   ((is_32bit_elf ? 27 : 19) - (int) strlen (dtype)), " ");
9807         }
9808
9809       switch (entry->d_tag)
9810         {
9811         case DT_FLAGS:
9812           if (do_dynamic)
9813             print_dynamic_flags (entry->d_un.d_val);
9814           break;
9815
9816         case DT_AUXILIARY:
9817         case DT_FILTER:
9818         case DT_CONFIG:
9819         case DT_DEPAUDIT:
9820         case DT_AUDIT:
9821           if (do_dynamic)
9822             {
9823               switch (entry->d_tag)
9824                 {
9825                 case DT_AUXILIARY:
9826                   printf (_("Auxiliary library"));
9827                   break;
9828
9829                 case DT_FILTER:
9830                   printf (_("Filter library"));
9831                   break;
9832
9833                 case DT_CONFIG:
9834                   printf (_("Configuration file"));
9835                   break;
9836
9837                 case DT_DEPAUDIT:
9838                   printf (_("Dependency audit library"));
9839                   break;
9840
9841                 case DT_AUDIT:
9842                   printf (_("Audit library"));
9843                   break;
9844                 }
9845
9846               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9847                 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9848               else
9849                 {
9850                   printf (": ");
9851                   print_vma (entry->d_un.d_val, PREFIX_HEX);
9852                   putchar ('\n');
9853                 }
9854             }
9855           break;
9856
9857         case DT_FEATURE:
9858           if (do_dynamic)
9859             {
9860               printf (_("Flags:"));
9861
9862               if (entry->d_un.d_val == 0)
9863                 printf (_(" None\n"));
9864               else
9865                 {
9866                   unsigned long int val = entry->d_un.d_val;
9867
9868                   if (val & DTF_1_PARINIT)
9869                     {
9870                       printf (" PARINIT");
9871                       val ^= DTF_1_PARINIT;
9872                     }
9873                   if (val & DTF_1_CONFEXP)
9874                     {
9875                       printf (" CONFEXP");
9876                       val ^= DTF_1_CONFEXP;
9877                     }
9878                   if (val != 0)
9879                     printf (" %lx", val);
9880                   puts ("");
9881                 }
9882             }
9883           break;
9884
9885         case DT_POSFLAG_1:
9886           if (do_dynamic)
9887             {
9888               printf (_("Flags:"));
9889
9890               if (entry->d_un.d_val == 0)
9891                 printf (_(" None\n"));
9892               else
9893                 {
9894                   unsigned long int val = entry->d_un.d_val;
9895
9896                   if (val & DF_P1_LAZYLOAD)
9897                     {
9898                       printf (" LAZYLOAD");
9899                       val ^= DF_P1_LAZYLOAD;
9900                     }
9901                   if (val & DF_P1_GROUPPERM)
9902                     {
9903                       printf (" GROUPPERM");
9904                       val ^= DF_P1_GROUPPERM;
9905                     }
9906                   if (val != 0)
9907                     printf (" %lx", val);
9908                   puts ("");
9909                 }
9910             }
9911           break;
9912
9913         case DT_FLAGS_1:
9914           if (do_dynamic)
9915             {
9916               printf (_("Flags:"));
9917               if (entry->d_un.d_val == 0)
9918                 printf (_(" None\n"));
9919               else
9920                 {
9921                   unsigned long int val = entry->d_un.d_val;
9922
9923                   if (val & DF_1_NOW)
9924                     {
9925                       printf (" NOW");
9926                       val ^= DF_1_NOW;
9927                     }
9928                   if (val & DF_1_GLOBAL)
9929                     {
9930                       printf (" GLOBAL");
9931                       val ^= DF_1_GLOBAL;
9932                     }
9933                   if (val & DF_1_GROUP)
9934                     {
9935                       printf (" GROUP");
9936                       val ^= DF_1_GROUP;
9937                     }
9938                   if (val & DF_1_NODELETE)
9939                     {
9940                       printf (" NODELETE");
9941                       val ^= DF_1_NODELETE;
9942                     }
9943                   if (val & DF_1_LOADFLTR)
9944                     {
9945                       printf (" LOADFLTR");
9946                       val ^= DF_1_LOADFLTR;
9947                     }
9948                   if (val & DF_1_INITFIRST)
9949                     {
9950                       printf (" INITFIRST");
9951                       val ^= DF_1_INITFIRST;
9952                     }
9953                   if (val & DF_1_NOOPEN)
9954                     {
9955                       printf (" NOOPEN");
9956                       val ^= DF_1_NOOPEN;
9957                     }
9958                   if (val & DF_1_ORIGIN)
9959                     {
9960                       printf (" ORIGIN");
9961                       val ^= DF_1_ORIGIN;
9962                     }
9963                   if (val & DF_1_DIRECT)
9964                     {
9965                       printf (" DIRECT");
9966                       val ^= DF_1_DIRECT;
9967                     }
9968                   if (val & DF_1_TRANS)
9969                     {
9970                       printf (" TRANS");
9971                       val ^= DF_1_TRANS;
9972                     }
9973                   if (val & DF_1_INTERPOSE)
9974                     {
9975                       printf (" INTERPOSE");
9976                       val ^= DF_1_INTERPOSE;
9977                     }
9978                   if (val & DF_1_NODEFLIB)
9979                     {
9980                       printf (" NODEFLIB");
9981                       val ^= DF_1_NODEFLIB;
9982                     }
9983                   if (val & DF_1_NODUMP)
9984                     {
9985                       printf (" NODUMP");
9986                       val ^= DF_1_NODUMP;
9987                     }
9988                   if (val & DF_1_CONFALT)
9989                     {
9990                       printf (" CONFALT");
9991                       val ^= DF_1_CONFALT;
9992                     }
9993                   if (val & DF_1_ENDFILTEE)
9994                     {
9995                       printf (" ENDFILTEE");
9996                       val ^= DF_1_ENDFILTEE;
9997                     }
9998                   if (val & DF_1_DISPRELDNE)
9999                     {
10000                       printf (" DISPRELDNE");
10001                       val ^= DF_1_DISPRELDNE;
10002                     }
10003                   if (val & DF_1_DISPRELPND)
10004                     {
10005                       printf (" DISPRELPND");
10006                       val ^= DF_1_DISPRELPND;
10007                     }
10008                   if (val & DF_1_NODIRECT)
10009                     {
10010                       printf (" NODIRECT");
10011                       val ^= DF_1_NODIRECT;
10012                     }
10013                   if (val & DF_1_IGNMULDEF)
10014                     {
10015                       printf (" IGNMULDEF");
10016                       val ^= DF_1_IGNMULDEF;
10017                     }
10018                   if (val & DF_1_NOKSYMS)
10019                     {
10020                       printf (" NOKSYMS");
10021                       val ^= DF_1_NOKSYMS;
10022                     }
10023                   if (val & DF_1_NOHDR)
10024                     {
10025                       printf (" NOHDR");
10026                       val ^= DF_1_NOHDR;
10027                     }
10028                   if (val & DF_1_EDITED)
10029                     {
10030                       printf (" EDITED");
10031                       val ^= DF_1_EDITED;
10032                     }
10033                   if (val & DF_1_NORELOC)
10034                     {
10035                       printf (" NORELOC");
10036                       val ^= DF_1_NORELOC;
10037                     }
10038                   if (val & DF_1_SYMINTPOSE)
10039                     {
10040                       printf (" SYMINTPOSE");
10041                       val ^= DF_1_SYMINTPOSE;
10042                     }
10043                   if (val & DF_1_GLOBAUDIT)
10044                     {
10045                       printf (" GLOBAUDIT");
10046                       val ^= DF_1_GLOBAUDIT;
10047                     }
10048                   if (val & DF_1_SINGLETON)
10049                     {
10050                       printf (" SINGLETON");
10051                       val ^= DF_1_SINGLETON;
10052                     }
10053                   if (val & DF_1_STUB)
10054                     {
10055                       printf (" STUB");
10056                       val ^= DF_1_STUB;
10057                     }
10058                   if (val & DF_1_PIE)
10059                     {
10060                       printf (" PIE");
10061                       val ^= DF_1_PIE;
10062                     }
10063                   if (val & DF_1_KMOD)
10064                     {
10065                       printf (" KMOD");
10066                       val ^= DF_1_KMOD;
10067                     }
10068                   if (val & DF_1_WEAKFILTER)
10069                     {
10070                       printf (" WEAKFILTER");
10071                       val ^= DF_1_WEAKFILTER;
10072                     }
10073                   if (val & DF_1_NOCOMMON)
10074                     {
10075                       printf (" NOCOMMON");
10076                       val ^= DF_1_NOCOMMON;
10077                     }
10078                   if (val != 0)
10079                     printf (" %lx", val);
10080                   puts ("");
10081                 }
10082             }
10083           break;
10084
10085         case DT_PLTREL:
10086           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10087           if (do_dynamic)
10088             puts (get_dynamic_type (filedata, entry->d_un.d_val));
10089           break;
10090
10091         case DT_NULL    :
10092         case DT_NEEDED  :
10093         case DT_PLTGOT  :
10094         case DT_HASH    :
10095         case DT_STRTAB  :
10096         case DT_SYMTAB  :
10097         case DT_RELA    :
10098         case DT_INIT    :
10099         case DT_FINI    :
10100         case DT_SONAME  :
10101         case DT_RPATH   :
10102         case DT_SYMBOLIC:
10103         case DT_REL     :
10104         case DT_DEBUG   :
10105         case DT_TEXTREL :
10106         case DT_JMPREL  :
10107         case DT_RUNPATH :
10108           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10109
10110           if (do_dynamic)
10111             {
10112               char * name;
10113
10114               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
10115                 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10116               else
10117                 name = NULL;
10118
10119               if (name)
10120                 {
10121                   switch (entry->d_tag)
10122                     {
10123                     case DT_NEEDED:
10124                       printf (_("Shared library: [%s]"), name);
10125
10126                       if (streq (name, program_interpreter))
10127                         printf (_(" program interpreter"));
10128                       break;
10129
10130                     case DT_SONAME:
10131                       printf (_("Library soname: [%s]"), name);
10132                       break;
10133
10134                     case DT_RPATH:
10135                       printf (_("Library rpath: [%s]"), name);
10136                       break;
10137
10138                     case DT_RUNPATH:
10139                       printf (_("Library runpath: [%s]"), name);
10140                       break;
10141
10142                     default:
10143                       print_vma (entry->d_un.d_val, PREFIX_HEX);
10144                       break;
10145                     }
10146                 }
10147               else
10148                 print_vma (entry->d_un.d_val, PREFIX_HEX);
10149
10150               putchar ('\n');
10151             }
10152           break;
10153
10154         case DT_PLTRELSZ:
10155         case DT_RELASZ  :
10156         case DT_STRSZ   :
10157         case DT_RELSZ   :
10158         case DT_RELAENT :
10159         case DT_SYMENT  :
10160         case DT_RELENT  :
10161           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10162           /* Fall through.  */
10163         case DT_PLTPADSZ:
10164         case DT_MOVEENT :
10165         case DT_MOVESZ  :
10166         case DT_INIT_ARRAYSZ:
10167         case DT_FINI_ARRAYSZ:
10168         case DT_GNU_CONFLICTSZ:
10169         case DT_GNU_LIBLISTSZ:
10170           if (do_dynamic)
10171             {
10172               print_vma (entry->d_un.d_val, UNSIGNED);
10173               printf (_(" (bytes)\n"));
10174             }
10175           break;
10176
10177         case DT_VERDEFNUM:
10178         case DT_VERNEEDNUM:
10179         case DT_RELACOUNT:
10180         case DT_RELCOUNT:
10181           if (do_dynamic)
10182             {
10183               print_vma (entry->d_un.d_val, UNSIGNED);
10184               putchar ('\n');
10185             }
10186           break;
10187
10188         case DT_SYMINSZ:
10189         case DT_SYMINENT:
10190         case DT_SYMINFO:
10191         case DT_USED:
10192         case DT_INIT_ARRAY:
10193         case DT_FINI_ARRAY:
10194           if (do_dynamic)
10195             {
10196               if (entry->d_tag == DT_USED
10197                   && VALID_DYNAMIC_NAME (entry->d_un.d_val))
10198                 {
10199                   char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10200
10201                   if (*name)
10202                     {
10203                       printf (_("Not needed object: [%s]\n"), name);
10204                       break;
10205                     }
10206                 }
10207
10208               print_vma (entry->d_un.d_val, PREFIX_HEX);
10209               putchar ('\n');
10210             }
10211           break;
10212
10213         case DT_BIND_NOW:
10214           /* The value of this entry is ignored.  */
10215           if (do_dynamic)
10216             putchar ('\n');
10217           break;
10218
10219         case DT_GNU_PRELINKED:
10220           if (do_dynamic)
10221             {
10222               struct tm * tmp;
10223               time_t atime = entry->d_un.d_val;
10224
10225               tmp = gmtime (&atime);
10226               /* PR 17533 file: 041-1244816-0.004.  */
10227               if (tmp == NULL)
10228                 printf (_("<corrupt time val: %lx"),
10229                         (unsigned long) atime);
10230               else
10231                 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
10232                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
10233                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
10234
10235             }
10236           break;
10237
10238         case DT_GNU_HASH:
10239           dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
10240           if (do_dynamic)
10241             {
10242               print_vma (entry->d_un.d_val, PREFIX_HEX);
10243               putchar ('\n');
10244             }
10245           break;
10246
10247         default:
10248           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
10249             version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
10250               entry->d_un.d_val;
10251
10252           if (do_dynamic)
10253             {
10254               switch (filedata->file_header.e_machine)
10255                 {
10256                 case EM_MIPS:
10257                 case EM_MIPS_RS3_LE:
10258                   dynamic_section_mips_val (entry);
10259                   break;
10260                 case EM_PARISC:
10261                   dynamic_section_parisc_val (entry);
10262                   break;
10263                 case EM_IA_64:
10264                   dynamic_section_ia64_val (entry);
10265                   break;
10266                 default:
10267                   print_vma (entry->d_un.d_val, PREFIX_HEX);
10268                   putchar ('\n');
10269                 }
10270             }
10271           break;
10272         }
10273     }
10274
10275   return TRUE;
10276 }
10277
10278 static char *
10279 get_ver_flags (unsigned int flags)
10280 {
10281   static char buff[128];
10282
10283   buff[0] = 0;
10284
10285   if (flags == 0)
10286     return _("none");
10287
10288   if (flags & VER_FLG_BASE)
10289     strcat (buff, "BASE");
10290
10291   if (flags & VER_FLG_WEAK)
10292     {
10293       if (flags & VER_FLG_BASE)
10294         strcat (buff, " | ");
10295
10296       strcat (buff, "WEAK");
10297     }
10298
10299   if (flags & VER_FLG_INFO)
10300     {
10301       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
10302         strcat (buff, " | ");
10303
10304       strcat (buff, "INFO");
10305     }
10306
10307   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10308     {
10309       if (flags & (VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10310         strcat (buff, " | ");
10311
10312       strcat (buff, _("<unknown>"));
10313     }
10314
10315   return buff;
10316 }
10317
10318 /* Display the contents of the version sections.  */
10319
10320 static bfd_boolean
10321 process_version_sections (Filedata * filedata)
10322 {
10323   Elf_Internal_Shdr * section;
10324   unsigned i;
10325   bfd_boolean found = FALSE;
10326
10327   if (! do_version)
10328     return TRUE;
10329
10330   for (i = 0, section = filedata->section_headers;
10331        i < filedata->file_header.e_shnum;
10332        i++, section++)
10333     {
10334       switch (section->sh_type)
10335         {
10336         case SHT_GNU_verdef:
10337           {
10338             Elf_External_Verdef * edefs;
10339             unsigned long idx;
10340             unsigned long cnt;
10341             char * endbuf;
10342
10343             found = TRUE;
10344
10345             printf (ngettext ("\nVersion definition section '%s' "
10346                               "contains %u entry:\n",
10347                               "\nVersion definition section '%s' "
10348                               "contains %u entries:\n",
10349                               section->sh_info),
10350                     printable_section_name (filedata, section),
10351                     section->sh_info);
10352
10353             printf (_("  Addr: 0x"));
10354             printf_vma (section->sh_addr);
10355             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10356                     (unsigned long) section->sh_offset, section->sh_link,
10357                     printable_section_name_from_index (filedata, section->sh_link));
10358
10359             edefs = (Elf_External_Verdef *)
10360                 get_data (NULL, filedata, section->sh_offset, 1,section->sh_size,
10361                           _("version definition section"));
10362             if (!edefs)
10363               break;
10364             endbuf = (char *) edefs + section->sh_size;
10365
10366             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10367               {
10368                 char * vstart;
10369                 Elf_External_Verdef * edef;
10370                 Elf_Internal_Verdef ent;
10371                 Elf_External_Verdaux * eaux;
10372                 Elf_Internal_Verdaux aux;
10373                 unsigned long isum;
10374                 int j;
10375
10376                 vstart = ((char *) edefs) + idx;
10377                 if (vstart + sizeof (*edef) > endbuf)
10378                   break;
10379
10380                 edef = (Elf_External_Verdef *) vstart;
10381
10382                 ent.vd_version = BYTE_GET (edef->vd_version);
10383                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
10384                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
10385                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
10386                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
10387                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
10388                 ent.vd_next    = BYTE_GET (edef->vd_next);
10389
10390                 printf (_("  %#06lx: Rev: %d  Flags: %s"),
10391                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
10392
10393                 printf (_("  Index: %d  Cnt: %d  "),
10394                         ent.vd_ndx, ent.vd_cnt);
10395
10396                 /* Check for overflow.  */
10397                 if (ent.vd_aux > (size_t) (endbuf - vstart))
10398                   break;
10399
10400                 vstart += ent.vd_aux;
10401
10402                 if (vstart + sizeof (*eaux) > endbuf)
10403                   break;
10404                 eaux = (Elf_External_Verdaux *) vstart;
10405
10406                 aux.vda_name = BYTE_GET (eaux->vda_name);
10407                 aux.vda_next = BYTE_GET (eaux->vda_next);
10408
10409                 if (VALID_DYNAMIC_NAME (aux.vda_name))
10410                   printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
10411                 else
10412                   printf (_("Name index: %ld\n"), aux.vda_name);
10413
10414                 isum = idx + ent.vd_aux;
10415
10416                 for (j = 1; j < ent.vd_cnt; j++)
10417                   {
10418                     if (aux.vda_next < sizeof (*eaux)
10419                         && !(j == ent.vd_cnt - 1 && aux.vda_next == 0))
10420                       {
10421                         warn (_("Invalid vda_next field of %lx\n"),
10422                               aux.vda_next);
10423                         j = ent.vd_cnt;
10424                         break;
10425                       }
10426                     /* Check for overflow.  */
10427                     if (aux.vda_next > (size_t) (endbuf - vstart))
10428                       break;
10429
10430                     isum   += aux.vda_next;
10431                     vstart += aux.vda_next;
10432
10433                     if (vstart + sizeof (*eaux) > endbuf)
10434                       break;
10435                     eaux = (Elf_External_Verdaux *) vstart;
10436
10437                     aux.vda_name = BYTE_GET (eaux->vda_name);
10438                     aux.vda_next = BYTE_GET (eaux->vda_next);
10439
10440                     if (VALID_DYNAMIC_NAME (aux.vda_name))
10441                       printf (_("  %#06lx: Parent %d: %s\n"),
10442                               isum, j, GET_DYNAMIC_NAME (aux.vda_name));
10443                     else
10444                       printf (_("  %#06lx: Parent %d, name index: %ld\n"),
10445                               isum, j, aux.vda_name);
10446                   }
10447
10448                 if (j < ent.vd_cnt)
10449                   printf (_("  Version def aux past end of section\n"));
10450
10451                 /* PR 17531:
10452                    file: id:000001,src:000172+005151,op:splice,rep:2.  */
10453                 if (ent.vd_next < sizeof (*edef)
10454                     && !(cnt == section->sh_info - 1 && ent.vd_next == 0))
10455                   {
10456                     warn (_("Invalid vd_next field of %lx\n"), ent.vd_next);
10457                     cnt = section->sh_info;
10458                     break;
10459                   }
10460                 if (ent.vd_next > (size_t) (endbuf - ((char *) edefs + idx)))
10461                   break;
10462
10463                 idx += ent.vd_next;
10464               }
10465
10466             if (cnt < section->sh_info)
10467               printf (_("  Version definition past end of section\n"));
10468
10469             free (edefs);
10470           }
10471           break;
10472
10473         case SHT_GNU_verneed:
10474           {
10475             Elf_External_Verneed * eneed;
10476             unsigned long idx;
10477             unsigned long cnt;
10478             char * endbuf;
10479
10480             found = TRUE;
10481
10482             printf (ngettext ("\nVersion needs section '%s' "
10483                               "contains %u entry:\n",
10484                               "\nVersion needs section '%s' "
10485                               "contains %u entries:\n",
10486                               section->sh_info),
10487                     printable_section_name (filedata, section), section->sh_info);
10488
10489             printf (_(" Addr: 0x"));
10490             printf_vma (section->sh_addr);
10491             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10492                     (unsigned long) section->sh_offset, section->sh_link,
10493                     printable_section_name_from_index (filedata, section->sh_link));
10494
10495             eneed = (Elf_External_Verneed *) get_data (NULL, filedata,
10496                                                        section->sh_offset, 1,
10497                                                        section->sh_size,
10498                                                        _("Version Needs section"));
10499             if (!eneed)
10500               break;
10501             endbuf = (char *) eneed + section->sh_size;
10502
10503             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10504               {
10505                 Elf_External_Verneed * entry;
10506                 Elf_Internal_Verneed ent;
10507                 unsigned long isum;
10508                 int j;
10509                 char * vstart;
10510
10511                 vstart = ((char *) eneed) + idx;
10512                 if (vstart + sizeof (*entry) > endbuf)
10513                   break;
10514
10515                 entry = (Elf_External_Verneed *) vstart;
10516
10517                 ent.vn_version = BYTE_GET (entry->vn_version);
10518                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
10519                 ent.vn_file    = BYTE_GET (entry->vn_file);
10520                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
10521                 ent.vn_next    = BYTE_GET (entry->vn_next);
10522
10523                 printf (_("  %#06lx: Version: %d"), idx, ent.vn_version);
10524
10525                 if (VALID_DYNAMIC_NAME (ent.vn_file))
10526                   printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
10527                 else
10528                   printf (_("  File: %lx"), ent.vn_file);
10529
10530                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
10531
10532                 /* Check for overflow.  */
10533                 if (ent.vn_aux > (size_t) (endbuf - vstart))
10534                   break;
10535                 vstart += ent.vn_aux;
10536
10537                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10538                   {
10539                     Elf_External_Vernaux * eaux;
10540                     Elf_Internal_Vernaux aux;
10541
10542                     if (vstart + sizeof (*eaux) > endbuf)
10543                       break;
10544                     eaux = (Elf_External_Vernaux *) vstart;
10545
10546                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
10547                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
10548                     aux.vna_other = BYTE_GET (eaux->vna_other);
10549                     aux.vna_name  = BYTE_GET (eaux->vna_name);
10550                     aux.vna_next  = BYTE_GET (eaux->vna_next);
10551
10552                     if (VALID_DYNAMIC_NAME (aux.vna_name))
10553                       printf (_("  %#06lx:   Name: %s"),
10554                               isum, GET_DYNAMIC_NAME (aux.vna_name));
10555                     else
10556                       printf (_("  %#06lx:   Name index: %lx"),
10557                               isum, aux.vna_name);
10558
10559                     printf (_("  Flags: %s  Version: %d\n"),
10560                             get_ver_flags (aux.vna_flags), aux.vna_other);
10561
10562                     if (aux.vna_next < sizeof (*eaux)
10563                         && !(j == ent.vn_cnt - 1 && aux.vna_next == 0))
10564                       {
10565                         warn (_("Invalid vna_next field of %lx\n"),
10566                               aux.vna_next);
10567                         j = ent.vn_cnt;
10568                         break;
10569                       }
10570                     /* Check for overflow.  */
10571                     if (aux.vna_next > (size_t) (endbuf - vstart))
10572                       break;
10573                     isum   += aux.vna_next;
10574                     vstart += aux.vna_next;
10575                   }
10576
10577                 if (j < ent.vn_cnt)
10578                   warn (_("Missing Version Needs auxillary information\n"));
10579
10580                 if (ent.vn_next < sizeof (*entry)
10581                     && !(cnt == section->sh_info - 1 && ent.vn_next == 0))
10582                   {
10583                     warn (_("Invalid vn_next field of %lx\n"), ent.vn_next);
10584                     cnt = section->sh_info;
10585                     break;
10586                   }
10587                 if (ent.vn_next > (size_t) (endbuf - ((char *) eneed + idx)))
10588                   break;
10589                 idx += ent.vn_next;
10590               }
10591
10592             if (cnt < section->sh_info)
10593               warn (_("Missing Version Needs information\n"));
10594
10595             free (eneed);
10596           }
10597           break;
10598
10599         case SHT_GNU_versym:
10600           {
10601             Elf_Internal_Shdr * link_section;
10602             size_t total;
10603             unsigned int cnt;
10604             unsigned char * edata;
10605             unsigned short * data;
10606             char * strtab;
10607             Elf_Internal_Sym * symbols;
10608             Elf_Internal_Shdr * string_sec;
10609             unsigned long num_syms;
10610             long off;
10611
10612             if (section->sh_link >= filedata->file_header.e_shnum)
10613               break;
10614
10615             link_section = filedata->section_headers + section->sh_link;
10616             total = section->sh_size / sizeof (Elf_External_Versym);
10617
10618             if (link_section->sh_link >= filedata->file_header.e_shnum)
10619               break;
10620
10621             found = TRUE;
10622
10623             symbols = GET_ELF_SYMBOLS (filedata, link_section, & num_syms);
10624             if (symbols == NULL)
10625               break;
10626
10627             string_sec = filedata->section_headers + link_section->sh_link;
10628
10629             strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
10630                                         string_sec->sh_size,
10631                                         _("version string table"));
10632             if (!strtab)
10633               {
10634                 free (symbols);
10635                 break;
10636               }
10637
10638             printf (ngettext ("\nVersion symbols section '%s' "
10639                               "contains %lu entry:\n",
10640                               "\nVersion symbols section '%s' "
10641                               "contains %lu entries:\n",
10642                               total),
10643                     printable_section_name (filedata, section), (unsigned long) total);
10644
10645             printf (_(" Addr: "));
10646             printf_vma (section->sh_addr);
10647             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10648                     (unsigned long) section->sh_offset, section->sh_link,
10649                     printable_section_name (filedata, link_section));
10650
10651             off = offset_from_vma (filedata,
10652                                    version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10653                                    total * sizeof (short));
10654             edata = (unsigned char *) get_data (NULL, filedata, off, total,
10655                                                 sizeof (short),
10656                                                 _("version symbol data"));
10657             if (!edata)
10658               {
10659                 free (strtab);
10660                 free (symbols);
10661                 break;
10662               }
10663
10664             data = (short unsigned int *) cmalloc (total, sizeof (short));
10665
10666             for (cnt = total; cnt --;)
10667               data[cnt] = byte_get (edata + cnt * sizeof (short),
10668                                     sizeof (short));
10669
10670             free (edata);
10671
10672             for (cnt = 0; cnt < total; cnt += 4)
10673               {
10674                 int j, nn;
10675                 char *name;
10676                 char *invalid = _("*invalid*");
10677
10678                 printf ("  %03x:", cnt);
10679
10680                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10681                   switch (data[cnt + j])
10682                     {
10683                     case 0:
10684                       fputs (_("   0 (*local*)    "), stdout);
10685                       break;
10686
10687                     case 1:
10688                       fputs (_("   1 (*global*)   "), stdout);
10689                       break;
10690
10691                     default:
10692                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10693                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10694
10695                       /* If this index value is greater than the size of the symbols
10696                          array, break to avoid an out-of-bounds read.  */
10697                       if ((unsigned long)(cnt + j) >= num_syms)
10698                         {
10699                           warn (_("invalid index into symbol array\n"));
10700                           break;
10701                         }
10702
10703                       name = NULL;
10704                       if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10705                         {
10706                           Elf_Internal_Verneed ivn;
10707                           unsigned long offset;
10708
10709                           offset = offset_from_vma
10710                             (filedata, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10711                              sizeof (Elf_External_Verneed));
10712
10713                           do
10714                             {
10715                               Elf_Internal_Vernaux ivna;
10716                               Elf_External_Verneed evn;
10717                               Elf_External_Vernaux evna;
10718                               unsigned long a_off;
10719
10720                               if (get_data (&evn, filedata, offset, sizeof (evn), 1,
10721                                             _("version need")) == NULL)
10722                                 break;
10723
10724                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10725                               ivn.vn_next = BYTE_GET (evn.vn_next);
10726
10727                               a_off = offset + ivn.vn_aux;
10728
10729                               do
10730                                 {
10731                                   if (get_data (&evna, filedata, a_off, sizeof (evna),
10732                                                 1, _("version need aux (2)")) == NULL)
10733                                     {
10734                                       ivna.vna_next  = 0;
10735                                       ivna.vna_other = 0;
10736                                     }
10737                                   else
10738                                     {
10739                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
10740                                       ivna.vna_other = BYTE_GET (evna.vna_other);
10741                                     }
10742
10743                                   a_off += ivna.vna_next;
10744                                 }
10745                               while (ivna.vna_other != data[cnt + j]
10746                                      && ivna.vna_next != 0);
10747
10748                               if (ivna.vna_other == data[cnt + j])
10749                                 {
10750                                   ivna.vna_name = BYTE_GET (evna.vna_name);
10751
10752                                   if (ivna.vna_name >= string_sec->sh_size)
10753                                     name = invalid;
10754                                   else
10755                                     name = strtab + ivna.vna_name;
10756                                   break;
10757                                 }
10758
10759                               offset += ivn.vn_next;
10760                             }
10761                           while (ivn.vn_next);
10762                         }
10763
10764                       if (data[cnt + j] != 0x8001
10765                           && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10766                         {
10767                           Elf_Internal_Verdef ivd;
10768                           Elf_External_Verdef evd;
10769                           unsigned long offset;
10770
10771                           offset = offset_from_vma
10772                             (filedata, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10773                              sizeof evd);
10774
10775                           do
10776                             {
10777                               if (get_data (&evd, filedata, offset, sizeof (evd), 1,
10778                                             _("version def")) == NULL)
10779                                 {
10780                                   ivd.vd_next = 0;
10781                                   /* PR 17531: file: 046-1082287-0.004.  */
10782                                   ivd.vd_ndx  = (data[cnt + j] & VERSYM_VERSION) + 1;
10783                                   break;
10784                                 }
10785                               else
10786                                 {
10787                                   ivd.vd_next = BYTE_GET (evd.vd_next);
10788                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
10789                                 }
10790
10791                               offset += ivd.vd_next;
10792                             }
10793                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10794                                  && ivd.vd_next != 0);
10795
10796                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10797                             {
10798                               Elf_External_Verdaux evda;
10799                               Elf_Internal_Verdaux ivda;
10800
10801                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
10802
10803                               if (get_data (&evda, filedata,
10804                                             offset - ivd.vd_next + ivd.vd_aux,
10805                                             sizeof (evda), 1,
10806                                             _("version def aux")) == NULL)
10807                                 break;
10808
10809                               ivda.vda_name = BYTE_GET (evda.vda_name);
10810
10811                               if (ivda.vda_name >= string_sec->sh_size)
10812                                 name = invalid;
10813                               else if (name != NULL && name != invalid)
10814                                 name = _("*both*");
10815                               else
10816                                 name = strtab + ivda.vda_name;
10817                             }
10818                         }
10819                       if (name != NULL)
10820                         nn += printf ("(%s%-*s",
10821                                       name,
10822                                       12 - (int) strlen (name),
10823                                       ")");
10824
10825                       if (nn < 18)
10826                         printf ("%*c", 18 - nn, ' ');
10827                     }
10828
10829                 putchar ('\n');
10830               }
10831
10832             free (data);
10833             free (strtab);
10834             free (symbols);
10835           }
10836           break;
10837
10838         default:
10839           break;
10840         }
10841     }
10842
10843   if (! found)
10844     printf (_("\nNo version information found in this file.\n"));
10845
10846   return TRUE;
10847 }
10848
10849 static const char *
10850 get_symbol_binding (Filedata * filedata, unsigned int binding)
10851 {
10852   static char buff[32];
10853
10854   switch (binding)
10855     {
10856     case STB_LOCAL:     return "LOCAL";
10857     case STB_GLOBAL:    return "GLOBAL";
10858     case STB_WEAK:      return "WEAK";
10859     default:
10860       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10861         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10862                   binding);
10863       else if (binding >= STB_LOOS && binding <= STB_HIOS)
10864         {
10865           if (binding == STB_GNU_UNIQUE
10866               && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10867                   /* GNU is still using the default value 0.  */
10868                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10869             return "UNIQUE";
10870           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10871         }
10872       else
10873         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
10874       return buff;
10875     }
10876 }
10877
10878 static const char *
10879 get_symbol_type (Filedata * filedata, unsigned int type)
10880 {
10881   static char buff[32];
10882
10883   switch (type)
10884     {
10885     case STT_NOTYPE:    return "NOTYPE";
10886     case STT_OBJECT:    return "OBJECT";
10887     case STT_FUNC:      return "FUNC";
10888     case STT_SECTION:   return "SECTION";
10889     case STT_FILE:      return "FILE";
10890     case STT_COMMON:    return "COMMON";
10891     case STT_TLS:       return "TLS";
10892     case STT_RELC:      return "RELC";
10893     case STT_SRELC:     return "SRELC";
10894     default:
10895       if (type >= STT_LOPROC && type <= STT_HIPROC)
10896         {
10897           if (filedata->file_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10898             return "THUMB_FUNC";
10899
10900           if (filedata->file_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
10901             return "REGISTER";
10902
10903           if (filedata->file_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10904             return "PARISC_MILLI";
10905
10906           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
10907         }
10908       else if (type >= STT_LOOS && type <= STT_HIOS)
10909         {
10910           if (filedata->file_header.e_machine == EM_PARISC)
10911             {
10912               if (type == STT_HP_OPAQUE)
10913                 return "HP_OPAQUE";
10914               if (type == STT_HP_STUB)
10915                 return "HP_STUB";
10916             }
10917
10918           if (type == STT_GNU_IFUNC
10919               && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10920                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
10921                   /* GNU is still using the default value 0.  */
10922                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10923             return "IFUNC";
10924
10925           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
10926         }
10927       else
10928         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
10929       return buff;
10930     }
10931 }
10932
10933 static const char *
10934 get_symbol_visibility (unsigned int visibility)
10935 {
10936   switch (visibility)
10937     {
10938     case STV_DEFAULT:   return "DEFAULT";
10939     case STV_INTERNAL:  return "INTERNAL";
10940     case STV_HIDDEN:    return "HIDDEN";
10941     case STV_PROTECTED: return "PROTECTED";
10942     default:
10943       error (_("Unrecognized visibility value: %u"), visibility);
10944       return _("<unknown>");
10945     }
10946 }
10947
10948 static const char *
10949 get_solaris_symbol_visibility (unsigned int visibility)
10950 {
10951   switch (visibility)
10952     {
10953     case 4: return "EXPORTED";
10954     case 5: return "SINGLETON";
10955     case 6: return "ELIMINATE";
10956     default: return get_symbol_visibility (visibility);
10957     }
10958 }
10959
10960 static const char *
10961 get_mips_symbol_other (unsigned int other)
10962 {
10963   switch (other)
10964     {
10965     case STO_OPTIONAL:      return "OPTIONAL";
10966     case STO_MIPS_PLT:      return "MIPS PLT";
10967     case STO_MIPS_PIC:      return "MIPS PIC";
10968     case STO_MICROMIPS:     return "MICROMIPS";
10969     case STO_MICROMIPS | STO_MIPS_PIC:      return "MICROMIPS, MIPS PIC";
10970     case STO_MIPS16:        return "MIPS16";
10971     default:                return NULL;
10972     }
10973 }
10974
10975 static const char *
10976 get_ia64_symbol_other (Filedata * filedata, unsigned int other)
10977 {
10978   if (is_ia64_vms (filedata))
10979     {
10980       static char res[32];
10981
10982       res[0] = 0;
10983
10984       /* Function types is for images and .STB files only.  */
10985       switch (filedata->file_header.e_type)
10986         {
10987         case ET_DYN:
10988         case ET_EXEC:
10989           switch (VMS_ST_FUNC_TYPE (other))
10990             {
10991             case VMS_SFT_CODE_ADDR:
10992               strcat (res, " CA");
10993               break;
10994             case VMS_SFT_SYMV_IDX:
10995               strcat (res, " VEC");
10996               break;
10997             case VMS_SFT_FD:
10998               strcat (res, " FD");
10999               break;
11000             case VMS_SFT_RESERVE:
11001               strcat (res, " RSV");
11002               break;
11003             default:
11004               warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
11005                     VMS_ST_FUNC_TYPE (other));
11006               strcat (res, " <unknown>");
11007               break;
11008             }
11009           break;
11010         default:
11011           break;
11012         }
11013       switch (VMS_ST_LINKAGE (other))
11014         {
11015         case VMS_STL_IGNORE:
11016           strcat (res, " IGN");
11017           break;
11018         case VMS_STL_RESERVE:
11019           strcat (res, " RSV");
11020           break;
11021         case VMS_STL_STD:
11022           strcat (res, " STD");
11023           break;
11024         case VMS_STL_LNK:
11025           strcat (res, " LNK");
11026           break;
11027         default:
11028           warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
11029                 VMS_ST_LINKAGE (other));
11030           strcat (res, " <unknown>");
11031           break;
11032         }
11033
11034       if (res[0] != 0)
11035         return res + 1;
11036       else
11037         return res;
11038     }
11039   return NULL;
11040 }
11041
11042 static const char *
11043 get_ppc64_symbol_other (unsigned int other)
11044 {
11045   if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
11046     {
11047       static char buf[32];
11048       snprintf (buf, sizeof buf, _("<localentry>: %d"),
11049                 PPC64_LOCAL_ENTRY_OFFSET (other));
11050       return buf;
11051     }
11052   return NULL;
11053 }
11054
11055 static const char *
11056 get_symbol_other (Filedata * filedata, unsigned int other)
11057 {
11058   const char * result = NULL;
11059   static char buff [32];
11060
11061   if (other == 0)
11062     return "";
11063
11064   switch (filedata->file_header.e_machine)
11065     {
11066     case EM_MIPS:
11067       result = get_mips_symbol_other (other);
11068       break;
11069     case EM_IA_64:
11070       result = get_ia64_symbol_other (filedata, other);
11071       break;
11072     case EM_PPC64:
11073       result = get_ppc64_symbol_other (other);
11074       break;
11075     default:
11076       result = NULL;
11077       break;
11078     }
11079
11080   if (result)
11081     return result;
11082
11083   snprintf (buff, sizeof buff, _("<other>: %x"), other);
11084   return buff;
11085 }
11086
11087 static const char *
11088 get_symbol_index_type (Filedata * filedata, unsigned int type)
11089 {
11090   static char buff[32];
11091
11092   switch (type)
11093     {
11094     case SHN_UNDEF:     return "UND";
11095     case SHN_ABS:       return "ABS";
11096     case SHN_COMMON:    return "COM";
11097     default:
11098       if (type == SHN_IA_64_ANSI_COMMON
11099           && filedata->file_header.e_machine == EM_IA_64
11100           && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
11101         return "ANSI_COM";
11102       else if ((filedata->file_header.e_machine == EM_X86_64
11103                 || filedata->file_header.e_machine == EM_L1OM
11104                 || filedata->file_header.e_machine == EM_K1OM)
11105                && type == SHN_X86_64_LCOMMON)
11106         return "LARGE_COM";
11107       else if ((type == SHN_MIPS_SCOMMON
11108                 && filedata->file_header.e_machine == EM_MIPS)
11109                || (type == SHN_TIC6X_SCOMMON
11110                    && filedata->file_header.e_machine == EM_TI_C6000))
11111         return "SCOM";
11112       else if (type == SHN_MIPS_SUNDEFINED
11113                && filedata->file_header.e_machine == EM_MIPS)
11114         return "SUND";
11115       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
11116         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
11117       else if (type >= SHN_LOOS && type <= SHN_HIOS)
11118         sprintf (buff, "OS [0x%04x]", type & 0xffff);
11119       else if (type >= SHN_LORESERVE)
11120         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
11121       else if (type >= filedata->file_header.e_shnum)
11122         sprintf (buff, _("bad section index[%3d]"), type);
11123       else
11124         sprintf (buff, "%3d", type);
11125       break;
11126     }
11127
11128   return buff;
11129 }
11130
11131 static bfd_vma *
11132 get_dynamic_data (Filedata * filedata, bfd_size_type number, unsigned int ent_size)
11133 {
11134   unsigned char * e_data;
11135   bfd_vma * i_data;
11136
11137   /* If the size_t type is smaller than the bfd_size_type, eg because
11138      you are building a 32-bit tool on a 64-bit host, then make sure
11139      that when (number) is cast to (size_t) no information is lost.  */
11140   if (sizeof (size_t) < sizeof (bfd_size_type)
11141       && (bfd_size_type) ((size_t) number) != number)
11142     {
11143       error (_("Size truncation prevents reading %s elements of size %u\n"),
11144              bfd_vmatoa ("u", number), ent_size);
11145       return NULL;
11146     }
11147
11148   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
11149      attempting to allocate memory when the read is bound to fail.  */
11150   if (ent_size * number > filedata->file_size)
11151     {
11152       error (_("Invalid number of dynamic entries: %s\n"),
11153              bfd_vmatoa ("u", number));
11154       return NULL;
11155     }
11156
11157   e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
11158   if (e_data == NULL)
11159     {
11160       error (_("Out of memory reading %s dynamic entries\n"),
11161              bfd_vmatoa ("u", number));
11162       return NULL;
11163     }
11164
11165   if (fread (e_data, ent_size, (size_t) number, filedata->handle) != number)
11166     {
11167       error (_("Unable to read in %s bytes of dynamic data\n"),
11168              bfd_vmatoa ("u", number * ent_size));
11169       free (e_data);
11170       return NULL;
11171     }
11172
11173   i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
11174   if (i_data == NULL)
11175     {
11176       error (_("Out of memory allocating space for %s dynamic entries\n"),
11177              bfd_vmatoa ("u", number));
11178       free (e_data);
11179       return NULL;
11180     }
11181
11182   while (number--)
11183     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
11184
11185   free (e_data);
11186
11187   return i_data;
11188 }
11189
11190 static void
11191 print_dynamic_symbol (Filedata * filedata, bfd_vma si, unsigned long hn)
11192 {
11193   Elf_Internal_Sym * psym;
11194   int n;
11195
11196   n = print_vma (si, DEC_5);
11197   if (n < 5)
11198     fputs (&"     "[n], stdout);
11199   printf (" %3lu: ", hn);
11200
11201   if (dynamic_symbols == NULL || si >= num_dynamic_syms)
11202     {
11203       printf (_("<No info available for dynamic symbol number %lu>\n"),
11204               (unsigned long) si);
11205       return;
11206     }
11207
11208   psym = dynamic_symbols + si;
11209   print_vma (psym->st_value, LONG_HEX);
11210   putchar (' ');
11211   print_vma (psym->st_size, DEC_5);
11212
11213   printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11214   printf (" %-6s",  get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11215
11216   if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11217     printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11218   else
11219     {
11220       unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11221
11222       printf (" %-7s",  get_symbol_visibility (vis));
11223       /* Check to see if any other bits in the st_other field are set.
11224          Note - displaying this information disrupts the layout of the
11225          table being generated, but for the moment this case is very
11226          rare.  */
11227       if (psym->st_other ^ vis)
11228         printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11229     }
11230
11231   printf (" %3.3s ", get_symbol_index_type (filedata, psym->st_shndx));
11232   if (VALID_DYNAMIC_NAME (psym->st_name))
11233     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11234   else
11235     printf (_(" <corrupt: %14ld>"), psym->st_name);
11236   putchar ('\n');
11237 }
11238
11239 static const char *
11240 get_symbol_version_string (Filedata *                   filedata,
11241                            bfd_boolean                  is_dynsym,
11242                            const char *                 strtab,
11243                            unsigned long int            strtab_size,
11244                            unsigned int                 si,
11245                            Elf_Internal_Sym *           psym,
11246                            enum versioned_symbol_info * sym_info,
11247                            unsigned short *             vna_other)
11248 {
11249   unsigned char data[2];
11250   unsigned short vers_data;
11251   unsigned long offset;
11252
11253   if (!is_dynsym
11254       || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
11255     return NULL;
11256
11257   offset = offset_from_vma (filedata, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
11258                             sizeof data + si * sizeof (vers_data));
11259
11260   if (get_data (&data, filedata, offset + si * sizeof (vers_data),
11261                 sizeof (data), 1, _("version data")) == NULL)
11262     return NULL;
11263
11264   vers_data = byte_get (data, 2);
11265
11266   if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
11267     return NULL;
11268
11269   /* Usually we'd only see verdef for defined symbols, and verneed for
11270      undefined symbols.  However, symbols defined by the linker in
11271      .dynbss for variables copied from a shared library in order to
11272      avoid text relocations are defined yet have verneed.  We could
11273      use a heuristic to detect the special case, for example, check
11274      for verneed first on symbols defined in SHT_NOBITS sections, but
11275      it is simpler and more reliable to just look for both verdef and
11276      verneed.  .dynbss might not be mapped to a SHT_NOBITS section.  */
11277
11278   if (psym->st_shndx != SHN_UNDEF
11279       && vers_data != 0x8001
11280       && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
11281     {
11282       Elf_Internal_Verdef ivd;
11283       Elf_Internal_Verdaux ivda;
11284       Elf_External_Verdaux evda;
11285       unsigned long off;
11286
11287       off = offset_from_vma (filedata,
11288                              version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
11289                              sizeof (Elf_External_Verdef));
11290
11291       do
11292         {
11293           Elf_External_Verdef evd;
11294
11295           if (get_data (&evd, filedata, off, sizeof (evd), 1,
11296                         _("version def")) == NULL)
11297             {
11298               ivd.vd_ndx = 0;
11299               ivd.vd_aux = 0;
11300               ivd.vd_next = 0;
11301             }
11302           else
11303             {
11304               ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
11305               ivd.vd_aux = BYTE_GET (evd.vd_aux);
11306               ivd.vd_next = BYTE_GET (evd.vd_next);
11307             }
11308
11309           off += ivd.vd_next;
11310         }
11311       while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
11312
11313       if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
11314         {
11315           off -= ivd.vd_next;
11316           off += ivd.vd_aux;
11317
11318           if (get_data (&evda, filedata, off, sizeof (evda), 1,
11319                         _("version def aux")) != NULL)
11320             {
11321               ivda.vda_name = BYTE_GET (evda.vda_name);
11322
11323               if (psym->st_name != ivda.vda_name)
11324                 {
11325                   *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
11326                                ? symbol_hidden : symbol_public);
11327                   return (ivda.vda_name < strtab_size
11328                           ? strtab + ivda.vda_name : _("<corrupt>"));
11329                 }
11330             }
11331         }
11332     }
11333
11334   if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
11335     {
11336       Elf_External_Verneed evn;
11337       Elf_Internal_Verneed ivn;
11338       Elf_Internal_Vernaux ivna;
11339
11340       offset = offset_from_vma (filedata,
11341                                 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
11342                                 sizeof evn);
11343       do
11344         {
11345           unsigned long vna_off;
11346
11347           if (get_data (&evn, filedata, offset, sizeof (evn), 1,
11348                         _("version need")) == NULL)
11349             {
11350               ivna.vna_next = 0;
11351               ivna.vna_other = 0;
11352               ivna.vna_name = 0;
11353               break;
11354             }
11355
11356           ivn.vn_aux  = BYTE_GET (evn.vn_aux);
11357           ivn.vn_next = BYTE_GET (evn.vn_next);
11358
11359           vna_off = offset + ivn.vn_aux;
11360
11361           do
11362             {
11363               Elf_External_Vernaux evna;
11364
11365               if (get_data (&evna, filedata, vna_off, sizeof (evna), 1,
11366                             _("version need aux (3)")) == NULL)
11367                 {
11368                   ivna.vna_next = 0;
11369                   ivna.vna_other = 0;
11370                   ivna.vna_name = 0;
11371                 }
11372               else
11373                 {
11374                   ivna.vna_other = BYTE_GET (evna.vna_other);
11375                   ivna.vna_next  = BYTE_GET (evna.vna_next);
11376                   ivna.vna_name  = BYTE_GET (evna.vna_name);
11377                 }
11378
11379               vna_off += ivna.vna_next;
11380             }
11381           while (ivna.vna_other != vers_data && ivna.vna_next != 0);
11382
11383           if (ivna.vna_other == vers_data)
11384             break;
11385
11386           offset += ivn.vn_next;
11387         }
11388       while (ivn.vn_next != 0);
11389
11390       if (ivna.vna_other == vers_data)
11391         {
11392           *sym_info = symbol_undefined;
11393           *vna_other = ivna.vna_other;
11394           return (ivna.vna_name < strtab_size
11395                   ? strtab + ivna.vna_name : _("<corrupt>"));
11396         }
11397     }
11398   return NULL;
11399 }
11400
11401 /* Dump the symbol table.  */
11402 static bfd_boolean
11403 process_symbol_table (Filedata * filedata)
11404 {
11405   Elf_Internal_Shdr * section;
11406   bfd_size_type nbuckets = 0;
11407   bfd_size_type nchains = 0;
11408   bfd_vma * buckets = NULL;
11409   bfd_vma * chains = NULL;
11410   bfd_vma ngnubuckets = 0;
11411   bfd_vma * gnubuckets = NULL;
11412   bfd_vma * gnuchains = NULL;
11413   bfd_vma gnusymidx = 0;
11414   bfd_size_type ngnuchains = 0;
11415
11416   if (!do_syms && !do_dyn_syms && !do_histogram)
11417     return TRUE;
11418
11419   if (dynamic_info[DT_HASH]
11420       && (do_histogram
11421           || (do_using_dynamic
11422               && !do_dyn_syms
11423               && dynamic_strings != NULL)))
11424     {
11425       unsigned char nb[8];
11426       unsigned char nc[8];
11427       unsigned int hash_ent_size = 4;
11428
11429       if ((filedata->file_header.e_machine == EM_ALPHA
11430            || filedata->file_header.e_machine == EM_S390
11431            || filedata->file_header.e_machine == EM_S390_OLD)
11432           && filedata->file_header.e_ident[EI_CLASS] == ELFCLASS64)
11433         hash_ent_size = 8;
11434
11435       if (fseek (filedata->handle,
11436                  (archive_file_offset
11437                   + offset_from_vma (filedata, dynamic_info[DT_HASH],
11438                                      sizeof nb + sizeof nc)),
11439                  SEEK_SET))
11440         {
11441           error (_("Unable to seek to start of dynamic information\n"));
11442           goto no_hash;
11443         }
11444
11445       if (fread (nb, hash_ent_size, 1, filedata->handle) != 1)
11446         {
11447           error (_("Failed to read in number of buckets\n"));
11448           goto no_hash;
11449         }
11450
11451       if (fread (nc, hash_ent_size, 1, filedata->handle) != 1)
11452         {
11453           error (_("Failed to read in number of chains\n"));
11454           goto no_hash;
11455         }
11456
11457       nbuckets = byte_get (nb, hash_ent_size);
11458       nchains  = byte_get (nc, hash_ent_size);
11459
11460       buckets = get_dynamic_data (filedata, nbuckets, hash_ent_size);
11461       chains  = get_dynamic_data (filedata, nchains, hash_ent_size);
11462
11463     no_hash:
11464       if (buckets == NULL || chains == NULL)
11465         {
11466           if (do_using_dynamic)
11467             return FALSE;
11468           free (buckets);
11469           free (chains);
11470           buckets = NULL;
11471           chains = NULL;
11472           nbuckets = 0;
11473           nchains = 0;
11474         }
11475     }
11476
11477   if (dynamic_info_DT_GNU_HASH
11478       && (do_histogram
11479           || (do_using_dynamic
11480               && !do_dyn_syms
11481               && dynamic_strings != NULL)))
11482     {
11483       unsigned char nb[16];
11484       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11485       bfd_vma buckets_vma;
11486
11487       if (fseek (filedata->handle,
11488                  (archive_file_offset
11489                   + offset_from_vma (filedata, dynamic_info_DT_GNU_HASH,
11490                                      sizeof nb)),
11491                  SEEK_SET))
11492         {
11493           error (_("Unable to seek to start of dynamic information\n"));
11494           goto no_gnu_hash;
11495         }
11496
11497       if (fread (nb, 16, 1, filedata->handle) != 1)
11498         {
11499           error (_("Failed to read in number of buckets\n"));
11500           goto no_gnu_hash;
11501         }
11502
11503       ngnubuckets = byte_get (nb, 4);
11504       gnusymidx = byte_get (nb + 4, 4);
11505       bitmaskwords = byte_get (nb + 8, 4);
11506       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
11507       if (is_32bit_elf)
11508         buckets_vma += bitmaskwords * 4;
11509       else
11510         buckets_vma += bitmaskwords * 8;
11511
11512       if (fseek (filedata->handle,
11513                  (archive_file_offset
11514                   + offset_from_vma (filedata, buckets_vma, 4)),
11515                  SEEK_SET))
11516         {
11517           error (_("Unable to seek to start of dynamic information\n"));
11518           goto no_gnu_hash;
11519         }
11520
11521       gnubuckets = get_dynamic_data (filedata, ngnubuckets, 4);
11522
11523       if (gnubuckets == NULL)
11524         goto no_gnu_hash;
11525
11526       for (i = 0; i < ngnubuckets; i++)
11527         if (gnubuckets[i] != 0)
11528           {
11529             if (gnubuckets[i] < gnusymidx)
11530               return FALSE;
11531
11532             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11533               maxchain = gnubuckets[i];
11534           }
11535
11536       if (maxchain == 0xffffffff)
11537         goto no_gnu_hash;
11538
11539       maxchain -= gnusymidx;
11540
11541       if (fseek (filedata->handle,
11542                  (archive_file_offset
11543                   + offset_from_vma (filedata, buckets_vma
11544                                            + 4 * (ngnubuckets + maxchain), 4)),
11545                  SEEK_SET))
11546         {
11547           error (_("Unable to seek to start of dynamic information\n"));
11548           goto no_gnu_hash;
11549         }
11550
11551       do
11552         {
11553           if (fread (nb, 4, 1, filedata->handle) != 1)
11554             {
11555               error (_("Failed to determine last chain length\n"));
11556               goto no_gnu_hash;
11557             }
11558
11559           if (maxchain + 1 == 0)
11560             goto no_gnu_hash;
11561
11562           ++maxchain;
11563         }
11564       while ((byte_get (nb, 4) & 1) == 0);
11565
11566       if (fseek (filedata->handle,
11567                  (archive_file_offset
11568                   + offset_from_vma (filedata, buckets_vma + 4 * ngnubuckets, 4)),
11569                  SEEK_SET))
11570         {
11571           error (_("Unable to seek to start of dynamic information\n"));
11572           goto no_gnu_hash;
11573         }
11574
11575       gnuchains = get_dynamic_data (filedata, maxchain, 4);
11576       ngnuchains = maxchain;
11577
11578     no_gnu_hash:
11579       if (gnuchains == NULL)
11580         {
11581           free (gnubuckets);
11582           gnubuckets = NULL;
11583           ngnubuckets = 0;
11584           if (do_using_dynamic)
11585             return FALSE;
11586         }
11587     }
11588
11589   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11590       && do_syms
11591       && do_using_dynamic
11592       && dynamic_strings != NULL
11593       && dynamic_symbols != NULL)
11594     {
11595       unsigned long hn;
11596
11597       if (dynamic_info[DT_HASH])
11598         {
11599           bfd_vma si;
11600           char *visited;
11601
11602           printf (_("\nSymbol table for image:\n"));
11603           if (is_32bit_elf)
11604             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11605           else
11606             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11607
11608           visited = xcmalloc (nchains, 1);
11609           memset (visited, 0, nchains);
11610           for (hn = 0; hn < nbuckets; hn++)
11611             {
11612               for (si = buckets[hn]; si > 0; si = chains[si])
11613                 {
11614                   print_dynamic_symbol (filedata, si, hn);
11615                   if (si >= nchains || visited[si])
11616                     {
11617                       error (_("histogram chain is corrupt\n"));
11618                       break;
11619                     }
11620                   visited[si] = 1;
11621                 }
11622             }
11623           free (visited);
11624         }
11625
11626       if (dynamic_info_DT_GNU_HASH)
11627         {
11628           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11629           if (is_32bit_elf)
11630             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11631           else
11632             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11633
11634           for (hn = 0; hn < ngnubuckets; ++hn)
11635             if (gnubuckets[hn] != 0)
11636               {
11637                 bfd_vma si = gnubuckets[hn];
11638                 bfd_vma off = si - gnusymidx;
11639
11640                 do
11641                   {
11642                     print_dynamic_symbol (filedata, si, hn);
11643                     si++;
11644                   }
11645                 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11646               }
11647         }
11648     }
11649   else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11650            && filedata->section_headers != NULL)
11651     {
11652       unsigned int i;
11653
11654       for (i = 0, section = filedata->section_headers;
11655            i < filedata->file_header.e_shnum;
11656            i++, section++)
11657         {
11658           unsigned int si;
11659           char * strtab = NULL;
11660           unsigned long int strtab_size = 0;
11661           Elf_Internal_Sym * symtab;
11662           Elf_Internal_Sym * psym;
11663           unsigned long num_syms;
11664
11665           if ((section->sh_type != SHT_SYMTAB
11666                && section->sh_type != SHT_DYNSYM)
11667               || (!do_syms
11668                   && section->sh_type == SHT_SYMTAB))
11669             continue;
11670
11671           if (section->sh_entsize == 0)
11672             {
11673               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11674                       printable_section_name (filedata, section));
11675               continue;
11676             }
11677
11678           num_syms = section->sh_size / section->sh_entsize;
11679           printf (ngettext ("\nSymbol table '%s' contains %lu entry:\n",
11680                             "\nSymbol table '%s' contains %lu entries:\n",
11681                             num_syms),
11682                   printable_section_name (filedata, section),
11683                   num_syms);
11684
11685           if (is_32bit_elf)
11686             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
11687           else
11688             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
11689
11690           symtab = GET_ELF_SYMBOLS (filedata, section, & num_syms);
11691           if (symtab == NULL)
11692             continue;
11693
11694           if (section->sh_link == filedata->file_header.e_shstrndx)
11695             {
11696               strtab = filedata->string_table;
11697               strtab_size = filedata->string_table_length;
11698             }
11699           else if (section->sh_link < filedata->file_header.e_shnum)
11700             {
11701               Elf_Internal_Shdr * string_sec;
11702
11703               string_sec = filedata->section_headers + section->sh_link;
11704
11705               strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset,
11706                                           1, string_sec->sh_size,
11707                                           _("string table"));
11708               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11709             }
11710
11711           for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11712             {
11713               const char *version_string;
11714               enum versioned_symbol_info sym_info;
11715               unsigned short vna_other;
11716
11717               printf ("%6d: ", si);
11718               print_vma (psym->st_value, LONG_HEX);
11719               putchar (' ');
11720               print_vma (psym->st_size, DEC_5);
11721               printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11722               printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11723               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11724                 printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11725               else
11726                 {
11727                   unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11728
11729                   printf (" %-7s", get_symbol_visibility (vis));
11730                   /* Check to see if any other bits in the st_other field are set.
11731                      Note - displaying this information disrupts the layout of the
11732                      table being generated, but for the moment this case is very rare.  */
11733                   if (psym->st_other ^ vis)
11734                     printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11735                 }
11736               printf (" %4s ", get_symbol_index_type (filedata, psym->st_shndx));
11737               print_symbol (25, psym->st_name < strtab_size
11738                             ? strtab + psym->st_name : _("<corrupt>"));
11739
11740               version_string
11741                 = get_symbol_version_string (filedata,
11742                                              section->sh_type == SHT_DYNSYM,
11743                                              strtab, strtab_size, si,
11744                                              psym, &sym_info, &vna_other);
11745               if (version_string)
11746                 {
11747                   if (sym_info == symbol_undefined)
11748                     printf ("@%s (%d)", version_string, vna_other);
11749                   else
11750                     printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11751                             version_string);
11752                 }
11753
11754               putchar ('\n');
11755
11756               if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
11757                   && si >= section->sh_info
11758                   /* Irix 5 and 6 MIPS binaries are known to ignore this requirement.  */
11759                   && filedata->file_header.e_machine != EM_MIPS
11760                   /* Solaris binaries have been found to violate this requirement as
11761                      well.  Not sure if this is a bug or an ABI requirement.  */
11762                   && filedata->file_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
11763                 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11764                       si, printable_section_name (filedata, section), section->sh_info);
11765             }
11766
11767           free (symtab);
11768           if (strtab != filedata->string_table)
11769             free (strtab);
11770         }
11771     }
11772   else if (do_syms)
11773     printf
11774       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11775
11776   if (do_histogram && buckets != NULL)
11777     {
11778       unsigned long * lengths;
11779       unsigned long * counts;
11780       unsigned long hn;
11781       bfd_vma si;
11782       unsigned long maxlength = 0;
11783       unsigned long nzero_counts = 0;
11784       unsigned long nsyms = 0;
11785       char *visited;
11786
11787       printf (ngettext ("\nHistogram for bucket list length "
11788                         "(total of %lu bucket):\n",
11789                         "\nHistogram for bucket list length "
11790                         "(total of %lu buckets):\n",
11791                         (unsigned long) nbuckets),
11792               (unsigned long) nbuckets);
11793
11794       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11795       if (lengths == NULL)
11796         {
11797           error (_("Out of memory allocating space for histogram buckets\n"));
11798           return FALSE;
11799         }
11800       visited = xcmalloc (nchains, 1);
11801       memset (visited, 0, nchains);
11802
11803       printf (_(" Length  Number     %% of total  Coverage\n"));
11804       for (hn = 0; hn < nbuckets; ++hn)
11805         {
11806           for (si = buckets[hn]; si > 0; si = chains[si])
11807             {
11808               ++nsyms;
11809               if (maxlength < ++lengths[hn])
11810                 ++maxlength;
11811               if (si >= nchains || visited[si])
11812                 {
11813                   error (_("histogram chain is corrupt\n"));
11814                   break;
11815                 }
11816               visited[si] = 1;
11817             }
11818         }
11819       free (visited);
11820
11821       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11822       if (counts == NULL)
11823         {
11824           free (lengths);
11825           error (_("Out of memory allocating space for histogram counts\n"));
11826           return FALSE;
11827         }
11828
11829       for (hn = 0; hn < nbuckets; ++hn)
11830         ++counts[lengths[hn]];
11831
11832       if (nbuckets > 0)
11833         {
11834           unsigned long i;
11835           printf ("      0  %-10lu (%5.1f%%)\n",
11836                   counts[0], (counts[0] * 100.0) / nbuckets);
11837           for (i = 1; i <= maxlength; ++i)
11838             {
11839               nzero_counts += counts[i] * i;
11840               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
11841                       i, counts[i], (counts[i] * 100.0) / nbuckets,
11842                       (nzero_counts * 100.0) / nsyms);
11843             }
11844         }
11845
11846       free (counts);
11847       free (lengths);
11848     }
11849
11850   if (buckets != NULL)
11851     {
11852       free (buckets);
11853       free (chains);
11854     }
11855
11856   if (do_histogram && gnubuckets != NULL)
11857     {
11858       unsigned long * lengths;
11859       unsigned long * counts;
11860       unsigned long hn;
11861       unsigned long maxlength = 0;
11862       unsigned long nzero_counts = 0;
11863       unsigned long nsyms = 0;
11864
11865       printf (ngettext ("\nHistogram for `.gnu.hash' bucket list length "
11866                         "(total of %lu bucket):\n",
11867                         "\nHistogram for `.gnu.hash' bucket list length "
11868                         "(total of %lu buckets):\n",
11869                         (unsigned long) ngnubuckets),
11870               (unsigned long) ngnubuckets);
11871
11872       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
11873       if (lengths == NULL)
11874         {
11875           error (_("Out of memory allocating space for gnu histogram buckets\n"));
11876           return FALSE;
11877         }
11878
11879       printf (_(" Length  Number     %% of total  Coverage\n"));
11880
11881       for (hn = 0; hn < ngnubuckets; ++hn)
11882         if (gnubuckets[hn] != 0)
11883           {
11884             bfd_vma off, length = 1;
11885
11886             for (off = gnubuckets[hn] - gnusymidx;
11887                  /* PR 17531 file: 010-77222-0.004.  */
11888                  off < ngnuchains && (gnuchains[off] & 1) == 0;
11889                  ++off)
11890               ++length;
11891             lengths[hn] = length;
11892             if (length > maxlength)
11893               maxlength = length;
11894             nsyms += length;
11895           }
11896
11897       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11898       if (counts == NULL)
11899         {
11900           free (lengths);
11901           error (_("Out of memory allocating space for gnu histogram counts\n"));
11902           return FALSE;
11903         }
11904
11905       for (hn = 0; hn < ngnubuckets; ++hn)
11906         ++counts[lengths[hn]];
11907
11908       if (ngnubuckets > 0)
11909         {
11910           unsigned long j;
11911           printf ("      0  %-10lu (%5.1f%%)\n",
11912                   counts[0], (counts[0] * 100.0) / ngnubuckets);
11913           for (j = 1; j <= maxlength; ++j)
11914             {
11915               nzero_counts += counts[j] * j;
11916               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
11917                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11918                       (nzero_counts * 100.0) / nsyms);
11919             }
11920         }
11921
11922       free (counts);
11923       free (lengths);
11924       free (gnubuckets);
11925       free (gnuchains);
11926     }
11927
11928   return TRUE;
11929 }
11930
11931 static bfd_boolean
11932 process_syminfo (Filedata * filedata ATTRIBUTE_UNUSED)
11933 {
11934   unsigned int i;
11935
11936   if (dynamic_syminfo == NULL
11937       || !do_dynamic)
11938     /* No syminfo, this is ok.  */
11939     return TRUE;
11940
11941   /* There better should be a dynamic symbol section.  */
11942   if (dynamic_symbols == NULL || dynamic_strings == NULL)
11943     return FALSE;
11944
11945   if (dynamic_addr)
11946     printf (ngettext ("\nDynamic info segment at offset 0x%lx "
11947                       "contains %d entry:\n",
11948                       "\nDynamic info segment at offset 0x%lx "
11949                       "contains %d entries:\n",
11950                       dynamic_syminfo_nent),
11951             dynamic_syminfo_offset, dynamic_syminfo_nent);
11952
11953   printf (_(" Num: Name                           BoundTo     Flags\n"));
11954   for (i = 0; i < dynamic_syminfo_nent; ++i)
11955     {
11956       unsigned short int flags = dynamic_syminfo[i].si_flags;
11957
11958       printf ("%4d: ", i);
11959       if (i >= num_dynamic_syms)
11960         printf (_("<corrupt index>"));
11961       else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
11962         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11963       else
11964         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
11965       putchar (' ');
11966
11967       switch (dynamic_syminfo[i].si_boundto)
11968         {
11969         case SYMINFO_BT_SELF:
11970           fputs ("SELF       ", stdout);
11971           break;
11972         case SYMINFO_BT_PARENT:
11973           fputs ("PARENT     ", stdout);
11974           break;
11975         default:
11976           if (dynamic_syminfo[i].si_boundto > 0
11977               && dynamic_syminfo[i].si_boundto < dynamic_nent
11978               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
11979             {
11980               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
11981               putchar (' ' );
11982             }
11983           else
11984             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11985           break;
11986         }
11987
11988       if (flags & SYMINFO_FLG_DIRECT)
11989         printf (" DIRECT");
11990       if (flags & SYMINFO_FLG_PASSTHRU)
11991         printf (" PASSTHRU");
11992       if (flags & SYMINFO_FLG_COPY)
11993         printf (" COPY");
11994       if (flags & SYMINFO_FLG_LAZYLOAD)
11995         printf (" LAZYLOAD");
11996
11997       puts ("");
11998     }
11999
12000   return TRUE;
12001 }
12002
12003 #define IN_RANGE(START,END,ADDR,OFF)            \
12004   (((ADDR) >= (START)) && ((ADDR) + (OFF) < (END)))
12005
12006 /* Check to see if the given reloc needs to be handled in a target specific
12007    manner.  If so then process the reloc and return TRUE otherwise return
12008    FALSE.
12009
12010    If called with reloc == NULL, then this is a signal that reloc processing
12011    for the current section has finished, and any saved state should be
12012    discarded.  */
12013
12014 static bfd_boolean
12015 target_specific_reloc_handling (Filedata *           filedata,
12016                                 Elf_Internal_Rela *  reloc,
12017                                 unsigned char *      start,
12018                                 unsigned char *      end,
12019                                 Elf_Internal_Sym *   symtab,
12020                                 unsigned long        num_syms)
12021 {
12022   unsigned int reloc_type = 0;
12023   unsigned long sym_index = 0;
12024
12025   if (reloc)
12026     {
12027       reloc_type = get_reloc_type (filedata, reloc->r_info);
12028       sym_index = get_reloc_symindex (reloc->r_info);
12029     }
12030
12031   switch (filedata->file_header.e_machine)
12032     {
12033     case EM_MSP430:
12034     case EM_MSP430_OLD:
12035       {
12036         static Elf_Internal_Sym * saved_sym = NULL;
12037
12038         if (reloc == NULL)
12039           {
12040             saved_sym = NULL;
12041             return TRUE;
12042           }
12043
12044         switch (reloc_type)
12045           {
12046           case 10: /* R_MSP430_SYM_DIFF */
12047             if (uses_msp430x_relocs (filedata))
12048               break;
12049             /* Fall through.  */
12050           case 21: /* R_MSP430X_SYM_DIFF */
12051             /* PR 21139.  */
12052             if (sym_index >= num_syms)
12053               error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
12054                      sym_index);
12055             else
12056               saved_sym = symtab + sym_index;
12057             return TRUE;
12058
12059           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
12060           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
12061             goto handle_sym_diff;
12062
12063           case 5: /* R_MSP430_16_BYTE */
12064           case 9: /* R_MSP430_8 */
12065             if (uses_msp430x_relocs (filedata))
12066               break;
12067             goto handle_sym_diff;
12068
12069           case 2: /* R_MSP430_ABS16 */
12070           case 15: /* R_MSP430X_ABS16 */
12071             if (! uses_msp430x_relocs (filedata))
12072               break;
12073             goto handle_sym_diff;
12074
12075           handle_sym_diff:
12076             if (saved_sym != NULL)
12077               {
12078                 int reloc_size = reloc_type == 1 ? 4 : 2;
12079                 bfd_vma value;
12080
12081                 if (sym_index >= num_syms)
12082                   error (_("MSP430 reloc contains invalid symbol index %lu\n"),
12083                          sym_index);
12084                 else
12085                   {
12086                     value = reloc->r_addend + (symtab[sym_index].st_value
12087                                                - saved_sym->st_value);
12088
12089                     if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12090                       byte_put (start + reloc->r_offset, value, reloc_size);
12091                     else
12092                       /* PR 21137 */
12093                       error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
12094                              (long) reloc->r_offset);
12095                   }
12096
12097                 saved_sym = NULL;
12098                 return TRUE;
12099               }
12100             break;
12101
12102           default:
12103             if (saved_sym != NULL)
12104               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
12105             break;
12106           }
12107         break;
12108       }
12109
12110     case EM_MN10300:
12111     case EM_CYGNUS_MN10300:
12112       {
12113         static Elf_Internal_Sym * saved_sym = NULL;
12114
12115         if (reloc == NULL)
12116           {
12117             saved_sym = NULL;
12118             return TRUE;
12119           }
12120
12121         switch (reloc_type)
12122           {
12123           case 34: /* R_MN10300_ALIGN */
12124             return TRUE;
12125           case 33: /* R_MN10300_SYM_DIFF */
12126             if (sym_index >= num_syms)
12127               error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
12128                      sym_index);
12129             else
12130               saved_sym = symtab + sym_index;
12131             return TRUE;
12132
12133           case 1: /* R_MN10300_32 */
12134           case 2: /* R_MN10300_16 */
12135             if (saved_sym != NULL)
12136               {
12137                 int reloc_size = reloc_type == 1 ? 4 : 2;
12138                 bfd_vma value;
12139
12140                 if (sym_index >= num_syms)
12141                   error (_("MN10300 reloc contains invalid symbol index %lu\n"),
12142                          sym_index);
12143                 else
12144                   {
12145                     value = reloc->r_addend + (symtab[sym_index].st_value
12146                                                - saved_sym->st_value);
12147
12148                     if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12149                       byte_put (start + reloc->r_offset, value, reloc_size);
12150                     else
12151                       error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
12152                              (long) reloc->r_offset);
12153                   }
12154
12155                 saved_sym = NULL;
12156                 return TRUE;
12157               }
12158             break;
12159           default:
12160             if (saved_sym != NULL)
12161               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
12162             break;
12163           }
12164         break;
12165       }
12166
12167     case EM_RL78:
12168       {
12169         static bfd_vma saved_sym1 = 0;
12170         static bfd_vma saved_sym2 = 0;
12171         static bfd_vma value;
12172
12173         if (reloc == NULL)
12174           {
12175             saved_sym1 = saved_sym2 = 0;
12176             return TRUE;
12177           }
12178
12179         switch (reloc_type)
12180           {
12181           case 0x80: /* R_RL78_SYM.  */
12182             saved_sym1 = saved_sym2;
12183             if (sym_index >= num_syms)
12184               error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
12185                      sym_index);
12186             else
12187               {
12188                 saved_sym2 = symtab[sym_index].st_value;
12189                 saved_sym2 += reloc->r_addend;
12190               }
12191             return TRUE;
12192
12193           case 0x83: /* R_RL78_OPsub.  */
12194             value = saved_sym1 - saved_sym2;
12195             saved_sym2 = saved_sym1 = 0;
12196             return TRUE;
12197             break;
12198
12199           case 0x41: /* R_RL78_ABS32.  */
12200             if (IN_RANGE (start, end, start + reloc->r_offset, 4))
12201               byte_put (start + reloc->r_offset, value, 4);
12202             else
12203               error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12204                      (long) reloc->r_offset);
12205             value = 0;
12206             return TRUE;
12207
12208           case 0x43: /* R_RL78_ABS16.  */
12209             if (IN_RANGE (start, end, start + reloc->r_offset, 2))
12210               byte_put (start + reloc->r_offset, value, 2);
12211             else
12212               error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12213                      (long) reloc->r_offset);
12214             value = 0;
12215             return TRUE;
12216
12217           default:
12218             break;
12219           }
12220         break;
12221       }
12222     }
12223
12224   return FALSE;
12225 }
12226
12227 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
12228    DWARF debug sections.  This is a target specific test.  Note - we do not
12229    go through the whole including-target-headers-multiple-times route, (as
12230    we have already done with <elf/h8.h>) because this would become very
12231    messy and even then this function would have to contain target specific
12232    information (the names of the relocs instead of their numeric values).
12233    FIXME: This is not the correct way to solve this problem.  The proper way
12234    is to have target specific reloc sizing and typing functions created by
12235    the reloc-macros.h header, in the same way that it already creates the
12236    reloc naming functions.  */
12237
12238 static bfd_boolean
12239 is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12240 {
12241   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12242   switch (filedata->file_header.e_machine)
12243     {
12244     case EM_386:
12245     case EM_IAMCU:
12246       return reloc_type == 1; /* R_386_32.  */
12247     case EM_68K:
12248       return reloc_type == 1; /* R_68K_32.  */
12249     case EM_860:
12250       return reloc_type == 1; /* R_860_32.  */
12251     case EM_960:
12252       return reloc_type == 2; /* R_960_32.  */
12253     case EM_AARCH64:
12254       return (reloc_type == 258
12255               || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
12256     case EM_ADAPTEVA_EPIPHANY:
12257       return reloc_type == 3;
12258     case EM_ALPHA:
12259       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
12260     case EM_ARC:
12261       return reloc_type == 1; /* R_ARC_32.  */
12262     case EM_ARC_COMPACT:
12263     case EM_ARC_COMPACT2:
12264       return reloc_type == 4; /* R_ARC_32.  */
12265     case EM_ARM:
12266       return reloc_type == 2; /* R_ARM_ABS32 */
12267     case EM_AVR_OLD:
12268     case EM_AVR:
12269       return reloc_type == 1;
12270     case EM_BLACKFIN:
12271       return reloc_type == 0x12; /* R_byte4_data.  */
12272     case EM_CRIS:
12273       return reloc_type == 3; /* R_CRIS_32.  */
12274     case EM_CR16:
12275       return reloc_type == 3; /* R_CR16_NUM32.  */
12276     case EM_CRX:
12277       return reloc_type == 15; /* R_CRX_NUM32.  */
12278     case EM_CYGNUS_FRV:
12279       return reloc_type == 1;
12280     case EM_CYGNUS_D10V:
12281     case EM_D10V:
12282       return reloc_type == 6; /* R_D10V_32.  */
12283     case EM_CYGNUS_D30V:
12284     case EM_D30V:
12285       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
12286     case EM_DLX:
12287       return reloc_type == 3; /* R_DLX_RELOC_32.  */
12288     case EM_CYGNUS_FR30:
12289     case EM_FR30:
12290       return reloc_type == 3; /* R_FR30_32.  */
12291     case EM_FT32:
12292       return reloc_type == 1; /* R_FT32_32.  */
12293     case EM_H8S:
12294     case EM_H8_300:
12295     case EM_H8_300H:
12296       return reloc_type == 1; /* R_H8_DIR32.  */
12297     case EM_IA_64:
12298       return (reloc_type == 0x64    /* R_IA64_SECREL32MSB.  */
12299               || reloc_type == 0x65 /* R_IA64_SECREL32LSB.  */
12300               || reloc_type == 0x24 /* R_IA64_DIR32MSB.  */
12301               || reloc_type == 0x25 /* R_IA64_DIR32LSB.  */);
12302     case EM_IP2K_OLD:
12303     case EM_IP2K:
12304       return reloc_type == 2; /* R_IP2K_32.  */
12305     case EM_IQ2000:
12306       return reloc_type == 2; /* R_IQ2000_32.  */
12307     case EM_LATTICEMICO32:
12308       return reloc_type == 3; /* R_LM32_32.  */
12309     case EM_M32C_OLD:
12310     case EM_M32C:
12311       return reloc_type == 3; /* R_M32C_32.  */
12312     case EM_M32R:
12313       return reloc_type == 34; /* R_M32R_32_RELA.  */
12314     case EM_68HC11:
12315     case EM_68HC12:
12316       return reloc_type == 6; /* R_M68HC11_32.  */
12317     case EM_S12Z:
12318       return reloc_type == 6; /* R_S12Z_EXT32.  */
12319     case EM_MCORE:
12320       return reloc_type == 1; /* R_MCORE_ADDR32.  */
12321     case EM_CYGNUS_MEP:
12322       return reloc_type == 4; /* R_MEP_32.  */
12323     case EM_METAG:
12324       return reloc_type == 2; /* R_METAG_ADDR32.  */
12325     case EM_MICROBLAZE:
12326       return reloc_type == 1; /* R_MICROBLAZE_32.  */
12327     case EM_MIPS:
12328       return reloc_type == 2; /* R_MIPS_32.  */
12329     case EM_MMIX:
12330       return reloc_type == 4; /* R_MMIX_32.  */
12331     case EM_CYGNUS_MN10200:
12332     case EM_MN10200:
12333       return reloc_type == 1; /* R_MN10200_32.  */
12334     case EM_CYGNUS_MN10300:
12335     case EM_MN10300:
12336       return reloc_type == 1; /* R_MN10300_32.  */
12337     case EM_MOXIE:
12338       return reloc_type == 1; /* R_MOXIE_32.  */
12339     case EM_MSP430_OLD:
12340     case EM_MSP430:
12341       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
12342     case EM_MT:
12343       return reloc_type == 2; /* R_MT_32.  */
12344     case EM_NDS32:
12345       return reloc_type == 20; /* R_NDS32_RELA.  */
12346     case EM_ALTERA_NIOS2:
12347       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
12348     case EM_NIOS32:
12349       return reloc_type == 1; /* R_NIOS_32.  */
12350     case EM_OR1K:
12351       return reloc_type == 1; /* R_OR1K_32.  */
12352     case EM_PARISC:
12353       return (reloc_type == 1 /* R_PARISC_DIR32.  */          
12354               || reloc_type == 2 /* R_PARISC_DIR21L.  */
12355               || reloc_type == 41); /* R_PARISC_SECREL32.  */
12356     case EM_PJ:
12357     case EM_PJ_OLD:
12358       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
12359     case EM_PPC64:
12360       return reloc_type == 1; /* R_PPC64_ADDR32.  */
12361     case EM_PPC:
12362       return reloc_type == 1; /* R_PPC_ADDR32.  */
12363     case EM_TI_PRU:
12364       return reloc_type == 11; /* R_PRU_BFD_RELOC_32.  */
12365     case EM_RISCV:
12366       return reloc_type == 1; /* R_RISCV_32.  */
12367     case EM_RL78:
12368       return reloc_type == 1; /* R_RL78_DIR32.  */
12369     case EM_RX:
12370       return reloc_type == 1; /* R_RX_DIR32.  */
12371     case EM_S370:
12372       return reloc_type == 1; /* R_I370_ADDR31.  */
12373     case EM_S390_OLD:
12374     case EM_S390:
12375       return reloc_type == 4; /* R_S390_32.  */
12376     case EM_SCORE:
12377       return reloc_type == 8; /* R_SCORE_ABS32.  */
12378     case EM_SH:
12379       return reloc_type == 1; /* R_SH_DIR32.  */
12380     case EM_SPARC32PLUS:
12381     case EM_SPARCV9:
12382     case EM_SPARC:
12383       return reloc_type == 3 /* R_SPARC_32.  */
12384         || reloc_type == 23; /* R_SPARC_UA32.  */
12385     case EM_SPU:
12386       return reloc_type == 6; /* R_SPU_ADDR32 */
12387     case EM_TI_C6000:
12388       return reloc_type == 1; /* R_C6000_ABS32.  */
12389     case EM_TILEGX:
12390       return reloc_type == 2; /* R_TILEGX_32.  */
12391     case EM_TILEPRO:
12392       return reloc_type == 1; /* R_TILEPRO_32.  */
12393     case EM_CYGNUS_V850:
12394     case EM_V850:
12395       return reloc_type == 6; /* R_V850_ABS32.  */
12396     case EM_V800:
12397       return reloc_type == 0x33; /* R_V810_WORD.  */
12398     case EM_VAX:
12399       return reloc_type == 1; /* R_VAX_32.  */
12400     case EM_VISIUM:
12401       return reloc_type == 3;  /* R_VISIUM_32. */
12402     case EM_WEBASSEMBLY:
12403       return reloc_type == 1;  /* R_WASM32_32.  */
12404     case EM_X86_64:
12405     case EM_L1OM:
12406     case EM_K1OM:
12407       return reloc_type == 10; /* R_X86_64_32.  */
12408     case EM_XC16X:
12409     case EM_C166:
12410       return reloc_type == 3; /* R_XC16C_ABS_32.  */
12411     case EM_XGATE:
12412       return reloc_type == 4; /* R_XGATE_32.  */
12413     case EM_XSTORMY16:
12414       return reloc_type == 1; /* R_XSTROMY16_32.  */
12415     case EM_XTENSA_OLD:
12416     case EM_XTENSA:
12417       return reloc_type == 1; /* R_XTENSA_32.  */
12418     default:
12419       {
12420         static unsigned int prev_warn = 0;
12421
12422         /* Avoid repeating the same warning multiple times.  */
12423         if (prev_warn != filedata->file_header.e_machine)
12424           error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
12425                  filedata->file_header.e_machine);
12426         prev_warn = filedata->file_header.e_machine;
12427         return FALSE;
12428       }
12429     }
12430 }
12431
12432 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12433    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
12434
12435 static bfd_boolean
12436 is_32bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12437 {
12438   switch (filedata->file_header.e_machine)
12439   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12440     {
12441     case EM_386:
12442     case EM_IAMCU:
12443       return reloc_type == 2;  /* R_386_PC32.  */
12444     case EM_68K:
12445       return reloc_type == 4;  /* R_68K_PC32.  */
12446     case EM_AARCH64:
12447       return reloc_type == 261; /* R_AARCH64_PREL32 */
12448     case EM_ADAPTEVA_EPIPHANY:
12449       return reloc_type == 6;
12450     case EM_ALPHA:
12451       return reloc_type == 10; /* R_ALPHA_SREL32.  */
12452     case EM_ARC_COMPACT:
12453     case EM_ARC_COMPACT2:
12454       return reloc_type == 49; /* R_ARC_32_PCREL.  */
12455     case EM_ARM:
12456       return reloc_type == 3;  /* R_ARM_REL32 */
12457     case EM_AVR_OLD:
12458     case EM_AVR:
12459       return reloc_type == 36; /* R_AVR_32_PCREL.  */
12460     case EM_MICROBLAZE:
12461       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
12462     case EM_OR1K:
12463       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
12464     case EM_PARISC:
12465       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
12466     case EM_PPC:
12467       return reloc_type == 26; /* R_PPC_REL32.  */
12468     case EM_PPC64:
12469       return reloc_type == 26; /* R_PPC64_REL32.  */
12470     case EM_S390_OLD:
12471     case EM_S390:
12472       return reloc_type == 5;  /* R_390_PC32.  */
12473     case EM_SH:
12474       return reloc_type == 2;  /* R_SH_REL32.  */
12475     case EM_SPARC32PLUS:
12476     case EM_SPARCV9:
12477     case EM_SPARC:
12478       return reloc_type == 6;  /* R_SPARC_DISP32.  */
12479     case EM_SPU:
12480       return reloc_type == 13; /* R_SPU_REL32.  */
12481     case EM_TILEGX:
12482       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
12483     case EM_TILEPRO:
12484       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
12485     case EM_VISIUM:
12486       return reloc_type == 6;  /* R_VISIUM_32_PCREL */
12487     case EM_X86_64:
12488     case EM_L1OM:
12489     case EM_K1OM:
12490       return reloc_type == 2;  /* R_X86_64_PC32.  */
12491     case EM_XTENSA_OLD:
12492     case EM_XTENSA:
12493       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
12494     default:
12495       /* Do not abort or issue an error message here.  Not all targets use
12496          pc-relative 32-bit relocs in their DWARF debug information and we
12497          have already tested for target coverage in is_32bit_abs_reloc.  A
12498          more helpful warning message will be generated by apply_relocations
12499          anyway, so just return.  */
12500       return FALSE;
12501     }
12502 }
12503
12504 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12505    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
12506
12507 static bfd_boolean
12508 is_64bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12509 {
12510   switch (filedata->file_header.e_machine)
12511     {
12512     case EM_AARCH64:
12513       return reloc_type == 257; /* R_AARCH64_ABS64.  */
12514     case EM_ALPHA:
12515       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
12516     case EM_IA_64:
12517       return (reloc_type == 0x26    /* R_IA64_DIR64MSB.  */
12518               || reloc_type == 0x27 /* R_IA64_DIR64LSB.  */);
12519     case EM_PARISC:
12520       return reloc_type == 80; /* R_PARISC_DIR64.  */
12521     case EM_PPC64:
12522       return reloc_type == 38; /* R_PPC64_ADDR64.  */
12523     case EM_RISCV:
12524       return reloc_type == 2; /* R_RISCV_64.  */
12525     case EM_SPARC32PLUS:
12526     case EM_SPARCV9:
12527     case EM_SPARC:
12528       return reloc_type == 32 /* R_SPARC_64.  */
12529         || reloc_type == 54; /* R_SPARC_UA64.  */
12530     case EM_X86_64:
12531     case EM_L1OM:
12532     case EM_K1OM:
12533       return reloc_type == 1; /* R_X86_64_64.  */
12534     case EM_S390_OLD:
12535     case EM_S390:
12536       return reloc_type == 22;  /* R_S390_64.  */
12537     case EM_TILEGX:
12538       return reloc_type == 1; /* R_TILEGX_64.  */
12539     case EM_MIPS:
12540       return reloc_type == 18;  /* R_MIPS_64.  */
12541     default:
12542       return FALSE;
12543     }
12544 }
12545
12546 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12547    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
12548
12549 static bfd_boolean
12550 is_64bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12551 {
12552   switch (filedata->file_header.e_machine)
12553     {
12554     case EM_AARCH64:
12555       return reloc_type == 260; /* R_AARCH64_PREL64.  */
12556     case EM_ALPHA:
12557       return reloc_type == 11; /* R_ALPHA_SREL64.  */
12558     case EM_IA_64:
12559       return (reloc_type == 0x4e    /* R_IA64_PCREL64MSB.  */
12560               || reloc_type == 0x4f /* R_IA64_PCREL64LSB.  */);
12561     case EM_PARISC:
12562       return reloc_type == 72; /* R_PARISC_PCREL64.  */
12563     case EM_PPC64:
12564       return reloc_type == 44; /* R_PPC64_REL64.  */
12565     case EM_SPARC32PLUS:
12566     case EM_SPARCV9:
12567     case EM_SPARC:
12568       return reloc_type == 46; /* R_SPARC_DISP64.  */
12569     case EM_X86_64:
12570     case EM_L1OM:
12571     case EM_K1OM:
12572       return reloc_type == 24; /* R_X86_64_PC64.  */
12573     case EM_S390_OLD:
12574     case EM_S390:
12575       return reloc_type == 23;  /* R_S390_PC64.  */
12576     case EM_TILEGX:
12577       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
12578     default:
12579       return FALSE;
12580     }
12581 }
12582
12583 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12584    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
12585
12586 static bfd_boolean
12587 is_24bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12588 {
12589   switch (filedata->file_header.e_machine)
12590     {
12591     case EM_CYGNUS_MN10200:
12592     case EM_MN10200:
12593       return reloc_type == 4; /* R_MN10200_24.  */
12594     case EM_FT32:
12595       return reloc_type == 5; /* R_FT32_20.  */
12596     default:
12597       return FALSE;
12598     }
12599 }
12600
12601 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12602    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
12603
12604 static bfd_boolean
12605 is_16bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12606 {
12607   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12608   switch (filedata->file_header.e_machine)
12609     {
12610     case EM_ARC:
12611     case EM_ARC_COMPACT:
12612     case EM_ARC_COMPACT2:
12613       return reloc_type == 2; /* R_ARC_16.  */
12614     case EM_ADAPTEVA_EPIPHANY:
12615       return reloc_type == 5;
12616     case EM_AVR_OLD:
12617     case EM_AVR:
12618       return reloc_type == 4; /* R_AVR_16.  */
12619     case EM_CYGNUS_D10V:
12620     case EM_D10V:
12621       return reloc_type == 3; /* R_D10V_16.  */
12622     case EM_FT32:
12623       return reloc_type == 2; /* R_FT32_16.  */
12624     case EM_H8S:
12625     case EM_H8_300:
12626     case EM_H8_300H:
12627       return reloc_type == R_H8_DIR16;
12628     case EM_IP2K_OLD:
12629     case EM_IP2K:
12630       return reloc_type == 1; /* R_IP2K_16.  */
12631     case EM_M32C_OLD:
12632     case EM_M32C:
12633       return reloc_type == 1; /* R_M32C_16 */
12634     case EM_CYGNUS_MN10200:
12635     case EM_MN10200:
12636       return reloc_type == 2; /* R_MN10200_16.  */
12637     case EM_CYGNUS_MN10300:
12638     case EM_MN10300:
12639       return reloc_type == 2; /* R_MN10300_16.  */
12640     case EM_MSP430:
12641       if (uses_msp430x_relocs (filedata))
12642         return reloc_type == 2; /* R_MSP430_ABS16.  */
12643       /* Fall through.  */
12644     case EM_MSP430_OLD:
12645       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
12646     case EM_NDS32:
12647       return reloc_type == 19; /* R_NDS32_RELA.  */
12648     case EM_ALTERA_NIOS2:
12649       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
12650     case EM_NIOS32:
12651       return reloc_type == 9; /* R_NIOS_16.  */
12652     case EM_OR1K:
12653       return reloc_type == 2; /* R_OR1K_16.  */
12654     case EM_TI_PRU:
12655       return reloc_type == 8; /* R_PRU_BFD_RELOC_16.  */
12656     case EM_TI_C6000:
12657       return reloc_type == 2; /* R_C6000_ABS16.  */
12658     case EM_VISIUM:
12659       return reloc_type == 2; /* R_VISIUM_16. */
12660     case EM_XC16X:
12661     case EM_C166:
12662       return reloc_type == 2; /* R_XC16C_ABS_16.  */
12663     case EM_XGATE:
12664       return reloc_type == 3; /* R_XGATE_16.  */
12665     default:
12666       return FALSE;
12667     }
12668 }
12669
12670 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12671    a 32-bit inplace add RELA relocation used in DWARF debug sections.  */
12672
12673 static bfd_boolean
12674 is_32bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12675 {
12676   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12677   switch (filedata->file_header.e_machine)
12678     {
12679     case EM_RISCV:
12680       return reloc_type == 35; /* R_RISCV_ADD32.  */
12681     default:
12682       return FALSE;
12683     }
12684 }
12685
12686 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12687    a 32-bit inplace sub RELA relocation used in DWARF debug sections.  */
12688
12689 static bfd_boolean
12690 is_32bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12691 {
12692   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12693   switch (filedata->file_header.e_machine)
12694     {
12695     case EM_RISCV:
12696       return reloc_type == 39; /* R_RISCV_SUB32.  */
12697     default:
12698       return FALSE;
12699     }
12700 }
12701
12702 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12703    a 64-bit inplace add RELA relocation used in DWARF debug sections.  */
12704
12705 static bfd_boolean
12706 is_64bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12707 {
12708   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12709   switch (filedata->file_header.e_machine)
12710     {
12711     case EM_RISCV:
12712       return reloc_type == 36; /* R_RISCV_ADD64.  */
12713     default:
12714       return FALSE;
12715     }
12716 }
12717
12718 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12719    a 64-bit inplace sub RELA relocation used in DWARF debug sections.  */
12720
12721 static bfd_boolean
12722 is_64bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12723 {
12724   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12725   switch (filedata->file_header.e_machine)
12726     {
12727     case EM_RISCV:
12728       return reloc_type == 40; /* R_RISCV_SUB64.  */
12729     default:
12730       return FALSE;
12731     }
12732 }
12733
12734 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12735    a 16-bit inplace add RELA relocation used in DWARF debug sections.  */
12736
12737 static bfd_boolean
12738 is_16bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12739 {
12740   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12741   switch (filedata->file_header.e_machine)
12742     {
12743     case EM_RISCV:
12744       return reloc_type == 34; /* R_RISCV_ADD16.  */
12745     default:
12746       return FALSE;
12747     }
12748 }
12749
12750 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12751    a 16-bit inplace sub RELA relocation used in DWARF debug sections.  */
12752
12753 static bfd_boolean
12754 is_16bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12755 {
12756   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12757   switch (filedata->file_header.e_machine)
12758     {
12759     case EM_RISCV:
12760       return reloc_type == 38; /* R_RISCV_SUB16.  */
12761     default:
12762       return FALSE;
12763     }
12764 }
12765
12766 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12767    a 8-bit inplace add RELA relocation used in DWARF debug sections.  */
12768
12769 static bfd_boolean
12770 is_8bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12771 {
12772   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12773   switch (filedata->file_header.e_machine)
12774     {
12775     case EM_RISCV:
12776       return reloc_type == 33; /* R_RISCV_ADD8.  */
12777     default:
12778       return FALSE;
12779     }
12780 }
12781
12782 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12783    a 8-bit inplace sub RELA relocation used in DWARF debug sections.  */
12784
12785 static bfd_boolean
12786 is_8bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12787 {
12788   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12789   switch (filedata->file_header.e_machine)
12790     {
12791     case EM_RISCV:
12792       return reloc_type == 37; /* R_RISCV_SUB8.  */
12793     default:
12794       return FALSE;
12795     }
12796 }
12797
12798 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12799    relocation entries (possibly formerly used for SHT_GROUP sections).  */
12800
12801 static bfd_boolean
12802 is_none_reloc (Filedata * filedata, unsigned int reloc_type)
12803 {
12804   switch (filedata->file_header.e_machine)
12805     {
12806     case EM_386:     /* R_386_NONE.  */
12807     case EM_68K:     /* R_68K_NONE.  */
12808     case EM_ADAPTEVA_EPIPHANY:
12809     case EM_ALPHA:   /* R_ALPHA_NONE.  */
12810     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
12811     case EM_ARC:     /* R_ARC_NONE.  */
12812     case EM_ARC_COMPACT2: /* R_ARC_NONE.  */
12813     case EM_ARC_COMPACT: /* R_ARC_NONE.  */
12814     case EM_ARM:     /* R_ARM_NONE.  */
12815     case EM_C166:    /* R_XC16X_NONE.  */
12816     case EM_CRIS:    /* R_CRIS_NONE.  */
12817     case EM_FT32:    /* R_FT32_NONE.  */
12818     case EM_IA_64:   /* R_IA64_NONE.  */
12819     case EM_K1OM:    /* R_X86_64_NONE.  */
12820     case EM_L1OM:    /* R_X86_64_NONE.  */
12821     case EM_M32R:    /* R_M32R_NONE.  */
12822     case EM_MIPS:    /* R_MIPS_NONE.  */
12823     case EM_MN10300: /* R_MN10300_NONE.  */
12824     case EM_MOXIE:   /* R_MOXIE_NONE.  */
12825     case EM_NIOS32:  /* R_NIOS_NONE.  */
12826     case EM_OR1K:    /* R_OR1K_NONE. */
12827     case EM_PARISC:  /* R_PARISC_NONE.  */
12828     case EM_PPC64:   /* R_PPC64_NONE.  */
12829     case EM_PPC:     /* R_PPC_NONE.  */
12830     case EM_RISCV:   /* R_RISCV_NONE.  */
12831     case EM_S390:    /* R_390_NONE.  */
12832     case EM_S390_OLD:
12833     case EM_SH:      /* R_SH_NONE.  */
12834     case EM_SPARC32PLUS:
12835     case EM_SPARC:   /* R_SPARC_NONE.  */
12836     case EM_SPARCV9:
12837     case EM_TILEGX:  /* R_TILEGX_NONE.  */
12838     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
12839     case EM_TI_C6000:/* R_C6000_NONE.  */
12840     case EM_X86_64:  /* R_X86_64_NONE.  */
12841     case EM_XC16X:
12842     case EM_WEBASSEMBLY: /* R_WASM32_NONE.  */
12843       return reloc_type == 0;
12844
12845     case EM_AARCH64:
12846       return reloc_type == 0 || reloc_type == 256;
12847     case EM_AVR_OLD:
12848     case EM_AVR:
12849       return (reloc_type == 0 /* R_AVR_NONE.  */
12850               || reloc_type == 30 /* R_AVR_DIFF8.  */
12851               || reloc_type == 31 /* R_AVR_DIFF16.  */
12852               || reloc_type == 32 /* R_AVR_DIFF32.  */);
12853     case EM_METAG:
12854       return reloc_type == 3; /* R_METAG_NONE.  */
12855     case EM_NDS32:
12856       return (reloc_type == 0       /* R_XTENSA_NONE.  */
12857               || reloc_type == 204  /* R_NDS32_DIFF8.  */
12858               || reloc_type == 205  /* R_NDS32_DIFF16.  */
12859               || reloc_type == 206  /* R_NDS32_DIFF32.  */
12860               || reloc_type == 207  /* R_NDS32_ULEB128.  */);
12861     case EM_TI_PRU:
12862       return (reloc_type == 0       /* R_PRU_NONE.  */
12863               || reloc_type == 65   /* R_PRU_DIFF8.  */
12864               || reloc_type == 66   /* R_PRU_DIFF16.  */
12865               || reloc_type == 67   /* R_PRU_DIFF32.  */);
12866     case EM_XTENSA_OLD:
12867     case EM_XTENSA:
12868       return (reloc_type == 0      /* R_XTENSA_NONE.  */
12869               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
12870               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
12871               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
12872     }
12873   return FALSE;
12874 }
12875
12876 /* Returns TRUE if there is a relocation against
12877    section NAME at OFFSET bytes.  */
12878
12879 bfd_boolean
12880 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
12881 {
12882   Elf_Internal_Rela * relocs;
12883   Elf_Internal_Rela * rp;
12884
12885   if (dsec == NULL || dsec->reloc_info == NULL)
12886     return FALSE;
12887
12888   relocs = (Elf_Internal_Rela *) dsec->reloc_info;
12889
12890   for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
12891     if (rp->r_offset == offset)
12892       return TRUE;
12893
12894    return FALSE;
12895 }
12896
12897 /* Apply relocations to a section.
12898    Returns TRUE upon success, FALSE otherwise.
12899    If RELOCS_RETURN is non-NULL then it is set to point to the loaded relocs.
12900    It is then the caller's responsibility to free them.  NUM_RELOCS_RETURN
12901    will be set to the number of relocs loaded.
12902
12903    Note: So far support has been added only for those relocations
12904    which can be found in debug sections. FIXME: Add support for
12905    more relocations ?  */
12906
12907 static bfd_boolean
12908 apply_relocations (Filedata *                 filedata,
12909                    const Elf_Internal_Shdr *  section,
12910                    unsigned char *            start,
12911                    bfd_size_type              size,
12912                    void **                    relocs_return,
12913                    unsigned long *            num_relocs_return)
12914 {
12915   Elf_Internal_Shdr * relsec;
12916   unsigned char * end = start + size;
12917   bfd_boolean res = TRUE;
12918
12919   if (relocs_return != NULL)
12920     {
12921       * (Elf_Internal_Rela **) relocs_return = NULL;
12922       * num_relocs_return = 0;
12923     }
12924
12925   if (filedata->file_header.e_type != ET_REL)
12926     /* No relocs to apply.  */
12927     return TRUE;
12928
12929   /* Find the reloc section associated with the section.  */
12930   for (relsec = filedata->section_headers;
12931        relsec < filedata->section_headers + filedata->file_header.e_shnum;
12932        ++relsec)
12933     {
12934       bfd_boolean is_rela;
12935       unsigned long num_relocs;
12936       Elf_Internal_Rela * relocs;
12937       Elf_Internal_Rela * rp;
12938       Elf_Internal_Shdr * symsec;
12939       Elf_Internal_Sym * symtab;
12940       unsigned long num_syms;
12941       Elf_Internal_Sym * sym;
12942
12943       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12944           || relsec->sh_info >= filedata->file_header.e_shnum
12945           || filedata->section_headers + relsec->sh_info != section
12946           || relsec->sh_size == 0
12947           || relsec->sh_link >= filedata->file_header.e_shnum)
12948         continue;
12949
12950       is_rela = relsec->sh_type == SHT_RELA;
12951
12952       if (is_rela)
12953         {
12954           if (!slurp_rela_relocs (filedata, relsec->sh_offset,
12955                                   relsec->sh_size, & relocs, & num_relocs))
12956             return FALSE;
12957         }
12958       else
12959         {
12960           if (!slurp_rel_relocs (filedata, relsec->sh_offset,
12961                                  relsec->sh_size, & relocs, & num_relocs))
12962             return FALSE;
12963         }
12964
12965       /* SH uses RELA but uses in place value instead of the addend field.  */
12966       if (filedata->file_header.e_machine == EM_SH)
12967         is_rela = FALSE;
12968
12969       symsec = filedata->section_headers + relsec->sh_link;
12970       if (symsec->sh_type != SHT_SYMTAB
12971           && symsec->sh_type != SHT_DYNSYM)
12972         return FALSE;
12973       symtab = GET_ELF_SYMBOLS (filedata, symsec, & num_syms);
12974
12975       for (rp = relocs; rp < relocs + num_relocs; ++rp)
12976         {
12977           bfd_vma         addend;
12978           unsigned int    reloc_type;
12979           unsigned int    reloc_size;
12980           bfd_boolean     reloc_inplace = FALSE;
12981           bfd_boolean     reloc_subtract = FALSE;
12982           unsigned char * rloc;
12983           unsigned long   sym_index;
12984
12985           reloc_type = get_reloc_type (filedata, rp->r_info);
12986
12987           if (target_specific_reloc_handling (filedata, rp, start, end, symtab, num_syms))
12988             continue;
12989           else if (is_none_reloc (filedata, reloc_type))
12990             continue;
12991           else if (is_32bit_abs_reloc (filedata, reloc_type)
12992                    || is_32bit_pcrel_reloc (filedata, reloc_type))
12993             reloc_size = 4;
12994           else if (is_64bit_abs_reloc (filedata, reloc_type)
12995                    || is_64bit_pcrel_reloc (filedata, reloc_type))
12996             reloc_size = 8;
12997           else if (is_24bit_abs_reloc (filedata, reloc_type))
12998             reloc_size = 3;
12999           else if (is_16bit_abs_reloc (filedata, reloc_type))
13000             reloc_size = 2;
13001           else if ((reloc_subtract = is_32bit_inplace_sub_reloc (filedata,
13002                                                                  reloc_type))
13003                    || is_32bit_inplace_add_reloc (filedata, reloc_type))
13004             {
13005               reloc_size = 4;
13006               reloc_inplace = TRUE;
13007             }
13008           else if ((reloc_subtract = is_64bit_inplace_sub_reloc (filedata,
13009                                                                  reloc_type))
13010                    || is_64bit_inplace_add_reloc (filedata, reloc_type))
13011             {
13012               reloc_size = 8;
13013               reloc_inplace = TRUE;
13014             }
13015           else if ((reloc_subtract = is_16bit_inplace_sub_reloc (filedata,
13016                                                                  reloc_type))
13017                    || is_16bit_inplace_add_reloc (filedata, reloc_type))
13018             {
13019               reloc_size = 2;
13020               reloc_inplace = TRUE;
13021             }
13022           else if ((reloc_subtract = is_8bit_inplace_sub_reloc (filedata,
13023                                                                 reloc_type))
13024                    || is_8bit_inplace_add_reloc (filedata, reloc_type))
13025             {
13026               reloc_size = 1;
13027               reloc_inplace = TRUE;
13028             }
13029           else
13030             {
13031               static unsigned int prev_reloc = 0;
13032
13033               if (reloc_type != prev_reloc)
13034                 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
13035                       reloc_type, printable_section_name (filedata, section));
13036               prev_reloc = reloc_type;
13037               res = FALSE;
13038               continue;
13039             }
13040
13041           rloc = start + rp->r_offset;
13042           if ((rloc + reloc_size) > end || (rloc < start))
13043             {
13044               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
13045                     (unsigned long) rp->r_offset,
13046                     printable_section_name (filedata, section));
13047               res = FALSE;
13048               continue;
13049             }
13050
13051           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
13052           if (sym_index >= num_syms)
13053             {
13054               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
13055                     sym_index, printable_section_name (filedata, section));
13056               res = FALSE;
13057               continue;
13058             }
13059           sym = symtab + sym_index;
13060
13061           /* If the reloc has a symbol associated with it,
13062              make sure that it is of an appropriate type.
13063
13064              Relocations against symbols without type can happen.
13065              Gcc -feliminate-dwarf2-dups may generate symbols
13066              without type for debug info.
13067
13068              Icc generates relocations against function symbols
13069              instead of local labels.
13070
13071              Relocations against object symbols can happen, eg when
13072              referencing a global array.  For an example of this see
13073              the _clz.o binary in libgcc.a.  */
13074           if (sym != symtab
13075               && ELF_ST_TYPE (sym->st_info) != STT_COMMON
13076               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
13077             {
13078               warn (_("skipping unexpected symbol type %s in section %s relocation %ld\n"),
13079                     get_symbol_type (filedata, ELF_ST_TYPE (sym->st_info)),
13080                     printable_section_name (filedata, relsec),
13081                     (long int)(rp - relocs));
13082               res = FALSE;
13083               continue;
13084             }
13085
13086           addend = 0;
13087           if (is_rela)
13088             addend += rp->r_addend;
13089           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
13090              partial_inplace.  */
13091           if (!is_rela
13092               || (filedata->file_header.e_machine == EM_XTENSA
13093                   && reloc_type == 1)
13094               || ((filedata->file_header.e_machine == EM_PJ
13095                    || filedata->file_header.e_machine == EM_PJ_OLD)
13096                   && reloc_type == 1)
13097               || ((filedata->file_header.e_machine == EM_D30V
13098                    || filedata->file_header.e_machine == EM_CYGNUS_D30V)
13099                   && reloc_type == 12)
13100               || reloc_inplace)
13101             addend += byte_get (rloc, reloc_size);
13102
13103           if (is_32bit_pcrel_reloc (filedata, reloc_type)
13104               || is_64bit_pcrel_reloc (filedata, reloc_type))
13105             {
13106               /* On HPPA, all pc-relative relocations are biased by 8.  */
13107               if (filedata->file_header.e_machine == EM_PARISC)
13108                 addend -= 8;
13109               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
13110                         reloc_size);
13111             }
13112           else if (reloc_subtract)
13113             byte_put (rloc, addend - sym->st_value, reloc_size);
13114           else
13115             byte_put (rloc, addend + sym->st_value, reloc_size);
13116         }
13117
13118       free (symtab);
13119       /* Let the target specific reloc processing code know that
13120          we have finished with these relocs.  */
13121       target_specific_reloc_handling (filedata, NULL, NULL, NULL, NULL, 0);
13122
13123       if (relocs_return)
13124         {
13125           * (Elf_Internal_Rela **) relocs_return = relocs;
13126           * num_relocs_return = num_relocs;
13127         }
13128       else
13129         free (relocs);
13130
13131       break;
13132     }
13133
13134   return res;
13135 }
13136
13137 #ifdef SUPPORT_DISASSEMBLY
13138 static bfd_boolean
13139 disassemble_section (Elf_Internal_Shdr * section, Filedata * filedata)
13140 {
13141   printf (_("\nAssembly dump of section %s\n"), printable_section_name (filedata, section));
13142
13143   /* FIXME: XXX -- to be done --- XXX */
13144
13145   return TRUE;
13146 }
13147 #endif
13148
13149 /* Reads in the contents of SECTION from FILE, returning a pointer
13150    to a malloc'ed buffer or NULL if something went wrong.  */
13151
13152 static char *
13153 get_section_contents (Elf_Internal_Shdr * section, Filedata * filedata)
13154 {
13155   bfd_size_type num_bytes = section->sh_size;
13156
13157   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
13158     {
13159       printf (_("Section '%s' has no data to dump.\n"),
13160               printable_section_name (filedata, section));
13161       return NULL;
13162     }
13163
13164   return  (char *) get_data (NULL, filedata, section->sh_offset, 1, num_bytes,
13165                              _("section contents"));
13166 }
13167
13168 /* Uncompresses a section that was compressed using zlib, in place.  */
13169
13170 static bfd_boolean
13171 uncompress_section_contents (unsigned char **   buffer,
13172                              dwarf_size_type    uncompressed_size,
13173                              dwarf_size_type *  size)
13174 {
13175   dwarf_size_type compressed_size = *size;
13176   unsigned char * compressed_buffer = *buffer;
13177   unsigned char * uncompressed_buffer;
13178   z_stream strm;
13179   int rc;
13180
13181   /* It is possible the section consists of several compressed
13182      buffers concatenated together, so we uncompress in a loop.  */
13183   /* PR 18313: The state field in the z_stream structure is supposed
13184      to be invisible to the user (ie us), but some compilers will
13185      still complain about it being used without initialisation.  So
13186      we first zero the entire z_stream structure and then set the fields
13187      that we need.  */
13188   memset (& strm, 0, sizeof strm);
13189   strm.avail_in = compressed_size;
13190   strm.next_in = (Bytef *) compressed_buffer;
13191   strm.avail_out = uncompressed_size;
13192   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
13193
13194   rc = inflateInit (& strm);
13195   while (strm.avail_in > 0)
13196     {
13197       if (rc != Z_OK)
13198         goto fail;
13199       strm.next_out = ((Bytef *) uncompressed_buffer
13200                        + (uncompressed_size - strm.avail_out));
13201       rc = inflate (&strm, Z_FINISH);
13202       if (rc != Z_STREAM_END)
13203         goto fail;
13204       rc = inflateReset (& strm);
13205     }
13206   rc = inflateEnd (& strm);
13207   if (rc != Z_OK
13208       || strm.avail_out != 0)
13209     goto fail;
13210
13211   *buffer = uncompressed_buffer;
13212   *size = uncompressed_size;
13213   return TRUE;
13214
13215  fail:
13216   free (uncompressed_buffer);
13217   /* Indicate decompression failure.  */
13218   *buffer = NULL;
13219   return FALSE;
13220 }
13221
13222 static bfd_boolean
13223 dump_section_as_strings (Elf_Internal_Shdr * section, Filedata * filedata)
13224 {
13225   Elf_Internal_Shdr *  relsec;
13226   bfd_size_type        num_bytes;
13227   unsigned char *      data;
13228   unsigned char *      end;
13229   unsigned char *      real_start;
13230   unsigned char *      start;
13231   bfd_boolean          some_strings_shown;
13232
13233   real_start = start = (unsigned char *) get_section_contents (section, filedata);
13234   if (start == NULL)
13235     /* PR 21820: Do not fail if the section was empty.  */
13236     return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13237
13238   num_bytes = section->sh_size;
13239
13240   printf (_("\nString dump of section '%s':\n"), printable_section_name (filedata, section));
13241
13242   if (decompress_dumps)
13243     {
13244       dwarf_size_type new_size = num_bytes;
13245       dwarf_size_type uncompressed_size = 0;
13246
13247       if ((section->sh_flags & SHF_COMPRESSED) != 0)
13248         {
13249           Elf_Internal_Chdr chdr;
13250           unsigned int compression_header_size
13251             = get_compression_header (& chdr, (unsigned char *) start,
13252                                       num_bytes);
13253
13254           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13255             {
13256               warn (_("section '%s' has unsupported compress type: %d\n"),
13257                     printable_section_name (filedata, section), chdr.ch_type);
13258               return FALSE;
13259             }
13260           else if (chdr.ch_addralign != section->sh_addralign)
13261             {
13262               warn (_("compressed section '%s' is corrupted\n"),
13263                     printable_section_name (filedata, section));
13264               return FALSE;
13265             }
13266           uncompressed_size = chdr.ch_size;
13267           start += compression_header_size;
13268           new_size -= compression_header_size;
13269         }
13270       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13271         {
13272           /* Read the zlib header.  In this case, it should be "ZLIB"
13273              followed by the uncompressed section size, 8 bytes in
13274              big-endian order.  */
13275           uncompressed_size = start[4]; uncompressed_size <<= 8;
13276           uncompressed_size += start[5]; uncompressed_size <<= 8;
13277           uncompressed_size += start[6]; uncompressed_size <<= 8;
13278           uncompressed_size += start[7]; uncompressed_size <<= 8;
13279           uncompressed_size += start[8]; uncompressed_size <<= 8;
13280           uncompressed_size += start[9]; uncompressed_size <<= 8;
13281           uncompressed_size += start[10]; uncompressed_size <<= 8;
13282           uncompressed_size += start[11];
13283           start += 12;
13284           new_size -= 12;
13285         }
13286
13287       if (uncompressed_size)
13288         {
13289           if (uncompress_section_contents (& start,
13290                                            uncompressed_size, & new_size))
13291             num_bytes = new_size;
13292           else
13293             {
13294               error (_("Unable to decompress section %s\n"),
13295                      printable_section_name (filedata, section));
13296               return FALSE;
13297             }
13298         }
13299       else
13300         start = real_start;
13301     }
13302
13303   /* If the section being dumped has relocations against it the user might
13304      be expecting these relocations to have been applied.  Check for this
13305      case and issue a warning message in order to avoid confusion.
13306      FIXME: Maybe we ought to have an option that dumps a section with
13307      relocs applied ?  */
13308   for (relsec = filedata->section_headers;
13309        relsec < filedata->section_headers + filedata->file_header.e_shnum;
13310        ++relsec)
13311     {
13312       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13313           || relsec->sh_info >= filedata->file_header.e_shnum
13314           || filedata->section_headers + relsec->sh_info != section
13315           || relsec->sh_size == 0
13316           || relsec->sh_link >= filedata->file_header.e_shnum)
13317         continue;
13318
13319       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13320       break;
13321     }
13322
13323   data = start;
13324   end  = start + num_bytes;
13325   some_strings_shown = FALSE;
13326
13327   while (data < end)
13328     {
13329       while (!ISPRINT (* data))
13330         if (++ data >= end)
13331           break;
13332
13333       if (data < end)
13334         {
13335           size_t maxlen = end - data;
13336
13337 #ifndef __MSVCRT__
13338           /* PR 11128: Use two separate invocations in order to work
13339              around bugs in the Solaris 8 implementation of printf.  */
13340           printf ("  [%6tx]  ", data - start);
13341 #else
13342           printf ("  [%6Ix]  ", (size_t) (data - start));
13343 #endif
13344           if (maxlen > 0)
13345             {
13346               print_symbol ((int) maxlen, (const char *) data);
13347               putchar ('\n');
13348               data += strnlen ((const char *) data, maxlen);
13349             }
13350           else
13351             {
13352               printf (_("<corrupt>\n"));
13353               data = end;
13354             }
13355           some_strings_shown = TRUE;
13356         }
13357     }
13358
13359   if (! some_strings_shown)
13360     printf (_("  No strings found in this section."));
13361
13362   free (real_start);
13363
13364   putchar ('\n');
13365   return TRUE;
13366 }
13367
13368 static bfd_boolean
13369 dump_section_as_bytes (Elf_Internal_Shdr *  section,
13370                        Filedata *           filedata,
13371                        bfd_boolean          relocate)
13372 {
13373   Elf_Internal_Shdr * relsec;
13374   bfd_size_type       bytes;
13375   bfd_size_type       section_size;
13376   bfd_vma             addr;
13377   unsigned char *     data;
13378   unsigned char *     real_start;
13379   unsigned char *     start;
13380
13381   real_start = start = (unsigned char *) get_section_contents (section, filedata);
13382   if (start == NULL)
13383     /* PR 21820: Do not fail if the section was empty.  */
13384     return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13385
13386   section_size = section->sh_size;
13387
13388   printf (_("\nHex dump of section '%s':\n"), printable_section_name (filedata, section));
13389
13390   if (decompress_dumps)
13391     {
13392       dwarf_size_type new_size = section_size;
13393       dwarf_size_type uncompressed_size = 0;
13394
13395       if ((section->sh_flags & SHF_COMPRESSED) != 0)
13396         {
13397           Elf_Internal_Chdr chdr;
13398           unsigned int compression_header_size
13399             = get_compression_header (& chdr, start, section_size);
13400
13401           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13402             {
13403               warn (_("section '%s' has unsupported compress type: %d\n"),
13404                     printable_section_name (filedata, section), chdr.ch_type);
13405               return FALSE;
13406             }
13407           else if (chdr.ch_addralign != section->sh_addralign)
13408             {
13409               warn (_("compressed section '%s' is corrupted\n"),
13410                     printable_section_name (filedata, section));
13411               return FALSE;
13412             }
13413           uncompressed_size = chdr.ch_size;
13414           start += compression_header_size;
13415           new_size -= compression_header_size;
13416         }
13417       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13418         {
13419           /* Read the zlib header.  In this case, it should be "ZLIB"
13420              followed by the uncompressed section size, 8 bytes in
13421              big-endian order.  */
13422           uncompressed_size = start[4]; uncompressed_size <<= 8;
13423           uncompressed_size += start[5]; uncompressed_size <<= 8;
13424           uncompressed_size += start[6]; uncompressed_size <<= 8;
13425           uncompressed_size += start[7]; uncompressed_size <<= 8;
13426           uncompressed_size += start[8]; uncompressed_size <<= 8;
13427           uncompressed_size += start[9]; uncompressed_size <<= 8;
13428           uncompressed_size += start[10]; uncompressed_size <<= 8;
13429           uncompressed_size += start[11];
13430           start += 12;
13431           new_size -= 12;
13432         }
13433
13434       if (uncompressed_size)
13435         {
13436           if (uncompress_section_contents (& start, uncompressed_size,
13437                                            & new_size))
13438             {
13439               section_size = new_size;
13440             }
13441           else
13442             {
13443               error (_("Unable to decompress section %s\n"),
13444                      printable_section_name (filedata, section));
13445               /* FIXME: Print the section anyway ?  */
13446               return FALSE;
13447             }
13448         }
13449       else
13450         start = real_start;
13451     }
13452
13453   if (relocate)
13454     {
13455       if (! apply_relocations (filedata, section, start, section_size, NULL, NULL))
13456         return FALSE;
13457     }
13458   else
13459     {
13460       /* If the section being dumped has relocations against it the user might
13461          be expecting these relocations to have been applied.  Check for this
13462          case and issue a warning message in order to avoid confusion.
13463          FIXME: Maybe we ought to have an option that dumps a section with
13464          relocs applied ?  */
13465       for (relsec = filedata->section_headers;
13466            relsec < filedata->section_headers + filedata->file_header.e_shnum;
13467            ++relsec)
13468         {
13469           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13470               || relsec->sh_info >= filedata->file_header.e_shnum
13471               || filedata->section_headers + relsec->sh_info != section
13472               || relsec->sh_size == 0
13473               || relsec->sh_link >= filedata->file_header.e_shnum)
13474             continue;
13475
13476           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13477           break;
13478         }
13479     }
13480
13481   addr = section->sh_addr;
13482   bytes = section_size;
13483   data = start;
13484
13485   while (bytes)
13486     {
13487       int j;
13488       int k;
13489       int lbytes;
13490
13491       lbytes = (bytes > 16 ? 16 : bytes);
13492
13493       printf ("  0x%8.8lx ", (unsigned long) addr);
13494
13495       for (j = 0; j < 16; j++)
13496         {
13497           if (j < lbytes)
13498             printf ("%2.2x", data[j]);
13499           else
13500             printf ("  ");
13501
13502           if ((j & 3) == 3)
13503             printf (" ");
13504         }
13505
13506       for (j = 0; j < lbytes; j++)
13507         {
13508           k = data[j];
13509           if (k >= ' ' && k < 0x7f)
13510             printf ("%c", k);
13511           else
13512             printf (".");
13513         }
13514
13515       putchar ('\n');
13516
13517       data  += lbytes;
13518       addr  += lbytes;
13519       bytes -= lbytes;
13520     }
13521
13522   free (real_start);
13523
13524   putchar ('\n');
13525   return TRUE;
13526 }
13527
13528 static bfd_boolean
13529 load_specific_debug_section (enum dwarf_section_display_enum  debug,
13530                              const Elf_Internal_Shdr *        sec,
13531                              void *                           data)
13532 {
13533   struct dwarf_section * section = &debug_displays [debug].section;
13534   char buf [64];
13535   Filedata * filedata = (Filedata *) data;
13536   
13537   if (section->start != NULL)
13538     {
13539       /* If it is already loaded, do nothing.  */
13540       if (streq (section->filename, filedata->file_name))
13541         return TRUE;
13542       free (section->start);
13543     }
13544
13545   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
13546   section->address = sec->sh_addr;
13547   section->user_data = NULL;
13548   section->filename = filedata->file_name;
13549   section->start = (unsigned char *) get_data (NULL, filedata,
13550                                                sec->sh_offset, 1,
13551                                                sec->sh_size, buf);
13552   if (section->start == NULL)
13553     section->size = 0;
13554   else
13555     {
13556       unsigned char *start = section->start;
13557       dwarf_size_type size = sec->sh_size;
13558       dwarf_size_type uncompressed_size = 0;
13559
13560       if ((sec->sh_flags & SHF_COMPRESSED) != 0)
13561         {
13562           Elf_Internal_Chdr chdr;
13563           unsigned int compression_header_size;
13564
13565           if (size < (is_32bit_elf
13566                       ? sizeof (Elf32_External_Chdr)
13567                       : sizeof (Elf64_External_Chdr)))
13568             {
13569               warn (_("compressed section %s is too small to contain a compression header"),
13570                     section->name);
13571               return FALSE;
13572             }
13573
13574           compression_header_size = get_compression_header (&chdr, start, size);
13575
13576           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13577             {
13578               warn (_("section '%s' has unsupported compress type: %d\n"),
13579                     section->name, chdr.ch_type);
13580               return FALSE;
13581             }
13582           else if (chdr.ch_addralign != sec->sh_addralign)
13583             {
13584               warn (_("compressed section '%s' is corrupted\n"),
13585                     section->name);
13586               return FALSE;
13587             }
13588           uncompressed_size = chdr.ch_size;
13589           start += compression_header_size;
13590           size -= compression_header_size;
13591         }
13592       else if (size > 12 && streq ((char *) start, "ZLIB"))
13593         {
13594           /* Read the zlib header.  In this case, it should be "ZLIB"
13595              followed by the uncompressed section size, 8 bytes in
13596              big-endian order.  */
13597           uncompressed_size = start[4]; uncompressed_size <<= 8;
13598           uncompressed_size += start[5]; uncompressed_size <<= 8;
13599           uncompressed_size += start[6]; uncompressed_size <<= 8;
13600           uncompressed_size += start[7]; uncompressed_size <<= 8;
13601           uncompressed_size += start[8]; uncompressed_size <<= 8;
13602           uncompressed_size += start[9]; uncompressed_size <<= 8;
13603           uncompressed_size += start[10]; uncompressed_size <<= 8;
13604           uncompressed_size += start[11];
13605           start += 12;
13606           size -= 12;
13607         }
13608
13609       if (uncompressed_size)
13610         {
13611           if (uncompress_section_contents (&start, uncompressed_size,
13612                                            &size))
13613             {
13614               /* Free the compressed buffer, update the section buffer
13615                  and the section size if uncompress is successful.  */
13616               free (section->start);
13617               section->start = start;
13618             }
13619           else
13620             {
13621               error (_("Unable to decompress section %s\n"),
13622                      printable_section_name (filedata, sec));
13623               return FALSE;
13624             }
13625         }
13626
13627       section->size = size;
13628     }
13629
13630   if (section->start == NULL)
13631     return FALSE;
13632
13633   if (debug_displays [debug].relocate)
13634     {
13635       if (! apply_relocations (filedata, sec, section->start, section->size,
13636                                & section->reloc_info, & section->num_relocs))
13637         return FALSE;
13638     }
13639   else
13640     {
13641       section->reloc_info = NULL;
13642       section->num_relocs = 0;
13643     }
13644
13645   return TRUE;
13646 }
13647
13648 /* If this is not NULL, load_debug_section will only look for sections
13649    within the list of sections given here.  */
13650 static unsigned int * section_subset = NULL;
13651
13652 bfd_boolean
13653 load_debug_section (enum dwarf_section_display_enum debug, void * data)
13654 {
13655   struct dwarf_section * section = &debug_displays [debug].section;
13656   Elf_Internal_Shdr * sec;
13657   Filedata * filedata = (Filedata *) data;
13658
13659   /* Without section headers we cannot find any sections.  */
13660   if (filedata->section_headers == NULL)
13661     return FALSE;
13662
13663   if (filedata->string_table == NULL
13664       && filedata->file_header.e_shstrndx != SHN_UNDEF
13665       && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
13666     {
13667       Elf_Internal_Shdr * strs;
13668
13669       /* Read in the string table, so that we have section names to scan.  */
13670       strs = filedata->section_headers + filedata->file_header.e_shstrndx;
13671
13672       if (strs != NULL && strs->sh_size != 0)
13673         {
13674           filedata->string_table
13675             = (char *) get_data (NULL, filedata, strs->sh_offset,
13676                                  1, strs->sh_size, _("string table"));
13677
13678           filedata->string_table_length
13679             = filedata->string_table != NULL ? strs->sh_size : 0;
13680         }
13681     }
13682
13683   /* Locate the debug section.  */
13684   sec = find_section_in_set (filedata, section->uncompressed_name, section_subset);
13685   if (sec != NULL)
13686     section->name = section->uncompressed_name;
13687   else
13688     {
13689       sec = find_section_in_set (filedata, section->compressed_name, section_subset);
13690       if (sec != NULL)
13691         section->name = section->compressed_name;
13692     }
13693   if (sec == NULL)
13694     return FALSE;
13695
13696   /* If we're loading from a subset of sections, and we've loaded
13697      a section matching this name before, it's likely that it's a
13698      different one.  */
13699   if (section_subset != NULL)
13700     free_debug_section (debug);
13701
13702   return load_specific_debug_section (debug, sec, data);
13703 }
13704
13705 void
13706 free_debug_section (enum dwarf_section_display_enum debug)
13707 {
13708   struct dwarf_section * section = &debug_displays [debug].section;
13709
13710   if (section->start == NULL)
13711     return;
13712
13713   free ((char *) section->start);
13714   section->start = NULL;
13715   section->address = 0;
13716   section->size = 0;
13717 }
13718
13719 static bfd_boolean
13720 display_debug_section (int shndx, Elf_Internal_Shdr * section, Filedata * filedata)
13721 {
13722   char * name = SECTION_NAME (section);
13723   const char * print_name = printable_section_name (filedata, section);
13724   bfd_size_type length;
13725   bfd_boolean result = TRUE;
13726   int i;
13727
13728   length = section->sh_size;
13729   if (length == 0)
13730     {
13731       printf (_("\nSection '%s' has no debugging data.\n"), print_name);
13732       return TRUE;
13733     }
13734   if (section->sh_type == SHT_NOBITS)
13735     {
13736       /* There is no point in dumping the contents of a debugging section
13737          which has the NOBITS type - the bits in the file will be random.
13738          This can happen when a file containing a .eh_frame section is
13739          stripped with the --only-keep-debug command line option.  */
13740       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
13741               print_name);
13742       return FALSE;
13743     }
13744
13745   if (const_strneq (name, ".gnu.linkonce.wi."))
13746     name = ".debug_info";
13747
13748   /* See if we know how to display the contents of this section.  */
13749   for (i = 0; i < max; i++)
13750     {
13751       enum dwarf_section_display_enum  id = (enum dwarf_section_display_enum) i;
13752       struct dwarf_section_display *   display = debug_displays + i;
13753       struct dwarf_section *           sec = & display->section;
13754
13755       if (streq (sec->uncompressed_name, name)
13756           || (id == line && const_strneq (name, ".debug_line."))
13757           || streq (sec->compressed_name, name))
13758         {
13759           bfd_boolean secondary = (section != find_section (filedata, name));
13760
13761           if (secondary)
13762             free_debug_section (id);
13763
13764           if (i == line && const_strneq (name, ".debug_line."))
13765             sec->name = name;
13766           else if (streq (sec->uncompressed_name, name))
13767             sec->name = sec->uncompressed_name;
13768           else
13769             sec->name = sec->compressed_name;
13770
13771           if (load_specific_debug_section (id, section, filedata))
13772             {
13773               /* If this debug section is part of a CU/TU set in a .dwp file,
13774                  restrict load_debug_section to the sections in that set.  */
13775               section_subset = find_cu_tu_set (filedata, shndx);
13776
13777               result &= display->display (sec, filedata);
13778
13779               section_subset = NULL;
13780
13781               if (secondary || (id != info && id != abbrev))
13782                 free_debug_section (id);
13783             }
13784           break;
13785         }
13786     }
13787
13788   if (i == max)
13789     {
13790       printf (_("Unrecognized debug section: %s\n"), print_name);
13791       result = FALSE;
13792     }
13793
13794   return result;
13795 }
13796
13797 /* Set DUMP_SECTS for all sections where dumps were requested
13798    based on section name.  */
13799
13800 static void
13801 initialise_dumps_byname (Filedata * filedata)
13802 {
13803   struct dump_list_entry * cur;
13804
13805   for (cur = dump_sects_byname; cur; cur = cur->next)
13806     {
13807       unsigned int i;
13808       bfd_boolean any = FALSE;
13809
13810       for (i = 0; i < filedata->file_header.e_shnum; i++)
13811         if (streq (SECTION_NAME (filedata->section_headers + i), cur->name))
13812           {
13813             request_dump_bynumber (filedata, i, cur->type);
13814             any = TRUE;
13815           }
13816
13817       if (!any)
13818         warn (_("Section '%s' was not dumped because it does not exist!\n"),
13819               cur->name);
13820     }
13821 }
13822
13823 static bfd_boolean
13824 process_section_contents (Filedata * filedata)
13825 {
13826   Elf_Internal_Shdr * section;
13827   unsigned int i;
13828   bfd_boolean res = TRUE;
13829
13830   if (! do_dump)
13831     return TRUE;
13832
13833   initialise_dumps_byname (filedata);
13834
13835   for (i = 0, section = filedata->section_headers;
13836        i < filedata->file_header.e_shnum && i < filedata->num_dump_sects;
13837        i++, section++)
13838     {
13839       dump_type dump = filedata->dump_sects[i];
13840
13841 #ifdef SUPPORT_DISASSEMBLY
13842       if (dump & DISASS_DUMP)
13843         {
13844           if (! disassemble_section (section, filedata))
13845             res = FALSE;
13846         }
13847 #endif
13848       if (dump & HEX_DUMP)
13849         {
13850           if (! dump_section_as_bytes (section, filedata, FALSE))
13851             res = FALSE;
13852         }
13853
13854       if (dump & RELOC_DUMP)
13855         {
13856           if (! dump_section_as_bytes (section, filedata, TRUE))
13857             res = FALSE;
13858         }
13859
13860       if (dump & STRING_DUMP)
13861         {
13862           if (! dump_section_as_strings (section, filedata))
13863             res = FALSE;
13864         }
13865
13866       if (dump & DEBUG_DUMP)
13867         {
13868           if (! display_debug_section (i, section, filedata))
13869             res = FALSE;
13870         }
13871     }
13872
13873   /* Check to see if the user requested a
13874      dump of a section that does not exist.  */
13875   while (i < filedata->num_dump_sects)
13876     {
13877       if (filedata->dump_sects[i])
13878         {
13879           warn (_("Section %d was not dumped because it does not exist!\n"), i);
13880           res = FALSE;
13881         }
13882       i++;
13883     }
13884
13885   return res;
13886 }
13887
13888 static void
13889 process_mips_fpe_exception (int mask)
13890 {
13891   if (mask)
13892     {
13893       bfd_boolean first = TRUE;
13894
13895       if (mask & OEX_FPU_INEX)
13896         fputs ("INEX", stdout), first = FALSE;
13897       if (mask & OEX_FPU_UFLO)
13898         printf ("%sUFLO", first ? "" : "|"), first = FALSE;
13899       if (mask & OEX_FPU_OFLO)
13900         printf ("%sOFLO", first ? "" : "|"), first = FALSE;
13901       if (mask & OEX_FPU_DIV0)
13902         printf ("%sDIV0", first ? "" : "|"), first = FALSE;
13903       if (mask & OEX_FPU_INVAL)
13904         printf ("%sINVAL", first ? "" : "|");
13905     }
13906   else
13907     fputs ("0", stdout);
13908 }
13909
13910 /* Display's the value of TAG at location P.  If TAG is
13911    greater than 0 it is assumed to be an unknown tag, and
13912    a message is printed to this effect.  Otherwise it is
13913    assumed that a message has already been printed.
13914
13915    If the bottom bit of TAG is set it assumed to have a
13916    string value, otherwise it is assumed to have an integer
13917    value.
13918
13919    Returns an updated P pointing to the first unread byte
13920    beyond the end of TAG's value.
13921
13922    Reads at or beyond END will not be made.  */
13923
13924 static unsigned char *
13925 display_tag_value (signed int tag,
13926                    unsigned char * p,
13927                    const unsigned char * const end)
13928 {
13929   unsigned long val;
13930
13931   if (tag > 0)
13932     printf ("  Tag_unknown_%d: ", tag);
13933
13934   if (p >= end)
13935     {
13936       warn (_("<corrupt tag>\n"));
13937     }
13938   else if (tag & 1)
13939     {
13940       /* PR 17531 file: 027-19978-0.004.  */
13941       size_t maxlen = (end - p) - 1;
13942
13943       putchar ('"');
13944       if (maxlen > 0)
13945         {
13946           print_symbol ((int) maxlen, (const char *) p);
13947           p += strnlen ((char *) p, maxlen) + 1;
13948         }
13949       else
13950         {
13951           printf (_("<corrupt string tag>"));
13952           p = (unsigned char *) end;
13953         }
13954       printf ("\"\n");
13955     }
13956   else
13957     {
13958       unsigned int len;
13959
13960       val = read_uleb128 (p, &len, end);
13961       p += len;
13962       printf ("%ld (0x%lx)\n", val, val);
13963     }
13964
13965   assert (p <= end);
13966   return p;
13967 }
13968
13969 /* ARC ABI attributes section.  */
13970
13971 static unsigned char *
13972 display_arc_attribute (unsigned char * p,
13973                        const unsigned char * const end)
13974 {
13975   unsigned int tag;
13976   unsigned int len;
13977   unsigned int val;
13978
13979   tag = read_uleb128 (p, &len, end);
13980   p += len;
13981
13982   switch (tag)
13983     {
13984     case Tag_ARC_PCS_config:
13985       val = read_uleb128 (p, &len, end);
13986       p += len;
13987       printf ("  Tag_ARC_PCS_config: ");
13988       switch (val)
13989         {
13990         case 0:
13991           printf (_("Absent/Non standard\n"));
13992           break;
13993         case 1:
13994           printf (_("Bare metal/mwdt\n"));
13995           break;
13996         case 2:
13997           printf (_("Bare metal/newlib\n"));
13998           break;
13999         case 3:
14000           printf (_("Linux/uclibc\n"));
14001           break;
14002         case 4:
14003           printf (_("Linux/glibc\n"));
14004           break;
14005         default:
14006           printf (_("Unknown\n"));
14007           break;
14008         }
14009       break;
14010
14011     case Tag_ARC_CPU_base:
14012       val = read_uleb128 (p, &len, end);
14013       p += len;
14014       printf ("  Tag_ARC_CPU_base: ");
14015       switch (val)
14016         {
14017         default:
14018         case TAG_CPU_NONE:
14019           printf (_("Absent\n"));
14020           break;
14021         case TAG_CPU_ARC6xx:
14022           printf ("ARC6xx\n");
14023           break;
14024         case TAG_CPU_ARC7xx:
14025           printf ("ARC7xx\n");
14026           break;
14027         case TAG_CPU_ARCEM:
14028           printf ("ARCEM\n");
14029           break;
14030         case TAG_CPU_ARCHS:
14031           printf ("ARCHS\n");
14032           break;
14033         }
14034       break;
14035
14036     case Tag_ARC_CPU_variation:
14037       val = read_uleb128 (p, &len, end);
14038       p += len;
14039       printf ("  Tag_ARC_CPU_variation: ");
14040       switch (val)
14041         {
14042         default:
14043           if (val > 0 && val < 16)
14044               printf ("Core%d\n", val);
14045           else
14046               printf ("Unknown\n");
14047           break;
14048
14049         case 0:
14050           printf (_("Absent\n"));
14051           break;
14052         }
14053       break;
14054
14055     case Tag_ARC_CPU_name:
14056       printf ("  Tag_ARC_CPU_name: ");
14057       p = display_tag_value (-1, p, end);
14058       break;
14059
14060     case Tag_ARC_ABI_rf16:
14061       val = read_uleb128 (p, &len, end);
14062       p += len;
14063       printf ("  Tag_ARC_ABI_rf16: %s\n", val ? _("yes") : _("no"));
14064       break;
14065
14066     case Tag_ARC_ABI_osver:
14067       val = read_uleb128 (p, &len, end);
14068       p += len;
14069       printf ("  Tag_ARC_ABI_osver: v%d\n", val);
14070       break;
14071
14072     case Tag_ARC_ABI_pic:
14073     case Tag_ARC_ABI_sda:
14074       val = read_uleb128 (p, &len, end);
14075       p += len;
14076       printf (tag == Tag_ARC_ABI_sda ? "  Tag_ARC_ABI_sda: "
14077               : "  Tag_ARC_ABI_pic: ");
14078       switch (val)
14079         {
14080         case 0:
14081           printf (_("Absent\n"));
14082           break;
14083         case 1:
14084           printf ("MWDT\n");
14085           break;
14086         case 2:
14087           printf ("GNU\n");
14088           break;
14089         default:
14090           printf (_("Unknown\n"));
14091           break;
14092         }
14093       break;
14094
14095     case Tag_ARC_ABI_tls:
14096       val = read_uleb128 (p, &len, end);
14097       p += len;
14098       printf ("  Tag_ARC_ABI_tls: %s\n", val ? "r25": "none");
14099       break;
14100
14101     case Tag_ARC_ABI_enumsize:
14102       val = read_uleb128 (p, &len, end);
14103       p += len;
14104       printf ("  Tag_ARC_ABI_enumsize: %s\n", val ? _("default") :
14105               _("smallest"));
14106       break;
14107
14108     case Tag_ARC_ABI_exceptions:
14109       val = read_uleb128 (p, &len, end);
14110       p += len;
14111       printf ("  Tag_ARC_ABI_exceptions: %s\n", val ? _("OPTFP")
14112               : _("default"));
14113       break;
14114
14115     case Tag_ARC_ABI_double_size:
14116       val = read_uleb128 (p, &len, end);
14117       p += len;
14118       printf ("  Tag_ARC_ABI_double_size: %d\n", val);
14119       break;
14120
14121     case Tag_ARC_ISA_config:
14122       printf ("  Tag_ARC_ISA_config: ");
14123       p = display_tag_value (-1, p, end);
14124       break;
14125
14126     case Tag_ARC_ISA_apex:
14127       printf ("  Tag_ARC_ISA_apex: ");
14128       p = display_tag_value (-1, p, end);
14129       break;
14130
14131     case Tag_ARC_ISA_mpy_option:
14132       val = read_uleb128 (p, &len, end);
14133       p += len;
14134       printf ("  Tag_ARC_ISA_mpy_option: %d\n", val);
14135       break;
14136
14137     default:
14138       return display_tag_value (tag & 1, p, end);
14139     }
14140
14141   return p;
14142 }
14143
14144 /* ARM EABI attributes section.  */
14145 typedef struct
14146 {
14147   unsigned int tag;
14148   const char * name;
14149   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
14150   unsigned int type;
14151   const char ** table;
14152 } arm_attr_public_tag;
14153
14154 static const char * arm_attr_tag_CPU_arch[] =
14155   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
14156    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "v8-R", "v8-M.baseline",
14157    "v8-M.mainline"};
14158 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
14159 static const char * arm_attr_tag_THUMB_ISA_use[] =
14160   {"No", "Thumb-1", "Thumb-2", "Yes"};
14161 static const char * arm_attr_tag_FP_arch[] =
14162   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
14163    "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
14164 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
14165 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
14166   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
14167    "NEON for ARMv8.1"};
14168 static const char * arm_attr_tag_PCS_config[] =
14169   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
14170    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
14171 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
14172   {"V6", "SB", "TLS", "Unused"};
14173 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
14174   {"Absolute", "PC-relative", "SB-relative", "None"};
14175 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
14176   {"Absolute", "PC-relative", "None"};
14177 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
14178   {"None", "direct", "GOT-indirect"};
14179 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
14180   {"None", "??? 1", "2", "??? 3", "4"};
14181 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
14182 static const char * arm_attr_tag_ABI_FP_denormal[] =
14183   {"Unused", "Needed", "Sign only"};
14184 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
14185 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
14186 static const char * arm_attr_tag_ABI_FP_number_model[] =
14187   {"Unused", "Finite", "RTABI", "IEEE 754"};
14188 static const char * arm_attr_tag_ABI_enum_size[] =
14189   {"Unused", "small", "int", "forced to int"};
14190 static const char * arm_attr_tag_ABI_HardFP_use[] =
14191   {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
14192 static const char * arm_attr_tag_ABI_VFP_args[] =
14193   {"AAPCS", "VFP registers", "custom", "compatible"};
14194 static const char * arm_attr_tag_ABI_WMMX_args[] =
14195   {"AAPCS", "WMMX registers", "custom"};
14196 static const char * arm_attr_tag_ABI_optimization_goals[] =
14197   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14198     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
14199 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
14200   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14201     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
14202 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
14203 static const char * arm_attr_tag_FP_HP_extension[] =
14204   {"Not Allowed", "Allowed"};
14205 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
14206   {"None", "IEEE 754", "Alternative Format"};
14207 static const char * arm_attr_tag_DSP_extension[] =
14208   {"Follow architecture", "Allowed"};
14209 static const char * arm_attr_tag_MPextension_use[] =
14210   {"Not Allowed", "Allowed"};
14211 static const char * arm_attr_tag_DIV_use[] =
14212   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
14213     "Allowed in v7-A with integer division extension"};
14214 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
14215 static const char * arm_attr_tag_Virtualization_use[] =
14216   {"Not Allowed", "TrustZone", "Virtualization Extensions",
14217     "TrustZone and Virtualization Extensions"};
14218 static const char * arm_attr_tag_MPextension_use_legacy[] =
14219   {"Not Allowed", "Allowed"};
14220
14221 #define LOOKUP(id, name) \
14222   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
14223 static arm_attr_public_tag arm_attr_public_tags[] =
14224 {
14225   {4, "CPU_raw_name", 1, NULL},
14226   {5, "CPU_name", 1, NULL},
14227   LOOKUP(6, CPU_arch),
14228   {7, "CPU_arch_profile", 0, NULL},
14229   LOOKUP(8, ARM_ISA_use),
14230   LOOKUP(9, THUMB_ISA_use),
14231   LOOKUP(10, FP_arch),
14232   LOOKUP(11, WMMX_arch),
14233   LOOKUP(12, Advanced_SIMD_arch),
14234   LOOKUP(13, PCS_config),
14235   LOOKUP(14, ABI_PCS_R9_use),
14236   LOOKUP(15, ABI_PCS_RW_data),
14237   LOOKUP(16, ABI_PCS_RO_data),
14238   LOOKUP(17, ABI_PCS_GOT_use),
14239   LOOKUP(18, ABI_PCS_wchar_t),
14240   LOOKUP(19, ABI_FP_rounding),
14241   LOOKUP(20, ABI_FP_denormal),
14242   LOOKUP(21, ABI_FP_exceptions),
14243   LOOKUP(22, ABI_FP_user_exceptions),
14244   LOOKUP(23, ABI_FP_number_model),
14245   {24, "ABI_align_needed", 0, NULL},
14246   {25, "ABI_align_preserved", 0, NULL},
14247   LOOKUP(26, ABI_enum_size),
14248   LOOKUP(27, ABI_HardFP_use),
14249   LOOKUP(28, ABI_VFP_args),
14250   LOOKUP(29, ABI_WMMX_args),
14251   LOOKUP(30, ABI_optimization_goals),
14252   LOOKUP(31, ABI_FP_optimization_goals),
14253   {32, "compatibility", 0, NULL},
14254   LOOKUP(34, CPU_unaligned_access),
14255   LOOKUP(36, FP_HP_extension),
14256   LOOKUP(38, ABI_FP_16bit_format),
14257   LOOKUP(42, MPextension_use),
14258   LOOKUP(44, DIV_use),
14259   LOOKUP(46, DSP_extension),
14260   {64, "nodefaults", 0, NULL},
14261   {65, "also_compatible_with", 0, NULL},
14262   LOOKUP(66, T2EE_use),
14263   {67, "conformance", 1, NULL},
14264   LOOKUP(68, Virtualization_use),
14265   LOOKUP(70, MPextension_use_legacy)
14266 };
14267 #undef LOOKUP
14268
14269 static unsigned char *
14270 display_arm_attribute (unsigned char * p,
14271                        const unsigned char * const end)
14272 {
14273   unsigned int tag;
14274   unsigned int len;
14275   unsigned int val;
14276   arm_attr_public_tag * attr;
14277   unsigned i;
14278   unsigned int type;
14279
14280   tag = read_uleb128 (p, &len, end);
14281   p += len;
14282   attr = NULL;
14283   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
14284     {
14285       if (arm_attr_public_tags[i].tag == tag)
14286         {
14287           attr = &arm_attr_public_tags[i];
14288           break;
14289         }
14290     }
14291
14292   if (attr)
14293     {
14294       printf ("  Tag_%s: ", attr->name);
14295       switch (attr->type)
14296         {
14297         case 0:
14298           switch (tag)
14299             {
14300             case 7: /* Tag_CPU_arch_profile.  */
14301               val = read_uleb128 (p, &len, end);
14302               p += len;
14303               switch (val)
14304                 {
14305                 case 0: printf (_("None\n")); break;
14306                 case 'A': printf (_("Application\n")); break;
14307                 case 'R': printf (_("Realtime\n")); break;
14308                 case 'M': printf (_("Microcontroller\n")); break;
14309                 case 'S': printf (_("Application or Realtime\n")); break;
14310                 default: printf ("??? (%d)\n", val); break;
14311                 }
14312               break;
14313
14314             case 24: /* Tag_align_needed.  */
14315               val = read_uleb128 (p, &len, end);
14316               p += len;
14317               switch (val)
14318                 {
14319                 case 0: printf (_("None\n")); break;
14320                 case 1: printf (_("8-byte\n")); break;
14321                 case 2: printf (_("4-byte\n")); break;
14322                 case 3: printf ("??? 3\n"); break;
14323                 default:
14324                   if (val <= 12)
14325                     printf (_("8-byte and up to %d-byte extended\n"),
14326                             1 << val);
14327                   else
14328                     printf ("??? (%d)\n", val);
14329                   break;
14330                 }
14331               break;
14332
14333             case 25: /* Tag_align_preserved.  */
14334               val = read_uleb128 (p, &len, end);
14335               p += len;
14336               switch (val)
14337                 {
14338                 case 0: printf (_("None\n")); break;
14339                 case 1: printf (_("8-byte, except leaf SP\n")); break;
14340                 case 2: printf (_("8-byte\n")); break;
14341                 case 3: printf ("??? 3\n"); break;
14342                 default:
14343                   if (val <= 12)
14344                     printf (_("8-byte and up to %d-byte extended\n"),
14345                             1 << val);
14346                   else
14347                     printf ("??? (%d)\n", val);
14348                   break;
14349                 }
14350               break;
14351
14352             case 32: /* Tag_compatibility.  */
14353               {
14354                 val = read_uleb128 (p, &len, end);
14355                 p += len;
14356                 printf (_("flag = %d, vendor = "), val);
14357                 if (p < end - 1)
14358                   {
14359                     size_t maxlen = (end - p) - 1;
14360
14361                     print_symbol ((int) maxlen, (const char *) p);
14362                     p += strnlen ((char *) p, maxlen) + 1;
14363                   }
14364                 else
14365                   {
14366                     printf (_("<corrupt>"));
14367                     p = (unsigned char *) end;
14368                   }
14369                 putchar ('\n');
14370               }
14371               break;
14372
14373             case 64: /* Tag_nodefaults.  */
14374               /* PR 17531: file: 001-505008-0.01.  */
14375               if (p < end)
14376                 p++;
14377               printf (_("True\n"));
14378               break;
14379
14380             case 65: /* Tag_also_compatible_with.  */
14381               val = read_uleb128 (p, &len, end);
14382               p += len;
14383               if (val == 6 /* Tag_CPU_arch.  */)
14384                 {
14385                   val = read_uleb128 (p, &len, end);
14386                   p += len;
14387                   if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
14388                     printf ("??? (%d)\n", val);
14389                   else
14390                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
14391                 }
14392               else
14393                 printf ("???\n");
14394               while (p < end && *(p++) != '\0' /* NUL terminator.  */)
14395                 ;
14396               break;
14397
14398             default:
14399               printf (_("<unknown: %d>\n"), tag);
14400               break;
14401             }
14402           return p;
14403
14404         case 1:
14405           return display_tag_value (-1, p, end);
14406         case 2:
14407           return display_tag_value (0, p, end);
14408
14409         default:
14410           assert (attr->type & 0x80);
14411           val = read_uleb128 (p, &len, end);
14412           p += len;
14413           type = attr->type & 0x7f;
14414           if (val >= type)
14415             printf ("??? (%d)\n", val);
14416           else
14417             printf ("%s\n", attr->table[val]);
14418           return p;
14419         }
14420     }
14421
14422   return display_tag_value (tag, p, end);
14423 }
14424
14425 static unsigned char *
14426 display_gnu_attribute (unsigned char * p,
14427                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const),
14428                        const unsigned char * const end)
14429 {
14430   int tag;
14431   unsigned int len;
14432   unsigned int val;
14433
14434   tag = read_uleb128 (p, &len, end);
14435   p += len;
14436
14437   /* Tag_compatibility is the only generic GNU attribute defined at
14438      present.  */
14439   if (tag == 32)
14440     {
14441       val = read_uleb128 (p, &len, end);
14442       p += len;
14443
14444       printf (_("flag = %d, vendor = "), val);
14445       if (p == end)
14446         {
14447           printf (_("<corrupt>\n"));
14448           warn (_("corrupt vendor attribute\n"));
14449         }
14450       else
14451         {
14452           if (p < end - 1)
14453             {
14454               size_t maxlen = (end - p) - 1;
14455
14456               print_symbol ((int) maxlen, (const char *) p);
14457               p += strnlen ((char *) p, maxlen) + 1;
14458             }
14459           else
14460             {
14461               printf (_("<corrupt>"));
14462               p = (unsigned char *) end;
14463             }
14464           putchar ('\n');
14465         }
14466       return p;
14467     }
14468
14469   if ((tag & 2) == 0 && display_proc_gnu_attribute)
14470     return display_proc_gnu_attribute (p, tag, end);
14471
14472   return display_tag_value (tag, p, end);
14473 }
14474
14475 static unsigned char *
14476 display_power_gnu_attribute (unsigned char * p,
14477                              unsigned int tag,
14478                              const unsigned char * const end)
14479 {
14480   unsigned int len;
14481   unsigned int val;
14482
14483   if (tag == Tag_GNU_Power_ABI_FP)
14484     {
14485       val = read_uleb128 (p, &len, end);
14486       p += len;
14487       printf ("  Tag_GNU_Power_ABI_FP: ");
14488       if (len == 0)
14489         {
14490           printf (_("<corrupt>\n"));
14491           return p;
14492         }
14493
14494       if (val > 15)
14495         printf ("(%#x), ", val);
14496
14497       switch (val & 3)
14498         {
14499         case 0:
14500           printf (_("unspecified hard/soft float, "));
14501           break;
14502         case 1:
14503           printf (_("hard float, "));
14504           break;
14505         case 2:
14506           printf (_("soft float, "));
14507           break;
14508         case 3:
14509           printf (_("single-precision hard float, "));
14510           break;
14511         }
14512
14513       switch (val & 0xC)
14514         {
14515         case 0:
14516           printf (_("unspecified long double\n"));
14517           break;
14518         case 4:
14519           printf (_("128-bit IBM long double\n"));
14520           break;
14521         case 8:
14522           printf (_("64-bit long double\n"));
14523           break;
14524         case 12:
14525           printf (_("128-bit IEEE long double\n"));
14526           break;
14527         }
14528       return p;
14529     }
14530
14531   if (tag == Tag_GNU_Power_ABI_Vector)
14532     {
14533       val = read_uleb128 (p, &len, end);
14534       p += len;
14535       printf ("  Tag_GNU_Power_ABI_Vector: ");
14536       if (len == 0)
14537         {
14538           printf (_("<corrupt>\n"));
14539           return p;
14540         }
14541
14542       if (val > 3)
14543         printf ("(%#x), ", val);
14544
14545       switch (val & 3)
14546         {
14547         case 0:
14548           printf (_("unspecified\n"));
14549           break;
14550         case 1:
14551           printf (_("generic\n"));
14552           break;
14553         case 2:
14554           printf ("AltiVec\n");
14555           break;
14556         case 3:
14557           printf ("SPE\n");
14558           break;
14559         }
14560       return p;
14561     }
14562
14563   if (tag == Tag_GNU_Power_ABI_Struct_Return)
14564     {
14565       val = read_uleb128 (p, &len, end);
14566       p += len;
14567       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
14568       if (len == 0)
14569         {
14570           printf (_("<corrupt>\n"));
14571           return p;
14572         }
14573
14574       if (val > 2)
14575         printf ("(%#x), ", val);
14576
14577       switch (val & 3)
14578         {
14579         case 0:
14580           printf (_("unspecified\n"));
14581           break;
14582         case 1:
14583           printf ("r3/r4\n");
14584           break;
14585         case 2:
14586           printf (_("memory\n"));
14587           break;
14588         case 3:
14589           printf ("???\n");
14590           break;
14591         }
14592       return p;
14593     }
14594
14595   return display_tag_value (tag & 1, p, end);
14596 }
14597
14598 static unsigned char *
14599 display_s390_gnu_attribute (unsigned char * p,
14600                             unsigned int tag,
14601                             const unsigned char * const end)
14602 {
14603   unsigned int len;
14604   int val;
14605
14606   if (tag == Tag_GNU_S390_ABI_Vector)
14607     {
14608       val = read_uleb128 (p, &len, end);
14609       p += len;
14610       printf ("  Tag_GNU_S390_ABI_Vector: ");
14611
14612       switch (val)
14613         {
14614         case 0:
14615           printf (_("any\n"));
14616           break;
14617         case 1:
14618           printf (_("software\n"));
14619           break;
14620         case 2:
14621           printf (_("hardware\n"));
14622           break;
14623         default:
14624           printf ("??? (%d)\n", val);
14625           break;
14626         }
14627       return p;
14628    }
14629
14630   return display_tag_value (tag & 1, p, end);
14631 }
14632
14633 static void
14634 display_sparc_hwcaps (unsigned int mask)
14635 {
14636   if (mask)
14637     {
14638       bfd_boolean first = TRUE;
14639
14640       if (mask & ELF_SPARC_HWCAP_MUL32)
14641         fputs ("mul32", stdout), first = FALSE;
14642       if (mask & ELF_SPARC_HWCAP_DIV32)
14643         printf ("%sdiv32", first ? "" : "|"), first = FALSE;
14644       if (mask & ELF_SPARC_HWCAP_FSMULD)
14645         printf ("%sfsmuld", first ? "" : "|"), first = FALSE;
14646       if (mask & ELF_SPARC_HWCAP_V8PLUS)
14647         printf ("%sv8plus", first ? "" : "|"), first = FALSE;
14648       if (mask & ELF_SPARC_HWCAP_POPC)
14649         printf ("%spopc", first ? "" : "|"), first = FALSE;
14650       if (mask & ELF_SPARC_HWCAP_VIS)
14651         printf ("%svis", first ? "" : "|"), first = FALSE;
14652       if (mask & ELF_SPARC_HWCAP_VIS2)
14653         printf ("%svis2", first ? "" : "|"), first = FALSE;
14654       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
14655         printf ("%sASIBlkInit", first ? "" : "|"), first = FALSE;
14656       if (mask & ELF_SPARC_HWCAP_FMAF)
14657         printf ("%sfmaf", first ? "" : "|"), first = FALSE;
14658       if (mask & ELF_SPARC_HWCAP_VIS3)
14659         printf ("%svis3", first ? "" : "|"), first = FALSE;
14660       if (mask & ELF_SPARC_HWCAP_HPC)
14661         printf ("%shpc", first ? "" : "|"), first = FALSE;
14662       if (mask & ELF_SPARC_HWCAP_RANDOM)
14663         printf ("%srandom", first ? "" : "|"), first = FALSE;
14664       if (mask & ELF_SPARC_HWCAP_TRANS)
14665         printf ("%strans", first ? "" : "|"), first = FALSE;
14666       if (mask & ELF_SPARC_HWCAP_FJFMAU)
14667         printf ("%sfjfmau", first ? "" : "|"), first = FALSE;
14668       if (mask & ELF_SPARC_HWCAP_IMA)
14669         printf ("%sima", first ? "" : "|"), first = FALSE;
14670       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
14671         printf ("%scspare", first ? "" : "|"), first = FALSE;
14672     }
14673   else
14674     fputc ('0', stdout);
14675   fputc ('\n', stdout);
14676 }
14677
14678 static void
14679 display_sparc_hwcaps2 (unsigned int mask)
14680 {
14681   if (mask)
14682     {
14683       bfd_boolean first = TRUE;
14684
14685       if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
14686         fputs ("fjathplus", stdout), first = FALSE;
14687       if (mask & ELF_SPARC_HWCAP2_VIS3B)
14688         printf ("%svis3b", first ? "" : "|"), first = FALSE;
14689       if (mask & ELF_SPARC_HWCAP2_ADP)
14690         printf ("%sadp", first ? "" : "|"), first = FALSE;
14691       if (mask & ELF_SPARC_HWCAP2_SPARC5)
14692         printf ("%ssparc5", first ? "" : "|"), first = FALSE;
14693       if (mask & ELF_SPARC_HWCAP2_MWAIT)
14694         printf ("%smwait", first ? "" : "|"), first = FALSE;
14695       if (mask & ELF_SPARC_HWCAP2_XMPMUL)
14696         printf ("%sxmpmul", first ? "" : "|"), first = FALSE;
14697       if (mask & ELF_SPARC_HWCAP2_XMONT)
14698         printf ("%sxmont2", first ? "" : "|"), first = FALSE;
14699       if (mask & ELF_SPARC_HWCAP2_NSEC)
14700         printf ("%snsec", first ? "" : "|"), first = FALSE;
14701       if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
14702         printf ("%sfjathhpc", first ? "" : "|"), first = FALSE;
14703       if (mask & ELF_SPARC_HWCAP2_FJDES)
14704         printf ("%sfjdes", first ? "" : "|"), first = FALSE;
14705       if (mask & ELF_SPARC_HWCAP2_FJAES)
14706         printf ("%sfjaes", first ? "" : "|"), first = FALSE;
14707     }
14708   else
14709     fputc ('0', stdout);
14710   fputc ('\n', stdout);
14711 }
14712
14713 static unsigned char *
14714 display_sparc_gnu_attribute (unsigned char * p,
14715                              unsigned int tag,
14716                              const unsigned char * const end)
14717 {
14718   unsigned int len;
14719   int val;
14720
14721   if (tag == Tag_GNU_Sparc_HWCAPS)
14722     {
14723       val = read_uleb128 (p, &len, end);
14724       p += len;
14725       printf ("  Tag_GNU_Sparc_HWCAPS: ");
14726       display_sparc_hwcaps (val);
14727       return p;
14728     }
14729   if (tag == Tag_GNU_Sparc_HWCAPS2)
14730     {
14731       val = read_uleb128 (p, &len, end);
14732       p += len;
14733       printf ("  Tag_GNU_Sparc_HWCAPS2: ");
14734       display_sparc_hwcaps2 (val);
14735       return p;
14736     }
14737
14738   return display_tag_value (tag, p, end);
14739 }
14740
14741 static void
14742 print_mips_fp_abi_value (unsigned int val)
14743 {
14744   switch (val)
14745     {
14746     case Val_GNU_MIPS_ABI_FP_ANY:
14747       printf (_("Hard or soft float\n"));
14748       break;
14749     case Val_GNU_MIPS_ABI_FP_DOUBLE:
14750       printf (_("Hard float (double precision)\n"));
14751       break;
14752     case Val_GNU_MIPS_ABI_FP_SINGLE:
14753       printf (_("Hard float (single precision)\n"));
14754       break;
14755     case Val_GNU_MIPS_ABI_FP_SOFT:
14756       printf (_("Soft float\n"));
14757       break;
14758     case Val_GNU_MIPS_ABI_FP_OLD_64:
14759       printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
14760       break;
14761     case Val_GNU_MIPS_ABI_FP_XX:
14762       printf (_("Hard float (32-bit CPU, Any FPU)\n"));
14763       break;
14764     case Val_GNU_MIPS_ABI_FP_64:
14765       printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
14766       break;
14767     case Val_GNU_MIPS_ABI_FP_64A:
14768       printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
14769       break;
14770     case Val_GNU_MIPS_ABI_FP_NAN2008:
14771       printf (_("NaN 2008 compatibility\n"));
14772       break;
14773     default:
14774       printf ("??? (%d)\n", val);
14775       break;
14776     }
14777 }
14778
14779 static unsigned char *
14780 display_mips_gnu_attribute (unsigned char * p,
14781                             unsigned int tag,
14782                             const unsigned char * const end)
14783 {
14784   if (tag == Tag_GNU_MIPS_ABI_FP)
14785     {
14786       unsigned int len;
14787       unsigned int val;
14788
14789       val = read_uleb128 (p, &len, end);
14790       p += len;
14791       printf ("  Tag_GNU_MIPS_ABI_FP: ");
14792
14793       print_mips_fp_abi_value (val);
14794
14795       return p;
14796    }
14797
14798   if (tag == Tag_GNU_MIPS_ABI_MSA)
14799     {
14800       unsigned int len;
14801       unsigned int val;
14802
14803       val = read_uleb128 (p, &len, end);
14804       p += len;
14805       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
14806
14807       switch (val)
14808         {
14809         case Val_GNU_MIPS_ABI_MSA_ANY:
14810           printf (_("Any MSA or not\n"));
14811           break;
14812         case Val_GNU_MIPS_ABI_MSA_128:
14813           printf (_("128-bit MSA\n"));
14814           break;
14815         default:
14816           printf ("??? (%d)\n", val);
14817           break;
14818         }
14819       return p;
14820     }
14821
14822   return display_tag_value (tag & 1, p, end);
14823 }
14824
14825 static unsigned char *
14826 display_tic6x_attribute (unsigned char * p,
14827                          const unsigned char * const end)
14828 {
14829   unsigned int tag;
14830   unsigned int len;
14831   int val;
14832
14833   tag = read_uleb128 (p, &len, end);
14834   p += len;
14835
14836   switch (tag)
14837     {
14838     case Tag_ISA:
14839       val = read_uleb128 (p, &len, end);
14840       p += len;
14841       printf ("  Tag_ISA: ");
14842
14843       switch (val)
14844         {
14845         case C6XABI_Tag_ISA_none:
14846           printf (_("None\n"));
14847           break;
14848         case C6XABI_Tag_ISA_C62X:
14849           printf ("C62x\n");
14850           break;
14851         case C6XABI_Tag_ISA_C67X:
14852           printf ("C67x\n");
14853           break;
14854         case C6XABI_Tag_ISA_C67XP:
14855           printf ("C67x+\n");
14856           break;
14857         case C6XABI_Tag_ISA_C64X:
14858           printf ("C64x\n");
14859           break;
14860         case C6XABI_Tag_ISA_C64XP:
14861           printf ("C64x+\n");
14862           break;
14863         case C6XABI_Tag_ISA_C674X:
14864           printf ("C674x\n");
14865           break;
14866         default:
14867           printf ("??? (%d)\n", val);
14868           break;
14869         }
14870       return p;
14871
14872     case Tag_ABI_wchar_t:
14873       val = read_uleb128 (p, &len, end);
14874       p += len;
14875       printf ("  Tag_ABI_wchar_t: ");
14876       switch (val)
14877         {
14878         case 0:
14879           printf (_("Not used\n"));
14880           break;
14881         case 1:
14882           printf (_("2 bytes\n"));
14883           break;
14884         case 2:
14885           printf (_("4 bytes\n"));
14886           break;
14887         default:
14888           printf ("??? (%d)\n", val);
14889           break;
14890         }
14891       return p;
14892
14893     case Tag_ABI_stack_align_needed:
14894       val = read_uleb128 (p, &len, end);
14895       p += len;
14896       printf ("  Tag_ABI_stack_align_needed: ");
14897       switch (val)
14898         {
14899         case 0:
14900           printf (_("8-byte\n"));
14901           break;
14902         case 1:
14903           printf (_("16-byte\n"));
14904           break;
14905         default:
14906           printf ("??? (%d)\n", val);
14907           break;
14908         }
14909       return p;
14910
14911     case Tag_ABI_stack_align_preserved:
14912       val = read_uleb128 (p, &len, end);
14913       p += len;
14914       printf ("  Tag_ABI_stack_align_preserved: ");
14915       switch (val)
14916         {
14917         case 0:
14918           printf (_("8-byte\n"));
14919           break;
14920         case 1:
14921           printf (_("16-byte\n"));
14922           break;
14923         default:
14924           printf ("??? (%d)\n", val);
14925           break;
14926         }
14927       return p;
14928
14929     case Tag_ABI_DSBT:
14930       val = read_uleb128 (p, &len, end);
14931       p += len;
14932       printf ("  Tag_ABI_DSBT: ");
14933       switch (val)
14934         {
14935         case 0:
14936           printf (_("DSBT addressing not used\n"));
14937           break;
14938         case 1:
14939           printf (_("DSBT addressing used\n"));
14940           break;
14941         default:
14942           printf ("??? (%d)\n", val);
14943           break;
14944         }
14945       return p;
14946
14947     case Tag_ABI_PID:
14948       val = read_uleb128 (p, &len, end);
14949       p += len;
14950       printf ("  Tag_ABI_PID: ");
14951       switch (val)
14952         {
14953         case 0:
14954           printf (_("Data addressing position-dependent\n"));
14955           break;
14956         case 1:
14957           printf (_("Data addressing position-independent, GOT near DP\n"));
14958           break;
14959         case 2:
14960           printf (_("Data addressing position-independent, GOT far from DP\n"));
14961           break;
14962         default:
14963           printf ("??? (%d)\n", val);
14964           break;
14965         }
14966       return p;
14967
14968     case Tag_ABI_PIC:
14969       val = read_uleb128 (p, &len, end);
14970       p += len;
14971       printf ("  Tag_ABI_PIC: ");
14972       switch (val)
14973         {
14974         case 0:
14975           printf (_("Code addressing position-dependent\n"));
14976           break;
14977         case 1:
14978           printf (_("Code addressing position-independent\n"));
14979           break;
14980         default:
14981           printf ("??? (%d)\n", val);
14982           break;
14983         }
14984       return p;
14985
14986     case Tag_ABI_array_object_alignment:
14987       val = read_uleb128 (p, &len, end);
14988       p += len;
14989       printf ("  Tag_ABI_array_object_alignment: ");
14990       switch (val)
14991         {
14992         case 0:
14993           printf (_("8-byte\n"));
14994           break;
14995         case 1:
14996           printf (_("4-byte\n"));
14997           break;
14998         case 2:
14999           printf (_("16-byte\n"));
15000           break;
15001         default:
15002           printf ("??? (%d)\n", val);
15003           break;
15004         }
15005       return p;
15006
15007     case Tag_ABI_array_object_align_expected:
15008       val = read_uleb128 (p, &len, end);
15009       p += len;
15010       printf ("  Tag_ABI_array_object_align_expected: ");
15011       switch (val)
15012         {
15013         case 0:
15014           printf (_("8-byte\n"));
15015           break;
15016         case 1:
15017           printf (_("4-byte\n"));
15018           break;
15019         case 2:
15020           printf (_("16-byte\n"));
15021           break;
15022         default:
15023           printf ("??? (%d)\n", val);
15024           break;
15025         }
15026       return p;
15027
15028     case Tag_ABI_compatibility:
15029       {
15030         val = read_uleb128 (p, &len, end);
15031         p += len;
15032         printf ("  Tag_ABI_compatibility: ");
15033         printf (_("flag = %d, vendor = "), val);
15034         if (p < end - 1)
15035           {
15036             size_t maxlen = (end - p) - 1;
15037
15038             print_symbol ((int) maxlen, (const char *) p);
15039             p += strnlen ((char *) p, maxlen) + 1;
15040           }
15041         else
15042           {
15043             printf (_("<corrupt>"));
15044             p = (unsigned char *) end;
15045           }
15046         putchar ('\n');
15047         return p;
15048       }
15049
15050     case Tag_ABI_conformance:
15051       {
15052         printf ("  Tag_ABI_conformance: \"");
15053         if (p < end - 1)
15054           {
15055             size_t maxlen = (end - p) - 1;
15056
15057             print_symbol ((int) maxlen, (const char *) p);
15058             p += strnlen ((char *) p, maxlen) + 1;
15059           }
15060         else
15061           {
15062             printf (_("<corrupt>"));
15063             p = (unsigned char *) end;
15064           }
15065         printf ("\"\n");
15066         return p;
15067       }
15068     }
15069
15070   return display_tag_value (tag, p, end);
15071 }
15072
15073 static void
15074 display_raw_attribute (unsigned char * p, unsigned char const * const end)
15075 {
15076   unsigned long addr = 0;
15077   size_t bytes = end - p;
15078
15079   assert (end > p);
15080   while (bytes)
15081     {
15082       int j;
15083       int k;
15084       int lbytes = (bytes > 16 ? 16 : bytes);
15085
15086       printf ("  0x%8.8lx ", addr);
15087
15088       for (j = 0; j < 16; j++)
15089         {
15090           if (j < lbytes)
15091             printf ("%2.2x", p[j]);
15092           else
15093             printf ("  ");
15094
15095           if ((j & 3) == 3)
15096             printf (" ");
15097         }
15098
15099       for (j = 0; j < lbytes; j++)
15100         {
15101           k = p[j];
15102           if (k >= ' ' && k < 0x7f)
15103             printf ("%c", k);
15104           else
15105             printf (".");
15106         }
15107
15108       putchar ('\n');
15109
15110       p  += lbytes;
15111       bytes -= lbytes;
15112       addr += lbytes;
15113     }
15114
15115   putchar ('\n');
15116 }
15117
15118 static unsigned char *
15119 display_msp430x_attribute (unsigned char * p,
15120                            const unsigned char * const end)
15121 {
15122   unsigned int len;
15123   unsigned int val;
15124   unsigned int tag;
15125
15126   tag = read_uleb128 (p, & len, end);
15127   p += len;
15128
15129   switch (tag)
15130     {
15131     case OFBA_MSPABI_Tag_ISA:
15132       val = read_uleb128 (p, &len, end);
15133       p += len;
15134       printf ("  Tag_ISA: ");
15135       switch (val)
15136         {
15137         case 0: printf (_("None\n")); break;
15138         case 1: printf (_("MSP430\n")); break;
15139         case 2: printf (_("MSP430X\n")); break;
15140         default: printf ("??? (%d)\n", val); break;
15141         }
15142       break;
15143
15144     case OFBA_MSPABI_Tag_Code_Model:
15145       val = read_uleb128 (p, &len, end);
15146       p += len;
15147       printf ("  Tag_Code_Model: ");
15148       switch (val)
15149         {
15150         case 0: printf (_("None\n")); break;
15151         case 1: printf (_("Small\n")); break;
15152         case 2: printf (_("Large\n")); break;
15153         default: printf ("??? (%d)\n", val); break;
15154         }
15155       break;
15156
15157     case OFBA_MSPABI_Tag_Data_Model:
15158       val = read_uleb128 (p, &len, end);
15159       p += len;
15160       printf ("  Tag_Data_Model: ");
15161       switch (val)
15162         {
15163         case 0: printf (_("None\n")); break;
15164         case 1: printf (_("Small\n")); break;
15165         case 2: printf (_("Large\n")); break;
15166         case 3: printf (_("Restricted Large\n")); break;
15167         default: printf ("??? (%d)\n", val); break;
15168         }
15169       break;
15170
15171     default:
15172       printf (_("  <unknown tag %d>: "), tag);
15173
15174       if (tag & 1)
15175         {
15176           putchar ('"');
15177           if (p < end - 1)
15178             {
15179               size_t maxlen = (end - p) - 1;
15180
15181               print_symbol ((int) maxlen, (const char *) p);
15182               p += strnlen ((char *) p, maxlen) + 1;
15183             }
15184           else
15185             {
15186               printf (_("<corrupt>"));
15187               p = (unsigned char *) end;
15188             }
15189           printf ("\"\n");
15190         }
15191       else
15192         {
15193           val = read_uleb128 (p, &len, end);
15194           p += len;
15195           printf ("%d (0x%x)\n", val, val);
15196         }
15197       break;
15198    }
15199
15200   assert (p <= end);
15201   return p;
15202 }
15203
15204 static bfd_boolean
15205 process_attributes (Filedata * filedata,
15206                     const char * public_name,
15207                     unsigned int proc_type,
15208                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
15209                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const))
15210 {
15211   Elf_Internal_Shdr * sect;
15212   unsigned i;
15213   bfd_boolean res = TRUE;
15214
15215   /* Find the section header so that we get the size.  */
15216   for (i = 0, sect = filedata->section_headers;
15217        i < filedata->file_header.e_shnum;
15218        i++, sect++)
15219     {
15220       unsigned char * contents;
15221       unsigned char * p;
15222
15223       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
15224         continue;
15225
15226       contents = (unsigned char *) get_data (NULL, filedata, sect->sh_offset, 1,
15227                                              sect->sh_size, _("attributes"));
15228       if (contents == NULL)
15229         {
15230           res = FALSE;
15231           continue;
15232         }
15233
15234       p = contents;
15235       /* The first character is the version of the attributes.
15236          Currently only version 1, (aka 'A') is recognised here.  */
15237       if (*p != 'A')
15238         {
15239           printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p);
15240           res = FALSE;
15241         }
15242       else
15243         {
15244           bfd_vma section_len;
15245
15246           section_len = sect->sh_size - 1;
15247           p++;
15248
15249           while (section_len > 0)
15250             {
15251               bfd_vma attr_len;
15252               unsigned int namelen;
15253               bfd_boolean public_section;
15254               bfd_boolean gnu_section;
15255
15256               if (section_len <= 4)
15257                 {
15258                   error (_("Tag section ends prematurely\n"));
15259                   res = FALSE;
15260                   break;
15261                 }
15262               attr_len = byte_get (p, 4);
15263               p += 4;
15264
15265               if (attr_len > section_len)
15266                 {
15267                   error (_("Bad attribute length (%u > %u)\n"),
15268                           (unsigned) attr_len, (unsigned) section_len);
15269                   attr_len = section_len;
15270                   res = FALSE;
15271                 }
15272               /* PR 17531: file: 001-101425-0.004  */
15273               else if (attr_len < 5)
15274                 {
15275                   error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
15276                   res = FALSE;
15277                   break;
15278                 }
15279
15280               section_len -= attr_len;
15281               attr_len -= 4;
15282
15283               namelen = strnlen ((char *) p, attr_len) + 1;
15284               if (namelen == 0 || namelen >= attr_len)
15285                 {
15286                   error (_("Corrupt attribute section name\n"));
15287                   res = FALSE;
15288                   break;
15289                 }
15290
15291               printf (_("Attribute Section: "));
15292               print_symbol (INT_MAX, (const char *) p);
15293               putchar ('\n');
15294
15295               if (public_name && streq ((char *) p, public_name))
15296                 public_section = TRUE;
15297               else
15298                 public_section = FALSE;
15299
15300               if (streq ((char *) p, "gnu"))
15301                 gnu_section = TRUE;
15302               else
15303                 gnu_section = FALSE;
15304
15305               p += namelen;
15306               attr_len -= namelen;
15307
15308               while (attr_len > 0 && p < contents + sect->sh_size)
15309                 {
15310                   int tag;
15311                   int val;
15312                   bfd_vma size;
15313                   unsigned char * end;
15314
15315                   /* PR binutils/17531: Safe handling of corrupt files.  */
15316                   if (attr_len < 6)
15317                     {
15318                       error (_("Unused bytes at end of section\n"));
15319                       res = FALSE;
15320                       section_len = 0;
15321                       break;
15322                     }
15323
15324                   tag = *(p++);
15325                   size = byte_get (p, 4);
15326                   if (size > attr_len)
15327                     {
15328                       error (_("Bad subsection length (%u > %u)\n"),
15329                               (unsigned) size, (unsigned) attr_len);
15330                       res = FALSE;
15331                       size = attr_len;
15332                     }
15333                   /* PR binutils/17531: Safe handling of corrupt files.  */
15334                   if (size < 6)
15335                     {
15336                       error (_("Bad subsection length (%u < 6)\n"),
15337                               (unsigned) size);
15338                       res = FALSE;
15339                       section_len = 0;
15340                       break;
15341                     }
15342
15343                   attr_len -= size;
15344                   end = p + size - 1;
15345                   assert (end <= contents + sect->sh_size);
15346                   p += 4;
15347
15348                   switch (tag)
15349                     {
15350                     case 1:
15351                       printf (_("File Attributes\n"));
15352                       break;
15353                     case 2:
15354                       printf (_("Section Attributes:"));
15355                       goto do_numlist;
15356                     case 3:
15357                       printf (_("Symbol Attributes:"));
15358                       /* Fall through.  */
15359                     do_numlist:
15360                       for (;;)
15361                         {
15362                           unsigned int j;
15363
15364                           val = read_uleb128 (p, &j, end);
15365                           p += j;
15366                           if (val == 0)
15367                             break;
15368                           printf (" %d", val);
15369                         }
15370                       printf ("\n");
15371                       break;
15372                     default:
15373                       printf (_("Unknown tag: %d\n"), tag);
15374                       public_section = FALSE;
15375                       break;
15376                     }
15377
15378                   if (public_section && display_pub_attribute != NULL)
15379                     {
15380                       while (p < end)
15381                         p = display_pub_attribute (p, end);
15382                       assert (p == end);
15383                     }
15384                   else if (gnu_section && display_proc_gnu_attribute != NULL)
15385                     {
15386                       while (p < end)
15387                         p = display_gnu_attribute (p,
15388                                                    display_proc_gnu_attribute,
15389                                                    end);
15390                       assert (p == end);
15391                     }
15392                   else if (p < end)
15393                     {
15394                       printf (_("  Unknown attribute:\n"));
15395                       display_raw_attribute (p, end);
15396                       p = end;
15397                     }
15398                   else
15399                     attr_len = 0;
15400                 }
15401             }
15402         }
15403
15404       free (contents);
15405     }
15406
15407   return res;
15408 }
15409
15410 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
15411    Print the Address, Access and Initial fields of an entry at VMA ADDR
15412    and return the VMA of the next entry, or -1 if there was a problem.
15413    Does not read from DATA_END or beyond.  */
15414
15415 static bfd_vma
15416 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
15417                       unsigned char * data_end)
15418 {
15419   printf ("  ");
15420   print_vma (addr, LONG_HEX);
15421   printf (" ");
15422   if (addr < pltgot + 0xfff0)
15423     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
15424   else
15425     printf ("%10s", "");
15426   printf (" ");
15427   if (data == NULL)
15428     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15429   else
15430     {
15431       bfd_vma entry;
15432       unsigned char * from = data + addr - pltgot;
15433
15434       if (from + (is_32bit_elf ? 4 : 8) > data_end)
15435         {
15436           warn (_("MIPS GOT entry extends beyond the end of available data\n"));
15437           printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
15438           return (bfd_vma) -1;
15439         }
15440       else
15441         {
15442           entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15443           print_vma (entry, LONG_HEX);
15444         }
15445     }
15446   return addr + (is_32bit_elf ? 4 : 8);
15447 }
15448
15449 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
15450    PLTGOT.  Print the Address and Initial fields of an entry at VMA
15451    ADDR and return the VMA of the next entry.  */
15452
15453 static bfd_vma
15454 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
15455 {
15456   printf ("  ");
15457   print_vma (addr, LONG_HEX);
15458   printf (" ");
15459   if (data == NULL)
15460     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15461   else
15462     {
15463       bfd_vma entry;
15464
15465       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15466       print_vma (entry, LONG_HEX);
15467     }
15468   return addr + (is_32bit_elf ? 4 : 8);
15469 }
15470
15471 static void
15472 print_mips_ases (unsigned int mask)
15473 {
15474   if (mask & AFL_ASE_DSP)
15475     fputs ("\n\tDSP ASE", stdout);
15476   if (mask & AFL_ASE_DSPR2)
15477     fputs ("\n\tDSP R2 ASE", stdout);
15478   if (mask & AFL_ASE_DSPR3)
15479     fputs ("\n\tDSP R3 ASE", stdout);
15480   if (mask & AFL_ASE_EVA)
15481     fputs ("\n\tEnhanced VA Scheme", stdout);
15482   if (mask & AFL_ASE_MCU)
15483     fputs ("\n\tMCU (MicroController) ASE", stdout);
15484   if (mask & AFL_ASE_MDMX)
15485     fputs ("\n\tMDMX ASE", stdout);
15486   if (mask & AFL_ASE_MIPS3D)
15487     fputs ("\n\tMIPS-3D ASE", stdout);
15488   if (mask & AFL_ASE_MT)
15489     fputs ("\n\tMT ASE", stdout);
15490   if (mask & AFL_ASE_SMARTMIPS)
15491     fputs ("\n\tSmartMIPS ASE", stdout);
15492   if (mask & AFL_ASE_VIRT)
15493     fputs ("\n\tVZ ASE", stdout);
15494   if (mask & AFL_ASE_MSA)
15495     fputs ("\n\tMSA ASE", stdout);
15496   if (mask & AFL_ASE_MIPS16)
15497     fputs ("\n\tMIPS16 ASE", stdout);
15498   if (mask & AFL_ASE_MICROMIPS)
15499     fputs ("\n\tMICROMIPS ASE", stdout);
15500   if (mask & AFL_ASE_XPA)
15501     fputs ("\n\tXPA ASE", stdout);
15502   if (mask & AFL_ASE_MIPS16E2)
15503     fputs ("\n\tMIPS16e2 ASE", stdout);
15504   if (mask == 0)
15505     fprintf (stdout, "\n\t%s", _("None"));
15506   else if ((mask & ~AFL_ASE_MASK) != 0)
15507     fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
15508 }
15509
15510 static void
15511 print_mips_isa_ext (unsigned int isa_ext)
15512 {
15513   switch (isa_ext)
15514     {
15515     case 0:
15516       fputs (_("None"), stdout);
15517       break;
15518     case AFL_EXT_XLR:
15519       fputs ("RMI XLR", stdout);
15520       break;
15521     case AFL_EXT_OCTEON3:
15522       fputs ("Cavium Networks Octeon3", stdout);
15523       break;
15524     case AFL_EXT_OCTEON2:
15525       fputs ("Cavium Networks Octeon2", stdout);
15526       break;
15527     case AFL_EXT_OCTEONP:
15528       fputs ("Cavium Networks OcteonP", stdout);
15529       break;
15530     case AFL_EXT_LOONGSON_3A:
15531       fputs ("Loongson 3A", stdout);
15532       break;
15533     case AFL_EXT_OCTEON:
15534       fputs ("Cavium Networks Octeon", stdout);
15535       break;
15536     case AFL_EXT_5900:
15537       fputs ("Toshiba R5900", stdout);
15538       break;
15539     case AFL_EXT_4650:
15540       fputs ("MIPS R4650", stdout);
15541       break;
15542     case AFL_EXT_4010:
15543       fputs ("LSI R4010", stdout);
15544       break;
15545     case AFL_EXT_4100:
15546       fputs ("NEC VR4100", stdout);
15547       break;
15548     case AFL_EXT_3900:
15549       fputs ("Toshiba R3900", stdout);
15550       break;
15551     case AFL_EXT_10000:
15552       fputs ("MIPS R10000", stdout);
15553       break;
15554     case AFL_EXT_SB1:
15555       fputs ("Broadcom SB-1", stdout);
15556       break;
15557     case AFL_EXT_4111:
15558       fputs ("NEC VR4111/VR4181", stdout);
15559       break;
15560     case AFL_EXT_4120:
15561       fputs ("NEC VR4120", stdout);
15562       break;
15563     case AFL_EXT_5400:
15564       fputs ("NEC VR5400", stdout);
15565       break;
15566     case AFL_EXT_5500:
15567       fputs ("NEC VR5500", stdout);
15568       break;
15569     case AFL_EXT_LOONGSON_2E:
15570       fputs ("ST Microelectronics Loongson 2E", stdout);
15571       break;
15572     case AFL_EXT_LOONGSON_2F:
15573       fputs ("ST Microelectronics Loongson 2F", stdout);
15574       break;
15575     case AFL_EXT_INTERAPTIV_MR2:
15576       fputs ("Imagination interAptiv MR2", stdout);
15577       break;
15578     default:
15579       fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
15580     }
15581 }
15582
15583 static signed int
15584 get_mips_reg_size (int reg_size)
15585 {
15586   return (reg_size == AFL_REG_NONE) ? 0
15587          : (reg_size == AFL_REG_32) ? 32
15588          : (reg_size == AFL_REG_64) ? 64
15589          : (reg_size == AFL_REG_128) ? 128
15590          : -1;
15591 }
15592
15593 static bfd_boolean
15594 process_mips_specific (Filedata * filedata)
15595 {
15596   Elf_Internal_Dyn * entry;
15597   Elf_Internal_Shdr *sect = NULL;
15598   size_t liblist_offset = 0;
15599   size_t liblistno = 0;
15600   size_t conflictsno = 0;
15601   size_t options_offset = 0;
15602   size_t conflicts_offset = 0;
15603   size_t pltrelsz = 0;
15604   size_t pltrel = 0;
15605   bfd_vma pltgot = 0;
15606   bfd_vma mips_pltgot = 0;
15607   bfd_vma jmprel = 0;
15608   bfd_vma local_gotno = 0;
15609   bfd_vma gotsym = 0;
15610   bfd_vma symtabno = 0;
15611   bfd_boolean res = TRUE;
15612
15613   if (! process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
15614                             display_mips_gnu_attribute))
15615     res = FALSE;
15616
15617   sect = find_section (filedata, ".MIPS.abiflags");
15618
15619   if (sect != NULL)
15620     {
15621       Elf_External_ABIFlags_v0 *abiflags_ext;
15622       Elf_Internal_ABIFlags_v0 abiflags_in;
15623
15624       if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
15625         {
15626           error (_("Corrupt MIPS ABI Flags section.\n"));
15627           res = FALSE;
15628         }
15629       else
15630         {
15631           abiflags_ext = get_data (NULL, filedata, sect->sh_offset, 1,
15632                                    sect->sh_size, _("MIPS ABI Flags section"));
15633           if (abiflags_ext)
15634             {
15635               abiflags_in.version = BYTE_GET (abiflags_ext->version);
15636               abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
15637               abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
15638               abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
15639               abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
15640               abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
15641               abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
15642               abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
15643               abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
15644               abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
15645               abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
15646
15647               printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
15648               printf ("\nISA: MIPS%d", abiflags_in.isa_level);
15649               if (abiflags_in.isa_rev > 1)
15650                 printf ("r%d", abiflags_in.isa_rev);
15651               printf ("\nGPR size: %d",
15652                       get_mips_reg_size (abiflags_in.gpr_size));
15653               printf ("\nCPR1 size: %d",
15654                       get_mips_reg_size (abiflags_in.cpr1_size));
15655               printf ("\nCPR2 size: %d",
15656                       get_mips_reg_size (abiflags_in.cpr2_size));
15657               fputs ("\nFP ABI: ", stdout);
15658               print_mips_fp_abi_value (abiflags_in.fp_abi);
15659               fputs ("ISA Extension: ", stdout);
15660               print_mips_isa_ext (abiflags_in.isa_ext);
15661               fputs ("\nASEs:", stdout);
15662               print_mips_ases (abiflags_in.ases);
15663               printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
15664               printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
15665               fputc ('\n', stdout);
15666               free (abiflags_ext);
15667             }
15668         }
15669     }
15670
15671   /* We have a lot of special sections.  Thanks SGI!  */
15672   if (dynamic_section == NULL)
15673     {
15674       /* No dynamic information available.  See if there is static GOT.  */
15675       sect = find_section (filedata, ".got");
15676       if (sect != NULL)
15677         {
15678           unsigned char *data_end;
15679           unsigned char *data;
15680           bfd_vma ent, end;
15681           int addr_size;
15682
15683           pltgot = sect->sh_addr;
15684
15685           ent = pltgot;
15686           addr_size = (is_32bit_elf ? 4 : 8);
15687           end = pltgot + sect->sh_size;
15688
15689           data = (unsigned char *) get_data (NULL, filedata, sect->sh_offset,
15690                                              end - pltgot, 1,
15691                                              _("Global Offset Table data"));
15692           /* PR 12855: Null data is handled gracefully throughout.  */
15693           data_end = data + (end - pltgot);
15694
15695           printf (_("\nStatic GOT:\n"));
15696           printf (_(" Canonical gp value: "));
15697           print_vma (ent + 0x7ff0, LONG_HEX);
15698           printf ("\n\n");
15699
15700           /* In a dynamic binary GOT[0] is reserved for the dynamic
15701              loader to store the lazy resolver pointer, however in
15702              a static binary it may well have been omitted and GOT
15703              reduced to a table of addresses.
15704              PR 21344: Check for the entry being fully available
15705              before fetching it.  */
15706           if (data
15707               && data + ent - pltgot + addr_size <= data_end
15708               && byte_get (data + ent - pltgot, addr_size) == 0)
15709             {
15710               printf (_(" Reserved entries:\n"));
15711               printf (_("  %*s %10s %*s\n"),
15712                       addr_size * 2, _("Address"), _("Access"),
15713                       addr_size * 2, _("Value"));
15714               ent = print_mips_got_entry (data, pltgot, ent, data_end);
15715               printf ("\n");
15716               if (ent == (bfd_vma) -1)
15717                 goto sgot_print_fail;
15718
15719               /* Check for the MSB of GOT[1] being set, identifying a
15720                  GNU object.  This entry will be used by some runtime
15721                  loaders, to store the module pointer.  Otherwise this
15722                  is an ordinary local entry.
15723                  PR 21344: Check for the entry being fully available
15724                  before fetching it.  */
15725               if (data
15726                   && data + ent - pltgot + addr_size <= data_end
15727                   && (byte_get (data + ent - pltgot, addr_size)
15728                       >> (addr_size * 8 - 1)) != 0)
15729                 {
15730                   ent = print_mips_got_entry (data, pltgot, ent, data_end);
15731                   printf ("\n");
15732                   if (ent == (bfd_vma) -1)
15733                     goto sgot_print_fail;
15734                 }
15735               printf ("\n");
15736             }
15737
15738           if (data != NULL && ent < end)
15739             {
15740               printf (_(" Local entries:\n"));
15741               printf ("  %*s %10s %*s\n",
15742                       addr_size * 2, _("Address"), _("Access"),
15743                       addr_size * 2, _("Value"));
15744               while (ent < end)
15745                 {
15746                   ent = print_mips_got_entry (data, pltgot, ent, data_end);
15747                   printf ("\n");
15748                   if (ent == (bfd_vma) -1)
15749                     goto sgot_print_fail;
15750                 }
15751               printf ("\n");
15752             }
15753
15754         sgot_print_fail:
15755           if (data)
15756             free (data);
15757         }
15758       return res;
15759     }
15760
15761   for (entry = dynamic_section;
15762        /* PR 17531 file: 012-50589-0.004.  */
15763        entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
15764        ++entry)
15765     switch (entry->d_tag)
15766       {
15767       case DT_MIPS_LIBLIST:
15768         liblist_offset
15769           = offset_from_vma (filedata, entry->d_un.d_val,
15770                              liblistno * sizeof (Elf32_External_Lib));
15771         break;
15772       case DT_MIPS_LIBLISTNO:
15773         liblistno = entry->d_un.d_val;
15774         break;
15775       case DT_MIPS_OPTIONS:
15776         options_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
15777         break;
15778       case DT_MIPS_CONFLICT:
15779         conflicts_offset
15780           = offset_from_vma (filedata, entry->d_un.d_val,
15781                              conflictsno * sizeof (Elf32_External_Conflict));
15782         break;
15783       case DT_MIPS_CONFLICTNO:
15784         conflictsno = entry->d_un.d_val;
15785         break;
15786       case DT_PLTGOT:
15787         pltgot = entry->d_un.d_ptr;
15788         break;
15789       case DT_MIPS_LOCAL_GOTNO:
15790         local_gotno = entry->d_un.d_val;
15791         break;
15792       case DT_MIPS_GOTSYM:
15793         gotsym = entry->d_un.d_val;
15794         break;
15795       case DT_MIPS_SYMTABNO:
15796         symtabno = entry->d_un.d_val;
15797         break;
15798       case DT_MIPS_PLTGOT:
15799         mips_pltgot = entry->d_un.d_ptr;
15800         break;
15801       case DT_PLTREL:
15802         pltrel = entry->d_un.d_val;
15803         break;
15804       case DT_PLTRELSZ:
15805         pltrelsz = entry->d_un.d_val;
15806         break;
15807       case DT_JMPREL:
15808         jmprel = entry->d_un.d_ptr;
15809         break;
15810       default:
15811         break;
15812       }
15813
15814   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
15815     {
15816       Elf32_External_Lib * elib;
15817       size_t cnt;
15818
15819       elib = (Elf32_External_Lib *) get_data (NULL, filedata, liblist_offset,
15820                                               liblistno,
15821                                               sizeof (Elf32_External_Lib),
15822                                               _("liblist section data"));
15823       if (elib)
15824         {
15825           printf (ngettext ("\nSection '.liblist' contains %lu entry:\n",
15826                             "\nSection '.liblist' contains %lu entries:\n",
15827                             (unsigned long) liblistno),
15828                   (unsigned long) liblistno);
15829           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
15830                  stdout);
15831
15832           for (cnt = 0; cnt < liblistno; ++cnt)
15833             {
15834               Elf32_Lib liblist;
15835               time_t atime;
15836               char timebuf[128];
15837               struct tm * tmp;
15838
15839               liblist.l_name = BYTE_GET (elib[cnt].l_name);
15840               atime = BYTE_GET (elib[cnt].l_time_stamp);
15841               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15842               liblist.l_version = BYTE_GET (elib[cnt].l_version);
15843               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15844
15845               tmp = gmtime (&atime);
15846               snprintf (timebuf, sizeof (timebuf),
15847                         "%04u-%02u-%02uT%02u:%02u:%02u",
15848                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15849                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
15850
15851               printf ("%3lu: ", (unsigned long) cnt);
15852               if (VALID_DYNAMIC_NAME (liblist.l_name))
15853                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
15854               else
15855                 printf (_("<corrupt: %9ld>"), liblist.l_name);
15856               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
15857                       liblist.l_version);
15858
15859               if (liblist.l_flags == 0)
15860                 puts (_(" NONE"));
15861               else
15862                 {
15863                   static const struct
15864                   {
15865                     const char * name;
15866                     int bit;
15867                   }
15868                   l_flags_vals[] =
15869                   {
15870                     { " EXACT_MATCH", LL_EXACT_MATCH },
15871                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
15872                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
15873                     { " EXPORTS", LL_EXPORTS },
15874                     { " DELAY_LOAD", LL_DELAY_LOAD },
15875                     { " DELTA", LL_DELTA }
15876                   };
15877                   int flags = liblist.l_flags;
15878                   size_t fcnt;
15879
15880                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
15881                     if ((flags & l_flags_vals[fcnt].bit) != 0)
15882                       {
15883                         fputs (l_flags_vals[fcnt].name, stdout);
15884                         flags ^= l_flags_vals[fcnt].bit;
15885                       }
15886                   if (flags != 0)
15887                     printf (" %#x", (unsigned int) flags);
15888
15889                   puts ("");
15890                 }
15891             }
15892
15893           free (elib);
15894         }
15895       else
15896         res = FALSE;
15897     }
15898
15899   if (options_offset != 0)
15900     {
15901       Elf_External_Options * eopt;
15902       Elf_Internal_Options * iopt;
15903       Elf_Internal_Options * option;
15904       size_t offset;
15905       int cnt;
15906       sect = filedata->section_headers;
15907
15908       /* Find the section header so that we get the size.  */
15909       sect = find_section_by_type (filedata, SHT_MIPS_OPTIONS);
15910       /* PR 17533 file: 012-277276-0.004.  */
15911       if (sect == NULL)
15912         {
15913           error (_("No MIPS_OPTIONS header found\n"));
15914           return FALSE;
15915         }
15916
15917       eopt = (Elf_External_Options *) get_data (NULL, filedata, options_offset, 1,
15918                                                 sect->sh_size, _("options"));
15919       if (eopt)
15920         {
15921           iopt = (Elf_Internal_Options *)
15922               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
15923           if (iopt == NULL)
15924             {
15925               error (_("Out of memory allocating space for MIPS options\n"));
15926               return FALSE;
15927             }
15928
15929           offset = cnt = 0;
15930           option = iopt;
15931
15932           while (offset <= sect->sh_size - sizeof (* eopt))
15933             {
15934               Elf_External_Options * eoption;
15935
15936               eoption = (Elf_External_Options *) ((char *) eopt + offset);
15937
15938               option->kind = BYTE_GET (eoption->kind);
15939               option->size = BYTE_GET (eoption->size);
15940               option->section = BYTE_GET (eoption->section);
15941               option->info = BYTE_GET (eoption->info);
15942
15943               /* PR 17531: file: ffa0fa3b.  */
15944               if (option->size < sizeof (* eopt)
15945                   || offset + option->size > sect->sh_size)
15946                 {
15947                   error (_("Invalid size (%u) for MIPS option\n"), option->size);
15948                   return FALSE;
15949                 }
15950               offset += option->size;
15951
15952               ++option;
15953               ++cnt;
15954             }
15955
15956           printf (ngettext ("\nSection '%s' contains %d entry:\n",
15957                             "\nSection '%s' contains %d entries:\n",
15958                             cnt),
15959                   printable_section_name (filedata, sect), cnt);
15960
15961           option = iopt;
15962           offset = 0;
15963
15964           while (cnt-- > 0)
15965             {
15966               size_t len;
15967
15968               switch (option->kind)
15969                 {
15970                 case ODK_NULL:
15971                   /* This shouldn't happen.  */
15972                   printf (" NULL       %d %lx", option->section, option->info);
15973                   break;
15974                 case ODK_REGINFO:
15975                   printf (" REGINFO    ");
15976                   if (filedata->file_header.e_machine == EM_MIPS)
15977                     {
15978                       /* 32bit form.  */
15979                       Elf32_External_RegInfo * ereg;
15980                       Elf32_RegInfo reginfo;
15981
15982                       ereg = (Elf32_External_RegInfo *) (option + 1);
15983                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
15984                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
15985                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
15986                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
15987                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
15988                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
15989
15990                       printf ("GPR %08lx  GP 0x%lx\n",
15991                               reginfo.ri_gprmask,
15992                               (unsigned long) reginfo.ri_gp_value);
15993                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
15994                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
15995                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
15996                     }
15997                   else
15998                     {
15999                       /* 64 bit form.  */
16000                       Elf64_External_RegInfo * ereg;
16001                       Elf64_Internal_RegInfo reginfo;
16002
16003                       ereg = (Elf64_External_RegInfo *) (option + 1);
16004                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
16005                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16006                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16007                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16008                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16009                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
16010
16011                       printf ("GPR %08lx  GP 0x",
16012                               reginfo.ri_gprmask);
16013                       printf_vma (reginfo.ri_gp_value);
16014                       printf ("\n");
16015
16016                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
16017                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16018                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16019                     }
16020                   ++option;
16021                   continue;
16022                 case ODK_EXCEPTIONS:
16023                   fputs (" EXCEPTIONS fpe_min(", stdout);
16024                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
16025                   fputs (") fpe_max(", stdout);
16026                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
16027                   fputs (")", stdout);
16028
16029                   if (option->info & OEX_PAGE0)
16030                     fputs (" PAGE0", stdout);
16031                   if (option->info & OEX_SMM)
16032                     fputs (" SMM", stdout);
16033                   if (option->info & OEX_FPDBUG)
16034                     fputs (" FPDBUG", stdout);
16035                   if (option->info & OEX_DISMISS)
16036                     fputs (" DISMISS", stdout);
16037                   break;
16038                 case ODK_PAD:
16039                   fputs (" PAD       ", stdout);
16040                   if (option->info & OPAD_PREFIX)
16041                     fputs (" PREFIX", stdout);
16042                   if (option->info & OPAD_POSTFIX)
16043                     fputs (" POSTFIX", stdout);
16044                   if (option->info & OPAD_SYMBOL)
16045                     fputs (" SYMBOL", stdout);
16046                   break;
16047                 case ODK_HWPATCH:
16048                   fputs (" HWPATCH   ", stdout);
16049                   if (option->info & OHW_R4KEOP)
16050                     fputs (" R4KEOP", stdout);
16051                   if (option->info & OHW_R8KPFETCH)
16052                     fputs (" R8KPFETCH", stdout);
16053                   if (option->info & OHW_R5KEOP)
16054                     fputs (" R5KEOP", stdout);
16055                   if (option->info & OHW_R5KCVTL)
16056                     fputs (" R5KCVTL", stdout);
16057                   break;
16058                 case ODK_FILL:
16059                   fputs (" FILL       ", stdout);
16060                   /* XXX Print content of info word?  */
16061                   break;
16062                 case ODK_TAGS:
16063                   fputs (" TAGS       ", stdout);
16064                   /* XXX Print content of info word?  */
16065                   break;
16066                 case ODK_HWAND:
16067                   fputs (" HWAND     ", stdout);
16068                   if (option->info & OHWA0_R4KEOP_CHECKED)
16069                     fputs (" R4KEOP_CHECKED", stdout);
16070                   if (option->info & OHWA0_R4KEOP_CLEAN)
16071                     fputs (" R4KEOP_CLEAN", stdout);
16072                   break;
16073                 case ODK_HWOR:
16074                   fputs (" HWOR      ", stdout);
16075                   if (option->info & OHWA0_R4KEOP_CHECKED)
16076                     fputs (" R4KEOP_CHECKED", stdout);
16077                   if (option->info & OHWA0_R4KEOP_CLEAN)
16078                     fputs (" R4KEOP_CLEAN", stdout);
16079                   break;
16080                 case ODK_GP_GROUP:
16081                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
16082                           option->info & OGP_GROUP,
16083                           (option->info & OGP_SELF) >> 16);
16084                   break;
16085                 case ODK_IDENT:
16086                   printf (" IDENT     %#06lx  self-contained %#06lx",
16087                           option->info & OGP_GROUP,
16088                           (option->info & OGP_SELF) >> 16);
16089                   break;
16090                 default:
16091                   /* This shouldn't happen.  */
16092                   printf (" %3d ???     %d %lx",
16093                           option->kind, option->section, option->info);
16094                   break;
16095                 }
16096
16097               len = sizeof (* eopt);
16098               while (len < option->size)
16099                 {
16100                   unsigned char datum = * ((unsigned char *) eopt + offset + len);
16101
16102                   if (ISPRINT (datum))
16103                     printf ("%c", datum);
16104                   else
16105                     printf ("\\%03o", datum);
16106                   len ++;
16107                 }
16108               fputs ("\n", stdout);
16109
16110               offset += option->size;
16111               ++option;
16112             }
16113
16114           free (eopt);
16115         }
16116       else
16117         res = FALSE;
16118     }
16119
16120   if (conflicts_offset != 0 && conflictsno != 0)
16121     {
16122       Elf32_Conflict * iconf;
16123       size_t cnt;
16124
16125       if (dynamic_symbols == NULL)
16126         {
16127           error (_("conflict list found without a dynamic symbol table\n"));
16128           return FALSE;
16129         }
16130
16131       /* PR 21345 - print a slightly more helpful error message
16132          if we are sure that the cmalloc will fail.  */
16133       if (conflictsno * sizeof (* iconf) > filedata->file_size)
16134         {
16135           error (_("Overlarge number of conflicts detected: %lx\n"),
16136                  (long) conflictsno);
16137           return FALSE;
16138         }
16139
16140       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
16141       if (iconf == NULL)
16142         {
16143           error (_("Out of memory allocating space for dynamic conflicts\n"));
16144           return FALSE;
16145         }
16146
16147       if (is_32bit_elf)
16148         {
16149           Elf32_External_Conflict * econf32;
16150
16151           econf32 = (Elf32_External_Conflict *)
16152               get_data (NULL, filedata, conflicts_offset, conflictsno,
16153                         sizeof (* econf32), _("conflict"));
16154           if (!econf32)
16155             return FALSE;
16156
16157           for (cnt = 0; cnt < conflictsno; ++cnt)
16158             iconf[cnt] = BYTE_GET (econf32[cnt]);
16159
16160           free (econf32);
16161         }
16162       else
16163         {
16164           Elf64_External_Conflict * econf64;
16165
16166           econf64 = (Elf64_External_Conflict *)
16167               get_data (NULL, filedata, conflicts_offset, conflictsno,
16168                         sizeof (* econf64), _("conflict"));
16169           if (!econf64)
16170             return FALSE;
16171
16172           for (cnt = 0; cnt < conflictsno; ++cnt)
16173             iconf[cnt] = BYTE_GET (econf64[cnt]);
16174
16175           free (econf64);
16176         }
16177
16178       printf (ngettext ("\nSection '.conflict' contains %lu entry:\n",
16179                         "\nSection '.conflict' contains %lu entries:\n",
16180                         (unsigned long) conflictsno),
16181               (unsigned long) conflictsno);
16182       puts (_("  Num:    Index       Value  Name"));
16183
16184       for (cnt = 0; cnt < conflictsno; ++cnt)
16185         {
16186           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
16187
16188           if (iconf[cnt] >= num_dynamic_syms)
16189             printf (_("<corrupt symbol index>"));
16190           else
16191             {
16192               Elf_Internal_Sym * psym;
16193
16194               psym = & dynamic_symbols[iconf[cnt]];
16195               print_vma (psym->st_value, FULL_HEX);
16196               putchar (' ');
16197               if (VALID_DYNAMIC_NAME (psym->st_name))
16198                 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
16199               else
16200                 printf (_("<corrupt: %14ld>"), psym->st_name);
16201             }
16202           putchar ('\n');
16203         }
16204
16205       free (iconf);
16206     }
16207
16208   if (pltgot != 0 && local_gotno != 0)
16209     {
16210       bfd_vma ent, local_end, global_end;
16211       size_t i, offset;
16212       unsigned char * data;
16213       unsigned char * data_end;
16214       int addr_size;
16215
16216       ent = pltgot;
16217       addr_size = (is_32bit_elf ? 4 : 8);
16218       local_end = pltgot + local_gotno * addr_size;
16219
16220       /* PR binutils/17533 file: 012-111227-0.004  */
16221       if (symtabno < gotsym)
16222         {
16223           error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
16224                  (unsigned long) gotsym, (unsigned long) symtabno);
16225           return FALSE;
16226         }
16227
16228       global_end = local_end + (symtabno - gotsym) * addr_size;
16229       /* PR 17531: file: 54c91a34.  */
16230       if (global_end < local_end)
16231         {
16232           error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
16233           return FALSE;
16234         }
16235
16236       offset = offset_from_vma (filedata, pltgot, global_end - pltgot);
16237       data = (unsigned char *) get_data (NULL, filedata, offset,
16238                                          global_end - pltgot, 1,
16239                                          _("Global Offset Table data"));
16240       /* PR 12855: Null data is handled gracefully throughout.  */
16241       data_end = data + (global_end - pltgot);
16242
16243       printf (_("\nPrimary GOT:\n"));
16244       printf (_(" Canonical gp value: "));
16245       print_vma (pltgot + 0x7ff0, LONG_HEX);
16246       printf ("\n\n");
16247
16248       printf (_(" Reserved entries:\n"));
16249       printf (_("  %*s %10s %*s Purpose\n"),
16250               addr_size * 2, _("Address"), _("Access"),
16251               addr_size * 2, _("Initial"));
16252       ent = print_mips_got_entry (data, pltgot, ent, data_end);
16253       printf (_(" Lazy resolver\n"));
16254       if (ent == (bfd_vma) -1)
16255         goto got_print_fail;
16256
16257       /* Check for the MSB of GOT[1] being set, denoting a GNU object.
16258          This entry will be used by some runtime loaders, to store the
16259          module pointer.  Otherwise this is an ordinary local entry.
16260          PR 21344: Check for the entry being fully available before
16261          fetching it.  */
16262       if (data
16263           && data + ent - pltgot + addr_size <= data_end
16264           && (byte_get (data + ent - pltgot, addr_size)
16265               >> (addr_size * 8 - 1)) != 0)
16266         {
16267           ent = print_mips_got_entry (data, pltgot, ent, data_end);
16268           printf (_(" Module pointer (GNU extension)\n"));
16269           if (ent == (bfd_vma) -1)
16270             goto got_print_fail;
16271         }
16272       printf ("\n");
16273
16274       if (data != NULL && ent < local_end)
16275         {
16276           printf (_(" Local entries:\n"));
16277           printf ("  %*s %10s %*s\n",
16278                   addr_size * 2, _("Address"), _("Access"),
16279                   addr_size * 2, _("Initial"));
16280           while (ent < local_end)
16281             {
16282               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16283               printf ("\n");
16284               if (ent == (bfd_vma) -1)
16285                 goto got_print_fail;
16286             }
16287           printf ("\n");
16288         }
16289
16290       if (data != NULL && gotsym < symtabno)
16291         {
16292           int sym_width;
16293
16294           printf (_(" Global entries:\n"));
16295           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
16296                   addr_size * 2, _("Address"),
16297                   _("Access"),
16298                   addr_size * 2, _("Initial"),
16299                   addr_size * 2, _("Sym.Val."),
16300                   _("Type"),
16301                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
16302                   _("Ndx"), _("Name"));
16303
16304           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
16305
16306           for (i = gotsym; i < symtabno; i++)
16307             {
16308               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16309               printf (" ");
16310
16311               if (dynamic_symbols == NULL)
16312                 printf (_("<no dynamic symbols>"));
16313               else if (i < num_dynamic_syms)
16314                 {
16315                   Elf_Internal_Sym * psym = dynamic_symbols + i;
16316
16317                   print_vma (psym->st_value, LONG_HEX);
16318                   printf (" %-7s %3s ",
16319                           get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16320                           get_symbol_index_type (filedata, psym->st_shndx));
16321
16322                   if (VALID_DYNAMIC_NAME (psym->st_name))
16323                     print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16324                   else
16325                     printf (_("<corrupt: %14ld>"), psym->st_name);
16326                 }
16327               else
16328                 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
16329                         (unsigned long) i);
16330
16331               printf ("\n");
16332               if (ent == (bfd_vma) -1)
16333                 break;
16334             }
16335           printf ("\n");
16336         }
16337
16338     got_print_fail:
16339       if (data)
16340         free (data);
16341     }
16342
16343   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
16344     {
16345       bfd_vma ent, end;
16346       size_t offset, rel_offset;
16347       unsigned long count, i;
16348       unsigned char * data;
16349       int addr_size, sym_width;
16350       Elf_Internal_Rela * rels;
16351
16352       rel_offset = offset_from_vma (filedata, jmprel, pltrelsz);
16353       if (pltrel == DT_RELA)
16354         {
16355           if (!slurp_rela_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16356             return FALSE;
16357         }
16358       else
16359         {
16360           if (!slurp_rel_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16361             return FALSE;
16362         }
16363
16364       ent = mips_pltgot;
16365       addr_size = (is_32bit_elf ? 4 : 8);
16366       end = mips_pltgot + (2 + count) * addr_size;
16367
16368       offset = offset_from_vma (filedata, mips_pltgot, end - mips_pltgot);
16369       data = (unsigned char *) get_data (NULL, filedata, offset, end - mips_pltgot,
16370                                          1, _("Procedure Linkage Table data"));
16371       if (data == NULL)
16372         return FALSE;
16373
16374       printf ("\nPLT GOT:\n\n");
16375       printf (_(" Reserved entries:\n"));
16376       printf (_("  %*s %*s Purpose\n"),
16377               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
16378       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16379       printf (_(" PLT lazy resolver\n"));
16380       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16381       printf (_(" Module pointer\n"));
16382       printf ("\n");
16383
16384       printf (_(" Entries:\n"));
16385       printf ("  %*s %*s %*s %-7s %3s %s\n",
16386               addr_size * 2, _("Address"),
16387               addr_size * 2, _("Initial"),
16388               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
16389       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
16390       for (i = 0; i < count; i++)
16391         {
16392           unsigned long idx = get_reloc_symindex (rels[i].r_info);
16393
16394           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16395           printf (" ");
16396
16397           if (idx >= num_dynamic_syms)
16398             printf (_("<corrupt symbol index: %lu>"), idx);
16399           else
16400             {
16401               Elf_Internal_Sym * psym = dynamic_symbols + idx;
16402
16403               print_vma (psym->st_value, LONG_HEX);
16404               printf (" %-7s %3s ",
16405                       get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16406                       get_symbol_index_type (filedata, psym->st_shndx));
16407               if (VALID_DYNAMIC_NAME (psym->st_name))
16408                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16409               else
16410                 printf (_("<corrupt: %14ld>"), psym->st_name);
16411             }
16412           printf ("\n");
16413         }
16414       printf ("\n");
16415
16416       if (data)
16417         free (data);
16418       free (rels);
16419     }
16420
16421   return res;
16422 }
16423
16424 static bfd_boolean
16425 process_nds32_specific (Filedata * filedata)
16426 {
16427   Elf_Internal_Shdr *sect = NULL;
16428
16429   sect = find_section (filedata, ".nds32_e_flags");
16430   if (sect != NULL)
16431     {
16432       unsigned int *flag;
16433
16434       printf ("\nNDS32 elf flags section:\n");
16435       flag = get_data (NULL, filedata, sect->sh_offset, 1,
16436                        sect->sh_size, _("NDS32 elf flags section"));
16437
16438       if (! flag)
16439         return FALSE;
16440
16441       switch ((*flag) & 0x3)
16442         {
16443         case 0:
16444           printf ("(VEC_SIZE):\tNo entry.\n");
16445           break;
16446         case 1:
16447           printf ("(VEC_SIZE):\t4 bytes\n");
16448           break;
16449         case 2:
16450           printf ("(VEC_SIZE):\t16 bytes\n");
16451           break;
16452         case 3:
16453           printf ("(VEC_SIZE):\treserved\n");
16454           break;
16455         }
16456     }
16457
16458   return TRUE;
16459 }
16460
16461 static bfd_boolean
16462 process_gnu_liblist (Filedata * filedata)
16463 {
16464   Elf_Internal_Shdr * section;
16465   Elf_Internal_Shdr * string_sec;
16466   Elf32_External_Lib * elib;
16467   char * strtab;
16468   size_t strtab_size;
16469   size_t cnt;
16470   unsigned long num_liblist;
16471   unsigned i;
16472   bfd_boolean res = TRUE;
16473
16474   if (! do_arch)
16475     return TRUE;
16476
16477   for (i = 0, section = filedata->section_headers;
16478        i < filedata->file_header.e_shnum;
16479        i++, section++)
16480     {
16481       switch (section->sh_type)
16482         {
16483         case SHT_GNU_LIBLIST:
16484           if (section->sh_link >= filedata->file_header.e_shnum)
16485             break;
16486
16487           elib = (Elf32_External_Lib *)
16488               get_data (NULL, filedata, section->sh_offset, 1, section->sh_size,
16489                         _("liblist section data"));
16490
16491           if (elib == NULL)
16492             {
16493               res = FALSE;
16494               break;
16495             }
16496
16497           string_sec = filedata->section_headers + section->sh_link;
16498           strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
16499                                       string_sec->sh_size,
16500                                       _("liblist string table"));
16501           if (strtab == NULL
16502               || section->sh_entsize != sizeof (Elf32_External_Lib))
16503             {
16504               free (elib);
16505               free (strtab);
16506               res = FALSE;
16507               break;
16508             }
16509           strtab_size = string_sec->sh_size;
16510
16511           num_liblist = section->sh_size / sizeof (Elf32_External_Lib);
16512           printf (ngettext ("\nLibrary list section '%s' contains %lu entries:\n",
16513                             "\nLibrary list section '%s' contains %lu entries:\n",
16514                             num_liblist),
16515                   printable_section_name (filedata, section),
16516                   num_liblist);
16517
16518           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
16519
16520           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
16521                ++cnt)
16522             {
16523               Elf32_Lib liblist;
16524               time_t atime;
16525               char timebuf[128];
16526               struct tm * tmp;
16527
16528               liblist.l_name = BYTE_GET (elib[cnt].l_name);
16529               atime = BYTE_GET (elib[cnt].l_time_stamp);
16530               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16531               liblist.l_version = BYTE_GET (elib[cnt].l_version);
16532               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16533
16534               tmp = gmtime (&atime);
16535               snprintf (timebuf, sizeof (timebuf),
16536                         "%04u-%02u-%02uT%02u:%02u:%02u",
16537                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16538                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16539
16540               printf ("%3lu: ", (unsigned long) cnt);
16541               if (do_wide)
16542                 printf ("%-20s", liblist.l_name < strtab_size
16543                         ? strtab + liblist.l_name : _("<corrupt>"));
16544               else
16545                 printf ("%-20.20s", liblist.l_name < strtab_size
16546                         ? strtab + liblist.l_name : _("<corrupt>"));
16547               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
16548                       liblist.l_version, liblist.l_flags);
16549             }
16550
16551           free (elib);
16552           free (strtab);
16553         }
16554     }
16555
16556   return res;
16557 }
16558
16559 static const char *
16560 get_note_type (Filedata * filedata, unsigned e_type)
16561 {
16562   static char buff[64];
16563
16564   if (filedata->file_header.e_type == ET_CORE)
16565     switch (e_type)
16566       {
16567       case NT_AUXV:
16568         return _("NT_AUXV (auxiliary vector)");
16569       case NT_PRSTATUS:
16570         return _("NT_PRSTATUS (prstatus structure)");
16571       case NT_FPREGSET:
16572         return _("NT_FPREGSET (floating point registers)");
16573       case NT_PRPSINFO:
16574         return _("NT_PRPSINFO (prpsinfo structure)");
16575       case NT_TASKSTRUCT:
16576         return _("NT_TASKSTRUCT (task structure)");
16577       case NT_PRXFPREG:
16578         return _("NT_PRXFPREG (user_xfpregs structure)");
16579       case NT_PPC_VMX:
16580         return _("NT_PPC_VMX (ppc Altivec registers)");
16581       case NT_PPC_VSX:
16582         return _("NT_PPC_VSX (ppc VSX registers)");
16583       case NT_PPC_TAR:
16584         return _("NT_PPC_TAR (ppc TAR register)");
16585       case NT_PPC_PPR:
16586         return _("NT_PPC_PPR (ppc PPR register)");
16587       case NT_PPC_DSCR:
16588         return _("NT_PPC_DSCR (ppc DSCR register)");
16589       case NT_PPC_EBB:
16590         return _("NT_PPC_EBB (ppc EBB registers)");
16591       case NT_PPC_PMU:
16592         return _("NT_PPC_PMU (ppc PMU registers)");
16593       case NT_PPC_TM_CGPR:
16594         return _("NT_PPC_TM_CGPR (ppc checkpointed GPR registers)");
16595       case NT_PPC_TM_CFPR:
16596         return _("NT_PPC_TM_CFPR (ppc checkpointed floating point registers)");
16597       case NT_PPC_TM_CVMX:
16598         return _("NT_PPC_TM_CVMX (ppc checkpointed Altivec registers)");
16599       case NT_PPC_TM_CVSX:
16600         return _("NT_PPC_TM_VSX (ppc checkpointed VSX registers)");
16601       case NT_PPC_TM_SPR:
16602         return _("NT_PPC_TM_SPR (ppc TM special purpose registers)");
16603       case NT_PPC_TM_CTAR:
16604         return _("NT_PPC_TM_CTAR (ppc checkpointed TAR register)");
16605       case NT_PPC_TM_CPPR:
16606         return _("NT_PPC_TM_CPPR (ppc checkpointed PPR register)");
16607       case NT_PPC_TM_CDSCR:
16608         return _("NT_PPC_TM_CDSCR (ppc checkpointed DSCR register)");
16609       case NT_386_TLS:
16610         return _("NT_386_TLS (x86 TLS information)");
16611       case NT_386_IOPERM:
16612         return _("NT_386_IOPERM (x86 I/O permissions)");
16613       case NT_X86_XSTATE:
16614         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
16615       case NT_S390_HIGH_GPRS:
16616         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
16617       case NT_S390_TIMER:
16618         return _("NT_S390_TIMER (s390 timer register)");
16619       case NT_S390_TODCMP:
16620         return _("NT_S390_TODCMP (s390 TOD comparator register)");
16621       case NT_S390_TODPREG:
16622         return _("NT_S390_TODPREG (s390 TOD programmable register)");
16623       case NT_S390_CTRS:
16624         return _("NT_S390_CTRS (s390 control registers)");
16625       case NT_S390_PREFIX:
16626         return _("NT_S390_PREFIX (s390 prefix register)");
16627       case NT_S390_LAST_BREAK:
16628         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
16629       case NT_S390_SYSTEM_CALL:
16630         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
16631       case NT_S390_TDB:
16632         return _("NT_S390_TDB (s390 transaction diagnostic block)");
16633       case NT_S390_VXRS_LOW:
16634         return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
16635       case NT_S390_VXRS_HIGH:
16636         return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
16637       case NT_S390_GS_CB:
16638         return _("NT_S390_GS_CB (s390 guarded-storage registers)");
16639       case NT_S390_GS_BC:
16640         return _("NT_S390_GS_BC (s390 guarded-storage broadcast control)");
16641       case NT_ARM_VFP:
16642         return _("NT_ARM_VFP (arm VFP registers)");
16643       case NT_ARM_TLS:
16644         return _("NT_ARM_TLS (AArch TLS registers)");
16645       case NT_ARM_HW_BREAK:
16646         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
16647       case NT_ARM_HW_WATCH:
16648         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
16649       case NT_PSTATUS:
16650         return _("NT_PSTATUS (pstatus structure)");
16651       case NT_FPREGS:
16652         return _("NT_FPREGS (floating point registers)");
16653       case NT_PSINFO:
16654         return _("NT_PSINFO (psinfo structure)");
16655       case NT_LWPSTATUS:
16656         return _("NT_LWPSTATUS (lwpstatus_t structure)");
16657       case NT_LWPSINFO:
16658         return _("NT_LWPSINFO (lwpsinfo_t structure)");
16659       case NT_WIN32PSTATUS:
16660         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
16661       case NT_SIGINFO:
16662         return _("NT_SIGINFO (siginfo_t data)");
16663       case NT_FILE:
16664         return _("NT_FILE (mapped files)");
16665       default:
16666         break;
16667       }
16668   else
16669     switch (e_type)
16670       {
16671       case NT_VERSION:
16672         return _("NT_VERSION (version)");
16673       case NT_ARCH:
16674         return _("NT_ARCH (architecture)");
16675       case NT_GNU_BUILD_ATTRIBUTE_OPEN:
16676         return _("OPEN");
16677       case NT_GNU_BUILD_ATTRIBUTE_FUNC:
16678         return _("func");
16679       default:
16680         break;
16681       }
16682
16683   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16684   return buff;
16685 }
16686
16687 static bfd_boolean
16688 print_core_note (Elf_Internal_Note *pnote)
16689 {
16690   unsigned int addr_size = is_32bit_elf ? 4 : 8;
16691   bfd_vma count, page_size;
16692   unsigned char *descdata, *filenames, *descend;
16693
16694   if (pnote->type != NT_FILE)
16695     {
16696       if (do_wide)
16697         printf ("\n");
16698       return TRUE;
16699     }
16700
16701 #ifndef BFD64
16702   if (!is_32bit_elf)
16703     {
16704       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
16705       /* Still "successful".  */
16706       return TRUE;
16707     }
16708 #endif
16709
16710   if (pnote->descsz < 2 * addr_size)
16711     {
16712       error (_("    Malformed note - too short for header\n"));
16713       return FALSE;
16714     }
16715
16716   descdata = (unsigned char *) pnote->descdata;
16717   descend = descdata + pnote->descsz;
16718
16719   if (descdata[pnote->descsz - 1] != '\0')
16720     {
16721       error (_("    Malformed note - does not end with \\0\n"));
16722       return FALSE;
16723     }
16724
16725   count = byte_get (descdata, addr_size);
16726   descdata += addr_size;
16727
16728   page_size = byte_get (descdata, addr_size);
16729   descdata += addr_size;
16730
16731   if (count > ((bfd_vma) -1 - 2 * addr_size) / (3 * addr_size)
16732       || pnote->descsz < 2 * addr_size + count * 3 * addr_size)
16733     {
16734       error (_("    Malformed note - too short for supplied file count\n"));
16735       return FALSE;
16736     }
16737
16738   printf (_("    Page size: "));
16739   print_vma (page_size, DEC);
16740   printf ("\n");
16741
16742   printf (_("    %*s%*s%*s\n"),
16743           (int) (2 + 2 * addr_size), _("Start"),
16744           (int) (4 + 2 * addr_size), _("End"),
16745           (int) (4 + 2 * addr_size), _("Page Offset"));
16746   filenames = descdata + count * 3 * addr_size;
16747   while (count-- > 0)
16748     {
16749       bfd_vma start, end, file_ofs;
16750
16751       if (filenames == descend)
16752         {
16753           error (_("    Malformed note - filenames end too early\n"));
16754           return FALSE;
16755         }
16756
16757       start = byte_get (descdata, addr_size);
16758       descdata += addr_size;
16759       end = byte_get (descdata, addr_size);
16760       descdata += addr_size;
16761       file_ofs = byte_get (descdata, addr_size);
16762       descdata += addr_size;
16763
16764       printf ("    ");
16765       print_vma (start, FULL_HEX);
16766       printf ("  ");
16767       print_vma (end, FULL_HEX);
16768       printf ("  ");
16769       print_vma (file_ofs, FULL_HEX);
16770       printf ("\n        %s\n", filenames);
16771
16772       filenames += 1 + strlen ((char *) filenames);
16773     }
16774
16775   return TRUE;
16776 }
16777
16778 static const char *
16779 get_gnu_elf_note_type (unsigned e_type)
16780 {
16781   /* NB/ Keep this switch statement in sync with print_gnu_note ().  */
16782   switch (e_type)
16783     {
16784     case NT_GNU_ABI_TAG:
16785       return _("NT_GNU_ABI_TAG (ABI version tag)");
16786     case NT_GNU_HWCAP:
16787       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
16788     case NT_GNU_BUILD_ID:
16789       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
16790     case NT_GNU_GOLD_VERSION:
16791       return _("NT_GNU_GOLD_VERSION (gold version)");
16792     case NT_GNU_PROPERTY_TYPE_0:
16793       return _("NT_GNU_PROPERTY_TYPE_0");
16794     case NT_GNU_BUILD_ATTRIBUTE_OPEN:
16795       return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
16796     case NT_GNU_BUILD_ATTRIBUTE_FUNC:
16797       return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
16798     default:
16799       {
16800         static char buff[64];
16801
16802         snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16803         return buff;
16804       }
16805     }
16806 }
16807
16808 static void
16809 decode_x86_isa (unsigned int bitmask)
16810 {
16811   while (bitmask)
16812     {
16813       unsigned int bit = bitmask & (- bitmask);
16814
16815       bitmask &= ~ bit;
16816       switch (bit)
16817         {
16818         case GNU_PROPERTY_X86_ISA_1_486: printf ("i486"); break;
16819         case GNU_PROPERTY_X86_ISA_1_586: printf ("586"); break;
16820         case GNU_PROPERTY_X86_ISA_1_686: printf ("686"); break;
16821         case GNU_PROPERTY_X86_ISA_1_SSE: printf ("SSE"); break;
16822         case GNU_PROPERTY_X86_ISA_1_SSE2: printf ("SSE2"); break;
16823         case GNU_PROPERTY_X86_ISA_1_SSE3: printf ("SSE3"); break;
16824         case GNU_PROPERTY_X86_ISA_1_SSSE3: printf ("SSSE3"); break;
16825         case GNU_PROPERTY_X86_ISA_1_SSE4_1: printf ("SSE4_1"); break;
16826         case GNU_PROPERTY_X86_ISA_1_SSE4_2: printf ("SSE4_2"); break;
16827         case GNU_PROPERTY_X86_ISA_1_AVX: printf ("AVX"); break;
16828         case GNU_PROPERTY_X86_ISA_1_AVX2: printf ("AVX2"); break;
16829         case GNU_PROPERTY_X86_ISA_1_AVX512F: printf ("AVX512F"); break;
16830         case GNU_PROPERTY_X86_ISA_1_AVX512CD: printf ("AVX512CD"); break;
16831         case GNU_PROPERTY_X86_ISA_1_AVX512ER: printf ("AVX512ER"); break;
16832         case GNU_PROPERTY_X86_ISA_1_AVX512PF: printf ("AVX512PF"); break;
16833         case GNU_PROPERTY_X86_ISA_1_AVX512VL: printf ("AVX512VL"); break;
16834         case GNU_PROPERTY_X86_ISA_1_AVX512DQ: printf ("AVX512DQ"); break;
16835         case GNU_PROPERTY_X86_ISA_1_AVX512BW: printf ("AVX512BW"); break;
16836         default: printf (_("<unknown: %x>"), bit); break;
16837         }
16838       if (bitmask)
16839         printf (", ");
16840     }
16841 }
16842
16843 static void
16844 decode_x86_feature (unsigned int type, unsigned int bitmask)
16845 {
16846   while (bitmask)
16847     {
16848       unsigned int bit = bitmask & (- bitmask);
16849
16850       bitmask &= ~ bit;
16851       switch (bit)
16852         {
16853         case GNU_PROPERTY_X86_FEATURE_1_IBT:
16854           switch (type)
16855             {
16856             case GNU_PROPERTY_X86_FEATURE_1_AND:
16857               printf ("IBT");
16858               break;
16859             default:
16860               /* This should never happen.  */
16861               abort ();
16862             }
16863           break;
16864         case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
16865           switch (type)
16866             {
16867             case GNU_PROPERTY_X86_FEATURE_1_AND:
16868               printf ("SHSTK");
16869               break;
16870             default:
16871               /* This should never happen.  */
16872               abort ();
16873             }
16874           break;
16875         default:
16876           printf (_("<unknown: %x>"), bit);
16877           break;
16878         }
16879       if (bitmask)
16880         printf (", ");
16881     }
16882 }
16883
16884 static void
16885 print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
16886 {
16887   unsigned char * ptr = (unsigned char *) pnote->descdata;
16888   unsigned char * ptr_end = ptr + pnote->descsz;
16889   unsigned int    size = is_32bit_elf ? 4 : 8;
16890
16891   printf (_("      Properties: "));
16892
16893   if (pnote->descsz < 8 || (pnote->descsz % size) != 0)
16894     {
16895       printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz);
16896       return;
16897     }
16898
16899   while (ptr < ptr_end)
16900     {
16901       unsigned int j;
16902       unsigned int type;
16903       unsigned int datasz;
16904
16905       if ((size_t) (ptr_end - ptr) < 8)
16906         {
16907           printf (_("<corrupt descsz: %#lx>\n"), pnote->descsz);
16908           break;
16909         }
16910
16911       type = byte_get (ptr, 4);
16912       datasz = byte_get (ptr + 4, 4);
16913
16914       ptr += 8;
16915
16916       if (datasz > (size_t) (ptr_end - ptr))
16917         {
16918           printf (_("<corrupt type (%#x) datasz: %#x>\n"),
16919                   type, datasz);
16920           break;
16921         }
16922
16923       if (type >= GNU_PROPERTY_LOPROC && type <= GNU_PROPERTY_HIPROC)
16924         {
16925           if (filedata->file_header.e_machine == EM_X86_64
16926               || filedata->file_header.e_machine == EM_IAMCU
16927               || filedata->file_header.e_machine == EM_386)
16928             {
16929               switch (type)
16930                 {
16931                 case GNU_PROPERTY_X86_ISA_1_USED:
16932                   printf ("x86 ISA used: ");
16933                   if (datasz != 4)
16934                     printf (_("<corrupt length: %#x> "), datasz);
16935                   else
16936                     decode_x86_isa (byte_get (ptr, 4));
16937                   goto next;
16938
16939                 case GNU_PROPERTY_X86_ISA_1_NEEDED:
16940                   printf ("x86 ISA needed: ");
16941                   if (datasz != 4)
16942                     printf (_("<corrupt length: %#x> "), datasz);
16943                   else
16944                     decode_x86_isa (byte_get (ptr, 4));
16945                   goto next;
16946
16947                 case GNU_PROPERTY_X86_FEATURE_1_AND:
16948                   printf ("x86 feature: ");
16949                   if (datasz != 4)
16950                     printf (_("<corrupt length: %#x> "), datasz);
16951                   else
16952                     decode_x86_feature (type, byte_get (ptr, 4));
16953                   goto next;
16954
16955                 default:
16956                   break;
16957                 }
16958             }
16959         }
16960       else
16961         {
16962           switch (type)
16963             {
16964             case GNU_PROPERTY_STACK_SIZE:
16965               printf (_("stack size: "));
16966               if (datasz != size)
16967                 printf (_("<corrupt length: %#x> "), datasz);
16968               else
16969                 printf ("%#lx", (unsigned long) byte_get (ptr, size));
16970               goto next;
16971
16972             case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
16973               printf ("no copy on protected ");
16974               if (datasz)
16975                 printf (_("<corrupt length: %#x> "), datasz);
16976               goto next;
16977
16978             default:
16979               break;
16980             }
16981         }
16982
16983       if (type < GNU_PROPERTY_LOPROC)
16984         printf (_("<unknown type %#x data: "), type);
16985       else if (type < GNU_PROPERTY_LOUSER)
16986         printf (_("<procesor-specific type %#x data: "), type);
16987       else
16988         printf (_("<application-specific type %#x data: "), type);
16989       for (j = 0; j < datasz; ++j)
16990         printf ("%02x ", ptr[j] & 0xff);
16991       printf (">");
16992
16993 next:
16994       ptr += ((datasz + (size - 1)) & ~ (size - 1));
16995       if (ptr == ptr_end)
16996         break;
16997
16998       if (do_wide)
16999         printf (", ");
17000       else
17001         printf ("\n\t");
17002     }
17003
17004   printf ("\n");
17005 }
17006
17007 static bfd_boolean
17008 print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
17009 {
17010   /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type ().  */
17011   switch (pnote->type)
17012     {
17013     case NT_GNU_BUILD_ID:
17014       {
17015         unsigned long i;
17016
17017         printf (_("    Build ID: "));
17018         for (i = 0; i < pnote->descsz; ++i)
17019           printf ("%02x", pnote->descdata[i] & 0xff);
17020         printf ("\n");
17021       }
17022       break;
17023
17024     case NT_GNU_ABI_TAG:
17025       {
17026         unsigned long os, major, minor, subminor;
17027         const char *osname;
17028
17029         /* PR 17531: file: 030-599401-0.004.  */
17030         if (pnote->descsz < 16)
17031           {
17032             printf (_("    <corrupt GNU_ABI_TAG>\n"));
17033             break;
17034           }
17035
17036         os = byte_get ((unsigned char *) pnote->descdata, 4);
17037         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17038         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
17039         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
17040
17041         switch (os)
17042           {
17043           case GNU_ABI_TAG_LINUX:
17044             osname = "Linux";
17045             break;
17046           case GNU_ABI_TAG_HURD:
17047             osname = "Hurd";
17048             break;
17049           case GNU_ABI_TAG_SOLARIS:
17050             osname = "Solaris";
17051             break;
17052           case GNU_ABI_TAG_FREEBSD:
17053             osname = "FreeBSD";
17054             break;
17055           case GNU_ABI_TAG_NETBSD:
17056             osname = "NetBSD";
17057             break;
17058           case GNU_ABI_TAG_SYLLABLE:
17059             osname = "Syllable";
17060             break;
17061           case GNU_ABI_TAG_NACL:
17062             osname = "NaCl";
17063             break;
17064           default:
17065             osname = "Unknown";
17066             break;
17067           }
17068
17069         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
17070                 major, minor, subminor);
17071       }
17072       break;
17073
17074     case NT_GNU_GOLD_VERSION:
17075       {
17076         unsigned long i;
17077
17078         printf (_("    Version: "));
17079         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
17080           printf ("%c", pnote->descdata[i]);
17081         printf ("\n");
17082       }
17083       break;
17084
17085     case NT_GNU_HWCAP:
17086       {
17087         unsigned long num_entries, mask;
17088
17089         /* Hardware capabilities information.  Word 0 is the number of entries.
17090            Word 1 is a bitmask of enabled entries.  The rest of the descriptor
17091            is a series of entries, where each entry is a single byte followed
17092            by a nul terminated string.  The byte gives the bit number to test
17093            if enabled in the bitmask.  */
17094         printf (_("      Hardware Capabilities: "));
17095         if (pnote->descsz < 8)
17096           {
17097             error (_("<corrupt GNU_HWCAP>\n"));
17098             return FALSE;
17099           }
17100         num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
17101         mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17102         printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
17103         /* FIXME: Add code to display the entries... */
17104       }
17105       break;
17106
17107     case NT_GNU_PROPERTY_TYPE_0:
17108       print_gnu_property_note (filedata, pnote);
17109       break;
17110       
17111     default:
17112       /* Handle unrecognised types.  An error message should have already been
17113          created by get_gnu_elf_note_type(), so all that we need to do is to
17114          display the data.  */
17115       {
17116         unsigned long i;
17117
17118         printf (_("    Description data: "));
17119         for (i = 0; i < pnote->descsz; ++i)
17120           printf ("%02x ", pnote->descdata[i] & 0xff);
17121         printf ("\n");
17122       }
17123       break;
17124     }
17125
17126   return TRUE;
17127 }
17128
17129 static const char *
17130 get_v850_elf_note_type (enum v850_notes n_type)
17131 {
17132   static char buff[64];
17133
17134   switch (n_type)
17135     {
17136     case V850_NOTE_ALIGNMENT:  return _("Alignment of 8-byte objects");
17137     case V850_NOTE_DATA_SIZE:  return _("Sizeof double and long double");
17138     case V850_NOTE_FPU_INFO:   return _("Type of FPU support needed");
17139     case V850_NOTE_SIMD_INFO:  return _("Use of SIMD instructions");
17140     case V850_NOTE_CACHE_INFO: return _("Use of cache");
17141     case V850_NOTE_MMU_INFO:   return _("Use of MMU");
17142     default:
17143       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
17144       return buff;
17145     }
17146 }
17147
17148 static bfd_boolean
17149 print_v850_note (Elf_Internal_Note * pnote)
17150 {
17151   unsigned int val;
17152
17153   if (pnote->descsz != 4)
17154     return FALSE;
17155
17156   val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
17157
17158   if (val == 0)
17159     {
17160       printf (_("not set\n"));
17161       return TRUE;
17162     }
17163
17164   switch (pnote->type)
17165     {
17166     case V850_NOTE_ALIGNMENT:
17167       switch (val)
17168         {
17169         case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return TRUE;
17170         case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return TRUE;
17171         }
17172       break;
17173
17174     case V850_NOTE_DATA_SIZE:
17175       switch (val)
17176         {
17177         case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return TRUE;
17178         case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return TRUE;
17179         }
17180       break;
17181
17182     case V850_NOTE_FPU_INFO:
17183       switch (val)
17184         {
17185         case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return TRUE;
17186         case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return TRUE;
17187         }
17188       break;
17189
17190     case V850_NOTE_MMU_INFO:
17191     case V850_NOTE_CACHE_INFO:
17192     case V850_NOTE_SIMD_INFO:
17193       if (val == EF_RH850_SIMD)
17194         {
17195           printf (_("yes\n"));
17196           return TRUE;
17197         }
17198       break;
17199
17200     default:
17201       /* An 'unknown note type' message will already have been displayed.  */
17202       break;
17203     }
17204
17205   printf (_("unknown value: %x\n"), val);
17206   return FALSE;
17207 }
17208
17209 static bfd_boolean
17210 process_netbsd_elf_note (Elf_Internal_Note * pnote)
17211 {
17212   unsigned int version;
17213
17214   switch (pnote->type)
17215     {
17216     case NT_NETBSD_IDENT:
17217       version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
17218       if ((version / 10000) % 100)
17219         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
17220                 version, version / 100000000, (version / 1000000) % 100,
17221                 (version / 10000) % 100 > 26 ? "Z" : "",
17222                 'A' + (version / 10000) % 26);
17223       else
17224         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
17225                 version, version / 100000000, (version / 1000000) % 100,
17226                 (version / 100) % 100);
17227       return TRUE;
17228
17229     case NT_NETBSD_MARCH:
17230       printf ("  NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
17231               pnote->descdata);
17232       return TRUE;
17233
17234     default:
17235       printf ("  NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
17236               pnote->type);
17237       return FALSE;
17238     }
17239 }
17240
17241 static const char *
17242 get_freebsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17243 {
17244   switch (e_type)
17245     {
17246     case NT_FREEBSD_THRMISC:
17247       return _("NT_THRMISC (thrmisc structure)");
17248     case NT_FREEBSD_PROCSTAT_PROC:
17249       return _("NT_PROCSTAT_PROC (proc data)");
17250     case NT_FREEBSD_PROCSTAT_FILES:
17251       return _("NT_PROCSTAT_FILES (files data)");
17252     case NT_FREEBSD_PROCSTAT_VMMAP:
17253       return _("NT_PROCSTAT_VMMAP (vmmap data)");
17254     case NT_FREEBSD_PROCSTAT_GROUPS:
17255       return _("NT_PROCSTAT_GROUPS (groups data)");
17256     case NT_FREEBSD_PROCSTAT_UMASK:
17257       return _("NT_PROCSTAT_UMASK (umask data)");
17258     case NT_FREEBSD_PROCSTAT_RLIMIT:
17259       return _("NT_PROCSTAT_RLIMIT (rlimit data)");
17260     case NT_FREEBSD_PROCSTAT_OSREL:
17261       return _("NT_PROCSTAT_OSREL (osreldate data)");
17262     case NT_FREEBSD_PROCSTAT_PSSTRINGS:
17263       return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
17264     case NT_FREEBSD_PROCSTAT_AUXV:
17265       return _("NT_PROCSTAT_AUXV (auxv data)");
17266     case NT_FREEBSD_PTLWPINFO:
17267       return _("NT_PTLWPINFO (ptrace_lwpinfo structure)");
17268     }
17269   return get_note_type (filedata, e_type);
17270 }
17271
17272 static const char *
17273 get_netbsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17274 {
17275   static char buff[64];
17276
17277   if (e_type == NT_NETBSDCORE_PROCINFO)
17278     return _("NetBSD procinfo structure");
17279
17280   /* As of Jan 2002 there are no other machine-independent notes
17281      defined for NetBSD core files.  If the note type is less
17282      than the start of the machine-dependent note types, we don't
17283      understand it.  */
17284
17285   if (e_type < NT_NETBSDCORE_FIRSTMACH)
17286     {
17287       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17288       return buff;
17289     }
17290
17291   switch (filedata->file_header.e_machine)
17292     {
17293     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
17294        and PT_GETFPREGS == mach+2.  */
17295
17296     case EM_OLD_ALPHA:
17297     case EM_ALPHA:
17298     case EM_SPARC:
17299     case EM_SPARC32PLUS:
17300     case EM_SPARCV9:
17301       switch (e_type)
17302         {
17303         case NT_NETBSDCORE_FIRSTMACH + 0:
17304           return _("PT_GETREGS (reg structure)");
17305         case NT_NETBSDCORE_FIRSTMACH + 2:
17306           return _("PT_GETFPREGS (fpreg structure)");
17307         default:
17308           break;
17309         }
17310       break;
17311
17312     /* On all other arch's, PT_GETREGS == mach+1 and
17313        PT_GETFPREGS == mach+3.  */
17314     default:
17315       switch (e_type)
17316         {
17317         case NT_NETBSDCORE_FIRSTMACH + 1:
17318           return _("PT_GETREGS (reg structure)");
17319         case NT_NETBSDCORE_FIRSTMACH + 3:
17320           return _("PT_GETFPREGS (fpreg structure)");
17321         default:
17322           break;
17323         }
17324     }
17325
17326   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
17327             e_type - NT_NETBSDCORE_FIRSTMACH);
17328   return buff;
17329 }
17330
17331 static const char *
17332 get_stapsdt_note_type (unsigned e_type)
17333 {
17334   static char buff[64];
17335
17336   switch (e_type)
17337     {
17338     case NT_STAPSDT:
17339       return _("NT_STAPSDT (SystemTap probe descriptors)");
17340
17341     default:
17342       break;
17343     }
17344
17345   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17346   return buff;
17347 }
17348
17349 static bfd_boolean
17350 print_stapsdt_note (Elf_Internal_Note *pnote)
17351 {
17352   int addr_size = is_32bit_elf ? 4 : 8;
17353   char *data = pnote->descdata;
17354   char *data_end = pnote->descdata + pnote->descsz;
17355   bfd_vma pc, base_addr, semaphore;
17356   char *provider, *probe, *arg_fmt;
17357
17358   pc = byte_get ((unsigned char *) data, addr_size);
17359   data += addr_size;
17360   base_addr = byte_get ((unsigned char *) data, addr_size);
17361   data += addr_size;
17362   semaphore = byte_get ((unsigned char *) data, addr_size);
17363   data += addr_size;
17364
17365   provider = data;
17366   data += strlen (data) + 1;
17367   probe = data;
17368   data += strlen (data) + 1;
17369   arg_fmt = data;
17370   data += strlen (data) + 1;
17371
17372   printf (_("    Provider: %s\n"), provider);
17373   printf (_("    Name: %s\n"), probe);
17374   printf (_("    Location: "));
17375   print_vma (pc, FULL_HEX);
17376   printf (_(", Base: "));
17377   print_vma (base_addr, FULL_HEX);
17378   printf (_(", Semaphore: "));
17379   print_vma (semaphore, FULL_HEX);
17380   printf ("\n");
17381   printf (_("    Arguments: %s\n"), arg_fmt);
17382
17383   return data == data_end;
17384 }
17385
17386 static const char *
17387 get_ia64_vms_note_type (unsigned e_type)
17388 {
17389   static char buff[64];
17390
17391   switch (e_type)
17392     {
17393     case NT_VMS_MHD:
17394       return _("NT_VMS_MHD (module header)");
17395     case NT_VMS_LNM:
17396       return _("NT_VMS_LNM (language name)");
17397     case NT_VMS_SRC:
17398       return _("NT_VMS_SRC (source files)");
17399     case NT_VMS_TITLE:
17400       return "NT_VMS_TITLE";
17401     case NT_VMS_EIDC:
17402       return _("NT_VMS_EIDC (consistency check)");
17403     case NT_VMS_FPMODE:
17404       return _("NT_VMS_FPMODE (FP mode)");
17405     case NT_VMS_LINKTIME:
17406       return "NT_VMS_LINKTIME";
17407     case NT_VMS_IMGNAM:
17408       return _("NT_VMS_IMGNAM (image name)");
17409     case NT_VMS_IMGID:
17410       return _("NT_VMS_IMGID (image id)");
17411     case NT_VMS_LINKID:
17412       return _("NT_VMS_LINKID (link id)");
17413     case NT_VMS_IMGBID:
17414       return _("NT_VMS_IMGBID (build id)");
17415     case NT_VMS_GSTNAM:
17416       return _("NT_VMS_GSTNAM (sym table name)");
17417     case NT_VMS_ORIG_DYN:
17418       return "NT_VMS_ORIG_DYN";
17419     case NT_VMS_PATCHTIME:
17420       return "NT_VMS_PATCHTIME";
17421     default:
17422       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17423       return buff;
17424     }
17425 }
17426
17427 static bfd_boolean
17428 print_ia64_vms_note (Elf_Internal_Note * pnote)
17429 {
17430   switch (pnote->type)
17431     {
17432     case NT_VMS_MHD:
17433       if (pnote->descsz > 36)
17434         {
17435           size_t l = strlen (pnote->descdata + 34);
17436           printf (_("    Creation date  : %.17s\n"), pnote->descdata);
17437           printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
17438           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
17439           printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
17440         }
17441       else
17442         printf (_("    Invalid size\n"));
17443       break;
17444     case NT_VMS_LNM:
17445       printf (_("   Language: %s\n"), pnote->descdata);
17446       break;
17447 #ifdef BFD64
17448     case NT_VMS_FPMODE:
17449       printf (_("   Floating Point mode: "));
17450       printf ("0x%016" BFD_VMA_FMT "x\n",
17451               (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
17452       break;
17453     case NT_VMS_LINKTIME:
17454       printf (_("   Link time: "));
17455       print_vms_time
17456         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
17457       printf ("\n");
17458       break;
17459     case NT_VMS_PATCHTIME:
17460       printf (_("   Patch time: "));
17461       print_vms_time
17462         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
17463       printf ("\n");
17464       break;
17465     case NT_VMS_ORIG_DYN:
17466       printf (_("   Major id: %u,  minor id: %u\n"),
17467               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
17468               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
17469       printf (_("   Last modified  : "));
17470       print_vms_time
17471         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
17472       printf (_("\n   Link flags  : "));
17473       printf ("0x%016" BFD_VMA_FMT "x\n",
17474               (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
17475       printf (_("   Header flags: 0x%08x\n"),
17476               (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
17477       printf (_("   Image id    : %s\n"), pnote->descdata + 32);
17478       break;
17479 #endif
17480     case NT_VMS_IMGNAM:
17481       printf (_("    Image name: %s\n"), pnote->descdata);
17482       break;
17483     case NT_VMS_GSTNAM:
17484       printf (_("    Global symbol table name: %s\n"), pnote->descdata);
17485       break;
17486     case NT_VMS_IMGID:
17487       printf (_("    Image id: %s\n"), pnote->descdata);
17488       break;
17489     case NT_VMS_LINKID:
17490       printf (_("    Linker id: %s\n"), pnote->descdata);
17491       break;
17492     default:
17493       return FALSE;
17494     }
17495   return TRUE;
17496 }
17497
17498 /* Find the symbol associated with a build attribute that is attached
17499    to address OFFSET.  If PNAME is non-NULL then store the name of
17500    the symbol (if found) in the provided pointer,  Returns NULL if a
17501    symbol could not be found.  */
17502
17503 static Elf_Internal_Sym *
17504 get_symbol_for_build_attribute (Filedata *       filedata,
17505                                 unsigned long    offset,
17506                                 bfd_boolean      is_open_attr,
17507                                 const char **    pname)
17508 {
17509   static Filedata *         saved_filedata = NULL;
17510   static char *             strtab;
17511   static unsigned long      strtablen;
17512   static Elf_Internal_Sym * symtab;
17513   static unsigned long      nsyms;
17514   Elf_Internal_Sym *        saved_sym = NULL;
17515   Elf_Internal_Sym *        sym;
17516
17517   if (filedata->section_headers != NULL
17518       && (saved_filedata == NULL || filedata != saved_filedata))
17519     {
17520       Elf_Internal_Shdr * symsec;
17521
17522       /* Load the symbol and string sections.  */
17523       for (symsec = filedata->section_headers;
17524            symsec < filedata->section_headers + filedata->file_header.e_shnum;
17525            symsec ++)
17526         {
17527           if (symsec->sh_type == SHT_SYMTAB)
17528             {
17529               symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
17530
17531               if (symsec->sh_link < filedata->file_header.e_shnum)
17532                 {
17533                   Elf_Internal_Shdr * strtab_sec = filedata->section_headers + symsec->sh_link;
17534
17535                   strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
17536                                               1, strtab_sec->sh_size,
17537                                               _("string table"));
17538                   strtablen = strtab != NULL ? strtab_sec->sh_size : 0;
17539                 }
17540             }
17541         }
17542       saved_filedata = filedata;
17543     }
17544
17545   if (symtab == NULL || strtab == NULL)
17546     return NULL;
17547
17548   /* Find a symbol whose value matches offset.  */
17549   for (sym = symtab; sym < symtab + nsyms; sym ++)
17550     if (sym->st_value == offset)
17551       {
17552         if (sym->st_name >= strtablen)
17553           /* Huh ?  This should not happen.  */
17554           continue;
17555
17556         if (strtab[sym->st_name] == 0)
17557           continue;
17558
17559         /* The AArch64 and ARM architectures define mapping symbols
17560            (eg $d, $x, $t) which we want to ignore.  */
17561         if (strtab[sym->st_name] == '$'
17562             && strtab[sym->st_name + 1] != 0
17563             && strtab[sym->st_name + 2] == 0)
17564           continue;
17565
17566         if (is_open_attr)
17567           {
17568             /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
17569                and FILE or OBJECT symbols over NOTYPE symbols.  We skip
17570                FUNC symbols entirely.  */
17571             switch (ELF_ST_TYPE (sym->st_info))
17572               {
17573               case STT_OBJECT:
17574               case STT_FILE:
17575                 saved_sym = sym;
17576                 if (sym->st_size)
17577                   {
17578                     /* If the symbol has a size associated
17579                        with it then we can stop searching.  */
17580                     sym = symtab + nsyms;
17581                   }
17582                 continue;
17583
17584               case STT_FUNC:
17585                 /* Ignore function symbols.  */
17586                 continue;
17587
17588               default:
17589                 break;
17590               }
17591
17592             switch (ELF_ST_BIND (sym->st_info))
17593               {
17594               case STB_GLOBAL:
17595                 if (saved_sym == NULL
17596                     || ELF_ST_TYPE (saved_sym->st_info) != STT_OBJECT)
17597                   saved_sym = sym;
17598                 break;
17599
17600               case STB_LOCAL:
17601                 if (saved_sym == NULL)
17602                   saved_sym = sym;
17603                 break;
17604
17605               default:
17606                 break;
17607               }
17608           }
17609         else
17610           {
17611             if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
17612               continue;
17613
17614             saved_sym = sym;
17615             break;
17616           }
17617       }
17618
17619   if (saved_sym && pname)
17620     * pname = strtab + saved_sym->st_name;
17621
17622   return saved_sym;
17623 }
17624
17625 static bfd_boolean
17626 print_gnu_build_attribute_description (Elf_Internal_Note *  pnote,
17627                                        Filedata *           filedata)
17628 {
17629   static unsigned long  global_offset = 0;
17630   static unsigned long  global_end = 0;
17631   static unsigned long  func_offset = 0;
17632   static unsigned long  func_end = 0;
17633
17634   Elf_Internal_Sym *    sym;
17635   const char *          name;
17636   unsigned long         start;
17637   unsigned long         end;
17638   bfd_boolean           is_open_attr = pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN;
17639
17640   switch (pnote->descsz)
17641     {
17642     case 0:
17643       /* A zero-length description means that the range of
17644          the previous note of the same type should be used.  */
17645       if (is_open_attr)
17646         {
17647           if (global_end > global_offset)
17648             printf (_("    Applies to region from %#lx to %#lx\n"),
17649                     global_offset, global_end);
17650           else
17651             printf (_("    Applies to region from %#lx\n"), global_offset);
17652         }
17653       else
17654         {
17655           if (func_end > func_offset)
17656             printf (_("    Applies to region from %#lx to %#lx\n"), func_offset, func_end);
17657           else
17658             printf (_("    Applies to region from %#lx\n"), func_offset);
17659         }
17660       return TRUE;
17661
17662     case 4:
17663       start = byte_get ((unsigned char *) pnote->descdata, 4);
17664       end = 0;
17665       break;
17666
17667     case 8:
17668       if (is_32bit_elf)
17669         {
17670           /* FIXME: We should check that version 3+ notes are being used here...  */
17671           start = byte_get ((unsigned char *) pnote->descdata, 4);
17672           end = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17673         }
17674       else
17675         {
17676           start = byte_get ((unsigned char *) pnote->descdata, 8);
17677           end = 0;
17678         }
17679       break;
17680
17681     case 16:
17682       start = byte_get ((unsigned char *) pnote->descdata, 8);
17683       end = byte_get ((unsigned char *) pnote->descdata + 8, 8);
17684       break;
17685       
17686     default:
17687       error (_("    <invalid description size: %lx>\n"), pnote->descsz);
17688       printf (_("    <invalid descsz>"));
17689       return FALSE;
17690     }
17691
17692   name = NULL;
17693   sym = get_symbol_for_build_attribute (filedata, start, is_open_attr, & name);
17694   /* As of version 5 of the annobin plugin, filename symbols are biased by 2
17695      in order to avoid them being confused with the start address of the
17696      first function in the file...  */
17697   if (sym == NULL && is_open_attr)
17698     sym = get_symbol_for_build_attribute (filedata, start + 2, is_open_attr,
17699                                           & name);
17700
17701   if (end == 0 && sym != NULL && sym->st_size > 0)
17702     end = start + sym->st_size;
17703
17704   if (is_open_attr)
17705     {
17706       /* FIXME: Need to properly allow for section alignment.  16 is just the alignment used on x86_64.  */
17707       if (global_end > 0 && start > BFD_ALIGN (global_end, 16))
17708         warn (_("Gap in build notes detected from %#lx to %#lx\n"),
17709               global_end + 1, start - 1);
17710
17711       printf (_("    Applies to region from %#lx"), start);
17712       global_offset = start;
17713
17714       if (end)
17715         {
17716           printf (_(" to %#lx"), end);
17717           global_end = end;
17718         }
17719     }
17720   else
17721     {
17722       printf (_("    Applies to region from %#lx"), start);
17723       func_offset = start;
17724
17725       if (end)
17726         {
17727           printf (_(" to %#lx"), end);
17728           func_end = end;
17729         }
17730     }
17731
17732   if (sym && name)
17733     printf (_(" (%s)"), name);
17734
17735   printf ("\n");
17736   return TRUE;
17737 }
17738
17739 static bfd_boolean
17740 print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
17741 {
17742   static const char string_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_STRING, 0 };
17743   static const char number_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC, 0 };
17744   static const char bool_expected [3] = { GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE, GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE, 0 };
17745   char         name_type;
17746   char         name_attribute;
17747   const char * expected_types;
17748   const char * name = pnote->namedata;
17749   const char * text;
17750   signed int   left;
17751
17752   if (name == NULL || pnote->namesz < 2)
17753     {
17754       error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
17755       print_symbol (-20, _("  <corrupt name>"));
17756       return FALSE;
17757     }
17758
17759   if (do_wide)
17760     left = 28;
17761   else
17762     left = 20;
17763
17764   /* Version 2 of the spec adds a "GA" prefix to the name field.  */
17765   if (name[0] == 'G' && name[1] == 'A')
17766     {
17767       if (pnote->namesz < 4)
17768         {
17769           error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
17770           print_symbol (-20, _("  <corrupt name>"));
17771           return FALSE;
17772         }
17773
17774       printf ("GA");
17775       name += 2;
17776       left -= 2;
17777     }
17778
17779   switch ((name_type = * name))
17780     {
17781     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
17782     case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
17783     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
17784     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
17785       printf ("%c", * name);
17786       left --;
17787       break;
17788     default:
17789       error (_("unrecognised attribute type in name field: %d\n"), name_type);
17790       print_symbol (-20, _("<unknown name type>"));
17791       return FALSE;
17792     }
17793
17794   ++ name;
17795   text = NULL;
17796
17797   switch ((name_attribute = * name))
17798     {
17799     case GNU_BUILD_ATTRIBUTE_VERSION:
17800       text = _("<version>");
17801       expected_types = string_expected;
17802       ++ name;
17803       break;
17804     case GNU_BUILD_ATTRIBUTE_STACK_PROT:
17805       text = _("<stack prot>");
17806       expected_types = "!+*";
17807       ++ name;
17808       break;
17809     case GNU_BUILD_ATTRIBUTE_RELRO:
17810       text = _("<relro>");
17811       expected_types = bool_expected;
17812       ++ name;
17813       break;
17814     case GNU_BUILD_ATTRIBUTE_STACK_SIZE:
17815       text = _("<stack size>");
17816       expected_types = number_expected;
17817       ++ name;
17818       break;
17819     case GNU_BUILD_ATTRIBUTE_TOOL:
17820       text = _("<tool>");
17821       expected_types = string_expected;
17822       ++ name;
17823       break;
17824     case GNU_BUILD_ATTRIBUTE_ABI:
17825       text = _("<ABI>");
17826       expected_types = "$*";
17827       ++ name;
17828       break;
17829     case GNU_BUILD_ATTRIBUTE_PIC:
17830       text = _("<PIC>");
17831       expected_types = number_expected;
17832       ++ name;
17833       break;
17834     case GNU_BUILD_ATTRIBUTE_SHORT_ENUM:
17835       text = _("<short enum>");
17836       expected_types = bool_expected;
17837       ++ name;
17838       break;
17839     default:
17840       if (ISPRINT (* name))
17841         {
17842           int len = strnlen (name, pnote->namesz - (name - pnote->namedata)) + 1;
17843
17844           if (len > left && ! do_wide)
17845             len = left;
17846           printf ("%.*s:", len, name);
17847           left -= len;
17848           name += len;
17849         }
17850       else
17851         {
17852           static char tmpbuf [128];
17853
17854           error (_("unrecognised byte in name field: %d\n"), * name);
17855           sprintf (tmpbuf, _("<unknown:_%d>"), * name);
17856           text = tmpbuf;
17857           name ++;
17858         }
17859       expected_types = "*$!+";
17860       break;
17861     }
17862
17863   if (text)
17864     left -= printf ("%s", text);
17865
17866   if (strchr (expected_types, name_type) == NULL)
17867     warn (_("attribute does not have an expected type (%c)\n"), name_type);
17868
17869   if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
17870     {
17871       error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
17872              (unsigned long) pnote->namesz,
17873              (long) (name - pnote->namedata));
17874       return FALSE;
17875     }
17876
17877   if (left < 1 && ! do_wide)
17878     return TRUE;
17879
17880   switch (name_type)
17881     {
17882     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
17883       {
17884         unsigned int        bytes;
17885         unsigned long long  val = 0;
17886         unsigned int        shift = 0;
17887         char *              decoded = NULL;
17888
17889         bytes = pnote->namesz - (name - pnote->namedata);
17890         if (bytes > 0)
17891           /* The -1 is because the name field is always 0 terminated, and we
17892              want to be able to ensure that the shift in the while loop below
17893              will not overflow.  */
17894           -- bytes;
17895
17896         if (bytes > sizeof (val))
17897           {
17898             error (_("corrupt numeric name field: too many bytes in the value: %x\n"),
17899                    bytes);
17900             bytes = sizeof (val);
17901           }
17902         /* We do not bother to warn if bytes == 0 as this can
17903            happen with some early versions of the gcc plugin.  */
17904
17905         while (bytes --)
17906           {
17907             unsigned long byte = (* name ++) & 0xff;
17908
17909             val |= byte << shift;
17910             shift += 8;
17911           }
17912
17913         switch (name_attribute)
17914           {
17915           case GNU_BUILD_ATTRIBUTE_PIC:
17916             switch (val)
17917               {
17918               case 0: decoded = "static"; break;
17919               case 1: decoded = "pic"; break;
17920               case 2: decoded = "PIC"; break;
17921               case 3: decoded = "pie"; break;
17922               case 4: decoded = "PIE"; break;
17923               default: break;
17924               }
17925             break;
17926           case GNU_BUILD_ATTRIBUTE_STACK_PROT:
17927             switch (val)
17928               {
17929                 /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c.  */
17930               case 0: decoded = "off"; break;
17931               case 1: decoded = "on"; break;
17932               case 2: decoded = "all"; break;
17933               case 3: decoded = "strong"; break;
17934               case 4: decoded = "explicit"; break;
17935               default: break;
17936               }
17937             break;
17938           default:
17939             break;
17940           }
17941
17942         if (decoded != NULL)
17943           {
17944             print_symbol (-left, decoded);
17945             left = 0;
17946           }
17947         else if (val == 0)
17948           {
17949             printf ("0x0");
17950             left -= 3;
17951           }
17952         else
17953           {
17954             if (do_wide)
17955               left -= printf ("0x%llx", val);
17956             else
17957               left -= printf ("0x%-.*llx", left, val);
17958           }
17959       }
17960       break;
17961     case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
17962       left -= print_symbol (- left, name);
17963       break;
17964     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
17965       left -= print_symbol (- left, "true");
17966       break;
17967     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
17968       left -= print_symbol (- left, "false");
17969       break;
17970     }
17971
17972   if (do_wide && left > 0)
17973     printf ("%-*s", left, " ");
17974     
17975   return TRUE;
17976 }
17977
17978 /* Note that by the ELF standard, the name field is already null byte
17979    terminated, and namesz includes the terminating null byte.
17980    I.E. the value of namesz for the name "FSF" is 4.
17981
17982    If the value of namesz is zero, there is no name present.  */
17983
17984 static bfd_boolean
17985 process_note (Elf_Internal_Note *  pnote,
17986               Filedata *           filedata)
17987 {
17988   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
17989   const char * nt;
17990
17991   if (pnote->namesz == 0)
17992     /* If there is no note name, then use the default set of
17993        note type strings.  */
17994     nt = get_note_type (filedata, pnote->type);
17995
17996   else if (const_strneq (pnote->namedata, "GNU"))
17997     /* GNU-specific object file notes.  */
17998     nt = get_gnu_elf_note_type (pnote->type);
17999
18000   else if (const_strneq (pnote->namedata, "FreeBSD"))
18001     /* FreeBSD-specific core file notes.  */
18002     nt = get_freebsd_elfcore_note_type (filedata, pnote->type);
18003
18004   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
18005     /* NetBSD-specific core file notes.  */
18006     nt = get_netbsd_elfcore_note_type (filedata, pnote->type);
18007
18008   else if (const_strneq (pnote->namedata, "NetBSD"))
18009     /* NetBSD-specific core file notes.  */
18010     return process_netbsd_elf_note (pnote);
18011
18012   else if (strneq (pnote->namedata, "SPU/", 4))
18013     {
18014       /* SPU-specific core file notes.  */
18015       nt = pnote->namedata + 4;
18016       name = "SPU";
18017     }
18018
18019   else if (const_strneq (pnote->namedata, "IPF/VMS"))
18020     /* VMS/ia64-specific file notes.  */
18021     nt = get_ia64_vms_note_type (pnote->type);
18022
18023   else if (const_strneq (pnote->namedata, "stapsdt"))
18024     nt = get_stapsdt_note_type (pnote->type);
18025
18026   else
18027     /* Don't recognize this note name; just use the default set of
18028        note type strings.  */
18029     nt = get_note_type (filedata, pnote->type);
18030
18031   printf ("  ");
18032
18033   if (((const_strneq (pnote->namedata, "GA")
18034         && strchr ("*$!+", pnote->namedata[2]) != NULL)
18035        || strchr ("*$!+", pnote->namedata[0]) != NULL)
18036       && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18037           || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
18038     print_gnu_build_attribute_name (pnote);
18039   else
18040     print_symbol (-20, name);
18041
18042   if (do_wide)
18043     printf (" 0x%08lx\t%s\t", pnote->descsz, nt);
18044   else
18045     printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
18046
18047   if (const_strneq (pnote->namedata, "IPF/VMS"))
18048     return print_ia64_vms_note (pnote);
18049   else if (const_strneq (pnote->namedata, "GNU"))
18050     return print_gnu_note (filedata, pnote);
18051   else if (const_strneq (pnote->namedata, "stapsdt"))
18052     return print_stapsdt_note (pnote);
18053   else if (const_strneq (pnote->namedata, "CORE"))
18054     return print_core_note (pnote);
18055   else if (((const_strneq (pnote->namedata, "GA")
18056              && strchr ("*$!+", pnote->namedata[2]) != NULL)
18057             || strchr ("*$!+", pnote->namedata[0]) != NULL)
18058            && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18059                || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
18060     return print_gnu_build_attribute_description (pnote, filedata);
18061
18062   if (pnote->descsz)
18063     {
18064       unsigned long i;
18065
18066       printf (_("   description data: "));
18067       for (i = 0; i < pnote->descsz; i++)
18068         printf ("%02x ", pnote->descdata[i]);
18069       if (!do_wide)
18070         printf ("\n");
18071     }
18072
18073   if (do_wide)
18074     printf ("\n");
18075
18076   return TRUE;
18077 }
18078
18079 static bfd_boolean
18080 process_notes_at (Filedata *           filedata,
18081                   Elf_Internal_Shdr *  section,
18082                   bfd_vma              offset,
18083                   bfd_vma              length,
18084                   bfd_vma              align)
18085 {
18086   Elf_External_Note * pnotes;
18087   Elf_External_Note * external;
18088   char *              end;
18089   bfd_boolean         res = TRUE;
18090
18091   if (length <= 0)
18092     return FALSE;
18093
18094   if (section)
18095     {
18096       pnotes = (Elf_External_Note *) get_section_contents (section, filedata);
18097       if (pnotes)
18098         {
18099           if (! apply_relocations (filedata, section, (unsigned char *) pnotes, length, NULL, NULL))
18100             return FALSE;
18101         }
18102     }
18103   else
18104     pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18105                                              _("notes"));
18106
18107   if (pnotes == NULL)
18108     return FALSE;
18109
18110   external = pnotes;
18111
18112   if (section)
18113     printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (filedata, section));
18114   else
18115     printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
18116             (unsigned long) offset, (unsigned long) length);
18117
18118   /* NB: Some note sections may have alignment value of 0 or 1.  gABI
18119      specifies that notes should be aligned to 4 bytes in 32-bit
18120      objects and to 8 bytes in 64-bit objects.  As a Linux extension,
18121      we also support 4 byte alignment in 64-bit objects.  If section
18122      alignment is less than 4, we treate alignment as 4 bytes.   */
18123   if (align < 4)
18124     align = 4;
18125   else if (align != 4 && align != 8)
18126     {
18127       warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
18128             (long) align);
18129       return FALSE;
18130     }
18131
18132   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
18133
18134   end = (char *) pnotes + length;
18135   while ((char *) external < end)
18136     {
18137       Elf_Internal_Note inote;
18138       size_t min_notesz;
18139       char * next;
18140       char * temp = NULL;
18141       size_t data_remaining = end - (char *) external;
18142
18143       if (!is_ia64_vms (filedata))
18144         {
18145           /* PR binutils/15191
18146              Make sure that there is enough data to read.  */
18147           min_notesz = offsetof (Elf_External_Note, name);
18148           if (data_remaining < min_notesz)
18149             {
18150               warn (ngettext ("Corrupt note: only %ld byte remains, "
18151                               "not enough for a full note\n",
18152                               "Corrupt note: only %ld bytes remain, "
18153                               "not enough for a full note\n",
18154                               data_remaining),
18155                     (long) data_remaining);
18156               break;
18157             }
18158           data_remaining -= min_notesz;
18159
18160           inote.type     = BYTE_GET (external->type);
18161           inote.namesz   = BYTE_GET (external->namesz);
18162           inote.namedata = external->name;
18163           inote.descsz   = BYTE_GET (external->descsz);
18164           inote.descdata = ((char *) external
18165                             + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
18166           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
18167           next = ((char *) external
18168                   + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
18169         }
18170       else
18171         {
18172           Elf64_External_VMS_Note *vms_external;
18173
18174           /* PR binutils/15191
18175              Make sure that there is enough data to read.  */
18176           min_notesz = offsetof (Elf64_External_VMS_Note, name);
18177           if (data_remaining < min_notesz)
18178             {
18179               warn (ngettext ("Corrupt note: only %ld byte remains, "
18180                               "not enough for a full note\n",
18181                               "Corrupt note: only %ld bytes remain, "
18182                               "not enough for a full note\n",
18183                               data_remaining),
18184                     (long) data_remaining);
18185               break;
18186             }
18187           data_remaining -= min_notesz;
18188
18189           vms_external = (Elf64_External_VMS_Note *) external;
18190           inote.type     = BYTE_GET (vms_external->type);
18191           inote.namesz   = BYTE_GET (vms_external->namesz);
18192           inote.namedata = vms_external->name;
18193           inote.descsz   = BYTE_GET (vms_external->descsz);
18194           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
18195           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
18196           next = inote.descdata + align_power (inote.descsz, 3);
18197         }
18198
18199       /* PR 17531: file: 3443835e.  */
18200       /* PR 17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4.  */
18201       if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
18202           || (size_t) (inote.descdata - inote.namedata) > data_remaining
18203           || (size_t) (next - inote.descdata) < inote.descsz
18204           || ((size_t) (next - inote.descdata)
18205               > data_remaining - (size_t) (inote.descdata - inote.namedata)))
18206         {
18207           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
18208                 (unsigned long) ((char *) external - (char *) pnotes));
18209           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
18210                 inote.type, inote.namesz, inote.descsz, (int) align);
18211           break;
18212         }
18213
18214       external = (Elf_External_Note *) next;
18215
18216       /* Verify that name is null terminated.  It appears that at least
18217          one version of Linux (RedHat 6.0) generates corefiles that don't
18218          comply with the ELF spec by failing to include the null byte in
18219          namesz.  */
18220       if (inote.namedata[inote.namesz - 1] != '\0')
18221         {
18222           if ((size_t) (inote.descdata - inote.namedata) == inote.namesz)
18223             {
18224               temp = (char *) malloc (inote.namesz + 1);
18225               if (temp == NULL)
18226                 {
18227                   error (_("Out of memory allocating space for inote name\n"));
18228                   res = FALSE;
18229                   break;
18230                 }
18231
18232               memcpy (temp, inote.namedata, inote.namesz);
18233               inote.namedata = temp;
18234             }
18235           inote.namedata[inote.namesz] = 0;
18236         }
18237
18238       if (! process_note (& inote, filedata))
18239         res = FALSE;
18240
18241       if (temp != NULL)
18242         {
18243           free (temp);
18244           temp = NULL;
18245         }
18246     }
18247
18248   free (pnotes);
18249
18250   return res;
18251 }
18252
18253 static bfd_boolean
18254 process_corefile_note_segments (Filedata * filedata)
18255 {
18256   Elf_Internal_Phdr * segment;
18257   unsigned int i;
18258   bfd_boolean res = TRUE;
18259
18260   if (! get_program_headers (filedata))
18261     return TRUE;
18262
18263   for (i = 0, segment = filedata->program_headers;
18264        i < filedata->file_header.e_phnum;
18265        i++, segment++)
18266     {
18267       if (segment->p_type == PT_NOTE)
18268         if (! process_notes_at (filedata, NULL,
18269                                 (bfd_vma) segment->p_offset,
18270                                 (bfd_vma) segment->p_filesz,
18271                                 (bfd_vma) segment->p_align))
18272           res = FALSE;
18273     }
18274
18275   return res;
18276 }
18277
18278 static bfd_boolean
18279 process_v850_notes (Filedata * filedata, bfd_vma offset, bfd_vma length)
18280 {
18281   Elf_External_Note * pnotes;
18282   Elf_External_Note * external;
18283   char * end;
18284   bfd_boolean res = TRUE;
18285
18286   if (length <= 0)
18287     return FALSE;
18288
18289   pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18290                                            _("v850 notes"));
18291   if (pnotes == NULL)
18292     return FALSE;
18293
18294   external = pnotes;
18295   end = (char*) pnotes + length;
18296
18297   printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
18298           (unsigned long) offset, (unsigned long) length);
18299
18300   while ((char *) external + sizeof (Elf_External_Note) < end)
18301     {
18302       Elf_External_Note * next;
18303       Elf_Internal_Note inote;
18304
18305       inote.type     = BYTE_GET (external->type);
18306       inote.namesz   = BYTE_GET (external->namesz);
18307       inote.namedata = external->name;
18308       inote.descsz   = BYTE_GET (external->descsz);
18309       inote.descdata = inote.namedata + align_power (inote.namesz, 2);
18310       inote.descpos  = offset + (inote.descdata - (char *) pnotes);
18311
18312       if (inote.descdata < (char *) pnotes || inote.descdata >= end)
18313         {
18314           warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
18315           inote.descdata = inote.namedata;
18316           inote.namesz   = 0;
18317         }
18318
18319       next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
18320
18321       if (   ((char *) next > end)
18322           || ((char *) next <  (char *) pnotes))
18323         {
18324           warn (_("corrupt descsz found in note at offset 0x%lx\n"),
18325                 (unsigned long) ((char *) external - (char *) pnotes));
18326           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
18327                 inote.type, inote.namesz, inote.descsz);
18328           break;
18329         }
18330
18331       external = next;
18332
18333       /* Prevent out-of-bounds indexing.  */
18334       if (   inote.namedata + inote.namesz > end
18335           || inote.namedata + inote.namesz < inote.namedata)
18336         {
18337           warn (_("corrupt namesz found in note at offset 0x%lx\n"),
18338                 (unsigned long) ((char *) external - (char *) pnotes));
18339           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
18340                 inote.type, inote.namesz, inote.descsz);
18341           break;
18342         }
18343
18344       printf ("  %s: ", get_v850_elf_note_type (inote.type));
18345
18346       if (! print_v850_note (& inote))
18347         {
18348           res = FALSE;
18349           printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
18350                   inote.namesz, inote.descsz);
18351         }
18352     }
18353
18354   free (pnotes);
18355
18356   return res;
18357 }
18358
18359 static bfd_boolean
18360 process_note_sections (Filedata * filedata)
18361 {
18362   Elf_Internal_Shdr * section;
18363   unsigned long i;
18364   unsigned int n = 0;
18365   bfd_boolean res = TRUE;
18366
18367   for (i = 0, section = filedata->section_headers;
18368        i < filedata->file_header.e_shnum && section != NULL;
18369        i++, section++)
18370     {
18371       if (section->sh_type == SHT_NOTE)
18372         {
18373           if (! process_notes_at (filedata, section,
18374                                   (bfd_vma) section->sh_offset,
18375                                   (bfd_vma) section->sh_size,
18376                                   (bfd_vma) section->sh_addralign))
18377             res = FALSE;
18378           n++;
18379         }
18380
18381       if ((   filedata->file_header.e_machine == EM_V800
18382            || filedata->file_header.e_machine == EM_V850
18383            || filedata->file_header.e_machine == EM_CYGNUS_V850)
18384           && section->sh_type == SHT_RENESAS_INFO)
18385         {
18386           if (! process_v850_notes (filedata,
18387                                     (bfd_vma) section->sh_offset,
18388                                     (bfd_vma) section->sh_size))
18389             res = FALSE;
18390           n++;
18391         }
18392     }
18393
18394   if (n == 0)
18395     /* Try processing NOTE segments instead.  */
18396     return process_corefile_note_segments (filedata);
18397
18398   return res;
18399 }
18400
18401 static bfd_boolean
18402 process_notes (Filedata * filedata)
18403 {
18404   /* If we have not been asked to display the notes then do nothing.  */
18405   if (! do_notes)
18406     return TRUE;
18407
18408   if (filedata->file_header.e_type != ET_CORE)
18409     return process_note_sections (filedata);
18410
18411   /* No program headers means no NOTE segment.  */
18412   if (filedata->file_header.e_phnum > 0)
18413     return process_corefile_note_segments (filedata);
18414
18415   printf (_("No note segments present in the core file.\n"));
18416   return TRUE;
18417 }
18418
18419 static unsigned char *
18420 display_public_gnu_attributes (unsigned char * start,
18421                                const unsigned char * const end)
18422 {
18423   printf (_("  Unknown GNU attribute: %s\n"), start);
18424
18425   start += strnlen ((char *) start, end - start);
18426   display_raw_attribute (start, end);
18427
18428   return (unsigned char *) end;
18429 }
18430
18431 static unsigned char *
18432 display_generic_attribute (unsigned char * start,
18433                            unsigned int tag,
18434                            const unsigned char * const end)
18435 {
18436   if (tag == 0)
18437     return (unsigned char *) end;
18438
18439   return display_tag_value (tag, start, end);
18440 }
18441
18442 static bfd_boolean
18443 process_arch_specific (Filedata * filedata)
18444 {
18445   if (! do_arch)
18446     return TRUE;
18447
18448   switch (filedata->file_header.e_machine)
18449     {
18450     case EM_ARC:
18451     case EM_ARC_COMPACT:
18452     case EM_ARC_COMPACT2:
18453       return process_attributes (filedata, "ARC", SHT_ARC_ATTRIBUTES,
18454                                  display_arc_attribute,
18455                                  display_generic_attribute);
18456     case EM_ARM:
18457       return process_attributes (filedata, "aeabi", SHT_ARM_ATTRIBUTES,
18458                                  display_arm_attribute,
18459                                  display_generic_attribute);
18460
18461     case EM_MIPS:
18462     case EM_MIPS_RS3_LE:
18463       return process_mips_specific (filedata);
18464
18465     case EM_MSP430:
18466      return process_attributes (filedata, "mspabi", SHT_MSP430_ATTRIBUTES,
18467                                 display_msp430x_attribute,
18468                                 display_generic_attribute);
18469
18470     case EM_NDS32:
18471       return process_nds32_specific (filedata);
18472
18473     case EM_PPC:
18474     case EM_PPC64:
18475       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
18476                                  display_power_gnu_attribute);
18477
18478     case EM_S390:
18479     case EM_S390_OLD:
18480       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
18481                                  display_s390_gnu_attribute);
18482
18483     case EM_SPARC:
18484     case EM_SPARC32PLUS:
18485     case EM_SPARCV9:
18486       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
18487                                  display_sparc_gnu_attribute);
18488
18489     case EM_TI_C6000:
18490       return process_attributes (filedata, "c6xabi", SHT_C6000_ATTRIBUTES,
18491                                  display_tic6x_attribute,
18492                                  display_generic_attribute);
18493
18494     default:
18495       return process_attributes (filedata, "gnu", SHT_GNU_ATTRIBUTES,
18496                                  display_public_gnu_attributes,
18497                                  display_generic_attribute);
18498     }
18499 }
18500
18501 static bfd_boolean
18502 get_file_header (Filedata * filedata)
18503 {
18504   /* Read in the identity array.  */
18505   if (fread (filedata->file_header.e_ident, EI_NIDENT, 1, filedata->handle) != 1)
18506     return FALSE;
18507
18508   /* Determine how to read the rest of the header.  */
18509   switch (filedata->file_header.e_ident[EI_DATA])
18510     {
18511     default:
18512     case ELFDATANONE:
18513     case ELFDATA2LSB:
18514       byte_get = byte_get_little_endian;
18515       byte_put = byte_put_little_endian;
18516       break;
18517     case ELFDATA2MSB:
18518       byte_get = byte_get_big_endian;
18519       byte_put = byte_put_big_endian;
18520       break;
18521     }
18522
18523   /* For now we only support 32 bit and 64 bit ELF files.  */
18524   is_32bit_elf = (filedata->file_header.e_ident[EI_CLASS] != ELFCLASS64);
18525
18526   /* Read in the rest of the header.  */
18527   if (is_32bit_elf)
18528     {
18529       Elf32_External_Ehdr ehdr32;
18530
18531       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, filedata->handle) != 1)
18532         return FALSE;
18533
18534       filedata->file_header.e_type      = BYTE_GET (ehdr32.e_type);
18535       filedata->file_header.e_machine   = BYTE_GET (ehdr32.e_machine);
18536       filedata->file_header.e_version   = BYTE_GET (ehdr32.e_version);
18537       filedata->file_header.e_entry     = BYTE_GET (ehdr32.e_entry);
18538       filedata->file_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
18539       filedata->file_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
18540       filedata->file_header.e_flags     = BYTE_GET (ehdr32.e_flags);
18541       filedata->file_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
18542       filedata->file_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
18543       filedata->file_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
18544       filedata->file_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
18545       filedata->file_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
18546       filedata->file_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
18547     }
18548   else
18549     {
18550       Elf64_External_Ehdr ehdr64;
18551
18552       /* If we have been compiled with sizeof (bfd_vma) == 4, then
18553          we will not be able to cope with the 64bit data found in
18554          64 ELF files.  Detect this now and abort before we start
18555          overwriting things.  */
18556       if (sizeof (bfd_vma) < 8)
18557         {
18558           error (_("This instance of readelf has been built without support for a\n\
18559 64 bit data type and so it cannot read 64 bit ELF files.\n"));
18560           return FALSE;
18561         }
18562
18563       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, filedata->handle) != 1)
18564         return FALSE;
18565
18566       filedata->file_header.e_type      = BYTE_GET (ehdr64.e_type);
18567       filedata->file_header.e_machine   = BYTE_GET (ehdr64.e_machine);
18568       filedata->file_header.e_version   = BYTE_GET (ehdr64.e_version);
18569       filedata->file_header.e_entry     = BYTE_GET (ehdr64.e_entry);
18570       filedata->file_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
18571       filedata->file_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
18572       filedata->file_header.e_flags     = BYTE_GET (ehdr64.e_flags);
18573       filedata->file_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
18574       filedata->file_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
18575       filedata->file_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
18576       filedata->file_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
18577       filedata->file_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
18578       filedata->file_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
18579     }
18580
18581   if (filedata->file_header.e_shoff)
18582     {
18583       /* There may be some extensions in the first section header.  Don't
18584          bomb if we can't read it.  */
18585       if (is_32bit_elf)
18586         get_32bit_section_headers (filedata, TRUE);
18587       else
18588         get_64bit_section_headers (filedata, TRUE);
18589     }
18590
18591   return TRUE;
18592 }
18593
18594 static void
18595 close_file (Filedata * filedata)
18596 {
18597   if (filedata)
18598     {
18599       if (filedata->handle)
18600         fclose (filedata->handle);
18601       free (filedata);
18602     }
18603 }
18604
18605 void
18606 close_debug_file (void * data)
18607 {
18608   close_file ((Filedata *) data);
18609 }
18610
18611 static Filedata *
18612 open_file (const char * pathname)
18613 {
18614   struct stat  statbuf;
18615   Filedata *   filedata = NULL;
18616
18617   if (stat (pathname, & statbuf) < 0
18618       || ! S_ISREG (statbuf.st_mode))
18619     goto fail;
18620
18621   filedata = calloc (1, sizeof * filedata);
18622   if (filedata == NULL)
18623     goto fail;
18624
18625   filedata->handle = fopen (pathname, "rb");
18626   if (filedata->handle == NULL)
18627     goto fail;
18628
18629   filedata->file_size = (bfd_size_type) statbuf.st_size;
18630   filedata->file_name = pathname;
18631
18632   if (! get_file_header (filedata))
18633     goto fail;
18634
18635   if (filedata->file_header.e_shoff)
18636     {
18637       bfd_boolean res;
18638
18639       /* Read the section headers again, this time for real.  */
18640       if (is_32bit_elf)
18641         res = get_32bit_section_headers (filedata, FALSE);
18642       else
18643         res = get_64bit_section_headers (filedata, FALSE);
18644
18645       if (!res)
18646         goto fail;
18647     }
18648
18649   return filedata;
18650
18651  fail:
18652   if (filedata)
18653     {
18654       if (filedata->handle)
18655         fclose (filedata->handle);
18656       free (filedata);
18657     }
18658   return NULL;
18659 }
18660
18661 void *
18662 open_debug_file (const char * pathname)
18663 {
18664   return open_file (pathname);
18665 }
18666
18667 /* Process one ELF object file according to the command line options.
18668    This file may actually be stored in an archive.  The file is
18669    positioned at the start of the ELF object.  Returns TRUE if no
18670    problems were encountered, FALSE otherwise.  */
18671
18672 static bfd_boolean
18673 process_object (Filedata * filedata)
18674 {
18675   Filedata * separates;
18676   unsigned int i;
18677   bfd_boolean res = TRUE;
18678
18679   if (! get_file_header (filedata))
18680     {
18681       error (_("%s: Failed to read file header\n"), filedata->file_name);
18682       return FALSE;
18683     }
18684
18685   /* Initialise per file variables.  */
18686   for (i = ARRAY_SIZE (version_info); i--;)
18687     version_info[i] = 0;
18688
18689   for (i = ARRAY_SIZE (dynamic_info); i--;)
18690     dynamic_info[i] = 0;
18691   dynamic_info_DT_GNU_HASH = 0;
18692
18693   /* Process the file.  */
18694   if (show_name)
18695     printf (_("\nFile: %s\n"), filedata->file_name);
18696
18697   /* Initialise the dump_sects array from the cmdline_dump_sects array.
18698      Note we do this even if cmdline_dump_sects is empty because we
18699      must make sure that the dump_sets array is zeroed out before each
18700      object file is processed.  */
18701   if (filedata->num_dump_sects > cmdline.num_dump_sects)
18702     memset (filedata->dump_sects, 0, filedata->num_dump_sects * sizeof (* filedata->dump_sects));
18703
18704   if (cmdline.num_dump_sects > 0)
18705     {
18706       if (filedata->num_dump_sects == 0)
18707         /* A sneaky way of allocating the dump_sects array.  */
18708         request_dump_bynumber (filedata, cmdline.num_dump_sects, 0);
18709
18710       assert (filedata->num_dump_sects >= cmdline.num_dump_sects);
18711       memcpy (filedata->dump_sects, cmdline.dump_sects,
18712               cmdline.num_dump_sects * sizeof (* filedata->dump_sects));
18713     }
18714
18715   if (! process_file_header (filedata))
18716     return FALSE;
18717
18718   if (! process_section_headers (filedata))
18719     {
18720       /* Without loaded section headers we cannot process lots of things.  */
18721       do_unwind = do_version = do_dump = do_arch = FALSE;
18722
18723       if (! do_using_dynamic)
18724         do_syms = do_dyn_syms = do_reloc = FALSE;
18725     }
18726
18727   if (! process_section_groups (filedata))
18728     /* Without loaded section groups we cannot process unwind.  */
18729     do_unwind = FALSE;
18730
18731   if (process_program_headers (filedata))
18732     process_dynamic_section (filedata);
18733   else
18734     res = FALSE;
18735
18736   if (! process_relocs (filedata))
18737     res = FALSE;
18738
18739   if (! process_unwind (filedata))
18740     res = FALSE;
18741
18742   if (! process_symbol_table (filedata))
18743     res = FALSE;
18744
18745   if (! process_syminfo (filedata))
18746     res = FALSE;
18747
18748   if (! process_version_sections (filedata))
18749     res = FALSE;
18750
18751   if (filedata->file_header.e_shstrndx != SHN_UNDEF)
18752     separates = load_separate_debug_file (filedata, filedata->file_name);
18753   else
18754     separates = NULL;
18755
18756   if (! process_section_contents (filedata))
18757     res = FALSE;
18758
18759   if (separates)
18760     {
18761       if (! process_section_headers (separates))
18762         res = FALSE;
18763       else if (! process_section_contents (separates))
18764         res = FALSE;
18765     }
18766
18767   if (! process_notes (filedata))
18768     res = FALSE;
18769
18770   if (! process_gnu_liblist (filedata))
18771     res = FALSE;
18772
18773   if (! process_arch_specific (filedata))
18774     res = FALSE;
18775
18776   free (filedata->program_headers);
18777   filedata->program_headers = NULL;
18778
18779   free (filedata->section_headers);
18780   filedata->section_headers = NULL;
18781
18782   free (filedata->string_table);
18783   filedata->string_table = NULL;
18784   filedata->string_table_length = 0;
18785
18786   if (dynamic_strings)
18787     {
18788       free (dynamic_strings);
18789       dynamic_strings = NULL;
18790       dynamic_strings_length = 0;
18791     }
18792
18793   if (dynamic_symbols)
18794     {
18795       free (dynamic_symbols);
18796       dynamic_symbols = NULL;
18797       num_dynamic_syms = 0;
18798     }
18799
18800   if (dynamic_syminfo)
18801     {
18802       free (dynamic_syminfo);
18803       dynamic_syminfo = NULL;
18804     }
18805
18806   if (dynamic_section)
18807     {
18808       free (dynamic_section);
18809       dynamic_section = NULL;
18810     }
18811
18812   if (section_headers_groups)
18813     {
18814       free (section_headers_groups);
18815       section_headers_groups = NULL;
18816     }
18817
18818   if (section_groups)
18819     {
18820       struct group_list * g;
18821       struct group_list * next;
18822
18823       for (i = 0; i < group_count; i++)
18824         {
18825           for (g = section_groups [i].root; g != NULL; g = next)
18826             {
18827               next = g->next;
18828               free (g);
18829             }
18830         }
18831
18832       free (section_groups);
18833       section_groups = NULL;
18834     }
18835
18836   free_debug_memory ();
18837
18838   return res;
18839 }
18840
18841 /* Process an ELF archive.
18842    On entry the file is positioned just after the ARMAG string.
18843    Returns TRUE upon success, FALSE otherwise.  */
18844
18845 static bfd_boolean
18846 process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
18847 {
18848   struct archive_info arch;
18849   struct archive_info nested_arch;
18850   size_t got;
18851   bfd_boolean ret = TRUE;
18852
18853   show_name = TRUE;
18854
18855   /* The ARCH structure is used to hold information about this archive.  */
18856   arch.file_name = NULL;
18857   arch.file = NULL;
18858   arch.index_array = NULL;
18859   arch.sym_table = NULL;
18860   arch.longnames = NULL;
18861
18862   /* The NESTED_ARCH structure is used as a single-item cache of information
18863      about a nested archive (when members of a thin archive reside within
18864      another regular archive file).  */
18865   nested_arch.file_name = NULL;
18866   nested_arch.file = NULL;
18867   nested_arch.index_array = NULL;
18868   nested_arch.sym_table = NULL;
18869   nested_arch.longnames = NULL;
18870
18871   if (setup_archive (&arch, filedata->file_name, filedata->handle,
18872                      is_thin_archive, do_archive_index) != 0)
18873     {
18874       ret = FALSE;
18875       goto out;
18876     }
18877
18878   if (do_archive_index)
18879     {
18880       if (arch.sym_table == NULL)
18881         error (_("%s: unable to dump the index as none was found\n"), filedata->file_name);
18882       else
18883         {
18884           unsigned long i, l;
18885           unsigned long current_pos;
18886
18887           printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
18888                   filedata->file_name, (unsigned long) arch.index_num, arch.sym_size);
18889
18890           current_pos = ftell (filedata->handle);
18891
18892           for (i = l = 0; i < arch.index_num; i++)
18893             {
18894               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
18895                 {
18896                   char * member_name;
18897
18898                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
18899
18900                   if (member_name != NULL)
18901                     {
18902                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
18903
18904                       if (qualified_name != NULL)
18905                         {
18906                           printf (_("Contents of binary %s at offset "), qualified_name);
18907                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
18908                           putchar ('\n');
18909                           free (qualified_name);
18910                         }
18911                     }
18912                 }
18913
18914               if (l >= arch.sym_size)
18915                 {
18916                   error (_("%s: end of the symbol table reached before the end of the index\n"),
18917                          filedata->file_name);
18918                   ret = FALSE;
18919                   break;
18920                 }
18921               /* PR 17531: file: 0b6630b2.  */
18922               printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
18923               l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
18924             }
18925
18926           if (arch.uses_64bit_indicies)
18927             l = (l + 7) & ~ 7;
18928           else
18929             l += l & 1;
18930
18931           if (l < arch.sym_size)
18932             {
18933               error (ngettext ("%s: %ld byte remains in the symbol table, "
18934                                "but without corresponding entries in "
18935                                "the index table\n",
18936                                "%s: %ld bytes remain in the symbol table, "
18937                                "but without corresponding entries in "
18938                                "the index table\n",
18939                                arch.sym_size - l),
18940                      filedata->file_name, arch.sym_size - l);
18941               ret = FALSE;
18942             }
18943
18944           if (fseek (filedata->handle, current_pos, SEEK_SET) != 0)
18945             {
18946               error (_("%s: failed to seek back to start of object files in the archive\n"),
18947                      filedata->file_name);
18948               ret = FALSE;
18949               goto out;
18950             }
18951         }
18952
18953       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
18954           && !do_segments && !do_header && !do_dump && !do_version
18955           && !do_histogram && !do_debugging && !do_arch && !do_notes
18956           && !do_section_groups && !do_dyn_syms)
18957         {
18958           ret = TRUE; /* Archive index only.  */
18959           goto out;
18960         }
18961     }
18962
18963   while (1)
18964     {
18965       char * name;
18966       size_t namelen;
18967       char * qualified_name;
18968
18969       /* Read the next archive header.  */
18970       if (fseek (filedata->handle, arch.next_arhdr_offset, SEEK_SET) != 0)
18971         {
18972           error (_("%s: failed to seek to next archive header\n"), filedata->file_name);
18973           return FALSE;
18974         }
18975       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, filedata->handle);
18976       if (got != sizeof arch.arhdr)
18977         {
18978           if (got == 0)
18979             break;
18980           error (_("%s: failed to read archive header\n"), filedata->file_name);
18981           ret = FALSE;
18982           break;
18983         }
18984       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
18985         {
18986           error (_("%s: did not find a valid archive header\n"), arch.file_name);
18987           ret = FALSE;
18988           break;
18989         }
18990
18991       arch.next_arhdr_offset += sizeof arch.arhdr;
18992
18993       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
18994       if (archive_file_size & 01)
18995         ++archive_file_size;
18996
18997       name = get_archive_member_name (&arch, &nested_arch);
18998       if (name == NULL)
18999         {
19000           error (_("%s: bad archive file name\n"), filedata->file_name);
19001           ret = FALSE;
19002           break;
19003         }
19004       namelen = strlen (name);
19005
19006       qualified_name = make_qualified_name (&arch, &nested_arch, name);
19007       if (qualified_name == NULL)
19008         {
19009           error (_("%s: bad archive file name\n"), filedata->file_name);
19010           ret = FALSE;
19011           break;
19012         }
19013
19014       if (is_thin_archive && arch.nested_member_origin == 0)
19015         {
19016           /* This is a proxy for an external member of a thin archive.  */
19017           Filedata * member_filedata;
19018           char * member_file_name = adjust_relative_path
19019             (filedata->file_name, name, namelen);
19020
19021           if (member_file_name == NULL)
19022             {
19023               ret = FALSE;
19024               break;
19025             }
19026
19027           member_filedata = open_file (member_file_name);
19028           if (member_filedata == NULL)
19029             {
19030               error (_("Input file '%s' is not readable.\n"), member_file_name);
19031               free (member_file_name);
19032               ret = FALSE;
19033               break;
19034             }
19035
19036           archive_file_offset = arch.nested_member_origin;
19037           member_filedata->file_name = qualified_name;
19038
19039           if (! process_object (member_filedata))
19040             ret = FALSE;
19041
19042           close_file (member_filedata);
19043           free (member_file_name);
19044         }
19045       else if (is_thin_archive)
19046         {
19047           Filedata thin_filedata;
19048
19049           memset (&thin_filedata, 0, sizeof (thin_filedata));
19050
19051           /* PR 15140: Allow for corrupt thin archives.  */
19052           if (nested_arch.file == NULL)
19053             {
19054               error (_("%s: contains corrupt thin archive: %s\n"),
19055                      filedata->file_name, name);
19056               ret = FALSE;
19057               break;
19058             }
19059
19060           /* This is a proxy for a member of a nested archive.  */
19061           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
19062
19063           /* The nested archive file will have been opened and setup by
19064              get_archive_member_name.  */
19065           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
19066             {
19067               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
19068               ret = FALSE;
19069               break;
19070             }
19071
19072           thin_filedata.handle = nested_arch.file;
19073           thin_filedata.file_name = qualified_name;
19074           
19075           if (! process_object (& thin_filedata))
19076             ret = FALSE;
19077         }
19078       else
19079         {
19080           archive_file_offset = arch.next_arhdr_offset;
19081           arch.next_arhdr_offset += archive_file_size;
19082
19083           filedata->file_name = qualified_name;
19084           if (! process_object (filedata))
19085             ret = FALSE;
19086         }
19087
19088       if (filedata->dump_sects != NULL)
19089         {
19090           free (filedata->dump_sects);
19091           filedata->dump_sects = NULL;
19092           filedata->num_dump_sects = 0;
19093         }
19094
19095       free (qualified_name);
19096     }
19097
19098  out:
19099   if (nested_arch.file != NULL)
19100     fclose (nested_arch.file);
19101   release_archive (&nested_arch);
19102   release_archive (&arch);
19103
19104   return ret;
19105 }
19106
19107 static bfd_boolean
19108 process_file (char * file_name)
19109 {
19110   Filedata * filedata = NULL;
19111   struct stat statbuf;
19112   char armag[SARMAG];
19113   bfd_boolean ret = TRUE;
19114
19115   if (stat (file_name, &statbuf) < 0)
19116     {
19117       if (errno == ENOENT)
19118         error (_("'%s': No such file\n"), file_name);
19119       else
19120         error (_("Could not locate '%s'.  System error message: %s\n"),
19121                file_name, strerror (errno));
19122       return FALSE;
19123     }
19124
19125   if (! S_ISREG (statbuf.st_mode))
19126     {
19127       error (_("'%s' is not an ordinary file\n"), file_name);
19128       return FALSE;
19129     }
19130
19131   filedata = calloc (1, sizeof * filedata);
19132   if (filedata == NULL)
19133     {
19134       error (_("Out of memory allocating file data structure\n"));
19135       return FALSE;
19136     }
19137
19138   filedata->file_name = file_name;
19139   filedata->handle = fopen (file_name, "rb");
19140   if (filedata->handle == NULL)
19141     {
19142       error (_("Input file '%s' is not readable.\n"), file_name);
19143       free (filedata);
19144       return FALSE;
19145     }
19146
19147   if (fread (armag, SARMAG, 1, filedata->handle) != 1)
19148     {
19149       error (_("%s: Failed to read file's magic number\n"), file_name);
19150       fclose (filedata->handle);
19151       free (filedata);
19152       return FALSE;
19153     }
19154
19155   filedata->file_size = (bfd_size_type) statbuf.st_size;
19156
19157   if (memcmp (armag, ARMAG, SARMAG) == 0)
19158     {
19159       if (! process_archive (filedata, FALSE))
19160         ret = FALSE;
19161     }
19162   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
19163     {
19164       if ( ! process_archive (filedata, TRUE))
19165         ret = FALSE;
19166     }
19167   else
19168     {
19169       if (do_archive_index)
19170         error (_("File %s is not an archive so its index cannot be displayed.\n"),
19171                file_name);
19172
19173       rewind (filedata->handle);
19174       archive_file_size = archive_file_offset = 0;
19175
19176       if (! process_object (filedata))
19177         ret = FALSE;
19178     }
19179
19180   fclose (filedata->handle);
19181   free (filedata);
19182
19183   return ret;
19184 }
19185
19186 #ifdef SUPPORT_DISASSEMBLY
19187 /* Needed by the i386 disassembler.  For extra credit, someone could
19188    fix this so that we insert symbolic addresses here, esp for GOT/PLT
19189    symbols.  */
19190
19191 void
19192 print_address (unsigned int addr, FILE * outfile)
19193 {
19194   fprintf (outfile,"0x%8.8x", addr);
19195 }
19196
19197 /* Needed by the i386 disassembler.  */
19198
19199 void
19200 db_task_printsym (unsigned int addr)
19201 {
19202   print_address (addr, stderr);
19203 }
19204 #endif
19205
19206 int
19207 main (int argc, char ** argv)
19208 {
19209   int err;
19210
19211 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
19212   setlocale (LC_MESSAGES, "");
19213 #endif
19214 #if defined (HAVE_SETLOCALE)
19215   setlocale (LC_CTYPE, "");
19216 #endif
19217   bindtextdomain (PACKAGE, LOCALEDIR);
19218   textdomain (PACKAGE);
19219
19220   expandargv (&argc, &argv);
19221
19222   cmdline.file_name = "<cmdline>";
19223   parse_args (& cmdline, argc, argv);
19224
19225   if (optind < (argc - 1))
19226     show_name = TRUE;
19227   else if (optind >= argc)
19228     {
19229       warn (_("Nothing to do.\n"));
19230       usage (stderr);
19231     }
19232
19233   err = FALSE;
19234   while (optind < argc)
19235     if (! process_file (argv[optind++]))
19236       err = TRUE;
19237
19238   if (cmdline.dump_sects != NULL)
19239     free (cmdline.dump_sects);
19240
19241   return err ? EXIT_FAILURE : EXIT_SUCCESS;
19242 }