Remove cleanups from solib-target.c
[external/binutils.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2    Copyright (C) 1998-2019 Free Software Foundation, Inc.
3
4    Originally developed by Eric Youngdale <eric@andante.jic.com>
5    Modifications by Nick Clifton <nickc@redhat.com>
6
7    This file is part of GNU Binutils.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22    02110-1301, USA.  */
23 \f
24 /* The difference between readelf and objdump:
25
26   Both programs are capable of displaying the contents of ELF format files,
27   so why does the binutils project have two file dumpers ?
28
29   The reason is that objdump sees an ELF file through a BFD filter of the
30   world; if BFD has a bug where, say, it disagrees about a machine constant
31   in e_flags, then the odds are good that it will remain internally
32   consistent.  The linker sees it the BFD way, objdump sees it the BFD way,
33   GAS sees it the BFD way.  There was need for a tool to go find out what
34   the file actually says.
35
36   This is why the readelf program does not link against the BFD library - it
37   exists as an independent program to help verify the correct working of BFD.
38
39   There is also the case that readelf can provide more information about an
40   ELF file than is provided by objdump.  In particular it can display DWARF
41   debugging information which (at the moment) objdump cannot.  */
42 \f
43 #include "sysdep.h"
44 #include <assert.h>
45 #include <time.h>
46 #include <zlib.h>
47 #ifdef HAVE_WCHAR_H
48 #include <wchar.h>
49 #endif
50
51 #if __GNUC__ >= 2
52 /* Define BFD64 here, even if our default architecture is 32 bit ELF
53    as this will allow us to read in and parse 64bit and 32bit ELF files.
54    Only do this if we believe that the compiler can support a 64 bit
55    data type.  For now we only rely on GCC being able to do this.  */
56 #define BFD64
57 #endif
58
59 #include "bfd.h"
60 #include "bucomm.h"
61 #include "elfcomm.h"
62 #include "dwarf.h"
63
64 #include "elf/common.h"
65 #include "elf/external.h"
66 #include "elf/internal.h"
67
68
69 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
70    we can obtain the H8 reloc numbers.  We need these for the
71    get_reloc_size() function.  We include h8.h again after defining
72    RELOC_MACROS_GEN_FUNC so that we get the naming function as well.  */
73
74 #include "elf/h8.h"
75 #undef _ELF_H8_H
76
77 /* Undo the effects of #including reloc-macros.h.  */
78
79 #undef START_RELOC_NUMBERS
80 #undef RELOC_NUMBER
81 #undef FAKE_RELOC
82 #undef EMPTY_RELOC
83 #undef END_RELOC_NUMBERS
84 #undef _RELOC_MACROS_H
85
86 /* The following headers use the elf/reloc-macros.h file to
87    automatically generate relocation recognition functions
88    such as elf_mips_reloc_type()  */
89
90 #define RELOC_MACROS_GEN_FUNC
91
92 #include "elf/aarch64.h"
93 #include "elf/alpha.h"
94 #include "elf/arc.h"
95 #include "elf/arm.h"
96 #include "elf/avr.h"
97 #include "elf/bfin.h"
98 #include "elf/cr16.h"
99 #include "elf/cris.h"
100 #include "elf/crx.h"
101 #include "elf/csky.h"
102 #include "elf/d10v.h"
103 #include "elf/d30v.h"
104 #include "elf/dlx.h"
105 #include "elf/epiphany.h"
106 #include "elf/fr30.h"
107 #include "elf/frv.h"
108 #include "elf/ft32.h"
109 #include "elf/h8.h"
110 #include "elf/hppa.h"
111 #include "elf/i386.h"
112 #include "elf/i370.h"
113 #include "elf/i860.h"
114 #include "elf/i960.h"
115 #include "elf/ia64.h"
116 #include "elf/ip2k.h"
117 #include "elf/lm32.h"
118 #include "elf/iq2000.h"
119 #include "elf/m32c.h"
120 #include "elf/m32r.h"
121 #include "elf/m68k.h"
122 #include "elf/m68hc11.h"
123 #include "elf/s12z.h"
124 #include "elf/mcore.h"
125 #include "elf/mep.h"
126 #include "elf/metag.h"
127 #include "elf/microblaze.h"
128 #include "elf/mips.h"
129 #include "elf/mmix.h"
130 #include "elf/mn10200.h"
131 #include "elf/mn10300.h"
132 #include "elf/moxie.h"
133 #include "elf/mt.h"
134 #include "elf/msp430.h"
135 #include "elf/nds32.h"
136 #include "elf/nfp.h"
137 #include "elf/nios2.h"
138 #include "elf/or1k.h"
139 #include "elf/pj.h"
140 #include "elf/ppc.h"
141 #include "elf/ppc64.h"
142 #include "elf/pru.h"
143 #include "elf/riscv.h"
144 #include "elf/rl78.h"
145 #include "elf/rx.h"
146 #include "elf/s390.h"
147 #include "elf/score.h"
148 #include "elf/sh.h"
149 #include "elf/sparc.h"
150 #include "elf/spu.h"
151 #include "elf/tic6x.h"
152 #include "elf/tilegx.h"
153 #include "elf/tilepro.h"
154 #include "elf/v850.h"
155 #include "elf/vax.h"
156 #include "elf/visium.h"
157 #include "elf/wasm32.h"
158 #include "elf/x86-64.h"
159 #include "elf/xc16x.h"
160 #include "elf/xgate.h"
161 #include "elf/xstormy16.h"
162 #include "elf/xtensa.h"
163
164 #include "getopt.h"
165 #include "libiberty.h"
166 #include "safe-ctype.h"
167 #include "filenames.h"
168
169 #ifndef offsetof
170 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
171 #endif
172
173 typedef struct elf_section_list
174 {
175   Elf_Internal_Shdr *        hdr;
176   struct elf_section_list *  next;
177 } elf_section_list;
178
179 /* Flag bits indicating particular types of dump.  */
180 #define HEX_DUMP        (1 << 0)        /* The -x command line switch.  */
181 #define DISASS_DUMP     (1 << 1)        /* The -i command line switch.  */
182 #define DEBUG_DUMP      (1 << 2)        /* The -w command line switch.  */
183 #define STRING_DUMP     (1 << 3)        /* The -p command line switch.  */
184 #define RELOC_DUMP      (1 << 4)        /* The -R command line switch.  */
185
186 typedef unsigned char dump_type;
187
188 /* A linked list of the section names for which dumps were requested.  */
189 struct dump_list_entry
190 {
191   char *                    name;
192   dump_type                 type;
193   struct dump_list_entry *  next;
194 };
195
196 typedef struct filedata
197 {
198   const char *         file_name;
199   FILE *               handle;
200   bfd_size_type        file_size;
201   Elf_Internal_Ehdr    file_header;
202   Elf_Internal_Shdr *  section_headers;
203   Elf_Internal_Phdr *  program_headers;
204   char *               string_table;
205   unsigned long        string_table_length;
206   /* A dynamic array of flags indicating for which sections a dump of
207      some kind has been requested.  It is reset on a per-object file
208      basis and then initialised from the cmdline_dump_sects array,
209      the results of interpreting the -w switch, and the
210      dump_sects_byname list.  */
211   dump_type *          dump_sects;
212   unsigned int         num_dump_sects;
213 } Filedata;
214
215 char * program_name = "readelf";
216
217 static unsigned long archive_file_offset;
218 static unsigned long archive_file_size;
219 static unsigned long dynamic_addr;
220 static bfd_size_type dynamic_size;
221 static size_t dynamic_nent;
222 static char * dynamic_strings;
223 static unsigned long dynamic_strings_length;
224 static unsigned long num_dynamic_syms;
225 static Elf_Internal_Sym * dynamic_symbols;
226 static Elf_Internal_Syminfo * dynamic_syminfo;
227 static unsigned long dynamic_syminfo_offset;
228 static unsigned int dynamic_syminfo_nent;
229 static char program_interpreter[PATH_MAX];
230 static bfd_vma dynamic_info[DT_ENCODING];
231 static bfd_vma dynamic_info_DT_GNU_HASH;
232 static bfd_vma version_info[16];
233 static Elf_Internal_Dyn *  dynamic_section;
234 static elf_section_list * symtab_shndx_list;
235 static bfd_boolean show_name = FALSE;
236 static bfd_boolean do_dynamic = FALSE;
237 static bfd_boolean do_syms = FALSE;
238 static bfd_boolean do_dyn_syms = FALSE;
239 static bfd_boolean do_reloc = FALSE;
240 static bfd_boolean do_sections = FALSE;
241 static bfd_boolean do_section_groups = FALSE;
242 static bfd_boolean do_section_details = FALSE;
243 static bfd_boolean do_segments = FALSE;
244 static bfd_boolean do_unwind = FALSE;
245 static bfd_boolean do_using_dynamic = FALSE;
246 static bfd_boolean do_header = FALSE;
247 static bfd_boolean do_dump = FALSE;
248 static bfd_boolean do_version = FALSE;
249 static bfd_boolean do_histogram = FALSE;
250 static bfd_boolean do_debugging = FALSE;
251 static bfd_boolean do_arch = FALSE;
252 static bfd_boolean do_notes = FALSE;
253 static bfd_boolean do_archive_index = FALSE;
254 static bfd_boolean is_32bit_elf = FALSE;
255 static bfd_boolean decompress_dumps = FALSE;
256
257 struct group_list
258 {
259   struct group_list *  next;
260   unsigned int         section_index;
261 };
262
263 struct group
264 {
265   struct group_list *  root;
266   unsigned int         group_index;
267 };
268
269 static size_t           group_count;
270 static struct group *   section_groups;
271 static struct group **  section_headers_groups;
272
273 /* A dynamic array of flags indicating for which sections a dump
274    has been requested via command line switches.  */
275 static Filedata         cmdline;
276
277 static struct dump_list_entry * dump_sects_byname;
278
279 /* How to print a vma value.  */
280 typedef enum print_mode
281 {
282   HEX,
283   DEC,
284   DEC_5,
285   UNSIGNED,
286   PREFIX_HEX,
287   FULL_HEX,
288   LONG_HEX
289 }
290 print_mode;
291
292 /* Versioned symbol info.  */
293 enum versioned_symbol_info
294 {
295   symbol_undefined,
296   symbol_hidden,
297   symbol_public
298 };
299
300 static const char * get_symbol_version_string
301   (Filedata *, bfd_boolean, const char *, unsigned long, unsigned,
302    Elf_Internal_Sym *, enum versioned_symbol_info *, unsigned short *);
303
304 #define UNKNOWN -1
305
306 #define SECTION_NAME(X)                                         \
307   ((X) == NULL ? _("<none>")                                    \
308    : filedata->string_table == NULL ? _("<no-strings>")         \
309    : ((X)->sh_name >= filedata->string_table_length ? _("<corrupt>")    \
310   : filedata->string_table + (X)->sh_name))
311
312 #define DT_VERSIONTAGIDX(tag)   (DT_VERNEEDNUM - (tag)) /* Reverse order!  */
313
314 #define GET_ELF_SYMBOLS(file, section, sym_count)                       \
315   (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count)      \
316    : get_64bit_elf_symbols (file, section, sym_count))
317
318 #define VALID_DYNAMIC_NAME(offset)      ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
319 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
320    already been called and verified that the string exists.  */
321 #define GET_DYNAMIC_NAME(offset)        (dynamic_strings + offset)
322
323 #define REMOVE_ARCH_BITS(ADDR)                  \
324   do                                            \
325     {                                           \
326       if (filedata->file_header.e_machine == EM_ARM)    \
327         (ADDR) &= ~1;                           \
328     }                                           \
329   while (0)
330 \f
331 /* Print a BFD_VMA to an internal buffer, for use in error messages.
332    BFD_FMA_FMT can't be used in translated strings.  */
333
334 static const char *
335 bfd_vmatoa (char *fmtch, bfd_vma value)
336 {
337   /* bfd_vmatoa is used more then once in a printf call for output.
338      Cycle through an array of buffers.  */
339   static int buf_pos = 0;
340   static struct bfd_vmatoa_buf
341   {
342     char place[64];
343   } buf[4];
344   char *ret;
345   char fmt[32];
346
347   ret = buf[buf_pos++].place;
348   buf_pos %= ARRAY_SIZE (buf);
349
350   sprintf (fmt, "%%%s%s", BFD_VMA_FMT, fmtch);
351   snprintf (ret, sizeof (buf[0].place), fmt, value);
352   return ret;
353 }
354
355 /* Retrieve NMEMB structures, each SIZE bytes long from FILEDATA starting at
356    OFFSET + the offset of the current archive member, if we are examining an
357    archive.  Put the retrieved data into VAR, if it is not NULL.  Otherwise
358    allocate a buffer using malloc and fill that.  In either case return the
359    pointer to the start of the retrieved data or NULL if something went wrong.
360    If something does go wrong and REASON is not NULL then emit an error
361    message using REASON as part of the context.  */
362
363 static void *
364 get_data (void *         var,
365           Filedata *     filedata,
366           unsigned long  offset,
367           bfd_size_type  size,
368           bfd_size_type  nmemb,
369           const char *   reason)
370 {
371   void * mvar;
372   bfd_size_type amt = size * nmemb;
373
374   if (size == 0 || nmemb == 0)
375     return NULL;
376
377   /* If the size_t type is smaller than the bfd_size_type, eg because
378      you are building a 32-bit tool on a 64-bit host, then make sure
379      that when the sizes are cast to (size_t) no information is lost.  */
380   if (sizeof (size_t) < sizeof (bfd_size_type)
381       && (   (bfd_size_type) ((size_t) size) != size
382           || (bfd_size_type) ((size_t) nmemb) != nmemb))
383     {
384       if (reason)
385         error (_("Size truncation prevents reading %s"
386                  " elements of size %s for %s\n"),
387                bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
388       return NULL;
389     }
390
391   /* Check for size overflow.  */
392   if (amt < nmemb)
393     {
394       if (reason)
395         error (_("Size overflow prevents reading %s"
396                  " elements of size %s for %s\n"),
397                bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
398       return NULL;
399     }
400
401   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
402      attempting to allocate memory when the read is bound to fail.  */
403   if (amt > filedata->file_size
404       || offset + archive_file_offset + amt > filedata->file_size)
405     {
406       if (reason)
407         error (_("Reading %s bytes extends past end of file for %s\n"),
408                bfd_vmatoa ("u", amt), reason);
409       return NULL;
410     }
411
412   if (fseek (filedata->handle, archive_file_offset + offset, SEEK_SET))
413     {
414       if (reason)
415         error (_("Unable to seek to 0x%lx for %s\n"),
416                archive_file_offset + offset, reason);
417       return NULL;
418     }
419
420   mvar = var;
421   if (mvar == NULL)
422     {
423       /* Check for overflow.  */
424       if (nmemb < (~(bfd_size_type) 0 - 1) / size)
425         /* + 1 so that we can '\0' terminate invalid string table sections.  */
426         mvar = malloc ((size_t) amt + 1);
427
428       if (mvar == NULL)
429         {
430           if (reason)
431             error (_("Out of memory allocating %s bytes for %s\n"),
432                    bfd_vmatoa ("u", amt), reason);
433           return NULL;
434         }
435
436       ((char *) mvar)[amt] = '\0';
437     }
438
439   if (fread (mvar, (size_t) size, (size_t) nmemb, filedata->handle) != nmemb)
440     {
441       if (reason)
442         error (_("Unable to read in %s bytes of %s\n"),
443                bfd_vmatoa ("u", amt), reason);
444       if (mvar != var)
445         free (mvar);
446       return NULL;
447     }
448
449   return mvar;
450 }
451
452 /* Print a VMA value in the MODE specified.
453    Returns the number of characters displayed.  */
454
455 static unsigned int
456 print_vma (bfd_vma vma, print_mode mode)
457 {
458   unsigned int nc = 0;
459
460   switch (mode)
461     {
462     case FULL_HEX:
463       nc = printf ("0x");
464       /* Fall through.  */
465     case LONG_HEX:
466 #ifdef BFD64
467       if (is_32bit_elf)
468         return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
469 #endif
470       printf_vma (vma);
471       return nc + 16;
472
473     case DEC_5:
474       if (vma <= 99999)
475         return printf ("%5" BFD_VMA_FMT "d", vma);
476       /* Fall through.  */
477     case PREFIX_HEX:
478       nc = printf ("0x");
479       /* Fall through.  */
480     case HEX:
481       return nc + printf ("%" BFD_VMA_FMT "x", vma);
482
483     case DEC:
484       return printf ("%" BFD_VMA_FMT "d", vma);
485
486     case UNSIGNED:
487       return printf ("%" BFD_VMA_FMT "u", vma);
488
489     default:
490       /* FIXME: Report unrecognised mode ?  */
491       return 0;
492     }
493 }
494
495 /* Display a symbol on stdout.  Handles the display of control characters and
496    multibye characters (assuming the host environment supports them).
497
498    Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
499
500    If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
501    padding as necessary.
502
503    Returns the number of emitted characters.  */
504
505 static unsigned int
506 print_symbol (signed int width, const char *symbol)
507 {
508   bfd_boolean extra_padding = FALSE;
509   signed int num_printed = 0;
510 #ifdef HAVE_MBSTATE_T
511   mbstate_t state;
512 #endif
513   unsigned int width_remaining;
514
515   if (width < 0)
516     {
517       /* Keep the width positive.  This helps the code below.  */
518       width = - width;
519       extra_padding = TRUE;
520     }
521   else if (width == 0)
522     return 0;
523
524   if (do_wide)
525     /* Set the remaining width to a very large value.
526        This simplifies the code below.  */
527     width_remaining = INT_MAX;
528   else
529     width_remaining = width;
530
531 #ifdef HAVE_MBSTATE_T
532   /* Initialise the multibyte conversion state.  */
533   memset (& state, 0, sizeof (state));
534 #endif
535
536   while (width_remaining)
537     {
538       size_t  n;
539       const char c = *symbol++;
540
541       if (c == 0)
542         break;
543
544       /* Do not print control characters directly as they can affect terminal
545          settings.  Such characters usually appear in the names generated
546          by the assembler for local labels.  */
547       if (ISCNTRL (c))
548         {
549           if (width_remaining < 2)
550             break;
551
552           printf ("^%c", c + 0x40);
553           width_remaining -= 2;
554           num_printed += 2;
555         }
556       else if (ISPRINT (c))
557         {
558           putchar (c);
559           width_remaining --;
560           num_printed ++;
561         }
562       else
563         {
564 #ifdef HAVE_MBSTATE_T
565           wchar_t w;
566 #endif
567           /* Let printf do the hard work of displaying multibyte characters.  */
568           printf ("%.1s", symbol - 1);
569           width_remaining --;
570           num_printed ++;
571
572 #ifdef HAVE_MBSTATE_T
573           /* Try to find out how many bytes made up the character that was
574              just printed.  Advance the symbol pointer past the bytes that
575              were displayed.  */
576           n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
577 #else
578           n = 1;
579 #endif
580           if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
581             symbol += (n - 1);
582         }
583     }
584
585   if (extra_padding && num_printed < width)
586     {
587       /* Fill in the remaining spaces.  */
588       printf ("%-*s", width - num_printed, " ");
589       num_printed = width;
590     }
591
592   return num_printed;
593 }
594
595 /* Returns a pointer to a static buffer containing a printable version of
596    the given section's name.  Like print_symbol, except that it does not try
597    to print multibyte characters, it just interprets them as hex values.  */
598
599 static const char *
600 printable_section_name (Filedata * filedata, const Elf_Internal_Shdr * sec)
601 {
602 #define MAX_PRINT_SEC_NAME_LEN 128
603   static char  sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
604   const char * name = SECTION_NAME (sec);
605   char *       buf = sec_name_buf;
606   char         c;
607   unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
608
609   while ((c = * name ++) != 0)
610     {
611       if (ISCNTRL (c))
612         {
613           if (remaining < 2)
614             break;
615
616           * buf ++ = '^';
617           * buf ++ = c + 0x40;
618           remaining -= 2;
619         }
620       else if (ISPRINT (c))
621         {
622           * buf ++ = c;
623           remaining -= 1;
624         }
625       else
626         {
627           static char hex[17] = "0123456789ABCDEF";
628
629           if (remaining < 4)
630             break;
631           * buf ++ = '<';
632           * buf ++ = hex[(c & 0xf0) >> 4];
633           * buf ++ = hex[c & 0x0f];
634           * buf ++ = '>';
635           remaining -= 4;
636         }
637
638       if (remaining == 0)
639         break;
640     }
641
642   * buf = 0;
643   return sec_name_buf;
644 }
645
646 static const char *
647 printable_section_name_from_index (Filedata * filedata, unsigned long ndx)
648 {
649   if (ndx >= filedata->file_header.e_shnum)
650     return _("<corrupt>");
651
652   return printable_section_name (filedata, filedata->section_headers + ndx);
653 }
654
655 /* Return a pointer to section NAME, or NULL if no such section exists.  */
656
657 static Elf_Internal_Shdr *
658 find_section (Filedata * filedata, const char * name)
659 {
660   unsigned int i;
661
662   if (filedata->section_headers == NULL)
663     return NULL;
664
665   for (i = 0; i < filedata->file_header.e_shnum; i++)
666     if (streq (SECTION_NAME (filedata->section_headers + i), name))
667       return filedata->section_headers + i;
668
669   return NULL;
670 }
671
672 /* Return a pointer to a section containing ADDR, or NULL if no such
673    section exists.  */
674
675 static Elf_Internal_Shdr *
676 find_section_by_address (Filedata * filedata, bfd_vma addr)
677 {
678   unsigned int i;
679
680   if (filedata->section_headers == NULL)
681     return NULL;
682
683   for (i = 0; i < filedata->file_header.e_shnum; i++)
684     {
685       Elf_Internal_Shdr *sec = filedata->section_headers + i;
686
687       if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
688         return sec;
689     }
690
691   return NULL;
692 }
693
694 static Elf_Internal_Shdr *
695 find_section_by_type (Filedata * filedata, unsigned int type)
696 {
697   unsigned int i;
698
699   if (filedata->section_headers == NULL)
700     return NULL;
701
702   for (i = 0; i < filedata->file_header.e_shnum; i++)
703     {
704       Elf_Internal_Shdr *sec = filedata->section_headers + i;
705
706       if (sec->sh_type == type)
707         return sec;
708     }
709
710   return NULL;
711 }
712
713 /* Return a pointer to section NAME, or NULL if no such section exists,
714    restricted to the list of sections given in SET.  */
715
716 static Elf_Internal_Shdr *
717 find_section_in_set (Filedata * filedata, const char * name, unsigned int * set)
718 {
719   unsigned int i;
720
721   if (filedata->section_headers == NULL)
722     return NULL;
723
724   if (set != NULL)
725     {
726       while ((i = *set++) > 0)
727         {
728           /* See PR 21156 for a reproducer.  */
729           if (i >= filedata->file_header.e_shnum)
730             continue; /* FIXME: Should we issue an error message ?  */
731
732           if (streq (SECTION_NAME (filedata->section_headers + i), name))
733             return filedata->section_headers + i;
734         }
735     }
736
737   return find_section (filedata, name);
738 }
739
740 /* Read an unsigned LEB128 encoded value from DATA.
741    Set *LENGTH_RETURN to the number of bytes read.  */
742
743 static inline unsigned long
744 read_uleb128 (unsigned char * data,
745               unsigned int * length_return,
746               const unsigned char * const end)
747 {
748   return read_leb128 (data, length_return, FALSE, end);
749 }
750
751 /* Return TRUE if the current file is for IA-64 machine and OpenVMS ABI.
752    This OS has so many departures from the ELF standard that we test it at
753    many places.  */
754
755 static inline bfd_boolean
756 is_ia64_vms (Filedata * filedata)
757 {
758   return filedata->file_header.e_machine == EM_IA_64
759     && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
760 }
761
762 /* Guess the relocation size commonly used by the specific machines.  */
763
764 static bfd_boolean
765 guess_is_rela (unsigned int e_machine)
766 {
767   switch (e_machine)
768     {
769       /* Targets that use REL relocations.  */
770     case EM_386:
771     case EM_IAMCU:
772     case EM_960:
773     case EM_ARM:
774     case EM_D10V:
775     case EM_CYGNUS_D10V:
776     case EM_DLX:
777     case EM_MIPS:
778     case EM_MIPS_RS3_LE:
779     case EM_CYGNUS_M32R:
780     case EM_SCORE:
781     case EM_XGATE:
782     case EM_NFP:
783       return FALSE;
784
785       /* Targets that use RELA relocations.  */
786     case EM_68K:
787     case EM_860:
788     case EM_AARCH64:
789     case EM_ADAPTEVA_EPIPHANY:
790     case EM_ALPHA:
791     case EM_ALTERA_NIOS2:
792     case EM_ARC:
793     case EM_ARC_COMPACT:
794     case EM_ARC_COMPACT2:
795     case EM_AVR:
796     case EM_AVR_OLD:
797     case EM_BLACKFIN:
798     case EM_CR16:
799     case EM_CRIS:
800     case EM_CRX:
801     case EM_CSKY:
802     case EM_D30V:
803     case EM_CYGNUS_D30V:
804     case EM_FR30:
805     case EM_FT32:
806     case EM_CYGNUS_FR30:
807     case EM_CYGNUS_FRV:
808     case EM_H8S:
809     case EM_H8_300:
810     case EM_H8_300H:
811     case EM_IA_64:
812     case EM_IP2K:
813     case EM_IP2K_OLD:
814     case EM_IQ2000:
815     case EM_LATTICEMICO32:
816     case EM_M32C_OLD:
817     case EM_M32C:
818     case EM_M32R:
819     case EM_MCORE:
820     case EM_CYGNUS_MEP:
821     case EM_METAG:
822     case EM_MMIX:
823     case EM_MN10200:
824     case EM_CYGNUS_MN10200:
825     case EM_MN10300:
826     case EM_CYGNUS_MN10300:
827     case EM_MOXIE:
828     case EM_MSP430:
829     case EM_MSP430_OLD:
830     case EM_MT:
831     case EM_NDS32:
832     case EM_NIOS32:
833     case EM_OR1K:
834     case EM_PPC64:
835     case EM_PPC:
836     case EM_TI_PRU:
837     case EM_RISCV:
838     case EM_RL78:
839     case EM_RX:
840     case EM_S390:
841     case EM_S390_OLD:
842     case EM_SH:
843     case EM_SPARC:
844     case EM_SPARC32PLUS:
845     case EM_SPARCV9:
846     case EM_SPU:
847     case EM_TI_C6000:
848     case EM_TILEGX:
849     case EM_TILEPRO:
850     case EM_V800:
851     case EM_V850:
852     case EM_CYGNUS_V850:
853     case EM_VAX:
854     case EM_VISIUM:
855     case EM_X86_64:
856     case EM_L1OM:
857     case EM_K1OM:
858     case EM_XSTORMY16:
859     case EM_XTENSA:
860     case EM_XTENSA_OLD:
861     case EM_MICROBLAZE:
862     case EM_MICROBLAZE_OLD:
863     case EM_WEBASSEMBLY:
864       return TRUE;
865
866     case EM_68HC05:
867     case EM_68HC08:
868     case EM_68HC11:
869     case EM_68HC16:
870     case EM_FX66:
871     case EM_ME16:
872     case EM_MMA:
873     case EM_NCPU:
874     case EM_NDR1:
875     case EM_PCP:
876     case EM_ST100:
877     case EM_ST19:
878     case EM_ST7:
879     case EM_ST9PLUS:
880     case EM_STARCORE:
881     case EM_SVX:
882     case EM_TINYJ:
883     default:
884       warn (_("Don't know about relocations on this machine architecture\n"));
885       return FALSE;
886     }
887 }
888
889 /* Load RELA type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
890    Returns TRUE upon success, FALSE otherwise.  If successful then a
891    pointer to a malloc'ed buffer containing the relocs is placed in *RELASP,
892    and the number of relocs loaded is placed in *NRELASP.  It is the caller's
893    responsibility to free the allocated buffer.  */
894
895 static bfd_boolean
896 slurp_rela_relocs (Filedata *            filedata,
897                    unsigned long         rel_offset,
898                    unsigned long         rel_size,
899                    Elf_Internal_Rela **  relasp,
900                    unsigned long *       nrelasp)
901 {
902   Elf_Internal_Rela * relas;
903   size_t nrelas;
904   unsigned int i;
905
906   if (is_32bit_elf)
907     {
908       Elf32_External_Rela * erelas;
909
910       erelas = (Elf32_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
911                                                  rel_size, _("32-bit relocation data"));
912       if (!erelas)
913         return FALSE;
914
915       nrelas = rel_size / sizeof (Elf32_External_Rela);
916
917       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
918                                              sizeof (Elf_Internal_Rela));
919
920       if (relas == NULL)
921         {
922           free (erelas);
923           error (_("out of memory parsing relocs\n"));
924           return FALSE;
925         }
926
927       for (i = 0; i < nrelas; i++)
928         {
929           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
930           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
931           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
932         }
933
934       free (erelas);
935     }
936   else
937     {
938       Elf64_External_Rela * erelas;
939
940       erelas = (Elf64_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
941                                                  rel_size, _("64-bit relocation data"));
942       if (!erelas)
943         return FALSE;
944
945       nrelas = rel_size / sizeof (Elf64_External_Rela);
946
947       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
948                                              sizeof (Elf_Internal_Rela));
949
950       if (relas == NULL)
951         {
952           free (erelas);
953           error (_("out of memory parsing relocs\n"));
954           return FALSE;
955         }
956
957       for (i = 0; i < nrelas; i++)
958         {
959           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
960           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
961           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
962
963           /* The #ifdef BFD64 below is to prevent a compile time
964              warning.  We know that if we do not have a 64 bit data
965              type that we will never execute this code anyway.  */
966 #ifdef BFD64
967           if (filedata->file_header.e_machine == EM_MIPS
968               && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
969             {
970               /* In little-endian objects, r_info isn't really a
971                  64-bit little-endian value: it has a 32-bit
972                  little-endian symbol index followed by four
973                  individual byte fields.  Reorder INFO
974                  accordingly.  */
975               bfd_vma inf = relas[i].r_info;
976               inf = (((inf & 0xffffffff) << 32)
977                       | ((inf >> 56) & 0xff)
978                       | ((inf >> 40) & 0xff00)
979                       | ((inf >> 24) & 0xff0000)
980                       | ((inf >> 8) & 0xff000000));
981               relas[i].r_info = inf;
982             }
983 #endif /* BFD64 */
984         }
985
986       free (erelas);
987     }
988
989   *relasp = relas;
990   *nrelasp = nrelas;
991   return TRUE;
992 }
993
994 /* Load REL type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
995    Returns TRUE upon success, FALSE otherwise.  If successful then a
996    pointer to a malloc'ed buffer containing the relocs is placed in *RELSP,
997    and the number of relocs loaded is placed in *NRELSP.  It is the caller's
998    responsibility to free the allocated buffer.  */
999
1000 static bfd_boolean
1001 slurp_rel_relocs (Filedata *            filedata,
1002                   unsigned long         rel_offset,
1003                   unsigned long         rel_size,
1004                   Elf_Internal_Rela **  relsp,
1005                   unsigned long *       nrelsp)
1006 {
1007   Elf_Internal_Rela * rels;
1008   size_t nrels;
1009   unsigned int i;
1010
1011   if (is_32bit_elf)
1012     {
1013       Elf32_External_Rel * erels;
1014
1015       erels = (Elf32_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1016                                                rel_size, _("32-bit relocation data"));
1017       if (!erels)
1018         return FALSE;
1019
1020       nrels = rel_size / sizeof (Elf32_External_Rel);
1021
1022       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1023
1024       if (rels == NULL)
1025         {
1026           free (erels);
1027           error (_("out of memory parsing relocs\n"));
1028           return FALSE;
1029         }
1030
1031       for (i = 0; i < nrels; i++)
1032         {
1033           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1034           rels[i].r_info   = BYTE_GET (erels[i].r_info);
1035           rels[i].r_addend = 0;
1036         }
1037
1038       free (erels);
1039     }
1040   else
1041     {
1042       Elf64_External_Rel * erels;
1043
1044       erels = (Elf64_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1045                                                rel_size, _("64-bit relocation data"));
1046       if (!erels)
1047         return FALSE;
1048
1049       nrels = rel_size / sizeof (Elf64_External_Rel);
1050
1051       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1052
1053       if (rels == NULL)
1054         {
1055           free (erels);
1056           error (_("out of memory parsing relocs\n"));
1057           return FALSE;
1058         }
1059
1060       for (i = 0; i < nrels; i++)
1061         {
1062           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1063           rels[i].r_info   = BYTE_GET (erels[i].r_info);
1064           rels[i].r_addend = 0;
1065
1066           /* The #ifdef BFD64 below is to prevent a compile time
1067              warning.  We know that if we do not have a 64 bit data
1068              type that we will never execute this code anyway.  */
1069 #ifdef BFD64
1070           if (filedata->file_header.e_machine == EM_MIPS
1071               && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
1072             {
1073               /* In little-endian objects, r_info isn't really a
1074                  64-bit little-endian value: it has a 32-bit
1075                  little-endian symbol index followed by four
1076                  individual byte fields.  Reorder INFO
1077                  accordingly.  */
1078               bfd_vma inf = rels[i].r_info;
1079               inf = (((inf & 0xffffffff) << 32)
1080                      | ((inf >> 56) & 0xff)
1081                      | ((inf >> 40) & 0xff00)
1082                      | ((inf >> 24) & 0xff0000)
1083                      | ((inf >> 8) & 0xff000000));
1084               rels[i].r_info = inf;
1085             }
1086 #endif /* BFD64 */
1087         }
1088
1089       free (erels);
1090     }
1091
1092   *relsp = rels;
1093   *nrelsp = nrels;
1094   return TRUE;
1095 }
1096
1097 /* Returns the reloc type extracted from the reloc info field.  */
1098
1099 static unsigned int
1100 get_reloc_type (Filedata * filedata, bfd_vma reloc_info)
1101 {
1102   if (is_32bit_elf)
1103     return ELF32_R_TYPE (reloc_info);
1104
1105   switch (filedata->file_header.e_machine)
1106     {
1107     case EM_MIPS:
1108       /* Note: We assume that reloc_info has already been adjusted for us.  */
1109       return ELF64_MIPS_R_TYPE (reloc_info);
1110
1111     case EM_SPARCV9:
1112       return ELF64_R_TYPE_ID (reloc_info);
1113
1114     default:
1115       return ELF64_R_TYPE (reloc_info);
1116     }
1117 }
1118
1119 /* Return the symbol index extracted from the reloc info field.  */
1120
1121 static bfd_vma
1122 get_reloc_symindex (bfd_vma reloc_info)
1123 {
1124   return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1125 }
1126
1127 static inline bfd_boolean
1128 uses_msp430x_relocs (Filedata * filedata)
1129 {
1130   return
1131     filedata->file_header.e_machine == EM_MSP430 /* Paranoia.  */
1132     /* GCC uses osabi == ELFOSBI_STANDALONE.  */
1133     && (((filedata->file_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1134         /* TI compiler uses ELFOSABI_NONE.  */
1135         || (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1136 }
1137
1138 /* Display the contents of the relocation data found at the specified
1139    offset.  */
1140
1141 static bfd_boolean
1142 dump_relocations (Filedata *          filedata,
1143                   unsigned long       rel_offset,
1144                   unsigned long       rel_size,
1145                   Elf_Internal_Sym *  symtab,
1146                   unsigned long       nsyms,
1147                   char *              strtab,
1148                   unsigned long       strtablen,
1149                   int                 is_rela,
1150                   bfd_boolean         is_dynsym)
1151 {
1152   unsigned long i;
1153   Elf_Internal_Rela * rels;
1154   bfd_boolean res = TRUE;
1155
1156   if (is_rela == UNKNOWN)
1157     is_rela = guess_is_rela (filedata->file_header.e_machine);
1158
1159   if (is_rela)
1160     {
1161       if (!slurp_rela_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1162         return FALSE;
1163     }
1164   else
1165     {
1166       if (!slurp_rel_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1167         return FALSE;
1168     }
1169
1170   if (is_32bit_elf)
1171     {
1172       if (is_rela)
1173         {
1174           if (do_wide)
1175             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name + Addend\n"));
1176           else
1177             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name + Addend\n"));
1178         }
1179       else
1180         {
1181           if (do_wide)
1182             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name\n"));
1183           else
1184             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name\n"));
1185         }
1186     }
1187   else
1188     {
1189       if (is_rela)
1190         {
1191           if (do_wide)
1192             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend\n"));
1193           else
1194             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name + Addend\n"));
1195         }
1196       else
1197         {
1198           if (do_wide)
1199             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name\n"));
1200           else
1201             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name\n"));
1202         }
1203     }
1204
1205   for (i = 0; i < rel_size; i++)
1206     {
1207       const char * rtype;
1208       bfd_vma offset;
1209       bfd_vma inf;
1210       bfd_vma symtab_index;
1211       bfd_vma type;
1212
1213       offset = rels[i].r_offset;
1214       inf    = rels[i].r_info;
1215
1216       type = get_reloc_type (filedata, inf);
1217       symtab_index = get_reloc_symindex  (inf);
1218
1219       if (is_32bit_elf)
1220         {
1221           printf ("%8.8lx  %8.8lx ",
1222                   (unsigned long) offset & 0xffffffff,
1223                   (unsigned long) inf & 0xffffffff);
1224         }
1225       else
1226         {
1227 #if BFD_HOST_64BIT_LONG
1228           printf (do_wide
1229                   ? "%16.16lx  %16.16lx "
1230                   : "%12.12lx  %12.12lx ",
1231                   offset, inf);
1232 #elif BFD_HOST_64BIT_LONG_LONG
1233 #ifndef __MSVCRT__
1234           printf (do_wide
1235                   ? "%16.16llx  %16.16llx "
1236                   : "%12.12llx  %12.12llx ",
1237                   offset, inf);
1238 #else
1239           printf (do_wide
1240                   ? "%16.16I64x  %16.16I64x "
1241                   : "%12.12I64x  %12.12I64x ",
1242                   offset, inf);
1243 #endif
1244 #else
1245           printf (do_wide
1246                   ? "%8.8lx%8.8lx  %8.8lx%8.8lx "
1247                   : "%4.4lx%8.8lx  %4.4lx%8.8lx ",
1248                   _bfd_int64_high (offset),
1249                   _bfd_int64_low (offset),
1250                   _bfd_int64_high (inf),
1251                   _bfd_int64_low (inf));
1252 #endif
1253         }
1254
1255       switch (filedata->file_header.e_machine)
1256         {
1257         default:
1258           rtype = NULL;
1259           break;
1260
1261         case EM_AARCH64:
1262           rtype = elf_aarch64_reloc_type (type);
1263           break;
1264
1265         case EM_M32R:
1266         case EM_CYGNUS_M32R:
1267           rtype = elf_m32r_reloc_type (type);
1268           break;
1269
1270         case EM_386:
1271         case EM_IAMCU:
1272           rtype = elf_i386_reloc_type (type);
1273           break;
1274
1275         case EM_68HC11:
1276         case EM_68HC12:
1277           rtype = elf_m68hc11_reloc_type (type);
1278           break;
1279
1280         case EM_S12Z:
1281           rtype = elf_s12z_reloc_type (type);
1282           break;
1283
1284         case EM_68K:
1285           rtype = elf_m68k_reloc_type (type);
1286           break;
1287
1288         case EM_960:
1289           rtype = elf_i960_reloc_type (type);
1290           break;
1291
1292         case EM_AVR:
1293         case EM_AVR_OLD:
1294           rtype = elf_avr_reloc_type (type);
1295           break;
1296
1297         case EM_OLD_SPARCV9:
1298         case EM_SPARC32PLUS:
1299         case EM_SPARCV9:
1300         case EM_SPARC:
1301           rtype = elf_sparc_reloc_type (type);
1302           break;
1303
1304         case EM_SPU:
1305           rtype = elf_spu_reloc_type (type);
1306           break;
1307
1308         case EM_V800:
1309           rtype = v800_reloc_type (type);
1310           break;
1311         case EM_V850:
1312         case EM_CYGNUS_V850:
1313           rtype = v850_reloc_type (type);
1314           break;
1315
1316         case EM_D10V:
1317         case EM_CYGNUS_D10V:
1318           rtype = elf_d10v_reloc_type (type);
1319           break;
1320
1321         case EM_D30V:
1322         case EM_CYGNUS_D30V:
1323           rtype = elf_d30v_reloc_type (type);
1324           break;
1325
1326         case EM_DLX:
1327           rtype = elf_dlx_reloc_type (type);
1328           break;
1329
1330         case EM_SH:
1331           rtype = elf_sh_reloc_type (type);
1332           break;
1333
1334         case EM_MN10300:
1335         case EM_CYGNUS_MN10300:
1336           rtype = elf_mn10300_reloc_type (type);
1337           break;
1338
1339         case EM_MN10200:
1340         case EM_CYGNUS_MN10200:
1341           rtype = elf_mn10200_reloc_type (type);
1342           break;
1343
1344         case EM_FR30:
1345         case EM_CYGNUS_FR30:
1346           rtype = elf_fr30_reloc_type (type);
1347           break;
1348
1349         case EM_CYGNUS_FRV:
1350           rtype = elf_frv_reloc_type (type);
1351           break;
1352
1353         case EM_CSKY:
1354           rtype = elf_csky_reloc_type (type);
1355           break;
1356
1357         case EM_FT32:
1358           rtype = elf_ft32_reloc_type (type);
1359           break;
1360
1361         case EM_MCORE:
1362           rtype = elf_mcore_reloc_type (type);
1363           break;
1364
1365         case EM_MMIX:
1366           rtype = elf_mmix_reloc_type (type);
1367           break;
1368
1369         case EM_MOXIE:
1370           rtype = elf_moxie_reloc_type (type);
1371           break;
1372
1373         case EM_MSP430:
1374           if (uses_msp430x_relocs (filedata))
1375             {
1376               rtype = elf_msp430x_reloc_type (type);
1377               break;
1378             }
1379           /* Fall through.  */
1380         case EM_MSP430_OLD:
1381           rtype = elf_msp430_reloc_type (type);
1382           break;
1383
1384         case EM_NDS32:
1385           rtype = elf_nds32_reloc_type (type);
1386           break;
1387
1388         case EM_PPC:
1389           rtype = elf_ppc_reloc_type (type);
1390           break;
1391
1392         case EM_PPC64:
1393           rtype = elf_ppc64_reloc_type (type);
1394           break;
1395
1396         case EM_MIPS:
1397         case EM_MIPS_RS3_LE:
1398           rtype = elf_mips_reloc_type (type);
1399           break;
1400
1401         case EM_RISCV:
1402           rtype = elf_riscv_reloc_type (type);
1403           break;
1404
1405         case EM_ALPHA:
1406           rtype = elf_alpha_reloc_type (type);
1407           break;
1408
1409         case EM_ARM:
1410           rtype = elf_arm_reloc_type (type);
1411           break;
1412
1413         case EM_ARC:
1414         case EM_ARC_COMPACT:
1415         case EM_ARC_COMPACT2:
1416           rtype = elf_arc_reloc_type (type);
1417           break;
1418
1419         case EM_PARISC:
1420           rtype = elf_hppa_reloc_type (type);
1421           break;
1422
1423         case EM_H8_300:
1424         case EM_H8_300H:
1425         case EM_H8S:
1426           rtype = elf_h8_reloc_type (type);
1427           break;
1428
1429         case EM_OR1K:
1430           rtype = elf_or1k_reloc_type (type);
1431           break;
1432
1433         case EM_PJ:
1434         case EM_PJ_OLD:
1435           rtype = elf_pj_reloc_type (type);
1436           break;
1437         case EM_IA_64:
1438           rtype = elf_ia64_reloc_type (type);
1439           break;
1440
1441         case EM_CRIS:
1442           rtype = elf_cris_reloc_type (type);
1443           break;
1444
1445         case EM_860:
1446           rtype = elf_i860_reloc_type (type);
1447           break;
1448
1449         case EM_X86_64:
1450         case EM_L1OM:
1451         case EM_K1OM:
1452           rtype = elf_x86_64_reloc_type (type);
1453           break;
1454
1455         case EM_S370:
1456           rtype = i370_reloc_type (type);
1457           break;
1458
1459         case EM_S390_OLD:
1460         case EM_S390:
1461           rtype = elf_s390_reloc_type (type);
1462           break;
1463
1464         case EM_SCORE:
1465           rtype = elf_score_reloc_type (type);
1466           break;
1467
1468         case EM_XSTORMY16:
1469           rtype = elf_xstormy16_reloc_type (type);
1470           break;
1471
1472         case EM_CRX:
1473           rtype = elf_crx_reloc_type (type);
1474           break;
1475
1476         case EM_VAX:
1477           rtype = elf_vax_reloc_type (type);
1478           break;
1479
1480         case EM_VISIUM:
1481           rtype = elf_visium_reloc_type (type);
1482           break;
1483
1484         case EM_ADAPTEVA_EPIPHANY:
1485           rtype = elf_epiphany_reloc_type (type);
1486           break;
1487
1488         case EM_IP2K:
1489         case EM_IP2K_OLD:
1490           rtype = elf_ip2k_reloc_type (type);
1491           break;
1492
1493         case EM_IQ2000:
1494           rtype = elf_iq2000_reloc_type (type);
1495           break;
1496
1497         case EM_XTENSA_OLD:
1498         case EM_XTENSA:
1499           rtype = elf_xtensa_reloc_type (type);
1500           break;
1501
1502         case EM_LATTICEMICO32:
1503           rtype = elf_lm32_reloc_type (type);
1504           break;
1505
1506         case EM_M32C_OLD:
1507         case EM_M32C:
1508           rtype = elf_m32c_reloc_type (type);
1509           break;
1510
1511         case EM_MT:
1512           rtype = elf_mt_reloc_type (type);
1513           break;
1514
1515         case EM_BLACKFIN:
1516           rtype = elf_bfin_reloc_type (type);
1517           break;
1518
1519         case EM_CYGNUS_MEP:
1520           rtype = elf_mep_reloc_type (type);
1521           break;
1522
1523         case EM_CR16:
1524           rtype = elf_cr16_reloc_type (type);
1525           break;
1526
1527         case EM_MICROBLAZE:
1528         case EM_MICROBLAZE_OLD:
1529           rtype = elf_microblaze_reloc_type (type);
1530           break;
1531
1532         case EM_RL78:
1533           rtype = elf_rl78_reloc_type (type);
1534           break;
1535
1536         case EM_RX:
1537           rtype = elf_rx_reloc_type (type);
1538           break;
1539
1540         case EM_METAG:
1541           rtype = elf_metag_reloc_type (type);
1542           break;
1543
1544         case EM_XC16X:
1545         case EM_C166:
1546           rtype = elf_xc16x_reloc_type (type);
1547           break;
1548
1549         case EM_TI_C6000:
1550           rtype = elf_tic6x_reloc_type (type);
1551           break;
1552
1553         case EM_TILEGX:
1554           rtype = elf_tilegx_reloc_type (type);
1555           break;
1556
1557         case EM_TILEPRO:
1558           rtype = elf_tilepro_reloc_type (type);
1559           break;
1560
1561         case EM_WEBASSEMBLY:
1562           rtype = elf_wasm32_reloc_type (type);
1563           break;
1564
1565         case EM_XGATE:
1566           rtype = elf_xgate_reloc_type (type);
1567           break;
1568
1569         case EM_ALTERA_NIOS2:
1570           rtype = elf_nios2_reloc_type (type);
1571           break;
1572
1573         case EM_TI_PRU:
1574           rtype = elf_pru_reloc_type (type);
1575           break;
1576
1577         case EM_NFP:
1578           if (EF_NFP_MACH (filedata->file_header.e_flags) == E_NFP_MACH_3200)
1579             rtype = elf_nfp3200_reloc_type (type);
1580           else
1581             rtype = elf_nfp_reloc_type (type);
1582           break;
1583         }
1584
1585       if (rtype == NULL)
1586         printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1587       else
1588         printf (do_wide ? "%-22s" : "%-17.17s", rtype);
1589
1590       if (filedata->file_header.e_machine == EM_ALPHA
1591           && rtype != NULL
1592           && streq (rtype, "R_ALPHA_LITUSE")
1593           && is_rela)
1594         {
1595           switch (rels[i].r_addend)
1596             {
1597             case LITUSE_ALPHA_ADDR:   rtype = "ADDR";   break;
1598             case LITUSE_ALPHA_BASE:   rtype = "BASE";   break;
1599             case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1600             case LITUSE_ALPHA_JSR:    rtype = "JSR";    break;
1601             case LITUSE_ALPHA_TLSGD:  rtype = "TLSGD";  break;
1602             case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1603             case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1604             default: rtype = NULL;
1605             }
1606
1607           if (rtype)
1608             printf (" (%s)", rtype);
1609           else
1610             {
1611               putchar (' ');
1612               printf (_("<unknown addend: %lx>"),
1613                       (unsigned long) rels[i].r_addend);
1614               res = FALSE;
1615             }
1616         }
1617       else if (symtab_index)
1618         {
1619           if (symtab == NULL || symtab_index >= nsyms)
1620             {
1621               error (_(" bad symbol index: %08lx in reloc"), (unsigned long) symtab_index);
1622               res = FALSE;
1623             }
1624           else
1625             {
1626               Elf_Internal_Sym * psym;
1627               const char * version_string;
1628               enum versioned_symbol_info sym_info;
1629               unsigned short vna_other;
1630
1631               psym = symtab + symtab_index;
1632
1633               version_string
1634                 = get_symbol_version_string (filedata, is_dynsym,
1635                                              strtab, strtablen,
1636                                              symtab_index,
1637                                              psym,
1638                                              &sym_info,
1639                                              &vna_other);
1640
1641               printf (" ");
1642
1643               if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1644                 {
1645                   const char * name;
1646                   unsigned int len;
1647                   unsigned int width = is_32bit_elf ? 8 : 14;
1648
1649                   /* Relocations against GNU_IFUNC symbols do not use the value
1650                      of the symbol as the address to relocate against.  Instead
1651                      they invoke the function named by the symbol and use its
1652                      result as the address for relocation.
1653
1654                      To indicate this to the user, do not display the value of
1655                      the symbol in the "Symbols's Value" field.  Instead show
1656                      its name followed by () as a hint that the symbol is
1657                      invoked.  */
1658
1659                   if (strtab == NULL
1660                       || psym->st_name == 0
1661                       || psym->st_name >= strtablen)
1662                     name = "??";
1663                   else
1664                     name = strtab + psym->st_name;
1665
1666                   len = print_symbol (width, name);
1667                   if (version_string)
1668                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1669                             version_string);
1670                   printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1671                 }
1672               else
1673                 {
1674                   print_vma (psym->st_value, LONG_HEX);
1675
1676                   printf (is_32bit_elf ? "   " : " ");
1677                 }
1678
1679               if (psym->st_name == 0)
1680                 {
1681                   const char * sec_name = "<null>";
1682                   char name_buf[40];
1683
1684                   if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1685                     {
1686                       if (psym->st_shndx < filedata->file_header.e_shnum)
1687                         sec_name = SECTION_NAME (filedata->section_headers + psym->st_shndx);
1688                       else if (psym->st_shndx == SHN_ABS)
1689                         sec_name = "ABS";
1690                       else if (psym->st_shndx == SHN_COMMON)
1691                         sec_name = "COMMON";
1692                       else if ((filedata->file_header.e_machine == EM_MIPS
1693                                 && psym->st_shndx == SHN_MIPS_SCOMMON)
1694                                || (filedata->file_header.e_machine == EM_TI_C6000
1695                                    && psym->st_shndx == SHN_TIC6X_SCOMMON))
1696                         sec_name = "SCOMMON";
1697                       else if (filedata->file_header.e_machine == EM_MIPS
1698                                && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1699                         sec_name = "SUNDEF";
1700                       else if ((filedata->file_header.e_machine == EM_X86_64
1701                                 || filedata->file_header.e_machine == EM_L1OM
1702                                 || filedata->file_header.e_machine == EM_K1OM)
1703                                && psym->st_shndx == SHN_X86_64_LCOMMON)
1704                         sec_name = "LARGE_COMMON";
1705                       else if (filedata->file_header.e_machine == EM_IA_64
1706                                && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1707                                && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1708                         sec_name = "ANSI_COM";
1709                       else if (is_ia64_vms (filedata)
1710                                && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1711                         sec_name = "VMS_SYMVEC";
1712                       else
1713                         {
1714                           sprintf (name_buf, "<section 0x%x>",
1715                                    (unsigned int) psym->st_shndx);
1716                           sec_name = name_buf;
1717                         }
1718                     }
1719                   print_symbol (22, sec_name);
1720                 }
1721               else if (strtab == NULL)
1722                 printf (_("<string table index: %3ld>"), psym->st_name);
1723               else if (psym->st_name >= strtablen)
1724                 {
1725                   error (_("<corrupt string table index: %3ld>"), psym->st_name);
1726                   res = FALSE;
1727                 }
1728               else
1729                 {
1730                   print_symbol (22, strtab + psym->st_name);
1731                   if (version_string)
1732                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1733                             version_string);
1734                 }
1735
1736               if (is_rela)
1737                 {
1738                   bfd_vma off = rels[i].r_addend;
1739
1740                   if ((bfd_signed_vma) off < 0)
1741                     printf (" - %" BFD_VMA_FMT "x", - off);
1742                   else
1743                     printf (" + %" BFD_VMA_FMT "x", off);
1744                 }
1745             }
1746         }
1747       else if (is_rela)
1748         {
1749           bfd_vma off = rels[i].r_addend;
1750
1751           printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1752           if ((bfd_signed_vma) off < 0)
1753             printf ("-%" BFD_VMA_FMT "x", - off);
1754           else
1755             printf ("%" BFD_VMA_FMT "x", off);
1756         }
1757
1758       if (filedata->file_header.e_machine == EM_SPARCV9
1759           && rtype != NULL
1760           && streq (rtype, "R_SPARC_OLO10"))
1761         printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1762
1763       putchar ('\n');
1764
1765 #ifdef BFD64
1766       if (! is_32bit_elf && filedata->file_header.e_machine == EM_MIPS)
1767         {
1768           bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1769           bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1770           const char * rtype2 = elf_mips_reloc_type (type2);
1771           const char * rtype3 = elf_mips_reloc_type (type3);
1772
1773           printf ("                    Type2: ");
1774
1775           if (rtype2 == NULL)
1776             printf (_("unrecognized: %-7lx"),
1777                     (unsigned long) type2 & 0xffffffff);
1778           else
1779             printf ("%-17.17s", rtype2);
1780
1781           printf ("\n                    Type3: ");
1782
1783           if (rtype3 == NULL)
1784             printf (_("unrecognized: %-7lx"),
1785                     (unsigned long) type3 & 0xffffffff);
1786           else
1787             printf ("%-17.17s", rtype3);
1788
1789           putchar ('\n');
1790         }
1791 #endif /* BFD64 */
1792     }
1793
1794   free (rels);
1795
1796   return res;
1797 }
1798
1799 static const char *
1800 get_mips_dynamic_type (unsigned long type)
1801 {
1802   switch (type)
1803     {
1804     case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1805     case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1806     case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1807     case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1808     case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1809     case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1810     case DT_MIPS_MSYM: return "MIPS_MSYM";
1811     case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1812     case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1813     case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1814     case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1815     case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1816     case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1817     case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1818     case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1819     case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1820     case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1821     case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1822     case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1823     case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1824     case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1825     case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1826     case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1827     case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1828     case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1829     case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1830     case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1831     case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1832     case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1833     case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1834     case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1835     case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1836     case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1837     case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1838     case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1839     case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1840     case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1841     case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1842     case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1843     case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1844     case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1845     case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1846     case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1847     case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1848     case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1849     case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1850     default:
1851       return NULL;
1852     }
1853 }
1854
1855 static const char *
1856 get_sparc64_dynamic_type (unsigned long type)
1857 {
1858   switch (type)
1859     {
1860     case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1861     default:
1862       return NULL;
1863     }
1864 }
1865
1866 static const char *
1867 get_ppc_dynamic_type (unsigned long type)
1868 {
1869   switch (type)
1870     {
1871     case DT_PPC_GOT:    return "PPC_GOT";
1872     case DT_PPC_OPT:    return "PPC_OPT";
1873     default:
1874       return NULL;
1875     }
1876 }
1877
1878 static const char *
1879 get_ppc64_dynamic_type (unsigned long type)
1880 {
1881   switch (type)
1882     {
1883     case DT_PPC64_GLINK:  return "PPC64_GLINK";
1884     case DT_PPC64_OPD:    return "PPC64_OPD";
1885     case DT_PPC64_OPDSZ:  return "PPC64_OPDSZ";
1886     case DT_PPC64_OPT:    return "PPC64_OPT";
1887     default:
1888       return NULL;
1889     }
1890 }
1891
1892 static const char *
1893 get_parisc_dynamic_type (unsigned long type)
1894 {
1895   switch (type)
1896     {
1897     case DT_HP_LOAD_MAP:        return "HP_LOAD_MAP";
1898     case DT_HP_DLD_FLAGS:       return "HP_DLD_FLAGS";
1899     case DT_HP_DLD_HOOK:        return "HP_DLD_HOOK";
1900     case DT_HP_UX10_INIT:       return "HP_UX10_INIT";
1901     case DT_HP_UX10_INITSZ:     return "HP_UX10_INITSZ";
1902     case DT_HP_PREINIT:         return "HP_PREINIT";
1903     case DT_HP_PREINITSZ:       return "HP_PREINITSZ";
1904     case DT_HP_NEEDED:          return "HP_NEEDED";
1905     case DT_HP_TIME_STAMP:      return "HP_TIME_STAMP";
1906     case DT_HP_CHECKSUM:        return "HP_CHECKSUM";
1907     case DT_HP_GST_SIZE:        return "HP_GST_SIZE";
1908     case DT_HP_GST_VERSION:     return "HP_GST_VERSION";
1909     case DT_HP_GST_HASHVAL:     return "HP_GST_HASHVAL";
1910     case DT_HP_EPLTREL:         return "HP_GST_EPLTREL";
1911     case DT_HP_EPLTRELSZ:       return "HP_GST_EPLTRELSZ";
1912     case DT_HP_FILTERED:        return "HP_FILTERED";
1913     case DT_HP_FILTER_TLS:      return "HP_FILTER_TLS";
1914     case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1915     case DT_HP_LAZYLOAD:        return "HP_LAZYLOAD";
1916     case DT_HP_BIND_NOW_COUNT:  return "HP_BIND_NOW_COUNT";
1917     case DT_PLT:                return "PLT";
1918     case DT_PLT_SIZE:           return "PLT_SIZE";
1919     case DT_DLT:                return "DLT";
1920     case DT_DLT_SIZE:           return "DLT_SIZE";
1921     default:
1922       return NULL;
1923     }
1924 }
1925
1926 static const char *
1927 get_ia64_dynamic_type (unsigned long type)
1928 {
1929   switch (type)
1930     {
1931     case DT_IA_64_PLT_RESERVE:         return "IA_64_PLT_RESERVE";
1932     case DT_IA_64_VMS_SUBTYPE:         return "VMS_SUBTYPE";
1933     case DT_IA_64_VMS_IMGIOCNT:        return "VMS_IMGIOCNT";
1934     case DT_IA_64_VMS_LNKFLAGS:        return "VMS_LNKFLAGS";
1935     case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1936     case DT_IA_64_VMS_IDENT:           return "VMS_IDENT";
1937     case DT_IA_64_VMS_NEEDED_IDENT:    return "VMS_NEEDED_IDENT";
1938     case DT_IA_64_VMS_IMG_RELA_CNT:    return "VMS_IMG_RELA_CNT";
1939     case DT_IA_64_VMS_SEG_RELA_CNT:    return "VMS_SEG_RELA_CNT";
1940     case DT_IA_64_VMS_FIXUP_RELA_CNT:  return "VMS_FIXUP_RELA_CNT";
1941     case DT_IA_64_VMS_FIXUP_NEEDED:    return "VMS_FIXUP_NEEDED";
1942     case DT_IA_64_VMS_SYMVEC_CNT:      return "VMS_SYMVEC_CNT";
1943     case DT_IA_64_VMS_XLATED:          return "VMS_XLATED";
1944     case DT_IA_64_VMS_STACKSIZE:       return "VMS_STACKSIZE";
1945     case DT_IA_64_VMS_UNWINDSZ:        return "VMS_UNWINDSZ";
1946     case DT_IA_64_VMS_UNWIND_CODSEG:   return "VMS_UNWIND_CODSEG";
1947     case DT_IA_64_VMS_UNWIND_INFOSEG:  return "VMS_UNWIND_INFOSEG";
1948     case DT_IA_64_VMS_LINKTIME:        return "VMS_LINKTIME";
1949     case DT_IA_64_VMS_SEG_NO:          return "VMS_SEG_NO";
1950     case DT_IA_64_VMS_SYMVEC_OFFSET:   return "VMS_SYMVEC_OFFSET";
1951     case DT_IA_64_VMS_SYMVEC_SEG:      return "VMS_SYMVEC_SEG";
1952     case DT_IA_64_VMS_UNWIND_OFFSET:   return "VMS_UNWIND_OFFSET";
1953     case DT_IA_64_VMS_UNWIND_SEG:      return "VMS_UNWIND_SEG";
1954     case DT_IA_64_VMS_STRTAB_OFFSET:   return "VMS_STRTAB_OFFSET";
1955     case DT_IA_64_VMS_SYSVER_OFFSET:   return "VMS_SYSVER_OFFSET";
1956     case DT_IA_64_VMS_IMG_RELA_OFF:    return "VMS_IMG_RELA_OFF";
1957     case DT_IA_64_VMS_SEG_RELA_OFF:    return "VMS_SEG_RELA_OFF";
1958     case DT_IA_64_VMS_FIXUP_RELA_OFF:  return "VMS_FIXUP_RELA_OFF";
1959     case DT_IA_64_VMS_PLTGOT_OFFSET:   return "VMS_PLTGOT_OFFSET";
1960     case DT_IA_64_VMS_PLTGOT_SEG:      return "VMS_PLTGOT_SEG";
1961     case DT_IA_64_VMS_FPMODE:          return "VMS_FPMODE";
1962     default:
1963       return NULL;
1964     }
1965 }
1966
1967 static const char *
1968 get_solaris_section_type (unsigned long type)
1969 {
1970   switch (type)
1971     {
1972     case 0x6fffffee: return "SUNW_ancillary";
1973     case 0x6fffffef: return "SUNW_capchain";
1974     case 0x6ffffff0: return "SUNW_capinfo";
1975     case 0x6ffffff1: return "SUNW_symsort";
1976     case 0x6ffffff2: return "SUNW_tlssort";
1977     case 0x6ffffff3: return "SUNW_LDYNSYM";
1978     case 0x6ffffff4: return "SUNW_dof";
1979     case 0x6ffffff5: return "SUNW_cap";
1980     case 0x6ffffff6: return "SUNW_SIGNATURE";
1981     case 0x6ffffff7: return "SUNW_ANNOTATE";
1982     case 0x6ffffff8: return "SUNW_DEBUGSTR";
1983     case 0x6ffffff9: return "SUNW_DEBUG";
1984     case 0x6ffffffa: return "SUNW_move";
1985     case 0x6ffffffb: return "SUNW_COMDAT";
1986     case 0x6ffffffc: return "SUNW_syminfo";
1987     case 0x6ffffffd: return "SUNW_verdef";
1988     case 0x6ffffffe: return "SUNW_verneed";
1989     case 0x6fffffff: return "SUNW_versym";
1990     case 0x70000000: return "SPARC_GOTDATA";
1991     default: return NULL;
1992     }
1993 }
1994
1995 static const char *
1996 get_alpha_dynamic_type (unsigned long type)
1997 {
1998   switch (type)
1999     {
2000     case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
2001     default: return NULL;
2002     }
2003 }
2004
2005 static const char *
2006 get_score_dynamic_type (unsigned long type)
2007 {
2008   switch (type)
2009     {
2010     case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
2011     case DT_SCORE_LOCAL_GOTNO:  return "SCORE_LOCAL_GOTNO";
2012     case DT_SCORE_SYMTABNO:     return "SCORE_SYMTABNO";
2013     case DT_SCORE_GOTSYM:       return "SCORE_GOTSYM";
2014     case DT_SCORE_UNREFEXTNO:   return "SCORE_UNREFEXTNO";
2015     case DT_SCORE_HIPAGENO:     return "SCORE_HIPAGENO";
2016     default:                    return NULL;
2017     }
2018 }
2019
2020 static const char *
2021 get_tic6x_dynamic_type (unsigned long type)
2022 {
2023   switch (type)
2024     {
2025     case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
2026     case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
2027     case DT_C6000_DSBT_BASE:   return "C6000_DSBT_BASE";
2028     case DT_C6000_DSBT_SIZE:   return "C6000_DSBT_SIZE";
2029     case DT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
2030     case DT_C6000_DSBT_INDEX:  return "C6000_DSBT_INDEX";
2031     default:                   return NULL;
2032     }
2033 }
2034
2035 static const char *
2036 get_nios2_dynamic_type (unsigned long type)
2037 {
2038   switch (type)
2039     {
2040     case DT_NIOS2_GP: return "NIOS2_GP";
2041     default:          return NULL;
2042     }
2043 }
2044
2045 static const char *
2046 get_solaris_dynamic_type (unsigned long type)
2047 {
2048   switch (type)
2049     {
2050     case 0x6000000d: return "SUNW_AUXILIARY";
2051     case 0x6000000e: return "SUNW_RTLDINF";
2052     case 0x6000000f: return "SUNW_FILTER";
2053     case 0x60000010: return "SUNW_CAP";
2054     case 0x60000011: return "SUNW_SYMTAB";
2055     case 0x60000012: return "SUNW_SYMSZ";
2056     case 0x60000013: return "SUNW_SORTENT";
2057     case 0x60000014: return "SUNW_SYMSORT";
2058     case 0x60000015: return "SUNW_SYMSORTSZ";
2059     case 0x60000016: return "SUNW_TLSSORT";
2060     case 0x60000017: return "SUNW_TLSSORTSZ";
2061     case 0x60000018: return "SUNW_CAPINFO";
2062     case 0x60000019: return "SUNW_STRPAD";
2063     case 0x6000001a: return "SUNW_CAPCHAIN";
2064     case 0x6000001b: return "SUNW_LDMACH";
2065     case 0x6000001d: return "SUNW_CAPCHAINENT";
2066     case 0x6000001f: return "SUNW_CAPCHAINSZ";
2067     case 0x60000021: return "SUNW_PARENT";
2068     case 0x60000023: return "SUNW_ASLR";
2069     case 0x60000025: return "SUNW_RELAX";
2070     case 0x60000029: return "SUNW_NXHEAP";
2071     case 0x6000002b: return "SUNW_NXSTACK";
2072
2073     case 0x70000001: return "SPARC_REGISTER";
2074     case 0x7ffffffd: return "AUXILIARY";
2075     case 0x7ffffffe: return "USED";
2076     case 0x7fffffff: return "FILTER";
2077
2078     default: return NULL;
2079     }
2080 }
2081
2082 static const char *
2083 get_dynamic_type (Filedata * filedata, unsigned long type)
2084 {
2085   static char buff[64];
2086
2087   switch (type)
2088     {
2089     case DT_NULL:       return "NULL";
2090     case DT_NEEDED:     return "NEEDED";
2091     case DT_PLTRELSZ:   return "PLTRELSZ";
2092     case DT_PLTGOT:     return "PLTGOT";
2093     case DT_HASH:       return "HASH";
2094     case DT_STRTAB:     return "STRTAB";
2095     case DT_SYMTAB:     return "SYMTAB";
2096     case DT_RELA:       return "RELA";
2097     case DT_RELASZ:     return "RELASZ";
2098     case DT_RELAENT:    return "RELAENT";
2099     case DT_STRSZ:      return "STRSZ";
2100     case DT_SYMENT:     return "SYMENT";
2101     case DT_INIT:       return "INIT";
2102     case DT_FINI:       return "FINI";
2103     case DT_SONAME:     return "SONAME";
2104     case DT_RPATH:      return "RPATH";
2105     case DT_SYMBOLIC:   return "SYMBOLIC";
2106     case DT_REL:        return "REL";
2107     case DT_RELSZ:      return "RELSZ";
2108     case DT_RELENT:     return "RELENT";
2109     case DT_PLTREL:     return "PLTREL";
2110     case DT_DEBUG:      return "DEBUG";
2111     case DT_TEXTREL:    return "TEXTREL";
2112     case DT_JMPREL:     return "JMPREL";
2113     case DT_BIND_NOW:   return "BIND_NOW";
2114     case DT_INIT_ARRAY: return "INIT_ARRAY";
2115     case DT_FINI_ARRAY: return "FINI_ARRAY";
2116     case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2117     case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
2118     case DT_RUNPATH:    return "RUNPATH";
2119     case DT_FLAGS:      return "FLAGS";
2120
2121     case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2122     case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
2123     case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX";
2124
2125     case DT_CHECKSUM:   return "CHECKSUM";
2126     case DT_PLTPADSZ:   return "PLTPADSZ";
2127     case DT_MOVEENT:    return "MOVEENT";
2128     case DT_MOVESZ:     return "MOVESZ";
2129     case DT_FEATURE:    return "FEATURE";
2130     case DT_POSFLAG_1:  return "POSFLAG_1";
2131     case DT_SYMINSZ:    return "SYMINSZ";
2132     case DT_SYMINENT:   return "SYMINENT"; /* aka VALRNGHI */
2133
2134     case DT_ADDRRNGLO:  return "ADDRRNGLO";
2135     case DT_CONFIG:     return "CONFIG";
2136     case DT_DEPAUDIT:   return "DEPAUDIT";
2137     case DT_AUDIT:      return "AUDIT";
2138     case DT_PLTPAD:     return "PLTPAD";
2139     case DT_MOVETAB:    return "MOVETAB";
2140     case DT_SYMINFO:    return "SYMINFO"; /* aka ADDRRNGHI */
2141
2142     case DT_VERSYM:     return "VERSYM";
2143
2144     case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2145     case DT_TLSDESC_PLT: return "TLSDESC_PLT";
2146     case DT_RELACOUNT:  return "RELACOUNT";
2147     case DT_RELCOUNT:   return "RELCOUNT";
2148     case DT_FLAGS_1:    return "FLAGS_1";
2149     case DT_VERDEF:     return "VERDEF";
2150     case DT_VERDEFNUM:  return "VERDEFNUM";
2151     case DT_VERNEED:    return "VERNEED";
2152     case DT_VERNEEDNUM: return "VERNEEDNUM";
2153
2154     case DT_AUXILIARY:  return "AUXILIARY";
2155     case DT_USED:       return "USED";
2156     case DT_FILTER:     return "FILTER";
2157
2158     case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2159     case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2160     case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2161     case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2162     case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
2163     case DT_GNU_HASH:   return "GNU_HASH";
2164
2165     default:
2166       if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2167         {
2168           const char * result;
2169
2170           switch (filedata->file_header.e_machine)
2171             {
2172             case EM_MIPS:
2173             case EM_MIPS_RS3_LE:
2174               result = get_mips_dynamic_type (type);
2175               break;
2176             case EM_SPARCV9:
2177               result = get_sparc64_dynamic_type (type);
2178               break;
2179             case EM_PPC:
2180               result = get_ppc_dynamic_type (type);
2181               break;
2182             case EM_PPC64:
2183               result = get_ppc64_dynamic_type (type);
2184               break;
2185             case EM_IA_64:
2186               result = get_ia64_dynamic_type (type);
2187               break;
2188             case EM_ALPHA:
2189               result = get_alpha_dynamic_type (type);
2190               break;
2191             case EM_SCORE:
2192               result = get_score_dynamic_type (type);
2193               break;
2194             case EM_TI_C6000:
2195               result = get_tic6x_dynamic_type (type);
2196               break;
2197             case EM_ALTERA_NIOS2:
2198               result = get_nios2_dynamic_type (type);
2199               break;
2200             default:
2201               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2202                 result = get_solaris_dynamic_type (type);
2203               else
2204                 result = NULL;
2205               break;
2206             }
2207
2208           if (result != NULL)
2209             return result;
2210
2211           snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2212         }
2213       else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2214                || (filedata->file_header.e_machine == EM_PARISC
2215                    && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2216         {
2217           const char * result;
2218
2219           switch (filedata->file_header.e_machine)
2220             {
2221             case EM_PARISC:
2222               result = get_parisc_dynamic_type (type);
2223               break;
2224             case EM_IA_64:
2225               result = get_ia64_dynamic_type (type);
2226               break;
2227             default:
2228               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2229                 result = get_solaris_dynamic_type (type);
2230               else
2231                 result = NULL;
2232               break;
2233             }
2234
2235           if (result != NULL)
2236             return result;
2237
2238           snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2239                     type);
2240         }
2241       else
2242         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2243
2244       return buff;
2245     }
2246 }
2247
2248 static char *
2249 get_file_type (unsigned e_type)
2250 {
2251   static char buff[32];
2252
2253   switch (e_type)
2254     {
2255     case ET_NONE: return _("NONE (None)");
2256     case ET_REL:  return _("REL (Relocatable file)");
2257     case ET_EXEC: return _("EXEC (Executable file)");
2258     case ET_DYN:  return _("DYN (Shared object file)");
2259     case ET_CORE: return _("CORE (Core file)");
2260
2261     default:
2262       if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2263         snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2264       else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2265         snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2266       else
2267         snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2268       return buff;
2269     }
2270 }
2271
2272 static char *
2273 get_machine_name (unsigned e_machine)
2274 {
2275   static char buff[64]; /* XXX */
2276
2277   switch (e_machine)
2278     {
2279       /* Please keep this switch table sorted by increasing EM_ value.  */
2280       /* 0 */
2281     case EM_NONE:               return _("None");
2282     case EM_M32:                return "WE32100";
2283     case EM_SPARC:              return "Sparc";
2284     case EM_386:                return "Intel 80386";
2285     case EM_68K:                return "MC68000";
2286     case EM_88K:                return "MC88000";
2287     case EM_IAMCU:              return "Intel MCU";
2288     case EM_860:                return "Intel 80860";
2289     case EM_MIPS:               return "MIPS R3000";
2290     case EM_S370:               return "IBM System/370";
2291       /* 10 */
2292     case EM_MIPS_RS3_LE:        return "MIPS R4000 big-endian";
2293     case EM_OLD_SPARCV9:        return "Sparc v9 (old)";
2294     case EM_PARISC:             return "HPPA";
2295     case EM_VPP550:             return "Fujitsu VPP500";
2296     case EM_SPARC32PLUS:        return "Sparc v8+" ;
2297     case EM_960:                return "Intel 80960";
2298     case EM_PPC:                return "PowerPC";
2299       /* 20 */
2300     case EM_PPC64:              return "PowerPC64";
2301     case EM_S390_OLD:
2302     case EM_S390:               return "IBM S/390";
2303     case EM_SPU:                return "SPU";
2304       /* 30 */
2305     case EM_V800:               return "Renesas V850 (using RH850 ABI)";
2306     case EM_FR20:               return "Fujitsu FR20";
2307     case EM_RH32:               return "TRW RH32";
2308     case EM_MCORE:              return "MCORE";
2309       /* 40 */
2310     case EM_ARM:                return "ARM";
2311     case EM_OLD_ALPHA:          return "Digital Alpha (old)";
2312     case EM_SH:                 return "Renesas / SuperH SH";
2313     case EM_SPARCV9:            return "Sparc v9";
2314     case EM_TRICORE:            return "Siemens Tricore";
2315     case EM_ARC:                return "ARC";
2316     case EM_H8_300:             return "Renesas H8/300";
2317     case EM_H8_300H:            return "Renesas H8/300H";
2318     case EM_H8S:                return "Renesas H8S";
2319     case EM_H8_500:             return "Renesas H8/500";
2320       /* 50 */
2321     case EM_IA_64:              return "Intel IA-64";
2322     case EM_MIPS_X:             return "Stanford MIPS-X";
2323     case EM_COLDFIRE:           return "Motorola Coldfire";
2324     case EM_68HC12:             return "Motorola MC68HC12 Microcontroller";
2325     case EM_MMA:                return "Fujitsu Multimedia Accelerator";
2326     case EM_PCP:                return "Siemens PCP";
2327     case EM_NCPU:               return "Sony nCPU embedded RISC processor";
2328     case EM_NDR1:               return "Denso NDR1 microprocesspr";
2329     case EM_STARCORE:           return "Motorola Star*Core processor";
2330     case EM_ME16:               return "Toyota ME16 processor";
2331       /* 60 */
2332     case EM_ST100:              return "STMicroelectronics ST100 processor";
2333     case EM_TINYJ:              return "Advanced Logic Corp. TinyJ embedded processor";
2334     case EM_X86_64:             return "Advanced Micro Devices X86-64";
2335     case EM_PDSP:               return "Sony DSP processor";
2336     case EM_PDP10:              return "Digital Equipment Corp. PDP-10";
2337     case EM_PDP11:              return "Digital Equipment Corp. PDP-11";
2338     case EM_FX66:               return "Siemens FX66 microcontroller";
2339     case EM_ST9PLUS:            return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2340     case EM_ST7:                return "STMicroelectronics ST7 8-bit microcontroller";
2341     case EM_68HC16:             return "Motorola MC68HC16 Microcontroller";
2342       /* 70 */
2343     case EM_68HC11:             return "Motorola MC68HC11 Microcontroller";
2344     case EM_68HC08:             return "Motorola MC68HC08 Microcontroller";
2345     case EM_68HC05:             return "Motorola MC68HC05 Microcontroller";
2346     case EM_SVX:                return "Silicon Graphics SVx";
2347     case EM_ST19:               return "STMicroelectronics ST19 8-bit microcontroller";
2348     case EM_VAX:                return "Digital VAX";
2349     case EM_CRIS:               return "Axis Communications 32-bit embedded processor";
2350     case EM_JAVELIN:            return "Infineon Technologies 32-bit embedded cpu";
2351     case EM_FIREPATH:           return "Element 14 64-bit DSP processor";
2352     case EM_ZSP:                return "LSI Logic's 16-bit DSP processor";
2353       /* 80 */
2354     case EM_MMIX:               return "Donald Knuth's educational 64-bit processor";
2355     case EM_HUANY:              return "Harvard Universitys's machine-independent object format";
2356     case EM_PRISM:              return "Vitesse Prism";
2357     case EM_AVR_OLD:
2358     case EM_AVR:                return "Atmel AVR 8-bit microcontroller";
2359     case EM_CYGNUS_FR30:
2360     case EM_FR30:               return "Fujitsu FR30";
2361     case EM_CYGNUS_D10V:
2362     case EM_D10V:               return "d10v";
2363     case EM_CYGNUS_D30V:
2364     case EM_D30V:               return "d30v";
2365     case EM_CYGNUS_V850:
2366     case EM_V850:               return "Renesas V850";
2367     case EM_CYGNUS_M32R:
2368     case EM_M32R:               return "Renesas M32R (formerly Mitsubishi M32r)";
2369     case EM_CYGNUS_MN10300:
2370     case EM_MN10300:            return "mn10300";
2371       /* 90 */
2372     case EM_CYGNUS_MN10200:
2373     case EM_MN10200:            return "mn10200";
2374     case EM_PJ:                 return "picoJava";
2375     case EM_OR1K:               return "OpenRISC 1000";
2376     case EM_ARC_COMPACT:        return "ARCompact";
2377     case EM_XTENSA_OLD:
2378     case EM_XTENSA:             return "Tensilica Xtensa Processor";
2379     case EM_VIDEOCORE:          return "Alphamosaic VideoCore processor";
2380     case EM_TMM_GPP:            return "Thompson Multimedia General Purpose Processor";
2381     case EM_NS32K:              return "National Semiconductor 32000 series";
2382     case EM_TPC:                return "Tenor Network TPC processor";
2383     case EM_SNP1K:              return "Trebia SNP 1000 processor";
2384       /* 100 */
2385     case EM_ST200:              return "STMicroelectronics ST200 microcontroller";  
2386     case EM_IP2K_OLD:
2387     case EM_IP2K:               return "Ubicom IP2xxx 8-bit microcontrollers";
2388     case EM_MAX:                return "MAX Processor";
2389     case EM_CR:                 return "National Semiconductor CompactRISC";
2390     case EM_F2MC16:             return "Fujitsu F2MC16";
2391     case EM_MSP430:             return "Texas Instruments msp430 microcontroller";
2392     case EM_BLACKFIN:           return "Analog Devices Blackfin";
2393     case EM_SE_C33:             return "S1C33 Family of Seiko Epson processors";
2394     case EM_SEP:                return "Sharp embedded microprocessor";
2395     case EM_ARCA:               return "Arca RISC microprocessor";
2396       /* 110 */
2397     case EM_UNICORE:            return "Unicore";
2398     case EM_EXCESS:             return "eXcess 16/32/64-bit configurable embedded CPU";
2399     case EM_DXP:                return "Icera Semiconductor Inc. Deep Execution Processor";
2400     case EM_ALTERA_NIOS2:       return "Altera Nios II";
2401     case EM_CRX:                return "National Semiconductor CRX microprocessor";
2402     case EM_XGATE:              return "Motorola XGATE embedded processor";
2403     case EM_C166:
2404     case EM_XC16X:              return "Infineon Technologies xc16x";
2405     case EM_M16C:               return "Renesas M16C series microprocessors";
2406     case EM_DSPIC30F:           return "Microchip Technology dsPIC30F Digital Signal Controller";
2407     case EM_CE:                 return "Freescale Communication Engine RISC core";
2408       /* 120 */
2409     case EM_M32C:               return "Renesas M32c";
2410       /* 130 */
2411     case EM_TSK3000:            return "Altium TSK3000 core";
2412     case EM_RS08:               return "Freescale RS08 embedded processor";
2413     case EM_ECOG2:              return "Cyan Technology eCOG2 microprocessor";
2414     case EM_SCORE:              return "SUNPLUS S+Core";
2415     case EM_DSP24:              return "New Japan Radio (NJR) 24-bit DSP Processor";
2416     case EM_VIDEOCORE3:         return "Broadcom VideoCore III processor";
2417     case EM_LATTICEMICO32:      return "Lattice Mico32";
2418     case EM_SE_C17:             return "Seiko Epson C17 family";
2419       /* 140 */
2420     case EM_TI_C6000:           return "Texas Instruments TMS320C6000 DSP family";
2421     case EM_TI_C2000:           return "Texas Instruments TMS320C2000 DSP family";
2422     case EM_TI_C5500:           return "Texas Instruments TMS320C55x DSP family";
2423     case EM_TI_PRU:             return "TI PRU I/O processor";
2424       /* 160 */
2425     case EM_MMDSP_PLUS:         return "STMicroelectronics 64bit VLIW Data Signal Processor";
2426     case EM_CYPRESS_M8C:        return "Cypress M8C microprocessor";
2427     case EM_R32C:               return "Renesas R32C series microprocessors";
2428     case EM_TRIMEDIA:           return "NXP Semiconductors TriMedia architecture family";
2429     case EM_QDSP6:              return "QUALCOMM DSP6 Processor";
2430     case EM_8051:               return "Intel 8051 and variants";
2431     case EM_STXP7X:             return "STMicroelectronics STxP7x family";
2432     case EM_NDS32:              return "Andes Technology compact code size embedded RISC processor family";
2433     case EM_ECOG1X:             return "Cyan Technology eCOG1X family";
2434     case EM_MAXQ30:             return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2435       /* 170 */
2436     case EM_XIMO16:             return "New Japan Radio (NJR) 16-bit DSP Processor";
2437     case EM_MANIK:              return "M2000 Reconfigurable RISC Microprocessor";
2438     case EM_CRAYNV2:            return "Cray Inc. NV2 vector architecture";
2439     case EM_RX:                 return "Renesas RX";
2440     case EM_METAG:              return "Imagination Technologies Meta processor architecture";
2441     case EM_MCST_ELBRUS:        return "MCST Elbrus general purpose hardware architecture";
2442     case EM_ECOG16:             return "Cyan Technology eCOG16 family";
2443     case EM_CR16:
2444     case EM_MICROBLAZE:
2445     case EM_MICROBLAZE_OLD:     return "Xilinx MicroBlaze";
2446     case EM_ETPU:               return "Freescale Extended Time Processing Unit";
2447     case EM_SLE9X:              return "Infineon Technologies SLE9X core";
2448       /* 180 */
2449     case EM_L1OM:               return "Intel L1OM";
2450     case EM_K1OM:               return "Intel K1OM";
2451     case EM_INTEL182:           return "Intel (reserved)";
2452     case EM_AARCH64:            return "AArch64";
2453     case EM_ARM184:             return "ARM (reserved)";
2454     case EM_AVR32:              return "Atmel Corporation 32-bit microprocessor";
2455     case EM_STM8:               return "STMicroeletronics STM8 8-bit microcontroller";
2456     case EM_TILE64:             return "Tilera TILE64 multicore architecture family";
2457     case EM_TILEPRO:            return "Tilera TILEPro multicore architecture family";
2458       /* 190 */
2459     case EM_CUDA:               return "NVIDIA CUDA architecture";
2460     case EM_TILEGX:             return "Tilera TILE-Gx multicore architecture family";
2461     case EM_CLOUDSHIELD:        return "CloudShield architecture family";
2462     case EM_COREA_1ST:          return "KIPO-KAIST Core-A 1st generation processor family";
2463     case EM_COREA_2ND:          return "KIPO-KAIST Core-A 2nd generation processor family";
2464     case EM_ARC_COMPACT2:       return "ARCv2";
2465     case EM_OPEN8:              return "Open8 8-bit RISC soft processor core";
2466     case EM_RL78:               return "Renesas RL78";
2467     case EM_VIDEOCORE5:         return "Broadcom VideoCore V processor";
2468     case EM_78K0R:              return "Renesas 78K0R";
2469       /* 200 */
2470     case EM_56800EX:            return "Freescale 56800EX Digital Signal Controller (DSC)";
2471     case EM_BA1:                return "Beyond BA1 CPU architecture";
2472     case EM_BA2:                return "Beyond BA2 CPU architecture";
2473     case EM_XCORE:              return "XMOS xCORE processor family";
2474     case EM_MCHP_PIC:           return "Microchip 8-bit PIC(r) family";
2475       /* 210 */
2476     case EM_KM32:               return "KM211 KM32 32-bit processor";
2477     case EM_KMX32:              return "KM211 KMX32 32-bit processor";
2478     case EM_KMX16:              return "KM211 KMX16 16-bit processor";
2479     case EM_KMX8:               return "KM211 KMX8 8-bit processor";
2480     case EM_KVARC:              return "KM211 KVARC processor";
2481     case EM_CDP:                return "Paneve CDP architecture family";
2482     case EM_COGE:               return "Cognitive Smart Memory Processor";
2483     case EM_COOL:               return "Bluechip Systems CoolEngine";
2484     case EM_NORC:               return "Nanoradio Optimized RISC";
2485     case EM_CSR_KALIMBA:        return "CSR Kalimba architecture family";
2486       /* 220 */
2487     case EM_Z80:                return "Zilog Z80";
2488     case EM_VISIUM:             return "CDS VISIUMcore processor";
2489     case EM_FT32:               return "FTDI Chip FT32";
2490     case EM_MOXIE:              return "Moxie";
2491     case EM_AMDGPU:             return "AMD GPU";
2492     case EM_RISCV:              return "RISC-V";
2493     case EM_LANAI:              return "Lanai 32-bit processor";
2494     case EM_BPF:                return "Linux BPF";
2495     case EM_NFP:                return "Netronome Flow Processor";
2496
2497       /* Large numbers...  */
2498     case EM_MT:                 return "Morpho Techologies MT processor";
2499     case EM_ALPHA:              return "Alpha";
2500     case EM_WEBASSEMBLY:        return "Web Assembly";
2501     case EM_DLX:                return "OpenDLX";  
2502     case EM_XSTORMY16:          return "Sanyo XStormy16 CPU core";
2503     case EM_IQ2000:             return "Vitesse IQ2000";
2504     case EM_M32C_OLD:
2505     case EM_NIOS32:             return "Altera Nios";
2506     case EM_CYGNUS_MEP:         return "Toshiba MeP Media Engine";
2507     case EM_ADAPTEVA_EPIPHANY:  return "Adapteva EPIPHANY";
2508     case EM_CYGNUS_FRV:         return "Fujitsu FR-V";
2509     case EM_S12Z:               return "Freescale S12Z";
2510     case EM_CSKY:               return "C-SKY";
2511
2512     default:
2513       snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2514       return buff;
2515     }
2516 }
2517
2518 static void
2519 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2520 {
2521   /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2.  Some
2522      other compilers don't a specific architecture type in the e_flags, and
2523      instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2524      architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2525      architectures.
2526
2527      Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2528      but also sets a specific architecture type in the e_flags field.
2529
2530      However, when decoding the flags we don't worry if we see an
2531      unexpected pairing, for example EM_ARC_COMPACT machine type, with
2532      ARCEM architecture type.  */
2533
2534   switch (e_flags & EF_ARC_MACH_MSK)
2535     {
2536       /* We only expect these to occur for EM_ARC_COMPACT2.  */
2537     case EF_ARC_CPU_ARCV2EM:
2538       strcat (buf, ", ARC EM");
2539       break;
2540     case EF_ARC_CPU_ARCV2HS:
2541       strcat (buf, ", ARC HS");
2542       break;
2543
2544       /* We only expect these to occur for EM_ARC_COMPACT.  */
2545     case E_ARC_MACH_ARC600:
2546       strcat (buf, ", ARC600");
2547       break;
2548     case E_ARC_MACH_ARC601:
2549       strcat (buf, ", ARC601");
2550       break;
2551     case E_ARC_MACH_ARC700:
2552       strcat (buf, ", ARC700");
2553       break;
2554
2555       /* The only times we should end up here are (a) A corrupt ELF, (b) A
2556          new ELF with new architecture being read by an old version of
2557          readelf, or (c) An ELF built with non-GNU compiler that does not
2558          set the architecture in the e_flags.  */
2559     default:
2560       if (e_machine == EM_ARC_COMPACT)
2561         strcat (buf, ", Unknown ARCompact");
2562       else
2563         strcat (buf, ", Unknown ARC");
2564       break;
2565     }
2566
2567   switch (e_flags & EF_ARC_OSABI_MSK)
2568     {
2569     case E_ARC_OSABI_ORIG:
2570       strcat (buf, ", (ABI:legacy)");
2571       break;
2572     case E_ARC_OSABI_V2:
2573       strcat (buf, ", (ABI:v2)");
2574       break;
2575       /* Only upstream 3.9+ kernels will support ARCv2 ISA.  */
2576     case E_ARC_OSABI_V3:
2577       strcat (buf, ", v3 no-legacy-syscalls ABI");
2578       break;
2579     case E_ARC_OSABI_V4:
2580       strcat (buf, ", v4 ABI");
2581       break;
2582     default:
2583       strcat (buf, ", unrecognised ARC OSABI flag");
2584       break;
2585     }
2586 }
2587
2588 static void
2589 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2590 {
2591   unsigned eabi;
2592   bfd_boolean unknown = FALSE;
2593
2594   eabi = EF_ARM_EABI_VERSION (e_flags);
2595   e_flags &= ~ EF_ARM_EABIMASK;
2596
2597   /* Handle "generic" ARM flags.  */
2598   if (e_flags & EF_ARM_RELEXEC)
2599     {
2600       strcat (buf, ", relocatable executable");
2601       e_flags &= ~ EF_ARM_RELEXEC;
2602     }
2603
2604   if (e_flags & EF_ARM_PIC)
2605     {
2606       strcat (buf, ", position independent");
2607       e_flags &= ~ EF_ARM_PIC;
2608     }
2609
2610   /* Now handle EABI specific flags.  */
2611   switch (eabi)
2612     {
2613     default:
2614       strcat (buf, ", <unrecognized EABI>");
2615       if (e_flags)
2616         unknown = TRUE;
2617       break;
2618
2619     case EF_ARM_EABI_VER1:
2620       strcat (buf, ", Version1 EABI");
2621       while (e_flags)
2622         {
2623           unsigned flag;
2624
2625           /* Process flags one bit at a time.  */
2626           flag = e_flags & - e_flags;
2627           e_flags &= ~ flag;
2628
2629           switch (flag)
2630             {
2631             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2632               strcat (buf, ", sorted symbol tables");
2633               break;
2634
2635             default:
2636               unknown = TRUE;
2637               break;
2638             }
2639         }
2640       break;
2641
2642     case EF_ARM_EABI_VER2:
2643       strcat (buf, ", Version2 EABI");
2644       while (e_flags)
2645         {
2646           unsigned flag;
2647
2648           /* Process flags one bit at a time.  */
2649           flag = e_flags & - e_flags;
2650           e_flags &= ~ flag;
2651
2652           switch (flag)
2653             {
2654             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2655               strcat (buf, ", sorted symbol tables");
2656               break;
2657
2658             case EF_ARM_DYNSYMSUSESEGIDX:
2659               strcat (buf, ", dynamic symbols use segment index");
2660               break;
2661
2662             case EF_ARM_MAPSYMSFIRST:
2663               strcat (buf, ", mapping symbols precede others");
2664               break;
2665
2666             default:
2667               unknown = TRUE;
2668               break;
2669             }
2670         }
2671       break;
2672
2673     case EF_ARM_EABI_VER3:
2674       strcat (buf, ", Version3 EABI");
2675       break;
2676
2677     case EF_ARM_EABI_VER4:
2678       strcat (buf, ", Version4 EABI");
2679       while (e_flags)
2680         {
2681           unsigned flag;
2682
2683           /* Process flags one bit at a time.  */
2684           flag = e_flags & - e_flags;
2685           e_flags &= ~ flag;
2686
2687           switch (flag)
2688             {
2689             case EF_ARM_BE8:
2690               strcat (buf, ", BE8");
2691               break;
2692
2693             case EF_ARM_LE8:
2694               strcat (buf, ", LE8");
2695               break;
2696
2697             default:
2698               unknown = TRUE;
2699               break;
2700             }
2701         }
2702       break;
2703
2704     case EF_ARM_EABI_VER5:
2705       strcat (buf, ", Version5 EABI");
2706       while (e_flags)
2707         {
2708           unsigned flag;
2709
2710           /* Process flags one bit at a time.  */
2711           flag = e_flags & - e_flags;
2712           e_flags &= ~ flag;
2713
2714           switch (flag)
2715             {
2716             case EF_ARM_BE8:
2717               strcat (buf, ", BE8");
2718               break;
2719
2720             case EF_ARM_LE8:
2721               strcat (buf, ", LE8");
2722               break;
2723
2724             case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT.  */
2725               strcat (buf, ", soft-float ABI");
2726               break;
2727
2728             case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT.  */
2729               strcat (buf, ", hard-float ABI");
2730               break;
2731
2732             default:
2733               unknown = TRUE;
2734               break;
2735             }
2736         }
2737       break;
2738
2739     case EF_ARM_EABI_UNKNOWN:
2740       strcat (buf, ", GNU EABI");
2741       while (e_flags)
2742         {
2743           unsigned flag;
2744
2745           /* Process flags one bit at a time.  */
2746           flag = e_flags & - e_flags;
2747           e_flags &= ~ flag;
2748
2749           switch (flag)
2750             {
2751             case EF_ARM_INTERWORK:
2752               strcat (buf, ", interworking enabled");
2753               break;
2754
2755             case EF_ARM_APCS_26:
2756               strcat (buf, ", uses APCS/26");
2757               break;
2758
2759             case EF_ARM_APCS_FLOAT:
2760               strcat (buf, ", uses APCS/float");
2761               break;
2762
2763             case EF_ARM_PIC:
2764               strcat (buf, ", position independent");
2765               break;
2766
2767             case EF_ARM_ALIGN8:
2768               strcat (buf, ", 8 bit structure alignment");
2769               break;
2770
2771             case EF_ARM_NEW_ABI:
2772               strcat (buf, ", uses new ABI");
2773               break;
2774
2775             case EF_ARM_OLD_ABI:
2776               strcat (buf, ", uses old ABI");
2777               break;
2778
2779             case EF_ARM_SOFT_FLOAT:
2780               strcat (buf, ", software FP");
2781               break;
2782
2783             case EF_ARM_VFP_FLOAT:
2784               strcat (buf, ", VFP");
2785               break;
2786
2787             case EF_ARM_MAVERICK_FLOAT:
2788               strcat (buf, ", Maverick FP");
2789               break;
2790
2791             default:
2792               unknown = TRUE;
2793               break;
2794             }
2795         }
2796     }
2797
2798   if (unknown)
2799     strcat (buf,_(", <unknown>"));
2800 }
2801
2802 static void
2803 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2804 {
2805   --size; /* Leave space for null terminator.  */
2806
2807   switch (e_flags & EF_AVR_MACH)
2808     {
2809     case E_AVR_MACH_AVR1:
2810       strncat (buf, ", avr:1", size);
2811       break;
2812     case E_AVR_MACH_AVR2:
2813       strncat (buf, ", avr:2", size);
2814       break;
2815     case E_AVR_MACH_AVR25:
2816       strncat (buf, ", avr:25", size);
2817       break;
2818     case E_AVR_MACH_AVR3:
2819       strncat (buf, ", avr:3", size);
2820       break;
2821     case E_AVR_MACH_AVR31:
2822       strncat (buf, ", avr:31", size);
2823       break;
2824     case E_AVR_MACH_AVR35:
2825       strncat (buf, ", avr:35", size);
2826       break;
2827     case E_AVR_MACH_AVR4:
2828       strncat (buf, ", avr:4", size);
2829       break;
2830     case E_AVR_MACH_AVR5:
2831       strncat (buf, ", avr:5", size);
2832       break;
2833     case E_AVR_MACH_AVR51:
2834       strncat (buf, ", avr:51", size);
2835       break;
2836     case E_AVR_MACH_AVR6:
2837       strncat (buf, ", avr:6", size);
2838       break;
2839     case E_AVR_MACH_AVRTINY:
2840       strncat (buf, ", avr:100", size);
2841       break;
2842     case E_AVR_MACH_XMEGA1:
2843       strncat (buf, ", avr:101", size);
2844       break;
2845     case E_AVR_MACH_XMEGA2:
2846       strncat (buf, ", avr:102", size);
2847       break;
2848     case E_AVR_MACH_XMEGA3:
2849       strncat (buf, ", avr:103", size);
2850       break;
2851     case E_AVR_MACH_XMEGA4:
2852       strncat (buf, ", avr:104", size);
2853       break;
2854     case E_AVR_MACH_XMEGA5:
2855       strncat (buf, ", avr:105", size);
2856       break;
2857     case E_AVR_MACH_XMEGA6:
2858       strncat (buf, ", avr:106", size);
2859       break;
2860     case E_AVR_MACH_XMEGA7:
2861       strncat (buf, ", avr:107", size);
2862       break;
2863     default:
2864       strncat (buf, ", avr:<unknown>", size);
2865       break;
2866     }
2867
2868   size -= strlen (buf);
2869   if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2870     strncat (buf, ", link-relax", size);
2871 }
2872
2873 static void
2874 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2875 {
2876   unsigned abi;
2877   unsigned arch;
2878   unsigned config;
2879   unsigned version;
2880   bfd_boolean has_fpu = FALSE;
2881   unsigned int r = 0;
2882
2883   static const char *ABI_STRINGS[] =
2884   {
2885     "ABI v0", /* use r5 as return register; only used in N1213HC */
2886     "ABI v1", /* use r0 as return register */
2887     "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2888     "ABI v2fp", /* for FPU */
2889     "AABI",
2890     "ABI2 FP+"
2891   };
2892   static const char *VER_STRINGS[] =
2893   {
2894     "Andes ELF V1.3 or older",
2895     "Andes ELF V1.3.1",
2896     "Andes ELF V1.4"
2897   };
2898   static const char *ARCH_STRINGS[] =
2899   {
2900     "",
2901     "Andes Star v1.0",
2902     "Andes Star v2.0",
2903     "Andes Star v3.0",
2904     "Andes Star v3.0m"
2905   };
2906
2907   abi = EF_NDS_ABI & e_flags;
2908   arch = EF_NDS_ARCH & e_flags;
2909   config = EF_NDS_INST & e_flags;
2910   version = EF_NDS32_ELF_VERSION & e_flags;
2911
2912   memset (buf, 0, size);
2913
2914   switch (abi)
2915     {
2916     case E_NDS_ABI_V0:
2917     case E_NDS_ABI_V1:
2918     case E_NDS_ABI_V2:
2919     case E_NDS_ABI_V2FP:
2920     case E_NDS_ABI_AABI:
2921     case E_NDS_ABI_V2FP_PLUS:
2922       /* In case there are holes in the array.  */
2923       r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2924       break;
2925
2926     default:
2927       r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2928       break;
2929     }
2930
2931   switch (version)
2932     {
2933     case E_NDS32_ELF_VER_1_2:
2934     case E_NDS32_ELF_VER_1_3:
2935     case E_NDS32_ELF_VER_1_4:
2936       r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2937       break;
2938
2939     default:
2940       r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2941       break;
2942     }
2943
2944   if (E_NDS_ABI_V0 == abi)
2945     {
2946       /* OLD ABI; only used in N1213HC, has performance extension 1.  */
2947       r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2948       if (arch == E_NDS_ARCH_STAR_V1_0)
2949         r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2950       return;
2951     }
2952
2953   switch (arch)
2954     {
2955     case E_NDS_ARCH_STAR_V1_0:
2956     case E_NDS_ARCH_STAR_V2_0:
2957     case E_NDS_ARCH_STAR_V3_0:
2958     case E_NDS_ARCH_STAR_V3_M:
2959       r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2960       break;
2961
2962     default:
2963       r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2964       /* ARCH version determines how the e_flags are interpreted.
2965          If it is unknown, we cannot proceed.  */
2966       return;
2967     }
2968
2969   /* Newer ABI; Now handle architecture specific flags.  */
2970   if (arch == E_NDS_ARCH_STAR_V1_0)
2971     {
2972       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2973         r += snprintf (buf + r, size -r, ", MFUSR_PC");
2974
2975       if (!(config & E_NDS32_HAS_NO_MAC_INST))
2976         r += snprintf (buf + r, size -r, ", MAC");
2977
2978       if (config & E_NDS32_HAS_DIV_INST)
2979         r += snprintf (buf + r, size -r, ", DIV");
2980
2981       if (config & E_NDS32_HAS_16BIT_INST)
2982         r += snprintf (buf + r, size -r, ", 16b");
2983     }
2984   else
2985     {
2986       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2987         {
2988           if (version <= E_NDS32_ELF_VER_1_3)
2989             r += snprintf (buf + r, size -r, ", [B8]");
2990           else
2991             r += snprintf (buf + r, size -r, ", EX9");
2992         }
2993
2994       if (config & E_NDS32_HAS_MAC_DX_INST)
2995         r += snprintf (buf + r, size -r, ", MAC_DX");
2996
2997       if (config & E_NDS32_HAS_DIV_DX_INST)
2998         r += snprintf (buf + r, size -r, ", DIV_DX");
2999
3000       if (config & E_NDS32_HAS_16BIT_INST)
3001         {
3002           if (version <= E_NDS32_ELF_VER_1_3)
3003             r += snprintf (buf + r, size -r, ", 16b");
3004           else
3005             r += snprintf (buf + r, size -r, ", IFC");
3006         }
3007     }
3008
3009   if (config & E_NDS32_HAS_EXT_INST)
3010     r += snprintf (buf + r, size -r, ", PERF1");
3011
3012   if (config & E_NDS32_HAS_EXT2_INST)
3013     r += snprintf (buf + r, size -r, ", PERF2");
3014
3015   if (config & E_NDS32_HAS_FPU_INST)
3016     {
3017       has_fpu = TRUE;
3018       r += snprintf (buf + r, size -r, ", FPU_SP");
3019     }
3020
3021   if (config & E_NDS32_HAS_FPU_DP_INST)
3022     {
3023       has_fpu = TRUE;
3024       r += snprintf (buf + r, size -r, ", FPU_DP");
3025     }
3026
3027   if (config & E_NDS32_HAS_FPU_MAC_INST)
3028     {
3029       has_fpu = TRUE;
3030       r += snprintf (buf + r, size -r, ", FPU_MAC");
3031     }
3032
3033   if (has_fpu)
3034     {
3035       switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
3036         {
3037         case E_NDS32_FPU_REG_8SP_4DP:
3038           r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
3039           break;
3040         case E_NDS32_FPU_REG_16SP_8DP:
3041           r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
3042           break;
3043         case E_NDS32_FPU_REG_32SP_16DP:
3044           r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
3045           break;
3046         case E_NDS32_FPU_REG_32SP_32DP:
3047           r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
3048           break;
3049         }
3050     }
3051
3052   if (config & E_NDS32_HAS_AUDIO_INST)
3053     r += snprintf (buf + r, size -r, ", AUDIO");
3054
3055   if (config & E_NDS32_HAS_STRING_INST)
3056     r += snprintf (buf + r, size -r, ", STR");
3057
3058   if (config & E_NDS32_HAS_REDUCED_REGS)
3059     r += snprintf (buf + r, size -r, ", 16REG");
3060
3061   if (config & E_NDS32_HAS_VIDEO_INST)
3062     {
3063       if (version <= E_NDS32_ELF_VER_1_3)
3064         r += snprintf (buf + r, size -r, ", VIDEO");
3065       else
3066         r += snprintf (buf + r, size -r, ", SATURATION");
3067     }
3068
3069   if (config & E_NDS32_HAS_ENCRIPT_INST)
3070     r += snprintf (buf + r, size -r, ", ENCRP");
3071
3072   if (config & E_NDS32_HAS_L2C_INST)
3073     r += snprintf (buf + r, size -r, ", L2C");
3074 }
3075
3076 static char *
3077 get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine)
3078 {
3079   static char buf[1024];
3080
3081   buf[0] = '\0';
3082
3083   if (e_flags)
3084     {
3085       switch (e_machine)
3086         {
3087         default:
3088           break;
3089
3090         case EM_ARC_COMPACT2:
3091         case EM_ARC_COMPACT:
3092           decode_ARC_machine_flags (e_flags, e_machine, buf);
3093           break;
3094
3095         case EM_ARM:
3096           decode_ARM_machine_flags (e_flags, buf);
3097           break;
3098
3099         case EM_AVR:
3100           decode_AVR_machine_flags (e_flags, buf, sizeof buf);
3101           break;
3102
3103         case EM_BLACKFIN:
3104           if (e_flags & EF_BFIN_PIC)
3105             strcat (buf, ", PIC");
3106
3107           if (e_flags & EF_BFIN_FDPIC)
3108             strcat (buf, ", FDPIC");
3109
3110           if (e_flags & EF_BFIN_CODE_IN_L1)
3111             strcat (buf, ", code in L1");
3112
3113           if (e_flags & EF_BFIN_DATA_IN_L1)
3114             strcat (buf, ", data in L1");
3115
3116           break;
3117
3118         case EM_CYGNUS_FRV:
3119           switch (e_flags & EF_FRV_CPU_MASK)
3120             {
3121             case EF_FRV_CPU_GENERIC:
3122               break;
3123
3124             default:
3125               strcat (buf, ", fr???");
3126               break;
3127
3128             case EF_FRV_CPU_FR300:
3129               strcat (buf, ", fr300");
3130               break;
3131
3132             case EF_FRV_CPU_FR400:
3133               strcat (buf, ", fr400");
3134               break;
3135             case EF_FRV_CPU_FR405:
3136               strcat (buf, ", fr405");
3137               break;
3138
3139             case EF_FRV_CPU_FR450:
3140               strcat (buf, ", fr450");
3141               break;
3142
3143             case EF_FRV_CPU_FR500:
3144               strcat (buf, ", fr500");
3145               break;
3146             case EF_FRV_CPU_FR550:
3147               strcat (buf, ", fr550");
3148               break;
3149
3150             case EF_FRV_CPU_SIMPLE:
3151               strcat (buf, ", simple");
3152               break;
3153             case EF_FRV_CPU_TOMCAT:
3154               strcat (buf, ", tomcat");
3155               break;
3156             }
3157           break;
3158
3159         case EM_68K:
3160           if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
3161             strcat (buf, ", m68000");
3162           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3163             strcat (buf, ", cpu32");
3164           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
3165             strcat (buf, ", fido_a");
3166           else
3167             {
3168               char const * isa = _("unknown");
3169               char const * mac = _("unknown mac");
3170               char const * additional = NULL;
3171
3172               switch (e_flags & EF_M68K_CF_ISA_MASK)
3173                 {
3174                 case EF_M68K_CF_ISA_A_NODIV:
3175                   isa = "A";
3176                   additional = ", nodiv";
3177                   break;
3178                 case EF_M68K_CF_ISA_A:
3179                   isa = "A";
3180                   break;
3181                 case EF_M68K_CF_ISA_A_PLUS:
3182                   isa = "A+";
3183                   break;
3184                 case EF_M68K_CF_ISA_B_NOUSP:
3185                   isa = "B";
3186                   additional = ", nousp";
3187                   break;
3188                 case EF_M68K_CF_ISA_B:
3189                   isa = "B";
3190                   break;
3191                 case EF_M68K_CF_ISA_C:
3192                   isa = "C";
3193                   break;
3194                 case EF_M68K_CF_ISA_C_NODIV:
3195                   isa = "C";
3196                   additional = ", nodiv";
3197                   break;
3198                 }
3199               strcat (buf, ", cf, isa ");
3200               strcat (buf, isa);
3201               if (additional)
3202                 strcat (buf, additional);
3203               if (e_flags & EF_M68K_CF_FLOAT)
3204                 strcat (buf, ", float");
3205               switch (e_flags & EF_M68K_CF_MAC_MASK)
3206                 {
3207                 case 0:
3208                   mac = NULL;
3209                   break;
3210                 case EF_M68K_CF_MAC:
3211                   mac = "mac";
3212                   break;
3213                 case EF_M68K_CF_EMAC:
3214                   mac = "emac";
3215                   break;
3216                 case EF_M68K_CF_EMAC_B:
3217                   mac = "emac_b";
3218                   break;
3219                 }
3220               if (mac)
3221                 {
3222                   strcat (buf, ", ");
3223                   strcat (buf, mac);
3224                 }
3225             }
3226           break;
3227
3228         case EM_CYGNUS_MEP:
3229           switch (e_flags & EF_MEP_CPU_MASK)
3230             {
3231             case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3232             case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3233             case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3234             case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3235             case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3236             case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3237             default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3238             }
3239
3240           switch (e_flags & EF_MEP_COP_MASK)
3241             {
3242             case EF_MEP_COP_NONE: break;
3243             case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3244             case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3245             case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3246             case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3247             default: strcat (buf, _("<unknown MeP copro type>")); break;
3248             }
3249
3250           if (e_flags & EF_MEP_LIBRARY)
3251             strcat (buf, ", Built for Library");
3252
3253           if (e_flags & EF_MEP_INDEX_MASK)
3254             sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3255                      e_flags & EF_MEP_INDEX_MASK);
3256
3257           if (e_flags & ~ EF_MEP_ALL_FLAGS)
3258             sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3259                      e_flags & ~ EF_MEP_ALL_FLAGS);
3260           break;
3261
3262         case EM_PPC:
3263           if (e_flags & EF_PPC_EMB)
3264             strcat (buf, ", emb");
3265
3266           if (e_flags & EF_PPC_RELOCATABLE)
3267             strcat (buf, _(", relocatable"));
3268
3269           if (e_flags & EF_PPC_RELOCATABLE_LIB)
3270             strcat (buf, _(", relocatable-lib"));
3271           break;
3272
3273         case EM_PPC64:
3274           if (e_flags & EF_PPC64_ABI)
3275             {
3276               char abi[] = ", abiv0";
3277
3278               abi[6] += e_flags & EF_PPC64_ABI;
3279               strcat (buf, abi);
3280             }
3281           break;
3282
3283         case EM_V800:
3284           if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3285             strcat (buf, ", RH850 ABI");
3286
3287           if (e_flags & EF_V800_850E3)
3288             strcat (buf, ", V3 architecture");
3289
3290           if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3291             strcat (buf, ", FPU not used");
3292
3293           if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3294             strcat (buf, ", regmode: COMMON");
3295
3296           if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3297             strcat (buf, ", r4 not used");
3298
3299           if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3300             strcat (buf, ", r30 not used");
3301
3302           if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3303             strcat (buf, ", r5 not used");
3304
3305           if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3306             strcat (buf, ", r2 not used");
3307
3308           for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3309             {
3310               switch (e_flags & - e_flags)
3311                 {
3312                 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3313                 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3314                 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3315                 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3316                 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3317                 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3318                 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3319                 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3320                 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3321                 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3322                 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3323                 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3324                 default: break;
3325                 }
3326             }
3327           break;
3328
3329         case EM_V850:
3330         case EM_CYGNUS_V850:
3331           switch (e_flags & EF_V850_ARCH)
3332             {
3333             case E_V850E3V5_ARCH:
3334               strcat (buf, ", v850e3v5");
3335               break;
3336             case E_V850E2V3_ARCH:
3337               strcat (buf, ", v850e2v3");
3338               break;
3339             case E_V850E2_ARCH:
3340               strcat (buf, ", v850e2");
3341               break;
3342             case E_V850E1_ARCH:
3343               strcat (buf, ", v850e1");
3344               break;
3345             case E_V850E_ARCH:
3346               strcat (buf, ", v850e");
3347               break;
3348             case E_V850_ARCH:
3349               strcat (buf, ", v850");
3350               break;
3351             default:
3352               strcat (buf, _(", unknown v850 architecture variant"));
3353               break;
3354             }
3355           break;
3356
3357         case EM_M32R:
3358         case EM_CYGNUS_M32R:
3359           if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3360             strcat (buf, ", m32r");
3361           break;
3362
3363         case EM_MIPS:
3364         case EM_MIPS_RS3_LE:
3365           if (e_flags & EF_MIPS_NOREORDER)
3366             strcat (buf, ", noreorder");
3367
3368           if (e_flags & EF_MIPS_PIC)
3369             strcat (buf, ", pic");
3370
3371           if (e_flags & EF_MIPS_CPIC)
3372             strcat (buf, ", cpic");
3373
3374           if (e_flags & EF_MIPS_UCODE)
3375             strcat (buf, ", ugen_reserved");
3376
3377           if (e_flags & EF_MIPS_ABI2)
3378             strcat (buf, ", abi2");
3379
3380           if (e_flags & EF_MIPS_OPTIONS_FIRST)
3381             strcat (buf, ", odk first");
3382
3383           if (e_flags & EF_MIPS_32BITMODE)
3384             strcat (buf, ", 32bitmode");
3385
3386           if (e_flags & EF_MIPS_NAN2008)
3387             strcat (buf, ", nan2008");
3388
3389           if (e_flags & EF_MIPS_FP64)
3390             strcat (buf, ", fp64");
3391
3392           switch ((e_flags & EF_MIPS_MACH))
3393             {
3394             case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3395             case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3396             case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3397             case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3398             case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3399             case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3400             case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3401             case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3402             case E_MIPS_MACH_5900: strcat (buf, ", 5900"); break;
3403             case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
3404             case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3405             case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3406             case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3407             case E_MIPS_MACH_GS464: strcat (buf, ", gs464"); break;
3408             case E_MIPS_MACH_GS464E: strcat (buf, ", gs464e"); break;
3409             case E_MIPS_MACH_GS264E: strcat (buf, ", gs264e"); break;
3410             case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3411             case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3412             case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3413             case E_MIPS_MACH_XLR:  strcat (buf, ", xlr"); break;
3414             case E_MIPS_MACH_IAMR2:  strcat (buf, ", interaptiv-mr2"); break;
3415             case 0:
3416             /* We simply ignore the field in this case to avoid confusion:
3417                MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3418                extension.  */
3419               break;
3420             default: strcat (buf, _(", unknown CPU")); break;
3421             }
3422
3423           switch ((e_flags & EF_MIPS_ABI))
3424             {
3425             case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3426             case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3427             case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3428             case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3429             case 0:
3430             /* We simply ignore the field in this case to avoid confusion:
3431                MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3432                This means it is likely to be an o32 file, but not for
3433                sure.  */
3434               break;
3435             default: strcat (buf, _(", unknown ABI")); break;
3436             }
3437
3438           if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3439             strcat (buf, ", mdmx");
3440
3441           if (e_flags & EF_MIPS_ARCH_ASE_M16)
3442             strcat (buf, ", mips16");
3443
3444           if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3445             strcat (buf, ", micromips");
3446
3447           switch ((e_flags & EF_MIPS_ARCH))
3448             {
3449             case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3450             case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3451             case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3452             case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3453             case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3454             case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3455             case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3456             case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3457             case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3458             case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3459             case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3460             default: strcat (buf, _(", unknown ISA")); break;
3461             }
3462           break;
3463
3464         case EM_NDS32:
3465           decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3466           break;
3467
3468         case EM_NFP:
3469           switch (EF_NFP_MACH (e_flags))
3470             {
3471             case E_NFP_MACH_3200:
3472               strcat (buf, ", NFP-32xx");
3473               break;
3474             case E_NFP_MACH_6000:
3475               strcat (buf, ", NFP-6xxx");
3476               break;
3477             }
3478           break;
3479
3480         case EM_RISCV:
3481           if (e_flags & EF_RISCV_RVC)
3482             strcat (buf, ", RVC");
3483
3484           if (e_flags & EF_RISCV_RVE)
3485             strcat (buf, ", RVE");
3486
3487           switch (e_flags & EF_RISCV_FLOAT_ABI)
3488             {
3489             case EF_RISCV_FLOAT_ABI_SOFT:
3490               strcat (buf, ", soft-float ABI");
3491               break;
3492
3493             case EF_RISCV_FLOAT_ABI_SINGLE:
3494               strcat (buf, ", single-float ABI");
3495               break;
3496
3497             case EF_RISCV_FLOAT_ABI_DOUBLE:
3498               strcat (buf, ", double-float ABI");
3499               break;
3500
3501             case EF_RISCV_FLOAT_ABI_QUAD:
3502               strcat (buf, ", quad-float ABI");
3503               break;
3504             }
3505           break;
3506
3507         case EM_SH:
3508           switch ((e_flags & EF_SH_MACH_MASK))
3509             {
3510             case EF_SH1: strcat (buf, ", sh1"); break;
3511             case EF_SH2: strcat (buf, ", sh2"); break;
3512             case EF_SH3: strcat (buf, ", sh3"); break;
3513             case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3514             case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3515             case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3516             case EF_SH3E: strcat (buf, ", sh3e"); break;
3517             case EF_SH4: strcat (buf, ", sh4"); break;
3518             case EF_SH5: strcat (buf, ", sh5"); break;
3519             case EF_SH2E: strcat (buf, ", sh2e"); break;
3520             case EF_SH4A: strcat (buf, ", sh4a"); break;
3521             case EF_SH2A: strcat (buf, ", sh2a"); break;
3522             case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3523             case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3524             case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3525             case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3526             case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3527             case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3528             case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3529             case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3530             case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3531             default: strcat (buf, _(", unknown ISA")); break;
3532             }
3533
3534           if (e_flags & EF_SH_PIC)
3535             strcat (buf, ", pic");
3536
3537           if (e_flags & EF_SH_FDPIC)
3538             strcat (buf, ", fdpic");
3539           break;
3540
3541         case EM_OR1K:
3542           if (e_flags & EF_OR1K_NODELAY)
3543             strcat (buf, ", no delay");
3544           break;
3545
3546         case EM_SPARCV9:
3547           if (e_flags & EF_SPARC_32PLUS)
3548             strcat (buf, ", v8+");
3549
3550           if (e_flags & EF_SPARC_SUN_US1)
3551             strcat (buf, ", ultrasparcI");
3552
3553           if (e_flags & EF_SPARC_SUN_US3)
3554             strcat (buf, ", ultrasparcIII");
3555
3556           if (e_flags & EF_SPARC_HAL_R1)
3557             strcat (buf, ", halr1");
3558
3559           if (e_flags & EF_SPARC_LEDATA)
3560             strcat (buf, ", ledata");
3561
3562           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3563             strcat (buf, ", tso");
3564
3565           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3566             strcat (buf, ", pso");
3567
3568           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3569             strcat (buf, ", rmo");
3570           break;
3571
3572         case EM_PARISC:
3573           switch (e_flags & EF_PARISC_ARCH)
3574             {
3575             case EFA_PARISC_1_0:
3576               strcpy (buf, ", PA-RISC 1.0");
3577               break;
3578             case EFA_PARISC_1_1:
3579               strcpy (buf, ", PA-RISC 1.1");
3580               break;
3581             case EFA_PARISC_2_0:
3582               strcpy (buf, ", PA-RISC 2.0");
3583               break;
3584             default:
3585               break;
3586             }
3587           if (e_flags & EF_PARISC_TRAPNIL)
3588             strcat (buf, ", trapnil");
3589           if (e_flags & EF_PARISC_EXT)
3590             strcat (buf, ", ext");
3591           if (e_flags & EF_PARISC_LSB)
3592             strcat (buf, ", lsb");
3593           if (e_flags & EF_PARISC_WIDE)
3594             strcat (buf, ", wide");
3595           if (e_flags & EF_PARISC_NO_KABP)
3596             strcat (buf, ", no kabp");
3597           if (e_flags & EF_PARISC_LAZYSWAP)
3598             strcat (buf, ", lazyswap");
3599           break;
3600
3601         case EM_PJ:
3602         case EM_PJ_OLD:
3603           if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3604             strcat (buf, ", new calling convention");
3605
3606           if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3607             strcat (buf, ", gnu calling convention");
3608           break;
3609
3610         case EM_IA_64:
3611           if ((e_flags & EF_IA_64_ABI64))
3612             strcat (buf, ", 64-bit");
3613           else
3614             strcat (buf, ", 32-bit");
3615           if ((e_flags & EF_IA_64_REDUCEDFP))
3616             strcat (buf, ", reduced fp model");
3617           if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3618             strcat (buf, ", no function descriptors, constant gp");
3619           else if ((e_flags & EF_IA_64_CONS_GP))
3620             strcat (buf, ", constant gp");
3621           if ((e_flags & EF_IA_64_ABSOLUTE))
3622             strcat (buf, ", absolute");
3623           if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3624             {
3625               if ((e_flags & EF_IA_64_VMS_LINKAGES))
3626                 strcat (buf, ", vms_linkages");
3627               switch ((e_flags & EF_IA_64_VMS_COMCOD))
3628                 {
3629                 case EF_IA_64_VMS_COMCOD_SUCCESS:
3630                   break;
3631                 case EF_IA_64_VMS_COMCOD_WARNING:
3632                   strcat (buf, ", warning");
3633                   break;
3634                 case EF_IA_64_VMS_COMCOD_ERROR:
3635                   strcat (buf, ", error");
3636                   break;
3637                 case EF_IA_64_VMS_COMCOD_ABORT:
3638                   strcat (buf, ", abort");
3639                   break;
3640                 default:
3641                   warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3642                         e_flags & EF_IA_64_VMS_COMCOD);
3643                   strcat (buf, ", <unknown>");
3644                 }
3645             }
3646           break;
3647
3648         case EM_VAX:
3649           if ((e_flags & EF_VAX_NONPIC))
3650             strcat (buf, ", non-PIC");
3651           if ((e_flags & EF_VAX_DFLOAT))
3652             strcat (buf, ", D-Float");
3653           if ((e_flags & EF_VAX_GFLOAT))
3654             strcat (buf, ", G-Float");
3655           break;
3656
3657         case EM_VISIUM:
3658           if (e_flags & EF_VISIUM_ARCH_MCM)
3659             strcat (buf, ", mcm");
3660           else if (e_flags & EF_VISIUM_ARCH_MCM24)
3661             strcat (buf, ", mcm24");
3662           if (e_flags & EF_VISIUM_ARCH_GR6)
3663             strcat (buf, ", gr6");
3664           break;
3665
3666         case EM_RL78:
3667           switch (e_flags & E_FLAG_RL78_CPU_MASK)
3668             {
3669             case E_FLAG_RL78_ANY_CPU: break;
3670             case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3671             case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3672             case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3673             }
3674           if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3675             strcat (buf, ", 64-bit doubles");
3676           break;
3677
3678         case EM_RX:
3679           if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3680             strcat (buf, ", 64-bit doubles");
3681           if (e_flags & E_FLAG_RX_DSP)
3682             strcat (buf, ", dsp");
3683           if (e_flags & E_FLAG_RX_PID)
3684             strcat (buf, ", pid");
3685           if (e_flags & E_FLAG_RX_ABI)
3686             strcat (buf, ", RX ABI");
3687           if (e_flags & E_FLAG_RX_SINSNS_SET)
3688             strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3689                     ? ", uses String instructions" : ", bans String instructions");
3690           if (e_flags & E_FLAG_RX_V2)
3691             strcat (buf, ", V2");
3692           if (e_flags & E_FLAG_RX_V3)
3693             strcat (buf, ", V3");
3694           break;
3695
3696         case EM_S390:
3697           if (e_flags & EF_S390_HIGH_GPRS)
3698             strcat (buf, ", highgprs");
3699           break;
3700
3701         case EM_TI_C6000:
3702           if ((e_flags & EF_C6000_REL))
3703             strcat (buf, ", relocatable module");
3704           break;
3705
3706         case EM_MSP430:
3707           strcat (buf, _(": architecture variant: "));
3708           switch (e_flags & EF_MSP430_MACH)
3709             {
3710             case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3711             case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3712             case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3713             case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3714             case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3715             case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3716             case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3717             case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3718             case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3719             case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3720             case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3721             case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3722             case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3723             case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3724             case E_MSP430_MACH_MSP430X  : strcat (buf, "MSP430X"); break;
3725             default:
3726               strcat (buf, _(": unknown")); break;
3727             }
3728
3729           if (e_flags & ~ EF_MSP430_MACH)
3730             strcat (buf, _(": unknown extra flag bits also present"));
3731         }
3732     }
3733
3734   return buf;
3735 }
3736
3737 static const char *
3738 get_osabi_name (Filedata * filedata, unsigned int osabi)
3739 {
3740   static char buff[32];
3741
3742   switch (osabi)
3743     {
3744     case ELFOSABI_NONE:         return "UNIX - System V";
3745     case ELFOSABI_HPUX:         return "UNIX - HP-UX";
3746     case ELFOSABI_NETBSD:       return "UNIX - NetBSD";
3747     case ELFOSABI_GNU:          return "UNIX - GNU";
3748     case ELFOSABI_SOLARIS:      return "UNIX - Solaris";
3749     case ELFOSABI_AIX:          return "UNIX - AIX";
3750     case ELFOSABI_IRIX:         return "UNIX - IRIX";
3751     case ELFOSABI_FREEBSD:      return "UNIX - FreeBSD";
3752     case ELFOSABI_TRU64:        return "UNIX - TRU64";
3753     case ELFOSABI_MODESTO:      return "Novell - Modesto";
3754     case ELFOSABI_OPENBSD:      return "UNIX - OpenBSD";
3755     case ELFOSABI_OPENVMS:      return "VMS - OpenVMS";
3756     case ELFOSABI_NSK:          return "HP - Non-Stop Kernel";
3757     case ELFOSABI_AROS:         return "AROS";
3758     case ELFOSABI_FENIXOS:      return "FenixOS";
3759     case ELFOSABI_CLOUDABI:     return "Nuxi CloudABI";
3760     case ELFOSABI_OPENVOS:      return "Stratus Technologies OpenVOS";
3761     default:
3762       if (osabi >= 64)
3763         switch (filedata->file_header.e_machine)
3764           {
3765           case EM_ARM:
3766             switch (osabi)
3767               {
3768               case ELFOSABI_ARM:        return "ARM";
3769               case ELFOSABI_ARM_FDPIC:  return "ARM FDPIC";
3770               default:
3771                 break;
3772               }
3773             break;
3774
3775           case EM_MSP430:
3776           case EM_MSP430_OLD:
3777           case EM_VISIUM:
3778             switch (osabi)
3779               {
3780               case ELFOSABI_STANDALONE: return _("Standalone App");
3781               default:
3782                 break;
3783               }
3784             break;
3785
3786           case EM_TI_C6000:
3787             switch (osabi)
3788               {
3789               case ELFOSABI_C6000_ELFABI:       return _("Bare-metal C6000");
3790               case ELFOSABI_C6000_LINUX:        return "Linux C6000";
3791               default:
3792                 break;
3793               }
3794             break;
3795
3796           default:
3797             break;
3798           }
3799       snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3800       return buff;
3801     }
3802 }
3803
3804 static const char *
3805 get_aarch64_segment_type (unsigned long type)
3806 {
3807   switch (type)
3808     {
3809     case PT_AARCH64_ARCHEXT:  return "AARCH64_ARCHEXT";
3810     default:                  return NULL;
3811     }
3812 }
3813
3814 static const char *
3815 get_arm_segment_type (unsigned long type)
3816 {
3817   switch (type)
3818     {
3819     case PT_ARM_EXIDX: return "EXIDX";
3820     default:           return NULL;
3821     }
3822 }
3823
3824 static const char *
3825 get_s390_segment_type (unsigned long type)
3826 {
3827   switch (type)
3828     {
3829     case PT_S390_PGSTE: return "S390_PGSTE";
3830     default:            return NULL;
3831     }
3832 }
3833
3834 static const char *
3835 get_mips_segment_type (unsigned long type)
3836 {
3837   switch (type)
3838     {
3839     case PT_MIPS_REGINFO:   return "REGINFO";
3840     case PT_MIPS_RTPROC:    return "RTPROC";
3841     case PT_MIPS_OPTIONS:   return "OPTIONS";
3842     case PT_MIPS_ABIFLAGS:  return "ABIFLAGS";
3843     default:                return NULL;
3844     }
3845 }
3846
3847 static const char *
3848 get_parisc_segment_type (unsigned long type)
3849 {
3850   switch (type)
3851     {
3852     case PT_HP_TLS:             return "HP_TLS";
3853     case PT_HP_CORE_NONE:       return "HP_CORE_NONE";
3854     case PT_HP_CORE_VERSION:    return "HP_CORE_VERSION";
3855     case PT_HP_CORE_KERNEL:     return "HP_CORE_KERNEL";
3856     case PT_HP_CORE_COMM:       return "HP_CORE_COMM";
3857     case PT_HP_CORE_PROC:       return "HP_CORE_PROC";
3858     case PT_HP_CORE_LOADABLE:   return "HP_CORE_LOADABLE";
3859     case PT_HP_CORE_STACK:      return "HP_CORE_STACK";
3860     case PT_HP_CORE_SHM:        return "HP_CORE_SHM";
3861     case PT_HP_CORE_MMF:        return "HP_CORE_MMF";
3862     case PT_HP_PARALLEL:        return "HP_PARALLEL";
3863     case PT_HP_FASTBIND:        return "HP_FASTBIND";
3864     case PT_HP_OPT_ANNOT:       return "HP_OPT_ANNOT";
3865     case PT_HP_HSL_ANNOT:       return "HP_HSL_ANNOT";
3866     case PT_HP_STACK:           return "HP_STACK";
3867     case PT_HP_CORE_UTSNAME:    return "HP_CORE_UTSNAME";
3868     case PT_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
3869     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
3870     case PT_PARISC_WEAKORDER:   return "PARISC_WEAKORDER";
3871     default:                    return NULL;
3872     }
3873 }
3874
3875 static const char *
3876 get_ia64_segment_type (unsigned long type)
3877 {
3878   switch (type)
3879     {
3880     case PT_IA_64_ARCHEXT:      return "IA_64_ARCHEXT";
3881     case PT_IA_64_UNWIND:       return "IA_64_UNWIND";
3882     case PT_HP_TLS:             return "HP_TLS";
3883     case PT_IA_64_HP_OPT_ANOT:  return "HP_OPT_ANNOT";
3884     case PT_IA_64_HP_HSL_ANOT:  return "HP_HSL_ANNOT";
3885     case PT_IA_64_HP_STACK:     return "HP_STACK";
3886     default:                    return NULL;
3887     }
3888 }
3889
3890 static const char *
3891 get_tic6x_segment_type (unsigned long type)
3892 {
3893   switch (type)
3894     {
3895     case PT_C6000_PHATTR:  return "C6000_PHATTR";
3896     default:               return NULL;
3897     }
3898 }
3899
3900 static const char *
3901 get_solaris_segment_type (unsigned long type)
3902 {
3903   switch (type)
3904     {
3905     case 0x6464e550: return "PT_SUNW_UNWIND";
3906     case 0x6474e550: return "PT_SUNW_EH_FRAME";
3907     case 0x6ffffff7: return "PT_LOSUNW";
3908     case 0x6ffffffa: return "PT_SUNWBSS";
3909     case 0x6ffffffb: return "PT_SUNWSTACK";
3910     case 0x6ffffffc: return "PT_SUNWDTRACE";
3911     case 0x6ffffffd: return "PT_SUNWCAP";
3912     case 0x6fffffff: return "PT_HISUNW";
3913     default:         return NULL;
3914     }
3915 }
3916
3917 static const char *
3918 get_segment_type (Filedata * filedata, unsigned long p_type)
3919 {
3920   static char buff[32];
3921
3922   switch (p_type)
3923     {
3924     case PT_NULL:       return "NULL";
3925     case PT_LOAD:       return "LOAD";
3926     case PT_DYNAMIC:    return "DYNAMIC";
3927     case PT_INTERP:     return "INTERP";
3928     case PT_NOTE:       return "NOTE";
3929     case PT_SHLIB:      return "SHLIB";
3930     case PT_PHDR:       return "PHDR";
3931     case PT_TLS:        return "TLS";
3932     case PT_GNU_EH_FRAME: return "GNU_EH_FRAME";
3933     case PT_GNU_STACK:  return "GNU_STACK";
3934     case PT_GNU_RELRO:  return "GNU_RELRO";
3935     case PT_GNU_PROPERTY: return "GNU_PROPERTY";
3936
3937     default:
3938       if (p_type >= PT_GNU_MBIND_LO && p_type <= PT_GNU_MBIND_HI)
3939         {
3940           sprintf (buff, "GNU_MBIND+%#lx",
3941                    p_type - PT_GNU_MBIND_LO);
3942         }
3943       else if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3944         {
3945           const char * result;
3946
3947           switch (filedata->file_header.e_machine)
3948             {
3949             case EM_AARCH64:
3950               result = get_aarch64_segment_type (p_type);
3951               break;
3952             case EM_ARM:
3953               result = get_arm_segment_type (p_type);
3954               break;
3955             case EM_MIPS:
3956             case EM_MIPS_RS3_LE:
3957               result = get_mips_segment_type (p_type);
3958               break;
3959             case EM_PARISC:
3960               result = get_parisc_segment_type (p_type);
3961               break;
3962             case EM_IA_64:
3963               result = get_ia64_segment_type (p_type);
3964               break;
3965             case EM_TI_C6000:
3966               result = get_tic6x_segment_type (p_type);
3967               break;
3968             case EM_S390:
3969             case EM_S390_OLD:
3970               result = get_s390_segment_type (p_type);
3971               break;
3972             default:
3973               result = NULL;
3974               break;
3975             }
3976
3977           if (result != NULL)
3978             return result;
3979
3980           sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
3981         }
3982       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3983         {
3984           const char * result;
3985
3986           switch (filedata->file_header.e_machine)
3987             {
3988             case EM_PARISC:
3989               result = get_parisc_segment_type (p_type);
3990               break;
3991             case EM_IA_64:
3992               result = get_ia64_segment_type (p_type);
3993               break;
3994             default:
3995               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
3996                 result = get_solaris_segment_type (p_type);
3997               else
3998                 result = NULL;
3999               break;
4000             }
4001
4002           if (result != NULL)
4003             return result;
4004
4005           sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
4006         }
4007       else
4008         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
4009
4010       return buff;
4011     }
4012 }
4013
4014 static const char *
4015 get_arc_section_type_name (unsigned int sh_type)
4016 {
4017   switch (sh_type)
4018     {
4019     case SHT_ARC_ATTRIBUTES:      return "ARC_ATTRIBUTES";
4020     default:
4021       break;
4022     }
4023   return NULL;
4024 }
4025
4026 static const char *
4027 get_mips_section_type_name (unsigned int sh_type)
4028 {
4029   switch (sh_type)
4030     {
4031     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
4032     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
4033     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
4034     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
4035     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
4036     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
4037     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
4038     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
4039     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
4040     case SHT_MIPS_RELD:          return "MIPS_RELD";
4041     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
4042     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
4043     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
4044     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
4045     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
4046     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
4047     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
4048     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
4049     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
4050     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
4051     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
4052     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
4053     case SHT_MIPS_LINE:          return "MIPS_LINE";
4054     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
4055     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
4056     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
4057     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
4058     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
4059     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
4060     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
4061     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
4062     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
4063     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
4064     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
4065     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
4066     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
4067     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
4068     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
4069     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
4070     case SHT_MIPS_ABIFLAGS:      return "MIPS_ABIFLAGS";
4071     default:
4072       break;
4073     }
4074   return NULL;
4075 }
4076
4077 static const char *
4078 get_parisc_section_type_name (unsigned int sh_type)
4079 {
4080   switch (sh_type)
4081     {
4082     case SHT_PARISC_EXT:        return "PARISC_EXT";
4083     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
4084     case SHT_PARISC_DOC:        return "PARISC_DOC";
4085     case SHT_PARISC_ANNOT:      return "PARISC_ANNOT";
4086     case SHT_PARISC_SYMEXTN:    return "PARISC_SYMEXTN";
4087     case SHT_PARISC_STUBS:      return "PARISC_STUBS";
4088     case SHT_PARISC_DLKM:       return "PARISC_DLKM";
4089     default:                    return NULL;
4090     }
4091 }
4092
4093 static const char *
4094 get_ia64_section_type_name (Filedata * filedata, unsigned int sh_type)
4095 {
4096   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
4097   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
4098     return get_osabi_name (filedata, (sh_type & 0x00FF0000) >> 16);
4099
4100   switch (sh_type)
4101     {
4102     case SHT_IA_64_EXT:                return "IA_64_EXT";
4103     case SHT_IA_64_UNWIND:             return "IA_64_UNWIND";
4104     case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
4105     case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
4106     case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
4107     case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
4108     case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
4109     case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
4110     case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
4111     case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
4112     default:
4113       break;
4114     }
4115   return NULL;
4116 }
4117
4118 static const char *
4119 get_x86_64_section_type_name (unsigned int sh_type)
4120 {
4121   switch (sh_type)
4122     {
4123     case SHT_X86_64_UNWIND:     return "X86_64_UNWIND";
4124     default:                    return NULL;
4125     }
4126 }
4127
4128 static const char *
4129 get_aarch64_section_type_name (unsigned int sh_type)
4130 {
4131   switch (sh_type)
4132     {
4133     case SHT_AARCH64_ATTRIBUTES: return "AARCH64_ATTRIBUTES";
4134     default:                     return NULL;
4135     }
4136 }
4137
4138 static const char *
4139 get_arm_section_type_name (unsigned int sh_type)
4140 {
4141   switch (sh_type)
4142     {
4143     case SHT_ARM_EXIDX:           return "ARM_EXIDX";
4144     case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
4145     case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
4146     case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
4147     case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
4148     default:                      return NULL;
4149     }
4150 }
4151
4152 static const char *
4153 get_tic6x_section_type_name (unsigned int sh_type)
4154 {
4155   switch (sh_type)
4156     {
4157     case SHT_C6000_UNWIND:      return "C6000_UNWIND";
4158     case SHT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
4159     case SHT_C6000_ATTRIBUTES:  return "C6000_ATTRIBUTES";
4160     case SHT_TI_ICODE:          return "TI_ICODE";
4161     case SHT_TI_XREF:           return "TI_XREF";
4162     case SHT_TI_HANDLER:        return "TI_HANDLER";
4163     case SHT_TI_INITINFO:       return "TI_INITINFO";
4164     case SHT_TI_PHATTRS:        return "TI_PHATTRS";
4165     default:                    return NULL;
4166     }
4167 }
4168
4169 static const char *
4170 get_msp430x_section_type_name (unsigned int sh_type)
4171 {
4172   switch (sh_type)
4173     {
4174     case SHT_MSP430_SEC_FLAGS:    return "MSP430_SEC_FLAGS";
4175     case SHT_MSP430_SYM_ALIASES:  return "MSP430_SYM_ALIASES";
4176     case SHT_MSP430_ATTRIBUTES:   return "MSP430_ATTRIBUTES";
4177     default:                      return NULL;
4178     }
4179 }
4180
4181 static const char *
4182 get_nfp_section_type_name (unsigned int sh_type)
4183 {
4184   switch (sh_type)
4185     {
4186     case SHT_NFP_MECONFIG:      return "NFP_MECONFIG";
4187     case SHT_NFP_INITREG:       return "NFP_INITREG";
4188     case SHT_NFP_UDEBUG:        return "NFP_UDEBUG";
4189     default:                    return NULL;
4190     }
4191 }
4192
4193 static const char *
4194 get_v850_section_type_name (unsigned int sh_type)
4195 {
4196   switch (sh_type)
4197     {
4198     case SHT_V850_SCOMMON:  return "V850 Small Common";
4199     case SHT_V850_TCOMMON:  return "V850 Tiny Common";
4200     case SHT_V850_ZCOMMON:  return "V850 Zero Common";
4201     case SHT_RENESAS_IOP:   return "RENESAS IOP";
4202     case SHT_RENESAS_INFO:  return "RENESAS INFO";
4203     default:                return NULL;
4204     }
4205 }
4206
4207 static const char *
4208 get_riscv_section_type_name (unsigned int sh_type)
4209 {
4210   switch (sh_type)
4211     {
4212     case SHT_RISCV_ATTRIBUTES:  return "RISCV_ATTRIBUTES";
4213     default: return NULL;
4214     }
4215 }
4216
4217 static const char *
4218 get_section_type_name (Filedata * filedata, unsigned int sh_type)
4219 {
4220   static char buff[32];
4221   const char * result;
4222
4223   switch (sh_type)
4224     {
4225     case SHT_NULL:              return "NULL";
4226     case SHT_PROGBITS:          return "PROGBITS";
4227     case SHT_SYMTAB:            return "SYMTAB";
4228     case SHT_STRTAB:            return "STRTAB";
4229     case SHT_RELA:              return "RELA";
4230     case SHT_HASH:              return "HASH";
4231     case SHT_DYNAMIC:           return "DYNAMIC";
4232     case SHT_NOTE:              return "NOTE";
4233     case SHT_NOBITS:            return "NOBITS";
4234     case SHT_REL:               return "REL";
4235     case SHT_SHLIB:             return "SHLIB";
4236     case SHT_DYNSYM:            return "DYNSYM";
4237     case SHT_INIT_ARRAY:        return "INIT_ARRAY";
4238     case SHT_FINI_ARRAY:        return "FINI_ARRAY";
4239     case SHT_PREINIT_ARRAY:     return "PREINIT_ARRAY";
4240     case SHT_GNU_HASH:          return "GNU_HASH";
4241     case SHT_GROUP:             return "GROUP";
4242     case SHT_SYMTAB_SHNDX:      return "SYMTAB SECTION INDICES";
4243     case SHT_GNU_verdef:        return "VERDEF";
4244     case SHT_GNU_verneed:       return "VERNEED";
4245     case SHT_GNU_versym:        return "VERSYM";
4246     case 0x6ffffff0:            return "VERSYM";
4247     case 0x6ffffffc:            return "VERDEF";
4248     case 0x7ffffffd:            return "AUXILIARY";
4249     case 0x7fffffff:            return "FILTER";
4250     case SHT_GNU_LIBLIST:       return "GNU_LIBLIST";
4251
4252     default:
4253       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4254         {
4255           switch (filedata->file_header.e_machine)
4256             {
4257             case EM_ARC:
4258             case EM_ARC_COMPACT:
4259             case EM_ARC_COMPACT2:
4260               result = get_arc_section_type_name (sh_type);
4261               break;
4262             case EM_MIPS:
4263             case EM_MIPS_RS3_LE:
4264               result = get_mips_section_type_name (sh_type);
4265               break;
4266             case EM_PARISC:
4267               result = get_parisc_section_type_name (sh_type);
4268               break;
4269             case EM_IA_64:
4270               result = get_ia64_section_type_name (filedata, sh_type);
4271               break;
4272             case EM_X86_64:
4273             case EM_L1OM:
4274             case EM_K1OM:
4275               result = get_x86_64_section_type_name (sh_type);
4276               break;
4277             case EM_AARCH64:
4278               result = get_aarch64_section_type_name (sh_type);
4279               break;
4280             case EM_ARM:
4281               result = get_arm_section_type_name (sh_type);
4282               break;
4283             case EM_TI_C6000:
4284               result = get_tic6x_section_type_name (sh_type);
4285               break;
4286             case EM_MSP430:
4287               result = get_msp430x_section_type_name (sh_type);
4288               break;
4289             case EM_NFP:
4290               result = get_nfp_section_type_name (sh_type);
4291               break;
4292             case EM_V800:
4293             case EM_V850:
4294             case EM_CYGNUS_V850:
4295               result = get_v850_section_type_name (sh_type);
4296               break;
4297             case EM_RISCV:
4298               result = get_riscv_section_type_name (sh_type);
4299               break;
4300             default:
4301               result = NULL;
4302               break;
4303             }
4304
4305           if (result != NULL)
4306             return result;
4307
4308           sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4309         }
4310       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4311         {
4312           switch (filedata->file_header.e_machine)
4313             {
4314             case EM_IA_64:
4315               result = get_ia64_section_type_name (filedata, sh_type);
4316               break;
4317             default:
4318               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4319                 result = get_solaris_section_type (sh_type);
4320               else
4321                 {
4322                   switch (sh_type)
4323                     {
4324                     case SHT_GNU_INCREMENTAL_INPUTS: result = "GNU_INCREMENTAL_INPUTS"; break;
4325                     case SHT_GNU_ATTRIBUTES: result = "GNU_ATTRIBUTES"; break;
4326                     case SHT_GNU_HASH: result = "GNU_HASH"; break;
4327                     case SHT_GNU_LIBLIST: result = "GNU_LIBLIST"; break;
4328                     default:
4329                       result = NULL;
4330                       break;
4331                     }
4332                 }
4333               break;
4334             }
4335
4336           if (result != NULL)
4337             return result;
4338
4339           sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4340         }
4341       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4342         {
4343           switch (filedata->file_header.e_machine)
4344             {
4345             case EM_V800:
4346             case EM_V850:
4347             case EM_CYGNUS_V850:
4348               result = get_v850_section_type_name (sh_type);
4349               break;
4350             default:
4351               result = NULL;
4352               break;
4353             }
4354
4355           if (result != NULL)
4356             return result;
4357
4358           sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4359         }
4360       else
4361         /* This message is probably going to be displayed in a 15
4362            character wide field, so put the hex value first.  */
4363         snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4364
4365       return buff;
4366     }
4367 }
4368
4369 #define OPTION_DEBUG_DUMP       512
4370 #define OPTION_DYN_SYMS         513
4371 #define OPTION_DWARF_DEPTH      514
4372 #define OPTION_DWARF_START      515
4373 #define OPTION_DWARF_CHECK      516
4374
4375 static struct option options[] =
4376 {
4377   {"all",              no_argument, 0, 'a'},
4378   {"file-header",      no_argument, 0, 'h'},
4379   {"program-headers",  no_argument, 0, 'l'},
4380   {"headers",          no_argument, 0, 'e'},
4381   {"histogram",        no_argument, 0, 'I'},
4382   {"segments",         no_argument, 0, 'l'},
4383   {"sections",         no_argument, 0, 'S'},
4384   {"section-headers",  no_argument, 0, 'S'},
4385   {"section-groups",   no_argument, 0, 'g'},
4386   {"section-details",  no_argument, 0, 't'},
4387   {"full-section-name",no_argument, 0, 'N'},
4388   {"symbols",          no_argument, 0, 's'},
4389   {"syms",             no_argument, 0, 's'},
4390   {"dyn-syms",         no_argument, 0, OPTION_DYN_SYMS},
4391   {"relocs",           no_argument, 0, 'r'},
4392   {"notes",            no_argument, 0, 'n'},
4393   {"dynamic",          no_argument, 0, 'd'},
4394   {"arch-specific",    no_argument, 0, 'A'},
4395   {"version-info",     no_argument, 0, 'V'},
4396   {"use-dynamic",      no_argument, 0, 'D'},
4397   {"unwind",           no_argument, 0, 'u'},
4398   {"archive-index",    no_argument, 0, 'c'},
4399   {"hex-dump",         required_argument, 0, 'x'},
4400   {"relocated-dump",   required_argument, 0, 'R'},
4401   {"string-dump",      required_argument, 0, 'p'},
4402   {"decompress",       no_argument, 0, 'z'},
4403 #ifdef SUPPORT_DISASSEMBLY
4404   {"instruction-dump", required_argument, 0, 'i'},
4405 #endif
4406   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
4407
4408   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
4409   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
4410   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
4411
4412   {"version",          no_argument, 0, 'v'},
4413   {"wide",             no_argument, 0, 'W'},
4414   {"help",             no_argument, 0, 'H'},
4415   {0,                  no_argument, 0, 0}
4416 };
4417
4418 static void
4419 usage (FILE * stream)
4420 {
4421   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4422   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4423   fprintf (stream, _(" Options are:\n\
4424   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4425   -h --file-header       Display the ELF file header\n\
4426   -l --program-headers   Display the program headers\n\
4427      --segments          An alias for --program-headers\n\
4428   -S --section-headers   Display the sections' header\n\
4429      --sections          An alias for --section-headers\n\
4430   -g --section-groups    Display the section groups\n\
4431   -t --section-details   Display the section details\n\
4432   -e --headers           Equivalent to: -h -l -S\n\
4433   -s --syms              Display the symbol table\n\
4434      --symbols           An alias for --syms\n\
4435   --dyn-syms             Display the dynamic symbol table\n\
4436   -n --notes             Display the core notes (if present)\n\
4437   -r --relocs            Display the relocations (if present)\n\
4438   -u --unwind            Display the unwind info (if present)\n\
4439   -d --dynamic           Display the dynamic section (if present)\n\
4440   -V --version-info      Display the version sections (if present)\n\
4441   -A --arch-specific     Display architecture specific information (if any)\n\
4442   -c --archive-index     Display the symbol/file index in an archive\n\
4443   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
4444   -x --hex-dump=<number|name>\n\
4445                          Dump the contents of section <number|name> as bytes\n\
4446   -p --string-dump=<number|name>\n\
4447                          Dump the contents of section <number|name> as strings\n\
4448   -R --relocated-dump=<number|name>\n\
4449                          Dump the contents of section <number|name> as relocated bytes\n\
4450   -z --decompress        Decompress section before dumping it\n\
4451   -w[lLiaprmfFsoRtUuTgAckK] or\n\
4452   --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4453                =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4454                =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4455                =addr,=cu_index,=links,=follow-links]\n\
4456                          Display the contents of DWARF debug sections\n"));
4457   fprintf (stream, _("\
4458   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
4459   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
4460                          or deeper\n"));
4461 #ifdef SUPPORT_DISASSEMBLY
4462   fprintf (stream, _("\
4463   -i --instruction-dump=<number|name>\n\
4464                          Disassemble the contents of section <number|name>\n"));
4465 #endif
4466   fprintf (stream, _("\
4467   -I --histogram         Display histogram of bucket list lengths\n\
4468   -W --wide              Allow output width to exceed 80 characters\n\
4469   @<file>                Read options from <file>\n\
4470   -H --help              Display this information\n\
4471   -v --version           Display the version number of readelf\n"));
4472
4473   if (REPORT_BUGS_TO[0] && stream == stdout)
4474     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4475
4476   exit (stream == stdout ? 0 : 1);
4477 }
4478
4479 /* Record the fact that the user wants the contents of section number
4480    SECTION to be displayed using the method(s) encoded as flags bits
4481    in TYPE.  Note, TYPE can be zero if we are creating the array for
4482    the first time.  */
4483
4484 static void
4485 request_dump_bynumber (Filedata * filedata, unsigned int section, dump_type type)
4486 {
4487   if (section >= filedata->num_dump_sects)
4488     {
4489       dump_type * new_dump_sects;
4490
4491       new_dump_sects = (dump_type *) calloc (section + 1,
4492                                              sizeof (* new_dump_sects));
4493
4494       if (new_dump_sects == NULL)
4495         error (_("Out of memory allocating dump request table.\n"));
4496       else
4497         {
4498           if (filedata->dump_sects)
4499             {
4500               /* Copy current flag settings.  */
4501               memcpy (new_dump_sects, filedata->dump_sects,
4502                       filedata->num_dump_sects * sizeof (* new_dump_sects));
4503
4504               free (filedata->dump_sects);
4505             }
4506
4507           filedata->dump_sects = new_dump_sects;
4508           filedata->num_dump_sects = section + 1;
4509         }
4510     }
4511
4512   if (filedata->dump_sects)
4513     filedata->dump_sects[section] |= type;
4514 }
4515
4516 /* Request a dump by section name.  */
4517
4518 static void
4519 request_dump_byname (const char * section, dump_type type)
4520 {
4521   struct dump_list_entry * new_request;
4522
4523   new_request = (struct dump_list_entry *)
4524       malloc (sizeof (struct dump_list_entry));
4525   if (!new_request)
4526     error (_("Out of memory allocating dump request table.\n"));
4527
4528   new_request->name = strdup (section);
4529   if (!new_request->name)
4530     error (_("Out of memory allocating dump request table.\n"));
4531
4532   new_request->type = type;
4533
4534   new_request->next = dump_sects_byname;
4535   dump_sects_byname = new_request;
4536 }
4537
4538 static inline void
4539 request_dump (Filedata * filedata, dump_type type)
4540 {
4541   int section;
4542   char * cp;
4543
4544   do_dump++;
4545   section = strtoul (optarg, & cp, 0);
4546
4547   if (! *cp && section >= 0)
4548     request_dump_bynumber (filedata, section, type);
4549   else
4550     request_dump_byname (optarg, type);
4551 }
4552
4553 static void
4554 parse_args (Filedata * filedata, int argc, char ** argv)
4555 {
4556   int c;
4557
4558   if (argc < 2)
4559     usage (stderr);
4560
4561   while ((c = getopt_long
4562           (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4563     {
4564       switch (c)
4565         {
4566         case 0:
4567           /* Long options.  */
4568           break;
4569         case 'H':
4570           usage (stdout);
4571           break;
4572
4573         case 'a':
4574           do_syms = TRUE;
4575           do_reloc = TRUE;
4576           do_unwind = TRUE;
4577           do_dynamic = TRUE;
4578           do_header = TRUE;
4579           do_sections = TRUE;
4580           do_section_groups = TRUE;
4581           do_segments = TRUE;
4582           do_version = TRUE;
4583           do_histogram = TRUE;
4584           do_arch = TRUE;
4585           do_notes = TRUE;
4586           break;
4587         case 'g':
4588           do_section_groups = TRUE;
4589           break;
4590         case 't':
4591         case 'N':
4592           do_sections = TRUE;
4593           do_section_details = TRUE;
4594           break;
4595         case 'e':
4596           do_header = TRUE;
4597           do_sections = TRUE;
4598           do_segments = TRUE;
4599           break;
4600         case 'A':
4601           do_arch = TRUE;
4602           break;
4603         case 'D':
4604           do_using_dynamic = TRUE;
4605           break;
4606         case 'r':
4607           do_reloc = TRUE;
4608           break;
4609         case 'u':
4610           do_unwind = TRUE;
4611           break;
4612         case 'h':
4613           do_header = TRUE;
4614           break;
4615         case 'l':
4616           do_segments = TRUE;
4617           break;
4618         case 's':
4619           do_syms = TRUE;
4620           break;
4621         case 'S':
4622           do_sections = TRUE;
4623           break;
4624         case 'd':
4625           do_dynamic = TRUE;
4626           break;
4627         case 'I':
4628           do_histogram = TRUE;
4629           break;
4630         case 'n':
4631           do_notes = TRUE;
4632           break;
4633         case 'c':
4634           do_archive_index = TRUE;
4635           break;
4636         case 'x':
4637           request_dump (filedata, HEX_DUMP);
4638           break;
4639         case 'p':
4640           request_dump (filedata, STRING_DUMP);
4641           break;
4642         case 'R':
4643           request_dump (filedata, RELOC_DUMP);
4644           break;
4645         case 'z':
4646           decompress_dumps = TRUE;
4647           break;
4648         case 'w':
4649           do_dump = TRUE;
4650           if (optarg == 0)
4651             {
4652               do_debugging = TRUE;
4653               dwarf_select_sections_all ();
4654             }
4655           else
4656             {
4657               do_debugging = FALSE;
4658               dwarf_select_sections_by_letters (optarg);
4659             }
4660           break;
4661         case OPTION_DEBUG_DUMP:
4662           do_dump = TRUE;
4663           if (optarg == 0)
4664             do_debugging = TRUE;
4665           else
4666             {
4667               do_debugging = FALSE;
4668               dwarf_select_sections_by_names (optarg);
4669             }
4670           break;
4671         case OPTION_DWARF_DEPTH:
4672           {
4673             char *cp;
4674
4675             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4676           }
4677           break;
4678         case OPTION_DWARF_START:
4679           {
4680             char *cp;
4681
4682             dwarf_start_die = strtoul (optarg, & cp, 0);
4683           }
4684           break;
4685         case OPTION_DWARF_CHECK:
4686           dwarf_check = TRUE;
4687           break;
4688         case OPTION_DYN_SYMS:
4689           do_dyn_syms = TRUE;
4690           break;
4691 #ifdef SUPPORT_DISASSEMBLY
4692         case 'i':
4693           request_dump (filedata, DISASS_DUMP);
4694           break;
4695 #endif
4696         case 'v':
4697           print_version (program_name);
4698           break;
4699         case 'V':
4700           do_version = TRUE;
4701           break;
4702         case 'W':
4703           do_wide = TRUE;
4704           break;
4705         default:
4706           /* xgettext:c-format */
4707           error (_("Invalid option '-%c'\n"), c);
4708           /* Fall through.  */
4709         case '?':
4710           usage (stderr);
4711         }
4712     }
4713
4714   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4715       && !do_segments && !do_header && !do_dump && !do_version
4716       && !do_histogram && !do_debugging && !do_arch && !do_notes
4717       && !do_section_groups && !do_archive_index
4718       && !do_dyn_syms)
4719     usage (stderr);
4720 }
4721
4722 static const char *
4723 get_elf_class (unsigned int elf_class)
4724 {
4725   static char buff[32];
4726
4727   switch (elf_class)
4728     {
4729     case ELFCLASSNONE: return _("none");
4730     case ELFCLASS32:   return "ELF32";
4731     case ELFCLASS64:   return "ELF64";
4732     default:
4733       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4734       return buff;
4735     }
4736 }
4737
4738 static const char *
4739 get_data_encoding (unsigned int encoding)
4740 {
4741   static char buff[32];
4742
4743   switch (encoding)
4744     {
4745     case ELFDATANONE: return _("none");
4746     case ELFDATA2LSB: return _("2's complement, little endian");
4747     case ELFDATA2MSB: return _("2's complement, big endian");
4748     default:
4749       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4750       return buff;
4751     }
4752 }
4753
4754 /* Decode the data held in 'filedata->file_header'.  */
4755
4756 static bfd_boolean
4757 process_file_header (Filedata * filedata)
4758 {
4759   Elf_Internal_Ehdr * header = & filedata->file_header;
4760
4761   if (   header->e_ident[EI_MAG0] != ELFMAG0
4762       || header->e_ident[EI_MAG1] != ELFMAG1
4763       || header->e_ident[EI_MAG2] != ELFMAG2
4764       || header->e_ident[EI_MAG3] != ELFMAG3)
4765     {
4766       error
4767         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4768       return FALSE;
4769     }
4770
4771   init_dwarf_regnames (header->e_machine);
4772
4773   if (do_header)
4774     {
4775       unsigned i;
4776
4777       printf (_("ELF Header:\n"));
4778       printf (_("  Magic:   "));
4779       for (i = 0; i < EI_NIDENT; i++)
4780         printf ("%2.2x ", header->e_ident[i]);
4781       printf ("\n");
4782       printf (_("  Class:                             %s\n"),
4783               get_elf_class (header->e_ident[EI_CLASS]));
4784       printf (_("  Data:                              %s\n"),
4785               get_data_encoding (header->e_ident[EI_DATA]));
4786       printf (_("  Version:                           %d%s\n"),
4787               header->e_ident[EI_VERSION],
4788               (header->e_ident[EI_VERSION] == EV_CURRENT
4789                ? _(" (current)")
4790                : (header->e_ident[EI_VERSION] != EV_NONE
4791                   ? _(" <unknown>")
4792                   : "")));
4793       printf (_("  OS/ABI:                            %s\n"),
4794               get_osabi_name (filedata, header->e_ident[EI_OSABI]));
4795       printf (_("  ABI Version:                       %d\n"),
4796               header->e_ident[EI_ABIVERSION]);
4797       printf (_("  Type:                              %s\n"),
4798               get_file_type (header->e_type));
4799       printf (_("  Machine:                           %s\n"),
4800               get_machine_name (header->e_machine));
4801       printf (_("  Version:                           0x%lx\n"),
4802               header->e_version);
4803
4804       printf (_("  Entry point address:               "));
4805       print_vma (header->e_entry, PREFIX_HEX);
4806       printf (_("\n  Start of program headers:          "));
4807       print_vma (header->e_phoff, DEC);
4808       printf (_(" (bytes into file)\n  Start of section headers:          "));
4809       print_vma (header->e_shoff, DEC);
4810       printf (_(" (bytes into file)\n"));
4811
4812       printf (_("  Flags:                             0x%lx%s\n"),
4813               header->e_flags,
4814               get_machine_flags (filedata, header->e_flags, header->e_machine));
4815       printf (_("  Size of this header:               %u (bytes)\n"),
4816               header->e_ehsize);
4817       printf (_("  Size of program headers:           %u (bytes)\n"),
4818               header->e_phentsize);
4819       printf (_("  Number of program headers:         %u"),
4820               header->e_phnum);
4821       if (filedata->section_headers != NULL
4822           && header->e_phnum == PN_XNUM
4823           && filedata->section_headers[0].sh_info != 0)
4824         {
4825           header->e_phnum = filedata->section_headers[0].sh_info;
4826           printf (" (%u)", header->e_phnum);
4827         }
4828       putc ('\n', stdout);
4829       printf (_("  Size of section headers:           %u (bytes)\n"),
4830               header->e_shentsize);
4831       printf (_("  Number of section headers:         %u"),
4832               header->e_shnum);
4833       if (filedata->section_headers != NULL && header->e_shnum == SHN_UNDEF)
4834         {
4835           header->e_shnum = filedata->section_headers[0].sh_size;
4836           printf (" (%u)", header->e_shnum);
4837         }
4838       putc ('\n', stdout);
4839       printf (_("  Section header string table index: %u"),
4840               header->e_shstrndx);
4841       if (filedata->section_headers != NULL
4842           && header->e_shstrndx == (SHN_XINDEX & 0xffff))
4843         {
4844           header->e_shstrndx = filedata->section_headers[0].sh_link;
4845           printf (" (%u)", header->e_shstrndx);
4846         }
4847       if (header->e_shstrndx != SHN_UNDEF
4848           && header->e_shstrndx >= header->e_shnum)
4849         {
4850           header->e_shstrndx = SHN_UNDEF;
4851           printf (_(" <corrupt: out of range>"));
4852         }
4853       putc ('\n', stdout);
4854     }
4855
4856   if (filedata->section_headers != NULL)
4857     {
4858       if (header->e_phnum == PN_XNUM
4859           && filedata->section_headers[0].sh_info != 0)
4860         header->e_phnum = filedata->section_headers[0].sh_info;
4861       if (header->e_shnum == SHN_UNDEF)
4862         header->e_shnum = filedata->section_headers[0].sh_size;
4863       if (header->e_shstrndx == (SHN_XINDEX & 0xffff))
4864         header->e_shstrndx = filedata->section_headers[0].sh_link;
4865       if (header->e_shstrndx >= header->e_shnum)
4866         header->e_shstrndx = SHN_UNDEF;
4867       free (filedata->section_headers);
4868       filedata->section_headers = NULL;
4869     }
4870
4871   return TRUE;
4872 }
4873
4874 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4875    Returns TRUE upon success, FALSE otherwise.  Loads 32-bit headers.  */
4876
4877 static bfd_boolean
4878 get_32bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4879 {
4880   Elf32_External_Phdr * phdrs;
4881   Elf32_External_Phdr * external;
4882   Elf_Internal_Phdr *   internal;
4883   unsigned int i;
4884   unsigned int size = filedata->file_header.e_phentsize;
4885   unsigned int num  = filedata->file_header.e_phnum;
4886
4887   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4888   if (size == 0 || num == 0)
4889     return FALSE;
4890   if (size < sizeof * phdrs)
4891     {
4892       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4893       return FALSE;
4894     }
4895   if (size > sizeof * phdrs)
4896     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4897
4898   phdrs = (Elf32_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4899                                             size, num, _("program headers"));
4900   if (phdrs == NULL)
4901     return FALSE;
4902
4903   for (i = 0, internal = pheaders, external = phdrs;
4904        i < filedata->file_header.e_phnum;
4905        i++, internal++, external++)
4906     {
4907       internal->p_type   = BYTE_GET (external->p_type);
4908       internal->p_offset = BYTE_GET (external->p_offset);
4909       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4910       internal->p_paddr  = BYTE_GET (external->p_paddr);
4911       internal->p_filesz = BYTE_GET (external->p_filesz);
4912       internal->p_memsz  = BYTE_GET (external->p_memsz);
4913       internal->p_flags  = BYTE_GET (external->p_flags);
4914       internal->p_align  = BYTE_GET (external->p_align);
4915     }
4916
4917   free (phdrs);
4918   return TRUE;
4919 }
4920
4921 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4922    Returns TRUE upon success, FALSE otherwise.  Loads 64-bit headers.  */
4923
4924 static bfd_boolean
4925 get_64bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4926 {
4927   Elf64_External_Phdr * phdrs;
4928   Elf64_External_Phdr * external;
4929   Elf_Internal_Phdr *   internal;
4930   unsigned int i;
4931   unsigned int size = filedata->file_header.e_phentsize;
4932   unsigned int num  = filedata->file_header.e_phnum;
4933
4934   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4935   if (size == 0 || num == 0)
4936     return FALSE;
4937   if (size < sizeof * phdrs)
4938     {
4939       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4940       return FALSE;
4941     }
4942   if (size > sizeof * phdrs)
4943     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4944
4945   phdrs = (Elf64_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4946                                             size, num, _("program headers"));
4947   if (!phdrs)
4948     return FALSE;
4949
4950   for (i = 0, internal = pheaders, external = phdrs;
4951        i < filedata->file_header.e_phnum;
4952        i++, internal++, external++)
4953     {
4954       internal->p_type   = BYTE_GET (external->p_type);
4955       internal->p_flags  = BYTE_GET (external->p_flags);
4956       internal->p_offset = BYTE_GET (external->p_offset);
4957       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4958       internal->p_paddr  = BYTE_GET (external->p_paddr);
4959       internal->p_filesz = BYTE_GET (external->p_filesz);
4960       internal->p_memsz  = BYTE_GET (external->p_memsz);
4961       internal->p_align  = BYTE_GET (external->p_align);
4962     }
4963
4964   free (phdrs);
4965   return TRUE;
4966 }
4967
4968 /* Returns TRUE if the program headers were read into `program_headers'.  */
4969
4970 static bfd_boolean
4971 get_program_headers (Filedata * filedata)
4972 {
4973   Elf_Internal_Phdr * phdrs;
4974
4975   /* Check cache of prior read.  */
4976   if (filedata->program_headers != NULL)
4977     return TRUE;
4978
4979   /* Be kind to memory checkers by looking for
4980      e_phnum values which we know must be invalid.  */
4981   if (filedata->file_header.e_phnum
4982       * (is_32bit_elf ? sizeof (Elf32_External_Phdr) : sizeof (Elf64_External_Phdr))
4983       >= filedata->file_size)
4984     {
4985       error (_("Too many program headers - %#x - the file is not that big\n"),
4986              filedata->file_header.e_phnum);
4987       return FALSE;
4988     }
4989
4990   phdrs = (Elf_Internal_Phdr *) cmalloc (filedata->file_header.e_phnum,
4991                                          sizeof (Elf_Internal_Phdr));
4992   if (phdrs == NULL)
4993     {
4994       error (_("Out of memory reading %u program headers\n"),
4995              filedata->file_header.e_phnum);
4996       return FALSE;
4997     }
4998
4999   if (is_32bit_elf
5000       ? get_32bit_program_headers (filedata, phdrs)
5001       : get_64bit_program_headers (filedata, phdrs))
5002     {
5003       filedata->program_headers = phdrs;
5004       return TRUE;
5005     }
5006
5007   free (phdrs);
5008   return FALSE;
5009 }
5010
5011 /* Returns TRUE if the program headers were loaded.  */
5012
5013 static bfd_boolean
5014 process_program_headers (Filedata * filedata)
5015 {
5016   Elf_Internal_Phdr * segment;
5017   unsigned int i;
5018   Elf_Internal_Phdr * previous_load = NULL;
5019
5020   if (filedata->file_header.e_phnum == 0)
5021     {
5022       /* PR binutils/12467.  */
5023       if (filedata->file_header.e_phoff != 0)
5024         {
5025           warn (_("possibly corrupt ELF header - it has a non-zero program"
5026                   " header offset, but no program headers\n"));
5027           return FALSE;
5028         }
5029       else if (do_segments)
5030         printf (_("\nThere are no program headers in this file.\n"));
5031       return TRUE;
5032     }
5033
5034   if (do_segments && !do_header)
5035     {
5036       printf (_("\nElf file type is %s\n"), get_file_type (filedata->file_header.e_type));
5037       printf (_("Entry point 0x%s\n"), bfd_vmatoa ("x", filedata->file_header.e_entry));
5038       printf (ngettext ("There is %d program header, starting at offset %s\n",
5039                         "There are %d program headers, starting at offset %s\n",
5040                         filedata->file_header.e_phnum),
5041               filedata->file_header.e_phnum,
5042               bfd_vmatoa ("u", filedata->file_header.e_phoff));
5043     }
5044
5045   if (! get_program_headers (filedata))
5046     return TRUE;
5047
5048   if (do_segments)
5049     {
5050       if (filedata->file_header.e_phnum > 1)
5051         printf (_("\nProgram Headers:\n"));
5052       else
5053         printf (_("\nProgram Headers:\n"));
5054
5055       if (is_32bit_elf)
5056         printf
5057           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
5058       else if (do_wide)
5059         printf
5060           (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
5061       else
5062         {
5063           printf
5064             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
5065           printf
5066             (_("                 FileSiz            MemSiz              Flags  Align\n"));
5067         }
5068     }
5069
5070   dynamic_addr = 0;
5071   dynamic_size = 0;
5072
5073   for (i = 0, segment = filedata->program_headers;
5074        i < filedata->file_header.e_phnum;
5075        i++, segment++)
5076     {
5077       if (do_segments)
5078         {
5079           printf ("  %-14.14s ", get_segment_type (filedata, segment->p_type));
5080
5081           if (is_32bit_elf)
5082             {
5083               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5084               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
5085               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
5086               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
5087               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
5088               printf ("%c%c%c ",
5089                       (segment->p_flags & PF_R ? 'R' : ' '),
5090                       (segment->p_flags & PF_W ? 'W' : ' '),
5091                       (segment->p_flags & PF_X ? 'E' : ' '));
5092               printf ("%#lx", (unsigned long) segment->p_align);
5093             }
5094           else if (do_wide)
5095             {
5096               if ((unsigned long) segment->p_offset == segment->p_offset)
5097                 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5098               else
5099                 {
5100                   print_vma (segment->p_offset, FULL_HEX);
5101                   putchar (' ');
5102                 }
5103
5104               print_vma (segment->p_vaddr, FULL_HEX);
5105               putchar (' ');
5106               print_vma (segment->p_paddr, FULL_HEX);
5107               putchar (' ');
5108
5109               if ((unsigned long) segment->p_filesz == segment->p_filesz)
5110                 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
5111               else
5112                 {
5113                   print_vma (segment->p_filesz, FULL_HEX);
5114                   putchar (' ');
5115                 }
5116
5117               if ((unsigned long) segment->p_memsz == segment->p_memsz)
5118                 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
5119               else
5120                 {
5121                   print_vma (segment->p_memsz, FULL_HEX);
5122                 }
5123
5124               printf (" %c%c%c ",
5125                       (segment->p_flags & PF_R ? 'R' : ' '),
5126                       (segment->p_flags & PF_W ? 'W' : ' '),
5127                       (segment->p_flags & PF_X ? 'E' : ' '));
5128
5129               if ((unsigned long) segment->p_align == segment->p_align)
5130                 printf ("%#lx", (unsigned long) segment->p_align);
5131               else
5132                 {
5133                   print_vma (segment->p_align, PREFIX_HEX);
5134                 }
5135             }
5136           else
5137             {
5138               print_vma (segment->p_offset, FULL_HEX);
5139               putchar (' ');
5140               print_vma (segment->p_vaddr, FULL_HEX);
5141               putchar (' ');
5142               print_vma (segment->p_paddr, FULL_HEX);
5143               printf ("\n                 ");
5144               print_vma (segment->p_filesz, FULL_HEX);
5145               putchar (' ');
5146               print_vma (segment->p_memsz, FULL_HEX);
5147               printf ("  %c%c%c    ",
5148                       (segment->p_flags & PF_R ? 'R' : ' '),
5149                       (segment->p_flags & PF_W ? 'W' : ' '),
5150                       (segment->p_flags & PF_X ? 'E' : ' '));
5151               print_vma (segment->p_align, PREFIX_HEX);
5152             }
5153
5154           putc ('\n', stdout);
5155         }
5156
5157       switch (segment->p_type)
5158         {
5159         case PT_LOAD:
5160 #if 0 /* Do not warn about out of order PT_LOAD segments.  Although officially
5161          required by the ELF standard, several programs, including the Linux
5162          kernel, make use of non-ordered segments.  */
5163           if (previous_load
5164               && previous_load->p_vaddr > segment->p_vaddr)
5165             error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
5166 #endif
5167           if (segment->p_memsz < segment->p_filesz)
5168             error (_("the segment's file size is larger than its memory size\n"));
5169           previous_load = segment;
5170           break;
5171
5172         case PT_PHDR:
5173           /* PR 20815 - Verify that the program header is loaded into memory.  */
5174           if (i > 0 && previous_load != NULL)
5175             error (_("the PHDR segment must occur before any LOAD segment\n"));
5176           if (filedata->file_header.e_machine != EM_PARISC)
5177             {
5178               unsigned int j;
5179
5180               for (j = 1; j < filedata->file_header.e_phnum; j++)
5181                 if (filedata->program_headers[j].p_vaddr <= segment->p_vaddr
5182                     && (filedata->program_headers[j].p_vaddr
5183                         + filedata->program_headers[j].p_memsz)
5184                     >= (segment->p_vaddr + segment->p_filesz))
5185                   break;
5186               if (j == filedata->file_header.e_phnum)
5187                 error (_("the PHDR segment is not covered by a LOAD segment\n"));
5188             }
5189           break;
5190
5191         case PT_DYNAMIC:
5192           if (dynamic_addr)
5193             error (_("more than one dynamic segment\n"));
5194
5195           /* By default, assume that the .dynamic section is the first
5196              section in the DYNAMIC segment.  */
5197           dynamic_addr = segment->p_offset;
5198           dynamic_size = segment->p_filesz;
5199
5200           /* Try to locate the .dynamic section. If there is
5201              a section header table, we can easily locate it.  */
5202           if (filedata->section_headers != NULL)
5203             {
5204               Elf_Internal_Shdr * sec;
5205
5206               sec = find_section (filedata, ".dynamic");
5207               if (sec == NULL || sec->sh_size == 0)
5208                 {
5209                   /* A corresponding .dynamic section is expected, but on
5210                      IA-64/OpenVMS it is OK for it to be missing.  */
5211                   if (!is_ia64_vms (filedata))
5212                     error (_("no .dynamic section in the dynamic segment\n"));
5213                   break;
5214                 }
5215
5216               if (sec->sh_type == SHT_NOBITS)
5217                 {
5218                   dynamic_size = 0;
5219                   break;
5220                 }
5221
5222               dynamic_addr = sec->sh_offset;
5223               dynamic_size = sec->sh_size;
5224
5225               if (dynamic_addr < segment->p_offset
5226                   || dynamic_addr > segment->p_offset + segment->p_filesz)
5227                 warn (_("the .dynamic section is not contained"
5228                         " within the dynamic segment\n"));
5229               else if (dynamic_addr > segment->p_offset)
5230                 warn (_("the .dynamic section is not the first section"
5231                         " in the dynamic segment.\n"));
5232             }
5233
5234           /* PR binutils/17512: Avoid corrupt dynamic section info in the
5235              segment.  Check this after matching against the section headers
5236              so we don't warn on debuginfo file (which have NOBITS .dynamic
5237              sections).  */
5238           if (dynamic_addr + dynamic_size >= filedata->file_size)
5239             {
5240               error (_("the dynamic segment offset + size exceeds the size of the file\n"));
5241               dynamic_addr = dynamic_size = 0;
5242             }
5243           break;
5244
5245         case PT_INTERP:
5246           if (fseek (filedata->handle, archive_file_offset + (long) segment->p_offset,
5247                      SEEK_SET))
5248             error (_("Unable to find program interpreter name\n"));
5249           else
5250             {
5251               char fmt [32];
5252               int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
5253
5254               if (ret >= (int) sizeof (fmt) || ret < 0)
5255                 error (_("Internal error: failed to create format string to display program interpreter\n"));
5256
5257               program_interpreter[0] = 0;
5258               if (fscanf (filedata->handle, fmt, program_interpreter) <= 0)
5259                 error (_("Unable to read program interpreter name\n"));
5260
5261               if (do_segments)
5262                 printf (_("      [Requesting program interpreter: %s]\n"),
5263                     program_interpreter);
5264             }
5265           break;
5266         }
5267     }
5268
5269   if (do_segments
5270       && filedata->section_headers != NULL
5271       && filedata->string_table != NULL)
5272     {
5273       printf (_("\n Section to Segment mapping:\n"));
5274       printf (_("  Segment Sections...\n"));
5275
5276       for (i = 0; i < filedata->file_header.e_phnum; i++)
5277         {
5278           unsigned int j;
5279           Elf_Internal_Shdr * section;
5280
5281           segment = filedata->program_headers + i;
5282           section = filedata->section_headers + 1;
5283
5284           printf ("   %2.2d     ", i);
5285
5286           for (j = 1; j < filedata->file_header.e_shnum; j++, section++)
5287             {
5288               if (!ELF_TBSS_SPECIAL (section, segment)
5289                   && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
5290                 printf ("%s ", printable_section_name (filedata, section));
5291             }
5292
5293           putc ('\n',stdout);
5294         }
5295     }
5296
5297   return TRUE;
5298 }
5299
5300
5301 /* Find the file offset corresponding to VMA by using the program headers.  */
5302
5303 static long
5304 offset_from_vma (Filedata * filedata, bfd_vma vma, bfd_size_type size)
5305 {
5306   Elf_Internal_Phdr * seg;
5307
5308   if (! get_program_headers (filedata))
5309     {
5310       warn (_("Cannot interpret virtual addresses without program headers.\n"));
5311       return (long) vma;
5312     }
5313
5314   for (seg = filedata->program_headers;
5315        seg < filedata->program_headers + filedata->file_header.e_phnum;
5316        ++seg)
5317     {
5318       if (seg->p_type != PT_LOAD)
5319         continue;
5320
5321       if (vma >= (seg->p_vaddr & -seg->p_align)
5322           && vma + size <= seg->p_vaddr + seg->p_filesz)
5323         return vma - seg->p_vaddr + seg->p_offset;
5324     }
5325
5326   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
5327         (unsigned long) vma);
5328   return (long) vma;
5329 }
5330
5331
5332 /* Allocate memory and load the sections headers into FILEDATA->filedata->section_headers.
5333    If PROBE is true, this is just a probe and we do not generate any error
5334    messages if the load fails.  */
5335
5336 static bfd_boolean
5337 get_32bit_section_headers (Filedata * filedata, bfd_boolean probe)
5338 {
5339   Elf32_External_Shdr * shdrs;
5340   Elf_Internal_Shdr *   internal;
5341   unsigned int          i;
5342   unsigned int          size = filedata->file_header.e_shentsize;
5343   unsigned int          num = probe ? 1 : filedata->file_header.e_shnum;
5344
5345   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5346   if (size == 0 || num == 0)
5347     return FALSE;
5348   if (size < sizeof * shdrs)
5349     {
5350       if (! probe)
5351         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5352       return FALSE;
5353     }
5354   if (!probe && size > sizeof * shdrs)
5355     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5356
5357   shdrs = (Elf32_External_Shdr *) get_data (NULL, filedata, filedata->file_header.e_shoff,
5358                                             size, num,
5359                                             probe ? NULL : _("section headers"));
5360   if (shdrs == NULL)
5361     return FALSE;
5362
5363   free (filedata->section_headers);
5364   filedata->section_headers = (Elf_Internal_Shdr *)
5365     cmalloc (num, sizeof (Elf_Internal_Shdr));
5366   if (filedata->section_headers == NULL)
5367     {
5368       if (!probe)
5369         error (_("Out of memory reading %u section headers\n"), num);
5370       free (shdrs);
5371       return FALSE;
5372     }
5373
5374   for (i = 0, internal = filedata->section_headers;
5375        i < num;
5376        i++, internal++)
5377     {
5378       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5379       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5380       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5381       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5382       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5383       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5384       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5385       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5386       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5387       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5388       if (!probe && internal->sh_link > num)
5389         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5390       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5391         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5392     }
5393
5394   free (shdrs);
5395   return TRUE;
5396 }
5397
5398 /* Like get_32bit_section_headers, except that it fetches 64-bit headers.  */
5399
5400 static bfd_boolean
5401 get_64bit_section_headers (Filedata * filedata, bfd_boolean probe)
5402 {
5403   Elf64_External_Shdr *  shdrs;
5404   Elf_Internal_Shdr *    internal;
5405   unsigned int           i;
5406   unsigned int           size = filedata->file_header.e_shentsize;
5407   unsigned int           num = probe ? 1 : filedata->file_header.e_shnum;
5408
5409   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5410   if (size == 0 || num == 0)
5411     return FALSE;
5412
5413   if (size < sizeof * shdrs)
5414     {
5415       if (! probe)
5416         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5417       return FALSE;
5418     }
5419
5420   if (! probe && size > sizeof * shdrs)
5421     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5422
5423   shdrs = (Elf64_External_Shdr *) get_data (NULL, filedata,
5424                                             filedata->file_header.e_shoff,
5425                                             size, num,
5426                                             probe ? NULL : _("section headers"));
5427   if (shdrs == NULL)
5428     return FALSE;
5429
5430   free (filedata->section_headers);
5431   filedata->section_headers = (Elf_Internal_Shdr *)
5432     cmalloc (num, sizeof (Elf_Internal_Shdr));
5433   if (filedata->section_headers == NULL)
5434     {
5435       if (! probe)
5436         error (_("Out of memory reading %u section headers\n"), num);
5437       free (shdrs);
5438       return FALSE;
5439     }
5440
5441   for (i = 0, internal = filedata->section_headers;
5442        i < num;
5443        i++, internal++)
5444     {
5445       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5446       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5447       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5448       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5449       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5450       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5451       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5452       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5453       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5454       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5455       if (!probe && internal->sh_link > num)
5456         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5457       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5458         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5459     }
5460
5461   free (shdrs);
5462   return TRUE;
5463 }
5464
5465 static Elf_Internal_Sym *
5466 get_32bit_elf_symbols (Filedata *           filedata,
5467                        Elf_Internal_Shdr *  section,
5468                        unsigned long *      num_syms_return)
5469 {
5470   unsigned long number = 0;
5471   Elf32_External_Sym * esyms = NULL;
5472   Elf_External_Sym_Shndx * shndx = NULL;
5473   Elf_Internal_Sym * isyms = NULL;
5474   Elf_Internal_Sym * psym;
5475   unsigned int j;
5476   elf_section_list * entry;
5477
5478   if (section->sh_size == 0)
5479     {
5480       if (num_syms_return != NULL)
5481         * num_syms_return = 0;
5482       return NULL;
5483     }
5484
5485   /* Run some sanity checks first.  */
5486   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5487     {
5488       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5489              printable_section_name (filedata, section),
5490              (unsigned long) section->sh_entsize);
5491       goto exit_point;
5492     }
5493
5494   if (section->sh_size > filedata->file_size)
5495     {
5496       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5497              printable_section_name (filedata, section),
5498              (unsigned long) section->sh_size);
5499       goto exit_point;
5500     }
5501
5502   number = section->sh_size / section->sh_entsize;
5503
5504   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5505     {
5506       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5507              (unsigned long) section->sh_size,
5508              printable_section_name (filedata, section),
5509              (unsigned long) section->sh_entsize);
5510       goto exit_point;
5511     }
5512
5513   esyms = (Elf32_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5514                                            section->sh_size, _("symbols"));
5515   if (esyms == NULL)
5516     goto exit_point;
5517
5518   shndx = NULL;
5519   for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5520     {
5521       if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5522         continue;
5523
5524       if (shndx != NULL)
5525         {
5526           error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5527           free (shndx);
5528         }
5529
5530       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5531                                                    entry->hdr->sh_offset,
5532                                                    1, entry->hdr->sh_size,
5533                                                    _("symbol table section indices"));
5534       if (shndx == NULL)
5535         goto exit_point;
5536
5537       /* PR17531: file: heap-buffer-overflow */
5538       if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5539         {
5540           error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5541                  printable_section_name (filedata, entry->hdr),
5542                  (unsigned long) entry->hdr->sh_size,
5543                  (unsigned long) section->sh_size);
5544           goto exit_point;
5545         }
5546     }
5547
5548   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5549
5550   if (isyms == NULL)
5551     {
5552       error (_("Out of memory reading %lu symbols\n"),
5553              (unsigned long) number);
5554       goto exit_point;
5555     }
5556
5557   for (j = 0, psym = isyms; j < number; j++, psym++)
5558     {
5559       psym->st_name  = BYTE_GET (esyms[j].st_name);
5560       psym->st_value = BYTE_GET (esyms[j].st_value);
5561       psym->st_size  = BYTE_GET (esyms[j].st_size);
5562       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5563       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5564         psym->st_shndx
5565           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5566       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5567         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5568       psym->st_info  = BYTE_GET (esyms[j].st_info);
5569       psym->st_other = BYTE_GET (esyms[j].st_other);
5570     }
5571
5572  exit_point:
5573   free (shndx);
5574   free (esyms);
5575
5576   if (num_syms_return != NULL)
5577     * num_syms_return = isyms == NULL ? 0 : number;
5578
5579   return isyms;
5580 }
5581
5582 static Elf_Internal_Sym *
5583 get_64bit_elf_symbols (Filedata *           filedata,
5584                        Elf_Internal_Shdr *  section,
5585                        unsigned long *      num_syms_return)
5586 {
5587   unsigned long number = 0;
5588   Elf64_External_Sym * esyms = NULL;
5589   Elf_External_Sym_Shndx * shndx = NULL;
5590   Elf_Internal_Sym * isyms = NULL;
5591   Elf_Internal_Sym * psym;
5592   unsigned int j;
5593   elf_section_list * entry;
5594
5595   if (section->sh_size == 0)
5596     {
5597       if (num_syms_return != NULL)
5598         * num_syms_return = 0;
5599       return NULL;
5600     }
5601
5602   /* Run some sanity checks first.  */
5603   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5604     {
5605       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5606              printable_section_name (filedata, section),
5607              (unsigned long) section->sh_entsize);
5608       goto exit_point;
5609     }
5610
5611   if (section->sh_size > filedata->file_size)
5612     {
5613       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5614              printable_section_name (filedata, section),
5615              (unsigned long) section->sh_size);
5616       goto exit_point;
5617     }
5618
5619   number = section->sh_size / section->sh_entsize;
5620
5621   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5622     {
5623       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5624              (unsigned long) section->sh_size,
5625              printable_section_name (filedata, section),
5626              (unsigned long) section->sh_entsize);
5627       goto exit_point;
5628     }
5629
5630   esyms = (Elf64_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5631                                            section->sh_size, _("symbols"));
5632   if (!esyms)
5633     goto exit_point;
5634
5635   shndx = NULL;
5636   for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5637     {
5638       if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5639         continue;
5640
5641       if (shndx != NULL)
5642         {
5643           error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5644           free (shndx);
5645         }
5646
5647       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5648                                                    entry->hdr->sh_offset,
5649                                                    1, entry->hdr->sh_size,
5650                                                    _("symbol table section indices"));
5651       if (shndx == NULL)
5652         goto exit_point;
5653
5654       /* PR17531: file: heap-buffer-overflow */
5655       if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5656         {
5657           error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5658                  printable_section_name (filedata, entry->hdr),
5659                  (unsigned long) entry->hdr->sh_size,
5660                  (unsigned long) section->sh_size);
5661           goto exit_point;
5662         }
5663     }
5664
5665   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5666
5667   if (isyms == NULL)
5668     {
5669       error (_("Out of memory reading %lu symbols\n"),
5670              (unsigned long) number);
5671       goto exit_point;
5672     }
5673
5674   for (j = 0, psym = isyms; j < number; j++, psym++)
5675     {
5676       psym->st_name  = BYTE_GET (esyms[j].st_name);
5677       psym->st_info  = BYTE_GET (esyms[j].st_info);
5678       psym->st_other = BYTE_GET (esyms[j].st_other);
5679       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5680
5681       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5682         psym->st_shndx
5683           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5684       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5685         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5686
5687       psym->st_value = BYTE_GET (esyms[j].st_value);
5688       psym->st_size  = BYTE_GET (esyms[j].st_size);
5689     }
5690
5691  exit_point:
5692   free (shndx);
5693   free (esyms);
5694
5695   if (num_syms_return != NULL)
5696     * num_syms_return = isyms == NULL ? 0 : number;
5697
5698   return isyms;
5699 }
5700
5701 static const char *
5702 get_elf_section_flags (Filedata * filedata, bfd_vma sh_flags)
5703 {
5704   static char buff[1024];
5705   char * p = buff;
5706   unsigned int field_size = is_32bit_elf ? 8 : 16;
5707   signed int sindex;
5708   unsigned int size = sizeof (buff) - (field_size + 4 + 1);
5709   bfd_vma os_flags = 0;
5710   bfd_vma proc_flags = 0;
5711   bfd_vma unknown_flags = 0;
5712   static const struct
5713     {
5714       const char * str;
5715       unsigned int len;
5716     }
5717   flags [] =
5718     {
5719       /*  0 */ { STRING_COMMA_LEN ("WRITE") },
5720       /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
5721       /*  2 */ { STRING_COMMA_LEN ("EXEC") },
5722       /*  3 */ { STRING_COMMA_LEN ("MERGE") },
5723       /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
5724       /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
5725       /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5726       /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5727       /*  8 */ { STRING_COMMA_LEN ("GROUP") },
5728       /*  9 */ { STRING_COMMA_LEN ("TLS") },
5729       /* IA-64 specific.  */
5730       /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5731       /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5732       /* IA-64 OpenVMS specific.  */
5733       /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5734       /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5735       /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5736       /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5737       /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5738       /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5739       /* Generic.  */
5740       /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5741       /* SPARC specific.  */
5742       /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5743       /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5744       /* ARM specific.  */
5745       /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5746       /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5747       /* 23 */ { STRING_COMMA_LEN ("COMDEF") },
5748       /* GNU specific.  */
5749       /* 24 */ { STRING_COMMA_LEN ("GNU_MBIND") },
5750       /* VLE specific.  */
5751       /* 25 */ { STRING_COMMA_LEN ("VLE") },
5752     };
5753
5754   if (do_section_details)
5755     {
5756       sprintf (buff, "[%*.*lx]: ",
5757                field_size, field_size, (unsigned long) sh_flags);
5758       p += field_size + 4;
5759     }
5760
5761   while (sh_flags)
5762     {
5763       bfd_vma flag;
5764
5765       flag = sh_flags & - sh_flags;
5766       sh_flags &= ~ flag;
5767
5768       if (do_section_details)
5769         {
5770           switch (flag)
5771             {
5772             case SHF_WRITE:             sindex = 0; break;
5773             case SHF_ALLOC:             sindex = 1; break;
5774             case SHF_EXECINSTR:         sindex = 2; break;
5775             case SHF_MERGE:             sindex = 3; break;
5776             case SHF_STRINGS:           sindex = 4; break;
5777             case SHF_INFO_LINK:         sindex = 5; break;
5778             case SHF_LINK_ORDER:        sindex = 6; break;
5779             case SHF_OS_NONCONFORMING:  sindex = 7; break;
5780             case SHF_GROUP:             sindex = 8; break;
5781             case SHF_TLS:               sindex = 9; break;
5782             case SHF_EXCLUDE:           sindex = 18; break;
5783             case SHF_COMPRESSED:        sindex = 20; break;
5784             case SHF_GNU_MBIND:         sindex = 24; break;
5785
5786             default:
5787               sindex = -1;
5788               switch (filedata->file_header.e_machine)
5789                 {
5790                 case EM_IA_64:
5791                   if (flag == SHF_IA_64_SHORT)
5792                     sindex = 10;
5793                   else if (flag == SHF_IA_64_NORECOV)
5794                     sindex = 11;
5795 #ifdef BFD64
5796                   else if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5797                     switch (flag)
5798                       {
5799                       case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
5800                       case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
5801                       case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
5802                       case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
5803                       case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5804                       case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
5805                       default:                        break;
5806                       }
5807 #endif
5808                   break;
5809
5810                 case EM_386:
5811                 case EM_IAMCU:
5812                 case EM_X86_64:
5813                 case EM_L1OM:
5814                 case EM_K1OM:
5815                 case EM_OLD_SPARCV9:
5816                 case EM_SPARC32PLUS:
5817                 case EM_SPARCV9:
5818                 case EM_SPARC:
5819                   if (flag == SHF_ORDERED)
5820                     sindex = 19;
5821                   break;
5822
5823                 case EM_ARM:
5824                   switch (flag)
5825                     {
5826                     case SHF_ENTRYSECT: sindex = 21; break;
5827                     case SHF_ARM_PURECODE: sindex = 22; break;
5828                     case SHF_COMDEF: sindex = 23; break;
5829                     default: break;
5830                     }
5831                   break;
5832                 case EM_PPC:
5833                   if (flag == SHF_PPC_VLE)
5834                     sindex = 25;
5835                   break;
5836
5837                 default:
5838                   break;
5839                 }
5840             }
5841
5842           if (sindex != -1)
5843             {
5844               if (p != buff + field_size + 4)
5845                 {
5846                   if (size < (10 + 2))
5847                     {
5848                       warn (_("Internal error: not enough buffer room for section flag info"));
5849                       return _("<unknown>");
5850                     }
5851                   size -= 2;
5852                   *p++ = ',';
5853                   *p++ = ' ';
5854                 }
5855
5856               size -= flags [sindex].len;
5857               p = stpcpy (p, flags [sindex].str);
5858             }
5859           else if (flag & SHF_MASKOS)
5860             os_flags |= flag;
5861           else if (flag & SHF_MASKPROC)
5862             proc_flags |= flag;
5863           else
5864             unknown_flags |= flag;
5865         }
5866       else
5867         {
5868           switch (flag)
5869             {
5870             case SHF_WRITE:             *p = 'W'; break;
5871             case SHF_ALLOC:             *p = 'A'; break;
5872             case SHF_EXECINSTR:         *p = 'X'; break;
5873             case SHF_MERGE:             *p = 'M'; break;
5874             case SHF_STRINGS:           *p = 'S'; break;
5875             case SHF_INFO_LINK:         *p = 'I'; break;
5876             case SHF_LINK_ORDER:        *p = 'L'; break;
5877             case SHF_OS_NONCONFORMING:  *p = 'O'; break;
5878             case SHF_GROUP:             *p = 'G'; break;
5879             case SHF_TLS:               *p = 'T'; break;
5880             case SHF_EXCLUDE:           *p = 'E'; break;
5881             case SHF_COMPRESSED:        *p = 'C'; break;
5882             case SHF_GNU_MBIND:         *p = 'D'; break;
5883
5884             default:
5885               if ((filedata->file_header.e_machine == EM_X86_64
5886                    || filedata->file_header.e_machine == EM_L1OM
5887                    || filedata->file_header.e_machine == EM_K1OM)
5888                   && flag == SHF_X86_64_LARGE)
5889                 *p = 'l';
5890               else if (filedata->file_header.e_machine == EM_ARM
5891                        && flag == SHF_ARM_PURECODE)
5892                   *p = 'y';
5893               else if (filedata->file_header.e_machine == EM_PPC
5894                        && flag == SHF_PPC_VLE)
5895                   *p = 'v';
5896               else if (flag & SHF_MASKOS)
5897                 {
5898                   *p = 'o';
5899                   sh_flags &= ~ SHF_MASKOS;
5900                 }
5901               else if (flag & SHF_MASKPROC)
5902                 {
5903                   *p = 'p';
5904                   sh_flags &= ~ SHF_MASKPROC;
5905                 }
5906               else
5907                 *p = 'x';
5908               break;
5909             }
5910           p++;
5911         }
5912     }
5913
5914   if (do_section_details)
5915     {
5916       if (os_flags)
5917         {
5918           size -= 5 + field_size;
5919           if (p != buff + field_size + 4)
5920             {
5921               if (size < (2 + 1))
5922                 {
5923                   warn (_("Internal error: not enough buffer room for section flag info"));
5924                   return _("<unknown>");
5925                 }
5926               size -= 2;
5927               *p++ = ',';
5928               *p++ = ' ';
5929             }
5930           sprintf (p, "OS (%*.*lx)", field_size, field_size,
5931                    (unsigned long) os_flags);
5932           p += 5 + field_size;
5933         }
5934       if (proc_flags)
5935         {
5936           size -= 7 + field_size;
5937           if (p != buff + field_size + 4)
5938             {
5939               if (size < (2 + 1))
5940                 {
5941                   warn (_("Internal error: not enough buffer room for section flag info"));
5942                   return _("<unknown>");
5943                 }
5944               size -= 2;
5945               *p++ = ',';
5946               *p++ = ' ';
5947             }
5948           sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5949                    (unsigned long) proc_flags);
5950           p += 7 + field_size;
5951         }
5952       if (unknown_flags)
5953         {
5954           size -= 10 + field_size;
5955           if (p != buff + field_size + 4)
5956             {
5957               if (size < (2 + 1))
5958                 {
5959                   warn (_("Internal error: not enough buffer room for section flag info"));
5960                   return _("<unknown>");
5961                 }
5962               size -= 2;
5963               *p++ = ',';
5964               *p++ = ' ';
5965             }
5966           sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5967                    (unsigned long) unknown_flags);
5968           p += 10 + field_size;
5969         }
5970     }
5971
5972   *p = '\0';
5973   return buff;
5974 }
5975
5976 static unsigned int
5977 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf, bfd_size_type size)
5978 {
5979   if (is_32bit_elf)
5980     {
5981       Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5982
5983       if (size < sizeof (* echdr))
5984         {
5985           error (_("Compressed section is too small even for a compression header\n"));
5986           return 0;
5987         }
5988
5989       chdr->ch_type = BYTE_GET (echdr->ch_type);
5990       chdr->ch_size = BYTE_GET (echdr->ch_size);
5991       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5992       return sizeof (*echdr);
5993     }
5994   else
5995     {
5996       Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
5997
5998       if (size < sizeof (* echdr))
5999         {
6000           error (_("Compressed section is too small even for a compression header\n"));
6001           return 0;
6002         }
6003
6004       chdr->ch_type = BYTE_GET (echdr->ch_type);
6005       chdr->ch_size = BYTE_GET (echdr->ch_size);
6006       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
6007       return sizeof (*echdr);
6008     }
6009 }
6010
6011 static bfd_boolean
6012 process_section_headers (Filedata * filedata)
6013 {
6014   Elf_Internal_Shdr * section;
6015   unsigned int i;
6016
6017   filedata->section_headers = NULL;
6018
6019   if (filedata->file_header.e_shnum == 0)
6020     {
6021       /* PR binutils/12467.  */
6022       if (filedata->file_header.e_shoff != 0)
6023         {
6024           warn (_("possibly corrupt ELF file header - it has a non-zero"
6025                   " section header offset, but no section headers\n"));
6026           return FALSE;
6027         }
6028       else if (do_sections)
6029         printf (_("\nThere are no sections in this file.\n"));
6030
6031       return TRUE;
6032     }
6033
6034   if (do_sections && !do_header)
6035     printf (ngettext ("There is %d section header, "
6036                       "starting at offset 0x%lx:\n",
6037                       "There are %d section headers, "
6038                       "starting at offset 0x%lx:\n",
6039                       filedata->file_header.e_shnum),
6040             filedata->file_header.e_shnum,
6041             (unsigned long) filedata->file_header.e_shoff);
6042
6043   if (is_32bit_elf)
6044     {
6045       if (! get_32bit_section_headers (filedata, FALSE))
6046         return FALSE;
6047     }
6048   else
6049     {
6050       if (! get_64bit_section_headers (filedata, FALSE))
6051         return FALSE;
6052     }
6053
6054   /* Read in the string table, so that we have names to display.  */
6055   if (filedata->file_header.e_shstrndx != SHN_UNDEF
6056        && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
6057     {
6058       section = filedata->section_headers + filedata->file_header.e_shstrndx;
6059
6060       if (section->sh_size != 0)
6061         {
6062           filedata->string_table = (char *) get_data (NULL, filedata, section->sh_offset,
6063                                                       1, section->sh_size,
6064                                                       _("string table"));
6065
6066           filedata->string_table_length = filedata->string_table != NULL ? section->sh_size : 0;
6067         }
6068     }
6069
6070   /* Scan the sections for the dynamic symbol table
6071      and dynamic string table and debug sections.  */
6072   dynamic_symbols = NULL;
6073   dynamic_strings = NULL;
6074   dynamic_syminfo = NULL;
6075   symtab_shndx_list = NULL;
6076
6077   eh_addr_size = is_32bit_elf ? 4 : 8;
6078   switch (filedata->file_header.e_machine)
6079     {
6080     case EM_MIPS:
6081     case EM_MIPS_RS3_LE:
6082       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
6083          FDE addresses.  However, the ABI also has a semi-official ILP32
6084          variant for which the normal FDE address size rules apply.
6085
6086          GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
6087          section, where XX is the size of longs in bits.  Unfortunately,
6088          earlier compilers provided no way of distinguishing ILP32 objects
6089          from LP64 objects, so if there's any doubt, we should assume that
6090          the official LP64 form is being used.  */
6091       if ((filedata->file_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
6092           && find_section (filedata, ".gcc_compiled_long32") == NULL)
6093         eh_addr_size = 8;
6094       break;
6095
6096     case EM_H8_300:
6097     case EM_H8_300H:
6098       switch (filedata->file_header.e_flags & EF_H8_MACH)
6099         {
6100         case E_H8_MACH_H8300:
6101         case E_H8_MACH_H8300HN:
6102         case E_H8_MACH_H8300SN:
6103         case E_H8_MACH_H8300SXN:
6104           eh_addr_size = 2;
6105           break;
6106         case E_H8_MACH_H8300H:
6107         case E_H8_MACH_H8300S:
6108         case E_H8_MACH_H8300SX:
6109           eh_addr_size = 4;
6110           break;
6111         }
6112       break;
6113
6114     case EM_M32C_OLD:
6115     case EM_M32C:
6116       switch (filedata->file_header.e_flags & EF_M32C_CPU_MASK)
6117         {
6118         case EF_M32C_CPU_M16C:
6119           eh_addr_size = 2;
6120           break;
6121         }
6122       break;
6123     }
6124
6125 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64)                \
6126   do                                                                    \
6127     {                                                                   \
6128       bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64;  \
6129       if (section->sh_entsize != expected_entsize)                      \
6130         {                                                               \
6131           char buf[40];                                                 \
6132           sprintf_vma (buf, section->sh_entsize);                       \
6133           /* Note: coded this way so that there is a single string for  \
6134              translation.  */ \
6135           error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
6136           error (_("(Using the expected size of %u for the rest of this dump)\n"), \
6137                    (unsigned) expected_entsize);                        \
6138           section->sh_entsize = expected_entsize;                       \
6139         }                                                               \
6140     }                                                                   \
6141   while (0)
6142
6143 #define CHECK_ENTSIZE(section, i, type)                                 \
6144   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),         \
6145                         sizeof (Elf64_External_##type))
6146
6147   for (i = 0, section = filedata->section_headers;
6148        i < filedata->file_header.e_shnum;
6149        i++, section++)
6150     {
6151       char * name = SECTION_NAME (section);
6152
6153       if (section->sh_type == SHT_DYNSYM)
6154         {
6155           if (dynamic_symbols != NULL)
6156             {
6157               error (_("File contains multiple dynamic symbol tables\n"));
6158               continue;
6159             }
6160
6161           CHECK_ENTSIZE (section, i, Sym);
6162           dynamic_symbols = GET_ELF_SYMBOLS (filedata, section, & num_dynamic_syms);
6163         }
6164       else if (section->sh_type == SHT_STRTAB
6165                && streq (name, ".dynstr"))
6166         {
6167           if (dynamic_strings != NULL)
6168             {
6169               error (_("File contains multiple dynamic string tables\n"));
6170               continue;
6171             }
6172
6173           dynamic_strings = (char *) get_data (NULL, filedata, section->sh_offset,
6174                                                1, section->sh_size,
6175                                                _("dynamic strings"));
6176           dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
6177         }
6178       else if (section->sh_type == SHT_SYMTAB_SHNDX)
6179         {
6180           elf_section_list * entry = xmalloc (sizeof * entry);
6181
6182           entry->hdr = section;
6183           entry->next = symtab_shndx_list;
6184           symtab_shndx_list = entry;
6185         }
6186       else if (section->sh_type == SHT_SYMTAB)
6187         CHECK_ENTSIZE (section, i, Sym);
6188       else if (section->sh_type == SHT_GROUP)
6189         CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
6190       else if (section->sh_type == SHT_REL)
6191         CHECK_ENTSIZE (section, i, Rel);
6192       else if (section->sh_type == SHT_RELA)
6193         CHECK_ENTSIZE (section, i, Rela);
6194       else if ((do_debugging || do_debug_info || do_debug_abbrevs
6195                 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
6196                 || do_debug_aranges || do_debug_frames || do_debug_macinfo
6197                 || do_debug_str || do_debug_loc || do_debug_ranges
6198                 || do_debug_addr || do_debug_cu_index || do_debug_links)
6199                && (const_strneq (name, ".debug_")
6200                    || const_strneq (name, ".zdebug_")))
6201         {
6202           if (name[1] == 'z')
6203             name += sizeof (".zdebug_") - 1;
6204           else
6205             name += sizeof (".debug_") - 1;
6206
6207           if (do_debugging
6208               || (do_debug_info     && const_strneq (name, "info"))
6209               || (do_debug_info     && const_strneq (name, "types"))
6210               || (do_debug_abbrevs  && const_strneq (name, "abbrev"))
6211               || (do_debug_lines    && strcmp (name, "line") == 0)
6212               || (do_debug_lines    && const_strneq (name, "line."))
6213               || (do_debug_pubnames && const_strneq (name, "pubnames"))
6214               || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
6215               || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
6216               || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
6217               || (do_debug_aranges  && const_strneq (name, "aranges"))
6218               || (do_debug_ranges   && const_strneq (name, "ranges"))
6219               || (do_debug_ranges   && const_strneq (name, "rnglists"))
6220               || (do_debug_frames   && const_strneq (name, "frame"))
6221               || (do_debug_macinfo  && const_strneq (name, "macinfo"))
6222               || (do_debug_macinfo  && const_strneq (name, "macro"))
6223               || (do_debug_str      && const_strneq (name, "str"))
6224               || (do_debug_loc      && const_strneq (name, "loc"))
6225               || (do_debug_loc      && const_strneq (name, "loclists"))
6226               || (do_debug_addr     && const_strneq (name, "addr"))
6227               || (do_debug_cu_index && const_strneq (name, "cu_index"))
6228               || (do_debug_cu_index && const_strneq (name, "tu_index"))
6229               )
6230             request_dump_bynumber (filedata, i, DEBUG_DUMP);
6231         }
6232       /* Linkonce section to be combined with .debug_info at link time.  */
6233       else if ((do_debugging || do_debug_info)
6234                && const_strneq (name, ".gnu.linkonce.wi."))
6235         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6236       else if (do_debug_frames && streq (name, ".eh_frame"))
6237         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6238       else if (do_gdb_index && (streq (name, ".gdb_index")
6239                                 || streq (name, ".debug_names")))
6240         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6241       /* Trace sections for Itanium VMS.  */
6242       else if ((do_debugging || do_trace_info || do_trace_abbrevs
6243                 || do_trace_aranges)
6244                && const_strneq (name, ".trace_"))
6245         {
6246           name += sizeof (".trace_") - 1;
6247
6248           if (do_debugging
6249               || (do_trace_info     && streq (name, "info"))
6250               || (do_trace_abbrevs  && streq (name, "abbrev"))
6251               || (do_trace_aranges  && streq (name, "aranges"))
6252               )
6253             request_dump_bynumber (filedata, i, DEBUG_DUMP);
6254         }
6255       else if ((do_debugging || do_debug_links)
6256                && (const_strneq (name, ".gnu_debuglink")
6257                    || const_strneq (name, ".gnu_debugaltlink")))
6258         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6259     }
6260
6261   if (! do_sections)
6262     return TRUE;
6263
6264   if (filedata->file_header.e_shnum > 1)
6265     printf (_("\nSection Headers:\n"));
6266   else
6267     printf (_("\nSection Header:\n"));
6268
6269   if (is_32bit_elf)
6270     {
6271       if (do_section_details)
6272         {
6273           printf (_("  [Nr] Name\n"));
6274           printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
6275         }
6276       else
6277         printf
6278           (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
6279     }
6280   else if (do_wide)
6281     {
6282       if (do_section_details)
6283         {
6284           printf (_("  [Nr] Name\n"));
6285           printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
6286         }
6287       else
6288         printf
6289           (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
6290     }
6291   else
6292     {
6293       if (do_section_details)
6294         {
6295           printf (_("  [Nr] Name\n"));
6296           printf (_("       Type              Address          Offset            Link\n"));
6297           printf (_("       Size              EntSize          Info              Align\n"));
6298         }
6299       else
6300         {
6301           printf (_("  [Nr] Name              Type             Address           Offset\n"));
6302           printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
6303         }
6304     }
6305
6306   if (do_section_details)
6307     printf (_("       Flags\n"));
6308
6309   for (i = 0, section = filedata->section_headers;
6310        i < filedata->file_header.e_shnum;
6311        i++, section++)
6312     {
6313       /* Run some sanity checks on the section header.  */
6314
6315       /* Check the sh_link field.  */
6316       switch (section->sh_type)
6317         {
6318         case SHT_REL:
6319         case SHT_RELA:
6320           if (section->sh_link == 0
6321               && (filedata->file_header.e_type == ET_EXEC
6322                   || filedata->file_header.e_type == ET_DYN))
6323             /* A dynamic relocation section where all entries use a
6324                zero symbol index need not specify a symtab section.  */
6325             break;
6326           /* Fall through.  */
6327         case SHT_SYMTAB_SHNDX:
6328         case SHT_GROUP:
6329         case SHT_HASH:
6330         case SHT_GNU_HASH:
6331         case SHT_GNU_versym:
6332           if (section->sh_link == 0
6333               || section->sh_link >= filedata->file_header.e_shnum
6334               || (filedata->section_headers[section->sh_link].sh_type != SHT_SYMTAB
6335                   && filedata->section_headers[section->sh_link].sh_type != SHT_DYNSYM))
6336             warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6337                   i, section->sh_link);
6338           break;
6339
6340         case SHT_DYNAMIC:
6341         case SHT_SYMTAB:
6342         case SHT_DYNSYM:
6343         case SHT_GNU_verneed:
6344         case SHT_GNU_verdef:
6345         case SHT_GNU_LIBLIST:
6346           if (section->sh_link == 0
6347               || section->sh_link >= filedata->file_header.e_shnum
6348               || filedata->section_headers[section->sh_link].sh_type != SHT_STRTAB)
6349             warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6350                   i, section->sh_link);
6351           break;
6352
6353         case SHT_INIT_ARRAY:
6354         case SHT_FINI_ARRAY:
6355         case SHT_PREINIT_ARRAY:
6356           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6357             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6358                   i, section->sh_link);
6359           break;
6360
6361         default:
6362           /* FIXME: Add support for target specific section types.  */
6363 #if 0     /* Currently we do not check other section types as there are too
6364              many special cases.  Stab sections for example have a type
6365              of SHT_PROGBITS but an sh_link field that links to the .stabstr
6366              section.  */
6367           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6368             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6369                   i, section->sh_link);
6370 #endif
6371           break;
6372         }
6373
6374       /* Check the sh_info field.  */
6375       switch (section->sh_type)
6376         {
6377         case SHT_REL:
6378         case SHT_RELA:
6379           if (section->sh_info == 0
6380               && (filedata->file_header.e_type == ET_EXEC
6381                   || filedata->file_header.e_type == ET_DYN))
6382             /* Dynamic relocations apply to segments, so they do not
6383                need to specify the section they relocate.  */
6384             break;
6385           if (section->sh_info == 0
6386               || section->sh_info >= filedata->file_header.e_shnum
6387               || (filedata->section_headers[section->sh_info].sh_type != SHT_PROGBITS
6388                   && filedata->section_headers[section->sh_info].sh_type != SHT_NOBITS
6389                   && filedata->section_headers[section->sh_info].sh_type != SHT_NOTE
6390                   && filedata->section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
6391                   && filedata->section_headers[section->sh_info].sh_type != SHT_FINI_ARRAY
6392                   && filedata->section_headers[section->sh_info].sh_type != SHT_PREINIT_ARRAY
6393                   /* FIXME: Are other section types valid ?  */
6394                   && filedata->section_headers[section->sh_info].sh_type < SHT_LOOS))
6395             warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6396                   i, section->sh_info);
6397           break;
6398
6399         case SHT_DYNAMIC:
6400         case SHT_HASH:
6401         case SHT_SYMTAB_SHNDX:
6402         case SHT_INIT_ARRAY:
6403         case SHT_FINI_ARRAY:
6404         case SHT_PREINIT_ARRAY:
6405           if (section->sh_info != 0)
6406             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6407                   i, section->sh_info);
6408           break;
6409
6410         case SHT_GROUP:
6411         case SHT_SYMTAB:
6412         case SHT_DYNSYM:
6413           /* A symbol index - we assume that it is valid.  */
6414           break;
6415
6416         default:
6417           /* FIXME: Add support for target specific section types.  */
6418           if (section->sh_type == SHT_NOBITS)
6419             /* NOBITS section headers with non-zero sh_info fields can be
6420                created when a binary is stripped of everything but its debug
6421                information.  The stripped sections have their headers
6422                preserved but their types set to SHT_NOBITS.  So do not check
6423                this type of section.  */
6424             ;
6425           else if (section->sh_flags & SHF_INFO_LINK)
6426             {
6427               if (section->sh_info < 1 || section->sh_info >= filedata->file_header.e_shnum)
6428                 warn (_("[%2u]: Expected link to another section in info field"), i);
6429             }
6430           else if (section->sh_type < SHT_LOOS
6431                    && (section->sh_flags & SHF_GNU_MBIND) == 0
6432                    && section->sh_info != 0)
6433             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6434                   i, section->sh_info);
6435           break;
6436         }
6437
6438       /* Check the sh_size field.  */
6439       if (section->sh_size > filedata->file_size
6440           && section->sh_type != SHT_NOBITS
6441           && section->sh_type != SHT_NULL
6442           && section->sh_type < SHT_LOOS)
6443         warn (_("Size of section %u is larger than the entire file!\n"), i);
6444
6445       printf ("  [%2u] ", i);
6446       if (do_section_details)
6447         printf ("%s\n      ", printable_section_name (filedata, section));
6448       else
6449         print_symbol (-17, SECTION_NAME (section));
6450
6451       printf (do_wide ? " %-15s " : " %-15.15s ",
6452               get_section_type_name (filedata, section->sh_type));
6453
6454       if (is_32bit_elf)
6455         {
6456           const char * link_too_big = NULL;
6457
6458           print_vma (section->sh_addr, LONG_HEX);
6459
6460           printf ( " %6.6lx %6.6lx %2.2lx",
6461                    (unsigned long) section->sh_offset,
6462                    (unsigned long) section->sh_size,
6463                    (unsigned long) section->sh_entsize);
6464
6465           if (do_section_details)
6466             fputs ("  ", stdout);
6467           else
6468             printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6469
6470           if (section->sh_link >= filedata->file_header.e_shnum)
6471             {
6472               link_too_big = "";
6473               /* The sh_link value is out of range.  Normally this indicates
6474                  an error but it can have special values in Solaris binaries.  */
6475               switch (filedata->file_header.e_machine)
6476                 {
6477                 case EM_386:
6478                 case EM_IAMCU:
6479                 case EM_X86_64:
6480                 case EM_L1OM:
6481                 case EM_K1OM:
6482                 case EM_OLD_SPARCV9:
6483                 case EM_SPARC32PLUS:
6484                 case EM_SPARCV9:
6485                 case EM_SPARC:
6486                   if (section->sh_link == (SHN_BEFORE & 0xffff))
6487                     link_too_big = "BEFORE";
6488                   else if (section->sh_link == (SHN_AFTER & 0xffff))
6489                     link_too_big = "AFTER";
6490                   break;
6491                 default:
6492                   break;
6493                 }
6494             }
6495
6496           if (do_section_details)
6497             {
6498               if (link_too_big != NULL && * link_too_big)
6499                 printf ("<%s> ", link_too_big);
6500               else
6501                 printf ("%2u ", section->sh_link);
6502               printf ("%3u %2lu\n", section->sh_info,
6503                       (unsigned long) section->sh_addralign);
6504             }
6505           else
6506             printf ("%2u %3u %2lu\n",
6507                     section->sh_link,
6508                     section->sh_info,
6509                     (unsigned long) section->sh_addralign);
6510
6511           if (link_too_big && ! * link_too_big)
6512             warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6513                   i, section->sh_link);
6514         }
6515       else if (do_wide)
6516         {
6517           print_vma (section->sh_addr, LONG_HEX);
6518
6519           if ((long) section->sh_offset == section->sh_offset)
6520             printf (" %6.6lx", (unsigned long) section->sh_offset);
6521           else
6522             {
6523               putchar (' ');
6524               print_vma (section->sh_offset, LONG_HEX);
6525             }
6526
6527           if ((unsigned long) section->sh_size == section->sh_size)
6528             printf (" %6.6lx", (unsigned long) section->sh_size);
6529           else
6530             {
6531               putchar (' ');
6532               print_vma (section->sh_size, LONG_HEX);
6533             }
6534
6535           if ((unsigned long) section->sh_entsize == section->sh_entsize)
6536             printf (" %2.2lx", (unsigned long) section->sh_entsize);
6537           else
6538             {
6539               putchar (' ');
6540               print_vma (section->sh_entsize, LONG_HEX);
6541             }
6542
6543           if (do_section_details)
6544             fputs ("  ", stdout);
6545           else
6546             printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6547
6548           printf ("%2u %3u ", section->sh_link, section->sh_info);
6549
6550           if ((unsigned long) section->sh_addralign == section->sh_addralign)
6551             printf ("%2lu\n", (unsigned long) section->sh_addralign);
6552           else
6553             {
6554               print_vma (section->sh_addralign, DEC);
6555               putchar ('\n');
6556             }
6557         }
6558       else if (do_section_details)
6559         {
6560           putchar (' ');
6561           print_vma (section->sh_addr, LONG_HEX);
6562           if ((long) section->sh_offset == section->sh_offset)
6563             printf ("  %16.16lx", (unsigned long) section->sh_offset);
6564           else
6565             {
6566               printf ("  ");
6567               print_vma (section->sh_offset, LONG_HEX);
6568             }
6569           printf ("  %u\n       ", section->sh_link);
6570           print_vma (section->sh_size, LONG_HEX);
6571           putchar (' ');
6572           print_vma (section->sh_entsize, LONG_HEX);
6573
6574           printf ("  %-16u  %lu\n",
6575                   section->sh_info,
6576                   (unsigned long) section->sh_addralign);
6577         }
6578       else
6579         {
6580           putchar (' ');
6581           print_vma (section->sh_addr, LONG_HEX);
6582           if ((long) section->sh_offset == section->sh_offset)
6583             printf ("  %8.8lx", (unsigned long) section->sh_offset);
6584           else
6585             {
6586               printf ("  ");
6587               print_vma (section->sh_offset, LONG_HEX);
6588             }
6589           printf ("\n       ");
6590           print_vma (section->sh_size, LONG_HEX);
6591           printf ("  ");
6592           print_vma (section->sh_entsize, LONG_HEX);
6593
6594           printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6595
6596           printf ("     %2u   %3u     %lu\n",
6597                   section->sh_link,
6598                   section->sh_info,
6599                   (unsigned long) section->sh_addralign);
6600         }
6601
6602       if (do_section_details)
6603         {
6604           printf ("       %s\n", get_elf_section_flags (filedata, section->sh_flags));
6605           if ((section->sh_flags & SHF_COMPRESSED) != 0)
6606             {
6607               /* Minimum section size is 12 bytes for 32-bit compression
6608                  header + 12 bytes for compressed data header.  */
6609               unsigned char buf[24];
6610
6611               assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6612               if (get_data (&buf, filedata, section->sh_offset, 1,
6613                             sizeof (buf), _("compression header")))
6614                 {
6615                   Elf_Internal_Chdr chdr;
6616
6617                   (void) get_compression_header (&chdr, buf, sizeof (buf));
6618
6619                   if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6620                     printf ("       ZLIB, ");
6621                   else
6622                     printf (_("       [<unknown>: 0x%x], "),
6623                             chdr.ch_type);
6624                   print_vma (chdr.ch_size, LONG_HEX);
6625                   printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6626                 }
6627             }
6628         }
6629     }
6630
6631   if (!do_section_details)
6632     {
6633       /* The ordering of the letters shown here matches the ordering of the
6634          corresponding SHF_xxx values, and hence the order in which these
6635          letters will be displayed to the user.  */
6636       printf (_("Key to Flags:\n\
6637   W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6638   L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6639   C (compressed), x (unknown), o (OS specific), E (exclude),\n  "));
6640       if (filedata->file_header.e_machine == EM_X86_64
6641           || filedata->file_header.e_machine == EM_L1OM
6642           || filedata->file_header.e_machine == EM_K1OM)
6643         printf (_("l (large), "));
6644       else if (filedata->file_header.e_machine == EM_ARM)
6645         printf (_("y (purecode), "));
6646       else if (filedata->file_header.e_machine == EM_PPC)
6647         printf (_("v (VLE), "));
6648       printf ("p (processor specific)\n");
6649     }
6650
6651   return TRUE;
6652 }
6653
6654 static const char *
6655 get_group_flags (unsigned int flags)
6656 {
6657   static char buff[128];
6658
6659   if (flags == 0)
6660     return "";
6661   else if (flags == GRP_COMDAT)
6662     return "COMDAT ";
6663
6664   snprintf (buff, 14, _("[0x%x: "), flags);
6665
6666   flags &= ~ GRP_COMDAT;
6667   if (flags & GRP_MASKOS)
6668     {
6669       strcat (buff, "<OS specific>");
6670       flags &= ~ GRP_MASKOS;
6671     }
6672
6673   if (flags & GRP_MASKPROC)
6674     {
6675       strcat (buff, "<PROC specific>");
6676       flags &= ~ GRP_MASKPROC;
6677     }
6678
6679   if (flags)
6680     strcat (buff, "<unknown>");
6681
6682   strcat (buff, "]");
6683   return buff;
6684 }
6685
6686 static bfd_boolean
6687 process_section_groups (Filedata * filedata)
6688 {
6689   Elf_Internal_Shdr * section;
6690   unsigned int i;
6691   struct group * group;
6692   Elf_Internal_Shdr * symtab_sec;
6693   Elf_Internal_Shdr * strtab_sec;
6694   Elf_Internal_Sym * symtab;
6695   unsigned long num_syms;
6696   char * strtab;
6697   size_t strtab_size;
6698
6699   /* Don't process section groups unless needed.  */
6700   if (!do_unwind && !do_section_groups)
6701     return TRUE;
6702
6703   if (filedata->file_header.e_shnum == 0)
6704     {
6705       if (do_section_groups)
6706         printf (_("\nThere are no sections to group in this file.\n"));
6707
6708       return TRUE;
6709     }
6710
6711   if (filedata->section_headers == NULL)
6712     {
6713       error (_("Section headers are not available!\n"));
6714       /* PR 13622: This can happen with a corrupt ELF header.  */
6715       return FALSE;
6716     }
6717
6718   section_headers_groups = (struct group **) calloc (filedata->file_header.e_shnum,
6719                                                      sizeof (struct group *));
6720
6721   if (section_headers_groups == NULL)
6722     {
6723       error (_("Out of memory reading %u section group headers\n"),
6724              filedata->file_header.e_shnum);
6725       return FALSE;
6726     }
6727
6728   /* Scan the sections for the group section.  */
6729   group_count = 0;
6730   for (i = 0, section = filedata->section_headers;
6731        i < filedata->file_header.e_shnum;
6732        i++, section++)
6733     if (section->sh_type == SHT_GROUP)
6734       group_count++;
6735
6736   if (group_count == 0)
6737     {
6738       if (do_section_groups)
6739         printf (_("\nThere are no section groups in this file.\n"));
6740
6741       return TRUE;
6742     }
6743
6744   section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6745
6746   if (section_groups == NULL)
6747     {
6748       error (_("Out of memory reading %lu groups\n"),
6749              (unsigned long) group_count);
6750       return FALSE;
6751     }
6752
6753   symtab_sec = NULL;
6754   strtab_sec = NULL;
6755   symtab = NULL;
6756   num_syms = 0;
6757   strtab = NULL;
6758   strtab_size = 0;
6759   for (i = 0, section = filedata->section_headers, group = section_groups;
6760        i < filedata->file_header.e_shnum;
6761        i++, section++)
6762     {
6763       if (section->sh_type == SHT_GROUP)
6764         {
6765           const char * name = printable_section_name (filedata, section);
6766           const char * group_name;
6767           unsigned char * start;
6768           unsigned char * indices;
6769           unsigned int entry, j, size;
6770           Elf_Internal_Shdr * sec;
6771           Elf_Internal_Sym * sym;
6772
6773           /* Get the symbol table.  */
6774           if (section->sh_link >= filedata->file_header.e_shnum
6775               || ((sec = filedata->section_headers + section->sh_link)->sh_type
6776                   != SHT_SYMTAB))
6777             {
6778               error (_("Bad sh_link in group section `%s'\n"), name);
6779               continue;
6780             }
6781
6782           if (symtab_sec != sec)
6783             {
6784               symtab_sec = sec;
6785               if (symtab)
6786                 free (symtab);
6787               symtab = GET_ELF_SYMBOLS (filedata, symtab_sec, & num_syms);
6788             }
6789
6790           if (symtab == NULL)
6791             {
6792               error (_("Corrupt header in group section `%s'\n"), name);
6793               continue;
6794             }
6795
6796           if (section->sh_info >= num_syms)
6797             {
6798               error (_("Bad sh_info in group section `%s'\n"), name);
6799               continue;
6800             }
6801
6802           sym = symtab + section->sh_info;
6803
6804           if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6805             {
6806               if (sym->st_shndx == 0
6807                   || sym->st_shndx >= filedata->file_header.e_shnum)
6808                 {
6809                   error (_("Bad sh_info in group section `%s'\n"), name);
6810                   continue;
6811                 }
6812
6813               group_name = SECTION_NAME (filedata->section_headers + sym->st_shndx);
6814               strtab_sec = NULL;
6815               if (strtab)
6816                 free (strtab);
6817               strtab = NULL;
6818               strtab_size = 0;
6819             }
6820           else
6821             {
6822               /* Get the string table.  */
6823               if (symtab_sec->sh_link >= filedata->file_header.e_shnum)
6824                 {
6825                   strtab_sec = NULL;
6826                   if (strtab)
6827                     free (strtab);
6828                   strtab = NULL;
6829                   strtab_size = 0;
6830                 }
6831               else if (strtab_sec
6832                        != (sec = filedata->section_headers + symtab_sec->sh_link))
6833                 {
6834                   strtab_sec = sec;
6835                   if (strtab)
6836                     free (strtab);
6837
6838                   strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
6839                                               1, strtab_sec->sh_size,
6840                                               _("string table"));
6841                   strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6842                 }
6843               group_name = sym->st_name < strtab_size
6844                 ? strtab + sym->st_name : _("<corrupt>");
6845             }
6846
6847           /* PR 17531: file: loop.  */
6848           if (section->sh_entsize > section->sh_size)
6849             {
6850               error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6851                      printable_section_name (filedata, section),
6852                      (unsigned long) section->sh_entsize,
6853                      (unsigned long) section->sh_size);
6854               break;
6855             }
6856
6857           start = (unsigned char *) get_data (NULL, filedata, section->sh_offset,
6858                                               1, section->sh_size,
6859                                               _("section data"));
6860           if (start == NULL)
6861             continue;
6862
6863           indices = start;
6864           size = (section->sh_size / section->sh_entsize) - 1;
6865           entry = byte_get (indices, 4);
6866           indices += 4;
6867
6868           if (do_section_groups)
6869             {
6870               printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6871                       get_group_flags (entry), i, name, group_name, size);
6872
6873               printf (_("   [Index]    Name\n"));
6874             }
6875
6876           group->group_index = i;
6877
6878           for (j = 0; j < size; j++)
6879             {
6880               struct group_list * g;
6881
6882               entry = byte_get (indices, 4);
6883               indices += 4;
6884
6885               if (entry >= filedata->file_header.e_shnum)
6886                 {
6887                   static unsigned num_group_errors = 0;
6888
6889                   if (num_group_errors ++ < 10)
6890                     {
6891                       error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6892                              entry, i, filedata->file_header.e_shnum - 1);
6893                       if (num_group_errors == 10)
6894                         warn (_("Further error messages about overlarge group section indices suppressed\n"));
6895                     }
6896                   continue;
6897                 }
6898
6899               if (section_headers_groups [entry] != NULL)
6900                 {
6901                   if (entry)
6902                     {
6903                       static unsigned num_errs = 0;
6904
6905                       if (num_errs ++ < 10)
6906                         {
6907                           error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6908                                  entry, i,
6909                                  section_headers_groups [entry]->group_index);
6910                           if (num_errs == 10)
6911                             warn (_("Further error messages about already contained group sections suppressed\n"));
6912                         }
6913                       continue;
6914                     }
6915                   else
6916                     {
6917                       /* Intel C/C++ compiler may put section 0 in a
6918                          section group.  We just warn it the first time
6919                          and ignore it afterwards.  */
6920                       static bfd_boolean warned = FALSE;
6921                       if (!warned)
6922                         {
6923                           error (_("section 0 in group section [%5u]\n"),
6924                                  section_headers_groups [entry]->group_index);
6925                           warned = TRUE;
6926                         }
6927                     }
6928                 }
6929
6930               section_headers_groups [entry] = group;
6931
6932               if (do_section_groups)
6933                 {
6934                   sec = filedata->section_headers + entry;
6935                   printf ("   [%5u]   %s\n", entry, printable_section_name (filedata, sec));
6936                 }
6937
6938               g = (struct group_list *) xmalloc (sizeof (struct group_list));
6939               g->section_index = entry;
6940               g->next = group->root;
6941               group->root = g;
6942             }
6943
6944           if (start)
6945             free (start);
6946
6947           group++;
6948         }
6949     }
6950
6951   if (symtab)
6952     free (symtab);
6953   if (strtab)
6954     free (strtab);
6955   return TRUE;
6956 }
6957
6958 /* Data used to display dynamic fixups.  */
6959
6960 struct ia64_vms_dynfixup
6961 {
6962   bfd_vma needed_ident;         /* Library ident number.  */
6963   bfd_vma needed;               /* Index in the dstrtab of the library name.  */
6964   bfd_vma fixup_needed;         /* Index of the library.  */
6965   bfd_vma fixup_rela_cnt;       /* Number of fixups.  */
6966   bfd_vma fixup_rela_off;       /* Fixups offset in the dynamic segment.  */
6967 };
6968
6969 /* Data used to display dynamic relocations.  */
6970
6971 struct ia64_vms_dynimgrela
6972 {
6973   bfd_vma img_rela_cnt;         /* Number of relocations.  */
6974   bfd_vma img_rela_off;         /* Reloc offset in the dynamic segment.  */
6975 };
6976
6977 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6978    library).  */
6979
6980 static bfd_boolean
6981 dump_ia64_vms_dynamic_fixups (Filedata *                  filedata,
6982                               struct ia64_vms_dynfixup *  fixup,
6983                               const char *                strtab,
6984                               unsigned int                strtab_sz)
6985 {
6986   Elf64_External_VMS_IMAGE_FIXUP * imfs;
6987   long i;
6988   const char * lib_name;
6989
6990   imfs = get_data (NULL, filedata, dynamic_addr + fixup->fixup_rela_off,
6991                    1, fixup->fixup_rela_cnt * sizeof (*imfs),
6992                    _("dynamic section image fixups"));
6993   if (!imfs)
6994     return FALSE;
6995
6996   if (fixup->needed < strtab_sz)
6997     lib_name = strtab + fixup->needed;
6998   else
6999     {
7000       warn (_("corrupt library name index of 0x%lx found in dynamic entry"),
7001             (unsigned long) fixup->needed);
7002       lib_name = "???";
7003     }
7004   printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
7005           (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
7006   printf
7007     (_("Seg Offset           Type                             SymVec DataType\n"));
7008
7009   for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
7010     {
7011       unsigned int type;
7012       const char *rtype;
7013
7014       printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
7015       printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
7016       type = BYTE_GET (imfs [i].type);
7017       rtype = elf_ia64_reloc_type (type);
7018       if (rtype == NULL)
7019         printf (" 0x%08x                       ", type);
7020       else
7021         printf (" %-32s ", rtype);
7022       printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
7023       printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
7024     }
7025
7026   free (imfs);
7027   return TRUE;
7028 }
7029
7030 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
7031
7032 static bfd_boolean
7033 dump_ia64_vms_dynamic_relocs (Filedata * filedata, struct ia64_vms_dynimgrela *imgrela)
7034 {
7035   Elf64_External_VMS_IMAGE_RELA *imrs;
7036   long i;
7037
7038   imrs = get_data (NULL, filedata, dynamic_addr + imgrela->img_rela_off,
7039                    1, imgrela->img_rela_cnt * sizeof (*imrs),
7040                    _("dynamic section image relocations"));
7041   if (!imrs)
7042     return FALSE;
7043
7044   printf (_("\nImage relocs\n"));
7045   printf
7046     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
7047
7048   for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
7049     {
7050       unsigned int type;
7051       const char *rtype;
7052
7053       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
7054       printf ("%08" BFD_VMA_FMT "x ",
7055               (bfd_vma) BYTE_GET (imrs [i].rela_offset));
7056       type = BYTE_GET (imrs [i].type);
7057       rtype = elf_ia64_reloc_type (type);
7058       if (rtype == NULL)
7059         printf ("0x%08x                      ", type);
7060       else
7061         printf ("%-31s ", rtype);
7062       print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
7063       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
7064       printf ("%08" BFD_VMA_FMT "x\n",
7065               (bfd_vma) BYTE_GET (imrs [i].sym_offset));
7066     }
7067
7068   free (imrs);
7069   return TRUE;
7070 }
7071
7072 /* Display IA-64 OpenVMS dynamic relocations and fixups.  */
7073
7074 static bfd_boolean
7075 process_ia64_vms_dynamic_relocs (Filedata * filedata)
7076 {
7077   struct ia64_vms_dynfixup fixup;
7078   struct ia64_vms_dynimgrela imgrela;
7079   Elf_Internal_Dyn *entry;
7080   bfd_vma strtab_off = 0;
7081   bfd_vma strtab_sz = 0;
7082   char *strtab = NULL;
7083   bfd_boolean res = TRUE;
7084
7085   memset (&fixup, 0, sizeof (fixup));
7086   memset (&imgrela, 0, sizeof (imgrela));
7087
7088   /* Note: the order of the entries is specified by the OpenVMS specs.  */
7089   for (entry = dynamic_section;
7090        entry < dynamic_section + dynamic_nent;
7091        entry++)
7092     {
7093       switch (entry->d_tag)
7094         {
7095         case DT_IA_64_VMS_STRTAB_OFFSET:
7096           strtab_off = entry->d_un.d_val;
7097           break;
7098         case DT_STRSZ:
7099           strtab_sz = entry->d_un.d_val;
7100           if (strtab == NULL)
7101             strtab = get_data (NULL, filedata, dynamic_addr + strtab_off,
7102                                1, strtab_sz, _("dynamic string section"));
7103           break;
7104
7105         case DT_IA_64_VMS_NEEDED_IDENT:
7106           fixup.needed_ident = entry->d_un.d_val;
7107           break;
7108         case DT_NEEDED:
7109           fixup.needed = entry->d_un.d_val;
7110           break;
7111         case DT_IA_64_VMS_FIXUP_NEEDED:
7112           fixup.fixup_needed = entry->d_un.d_val;
7113           break;
7114         case DT_IA_64_VMS_FIXUP_RELA_CNT:
7115           fixup.fixup_rela_cnt = entry->d_un.d_val;
7116           break;
7117         case DT_IA_64_VMS_FIXUP_RELA_OFF:
7118           fixup.fixup_rela_off = entry->d_un.d_val;
7119           if (! dump_ia64_vms_dynamic_fixups (filedata, &fixup, strtab, strtab_sz))
7120             res = FALSE;
7121           break;
7122         case DT_IA_64_VMS_IMG_RELA_CNT:
7123           imgrela.img_rela_cnt = entry->d_un.d_val;
7124           break;
7125         case DT_IA_64_VMS_IMG_RELA_OFF:
7126           imgrela.img_rela_off = entry->d_un.d_val;
7127           if (! dump_ia64_vms_dynamic_relocs (filedata, &imgrela))
7128             res = FALSE;
7129           break;
7130
7131         default:
7132           break;
7133         }
7134     }
7135
7136   if (strtab != NULL)
7137     free (strtab);
7138
7139   return res;
7140 }
7141
7142 static struct
7143 {
7144   const char * name;
7145   int reloc;
7146   int size;
7147   int rela;
7148 }
7149   dynamic_relocations [] =
7150 {
7151   { "REL", DT_REL, DT_RELSZ, FALSE },
7152   { "RELA", DT_RELA, DT_RELASZ, TRUE },
7153   { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
7154 };
7155
7156 /* Process the reloc section.  */
7157
7158 static bfd_boolean
7159 process_relocs (Filedata * filedata)
7160 {
7161   unsigned long rel_size;
7162   unsigned long rel_offset;
7163
7164   if (!do_reloc)
7165     return TRUE;
7166
7167   if (do_using_dynamic)
7168     {
7169       int          is_rela;
7170       const char * name;
7171       bfd_boolean  has_dynamic_reloc;
7172       unsigned int i;
7173
7174       has_dynamic_reloc = FALSE;
7175
7176       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7177         {
7178           is_rela = dynamic_relocations [i].rela;
7179           name = dynamic_relocations [i].name;
7180           rel_size = dynamic_info [dynamic_relocations [i].size];
7181           rel_offset = dynamic_info [dynamic_relocations [i].reloc];
7182
7183           if (rel_size)
7184             has_dynamic_reloc = TRUE;
7185
7186           if (is_rela == UNKNOWN)
7187             {
7188               if (dynamic_relocations [i].reloc == DT_JMPREL)
7189                 switch (dynamic_info[DT_PLTREL])
7190                   {
7191                   case DT_REL:
7192                     is_rela = FALSE;
7193                     break;
7194                   case DT_RELA:
7195                     is_rela = TRUE;
7196                     break;
7197                   }
7198             }
7199
7200           if (rel_size)
7201             {
7202               printf
7203                 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
7204                  name, rel_offset, rel_size);
7205
7206               dump_relocations (filedata,
7207                                 offset_from_vma (filedata, rel_offset, rel_size),
7208                                 rel_size,
7209                                 dynamic_symbols, num_dynamic_syms,
7210                                 dynamic_strings, dynamic_strings_length,
7211                                 is_rela, TRUE /* is_dynamic */);
7212             }
7213         }
7214
7215       if (is_ia64_vms (filedata))
7216         if (process_ia64_vms_dynamic_relocs (filedata))
7217           has_dynamic_reloc = TRUE;
7218
7219       if (! has_dynamic_reloc)
7220         printf (_("\nThere are no dynamic relocations in this file.\n"));
7221     }
7222   else
7223     {
7224       Elf_Internal_Shdr * section;
7225       unsigned long i;
7226       bfd_boolean found = FALSE;
7227
7228       for (i = 0, section = filedata->section_headers;
7229            i < filedata->file_header.e_shnum;
7230            i++, section++)
7231         {
7232           if (   section->sh_type != SHT_RELA
7233               && section->sh_type != SHT_REL)
7234             continue;
7235
7236           rel_offset = section->sh_offset;
7237           rel_size   = section->sh_size;
7238
7239           if (rel_size)
7240             {
7241               Elf_Internal_Shdr * strsec;
7242               int is_rela;
7243               unsigned long num_rela;
7244
7245               printf (_("\nRelocation section "));
7246
7247               if (filedata->string_table == NULL)
7248                 printf ("%d", section->sh_name);
7249               else
7250                 printf ("'%s'", printable_section_name (filedata, section));
7251
7252               num_rela = rel_size / section->sh_entsize;
7253               printf (ngettext (" at offset 0x%lx contains %lu entry:\n",
7254                                 " at offset 0x%lx contains %lu entries:\n",
7255                                 num_rela),
7256                       rel_offset, num_rela);
7257
7258               is_rela = section->sh_type == SHT_RELA;
7259
7260               if (section->sh_link != 0
7261                   && section->sh_link < filedata->file_header.e_shnum)
7262                 {
7263                   Elf_Internal_Shdr * symsec;
7264                   Elf_Internal_Sym *  symtab;
7265                   unsigned long nsyms;
7266                   unsigned long strtablen = 0;
7267                   char * strtab = NULL;
7268
7269                   symsec = filedata->section_headers + section->sh_link;
7270                   if (symsec->sh_type != SHT_SYMTAB
7271                       && symsec->sh_type != SHT_DYNSYM)
7272                     continue;
7273
7274                   symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
7275
7276                   if (symtab == NULL)
7277                     continue;
7278
7279                   if (symsec->sh_link != 0
7280                       && symsec->sh_link < filedata->file_header.e_shnum)
7281                     {
7282                       strsec = filedata->section_headers + symsec->sh_link;
7283
7284                       strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7285                                                   1, strsec->sh_size,
7286                                                   _("string table"));
7287                       strtablen = strtab == NULL ? 0 : strsec->sh_size;
7288                     }
7289
7290                   dump_relocations (filedata, rel_offset, rel_size,
7291                                     symtab, nsyms, strtab, strtablen,
7292                                     is_rela,
7293                                     symsec->sh_type == SHT_DYNSYM);
7294                   if (strtab)
7295                     free (strtab);
7296                   free (symtab);
7297                 }
7298               else
7299                 dump_relocations (filedata, rel_offset, rel_size,
7300                                   NULL, 0, NULL, 0, is_rela,
7301                                   FALSE /* is_dynamic */);
7302
7303               found = TRUE;
7304             }
7305         }
7306
7307       if (! found)
7308         {
7309           /* Users sometimes forget the -D option, so try to be helpful.  */
7310           for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7311             {
7312               if (dynamic_info [dynamic_relocations [i].size])
7313                 {
7314                   printf (_("\nThere are no static relocations in this file."));
7315                   printf (_("\nTo see the dynamic relocations add --use-dynamic to the command line.\n"));
7316
7317                   break;
7318                 }
7319             }
7320           if (i == ARRAY_SIZE (dynamic_relocations))
7321             printf (_("\nThere are no relocations in this file.\n"));
7322         }
7323     }
7324
7325   return TRUE;
7326 }
7327
7328 /* An absolute address consists of a section and an offset.  If the
7329    section is NULL, the offset itself is the address, otherwise, the
7330    address equals to LOAD_ADDRESS(section) + offset.  */
7331
7332 struct absaddr
7333 {
7334   unsigned short section;
7335   bfd_vma offset;
7336 };
7337
7338 #define ABSADDR(a) \
7339   ((a).section \
7340    ? filedata->section_headers [(a).section].sh_addr + (a).offset \
7341    : (a).offset)
7342
7343 /* Find the nearest symbol at or below ADDR.  Returns the symbol
7344    name, if found, and the offset from the symbol to ADDR.  */
7345
7346 static void
7347 find_symbol_for_address (Filedata *          filedata,
7348                          Elf_Internal_Sym *  symtab,
7349                          unsigned long       nsyms,
7350                          const char *        strtab,
7351                          unsigned long       strtab_size,
7352                          struct absaddr      addr,
7353                          const char **       symname,
7354                          bfd_vma *           offset)
7355 {
7356   bfd_vma dist = 0x100000;
7357   Elf_Internal_Sym * sym;
7358   Elf_Internal_Sym * beg;
7359   Elf_Internal_Sym * end;
7360   Elf_Internal_Sym * best = NULL;
7361
7362   REMOVE_ARCH_BITS (addr.offset);
7363   beg = symtab;
7364   end = symtab + nsyms;
7365
7366   while (beg < end)
7367     {
7368       bfd_vma value;
7369
7370       sym = beg + (end - beg) / 2;
7371
7372       value = sym->st_value;
7373       REMOVE_ARCH_BITS (value);
7374
7375       if (sym->st_name != 0
7376           && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
7377           && addr.offset >= value
7378           && addr.offset - value < dist)
7379         {
7380           best = sym;
7381           dist = addr.offset - value;
7382           if (!dist)
7383             break;
7384         }
7385
7386       if (addr.offset < value)
7387         end = sym;
7388       else
7389         beg = sym + 1;
7390     }
7391
7392   if (best)
7393     {
7394       *symname = (best->st_name >= strtab_size
7395                   ? _("<corrupt>") : strtab + best->st_name);
7396       *offset = dist;
7397       return;
7398     }
7399
7400   *symname = NULL;
7401   *offset = addr.offset;
7402 }
7403
7404 static /* signed */ int
7405 symcmp (const void *p, const void *q)
7406 {
7407   Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7408   Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7409
7410   return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7411 }
7412
7413 /* Process the unwind section.  */
7414
7415 #include "unwind-ia64.h"
7416
7417 struct ia64_unw_table_entry
7418 {
7419   struct absaddr start;
7420   struct absaddr end;
7421   struct absaddr info;
7422 };
7423
7424 struct ia64_unw_aux_info
7425 {
7426   struct ia64_unw_table_entry * table;          /* Unwind table.  */
7427   unsigned long                 table_len;      /* Length of unwind table.  */
7428   unsigned char *               info;           /* Unwind info.  */
7429   unsigned long                 info_size;      /* Size of unwind info.  */
7430   bfd_vma                       info_addr;      /* Starting address of unwind info.  */
7431   bfd_vma                       seg_base;       /* Starting address of segment.  */
7432   Elf_Internal_Sym *            symtab;         /* The symbol table.  */
7433   unsigned long                 nsyms;          /* Number of symbols.  */
7434   Elf_Internal_Sym *            funtab;         /* Sorted table of STT_FUNC symbols.  */
7435   unsigned long                 nfuns;          /* Number of entries in funtab.  */
7436   char *                        strtab;         /* The string table.  */
7437   unsigned long                 strtab_size;    /* Size of string table.  */
7438 };
7439
7440 static bfd_boolean
7441 dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
7442 {
7443   struct ia64_unw_table_entry * tp;
7444   unsigned long j, nfuns;
7445   int in_body;
7446   bfd_boolean res = TRUE;
7447
7448   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7449   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7450     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7451       aux->funtab[nfuns++] = aux->symtab[j];
7452   aux->nfuns = nfuns;
7453   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7454
7455   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7456     {
7457       bfd_vma stamp;
7458       bfd_vma offset;
7459       const unsigned char * dp;
7460       const unsigned char * head;
7461       const unsigned char * end;
7462       const char * procname;
7463
7464       find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7465                                aux->strtab_size, tp->start, &procname, &offset);
7466
7467       fputs ("\n<", stdout);
7468
7469       if (procname)
7470         {
7471           fputs (procname, stdout);
7472
7473           if (offset)
7474             printf ("+%lx", (unsigned long) offset);
7475         }
7476
7477       fputs (">: [", stdout);
7478       print_vma (tp->start.offset, PREFIX_HEX);
7479       fputc ('-', stdout);
7480       print_vma (tp->end.offset, PREFIX_HEX);
7481       printf ("], info at +0x%lx\n",
7482               (unsigned long) (tp->info.offset - aux->seg_base));
7483
7484       /* PR 17531: file: 86232b32.  */
7485       if (aux->info == NULL)
7486         continue;
7487
7488       /* PR 17531: file: 0997b4d1.  */
7489       if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7490         {
7491           warn (_("Invalid offset %lx in table entry %ld\n"),
7492                 (long) tp->info.offset, (long) (tp - aux->table));
7493           res = FALSE;
7494           continue;
7495         }
7496
7497       head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
7498       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7499
7500       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7501               (unsigned) UNW_VER (stamp),
7502               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7503               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7504               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7505               (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7506
7507       if (UNW_VER (stamp) != 1)
7508         {
7509           printf (_("\tUnknown version.\n"));
7510           continue;
7511         }
7512
7513       in_body = 0;
7514       end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7515       /* PR 17531: file: 16ceda89.  */
7516       if (end > aux->info + aux->info_size)
7517         end = aux->info + aux->info_size;
7518       for (dp = head + 8; dp < end;)
7519         dp = unw_decode (dp, in_body, & in_body, end);
7520     }
7521
7522   free (aux->funtab);
7523
7524   return res;
7525 }
7526
7527 static bfd_boolean
7528 slurp_ia64_unwind_table (Filedata *                  filedata,
7529                          struct ia64_unw_aux_info *  aux,
7530                          Elf_Internal_Shdr *         sec)
7531 {
7532   unsigned long size, nrelas, i;
7533   Elf_Internal_Phdr * seg;
7534   struct ia64_unw_table_entry * tep;
7535   Elf_Internal_Shdr * relsec;
7536   Elf_Internal_Rela * rela;
7537   Elf_Internal_Rela * rp;
7538   unsigned char * table;
7539   unsigned char * tp;
7540   Elf_Internal_Sym * sym;
7541   const char * relname;
7542
7543   aux->table_len = 0;
7544
7545   /* First, find the starting address of the segment that includes
7546      this section: */
7547
7548   if (filedata->file_header.e_phnum)
7549     {
7550       if (! get_program_headers (filedata))
7551           return FALSE;
7552
7553       for (seg = filedata->program_headers;
7554            seg < filedata->program_headers + filedata->file_header.e_phnum;
7555            ++seg)
7556         {
7557           if (seg->p_type != PT_LOAD)
7558             continue;
7559
7560           if (sec->sh_addr >= seg->p_vaddr
7561               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7562             {
7563               aux->seg_base = seg->p_vaddr;
7564               break;
7565             }
7566         }
7567     }
7568
7569   /* Second, build the unwind table from the contents of the unwind section:  */
7570   size = sec->sh_size;
7571   table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7572                                       _("unwind table"));
7573   if (!table)
7574     return FALSE;
7575
7576   aux->table_len = size / (3 * eh_addr_size);
7577   aux->table = (struct ia64_unw_table_entry *)
7578     xcmalloc (aux->table_len, sizeof (aux->table[0]));
7579   tep = aux->table;
7580
7581   for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7582     {
7583       tep->start.section = SHN_UNDEF;
7584       tep->end.section   = SHN_UNDEF;
7585       tep->info.section  = SHN_UNDEF;
7586       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7587       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7588       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7589       tep->start.offset += aux->seg_base;
7590       tep->end.offset   += aux->seg_base;
7591       tep->info.offset  += aux->seg_base;
7592     }
7593   free (table);
7594
7595   /* Third, apply any relocations to the unwind table:  */
7596   for (relsec = filedata->section_headers;
7597        relsec < filedata->section_headers + filedata->file_header.e_shnum;
7598        ++relsec)
7599     {
7600       if (relsec->sh_type != SHT_RELA
7601           || relsec->sh_info >= filedata->file_header.e_shnum
7602           || filedata->section_headers + relsec->sh_info != sec)
7603         continue;
7604
7605       if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
7606                               & rela, & nrelas))
7607         {
7608           free (aux->table);
7609           aux->table = NULL;
7610           aux->table_len = 0;
7611           return FALSE;
7612         }
7613
7614       for (rp = rela; rp < rela + nrelas; ++rp)
7615         {
7616           unsigned int sym_ndx;
7617           unsigned int r_type = get_reloc_type (filedata, rp->r_info);
7618           relname = elf_ia64_reloc_type (r_type);
7619
7620           /* PR 17531: file: 9fa67536.  */
7621           if (relname == NULL)
7622             {
7623               warn (_("Skipping unknown relocation type: %u\n"), r_type);
7624               continue;
7625             }
7626
7627           if (! const_strneq (relname, "R_IA64_SEGREL"))
7628             {
7629               warn (_("Skipping unexpected relocation type: %s\n"), relname);
7630               continue;
7631             }
7632
7633           i = rp->r_offset / (3 * eh_addr_size);
7634
7635           /* PR 17531: file: 5bc8d9bf.  */
7636           if (i >= aux->table_len)
7637             {
7638               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7639               continue;
7640             }
7641
7642           sym_ndx = get_reloc_symindex (rp->r_info);
7643           if (sym_ndx >= aux->nsyms)
7644             {
7645               warn (_("Skipping reloc with invalid symbol index: %u\n"),
7646                     sym_ndx);
7647               continue;
7648             }
7649           sym = aux->symtab + sym_ndx;
7650
7651           switch (rp->r_offset / eh_addr_size % 3)
7652             {
7653             case 0:
7654               aux->table[i].start.section = sym->st_shndx;
7655               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
7656               break;
7657             case 1:
7658               aux->table[i].end.section   = sym->st_shndx;
7659               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
7660               break;
7661             case 2:
7662               aux->table[i].info.section  = sym->st_shndx;
7663               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
7664               break;
7665             default:
7666               break;
7667             }
7668         }
7669
7670       free (rela);
7671     }
7672
7673   return TRUE;
7674 }
7675
7676 static bfd_boolean
7677 ia64_process_unwind (Filedata * filedata)
7678 {
7679   Elf_Internal_Shdr * sec;
7680   Elf_Internal_Shdr * unwsec = NULL;
7681   Elf_Internal_Shdr * strsec;
7682   unsigned long i, unwcount = 0, unwstart = 0;
7683   struct ia64_unw_aux_info aux;
7684   bfd_boolean res = TRUE;
7685
7686   memset (& aux, 0, sizeof (aux));
7687
7688   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
7689     {
7690       if (sec->sh_type == SHT_SYMTAB
7691           && sec->sh_link < filedata->file_header.e_shnum)
7692         {
7693           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
7694
7695           strsec = filedata->section_headers + sec->sh_link;
7696           if (aux.strtab != NULL)
7697             {
7698               error (_("Multiple auxillary string tables encountered\n"));
7699               free (aux.strtab);
7700               res = FALSE;
7701             }
7702           aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7703                                           1, strsec->sh_size,
7704                                           _("string table"));
7705           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7706         }
7707       else if (sec->sh_type == SHT_IA_64_UNWIND)
7708         unwcount++;
7709     }
7710
7711   if (!unwcount)
7712     printf (_("\nThere are no unwind sections in this file.\n"));
7713
7714   while (unwcount-- > 0)
7715     {
7716       char * suffix;
7717       size_t len, len2;
7718
7719       for (i = unwstart, sec = filedata->section_headers + unwstart, unwsec = NULL;
7720            i < filedata->file_header.e_shnum; ++i, ++sec)
7721         if (sec->sh_type == SHT_IA_64_UNWIND)
7722           {
7723             unwsec = sec;
7724             break;
7725           }
7726       /* We have already counted the number of SHT_IA64_UNWIND
7727          sections so the loop above should never fail.  */
7728       assert (unwsec != NULL);
7729
7730       unwstart = i + 1;
7731       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7732
7733       if ((unwsec->sh_flags & SHF_GROUP) != 0)
7734         {
7735           /* We need to find which section group it is in.  */
7736           struct group_list * g;
7737
7738           if (section_headers_groups == NULL
7739               || section_headers_groups [i] == NULL)
7740             i = filedata->file_header.e_shnum;
7741           else
7742             {
7743               g = section_headers_groups [i]->root;
7744
7745               for (; g != NULL; g = g->next)
7746                 {
7747                   sec = filedata->section_headers + g->section_index;
7748
7749                   if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7750                     break;
7751                 }
7752
7753               if (g == NULL)
7754                 i = filedata->file_header.e_shnum;
7755             }
7756         }
7757       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7758         {
7759           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
7760           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7761           suffix = SECTION_NAME (unwsec) + len;
7762           for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7763                ++i, ++sec)
7764             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7765                 && streq (SECTION_NAME (sec) + len2, suffix))
7766               break;
7767         }
7768       else
7769         {
7770           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7771              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
7772           len = sizeof (ELF_STRING_ia64_unwind) - 1;
7773           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7774           suffix = "";
7775           if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7776             suffix = SECTION_NAME (unwsec) + len;
7777           for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7778                ++i, ++sec)
7779             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7780                 && streq (SECTION_NAME (sec) + len2, suffix))
7781               break;
7782         }
7783
7784       if (i == filedata->file_header.e_shnum)
7785         {
7786           printf (_("\nCould not find unwind info section for "));
7787
7788           if (filedata->string_table == NULL)
7789             printf ("%d", unwsec->sh_name);
7790           else
7791             printf ("'%s'", printable_section_name (filedata, unwsec));
7792         }
7793       else
7794         {
7795           aux.info_addr = sec->sh_addr;
7796           aux.info = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1,
7797                                                  sec->sh_size,
7798                                                  _("unwind info"));
7799           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7800
7801           printf (_("\nUnwind section "));
7802
7803           if (filedata->string_table == NULL)
7804             printf ("%d", unwsec->sh_name);
7805           else
7806             printf ("'%s'", printable_section_name (filedata, unwsec));
7807
7808           printf (_(" at offset 0x%lx contains %lu entries:\n"),
7809                   (unsigned long) unwsec->sh_offset,
7810                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7811
7812           if (slurp_ia64_unwind_table (filedata, & aux, unwsec)
7813               && aux.table_len > 0)
7814             dump_ia64_unwind (filedata, & aux);
7815
7816           if (aux.table)
7817             free ((char *) aux.table);
7818           if (aux.info)
7819             free ((char *) aux.info);
7820           aux.table = NULL;
7821           aux.info = NULL;
7822         }
7823     }
7824
7825   if (aux.symtab)
7826     free (aux.symtab);
7827   if (aux.strtab)
7828     free ((char *) aux.strtab);
7829
7830   return res;
7831 }
7832
7833 struct hppa_unw_table_entry
7834 {
7835   struct absaddr start;
7836   struct absaddr end;
7837   unsigned int Cannot_unwind:1;                 /* 0 */
7838   unsigned int Millicode:1;                     /* 1 */
7839   unsigned int Millicode_save_sr0:1;            /* 2 */
7840   unsigned int Region_description:2;            /* 3..4 */
7841   unsigned int reserved1:1;                     /* 5 */
7842   unsigned int Entry_SR:1;                      /* 6 */
7843   unsigned int Entry_FR:4;     /* Number saved     7..10 */
7844   unsigned int Entry_GR:5;     /* Number saved     11..15 */
7845   unsigned int Args_stored:1;                   /* 16 */
7846   unsigned int Variable_Frame:1;                /* 17 */
7847   unsigned int Separate_Package_Body:1;         /* 18 */
7848   unsigned int Frame_Extension_Millicode:1;     /* 19 */
7849   unsigned int Stack_Overflow_Check:1;          /* 20 */
7850   unsigned int Two_Instruction_SP_Increment:1;  /* 21 */
7851   unsigned int Ada_Region:1;                    /* 22 */
7852   unsigned int cxx_info:1;                      /* 23 */
7853   unsigned int cxx_try_catch:1;                 /* 24 */
7854   unsigned int sched_entry_seq:1;               /* 25 */
7855   unsigned int reserved2:1;                     /* 26 */
7856   unsigned int Save_SP:1;                       /* 27 */
7857   unsigned int Save_RP:1;                       /* 28 */
7858   unsigned int Save_MRP_in_frame:1;             /* 29 */
7859   unsigned int extn_ptr_defined:1;              /* 30 */
7860   unsigned int Cleanup_defined:1;               /* 31 */
7861
7862   unsigned int MPE_XL_interrupt_marker:1;       /* 0 */
7863   unsigned int HP_UX_interrupt_marker:1;        /* 1 */
7864   unsigned int Large_frame:1;                   /* 2 */
7865   unsigned int Pseudo_SP_Set:1;                 /* 3 */
7866   unsigned int reserved4:1;                     /* 4 */
7867   unsigned int Total_frame_size:27;             /* 5..31 */
7868 };
7869
7870 struct hppa_unw_aux_info
7871 {
7872   struct hppa_unw_table_entry *  table;         /* Unwind table.  */
7873   unsigned long                  table_len;     /* Length of unwind table.  */
7874   bfd_vma                        seg_base;      /* Starting address of segment.  */
7875   Elf_Internal_Sym *             symtab;        /* The symbol table.  */
7876   unsigned long                  nsyms;         /* Number of symbols.  */
7877   Elf_Internal_Sym *             funtab;        /* Sorted table of STT_FUNC symbols.  */
7878   unsigned long                  nfuns;         /* Number of entries in funtab.  */
7879   char *                         strtab;        /* The string table.  */
7880   unsigned long                  strtab_size;   /* Size of string table.  */
7881 };
7882
7883 static bfd_boolean
7884 dump_hppa_unwind (Filedata * filedata, struct hppa_unw_aux_info * aux)
7885 {
7886   struct hppa_unw_table_entry * tp;
7887   unsigned long j, nfuns;
7888   bfd_boolean res = TRUE;
7889
7890   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7891   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7892     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7893       aux->funtab[nfuns++] = aux->symtab[j];
7894   aux->nfuns = nfuns;
7895   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7896
7897   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7898     {
7899       bfd_vma offset;
7900       const char * procname;
7901
7902       find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7903                                aux->strtab_size, tp->start, &procname,
7904                                &offset);
7905
7906       fputs ("\n<", stdout);
7907
7908       if (procname)
7909         {
7910           fputs (procname, stdout);
7911
7912           if (offset)
7913             printf ("+%lx", (unsigned long) offset);
7914         }
7915
7916       fputs (">: [", stdout);
7917       print_vma (tp->start.offset, PREFIX_HEX);
7918       fputc ('-', stdout);
7919       print_vma (tp->end.offset, PREFIX_HEX);
7920       printf ("]\n\t");
7921
7922 #define PF(_m) if (tp->_m) printf (#_m " ");
7923 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7924       PF(Cannot_unwind);
7925       PF(Millicode);
7926       PF(Millicode_save_sr0);
7927       /* PV(Region_description);  */
7928       PF(Entry_SR);
7929       PV(Entry_FR);
7930       PV(Entry_GR);
7931       PF(Args_stored);
7932       PF(Variable_Frame);
7933       PF(Separate_Package_Body);
7934       PF(Frame_Extension_Millicode);
7935       PF(Stack_Overflow_Check);
7936       PF(Two_Instruction_SP_Increment);
7937       PF(Ada_Region);
7938       PF(cxx_info);
7939       PF(cxx_try_catch);
7940       PF(sched_entry_seq);
7941       PF(Save_SP);
7942       PF(Save_RP);
7943       PF(Save_MRP_in_frame);
7944       PF(extn_ptr_defined);
7945       PF(Cleanup_defined);
7946       PF(MPE_XL_interrupt_marker);
7947       PF(HP_UX_interrupt_marker);
7948       PF(Large_frame);
7949       PF(Pseudo_SP_Set);
7950       PV(Total_frame_size);
7951 #undef PF
7952 #undef PV
7953     }
7954
7955   printf ("\n");
7956
7957   free (aux->funtab);
7958
7959   return res;
7960 }
7961
7962 static bfd_boolean
7963 slurp_hppa_unwind_table (Filedata *                  filedata,
7964                          struct hppa_unw_aux_info *  aux,
7965                          Elf_Internal_Shdr *         sec)
7966 {
7967   unsigned long size, unw_ent_size, nentries, nrelas, i;
7968   Elf_Internal_Phdr * seg;
7969   struct hppa_unw_table_entry * tep;
7970   Elf_Internal_Shdr * relsec;
7971   Elf_Internal_Rela * rela;
7972   Elf_Internal_Rela * rp;
7973   unsigned char * table;
7974   unsigned char * tp;
7975   Elf_Internal_Sym * sym;
7976   const char * relname;
7977
7978   /* First, find the starting address of the segment that includes
7979      this section.  */
7980   if (filedata->file_header.e_phnum)
7981     {
7982       if (! get_program_headers (filedata))
7983         return FALSE;
7984
7985       for (seg = filedata->program_headers;
7986            seg < filedata->program_headers + filedata->file_header.e_phnum;
7987            ++seg)
7988         {
7989           if (seg->p_type != PT_LOAD)
7990             continue;
7991
7992           if (sec->sh_addr >= seg->p_vaddr
7993               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7994             {
7995               aux->seg_base = seg->p_vaddr;
7996               break;
7997             }
7998         }
7999     }
8000
8001   /* Second, build the unwind table from the contents of the unwind
8002      section.  */
8003   size = sec->sh_size;
8004   table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
8005                                       _("unwind table"));
8006   if (!table)
8007     return FALSE;
8008
8009   unw_ent_size = 16;
8010   nentries = size / unw_ent_size;
8011   size = unw_ent_size * nentries;
8012
8013   tep = aux->table = (struct hppa_unw_table_entry *)
8014       xcmalloc (nentries, sizeof (aux->table[0]));
8015
8016   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
8017     {
8018       unsigned int tmp1, tmp2;
8019
8020       tep->start.section = SHN_UNDEF;
8021       tep->end.section   = SHN_UNDEF;
8022
8023       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
8024       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
8025       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
8026       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
8027
8028       tep->start.offset += aux->seg_base;
8029       tep->end.offset   += aux->seg_base;
8030
8031       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
8032       tep->Millicode = (tmp1 >> 30) & 0x1;
8033       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
8034       tep->Region_description = (tmp1 >> 27) & 0x3;
8035       tep->reserved1 = (tmp1 >> 26) & 0x1;
8036       tep->Entry_SR = (tmp1 >> 25) & 0x1;
8037       tep->Entry_FR = (tmp1 >> 21) & 0xf;
8038       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
8039       tep->Args_stored = (tmp1 >> 15) & 0x1;
8040       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
8041       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
8042       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
8043       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
8044       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
8045       tep->Ada_Region = (tmp1 >> 9) & 0x1;
8046       tep->cxx_info = (tmp1 >> 8) & 0x1;
8047       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
8048       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
8049       tep->reserved2 = (tmp1 >> 5) & 0x1;
8050       tep->Save_SP = (tmp1 >> 4) & 0x1;
8051       tep->Save_RP = (tmp1 >> 3) & 0x1;
8052       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
8053       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
8054       tep->Cleanup_defined = tmp1 & 0x1;
8055
8056       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
8057       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
8058       tep->Large_frame = (tmp2 >> 29) & 0x1;
8059       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
8060       tep->reserved4 = (tmp2 >> 27) & 0x1;
8061       tep->Total_frame_size = tmp2 & 0x7ffffff;
8062     }
8063   free (table);
8064
8065   /* Third, apply any relocations to the unwind table.  */
8066   for (relsec = filedata->section_headers;
8067        relsec < filedata->section_headers + filedata->file_header.e_shnum;
8068        ++relsec)
8069     {
8070       if (relsec->sh_type != SHT_RELA
8071           || relsec->sh_info >= filedata->file_header.e_shnum
8072           || filedata->section_headers + relsec->sh_info != sec)
8073         continue;
8074
8075       if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
8076                               & rela, & nrelas))
8077         return FALSE;
8078
8079       for (rp = rela; rp < rela + nrelas; ++rp)
8080         {
8081           unsigned int sym_ndx;
8082           unsigned int r_type = get_reloc_type (filedata, rp->r_info);
8083           relname = elf_hppa_reloc_type (r_type);
8084
8085           if (relname == NULL)
8086             {
8087               warn (_("Skipping unknown relocation type: %u\n"), r_type);
8088               continue;
8089             }
8090
8091           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
8092           if (! const_strneq (relname, "R_PARISC_SEGREL"))
8093             {
8094               warn (_("Skipping unexpected relocation type: %s\n"), relname);
8095               continue;
8096             }
8097
8098           i = rp->r_offset / unw_ent_size;
8099           if (i >= aux->table_len)
8100             {
8101               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
8102               continue;
8103             }
8104
8105           sym_ndx = get_reloc_symindex (rp->r_info);
8106           if (sym_ndx >= aux->nsyms)
8107             {
8108               warn (_("Skipping reloc with invalid symbol index: %u\n"),
8109                     sym_ndx);
8110               continue;
8111             }
8112           sym = aux->symtab + sym_ndx;
8113
8114           switch ((rp->r_offset % unw_ent_size) / 4)
8115             {
8116             case 0:
8117               aux->table[i].start.section = sym->st_shndx;
8118               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
8119               break;
8120             case 1:
8121               aux->table[i].end.section   = sym->st_shndx;
8122               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
8123               break;
8124             default:
8125               break;
8126             }
8127         }
8128
8129       free (rela);
8130     }
8131
8132   aux->table_len = nentries;
8133
8134   return TRUE;
8135 }
8136
8137 static bfd_boolean
8138 hppa_process_unwind (Filedata * filedata)
8139 {
8140   struct hppa_unw_aux_info aux;
8141   Elf_Internal_Shdr * unwsec = NULL;
8142   Elf_Internal_Shdr * strsec;
8143   Elf_Internal_Shdr * sec;
8144   unsigned long i;
8145   bfd_boolean res = TRUE;
8146
8147   if (filedata->string_table == NULL)
8148     return FALSE;
8149
8150   memset (& aux, 0, sizeof (aux));
8151
8152   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8153     {
8154       if (sec->sh_type == SHT_SYMTAB
8155           && sec->sh_link < filedata->file_header.e_shnum)
8156         {
8157           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
8158
8159           strsec = filedata->section_headers + sec->sh_link;
8160           if (aux.strtab != NULL)
8161             {
8162               error (_("Multiple auxillary string tables encountered\n"));
8163               free (aux.strtab);
8164               res = FALSE;
8165             }
8166           aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
8167                                           1, strsec->sh_size,
8168                                           _("string table"));
8169           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8170         }
8171       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8172         unwsec = sec;
8173     }
8174
8175   if (!unwsec)
8176     printf (_("\nThere are no unwind sections in this file.\n"));
8177
8178   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8179     {
8180       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8181         {
8182           unsigned long num_unwind = sec->sh_size / 16;
8183
8184           printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
8185                             "contains %lu entry:\n",
8186                             "\nUnwind section '%s' at offset 0x%lx "
8187                             "contains %lu entries:\n",
8188                             num_unwind),
8189                   printable_section_name (filedata, sec),
8190                   (unsigned long) sec->sh_offset,
8191                   num_unwind);
8192
8193           if (! slurp_hppa_unwind_table (filedata, &aux, sec))
8194             res = FALSE;
8195
8196           if (res && aux.table_len > 0)
8197             {
8198               if (! dump_hppa_unwind (filedata, &aux))
8199                 res = FALSE;
8200             }
8201
8202           if (aux.table)
8203             free ((char *) aux.table);
8204           aux.table = NULL;
8205         }
8206     }
8207
8208   if (aux.symtab)
8209     free (aux.symtab);
8210   if (aux.strtab)
8211     free ((char *) aux.strtab);
8212
8213   return res;
8214 }
8215
8216 struct arm_section
8217 {
8218   unsigned char *      data;            /* The unwind data.  */
8219   Elf_Internal_Shdr *  sec;             /* The cached unwind section header.  */
8220   Elf_Internal_Rela *  rela;            /* The cached relocations for this section.  */
8221   unsigned long        nrelas;          /* The number of relocations.  */
8222   unsigned int         rel_type;        /* REL or RELA ?  */
8223   Elf_Internal_Rela *  next_rela;       /* Cyclic pointer to the next reloc to process.  */
8224 };
8225
8226 struct arm_unw_aux_info
8227 {
8228   Filedata *          filedata;         /* The file containing the unwind sections.  */
8229   Elf_Internal_Sym *  symtab;           /* The file's symbol table.  */
8230   unsigned long       nsyms;            /* Number of symbols.  */
8231   Elf_Internal_Sym *  funtab;           /* Sorted table of STT_FUNC symbols.  */
8232   unsigned long       nfuns;            /* Number of these symbols.  */
8233   char *              strtab;           /* The file's string table.  */
8234   unsigned long       strtab_size;      /* Size of string table.  */
8235 };
8236
8237 static const char *
8238 arm_print_vma_and_name (Filedata *                 filedata,
8239                         struct arm_unw_aux_info *  aux,
8240                         bfd_vma                    fn,
8241                         struct absaddr             addr)
8242 {
8243   const char *procname;
8244   bfd_vma sym_offset;
8245
8246   if (addr.section == SHN_UNDEF)
8247     addr.offset = fn;
8248
8249   find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
8250                            aux->strtab_size, addr, &procname,
8251                            &sym_offset);
8252
8253   print_vma (fn, PREFIX_HEX);
8254
8255   if (procname)
8256     {
8257       fputs (" <", stdout);
8258       fputs (procname, stdout);
8259
8260       if (sym_offset)
8261         printf ("+0x%lx", (unsigned long) sym_offset);
8262       fputc ('>', stdout);
8263     }
8264
8265   return procname;
8266 }
8267
8268 static void
8269 arm_free_section (struct arm_section *arm_sec)
8270 {
8271   if (arm_sec->data != NULL)
8272     free (arm_sec->data);
8273
8274   if (arm_sec->rela != NULL)
8275     free (arm_sec->rela);
8276 }
8277
8278 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
8279       cached section and install SEC instead.
8280    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
8281       and return its valued in * WORDP, relocating if necessary.
8282    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
8283       relocation's offset in ADDR.
8284    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
8285       into the string table of the symbol associated with the reloc.  If no
8286       reloc was applied store -1 there.
8287    5) Return TRUE upon success, FALSE otherwise.  */
8288
8289 static bfd_boolean
8290 get_unwind_section_word (Filedata *                 filedata,
8291                          struct arm_unw_aux_info *  aux,
8292                          struct arm_section *       arm_sec,
8293                          Elf_Internal_Shdr *        sec,
8294                          bfd_vma                    word_offset,
8295                          unsigned int *             wordp,
8296                          struct absaddr *           addr,
8297                          bfd_vma *                  sym_name)
8298 {
8299   Elf_Internal_Rela *rp;
8300   Elf_Internal_Sym *sym;
8301   const char * relname;
8302   unsigned int word;
8303   bfd_boolean wrapped;
8304
8305   if (sec == NULL || arm_sec == NULL)
8306     return FALSE;
8307
8308   addr->section = SHN_UNDEF;
8309   addr->offset = 0;
8310
8311   if (sym_name != NULL)
8312     *sym_name = (bfd_vma) -1;
8313
8314   /* If necessary, update the section cache.  */
8315   if (sec != arm_sec->sec)
8316     {
8317       Elf_Internal_Shdr *relsec;
8318
8319       arm_free_section (arm_sec);
8320
8321       arm_sec->sec = sec;
8322       arm_sec->data = get_data (NULL, aux->filedata, sec->sh_offset, 1,
8323                                 sec->sh_size, _("unwind data"));
8324       arm_sec->rela = NULL;
8325       arm_sec->nrelas = 0;
8326
8327       for (relsec = filedata->section_headers;
8328            relsec < filedata->section_headers + filedata->file_header.e_shnum;
8329            ++relsec)
8330         {
8331           if (relsec->sh_info >= filedata->file_header.e_shnum
8332               || filedata->section_headers + relsec->sh_info != sec
8333               /* PR 15745: Check the section type as well.  */
8334               || (relsec->sh_type != SHT_REL
8335                   && relsec->sh_type != SHT_RELA))
8336             continue;
8337
8338           arm_sec->rel_type = relsec->sh_type;
8339           if (relsec->sh_type == SHT_REL)
8340             {
8341               if (!slurp_rel_relocs (aux->filedata, relsec->sh_offset,
8342                                      relsec->sh_size,
8343                                      & arm_sec->rela, & arm_sec->nrelas))
8344                 return FALSE;
8345             }
8346           else /* relsec->sh_type == SHT_RELA */
8347             {
8348               if (!slurp_rela_relocs (aux->filedata, relsec->sh_offset,
8349                                       relsec->sh_size,
8350                                       & arm_sec->rela, & arm_sec->nrelas))
8351                 return FALSE;
8352             }
8353           break;
8354         }
8355
8356       arm_sec->next_rela = arm_sec->rela;
8357     }
8358
8359   /* If there is no unwind data we can do nothing.  */
8360   if (arm_sec->data == NULL)
8361     return FALSE;
8362
8363   /* If the offset is invalid then fail.  */
8364   if (/* PR 21343 *//* PR 18879 */
8365       sec->sh_size < 4
8366       || word_offset > (sec->sh_size - 4)
8367       || ((bfd_signed_vma) word_offset) < 0)
8368     return FALSE;
8369
8370   /* Get the word at the required offset.  */
8371   word = byte_get (arm_sec->data + word_offset, 4);
8372
8373   /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128.  */
8374   if (arm_sec->rela == NULL)
8375     {
8376       * wordp = word;
8377       return TRUE;
8378     }
8379
8380   /* Look through the relocs to find the one that applies to the provided offset.  */
8381   wrapped = FALSE;
8382   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
8383     {
8384       bfd_vma prelval, offset;
8385
8386       if (rp->r_offset > word_offset && !wrapped)
8387         {
8388           rp = arm_sec->rela;
8389           wrapped = TRUE;
8390         }
8391       if (rp->r_offset > word_offset)
8392         break;
8393
8394       if (rp->r_offset & 3)
8395         {
8396           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8397                 (unsigned long) rp->r_offset);
8398           continue;
8399         }
8400
8401       if (rp->r_offset < word_offset)
8402         continue;
8403
8404       /* PR 17531: file: 027-161405-0.004  */
8405       if (aux->symtab == NULL)
8406         continue;
8407
8408       if (arm_sec->rel_type == SHT_REL)
8409         {
8410           offset = word & 0x7fffffff;
8411           if (offset & 0x40000000)
8412             offset |= ~ (bfd_vma) 0x7fffffff;
8413         }
8414       else if (arm_sec->rel_type == SHT_RELA)
8415         offset = rp->r_addend;
8416       else
8417         {
8418           error (_("Unknown section relocation type %d encountered\n"),
8419                  arm_sec->rel_type);
8420           break;
8421         }
8422
8423       /* PR 17531 file: 027-1241568-0.004.  */
8424       if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8425         {
8426           error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8427                  (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8428           break;
8429         }
8430
8431       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
8432       offset += sym->st_value;
8433       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8434
8435       /* Check that we are processing the expected reloc type.  */
8436       if (filedata->file_header.e_machine == EM_ARM)
8437         {
8438           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
8439           if (relname == NULL)
8440             {
8441               warn (_("Skipping unknown ARM relocation type: %d\n"),
8442                     (int) ELF32_R_TYPE (rp->r_info));
8443               continue;
8444             }
8445
8446           if (streq (relname, "R_ARM_NONE"))
8447               continue;
8448
8449           if (! streq (relname, "R_ARM_PREL31"))
8450             {
8451               warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
8452               continue;
8453             }
8454         }
8455       else if (filedata->file_header.e_machine == EM_TI_C6000)
8456         {
8457           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
8458           if (relname == NULL)
8459             {
8460               warn (_("Skipping unknown C6000 relocation type: %d\n"),
8461                     (int) ELF32_R_TYPE (rp->r_info));
8462               continue;
8463             }
8464
8465           if (streq (relname, "R_C6000_NONE"))
8466             continue;
8467
8468           if (! streq (relname, "R_C6000_PREL31"))
8469             {
8470               warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
8471               continue;
8472             }
8473
8474           prelval >>= 1;
8475         }
8476       else
8477         {
8478           /* This function currently only supports ARM and TI unwinders.  */
8479           warn (_("Only TI and ARM unwinders are currently supported\n"));
8480           break;
8481         }
8482
8483       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8484       addr->section = sym->st_shndx;
8485       addr->offset = offset;
8486
8487       if (sym_name)
8488         * sym_name = sym->st_name;
8489       break;
8490     }
8491
8492   *wordp = word;
8493   arm_sec->next_rela = rp;
8494
8495   return TRUE;
8496 }
8497
8498 static const char *tic6x_unwind_regnames[16] =
8499 {
8500   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8501   "A14", "A13", "A12", "A11", "A10",
8502   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8503 };
8504
8505 static void
8506 decode_tic6x_unwind_regmask (unsigned int mask)
8507 {
8508   int i;
8509
8510   for (i = 12; mask; mask >>= 1, i--)
8511     {
8512       if (mask & 1)
8513         {
8514           fputs (tic6x_unwind_regnames[i], stdout);
8515           if (mask > 1)
8516             fputs (", ", stdout);
8517         }
8518     }
8519 }
8520
8521 #define ADVANCE                                                 \
8522   if (remaining == 0 && more_words)                             \
8523     {                                                           \
8524       data_offset += 4;                                         \
8525       if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec,     \
8526                                      data_offset, & word, & addr, NULL))        \
8527         return FALSE;                                           \
8528       remaining = 4;                                            \
8529       more_words--;                                             \
8530     }                                                           \
8531
8532 #define GET_OP(OP)                      \
8533   ADVANCE;                              \
8534   if (remaining)                        \
8535     {                                   \
8536       remaining--;                      \
8537       (OP) = word >> 24;                \
8538       word <<= 8;                       \
8539     }                                   \
8540   else                                  \
8541     {                                   \
8542       printf (_("[Truncated opcode]\n"));       \
8543       return FALSE;                     \
8544     }                                   \
8545   printf ("0x%02x ", OP)
8546
8547 static bfd_boolean
8548 decode_arm_unwind_bytecode (Filedata *                 filedata,
8549                             struct arm_unw_aux_info *  aux,
8550                             unsigned int               word,
8551                             unsigned int               remaining,
8552                             unsigned int               more_words,
8553                             bfd_vma                    data_offset,
8554                             Elf_Internal_Shdr *        data_sec,
8555                             struct arm_section *       data_arm_sec)
8556 {
8557   struct absaddr addr;
8558   bfd_boolean res = TRUE;
8559
8560   /* Decode the unwinding instructions.  */
8561   while (1)
8562     {
8563       unsigned int op, op2;
8564
8565       ADVANCE;
8566       if (remaining == 0)
8567         break;
8568       remaining--;
8569       op = word >> 24;
8570       word <<= 8;
8571
8572       printf ("  0x%02x ", op);
8573
8574       if ((op & 0xc0) == 0x00)
8575         {
8576           int offset = ((op & 0x3f) << 2) + 4;
8577
8578           printf ("     vsp = vsp + %d", offset);
8579         }
8580       else if ((op & 0xc0) == 0x40)
8581         {
8582           int offset = ((op & 0x3f) << 2) + 4;
8583
8584           printf ("     vsp = vsp - %d", offset);
8585         }
8586       else if ((op & 0xf0) == 0x80)
8587         {
8588           GET_OP (op2);
8589           if (op == 0x80 && op2 == 0)
8590             printf (_("Refuse to unwind"));
8591           else
8592             {
8593               unsigned int mask = ((op & 0x0f) << 8) | op2;
8594               bfd_boolean first = TRUE;
8595               int i;
8596
8597               printf ("pop {");
8598               for (i = 0; i < 12; i++)
8599                 if (mask & (1 << i))
8600                   {
8601                     if (first)
8602                       first = FALSE;
8603                     else
8604                       printf (", ");
8605                     printf ("r%d", 4 + i);
8606                   }
8607               printf ("}");
8608             }
8609         }
8610       else if ((op & 0xf0) == 0x90)
8611         {
8612           if (op == 0x9d || op == 0x9f)
8613             printf (_("     [Reserved]"));
8614           else
8615             printf ("     vsp = r%d", op & 0x0f);
8616         }
8617       else if ((op & 0xf0) == 0xa0)
8618         {
8619           int end = 4 + (op & 0x07);
8620           bfd_boolean first = TRUE;
8621           int i;
8622
8623           printf ("     pop {");
8624           for (i = 4; i <= end; i++)
8625             {
8626               if (first)
8627                 first = FALSE;
8628               else
8629                 printf (", ");
8630               printf ("r%d", i);
8631             }
8632           if (op & 0x08)
8633             {
8634               if (!first)
8635                 printf (", ");
8636               printf ("r14");
8637             }
8638           printf ("}");
8639         }
8640       else if (op == 0xb0)
8641         printf (_("     finish"));
8642       else if (op == 0xb1)
8643         {
8644           GET_OP (op2);
8645           if (op2 == 0 || (op2 & 0xf0) != 0)
8646             printf (_("[Spare]"));
8647           else
8648             {
8649               unsigned int mask = op2 & 0x0f;
8650               bfd_boolean first = TRUE;
8651               int i;
8652
8653               printf ("pop {");
8654               for (i = 0; i < 12; i++)
8655                 if (mask & (1 << i))
8656                   {
8657                     if (first)
8658                       first = FALSE;
8659                     else
8660                       printf (", ");
8661                     printf ("r%d", i);
8662                   }
8663               printf ("}");
8664             }
8665         }
8666       else if (op == 0xb2)
8667         {
8668           unsigned char buf[9];
8669           unsigned int i, len;
8670           unsigned long offset;
8671
8672           for (i = 0; i < sizeof (buf); i++)
8673             {
8674               GET_OP (buf[i]);
8675               if ((buf[i] & 0x80) == 0)
8676                 break;
8677             }
8678           if (i == sizeof (buf))
8679             {
8680               error (_("corrupt change to vsp"));
8681               res = FALSE;
8682             }
8683           else
8684             {
8685               offset = read_uleb128 (buf, &len, buf + i + 1);
8686               assert (len == i + 1);
8687               offset = offset * 4 + 0x204;
8688               printf ("vsp = vsp + %ld", offset);
8689             }
8690         }
8691       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8692         {
8693           unsigned int first, last;
8694
8695           GET_OP (op2);
8696           first = op2 >> 4;
8697           last = op2 & 0x0f;
8698           if (op == 0xc8)
8699             first = first + 16;
8700           printf ("pop {D%d", first);
8701           if (last)
8702             printf ("-D%d", first + last);
8703           printf ("}");
8704         }
8705       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8706         {
8707           unsigned int count = op & 0x07;
8708
8709           printf ("pop {D8");
8710           if (count)
8711             printf ("-D%d", 8 + count);
8712           printf ("}");
8713         }
8714       else if (op >= 0xc0 && op <= 0xc5)
8715         {
8716           unsigned int count = op & 0x07;
8717
8718           printf ("     pop {wR10");
8719           if (count)
8720             printf ("-wR%d", 10 + count);
8721           printf ("}");
8722         }
8723       else if (op == 0xc6)
8724         {
8725           unsigned int first, last;
8726
8727           GET_OP (op2);
8728           first = op2 >> 4;
8729           last = op2 & 0x0f;
8730           printf ("pop {wR%d", first);
8731           if (last)
8732             printf ("-wR%d", first + last);
8733           printf ("}");
8734         }
8735       else if (op == 0xc7)
8736         {
8737           GET_OP (op2);
8738           if (op2 == 0 || (op2 & 0xf0) != 0)
8739             printf (_("[Spare]"));
8740           else
8741             {
8742               unsigned int mask = op2 & 0x0f;
8743               bfd_boolean first = TRUE;
8744               int i;
8745
8746               printf ("pop {");
8747               for (i = 0; i < 4; i++)
8748                 if (mask & (1 << i))
8749                   {
8750                     if (first)
8751                       first = FALSE;
8752                     else
8753                       printf (", ");
8754                     printf ("wCGR%d", i);
8755                   }
8756               printf ("}");
8757             }
8758         }
8759       else
8760         {
8761           printf (_("     [unsupported opcode]"));
8762           res = FALSE;
8763         }
8764
8765       printf ("\n");
8766     }
8767
8768   return res;
8769 }
8770
8771 static bfd_boolean
8772 decode_tic6x_unwind_bytecode (Filedata *                 filedata,
8773                               struct arm_unw_aux_info *  aux,
8774                               unsigned int               word,
8775                               unsigned int               remaining,
8776                               unsigned int               more_words,
8777                               bfd_vma                    data_offset,
8778                               Elf_Internal_Shdr *        data_sec,
8779                               struct arm_section *       data_arm_sec)
8780 {
8781   struct absaddr addr;
8782
8783   /* Decode the unwinding instructions.  */
8784   while (1)
8785     {
8786       unsigned int op, op2;
8787
8788       ADVANCE;
8789       if (remaining == 0)
8790         break;
8791       remaining--;
8792       op = word >> 24;
8793       word <<= 8;
8794
8795       printf ("  0x%02x ", op);
8796
8797       if ((op & 0xc0) == 0x00)
8798         {
8799           int offset = ((op & 0x3f) << 3) + 8;
8800           printf ("     sp = sp + %d", offset);
8801         }
8802       else if ((op & 0xc0) == 0x80)
8803         {
8804           GET_OP (op2);
8805           if (op == 0x80 && op2 == 0)
8806             printf (_("Refuse to unwind"));
8807           else
8808             {
8809               unsigned int mask = ((op & 0x1f) << 8) | op2;
8810               if (op & 0x20)
8811                 printf ("pop compact {");
8812               else
8813                 printf ("pop {");
8814
8815               decode_tic6x_unwind_regmask (mask);
8816               printf("}");
8817             }
8818         }
8819       else if ((op & 0xf0) == 0xc0)
8820         {
8821           unsigned int reg;
8822           unsigned int nregs;
8823           unsigned int i;
8824           const char *name;
8825           struct
8826           {
8827             unsigned int offset;
8828             unsigned int reg;
8829           } regpos[16];
8830
8831           /* Scan entire instruction first so that GET_OP output is not
8832              interleaved with disassembly.  */
8833           nregs = 0;
8834           for (i = 0; nregs < (op & 0xf); i++)
8835             {
8836               GET_OP (op2);
8837               reg = op2 >> 4;
8838               if (reg != 0xf)
8839                 {
8840                   regpos[nregs].offset = i * 2;
8841                   regpos[nregs].reg = reg;
8842                   nregs++;
8843                 }
8844
8845               reg = op2 & 0xf;
8846               if (reg != 0xf)
8847                 {
8848                   regpos[nregs].offset = i * 2 + 1;
8849                   regpos[nregs].reg = reg;
8850                   nregs++;
8851                 }
8852             }
8853
8854           printf (_("pop frame {"));
8855           reg = nregs - 1;
8856           for (i = i * 2; i > 0; i--)
8857             {
8858               if (regpos[reg].offset == i - 1)
8859                 {
8860                   name = tic6x_unwind_regnames[regpos[reg].reg];
8861                   if (reg > 0)
8862                     reg--;
8863                 }
8864               else
8865                 name = _("[pad]");
8866
8867               fputs (name, stdout);
8868               if (i > 1)
8869                 printf (", ");
8870             }
8871
8872           printf ("}");
8873         }
8874       else if (op == 0xd0)
8875         printf ("     MOV FP, SP");
8876       else if (op == 0xd1)
8877         printf ("     __c6xabi_pop_rts");
8878       else if (op == 0xd2)
8879         {
8880           unsigned char buf[9];
8881           unsigned int i, len;
8882           unsigned long offset;
8883
8884           for (i = 0; i < sizeof (buf); i++)
8885             {
8886               GET_OP (buf[i]);
8887               if ((buf[i] & 0x80) == 0)
8888                 break;
8889             }
8890           /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2.  */
8891           if (i == sizeof (buf))
8892             {
8893               warn (_("Corrupt stack pointer adjustment detected\n"));
8894               return FALSE;
8895             }
8896
8897           offset = read_uleb128 (buf, &len, buf + i + 1);
8898           assert (len == i + 1);
8899           offset = offset * 8 + 0x408;
8900           printf (_("sp = sp + %ld"), offset);
8901         }
8902       else if ((op & 0xf0) == 0xe0)
8903         {
8904           if ((op & 0x0f) == 7)
8905             printf ("     RETURN");
8906           else
8907             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8908         }
8909       else
8910         {
8911           printf (_("     [unsupported opcode]"));
8912         }
8913       putchar ('\n');
8914     }
8915
8916   return TRUE;
8917 }
8918
8919 static bfd_vma
8920 arm_expand_prel31 (Filedata * filedata, bfd_vma word, bfd_vma where)
8921 {
8922   bfd_vma offset;
8923
8924   offset = word & 0x7fffffff;
8925   if (offset & 0x40000000)
8926     offset |= ~ (bfd_vma) 0x7fffffff;
8927
8928   if (filedata->file_header.e_machine == EM_TI_C6000)
8929     offset <<= 1;
8930
8931   return offset + where;
8932 }
8933
8934 static bfd_boolean
8935 decode_arm_unwind (Filedata *                 filedata,
8936                    struct arm_unw_aux_info *  aux,
8937                    unsigned int               word,
8938                    unsigned int               remaining,
8939                    bfd_vma                    data_offset,
8940                    Elf_Internal_Shdr *        data_sec,
8941                    struct arm_section *       data_arm_sec)
8942 {
8943   int per_index;
8944   unsigned int more_words = 0;
8945   struct absaddr addr;
8946   bfd_vma sym_name = (bfd_vma) -1;
8947   bfd_boolean res = TRUE;
8948
8949   if (remaining == 0)
8950     {
8951       /* Fetch the first word.
8952          Note - when decoding an object file the address extracted
8953          here will always be 0.  So we also pass in the sym_name
8954          parameter so that we can find the symbol associated with
8955          the personality routine.  */
8956       if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, data_offset,
8957                                      & word, & addr, & sym_name))
8958         return FALSE;
8959
8960       remaining = 4;
8961     }
8962
8963   if ((word & 0x80000000) == 0)
8964     {
8965       /* Expand prel31 for personality routine.  */
8966       bfd_vma fn;
8967       const char *procname;
8968
8969       fn = arm_expand_prel31 (filedata, word, data_sec->sh_addr + data_offset);
8970       printf (_("  Personality routine: "));
8971       if (fn == 0
8972           && addr.section == SHN_UNDEF && addr.offset == 0
8973           && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8974         {
8975           procname = aux->strtab + sym_name;
8976           print_vma (fn, PREFIX_HEX);
8977           if (procname)
8978             {
8979               fputs (" <", stdout);
8980               fputs (procname, stdout);
8981               fputc ('>', stdout);
8982             }
8983         }
8984       else
8985         procname = arm_print_vma_and_name (filedata, aux, fn, addr);
8986       fputc ('\n', stdout);
8987
8988       /* The GCC personality routines use the standard compact
8989          encoding, starting with one byte giving the number of
8990          words.  */
8991       if (procname != NULL
8992           && (const_strneq (procname, "__gcc_personality_v0")
8993               || const_strneq (procname, "__gxx_personality_v0")
8994               || const_strneq (procname, "__gcj_personality_v0")
8995               || const_strneq (procname, "__gnu_objc_personality_v0")))
8996         {
8997           remaining = 0;
8998           more_words = 1;
8999           ADVANCE;
9000           if (!remaining)
9001             {
9002               printf (_("  [Truncated data]\n"));
9003               return FALSE;
9004             }
9005           more_words = word >> 24;
9006           word <<= 8;
9007           remaining--;
9008           per_index = -1;
9009         }
9010       else
9011         return TRUE;
9012     }
9013   else
9014     {
9015       /* ARM EHABI Section 6.3:
9016
9017          An exception-handling table entry for the compact model looks like:
9018
9019            31 30-28 27-24 23-0
9020            -- ----- ----- ----
9021             1   0   index Data for personalityRoutine[index]    */
9022
9023       if (filedata->file_header.e_machine == EM_ARM
9024           && (word & 0x70000000))
9025         {
9026           warn (_("Corrupt ARM compact model table entry: %x \n"), word);
9027           res = FALSE;
9028         }
9029
9030       per_index = (word >> 24) & 0x7f;
9031       printf (_("  Compact model index: %d\n"), per_index);
9032       if (per_index == 0)
9033         {
9034           more_words = 0;
9035           word <<= 8;
9036           remaining--;
9037         }
9038       else if (per_index < 3)
9039         {
9040           more_words = (word >> 16) & 0xff;
9041           word <<= 16;
9042           remaining -= 2;
9043         }
9044     }
9045
9046   switch (filedata->file_header.e_machine)
9047     {
9048     case EM_ARM:
9049       if (per_index < 3)
9050         {
9051           if (! decode_arm_unwind_bytecode (filedata, aux, word, remaining, more_words,
9052                                             data_offset, data_sec, data_arm_sec))
9053             res = FALSE;
9054         }
9055       else
9056         {
9057           warn (_("Unknown ARM compact model index encountered\n"));
9058           printf (_("  [reserved]\n"));
9059           res = FALSE;
9060         }
9061       break;
9062
9063     case EM_TI_C6000:
9064       if (per_index < 3)
9065         {
9066           if (! decode_tic6x_unwind_bytecode (filedata, aux, word, remaining, more_words,
9067                                               data_offset, data_sec, data_arm_sec))
9068             res = FALSE;
9069         }
9070       else if (per_index < 5)
9071         {
9072           if (((word >> 17) & 0x7f) == 0x7f)
9073             printf (_("  Restore stack from frame pointer\n"));
9074           else
9075             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
9076           printf (_("  Registers restored: "));
9077           if (per_index == 4)
9078             printf (" (compact) ");
9079           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
9080           putchar ('\n');
9081           printf (_("  Return register: %s\n"),
9082                   tic6x_unwind_regnames[word & 0xf]);
9083         }
9084       else
9085         printf (_("  [reserved (%d)]\n"), per_index);
9086       break;
9087
9088     default:
9089       error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
9090              filedata->file_header.e_machine);
9091       res = FALSE;
9092     }
9093
9094   /* Decode the descriptors.  Not implemented.  */
9095
9096   return res;
9097 }
9098
9099 static bfd_boolean
9100 dump_arm_unwind (Filedata *                 filedata,
9101                  struct arm_unw_aux_info *  aux,
9102                  Elf_Internal_Shdr *        exidx_sec)
9103 {
9104   struct arm_section exidx_arm_sec, extab_arm_sec;
9105   unsigned int i, exidx_len;
9106   unsigned long j, nfuns;
9107   bfd_boolean res = TRUE;
9108
9109   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
9110   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
9111   exidx_len = exidx_sec->sh_size / 8;
9112
9113   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
9114   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
9115     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
9116       aux->funtab[nfuns++] = aux->symtab[j];
9117   aux->nfuns = nfuns;
9118   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
9119
9120   for (i = 0; i < exidx_len; i++)
9121     {
9122       unsigned int exidx_fn, exidx_entry;
9123       struct absaddr fn_addr, entry_addr;
9124       bfd_vma fn;
9125
9126       fputc ('\n', stdout);
9127
9128       if (! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9129                                      8 * i, & exidx_fn, & fn_addr, NULL)
9130           || ! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9131                                         8 * i + 4, & exidx_entry, & entry_addr, NULL))
9132         {
9133           free (aux->funtab);
9134           arm_free_section (& exidx_arm_sec);
9135           arm_free_section (& extab_arm_sec);
9136           return FALSE;
9137         }
9138
9139       /* ARM EHABI, Section 5:
9140          An index table entry consists of 2 words.
9141          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
9142       if (exidx_fn & 0x80000000)
9143         {
9144           warn (_("corrupt index table entry: %x\n"), exidx_fn);
9145           res = FALSE;
9146         }
9147
9148       fn = arm_expand_prel31 (filedata, exidx_fn, exidx_sec->sh_addr + 8 * i);
9149
9150       arm_print_vma_and_name (filedata, aux, fn, fn_addr);
9151       fputs (": ", stdout);
9152
9153       if (exidx_entry == 1)
9154         {
9155           print_vma (exidx_entry, PREFIX_HEX);
9156           fputs (" [cantunwind]\n", stdout);
9157         }
9158       else if (exidx_entry & 0x80000000)
9159         {
9160           print_vma (exidx_entry, PREFIX_HEX);
9161           fputc ('\n', stdout);
9162           decode_arm_unwind (filedata, aux, exidx_entry, 4, 0, NULL, NULL);
9163         }
9164       else
9165         {
9166           bfd_vma table, table_offset = 0;
9167           Elf_Internal_Shdr *table_sec;
9168
9169           fputs ("@", stdout);
9170           table = arm_expand_prel31 (filedata, exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
9171           print_vma (table, PREFIX_HEX);
9172           printf ("\n");
9173
9174           /* Locate the matching .ARM.extab.  */
9175           if (entry_addr.section != SHN_UNDEF
9176               && entry_addr.section < filedata->file_header.e_shnum)
9177             {
9178               table_sec = filedata->section_headers + entry_addr.section;
9179               table_offset = entry_addr.offset;
9180               /* PR 18879 */
9181               if (table_offset > table_sec->sh_size
9182                   || ((bfd_signed_vma) table_offset) < 0)
9183                 {
9184                   warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
9185                         (unsigned long) table_offset,
9186                         printable_section_name (filedata, table_sec));
9187                   res = FALSE;
9188                   continue;
9189                 }
9190             }
9191           else
9192             {
9193               table_sec = find_section_by_address (filedata, table);
9194               if (table_sec != NULL)
9195                 table_offset = table - table_sec->sh_addr;
9196             }
9197
9198           if (table_sec == NULL)
9199             {
9200               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
9201                     (unsigned long) table);
9202               res = FALSE;
9203               continue;
9204             }
9205
9206           if (! decode_arm_unwind (filedata, aux, 0, 0, table_offset, table_sec,
9207                                    &extab_arm_sec))
9208             res = FALSE;
9209         }
9210     }
9211
9212   printf ("\n");
9213
9214   free (aux->funtab);
9215   arm_free_section (&exidx_arm_sec);
9216   arm_free_section (&extab_arm_sec);
9217
9218   return res;
9219 }
9220
9221 /* Used for both ARM and C6X unwinding tables.  */
9222
9223 static bfd_boolean
9224 arm_process_unwind (Filedata * filedata)
9225 {
9226   struct arm_unw_aux_info aux;
9227   Elf_Internal_Shdr *unwsec = NULL;
9228   Elf_Internal_Shdr *strsec;
9229   Elf_Internal_Shdr *sec;
9230   unsigned long i;
9231   unsigned int sec_type;
9232   bfd_boolean res = TRUE;
9233
9234   switch (filedata->file_header.e_machine)
9235     {
9236     case EM_ARM:
9237       sec_type = SHT_ARM_EXIDX;
9238       break;
9239
9240     case EM_TI_C6000:
9241       sec_type = SHT_C6000_UNWIND;
9242       break;
9243
9244     default:
9245       error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
9246              filedata->file_header.e_machine);
9247       return FALSE;
9248     }
9249
9250   if (filedata->string_table == NULL)
9251     return FALSE;
9252
9253   memset (& aux, 0, sizeof (aux));
9254   aux.filedata = filedata;
9255
9256   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9257     {
9258       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < filedata->file_header.e_shnum)
9259         {
9260           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
9261
9262           strsec = filedata->section_headers + sec->sh_link;
9263
9264           /* PR binutils/17531 file: 011-12666-0.004.  */
9265           if (aux.strtab != NULL)
9266             {
9267               error (_("Multiple string tables found in file.\n"));
9268               free (aux.strtab);
9269               res = FALSE;
9270             }
9271           aux.strtab = get_data (NULL, filedata, strsec->sh_offset,
9272                                  1, strsec->sh_size, _("string table"));
9273           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
9274         }
9275       else if (sec->sh_type == sec_type)
9276         unwsec = sec;
9277     }
9278
9279   if (unwsec == NULL)
9280     printf (_("\nThere are no unwind sections in this file.\n"));
9281   else
9282     for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9283       {
9284         if (sec->sh_type == sec_type)
9285           {
9286             unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size);
9287             printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
9288                               "contains %lu entry:\n",
9289                               "\nUnwind section '%s' at offset 0x%lx "
9290                               "contains %lu entries:\n",
9291                               num_unwind),
9292                     printable_section_name (filedata, sec),
9293                     (unsigned long) sec->sh_offset,
9294                     num_unwind);
9295
9296             if (! dump_arm_unwind (filedata, &aux, sec))
9297               res = FALSE;
9298           }
9299       }
9300
9301   if (aux.symtab)
9302     free (aux.symtab);
9303   if (aux.strtab)
9304     free ((char *) aux.strtab);
9305
9306   return res;
9307 }
9308
9309 static bfd_boolean
9310 process_unwind (Filedata * filedata)
9311 {
9312   struct unwind_handler
9313   {
9314     unsigned int machtype;
9315     bfd_boolean (* handler)(Filedata *);
9316   } handlers[] =
9317   {
9318     { EM_ARM, arm_process_unwind },
9319     { EM_IA_64, ia64_process_unwind },
9320     { EM_PARISC, hppa_process_unwind },
9321     { EM_TI_C6000, arm_process_unwind },
9322     { 0, NULL }
9323   };
9324   int i;
9325
9326   if (!do_unwind)
9327     return TRUE;
9328
9329   for (i = 0; handlers[i].handler != NULL; i++)
9330     if (filedata->file_header.e_machine == handlers[i].machtype)
9331       return handlers[i].handler (filedata);
9332
9333   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
9334           get_machine_name (filedata->file_header.e_machine));
9335   return TRUE;
9336 }
9337
9338 static void
9339 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
9340 {
9341   switch (entry->d_tag)
9342     {
9343     case DT_MIPS_FLAGS:
9344       if (entry->d_un.d_val == 0)
9345         printf (_("NONE"));
9346       else
9347         {
9348           static const char * opts[] =
9349           {
9350             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
9351             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
9352             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
9353             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
9354             "RLD_ORDER_SAFE"
9355           };
9356           unsigned int cnt;
9357           bfd_boolean first = TRUE;
9358
9359           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
9360             if (entry->d_un.d_val & (1 << cnt))
9361               {
9362                 printf ("%s%s", first ? "" : " ", opts[cnt]);
9363                 first = FALSE;
9364               }
9365         }
9366       break;
9367
9368     case DT_MIPS_IVERSION:
9369       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9370         printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
9371       else
9372         {
9373           char buf[40];
9374           sprintf_vma (buf, entry->d_un.d_ptr);
9375           /* Note: coded this way so that there is a single string for translation.  */
9376           printf (_("<corrupt: %s>"), buf);
9377         }
9378       break;
9379
9380     case DT_MIPS_TIME_STAMP:
9381       {
9382         char timebuf[128];
9383         struct tm * tmp;
9384         time_t atime = entry->d_un.d_val;
9385
9386         tmp = gmtime (&atime);
9387         /* PR 17531: file: 6accc532.  */
9388         if (tmp == NULL)
9389           snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
9390         else
9391           snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
9392                     tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9393                     tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9394         printf (_("Time Stamp: %s"), timebuf);
9395       }
9396       break;
9397
9398     case DT_MIPS_RLD_VERSION:
9399     case DT_MIPS_LOCAL_GOTNO:
9400     case DT_MIPS_CONFLICTNO:
9401     case DT_MIPS_LIBLISTNO:
9402     case DT_MIPS_SYMTABNO:
9403     case DT_MIPS_UNREFEXTNO:
9404     case DT_MIPS_HIPAGENO:
9405     case DT_MIPS_DELTA_CLASS_NO:
9406     case DT_MIPS_DELTA_INSTANCE_NO:
9407     case DT_MIPS_DELTA_RELOC_NO:
9408     case DT_MIPS_DELTA_SYM_NO:
9409     case DT_MIPS_DELTA_CLASSSYM_NO:
9410     case DT_MIPS_COMPACT_SIZE:
9411       print_vma (entry->d_un.d_val, DEC);
9412       break;
9413
9414     default:
9415       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9416     }
9417     putchar ('\n');
9418 }
9419
9420 static void
9421 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
9422 {
9423   switch (entry->d_tag)
9424     {
9425     case DT_HP_DLD_FLAGS:
9426       {
9427         static struct
9428         {
9429           long int bit;
9430           const char * str;
9431         }
9432         flags[] =
9433         {
9434           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
9435           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
9436           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
9437           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
9438           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
9439           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
9440           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9441           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9442           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9443           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
9444           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9445           { DT_HP_GST, "HP_GST" },
9446           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9447           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9448           { DT_HP_NODELETE, "HP_NODELETE" },
9449           { DT_HP_GROUP, "HP_GROUP" },
9450           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
9451         };
9452         bfd_boolean first = TRUE;
9453         size_t cnt;
9454         bfd_vma val = entry->d_un.d_val;
9455
9456         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
9457           if (val & flags[cnt].bit)
9458             {
9459               if (! first)
9460                 putchar (' ');
9461               fputs (flags[cnt].str, stdout);
9462               first = FALSE;
9463               val ^= flags[cnt].bit;
9464             }
9465
9466         if (val != 0 || first)
9467           {
9468             if (! first)
9469               putchar (' ');
9470             print_vma (val, HEX);
9471           }
9472       }
9473       break;
9474
9475     default:
9476       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9477       break;
9478     }
9479   putchar ('\n');
9480 }
9481
9482 #ifdef BFD64
9483
9484 /* VMS vs Unix time offset and factor.  */
9485
9486 #define VMS_EPOCH_OFFSET 35067168000000000LL
9487 #define VMS_GRANULARITY_FACTOR 10000000
9488
9489 /* Display a VMS time in a human readable format.  */
9490
9491 static void
9492 print_vms_time (bfd_int64_t vmstime)
9493 {
9494   struct tm *tm;
9495   time_t unxtime;
9496
9497   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9498   tm = gmtime (&unxtime);
9499   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9500           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9501           tm->tm_hour, tm->tm_min, tm->tm_sec);
9502 }
9503 #endif /* BFD64 */
9504
9505 static void
9506 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
9507 {
9508   switch (entry->d_tag)
9509     {
9510     case DT_IA_64_PLT_RESERVE:
9511       /* First 3 slots reserved.  */
9512       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9513       printf (" -- ");
9514       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
9515       break;
9516
9517     case DT_IA_64_VMS_LINKTIME:
9518 #ifdef BFD64
9519       print_vms_time (entry->d_un.d_val);
9520 #endif
9521       break;
9522
9523     case DT_IA_64_VMS_LNKFLAGS:
9524       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9525       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9526         printf (" CALL_DEBUG");
9527       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9528         printf (" NOP0BUFS");
9529       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9530         printf (" P0IMAGE");
9531       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9532         printf (" MKTHREADS");
9533       if (entry->d_un.d_val & VMS_LF_UPCALLS)
9534         printf (" UPCALLS");
9535       if (entry->d_un.d_val & VMS_LF_IMGSTA)
9536         printf (" IMGSTA");
9537       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9538         printf (" INITIALIZE");
9539       if (entry->d_un.d_val & VMS_LF_MAIN)
9540         printf (" MAIN");
9541       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9542         printf (" EXE_INIT");
9543       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9544         printf (" TBK_IN_IMG");
9545       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9546         printf (" DBG_IN_IMG");
9547       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9548         printf (" TBK_IN_DSF");
9549       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9550         printf (" DBG_IN_DSF");
9551       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9552         printf (" SIGNATURES");
9553       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9554         printf (" REL_SEG_OFF");
9555       break;
9556
9557     default:
9558       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9559       break;
9560     }
9561   putchar ('\n');
9562 }
9563
9564 static bfd_boolean
9565 get_32bit_dynamic_section (Filedata * filedata)
9566 {
9567   Elf32_External_Dyn * edyn;
9568   Elf32_External_Dyn * ext;
9569   Elf_Internal_Dyn * entry;
9570
9571   edyn = (Elf32_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9572                                           dynamic_size, _("dynamic section"));
9573   if (!edyn)
9574     return FALSE;
9575
9576   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9577      might not have the luxury of section headers.  Look for the DT_NULL
9578      terminator to determine the number of entries.  */
9579   for (ext = edyn, dynamic_nent = 0;
9580        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9581        ext++)
9582     {
9583       dynamic_nent++;
9584       if (BYTE_GET (ext->d_tag) == DT_NULL)
9585         break;
9586     }
9587
9588   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9589                                                   sizeof (* entry));
9590   if (dynamic_section == NULL)
9591     {
9592       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9593              (unsigned long) dynamic_nent);
9594       free (edyn);
9595       return FALSE;
9596     }
9597
9598   for (ext = edyn, entry = dynamic_section;
9599        entry < dynamic_section + dynamic_nent;
9600        ext++, entry++)
9601     {
9602       entry->d_tag      = BYTE_GET (ext->d_tag);
9603       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9604     }
9605
9606   free (edyn);
9607
9608   return TRUE;
9609 }
9610
9611 static bfd_boolean
9612 get_64bit_dynamic_section (Filedata * filedata)
9613 {
9614   Elf64_External_Dyn * edyn;
9615   Elf64_External_Dyn * ext;
9616   Elf_Internal_Dyn * entry;
9617
9618   /* Read in the data.  */
9619   edyn = (Elf64_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9620                                           dynamic_size, _("dynamic section"));
9621   if (!edyn)
9622     return FALSE;
9623
9624   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9625      might not have the luxury of section headers.  Look for the DT_NULL
9626      terminator to determine the number of entries.  */
9627   for (ext = edyn, dynamic_nent = 0;
9628        /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer.  */
9629        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9630        ext++)
9631     {
9632       dynamic_nent++;
9633       if (BYTE_GET (ext->d_tag) == DT_NULL)
9634         break;
9635     }
9636
9637   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9638                                                   sizeof (* entry));
9639   if (dynamic_section == NULL)
9640     {
9641       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9642              (unsigned long) dynamic_nent);
9643       free (edyn);
9644       return FALSE;
9645     }
9646
9647   /* Convert from external to internal formats.  */
9648   for (ext = edyn, entry = dynamic_section;
9649        entry < dynamic_section + dynamic_nent;
9650        ext++, entry++)
9651     {
9652       entry->d_tag      = BYTE_GET (ext->d_tag);
9653       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9654     }
9655
9656   free (edyn);
9657
9658   return TRUE;
9659 }
9660
9661 static void
9662 print_dynamic_flags (bfd_vma flags)
9663 {
9664   bfd_boolean first = TRUE;
9665
9666   while (flags)
9667     {
9668       bfd_vma flag;
9669
9670       flag = flags & - flags;
9671       flags &= ~ flag;
9672
9673       if (first)
9674         first = FALSE;
9675       else
9676         putc (' ', stdout);
9677
9678       switch (flag)
9679         {
9680         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
9681         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
9682         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
9683         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
9684         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
9685         default:                fputs (_("unknown"), stdout); break;
9686         }
9687     }
9688   puts ("");
9689 }
9690
9691 /* Parse and display the contents of the dynamic section.  */
9692
9693 static bfd_boolean
9694 process_dynamic_section (Filedata * filedata)
9695 {
9696   Elf_Internal_Dyn * entry;
9697
9698   if (dynamic_size == 0)
9699     {
9700       if (do_dynamic)
9701         printf (_("\nThere is no dynamic section in this file.\n"));
9702
9703       return TRUE;
9704     }
9705
9706   if (is_32bit_elf)
9707     {
9708       if (! get_32bit_dynamic_section (filedata))
9709         return FALSE;
9710     }
9711   else
9712     {
9713       if (! get_64bit_dynamic_section (filedata))
9714         return FALSE;
9715     }
9716
9717   /* Find the appropriate symbol table.  */
9718   if (dynamic_symbols == NULL)
9719     {
9720       for (entry = dynamic_section;
9721            entry < dynamic_section + dynamic_nent;
9722            ++entry)
9723         {
9724           Elf_Internal_Shdr section;
9725
9726           if (entry->d_tag != DT_SYMTAB)
9727             continue;
9728
9729           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9730
9731           /* Since we do not know how big the symbol table is,
9732              we default to reading in the entire file (!) and
9733              processing that.  This is overkill, I know, but it
9734              should work.  */
9735           section.sh_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9736           if ((bfd_size_type) section.sh_offset > filedata->file_size)
9737             {
9738               /* See PR 21379 for a reproducer.  */
9739               error (_("Invalid DT_SYMTAB entry: %lx"), (long) section.sh_offset);
9740               return FALSE;
9741             }
9742
9743           if (archive_file_offset != 0)
9744             section.sh_size = archive_file_size - section.sh_offset;
9745           else
9746             section.sh_size = filedata->file_size - section.sh_offset;
9747
9748           if (is_32bit_elf)
9749             section.sh_entsize = sizeof (Elf32_External_Sym);
9750           else
9751             section.sh_entsize = sizeof (Elf64_External_Sym);
9752           section.sh_name = filedata->string_table_length;
9753
9754           if (dynamic_symbols != NULL)
9755             {
9756               error (_("Multiple dynamic symbol table sections found\n"));
9757               free (dynamic_symbols);
9758             }
9759           dynamic_symbols = GET_ELF_SYMBOLS (filedata, &section, & num_dynamic_syms);
9760           if (num_dynamic_syms < 1)
9761             {
9762               error (_("Unable to determine the number of symbols to load\n"));
9763               continue;
9764             }
9765         }
9766     }
9767
9768   /* Similarly find a string table.  */
9769   if (dynamic_strings == NULL)
9770     {
9771       for (entry = dynamic_section;
9772            entry < dynamic_section + dynamic_nent;
9773            ++entry)
9774         {
9775           unsigned long offset;
9776           long str_tab_len;
9777
9778           if (entry->d_tag != DT_STRTAB)
9779             continue;
9780
9781           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9782
9783           /* Since we do not know how big the string table is,
9784              we default to reading in the entire file (!) and
9785              processing that.  This is overkill, I know, but it
9786              should work.  */
9787
9788           offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9789
9790           if (archive_file_offset != 0)
9791             str_tab_len = archive_file_size - offset;
9792           else
9793             str_tab_len = filedata->file_size - offset;
9794
9795           if (str_tab_len < 1)
9796             {
9797               error
9798                 (_("Unable to determine the length of the dynamic string table\n"));
9799               continue;
9800             }
9801
9802           if (dynamic_strings != NULL)
9803             {
9804               error (_("Multiple dynamic string tables found\n"));
9805               free (dynamic_strings);
9806             }
9807
9808           dynamic_strings = (char *) get_data (NULL, filedata, offset, 1,
9809                                                str_tab_len,
9810                                                _("dynamic string table"));
9811           dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9812         }
9813     }
9814
9815   /* And find the syminfo section if available.  */
9816   if (dynamic_syminfo == NULL)
9817     {
9818       unsigned long syminsz = 0;
9819
9820       for (entry = dynamic_section;
9821            entry < dynamic_section + dynamic_nent;
9822            ++entry)
9823         {
9824           if (entry->d_tag == DT_SYMINENT)
9825             {
9826               /* Note: these braces are necessary to avoid a syntax
9827                  error from the SunOS4 C compiler.  */
9828               /* PR binutils/17531: A corrupt file can trigger this test.
9829                  So do not use an assert, instead generate an error message.  */
9830               if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9831                 error (_("Bad value (%d) for SYMINENT entry\n"),
9832                        (int) entry->d_un.d_val);
9833             }
9834           else if (entry->d_tag == DT_SYMINSZ)
9835             syminsz = entry->d_un.d_val;
9836           else if (entry->d_tag == DT_SYMINFO)
9837             dynamic_syminfo_offset = offset_from_vma (filedata, entry->d_un.d_val,
9838                                                       syminsz);
9839         }
9840
9841       if (dynamic_syminfo_offset != 0 && syminsz != 0)
9842         {
9843           Elf_External_Syminfo * extsyminfo;
9844           Elf_External_Syminfo * extsym;
9845           Elf_Internal_Syminfo * syminfo;
9846
9847           /* There is a syminfo section.  Read the data.  */
9848           extsyminfo = (Elf_External_Syminfo *)
9849               get_data (NULL, filedata, dynamic_syminfo_offset, 1, syminsz,
9850                         _("symbol information"));
9851           if (!extsyminfo)
9852             return FALSE;
9853
9854           if (dynamic_syminfo != NULL)
9855             {
9856               error (_("Multiple dynamic symbol information sections found\n"));
9857               free (dynamic_syminfo);
9858             }
9859           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9860           if (dynamic_syminfo == NULL)
9861             {
9862               error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9863                      (unsigned long) syminsz);
9864               return FALSE;
9865             }
9866
9867           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9868           for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9869                syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9870                ++syminfo, ++extsym)
9871             {
9872               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9873               syminfo->si_flags = BYTE_GET (extsym->si_flags);
9874             }
9875
9876           free (extsyminfo);
9877         }
9878     }
9879
9880   if (do_dynamic && dynamic_addr)
9881     printf (ngettext ("\nDynamic section at offset 0x%lx "
9882                       "contains %lu entry:\n",
9883                       "\nDynamic section at offset 0x%lx "
9884                       "contains %lu entries:\n",
9885                       dynamic_nent),
9886             dynamic_addr, (unsigned long) dynamic_nent);
9887   if (do_dynamic)
9888     printf (_("  Tag        Type                         Name/Value\n"));
9889
9890   for (entry = dynamic_section;
9891        entry < dynamic_section + dynamic_nent;
9892        entry++)
9893     {
9894       if (do_dynamic)
9895         {
9896           const char * dtype;
9897
9898           putchar (' ');
9899           print_vma (entry->d_tag, FULL_HEX);
9900           dtype = get_dynamic_type (filedata, entry->d_tag);
9901           printf (" (%s)%*s", dtype,
9902                   ((is_32bit_elf ? 27 : 19) - (int) strlen (dtype)), " ");
9903         }
9904
9905       switch (entry->d_tag)
9906         {
9907         case DT_FLAGS:
9908           if (do_dynamic)
9909             print_dynamic_flags (entry->d_un.d_val);
9910           break;
9911
9912         case DT_AUXILIARY:
9913         case DT_FILTER:
9914         case DT_CONFIG:
9915         case DT_DEPAUDIT:
9916         case DT_AUDIT:
9917           if (do_dynamic)
9918             {
9919               switch (entry->d_tag)
9920                 {
9921                 case DT_AUXILIARY:
9922                   printf (_("Auxiliary library"));
9923                   break;
9924
9925                 case DT_FILTER:
9926                   printf (_("Filter library"));
9927                   break;
9928
9929                 case DT_CONFIG:
9930                   printf (_("Configuration file"));
9931                   break;
9932
9933                 case DT_DEPAUDIT:
9934                   printf (_("Dependency audit library"));
9935                   break;
9936
9937                 case DT_AUDIT:
9938                   printf (_("Audit library"));
9939                   break;
9940                 }
9941
9942               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9943                 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9944               else
9945                 {
9946                   printf (": ");
9947                   print_vma (entry->d_un.d_val, PREFIX_HEX);
9948                   putchar ('\n');
9949                 }
9950             }
9951           break;
9952
9953         case DT_FEATURE:
9954           if (do_dynamic)
9955             {
9956               printf (_("Flags:"));
9957
9958               if (entry->d_un.d_val == 0)
9959                 printf (_(" None\n"));
9960               else
9961                 {
9962                   unsigned long int val = entry->d_un.d_val;
9963
9964                   if (val & DTF_1_PARINIT)
9965                     {
9966                       printf (" PARINIT");
9967                       val ^= DTF_1_PARINIT;
9968                     }
9969                   if (val & DTF_1_CONFEXP)
9970                     {
9971                       printf (" CONFEXP");
9972                       val ^= DTF_1_CONFEXP;
9973                     }
9974                   if (val != 0)
9975                     printf (" %lx", val);
9976                   puts ("");
9977                 }
9978             }
9979           break;
9980
9981         case DT_POSFLAG_1:
9982           if (do_dynamic)
9983             {
9984               printf (_("Flags:"));
9985
9986               if (entry->d_un.d_val == 0)
9987                 printf (_(" None\n"));
9988               else
9989                 {
9990                   unsigned long int val = entry->d_un.d_val;
9991
9992                   if (val & DF_P1_LAZYLOAD)
9993                     {
9994                       printf (" LAZYLOAD");
9995                       val ^= DF_P1_LAZYLOAD;
9996                     }
9997                   if (val & DF_P1_GROUPPERM)
9998                     {
9999                       printf (" GROUPPERM");
10000                       val ^= DF_P1_GROUPPERM;
10001                     }
10002                   if (val != 0)
10003                     printf (" %lx", val);
10004                   puts ("");
10005                 }
10006             }
10007           break;
10008
10009         case DT_FLAGS_1:
10010           if (do_dynamic)
10011             {
10012               printf (_("Flags:"));
10013               if (entry->d_un.d_val == 0)
10014                 printf (_(" None\n"));
10015               else
10016                 {
10017                   unsigned long int val = entry->d_un.d_val;
10018
10019                   if (val & DF_1_NOW)
10020                     {
10021                       printf (" NOW");
10022                       val ^= DF_1_NOW;
10023                     }
10024                   if (val & DF_1_GLOBAL)
10025                     {
10026                       printf (" GLOBAL");
10027                       val ^= DF_1_GLOBAL;
10028                     }
10029                   if (val & DF_1_GROUP)
10030                     {
10031                       printf (" GROUP");
10032                       val ^= DF_1_GROUP;
10033                     }
10034                   if (val & DF_1_NODELETE)
10035                     {
10036                       printf (" NODELETE");
10037                       val ^= DF_1_NODELETE;
10038                     }
10039                   if (val & DF_1_LOADFLTR)
10040                     {
10041                       printf (" LOADFLTR");
10042                       val ^= DF_1_LOADFLTR;
10043                     }
10044                   if (val & DF_1_INITFIRST)
10045                     {
10046                       printf (" INITFIRST");
10047                       val ^= DF_1_INITFIRST;
10048                     }
10049                   if (val & DF_1_NOOPEN)
10050                     {
10051                       printf (" NOOPEN");
10052                       val ^= DF_1_NOOPEN;
10053                     }
10054                   if (val & DF_1_ORIGIN)
10055                     {
10056                       printf (" ORIGIN");
10057                       val ^= DF_1_ORIGIN;
10058                     }
10059                   if (val & DF_1_DIRECT)
10060                     {
10061                       printf (" DIRECT");
10062                       val ^= DF_1_DIRECT;
10063                     }
10064                   if (val & DF_1_TRANS)
10065                     {
10066                       printf (" TRANS");
10067                       val ^= DF_1_TRANS;
10068                     }
10069                   if (val & DF_1_INTERPOSE)
10070                     {
10071                       printf (" INTERPOSE");
10072                       val ^= DF_1_INTERPOSE;
10073                     }
10074                   if (val & DF_1_NODEFLIB)
10075                     {
10076                       printf (" NODEFLIB");
10077                       val ^= DF_1_NODEFLIB;
10078                     }
10079                   if (val & DF_1_NODUMP)
10080                     {
10081                       printf (" NODUMP");
10082                       val ^= DF_1_NODUMP;
10083                     }
10084                   if (val & DF_1_CONFALT)
10085                     {
10086                       printf (" CONFALT");
10087                       val ^= DF_1_CONFALT;
10088                     }
10089                   if (val & DF_1_ENDFILTEE)
10090                     {
10091                       printf (" ENDFILTEE");
10092                       val ^= DF_1_ENDFILTEE;
10093                     }
10094                   if (val & DF_1_DISPRELDNE)
10095                     {
10096                       printf (" DISPRELDNE");
10097                       val ^= DF_1_DISPRELDNE;
10098                     }
10099                   if (val & DF_1_DISPRELPND)
10100                     {
10101                       printf (" DISPRELPND");
10102                       val ^= DF_1_DISPRELPND;
10103                     }
10104                   if (val & DF_1_NODIRECT)
10105                     {
10106                       printf (" NODIRECT");
10107                       val ^= DF_1_NODIRECT;
10108                     }
10109                   if (val & DF_1_IGNMULDEF)
10110                     {
10111                       printf (" IGNMULDEF");
10112                       val ^= DF_1_IGNMULDEF;
10113                     }
10114                   if (val & DF_1_NOKSYMS)
10115                     {
10116                       printf (" NOKSYMS");
10117                       val ^= DF_1_NOKSYMS;
10118                     }
10119                   if (val & DF_1_NOHDR)
10120                     {
10121                       printf (" NOHDR");
10122                       val ^= DF_1_NOHDR;
10123                     }
10124                   if (val & DF_1_EDITED)
10125                     {
10126                       printf (" EDITED");
10127                       val ^= DF_1_EDITED;
10128                     }
10129                   if (val & DF_1_NORELOC)
10130                     {
10131                       printf (" NORELOC");
10132                       val ^= DF_1_NORELOC;
10133                     }
10134                   if (val & DF_1_SYMINTPOSE)
10135                     {
10136                       printf (" SYMINTPOSE");
10137                       val ^= DF_1_SYMINTPOSE;
10138                     }
10139                   if (val & DF_1_GLOBAUDIT)
10140                     {
10141                       printf (" GLOBAUDIT");
10142                       val ^= DF_1_GLOBAUDIT;
10143                     }
10144                   if (val & DF_1_SINGLETON)
10145                     {
10146                       printf (" SINGLETON");
10147                       val ^= DF_1_SINGLETON;
10148                     }
10149                   if (val & DF_1_STUB)
10150                     {
10151                       printf (" STUB");
10152                       val ^= DF_1_STUB;
10153                     }
10154                   if (val & DF_1_PIE)
10155                     {
10156                       printf (" PIE");
10157                       val ^= DF_1_PIE;
10158                     }
10159                   if (val & DF_1_KMOD)
10160                     {
10161                       printf (" KMOD");
10162                       val ^= DF_1_KMOD;
10163                     }
10164                   if (val & DF_1_WEAKFILTER)
10165                     {
10166                       printf (" WEAKFILTER");
10167                       val ^= DF_1_WEAKFILTER;
10168                     }
10169                   if (val & DF_1_NOCOMMON)
10170                     {
10171                       printf (" NOCOMMON");
10172                       val ^= DF_1_NOCOMMON;
10173                     }
10174                   if (val != 0)
10175                     printf (" %lx", val);
10176                   puts ("");
10177                 }
10178             }
10179           break;
10180
10181         case DT_PLTREL:
10182           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10183           if (do_dynamic)
10184             puts (get_dynamic_type (filedata, entry->d_un.d_val));
10185           break;
10186
10187         case DT_NULL    :
10188         case DT_NEEDED  :
10189         case DT_PLTGOT  :
10190         case DT_HASH    :
10191         case DT_STRTAB  :
10192         case DT_SYMTAB  :
10193         case DT_RELA    :
10194         case DT_INIT    :
10195         case DT_FINI    :
10196         case DT_SONAME  :
10197         case DT_RPATH   :
10198         case DT_SYMBOLIC:
10199         case DT_REL     :
10200         case DT_DEBUG   :
10201         case DT_TEXTREL :
10202         case DT_JMPREL  :
10203         case DT_RUNPATH :
10204           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10205
10206           if (do_dynamic)
10207             {
10208               char * name;
10209
10210               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
10211                 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10212               else
10213                 name = NULL;
10214
10215               if (name)
10216                 {
10217                   switch (entry->d_tag)
10218                     {
10219                     case DT_NEEDED:
10220                       printf (_("Shared library: [%s]"), name);
10221
10222                       if (streq (name, program_interpreter))
10223                         printf (_(" program interpreter"));
10224                       break;
10225
10226                     case DT_SONAME:
10227                       printf (_("Library soname: [%s]"), name);
10228                       break;
10229
10230                     case DT_RPATH:
10231                       printf (_("Library rpath: [%s]"), name);
10232                       break;
10233
10234                     case DT_RUNPATH:
10235                       printf (_("Library runpath: [%s]"), name);
10236                       break;
10237
10238                     default:
10239                       print_vma (entry->d_un.d_val, PREFIX_HEX);
10240                       break;
10241                     }
10242                 }
10243               else
10244                 print_vma (entry->d_un.d_val, PREFIX_HEX);
10245
10246               putchar ('\n');
10247             }
10248           break;
10249
10250         case DT_PLTRELSZ:
10251         case DT_RELASZ  :
10252         case DT_STRSZ   :
10253         case DT_RELSZ   :
10254         case DT_RELAENT :
10255         case DT_SYMENT  :
10256         case DT_RELENT  :
10257           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10258           /* Fall through.  */
10259         case DT_PLTPADSZ:
10260         case DT_MOVEENT :
10261         case DT_MOVESZ  :
10262         case DT_INIT_ARRAYSZ:
10263         case DT_FINI_ARRAYSZ:
10264         case DT_GNU_CONFLICTSZ:
10265         case DT_GNU_LIBLISTSZ:
10266           if (do_dynamic)
10267             {
10268               print_vma (entry->d_un.d_val, UNSIGNED);
10269               printf (_(" (bytes)\n"));
10270             }
10271           break;
10272
10273         case DT_VERDEFNUM:
10274         case DT_VERNEEDNUM:
10275         case DT_RELACOUNT:
10276         case DT_RELCOUNT:
10277           if (do_dynamic)
10278             {
10279               print_vma (entry->d_un.d_val, UNSIGNED);
10280               putchar ('\n');
10281             }
10282           break;
10283
10284         case DT_SYMINSZ:
10285         case DT_SYMINENT:
10286         case DT_SYMINFO:
10287         case DT_USED:
10288         case DT_INIT_ARRAY:
10289         case DT_FINI_ARRAY:
10290           if (do_dynamic)
10291             {
10292               if (entry->d_tag == DT_USED
10293                   && VALID_DYNAMIC_NAME (entry->d_un.d_val))
10294                 {
10295                   char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10296
10297                   if (*name)
10298                     {
10299                       printf (_("Not needed object: [%s]\n"), name);
10300                       break;
10301                     }
10302                 }
10303
10304               print_vma (entry->d_un.d_val, PREFIX_HEX);
10305               putchar ('\n');
10306             }
10307           break;
10308
10309         case DT_BIND_NOW:
10310           /* The value of this entry is ignored.  */
10311           if (do_dynamic)
10312             putchar ('\n');
10313           break;
10314
10315         case DT_GNU_PRELINKED:
10316           if (do_dynamic)
10317             {
10318               struct tm * tmp;
10319               time_t atime = entry->d_un.d_val;
10320
10321               tmp = gmtime (&atime);
10322               /* PR 17533 file: 041-1244816-0.004.  */
10323               if (tmp == NULL)
10324                 printf (_("<corrupt time val: %lx"),
10325                         (unsigned long) atime);
10326               else
10327                 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
10328                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
10329                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
10330
10331             }
10332           break;
10333
10334         case DT_GNU_HASH:
10335           dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
10336           if (do_dynamic)
10337             {
10338               print_vma (entry->d_un.d_val, PREFIX_HEX);
10339               putchar ('\n');
10340             }
10341           break;
10342
10343         default:
10344           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
10345             version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
10346               entry->d_un.d_val;
10347
10348           if (do_dynamic)
10349             {
10350               switch (filedata->file_header.e_machine)
10351                 {
10352                 case EM_MIPS:
10353                 case EM_MIPS_RS3_LE:
10354                   dynamic_section_mips_val (entry);
10355                   break;
10356                 case EM_PARISC:
10357                   dynamic_section_parisc_val (entry);
10358                   break;
10359                 case EM_IA_64:
10360                   dynamic_section_ia64_val (entry);
10361                   break;
10362                 default:
10363                   print_vma (entry->d_un.d_val, PREFIX_HEX);
10364                   putchar ('\n');
10365                 }
10366             }
10367           break;
10368         }
10369     }
10370
10371   return TRUE;
10372 }
10373
10374 static char *
10375 get_ver_flags (unsigned int flags)
10376 {
10377   static char buff[128];
10378
10379   buff[0] = 0;
10380
10381   if (flags == 0)
10382     return _("none");
10383
10384   if (flags & VER_FLG_BASE)
10385     strcat (buff, "BASE");
10386
10387   if (flags & VER_FLG_WEAK)
10388     {
10389       if (flags & VER_FLG_BASE)
10390         strcat (buff, " | ");
10391
10392       strcat (buff, "WEAK");
10393     }
10394
10395   if (flags & VER_FLG_INFO)
10396     {
10397       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
10398         strcat (buff, " | ");
10399
10400       strcat (buff, "INFO");
10401     }
10402
10403   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10404     {
10405       if (flags & (VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10406         strcat (buff, " | ");
10407
10408       strcat (buff, _("<unknown>"));
10409     }
10410
10411   return buff;
10412 }
10413
10414 /* Display the contents of the version sections.  */
10415
10416 static bfd_boolean
10417 process_version_sections (Filedata * filedata)
10418 {
10419   Elf_Internal_Shdr * section;
10420   unsigned i;
10421   bfd_boolean found = FALSE;
10422
10423   if (! do_version)
10424     return TRUE;
10425
10426   for (i = 0, section = filedata->section_headers;
10427        i < filedata->file_header.e_shnum;
10428        i++, section++)
10429     {
10430       switch (section->sh_type)
10431         {
10432         case SHT_GNU_verdef:
10433           {
10434             Elf_External_Verdef * edefs;
10435             unsigned long idx;
10436             unsigned long cnt;
10437             char * endbuf;
10438
10439             found = TRUE;
10440
10441             printf (ngettext ("\nVersion definition section '%s' "
10442                               "contains %u entry:\n",
10443                               "\nVersion definition section '%s' "
10444                               "contains %u entries:\n",
10445                               section->sh_info),
10446                     printable_section_name (filedata, section),
10447                     section->sh_info);
10448
10449             printf (_("  Addr: 0x"));
10450             printf_vma (section->sh_addr);
10451             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10452                     (unsigned long) section->sh_offset, section->sh_link,
10453                     printable_section_name_from_index (filedata, section->sh_link));
10454
10455             edefs = (Elf_External_Verdef *)
10456                 get_data (NULL, filedata, section->sh_offset, 1,section->sh_size,
10457                           _("version definition section"));
10458             if (!edefs)
10459               break;
10460             endbuf = (char *) edefs + section->sh_size;
10461
10462             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10463               {
10464                 char * vstart;
10465                 Elf_External_Verdef * edef;
10466                 Elf_Internal_Verdef ent;
10467                 Elf_External_Verdaux * eaux;
10468                 Elf_Internal_Verdaux aux;
10469                 unsigned long isum;
10470                 int j;
10471
10472                 vstart = ((char *) edefs) + idx;
10473                 if (vstart + sizeof (*edef) > endbuf)
10474                   break;
10475
10476                 edef = (Elf_External_Verdef *) vstart;
10477
10478                 ent.vd_version = BYTE_GET (edef->vd_version);
10479                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
10480                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
10481                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
10482                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
10483                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
10484                 ent.vd_next    = BYTE_GET (edef->vd_next);
10485
10486                 printf (_("  %#06lx: Rev: %d  Flags: %s"),
10487                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
10488
10489                 printf (_("  Index: %d  Cnt: %d  "),
10490                         ent.vd_ndx, ent.vd_cnt);
10491
10492                 /* Check for overflow.  */
10493                 if (ent.vd_aux > (size_t) (endbuf - vstart))
10494                   break;
10495
10496                 vstart += ent.vd_aux;
10497
10498                 if (vstart + sizeof (*eaux) > endbuf)
10499                   break;
10500                 eaux = (Elf_External_Verdaux *) vstart;
10501
10502                 aux.vda_name = BYTE_GET (eaux->vda_name);
10503                 aux.vda_next = BYTE_GET (eaux->vda_next);
10504
10505                 if (VALID_DYNAMIC_NAME (aux.vda_name))
10506                   printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
10507                 else
10508                   printf (_("Name index: %ld\n"), aux.vda_name);
10509
10510                 isum = idx + ent.vd_aux;
10511
10512                 for (j = 1; j < ent.vd_cnt; j++)
10513                   {
10514                     if (aux.vda_next < sizeof (*eaux)
10515                         && !(j == ent.vd_cnt - 1 && aux.vda_next == 0))
10516                       {
10517                         warn (_("Invalid vda_next field of %lx\n"),
10518                               aux.vda_next);
10519                         j = ent.vd_cnt;
10520                         break;
10521                       }
10522                     /* Check for overflow.  */
10523                     if (aux.vda_next > (size_t) (endbuf - vstart))
10524                       break;
10525
10526                     isum   += aux.vda_next;
10527                     vstart += aux.vda_next;
10528
10529                     if (vstart + sizeof (*eaux) > endbuf)
10530                       break;
10531                     eaux = (Elf_External_Verdaux *) vstart;
10532
10533                     aux.vda_name = BYTE_GET (eaux->vda_name);
10534                     aux.vda_next = BYTE_GET (eaux->vda_next);
10535
10536                     if (VALID_DYNAMIC_NAME (aux.vda_name))
10537                       printf (_("  %#06lx: Parent %d: %s\n"),
10538                               isum, j, GET_DYNAMIC_NAME (aux.vda_name));
10539                     else
10540                       printf (_("  %#06lx: Parent %d, name index: %ld\n"),
10541                               isum, j, aux.vda_name);
10542                   }
10543
10544                 if (j < ent.vd_cnt)
10545                   printf (_("  Version def aux past end of section\n"));
10546
10547                 /* PR 17531:
10548                    file: id:000001,src:000172+005151,op:splice,rep:2.  */
10549                 if (ent.vd_next < sizeof (*edef)
10550                     && !(cnt == section->sh_info - 1 && ent.vd_next == 0))
10551                   {
10552                     warn (_("Invalid vd_next field of %lx\n"), ent.vd_next);
10553                     cnt = section->sh_info;
10554                     break;
10555                   }
10556                 if (ent.vd_next > (size_t) (endbuf - ((char *) edefs + idx)))
10557                   break;
10558
10559                 idx += ent.vd_next;
10560               }
10561
10562             if (cnt < section->sh_info)
10563               printf (_("  Version definition past end of section\n"));
10564
10565             free (edefs);
10566           }
10567           break;
10568
10569         case SHT_GNU_verneed:
10570           {
10571             Elf_External_Verneed * eneed;
10572             unsigned long idx;
10573             unsigned long cnt;
10574             char * endbuf;
10575
10576             found = TRUE;
10577
10578             printf (ngettext ("\nVersion needs section '%s' "
10579                               "contains %u entry:\n",
10580                               "\nVersion needs section '%s' "
10581                               "contains %u entries:\n",
10582                               section->sh_info),
10583                     printable_section_name (filedata, section), section->sh_info);
10584
10585             printf (_(" Addr: 0x"));
10586             printf_vma (section->sh_addr);
10587             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10588                     (unsigned long) section->sh_offset, section->sh_link,
10589                     printable_section_name_from_index (filedata, section->sh_link));
10590
10591             eneed = (Elf_External_Verneed *) get_data (NULL, filedata,
10592                                                        section->sh_offset, 1,
10593                                                        section->sh_size,
10594                                                        _("Version Needs section"));
10595             if (!eneed)
10596               break;
10597             endbuf = (char *) eneed + section->sh_size;
10598
10599             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10600               {
10601                 Elf_External_Verneed * entry;
10602                 Elf_Internal_Verneed ent;
10603                 unsigned long isum;
10604                 int j;
10605                 char * vstart;
10606
10607                 vstart = ((char *) eneed) + idx;
10608                 if (vstart + sizeof (*entry) > endbuf)
10609                   break;
10610
10611                 entry = (Elf_External_Verneed *) vstart;
10612
10613                 ent.vn_version = BYTE_GET (entry->vn_version);
10614                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
10615                 ent.vn_file    = BYTE_GET (entry->vn_file);
10616                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
10617                 ent.vn_next    = BYTE_GET (entry->vn_next);
10618
10619                 printf (_("  %#06lx: Version: %d"), idx, ent.vn_version);
10620
10621                 if (VALID_DYNAMIC_NAME (ent.vn_file))
10622                   printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
10623                 else
10624                   printf (_("  File: %lx"), ent.vn_file);
10625
10626                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
10627
10628                 /* Check for overflow.  */
10629                 if (ent.vn_aux > (size_t) (endbuf - vstart))
10630                   break;
10631                 vstart += ent.vn_aux;
10632
10633                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10634                   {
10635                     Elf_External_Vernaux * eaux;
10636                     Elf_Internal_Vernaux aux;
10637
10638                     if (vstart + sizeof (*eaux) > endbuf)
10639                       break;
10640                     eaux = (Elf_External_Vernaux *) vstart;
10641
10642                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
10643                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
10644                     aux.vna_other = BYTE_GET (eaux->vna_other);
10645                     aux.vna_name  = BYTE_GET (eaux->vna_name);
10646                     aux.vna_next  = BYTE_GET (eaux->vna_next);
10647
10648                     if (VALID_DYNAMIC_NAME (aux.vna_name))
10649                       printf (_("  %#06lx:   Name: %s"),
10650                               isum, GET_DYNAMIC_NAME (aux.vna_name));
10651                     else
10652                       printf (_("  %#06lx:   Name index: %lx"),
10653                               isum, aux.vna_name);
10654
10655                     printf (_("  Flags: %s  Version: %d\n"),
10656                             get_ver_flags (aux.vna_flags), aux.vna_other);
10657
10658                     if (aux.vna_next < sizeof (*eaux)
10659                         && !(j == ent.vn_cnt - 1 && aux.vna_next == 0))
10660                       {
10661                         warn (_("Invalid vna_next field of %lx\n"),
10662                               aux.vna_next);
10663                         j = ent.vn_cnt;
10664                         break;
10665                       }
10666                     /* Check for overflow.  */
10667                     if (aux.vna_next > (size_t) (endbuf - vstart))
10668                       break;
10669                     isum   += aux.vna_next;
10670                     vstart += aux.vna_next;
10671                   }
10672
10673                 if (j < ent.vn_cnt)
10674                   warn (_("Missing Version Needs auxillary information\n"));
10675
10676                 if (ent.vn_next < sizeof (*entry)
10677                     && !(cnt == section->sh_info - 1 && ent.vn_next == 0))
10678                   {
10679                     warn (_("Invalid vn_next field of %lx\n"), ent.vn_next);
10680                     cnt = section->sh_info;
10681                     break;
10682                   }
10683                 if (ent.vn_next > (size_t) (endbuf - ((char *) eneed + idx)))
10684                   break;
10685                 idx += ent.vn_next;
10686               }
10687
10688             if (cnt < section->sh_info)
10689               warn (_("Missing Version Needs information\n"));
10690
10691             free (eneed);
10692           }
10693           break;
10694
10695         case SHT_GNU_versym:
10696           {
10697             Elf_Internal_Shdr * link_section;
10698             size_t total;
10699             unsigned int cnt;
10700             unsigned char * edata;
10701             unsigned short * data;
10702             char * strtab;
10703             Elf_Internal_Sym * symbols;
10704             Elf_Internal_Shdr * string_sec;
10705             unsigned long num_syms;
10706             long off;
10707
10708             if (section->sh_link >= filedata->file_header.e_shnum)
10709               break;
10710
10711             link_section = filedata->section_headers + section->sh_link;
10712             total = section->sh_size / sizeof (Elf_External_Versym);
10713
10714             if (link_section->sh_link >= filedata->file_header.e_shnum)
10715               break;
10716
10717             found = TRUE;
10718
10719             symbols = GET_ELF_SYMBOLS (filedata, link_section, & num_syms);
10720             if (symbols == NULL)
10721               break;
10722
10723             string_sec = filedata->section_headers + link_section->sh_link;
10724
10725             strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
10726                                         string_sec->sh_size,
10727                                         _("version string table"));
10728             if (!strtab)
10729               {
10730                 free (symbols);
10731                 break;
10732               }
10733
10734             printf (ngettext ("\nVersion symbols section '%s' "
10735                               "contains %lu entry:\n",
10736                               "\nVersion symbols section '%s' "
10737                               "contains %lu entries:\n",
10738                               total),
10739                     printable_section_name (filedata, section), (unsigned long) total);
10740
10741             printf (_(" Addr: "));
10742             printf_vma (section->sh_addr);
10743             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10744                     (unsigned long) section->sh_offset, section->sh_link,
10745                     printable_section_name (filedata, link_section));
10746
10747             off = offset_from_vma (filedata,
10748                                    version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10749                                    total * sizeof (short));
10750             edata = (unsigned char *) get_data (NULL, filedata, off, total,
10751                                                 sizeof (short),
10752                                                 _("version symbol data"));
10753             if (!edata)
10754               {
10755                 free (strtab);
10756                 free (symbols);
10757                 break;
10758               }
10759
10760             data = (short unsigned int *) cmalloc (total, sizeof (short));
10761
10762             for (cnt = total; cnt --;)
10763               data[cnt] = byte_get (edata + cnt * sizeof (short),
10764                                     sizeof (short));
10765
10766             free (edata);
10767
10768             for (cnt = 0; cnt < total; cnt += 4)
10769               {
10770                 int j, nn;
10771                 char *name;
10772                 char *invalid = _("*invalid*");
10773
10774                 printf ("  %03x:", cnt);
10775
10776                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10777                   switch (data[cnt + j])
10778                     {
10779                     case 0:
10780                       fputs (_("   0 (*local*)    "), stdout);
10781                       break;
10782
10783                     case 1:
10784                       fputs (_("   1 (*global*)   "), stdout);
10785                       break;
10786
10787                     default:
10788                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10789                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10790
10791                       /* If this index value is greater than the size of the symbols
10792                          array, break to avoid an out-of-bounds read.  */
10793                       if ((unsigned long)(cnt + j) >= num_syms)
10794                         {
10795                           warn (_("invalid index into symbol array\n"));
10796                           break;
10797                         }
10798
10799                       name = NULL;
10800                       if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10801                         {
10802                           Elf_Internal_Verneed ivn;
10803                           unsigned long offset;
10804
10805                           offset = offset_from_vma
10806                             (filedata, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10807                              sizeof (Elf_External_Verneed));
10808
10809                           do
10810                             {
10811                               Elf_Internal_Vernaux ivna;
10812                               Elf_External_Verneed evn;
10813                               Elf_External_Vernaux evna;
10814                               unsigned long a_off;
10815
10816                               if (get_data (&evn, filedata, offset, sizeof (evn), 1,
10817                                             _("version need")) == NULL)
10818                                 break;
10819
10820                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10821                               ivn.vn_next = BYTE_GET (evn.vn_next);
10822
10823                               a_off = offset + ivn.vn_aux;
10824
10825                               do
10826                                 {
10827                                   if (get_data (&evna, filedata, a_off, sizeof (evna),
10828                                                 1, _("version need aux (2)")) == NULL)
10829                                     {
10830                                       ivna.vna_next  = 0;
10831                                       ivna.vna_other = 0;
10832                                     }
10833                                   else
10834                                     {
10835                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
10836                                       ivna.vna_other = BYTE_GET (evna.vna_other);
10837                                     }
10838
10839                                   a_off += ivna.vna_next;
10840                                 }
10841                               while (ivna.vna_other != data[cnt + j]
10842                                      && ivna.vna_next != 0);
10843
10844                               if (ivna.vna_other == data[cnt + j])
10845                                 {
10846                                   ivna.vna_name = BYTE_GET (evna.vna_name);
10847
10848                                   if (ivna.vna_name >= string_sec->sh_size)
10849                                     name = invalid;
10850                                   else
10851                                     name = strtab + ivna.vna_name;
10852                                   break;
10853                                 }
10854
10855                               offset += ivn.vn_next;
10856                             }
10857                           while (ivn.vn_next);
10858                         }
10859
10860                       if (data[cnt + j] != 0x8001
10861                           && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10862                         {
10863                           Elf_Internal_Verdef ivd;
10864                           Elf_External_Verdef evd;
10865                           unsigned long offset;
10866
10867                           offset = offset_from_vma
10868                             (filedata, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10869                              sizeof evd);
10870
10871                           do
10872                             {
10873                               if (get_data (&evd, filedata, offset, sizeof (evd), 1,
10874                                             _("version def")) == NULL)
10875                                 {
10876                                   ivd.vd_next = 0;
10877                                   /* PR 17531: file: 046-1082287-0.004.  */
10878                                   ivd.vd_ndx  = (data[cnt + j] & VERSYM_VERSION) + 1;
10879                                   break;
10880                                 }
10881                               else
10882                                 {
10883                                   ivd.vd_next = BYTE_GET (evd.vd_next);
10884                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
10885                                 }
10886
10887                               offset += ivd.vd_next;
10888                             }
10889                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10890                                  && ivd.vd_next != 0);
10891
10892                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10893                             {
10894                               Elf_External_Verdaux evda;
10895                               Elf_Internal_Verdaux ivda;
10896
10897                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
10898
10899                               if (get_data (&evda, filedata,
10900                                             offset - ivd.vd_next + ivd.vd_aux,
10901                                             sizeof (evda), 1,
10902                                             _("version def aux")) == NULL)
10903                                 break;
10904
10905                               ivda.vda_name = BYTE_GET (evda.vda_name);
10906
10907                               if (ivda.vda_name >= string_sec->sh_size)
10908                                 name = invalid;
10909                               else if (name != NULL && name != invalid)
10910                                 name = _("*both*");
10911                               else
10912                                 name = strtab + ivda.vda_name;
10913                             }
10914                         }
10915                       if (name != NULL)
10916                         nn += printf ("(%s%-*s",
10917                                       name,
10918                                       12 - (int) strlen (name),
10919                                       ")");
10920
10921                       if (nn < 18)
10922                         printf ("%*c", 18 - nn, ' ');
10923                     }
10924
10925                 putchar ('\n');
10926               }
10927
10928             free (data);
10929             free (strtab);
10930             free (symbols);
10931           }
10932           break;
10933
10934         default:
10935           break;
10936         }
10937     }
10938
10939   if (! found)
10940     printf (_("\nNo version information found in this file.\n"));
10941
10942   return TRUE;
10943 }
10944
10945 static const char *
10946 get_symbol_binding (Filedata * filedata, unsigned int binding)
10947 {
10948   static char buff[32];
10949
10950   switch (binding)
10951     {
10952     case STB_LOCAL:     return "LOCAL";
10953     case STB_GLOBAL:    return "GLOBAL";
10954     case STB_WEAK:      return "WEAK";
10955     default:
10956       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10957         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10958                   binding);
10959       else if (binding >= STB_LOOS && binding <= STB_HIOS)
10960         {
10961           if (binding == STB_GNU_UNIQUE
10962               && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10963                   /* GNU is still using the default value 0.  */
10964                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10965             return "UNIQUE";
10966           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10967         }
10968       else
10969         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
10970       return buff;
10971     }
10972 }
10973
10974 static const char *
10975 get_symbol_type (Filedata * filedata, unsigned int type)
10976 {
10977   static char buff[32];
10978
10979   switch (type)
10980     {
10981     case STT_NOTYPE:    return "NOTYPE";
10982     case STT_OBJECT:    return "OBJECT";
10983     case STT_FUNC:      return "FUNC";
10984     case STT_SECTION:   return "SECTION";
10985     case STT_FILE:      return "FILE";
10986     case STT_COMMON:    return "COMMON";
10987     case STT_TLS:       return "TLS";
10988     case STT_RELC:      return "RELC";
10989     case STT_SRELC:     return "SRELC";
10990     default:
10991       if (type >= STT_LOPROC && type <= STT_HIPROC)
10992         {
10993           if (filedata->file_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10994             return "THUMB_FUNC";
10995
10996           if (filedata->file_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
10997             return "REGISTER";
10998
10999           if (filedata->file_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
11000             return "PARISC_MILLI";
11001
11002           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
11003         }
11004       else if (type >= STT_LOOS && type <= STT_HIOS)
11005         {
11006           if (filedata->file_header.e_machine == EM_PARISC)
11007             {
11008               if (type == STT_HP_OPAQUE)
11009                 return "HP_OPAQUE";
11010               if (type == STT_HP_STUB)
11011                 return "HP_STUB";
11012             }
11013
11014           if (type == STT_GNU_IFUNC
11015               && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
11016                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
11017                   /* GNU is still using the default value 0.  */
11018                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
11019             return "IFUNC";
11020
11021           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
11022         }
11023       else
11024         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
11025       return buff;
11026     }
11027 }
11028
11029 static const char *
11030 get_symbol_visibility (unsigned int visibility)
11031 {
11032   switch (visibility)
11033     {
11034     case STV_DEFAULT:   return "DEFAULT";
11035     case STV_INTERNAL:  return "INTERNAL";
11036     case STV_HIDDEN:    return "HIDDEN";
11037     case STV_PROTECTED: return "PROTECTED";
11038     default:
11039       error (_("Unrecognized visibility value: %u"), visibility);
11040       return _("<unknown>");
11041     }
11042 }
11043
11044 static const char *
11045 get_solaris_symbol_visibility (unsigned int visibility)
11046 {
11047   switch (visibility)
11048     {
11049     case 4: return "EXPORTED";
11050     case 5: return "SINGLETON";
11051     case 6: return "ELIMINATE";
11052     default: return get_symbol_visibility (visibility);
11053     }
11054 }
11055
11056 static const char *
11057 get_mips_symbol_other (unsigned int other)
11058 {
11059   switch (other)
11060     {
11061     case STO_OPTIONAL:      return "OPTIONAL";
11062     case STO_MIPS_PLT:      return "MIPS PLT";
11063     case STO_MIPS_PIC:      return "MIPS PIC";
11064     case STO_MICROMIPS:     return "MICROMIPS";
11065     case STO_MICROMIPS | STO_MIPS_PIC:      return "MICROMIPS, MIPS PIC";
11066     case STO_MIPS16:        return "MIPS16";
11067     default:                return NULL;
11068     }
11069 }
11070
11071 static const char *
11072 get_ia64_symbol_other (Filedata * filedata, unsigned int other)
11073 {
11074   if (is_ia64_vms (filedata))
11075     {
11076       static char res[32];
11077
11078       res[0] = 0;
11079
11080       /* Function types is for images and .STB files only.  */
11081       switch (filedata->file_header.e_type)
11082         {
11083         case ET_DYN:
11084         case ET_EXEC:
11085           switch (VMS_ST_FUNC_TYPE (other))
11086             {
11087             case VMS_SFT_CODE_ADDR:
11088               strcat (res, " CA");
11089               break;
11090             case VMS_SFT_SYMV_IDX:
11091               strcat (res, " VEC");
11092               break;
11093             case VMS_SFT_FD:
11094               strcat (res, " FD");
11095               break;
11096             case VMS_SFT_RESERVE:
11097               strcat (res, " RSV");
11098               break;
11099             default:
11100               warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
11101                     VMS_ST_FUNC_TYPE (other));
11102               strcat (res, " <unknown>");
11103               break;
11104             }
11105           break;
11106         default:
11107           break;
11108         }
11109       switch (VMS_ST_LINKAGE (other))
11110         {
11111         case VMS_STL_IGNORE:
11112           strcat (res, " IGN");
11113           break;
11114         case VMS_STL_RESERVE:
11115           strcat (res, " RSV");
11116           break;
11117         case VMS_STL_STD:
11118           strcat (res, " STD");
11119           break;
11120         case VMS_STL_LNK:
11121           strcat (res, " LNK");
11122           break;
11123         default:
11124           warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
11125                 VMS_ST_LINKAGE (other));
11126           strcat (res, " <unknown>");
11127           break;
11128         }
11129
11130       if (res[0] != 0)
11131         return res + 1;
11132       else
11133         return res;
11134     }
11135   return NULL;
11136 }
11137
11138 static const char *
11139 get_ppc64_symbol_other (unsigned int other)
11140 {
11141   if ((other & ~STO_PPC64_LOCAL_MASK) != 0)
11142     return NULL;
11143
11144   other >>= STO_PPC64_LOCAL_BIT;
11145   if (other <= 6)
11146     {
11147       static char buf[32];
11148       if (other >= 2)
11149         other = ppc64_decode_local_entry (other);
11150       snprintf (buf, sizeof buf, _("<localentry>: %d"), other);
11151       return buf;
11152     }
11153   return NULL;
11154 }
11155
11156 static const char *
11157 get_symbol_other (Filedata * filedata, unsigned int other)
11158 {
11159   const char * result = NULL;
11160   static char buff [32];
11161
11162   if (other == 0)
11163     return "";
11164
11165   switch (filedata->file_header.e_machine)
11166     {
11167     case EM_MIPS:
11168       result = get_mips_symbol_other (other);
11169       break;
11170     case EM_IA_64:
11171       result = get_ia64_symbol_other (filedata, other);
11172       break;
11173     case EM_PPC64:
11174       result = get_ppc64_symbol_other (other);
11175       break;
11176     default:
11177       result = NULL;
11178       break;
11179     }
11180
11181   if (result)
11182     return result;
11183
11184   snprintf (buff, sizeof buff, _("<other>: %x"), other);
11185   return buff;
11186 }
11187
11188 static const char *
11189 get_symbol_index_type (Filedata * filedata, unsigned int type)
11190 {
11191   static char buff[32];
11192
11193   switch (type)
11194     {
11195     case SHN_UNDEF:     return "UND";
11196     case SHN_ABS:       return "ABS";
11197     case SHN_COMMON:    return "COM";
11198     default:
11199       if (type == SHN_IA_64_ANSI_COMMON
11200           && filedata->file_header.e_machine == EM_IA_64
11201           && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
11202         return "ANSI_COM";
11203       else if ((filedata->file_header.e_machine == EM_X86_64
11204                 || filedata->file_header.e_machine == EM_L1OM
11205                 || filedata->file_header.e_machine == EM_K1OM)
11206                && type == SHN_X86_64_LCOMMON)
11207         return "LARGE_COM";
11208       else if ((type == SHN_MIPS_SCOMMON
11209                 && filedata->file_header.e_machine == EM_MIPS)
11210                || (type == SHN_TIC6X_SCOMMON
11211                    && filedata->file_header.e_machine == EM_TI_C6000))
11212         return "SCOM";
11213       else if (type == SHN_MIPS_SUNDEFINED
11214                && filedata->file_header.e_machine == EM_MIPS)
11215         return "SUND";
11216       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
11217         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
11218       else if (type >= SHN_LOOS && type <= SHN_HIOS)
11219         sprintf (buff, "OS [0x%04x]", type & 0xffff);
11220       else if (type >= SHN_LORESERVE)
11221         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
11222       else if (type >= filedata->file_header.e_shnum)
11223         sprintf (buff, _("bad section index[%3d]"), type);
11224       else
11225         sprintf (buff, "%3d", type);
11226       break;
11227     }
11228
11229   return buff;
11230 }
11231
11232 static bfd_vma *
11233 get_dynamic_data (Filedata * filedata, bfd_size_type number, unsigned int ent_size)
11234 {
11235   unsigned char * e_data;
11236   bfd_vma * i_data;
11237
11238   /* If the size_t type is smaller than the bfd_size_type, eg because
11239      you are building a 32-bit tool on a 64-bit host, then make sure
11240      that when (number) is cast to (size_t) no information is lost.  */
11241   if (sizeof (size_t) < sizeof (bfd_size_type)
11242       && (bfd_size_type) ((size_t) number) != number)
11243     {
11244       error (_("Size truncation prevents reading %s elements of size %u\n"),
11245              bfd_vmatoa ("u", number), ent_size);
11246       return NULL;
11247     }
11248
11249   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
11250      attempting to allocate memory when the read is bound to fail.  */
11251   if (ent_size * number > filedata->file_size)
11252     {
11253       error (_("Invalid number of dynamic entries: %s\n"),
11254              bfd_vmatoa ("u", number));
11255       return NULL;
11256     }
11257
11258   e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
11259   if (e_data == NULL)
11260     {
11261       error (_("Out of memory reading %s dynamic entries\n"),
11262              bfd_vmatoa ("u", number));
11263       return NULL;
11264     }
11265
11266   if (fread (e_data, ent_size, (size_t) number, filedata->handle) != number)
11267     {
11268       error (_("Unable to read in %s bytes of dynamic data\n"),
11269              bfd_vmatoa ("u", number * ent_size));
11270       free (e_data);
11271       return NULL;
11272     }
11273
11274   i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
11275   if (i_data == NULL)
11276     {
11277       error (_("Out of memory allocating space for %s dynamic entries\n"),
11278              bfd_vmatoa ("u", number));
11279       free (e_data);
11280       return NULL;
11281     }
11282
11283   while (number--)
11284     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
11285
11286   free (e_data);
11287
11288   return i_data;
11289 }
11290
11291 static void
11292 print_dynamic_symbol (Filedata * filedata, bfd_vma si, unsigned long hn)
11293 {
11294   Elf_Internal_Sym * psym;
11295   int n;
11296
11297   n = print_vma (si, DEC_5);
11298   if (n < 5)
11299     fputs (&"     "[n], stdout);
11300   printf (" %3lu: ", hn);
11301
11302   if (dynamic_symbols == NULL || si >= num_dynamic_syms)
11303     {
11304       printf (_("<No info available for dynamic symbol number %lu>\n"),
11305               (unsigned long) si);
11306       return;
11307     }
11308
11309   psym = dynamic_symbols + si;
11310   print_vma (psym->st_value, LONG_HEX);
11311   putchar (' ');
11312   print_vma (psym->st_size, DEC_5);
11313
11314   printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11315   printf (" %-6s",  get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11316
11317   if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11318     printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11319   else
11320     {
11321       unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11322
11323       printf (" %-7s",  get_symbol_visibility (vis));
11324       /* Check to see if any other bits in the st_other field are set.
11325          Note - displaying this information disrupts the layout of the
11326          table being generated, but for the moment this case is very
11327          rare.  */
11328       if (psym->st_other ^ vis)
11329         printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11330     }
11331
11332   printf (" %3.3s ", get_symbol_index_type (filedata, psym->st_shndx));
11333   if (VALID_DYNAMIC_NAME (psym->st_name))
11334     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11335   else
11336     printf (_(" <corrupt: %14ld>"), psym->st_name);
11337   putchar ('\n');
11338 }
11339
11340 static const char *
11341 get_symbol_version_string (Filedata *                   filedata,
11342                            bfd_boolean                  is_dynsym,
11343                            const char *                 strtab,
11344                            unsigned long int            strtab_size,
11345                            unsigned int                 si,
11346                            Elf_Internal_Sym *           psym,
11347                            enum versioned_symbol_info * sym_info,
11348                            unsigned short *             vna_other)
11349 {
11350   unsigned char data[2];
11351   unsigned short vers_data;
11352   unsigned long offset;
11353   unsigned short max_vd_ndx;
11354
11355   if (!is_dynsym
11356       || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
11357     return NULL;
11358
11359   offset = offset_from_vma (filedata, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
11360                             sizeof data + si * sizeof (vers_data));
11361
11362   if (get_data (&data, filedata, offset + si * sizeof (vers_data),
11363                 sizeof (data), 1, _("version data")) == NULL)
11364     return NULL;
11365
11366   vers_data = byte_get (data, 2);
11367
11368   if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data == 0)
11369     return NULL;
11370
11371   max_vd_ndx = 0;
11372
11373   /* Usually we'd only see verdef for defined symbols, and verneed for
11374      undefined symbols.  However, symbols defined by the linker in
11375      .dynbss for variables copied from a shared library in order to
11376      avoid text relocations are defined yet have verneed.  We could
11377      use a heuristic to detect the special case, for example, check
11378      for verneed first on symbols defined in SHT_NOBITS sections, but
11379      it is simpler and more reliable to just look for both verdef and
11380      verneed.  .dynbss might not be mapped to a SHT_NOBITS section.  */
11381
11382   if (psym->st_shndx != SHN_UNDEF
11383       && vers_data != 0x8001
11384       && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
11385     {
11386       Elf_Internal_Verdef ivd;
11387       Elf_Internal_Verdaux ivda;
11388       Elf_External_Verdaux evda;
11389       unsigned long off;
11390
11391       off = offset_from_vma (filedata,
11392                              version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
11393                              sizeof (Elf_External_Verdef));
11394
11395       do
11396         {
11397           Elf_External_Verdef evd;
11398
11399           if (get_data (&evd, filedata, off, sizeof (evd), 1,
11400                         _("version def")) == NULL)
11401             {
11402               ivd.vd_ndx = 0;
11403               ivd.vd_aux = 0;
11404               ivd.vd_next = 0;
11405               ivd.vd_flags = 0;
11406             }
11407           else
11408             {
11409               ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
11410               ivd.vd_aux = BYTE_GET (evd.vd_aux);
11411               ivd.vd_next = BYTE_GET (evd.vd_next);
11412               ivd.vd_flags = BYTE_GET (evd.vd_flags);
11413             }
11414
11415           if ((ivd.vd_ndx & VERSYM_VERSION) > max_vd_ndx)
11416             max_vd_ndx = ivd.vd_ndx & VERSYM_VERSION;
11417
11418           off += ivd.vd_next;
11419         }
11420       while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
11421
11422       if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
11423         {
11424           if (ivd.vd_ndx == 1 && ivd.vd_flags == VER_FLG_BASE) 
11425             return NULL;
11426
11427           off -= ivd.vd_next;
11428           off += ivd.vd_aux;
11429
11430           if (get_data (&evda, filedata, off, sizeof (evda), 1,
11431                         _("version def aux")) != NULL)
11432             {
11433               ivda.vda_name = BYTE_GET (evda.vda_name);
11434
11435               if (psym->st_name != ivda.vda_name)
11436                 {
11437                   *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
11438                                ? symbol_hidden : symbol_public);
11439                   return (ivda.vda_name < strtab_size
11440                           ? strtab + ivda.vda_name : _("<corrupt>"));
11441                 }
11442             }
11443         }
11444     }
11445
11446   if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
11447     {
11448       Elf_External_Verneed evn;
11449       Elf_Internal_Verneed ivn;
11450       Elf_Internal_Vernaux ivna;
11451
11452       offset = offset_from_vma (filedata,
11453                                 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
11454                                 sizeof evn);
11455       do
11456         {
11457           unsigned long vna_off;
11458
11459           if (get_data (&evn, filedata, offset, sizeof (evn), 1,
11460                         _("version need")) == NULL)
11461             {
11462               ivna.vna_next = 0;
11463               ivna.vna_other = 0;
11464               ivna.vna_name = 0;
11465               break;
11466             }
11467
11468           ivn.vn_aux  = BYTE_GET (evn.vn_aux);
11469           ivn.vn_next = BYTE_GET (evn.vn_next);
11470
11471           vna_off = offset + ivn.vn_aux;
11472
11473           do
11474             {
11475               Elf_External_Vernaux evna;
11476
11477               if (get_data (&evna, filedata, vna_off, sizeof (evna), 1,
11478                             _("version need aux (3)")) == NULL)
11479                 {
11480                   ivna.vna_next = 0;
11481                   ivna.vna_other = 0;
11482                   ivna.vna_name = 0;
11483                 }
11484               else
11485                 {
11486                   ivna.vna_other = BYTE_GET (evna.vna_other);
11487                   ivna.vna_next  = BYTE_GET (evna.vna_next);
11488                   ivna.vna_name  = BYTE_GET (evna.vna_name);
11489                 }
11490
11491               vna_off += ivna.vna_next;
11492             }
11493           while (ivna.vna_other != vers_data && ivna.vna_next != 0);
11494
11495           if (ivna.vna_other == vers_data)
11496             break;
11497
11498           offset += ivn.vn_next;
11499         }
11500       while (ivn.vn_next != 0);
11501
11502       if (ivna.vna_other == vers_data)
11503         {
11504           *sym_info = symbol_undefined;
11505           *vna_other = ivna.vna_other;
11506           return (ivna.vna_name < strtab_size
11507                   ? strtab + ivna.vna_name : _("<corrupt>"));
11508         }
11509       else if ((max_vd_ndx || (vers_data & VERSYM_VERSION) != 1)
11510                && (vers_data & VERSYM_VERSION) > max_vd_ndx)
11511         return _("<corrupt>");
11512     }
11513   return NULL;
11514 }
11515
11516 /* Dump the symbol table.  */
11517 static bfd_boolean
11518 process_symbol_table (Filedata * filedata)
11519 {
11520   Elf_Internal_Shdr * section;
11521   bfd_size_type nbuckets = 0;
11522   bfd_size_type nchains = 0;
11523   bfd_vma * buckets = NULL;
11524   bfd_vma * chains = NULL;
11525   bfd_vma ngnubuckets = 0;
11526   bfd_vma * gnubuckets = NULL;
11527   bfd_vma * gnuchains = NULL;
11528   bfd_vma gnusymidx = 0;
11529   bfd_size_type ngnuchains = 0;
11530
11531   if (!do_syms && !do_dyn_syms && !do_histogram)
11532     return TRUE;
11533
11534   if (dynamic_info[DT_HASH]
11535       && (do_histogram
11536           || (do_using_dynamic
11537               && !do_dyn_syms
11538               && dynamic_strings != NULL)))
11539     {
11540       unsigned char nb[8];
11541       unsigned char nc[8];
11542       unsigned int hash_ent_size = 4;
11543
11544       if ((filedata->file_header.e_machine == EM_ALPHA
11545            || filedata->file_header.e_machine == EM_S390
11546            || filedata->file_header.e_machine == EM_S390_OLD)
11547           && filedata->file_header.e_ident[EI_CLASS] == ELFCLASS64)
11548         hash_ent_size = 8;
11549
11550       if (fseek (filedata->handle,
11551                  (archive_file_offset
11552                   + offset_from_vma (filedata, dynamic_info[DT_HASH],
11553                                      sizeof nb + sizeof nc)),
11554                  SEEK_SET))
11555         {
11556           error (_("Unable to seek to start of dynamic information\n"));
11557           goto no_hash;
11558         }
11559
11560       if (fread (nb, hash_ent_size, 1, filedata->handle) != 1)
11561         {
11562           error (_("Failed to read in number of buckets\n"));
11563           goto no_hash;
11564         }
11565
11566       if (fread (nc, hash_ent_size, 1, filedata->handle) != 1)
11567         {
11568           error (_("Failed to read in number of chains\n"));
11569           goto no_hash;
11570         }
11571
11572       nbuckets = byte_get (nb, hash_ent_size);
11573       nchains  = byte_get (nc, hash_ent_size);
11574
11575       buckets = get_dynamic_data (filedata, nbuckets, hash_ent_size);
11576       chains  = get_dynamic_data (filedata, nchains, hash_ent_size);
11577
11578     no_hash:
11579       if (buckets == NULL || chains == NULL)
11580         {
11581           if (do_using_dynamic)
11582             return FALSE;
11583           free (buckets);
11584           free (chains);
11585           buckets = NULL;
11586           chains = NULL;
11587           nbuckets = 0;
11588           nchains = 0;
11589         }
11590     }
11591
11592   if (dynamic_info_DT_GNU_HASH
11593       && (do_histogram
11594           || (do_using_dynamic
11595               && !do_dyn_syms
11596               && dynamic_strings != NULL)))
11597     {
11598       unsigned char nb[16];
11599       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11600       bfd_vma buckets_vma;
11601
11602       if (fseek (filedata->handle,
11603                  (archive_file_offset
11604                   + offset_from_vma (filedata, dynamic_info_DT_GNU_HASH,
11605                                      sizeof nb)),
11606                  SEEK_SET))
11607         {
11608           error (_("Unable to seek to start of dynamic information\n"));
11609           goto no_gnu_hash;
11610         }
11611
11612       if (fread (nb, 16, 1, filedata->handle) != 1)
11613         {
11614           error (_("Failed to read in number of buckets\n"));
11615           goto no_gnu_hash;
11616         }
11617
11618       ngnubuckets = byte_get (nb, 4);
11619       gnusymidx = byte_get (nb + 4, 4);
11620       bitmaskwords = byte_get (nb + 8, 4);
11621       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
11622       if (is_32bit_elf)
11623         buckets_vma += bitmaskwords * 4;
11624       else
11625         buckets_vma += bitmaskwords * 8;
11626
11627       if (fseek (filedata->handle,
11628                  (archive_file_offset
11629                   + offset_from_vma (filedata, buckets_vma, 4)),
11630                  SEEK_SET))
11631         {
11632           error (_("Unable to seek to start of dynamic information\n"));
11633           goto no_gnu_hash;
11634         }
11635
11636       gnubuckets = get_dynamic_data (filedata, ngnubuckets, 4);
11637
11638       if (gnubuckets == NULL)
11639         goto no_gnu_hash;
11640
11641       for (i = 0; i < ngnubuckets; i++)
11642         if (gnubuckets[i] != 0)
11643           {
11644             if (gnubuckets[i] < gnusymidx)
11645               return FALSE;
11646
11647             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11648               maxchain = gnubuckets[i];
11649           }
11650
11651       if (maxchain == 0xffffffff)
11652         goto no_gnu_hash;
11653
11654       maxchain -= gnusymidx;
11655
11656       if (fseek (filedata->handle,
11657                  (archive_file_offset
11658                   + offset_from_vma (filedata, buckets_vma
11659                                            + 4 * (ngnubuckets + maxchain), 4)),
11660                  SEEK_SET))
11661         {
11662           error (_("Unable to seek to start of dynamic information\n"));
11663           goto no_gnu_hash;
11664         }
11665
11666       do
11667         {
11668           if (fread (nb, 4, 1, filedata->handle) != 1)
11669             {
11670               error (_("Failed to determine last chain length\n"));
11671               goto no_gnu_hash;
11672             }
11673
11674           if (maxchain + 1 == 0)
11675             goto no_gnu_hash;
11676
11677           ++maxchain;
11678         }
11679       while ((byte_get (nb, 4) & 1) == 0);
11680
11681       if (fseek (filedata->handle,
11682                  (archive_file_offset
11683                   + offset_from_vma (filedata, buckets_vma + 4 * ngnubuckets, 4)),
11684                  SEEK_SET))
11685         {
11686           error (_("Unable to seek to start of dynamic information\n"));
11687           goto no_gnu_hash;
11688         }
11689
11690       gnuchains = get_dynamic_data (filedata, maxchain, 4);
11691       ngnuchains = maxchain;
11692
11693     no_gnu_hash:
11694       if (gnuchains == NULL)
11695         {
11696           free (gnubuckets);
11697           gnubuckets = NULL;
11698           ngnubuckets = 0;
11699           if (do_using_dynamic)
11700             return FALSE;
11701         }
11702     }
11703
11704   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11705       && do_syms
11706       && do_using_dynamic
11707       && dynamic_strings != NULL
11708       && dynamic_symbols != NULL)
11709     {
11710       unsigned long hn;
11711
11712       if (dynamic_info[DT_HASH])
11713         {
11714           bfd_vma si;
11715           char *visited;
11716
11717           printf (_("\nSymbol table for image:\n"));
11718           if (is_32bit_elf)
11719             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11720           else
11721             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11722
11723           visited = xcmalloc (nchains, 1);
11724           memset (visited, 0, nchains);
11725           for (hn = 0; hn < nbuckets; hn++)
11726             {
11727               for (si = buckets[hn]; si > 0; si = chains[si])
11728                 {
11729                   print_dynamic_symbol (filedata, si, hn);
11730                   if (si >= nchains || visited[si])
11731                     {
11732                       error (_("histogram chain is corrupt\n"));
11733                       break;
11734                     }
11735                   visited[si] = 1;
11736                 }
11737             }
11738           free (visited);
11739         }
11740
11741       if (dynamic_info_DT_GNU_HASH)
11742         {
11743           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11744           if (is_32bit_elf)
11745             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11746           else
11747             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11748
11749           for (hn = 0; hn < ngnubuckets; ++hn)
11750             if (gnubuckets[hn] != 0)
11751               {
11752                 bfd_vma si = gnubuckets[hn];
11753                 bfd_vma off = si - gnusymidx;
11754
11755                 do
11756                   {
11757                     print_dynamic_symbol (filedata, si, hn);
11758                     si++;
11759                   }
11760                 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11761               }
11762         }
11763     }
11764   else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11765            && filedata->section_headers != NULL)
11766     {
11767       unsigned int i;
11768
11769       for (i = 0, section = filedata->section_headers;
11770            i < filedata->file_header.e_shnum;
11771            i++, section++)
11772         {
11773           unsigned int si;
11774           char * strtab = NULL;
11775           unsigned long int strtab_size = 0;
11776           Elf_Internal_Sym * symtab;
11777           Elf_Internal_Sym * psym;
11778           unsigned long num_syms;
11779
11780           if ((section->sh_type != SHT_SYMTAB
11781                && section->sh_type != SHT_DYNSYM)
11782               || (!do_syms
11783                   && section->sh_type == SHT_SYMTAB))
11784             continue;
11785
11786           if (section->sh_entsize == 0)
11787             {
11788               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11789                       printable_section_name (filedata, section));
11790               continue;
11791             }
11792
11793           num_syms = section->sh_size / section->sh_entsize;
11794           printf (ngettext ("\nSymbol table '%s' contains %lu entry:\n",
11795                             "\nSymbol table '%s' contains %lu entries:\n",
11796                             num_syms),
11797                   printable_section_name (filedata, section),
11798                   num_syms);
11799
11800           if (is_32bit_elf)
11801             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
11802           else
11803             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
11804
11805           symtab = GET_ELF_SYMBOLS (filedata, section, & num_syms);
11806           if (symtab == NULL)
11807             continue;
11808
11809           if (section->sh_link == filedata->file_header.e_shstrndx)
11810             {
11811               strtab = filedata->string_table;
11812               strtab_size = filedata->string_table_length;
11813             }
11814           else if (section->sh_link < filedata->file_header.e_shnum)
11815             {
11816               Elf_Internal_Shdr * string_sec;
11817
11818               string_sec = filedata->section_headers + section->sh_link;
11819
11820               strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset,
11821                                           1, string_sec->sh_size,
11822                                           _("string table"));
11823               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11824             }
11825
11826           for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11827             {
11828               const char *version_string;
11829               enum versioned_symbol_info sym_info;
11830               unsigned short vna_other;
11831
11832               printf ("%6d: ", si);
11833               print_vma (psym->st_value, LONG_HEX);
11834               putchar (' ');
11835               print_vma (psym->st_size, DEC_5);
11836               printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11837               printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11838               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11839                 printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11840               else
11841                 {
11842                   unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11843
11844                   printf (" %-7s", get_symbol_visibility (vis));
11845                   /* Check to see if any other bits in the st_other field are set.
11846                      Note - displaying this information disrupts the layout of the
11847                      table being generated, but for the moment this case is very rare.  */
11848                   if (psym->st_other ^ vis)
11849                     printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11850                 }
11851               printf (" %4s ", get_symbol_index_type (filedata, psym->st_shndx));
11852               print_symbol (25, psym->st_name < strtab_size
11853                             ? strtab + psym->st_name : _("<corrupt>"));
11854
11855               version_string
11856                 = get_symbol_version_string (filedata,
11857                                              section->sh_type == SHT_DYNSYM,
11858                                              strtab, strtab_size, si,
11859                                              psym, &sym_info, &vna_other);
11860               if (version_string)
11861                 {
11862                   if (sym_info == symbol_undefined)
11863                     printf ("@%s (%d)", version_string, vna_other);
11864                   else
11865                     printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11866                             version_string);
11867                 }
11868
11869               putchar ('\n');
11870
11871               if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
11872                   && si >= section->sh_info
11873                   /* Irix 5 and 6 MIPS binaries are known to ignore this requirement.  */
11874                   && filedata->file_header.e_machine != EM_MIPS
11875                   /* Solaris binaries have been found to violate this requirement as
11876                      well.  Not sure if this is a bug or an ABI requirement.  */
11877                   && filedata->file_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
11878                 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11879                       si, printable_section_name (filedata, section), section->sh_info);
11880             }
11881
11882           free (symtab);
11883           if (strtab != filedata->string_table)
11884             free (strtab);
11885         }
11886     }
11887   else if (do_syms)
11888     printf
11889       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11890
11891   if (do_histogram && buckets != NULL)
11892     {
11893       unsigned long * lengths;
11894       unsigned long * counts;
11895       unsigned long hn;
11896       bfd_vma si;
11897       unsigned long maxlength = 0;
11898       unsigned long nzero_counts = 0;
11899       unsigned long nsyms = 0;
11900       char *visited;
11901
11902       printf (ngettext ("\nHistogram for bucket list length "
11903                         "(total of %lu bucket):\n",
11904                         "\nHistogram for bucket list length "
11905                         "(total of %lu buckets):\n",
11906                         (unsigned long) nbuckets),
11907               (unsigned long) nbuckets);
11908
11909       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11910       if (lengths == NULL)
11911         {
11912           error (_("Out of memory allocating space for histogram buckets\n"));
11913           return FALSE;
11914         }
11915       visited = xcmalloc (nchains, 1);
11916       memset (visited, 0, nchains);
11917
11918       printf (_(" Length  Number     %% of total  Coverage\n"));
11919       for (hn = 0; hn < nbuckets; ++hn)
11920         {
11921           for (si = buckets[hn]; si > 0; si = chains[si])
11922             {
11923               ++nsyms;
11924               if (maxlength < ++lengths[hn])
11925                 ++maxlength;
11926               if (si >= nchains || visited[si])
11927                 {
11928                   error (_("histogram chain is corrupt\n"));
11929                   break;
11930                 }
11931               visited[si] = 1;
11932             }
11933         }
11934       free (visited);
11935
11936       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11937       if (counts == NULL)
11938         {
11939           free (lengths);
11940           error (_("Out of memory allocating space for histogram counts\n"));
11941           return FALSE;
11942         }
11943
11944       for (hn = 0; hn < nbuckets; ++hn)
11945         ++counts[lengths[hn]];
11946
11947       if (nbuckets > 0)
11948         {
11949           unsigned long i;
11950           printf ("      0  %-10lu (%5.1f%%)\n",
11951                   counts[0], (counts[0] * 100.0) / nbuckets);
11952           for (i = 1; i <= maxlength; ++i)
11953             {
11954               nzero_counts += counts[i] * i;
11955               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
11956                       i, counts[i], (counts[i] * 100.0) / nbuckets,
11957                       (nzero_counts * 100.0) / nsyms);
11958             }
11959         }
11960
11961       free (counts);
11962       free (lengths);
11963     }
11964
11965   if (buckets != NULL)
11966     {
11967       free (buckets);
11968       free (chains);
11969     }
11970
11971   if (do_histogram && gnubuckets != NULL)
11972     {
11973       unsigned long * lengths;
11974       unsigned long * counts;
11975       unsigned long hn;
11976       unsigned long maxlength = 0;
11977       unsigned long nzero_counts = 0;
11978       unsigned long nsyms = 0;
11979
11980       printf (ngettext ("\nHistogram for `.gnu.hash' bucket list length "
11981                         "(total of %lu bucket):\n",
11982                         "\nHistogram for `.gnu.hash' bucket list length "
11983                         "(total of %lu buckets):\n",
11984                         (unsigned long) ngnubuckets),
11985               (unsigned long) ngnubuckets);
11986
11987       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
11988       if (lengths == NULL)
11989         {
11990           error (_("Out of memory allocating space for gnu histogram buckets\n"));
11991           return FALSE;
11992         }
11993
11994       printf (_(" Length  Number     %% of total  Coverage\n"));
11995
11996       for (hn = 0; hn < ngnubuckets; ++hn)
11997         if (gnubuckets[hn] != 0)
11998           {
11999             bfd_vma off, length = 1;
12000
12001             for (off = gnubuckets[hn] - gnusymidx;
12002                  /* PR 17531 file: 010-77222-0.004.  */
12003                  off < ngnuchains && (gnuchains[off] & 1) == 0;
12004                  ++off)
12005               ++length;
12006             lengths[hn] = length;
12007             if (length > maxlength)
12008               maxlength = length;
12009             nsyms += length;
12010           }
12011
12012       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
12013       if (counts == NULL)
12014         {
12015           free (lengths);
12016           error (_("Out of memory allocating space for gnu histogram counts\n"));
12017           return FALSE;
12018         }
12019
12020       for (hn = 0; hn < ngnubuckets; ++hn)
12021         ++counts[lengths[hn]];
12022
12023       if (ngnubuckets > 0)
12024         {
12025           unsigned long j;
12026           printf ("      0  %-10lu (%5.1f%%)\n",
12027                   counts[0], (counts[0] * 100.0) / ngnubuckets);
12028           for (j = 1; j <= maxlength; ++j)
12029             {
12030               nzero_counts += counts[j] * j;
12031               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
12032                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
12033                       (nzero_counts * 100.0) / nsyms);
12034             }
12035         }
12036
12037       free (counts);
12038       free (lengths);
12039       free (gnubuckets);
12040       free (gnuchains);
12041     }
12042
12043   return TRUE;
12044 }
12045
12046 static bfd_boolean
12047 process_syminfo (Filedata * filedata ATTRIBUTE_UNUSED)
12048 {
12049   unsigned int i;
12050
12051   if (dynamic_syminfo == NULL
12052       || !do_dynamic)
12053     /* No syminfo, this is ok.  */
12054     return TRUE;
12055
12056   /* There better should be a dynamic symbol section.  */
12057   if (dynamic_symbols == NULL || dynamic_strings == NULL)
12058     return FALSE;
12059
12060   if (dynamic_addr)
12061     printf (ngettext ("\nDynamic info segment at offset 0x%lx "
12062                       "contains %d entry:\n",
12063                       "\nDynamic info segment at offset 0x%lx "
12064                       "contains %d entries:\n",
12065                       dynamic_syminfo_nent),
12066             dynamic_syminfo_offset, dynamic_syminfo_nent);
12067
12068   printf (_(" Num: Name                           BoundTo     Flags\n"));
12069   for (i = 0; i < dynamic_syminfo_nent; ++i)
12070     {
12071       unsigned short int flags = dynamic_syminfo[i].si_flags;
12072
12073       printf ("%4d: ", i);
12074       if (i >= num_dynamic_syms)
12075         printf (_("<corrupt index>"));
12076       else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
12077         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
12078       else
12079         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
12080       putchar (' ');
12081
12082       switch (dynamic_syminfo[i].si_boundto)
12083         {
12084         case SYMINFO_BT_SELF:
12085           fputs ("SELF       ", stdout);
12086           break;
12087         case SYMINFO_BT_PARENT:
12088           fputs ("PARENT     ", stdout);
12089           break;
12090         default:
12091           if (dynamic_syminfo[i].si_boundto > 0
12092               && dynamic_syminfo[i].si_boundto < dynamic_nent
12093               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
12094             {
12095               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
12096               putchar (' ' );
12097             }
12098           else
12099             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
12100           break;
12101         }
12102
12103       if (flags & SYMINFO_FLG_DIRECT)
12104         printf (" DIRECT");
12105       if (flags & SYMINFO_FLG_PASSTHRU)
12106         printf (" PASSTHRU");
12107       if (flags & SYMINFO_FLG_COPY)
12108         printf (" COPY");
12109       if (flags & SYMINFO_FLG_LAZYLOAD)
12110         printf (" LAZYLOAD");
12111
12112       puts ("");
12113     }
12114
12115   return TRUE;
12116 }
12117
12118 #define IN_RANGE(START,END,ADDR,OFF)            \
12119   (((ADDR) >= (START)) && ((ADDR) + (OFF) < (END)))
12120
12121 /* Check to see if the given reloc needs to be handled in a target specific
12122    manner.  If so then process the reloc and return TRUE otherwise return
12123    FALSE.
12124
12125    If called with reloc == NULL, then this is a signal that reloc processing
12126    for the current section has finished, and any saved state should be
12127    discarded.  */
12128
12129 static bfd_boolean
12130 target_specific_reloc_handling (Filedata *           filedata,
12131                                 Elf_Internal_Rela *  reloc,
12132                                 unsigned char *      start,
12133                                 unsigned char *      end,
12134                                 Elf_Internal_Sym *   symtab,
12135                                 unsigned long        num_syms)
12136 {
12137   unsigned int reloc_type = 0;
12138   unsigned long sym_index = 0;
12139
12140   if (reloc)
12141     {
12142       reloc_type = get_reloc_type (filedata, reloc->r_info);
12143       sym_index = get_reloc_symindex (reloc->r_info);
12144     }
12145
12146   switch (filedata->file_header.e_machine)
12147     {
12148     case EM_MSP430:
12149     case EM_MSP430_OLD:
12150       {
12151         static Elf_Internal_Sym * saved_sym = NULL;
12152
12153         if (reloc == NULL)
12154           {
12155             saved_sym = NULL;
12156             return TRUE;
12157           }
12158
12159         switch (reloc_type)
12160           {
12161           case 10: /* R_MSP430_SYM_DIFF */
12162             if (uses_msp430x_relocs (filedata))
12163               break;
12164             /* Fall through.  */
12165           case 21: /* R_MSP430X_SYM_DIFF */
12166             /* PR 21139.  */
12167             if (sym_index >= num_syms)
12168               error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
12169                      sym_index);
12170             else
12171               saved_sym = symtab + sym_index;
12172             return TRUE;
12173
12174           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
12175           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
12176             goto handle_sym_diff;
12177
12178           case 5: /* R_MSP430_16_BYTE */
12179           case 9: /* R_MSP430_8 */
12180             if (uses_msp430x_relocs (filedata))
12181               break;
12182             goto handle_sym_diff;
12183
12184           case 2: /* R_MSP430_ABS16 */
12185           case 15: /* R_MSP430X_ABS16 */
12186             if (! uses_msp430x_relocs (filedata))
12187               break;
12188             goto handle_sym_diff;
12189
12190           handle_sym_diff:
12191             if (saved_sym != NULL)
12192               {
12193                 int reloc_size = reloc_type == 1 ? 4 : 2;
12194                 bfd_vma value;
12195
12196                 if (sym_index >= num_syms)
12197                   error (_("MSP430 reloc contains invalid symbol index %lu\n"),
12198                          sym_index);
12199                 else
12200                   {
12201                     value = reloc->r_addend + (symtab[sym_index].st_value
12202                                                - saved_sym->st_value);
12203
12204                     if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12205                       byte_put (start + reloc->r_offset, value, reloc_size);
12206                     else
12207                       /* PR 21137 */
12208                       error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
12209                              (long) reloc->r_offset);
12210                   }
12211
12212                 saved_sym = NULL;
12213                 return TRUE;
12214               }
12215             break;
12216
12217           default:
12218             if (saved_sym != NULL)
12219               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
12220             break;
12221           }
12222         break;
12223       }
12224
12225     case EM_MN10300:
12226     case EM_CYGNUS_MN10300:
12227       {
12228         static Elf_Internal_Sym * saved_sym = NULL;
12229
12230         if (reloc == NULL)
12231           {
12232             saved_sym = NULL;
12233             return TRUE;
12234           }
12235
12236         switch (reloc_type)
12237           {
12238           case 34: /* R_MN10300_ALIGN */
12239             return TRUE;
12240           case 33: /* R_MN10300_SYM_DIFF */
12241             if (sym_index >= num_syms)
12242               error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
12243                      sym_index);
12244             else
12245               saved_sym = symtab + sym_index;
12246             return TRUE;
12247
12248           case 1: /* R_MN10300_32 */
12249           case 2: /* R_MN10300_16 */
12250             if (saved_sym != NULL)
12251               {
12252                 int reloc_size = reloc_type == 1 ? 4 : 2;
12253                 bfd_vma value;
12254
12255                 if (sym_index >= num_syms)
12256                   error (_("MN10300 reloc contains invalid symbol index %lu\n"),
12257                          sym_index);
12258                 else
12259                   {
12260                     value = reloc->r_addend + (symtab[sym_index].st_value
12261                                                - saved_sym->st_value);
12262
12263                     if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12264                       byte_put (start + reloc->r_offset, value, reloc_size);
12265                     else
12266                       error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
12267                              (long) reloc->r_offset);
12268                   }
12269
12270                 saved_sym = NULL;
12271                 return TRUE;
12272               }
12273             break;
12274           default:
12275             if (saved_sym != NULL)
12276               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
12277             break;
12278           }
12279         break;
12280       }
12281
12282     case EM_RL78:
12283       {
12284         static bfd_vma saved_sym1 = 0;
12285         static bfd_vma saved_sym2 = 0;
12286         static bfd_vma value;
12287
12288         if (reloc == NULL)
12289           {
12290             saved_sym1 = saved_sym2 = 0;
12291             return TRUE;
12292           }
12293
12294         switch (reloc_type)
12295           {
12296           case 0x80: /* R_RL78_SYM.  */
12297             saved_sym1 = saved_sym2;
12298             if (sym_index >= num_syms)
12299               error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
12300                      sym_index);
12301             else
12302               {
12303                 saved_sym2 = symtab[sym_index].st_value;
12304                 saved_sym2 += reloc->r_addend;
12305               }
12306             return TRUE;
12307
12308           case 0x83: /* R_RL78_OPsub.  */
12309             value = saved_sym1 - saved_sym2;
12310             saved_sym2 = saved_sym1 = 0;
12311             return TRUE;
12312             break;
12313
12314           case 0x41: /* R_RL78_ABS32.  */
12315             if (IN_RANGE (start, end, start + reloc->r_offset, 4))
12316               byte_put (start + reloc->r_offset, value, 4);
12317             else
12318               error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12319                      (long) reloc->r_offset);
12320             value = 0;
12321             return TRUE;
12322
12323           case 0x43: /* R_RL78_ABS16.  */
12324             if (IN_RANGE (start, end, start + reloc->r_offset, 2))
12325               byte_put (start + reloc->r_offset, value, 2);
12326             else
12327               error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12328                      (long) reloc->r_offset);
12329             value = 0;
12330             return TRUE;
12331
12332           default:
12333             break;
12334           }
12335         break;
12336       }
12337     }
12338
12339   return FALSE;
12340 }
12341
12342 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
12343    DWARF debug sections.  This is a target specific test.  Note - we do not
12344    go through the whole including-target-headers-multiple-times route, (as
12345    we have already done with <elf/h8.h>) because this would become very
12346    messy and even then this function would have to contain target specific
12347    information (the names of the relocs instead of their numeric values).
12348    FIXME: This is not the correct way to solve this problem.  The proper way
12349    is to have target specific reloc sizing and typing functions created by
12350    the reloc-macros.h header, in the same way that it already creates the
12351    reloc naming functions.  */
12352
12353 static bfd_boolean
12354 is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12355 {
12356   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12357   switch (filedata->file_header.e_machine)
12358     {
12359     case EM_386:
12360     case EM_IAMCU:
12361       return reloc_type == 1; /* R_386_32.  */
12362     case EM_68K:
12363       return reloc_type == 1; /* R_68K_32.  */
12364     case EM_860:
12365       return reloc_type == 1; /* R_860_32.  */
12366     case EM_960:
12367       return reloc_type == 2; /* R_960_32.  */
12368     case EM_AARCH64:
12369       return (reloc_type == 258
12370               || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
12371     case EM_ADAPTEVA_EPIPHANY:
12372       return reloc_type == 3;
12373     case EM_ALPHA:
12374       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
12375     case EM_ARC:
12376       return reloc_type == 1; /* R_ARC_32.  */
12377     case EM_ARC_COMPACT:
12378     case EM_ARC_COMPACT2:
12379       return reloc_type == 4; /* R_ARC_32.  */
12380     case EM_ARM:
12381       return reloc_type == 2; /* R_ARM_ABS32 */
12382     case EM_AVR_OLD:
12383     case EM_AVR:
12384       return reloc_type == 1;
12385     case EM_BLACKFIN:
12386       return reloc_type == 0x12; /* R_byte4_data.  */
12387     case EM_CRIS:
12388       return reloc_type == 3; /* R_CRIS_32.  */
12389     case EM_CR16:
12390       return reloc_type == 3; /* R_CR16_NUM32.  */
12391     case EM_CRX:
12392       return reloc_type == 15; /* R_CRX_NUM32.  */
12393     case EM_CSKY:
12394       return reloc_type == 1; /* R_CKCORE_ADDR32.  */
12395     case EM_CYGNUS_FRV:
12396       return reloc_type == 1;
12397     case EM_CYGNUS_D10V:
12398     case EM_D10V:
12399       return reloc_type == 6; /* R_D10V_32.  */
12400     case EM_CYGNUS_D30V:
12401     case EM_D30V:
12402       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
12403     case EM_DLX:
12404       return reloc_type == 3; /* R_DLX_RELOC_32.  */
12405     case EM_CYGNUS_FR30:
12406     case EM_FR30:
12407       return reloc_type == 3; /* R_FR30_32.  */
12408     case EM_FT32:
12409       return reloc_type == 1; /* R_FT32_32.  */
12410     case EM_H8S:
12411     case EM_H8_300:
12412     case EM_H8_300H:
12413       return reloc_type == 1; /* R_H8_DIR32.  */
12414     case EM_IA_64:
12415       return (reloc_type == 0x64    /* R_IA64_SECREL32MSB.  */
12416               || reloc_type == 0x65 /* R_IA64_SECREL32LSB.  */
12417               || reloc_type == 0x24 /* R_IA64_DIR32MSB.  */
12418               || reloc_type == 0x25 /* R_IA64_DIR32LSB.  */);
12419     case EM_IP2K_OLD:
12420     case EM_IP2K:
12421       return reloc_type == 2; /* R_IP2K_32.  */
12422     case EM_IQ2000:
12423       return reloc_type == 2; /* R_IQ2000_32.  */
12424     case EM_LATTICEMICO32:
12425       return reloc_type == 3; /* R_LM32_32.  */
12426     case EM_M32C_OLD:
12427     case EM_M32C:
12428       return reloc_type == 3; /* R_M32C_32.  */
12429     case EM_M32R:
12430       return reloc_type == 34; /* R_M32R_32_RELA.  */
12431     case EM_68HC11:
12432     case EM_68HC12:
12433       return reloc_type == 6; /* R_M68HC11_32.  */
12434     case EM_S12Z:
12435       return reloc_type == 7 || /* R_S12Z_EXT32 */
12436         reloc_type == 6;        /* R_S12Z_CW32.  */
12437     case EM_MCORE:
12438       return reloc_type == 1; /* R_MCORE_ADDR32.  */
12439     case EM_CYGNUS_MEP:
12440       return reloc_type == 4; /* R_MEP_32.  */
12441     case EM_METAG:
12442       return reloc_type == 2; /* R_METAG_ADDR32.  */
12443     case EM_MICROBLAZE:
12444       return reloc_type == 1; /* R_MICROBLAZE_32.  */
12445     case EM_MIPS:
12446       return reloc_type == 2; /* R_MIPS_32.  */
12447     case EM_MMIX:
12448       return reloc_type == 4; /* R_MMIX_32.  */
12449     case EM_CYGNUS_MN10200:
12450     case EM_MN10200:
12451       return reloc_type == 1; /* R_MN10200_32.  */
12452     case EM_CYGNUS_MN10300:
12453     case EM_MN10300:
12454       return reloc_type == 1; /* R_MN10300_32.  */
12455     case EM_MOXIE:
12456       return reloc_type == 1; /* R_MOXIE_32.  */
12457     case EM_MSP430_OLD:
12458     case EM_MSP430:
12459       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
12460     case EM_MT:
12461       return reloc_type == 2; /* R_MT_32.  */
12462     case EM_NDS32:
12463       return reloc_type == 20; /* R_NDS32_RELA.  */
12464     case EM_ALTERA_NIOS2:
12465       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
12466     case EM_NIOS32:
12467       return reloc_type == 1; /* R_NIOS_32.  */
12468     case EM_OR1K:
12469       return reloc_type == 1; /* R_OR1K_32.  */
12470     case EM_PARISC:
12471       return (reloc_type == 1 /* R_PARISC_DIR32.  */          
12472               || reloc_type == 2 /* R_PARISC_DIR21L.  */
12473               || reloc_type == 41); /* R_PARISC_SECREL32.  */
12474     case EM_PJ:
12475     case EM_PJ_OLD:
12476       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
12477     case EM_PPC64:
12478       return reloc_type == 1; /* R_PPC64_ADDR32.  */
12479     case EM_PPC:
12480       return reloc_type == 1; /* R_PPC_ADDR32.  */
12481     case EM_TI_PRU:
12482       return reloc_type == 11; /* R_PRU_BFD_RELOC_32.  */
12483     case EM_RISCV:
12484       return reloc_type == 1; /* R_RISCV_32.  */
12485     case EM_RL78:
12486       return reloc_type == 1; /* R_RL78_DIR32.  */
12487     case EM_RX:
12488       return reloc_type == 1; /* R_RX_DIR32.  */
12489     case EM_S370:
12490       return reloc_type == 1; /* R_I370_ADDR31.  */
12491     case EM_S390_OLD:
12492     case EM_S390:
12493       return reloc_type == 4; /* R_S390_32.  */
12494     case EM_SCORE:
12495       return reloc_type == 8; /* R_SCORE_ABS32.  */
12496     case EM_SH:
12497       return reloc_type == 1; /* R_SH_DIR32.  */
12498     case EM_SPARC32PLUS:
12499     case EM_SPARCV9:
12500     case EM_SPARC:
12501       return reloc_type == 3 /* R_SPARC_32.  */
12502         || reloc_type == 23; /* R_SPARC_UA32.  */
12503     case EM_SPU:
12504       return reloc_type == 6; /* R_SPU_ADDR32 */
12505     case EM_TI_C6000:
12506       return reloc_type == 1; /* R_C6000_ABS32.  */
12507     case EM_TILEGX:
12508       return reloc_type == 2; /* R_TILEGX_32.  */
12509     case EM_TILEPRO:
12510       return reloc_type == 1; /* R_TILEPRO_32.  */
12511     case EM_CYGNUS_V850:
12512     case EM_V850:
12513       return reloc_type == 6; /* R_V850_ABS32.  */
12514     case EM_V800:
12515       return reloc_type == 0x33; /* R_V810_WORD.  */
12516     case EM_VAX:
12517       return reloc_type == 1; /* R_VAX_32.  */
12518     case EM_VISIUM:
12519       return reloc_type == 3;  /* R_VISIUM_32. */
12520     case EM_WEBASSEMBLY:
12521       return reloc_type == 1;  /* R_WASM32_32.  */
12522     case EM_X86_64:
12523     case EM_L1OM:
12524     case EM_K1OM:
12525       return reloc_type == 10; /* R_X86_64_32.  */
12526     case EM_XC16X:
12527     case EM_C166:
12528       return reloc_type == 3; /* R_XC16C_ABS_32.  */
12529     case EM_XGATE:
12530       return reloc_type == 4; /* R_XGATE_32.  */
12531     case EM_XSTORMY16:
12532       return reloc_type == 1; /* R_XSTROMY16_32.  */
12533     case EM_XTENSA_OLD:
12534     case EM_XTENSA:
12535       return reloc_type == 1; /* R_XTENSA_32.  */
12536     default:
12537       {
12538         static unsigned int prev_warn = 0;
12539
12540         /* Avoid repeating the same warning multiple times.  */
12541         if (prev_warn != filedata->file_header.e_machine)
12542           error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
12543                  filedata->file_header.e_machine);
12544         prev_warn = filedata->file_header.e_machine;
12545         return FALSE;
12546       }
12547     }
12548 }
12549
12550 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12551    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
12552
12553 static bfd_boolean
12554 is_32bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12555 {
12556   switch (filedata->file_header.e_machine)
12557   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12558     {
12559     case EM_386:
12560     case EM_IAMCU:
12561       return reloc_type == 2;  /* R_386_PC32.  */
12562     case EM_68K:
12563       return reloc_type == 4;  /* R_68K_PC32.  */
12564     case EM_AARCH64:
12565       return reloc_type == 261; /* R_AARCH64_PREL32 */
12566     case EM_ADAPTEVA_EPIPHANY:
12567       return reloc_type == 6;
12568     case EM_ALPHA:
12569       return reloc_type == 10; /* R_ALPHA_SREL32.  */
12570     case EM_ARC_COMPACT:
12571     case EM_ARC_COMPACT2:
12572       return reloc_type == 49; /* R_ARC_32_PCREL.  */
12573     case EM_ARM:
12574       return reloc_type == 3;  /* R_ARM_REL32 */
12575     case EM_AVR_OLD:
12576     case EM_AVR:
12577       return reloc_type == 36; /* R_AVR_32_PCREL.  */
12578     case EM_MICROBLAZE:
12579       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
12580     case EM_OR1K:
12581       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
12582     case EM_PARISC:
12583       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
12584     case EM_PPC:
12585       return reloc_type == 26; /* R_PPC_REL32.  */
12586     case EM_PPC64:
12587       return reloc_type == 26; /* R_PPC64_REL32.  */
12588     case EM_RISCV:
12589       return reloc_type == 57;  /* R_RISCV_32_PCREL.  */
12590     case EM_S390_OLD:
12591     case EM_S390:
12592       return reloc_type == 5;  /* R_390_PC32.  */
12593     case EM_SH:
12594       return reloc_type == 2;  /* R_SH_REL32.  */
12595     case EM_SPARC32PLUS:
12596     case EM_SPARCV9:
12597     case EM_SPARC:
12598       return reloc_type == 6;  /* R_SPARC_DISP32.  */
12599     case EM_SPU:
12600       return reloc_type == 13; /* R_SPU_REL32.  */
12601     case EM_TILEGX:
12602       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
12603     case EM_TILEPRO:
12604       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
12605     case EM_VISIUM:
12606       return reloc_type == 6;  /* R_VISIUM_32_PCREL */
12607     case EM_X86_64:
12608     case EM_L1OM:
12609     case EM_K1OM:
12610       return reloc_type == 2;  /* R_X86_64_PC32.  */
12611     case EM_XTENSA_OLD:
12612     case EM_XTENSA:
12613       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
12614     default:
12615       /* Do not abort or issue an error message here.  Not all targets use
12616          pc-relative 32-bit relocs in their DWARF debug information and we
12617          have already tested for target coverage in is_32bit_abs_reloc.  A
12618          more helpful warning message will be generated by apply_relocations
12619          anyway, so just return.  */
12620       return FALSE;
12621     }
12622 }
12623
12624 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12625    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
12626
12627 static bfd_boolean
12628 is_64bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12629 {
12630   switch (filedata->file_header.e_machine)
12631     {
12632     case EM_AARCH64:
12633       return reloc_type == 257; /* R_AARCH64_ABS64.  */
12634     case EM_ALPHA:
12635       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
12636     case EM_IA_64:
12637       return (reloc_type == 0x26    /* R_IA64_DIR64MSB.  */
12638               || reloc_type == 0x27 /* R_IA64_DIR64LSB.  */);
12639     case EM_PARISC:
12640       return reloc_type == 80; /* R_PARISC_DIR64.  */
12641     case EM_PPC64:
12642       return reloc_type == 38; /* R_PPC64_ADDR64.  */
12643     case EM_RISCV:
12644       return reloc_type == 2; /* R_RISCV_64.  */
12645     case EM_SPARC32PLUS:
12646     case EM_SPARCV9:
12647     case EM_SPARC:
12648       return reloc_type == 32 /* R_SPARC_64.  */
12649         || reloc_type == 54; /* R_SPARC_UA64.  */
12650     case EM_X86_64:
12651     case EM_L1OM:
12652     case EM_K1OM:
12653       return reloc_type == 1; /* R_X86_64_64.  */
12654     case EM_S390_OLD:
12655     case EM_S390:
12656       return reloc_type == 22;  /* R_S390_64.  */
12657     case EM_TILEGX:
12658       return reloc_type == 1; /* R_TILEGX_64.  */
12659     case EM_MIPS:
12660       return reloc_type == 18;  /* R_MIPS_64.  */
12661     default:
12662       return FALSE;
12663     }
12664 }
12665
12666 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12667    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
12668
12669 static bfd_boolean
12670 is_64bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12671 {
12672   switch (filedata->file_header.e_machine)
12673     {
12674     case EM_AARCH64:
12675       return reloc_type == 260; /* R_AARCH64_PREL64.  */
12676     case EM_ALPHA:
12677       return reloc_type == 11; /* R_ALPHA_SREL64.  */
12678     case EM_IA_64:
12679       return (reloc_type == 0x4e    /* R_IA64_PCREL64MSB.  */
12680               || reloc_type == 0x4f /* R_IA64_PCREL64LSB.  */);
12681     case EM_PARISC:
12682       return reloc_type == 72; /* R_PARISC_PCREL64.  */
12683     case EM_PPC64:
12684       return reloc_type == 44; /* R_PPC64_REL64.  */
12685     case EM_SPARC32PLUS:
12686     case EM_SPARCV9:
12687     case EM_SPARC:
12688       return reloc_type == 46; /* R_SPARC_DISP64.  */
12689     case EM_X86_64:
12690     case EM_L1OM:
12691     case EM_K1OM:
12692       return reloc_type == 24; /* R_X86_64_PC64.  */
12693     case EM_S390_OLD:
12694     case EM_S390:
12695       return reloc_type == 23;  /* R_S390_PC64.  */
12696     case EM_TILEGX:
12697       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
12698     default:
12699       return FALSE;
12700     }
12701 }
12702
12703 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12704    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
12705
12706 static bfd_boolean
12707 is_24bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12708 {
12709   switch (filedata->file_header.e_machine)
12710     {
12711     case EM_CYGNUS_MN10200:
12712     case EM_MN10200:
12713       return reloc_type == 4; /* R_MN10200_24.  */
12714     case EM_FT32:
12715       return reloc_type == 5; /* R_FT32_20.  */
12716     default:
12717       return FALSE;
12718     }
12719 }
12720
12721 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12722    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
12723
12724 static bfd_boolean
12725 is_16bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12726 {
12727   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12728   switch (filedata->file_header.e_machine)
12729     {
12730     case EM_ARC:
12731     case EM_ARC_COMPACT:
12732     case EM_ARC_COMPACT2:
12733       return reloc_type == 2; /* R_ARC_16.  */
12734     case EM_ADAPTEVA_EPIPHANY:
12735       return reloc_type == 5;
12736     case EM_AVR_OLD:
12737     case EM_AVR:
12738       return reloc_type == 4; /* R_AVR_16.  */
12739     case EM_CYGNUS_D10V:
12740     case EM_D10V:
12741       return reloc_type == 3; /* R_D10V_16.  */
12742     case EM_FT32:
12743       return reloc_type == 2; /* R_FT32_16.  */
12744     case EM_H8S:
12745     case EM_H8_300:
12746     case EM_H8_300H:
12747       return reloc_type == R_H8_DIR16;
12748     case EM_IP2K_OLD:
12749     case EM_IP2K:
12750       return reloc_type == 1; /* R_IP2K_16.  */
12751     case EM_M32C_OLD:
12752     case EM_M32C:
12753       return reloc_type == 1; /* R_M32C_16 */
12754     case EM_CYGNUS_MN10200:
12755     case EM_MN10200:
12756       return reloc_type == 2; /* R_MN10200_16.  */
12757     case EM_CYGNUS_MN10300:
12758     case EM_MN10300:
12759       return reloc_type == 2; /* R_MN10300_16.  */
12760     case EM_MSP430:
12761       if (uses_msp430x_relocs (filedata))
12762         return reloc_type == 2; /* R_MSP430_ABS16.  */
12763       /* Fall through.  */
12764     case EM_MSP430_OLD:
12765       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
12766     case EM_NDS32:
12767       return reloc_type == 19; /* R_NDS32_RELA.  */
12768     case EM_ALTERA_NIOS2:
12769       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
12770     case EM_NIOS32:
12771       return reloc_type == 9; /* R_NIOS_16.  */
12772     case EM_OR1K:
12773       return reloc_type == 2; /* R_OR1K_16.  */
12774     case EM_RISCV:
12775       return reloc_type == 55; /* R_RISCV_SET16.  */
12776     case EM_TI_PRU:
12777       return reloc_type == 8; /* R_PRU_BFD_RELOC_16.  */
12778     case EM_TI_C6000:
12779       return reloc_type == 2; /* R_C6000_ABS16.  */
12780     case EM_VISIUM:
12781       return reloc_type == 2; /* R_VISIUM_16. */
12782     case EM_XC16X:
12783     case EM_C166:
12784       return reloc_type == 2; /* R_XC16C_ABS_16.  */
12785     case EM_XGATE:
12786       return reloc_type == 3; /* R_XGATE_16.  */
12787     default:
12788       return FALSE;
12789     }
12790 }
12791
12792 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12793    a 8-bit absolute RELA relocation used in DWARF debug sections.  */
12794
12795 static bfd_boolean
12796 is_8bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12797 {
12798   switch (filedata->file_header.e_machine)
12799     {
12800     case EM_RISCV:
12801       return reloc_type == 54; /* R_RISCV_SET8.  */
12802     default:
12803       return FALSE;
12804     }
12805 }
12806
12807 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12808    a 6-bit absolute RELA relocation used in DWARF debug sections.  */
12809
12810 static bfd_boolean
12811 is_6bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12812 {
12813   switch (filedata->file_header.e_machine)
12814     {
12815     case EM_RISCV:
12816       return reloc_type == 53; /* R_RISCV_SET6.  */
12817     default:
12818       return FALSE;
12819     }
12820 }
12821
12822 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12823    a 32-bit inplace add RELA relocation used in DWARF debug sections.  */
12824
12825 static bfd_boolean
12826 is_32bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12827 {
12828   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12829   switch (filedata->file_header.e_machine)
12830     {
12831     case EM_RISCV:
12832       return reloc_type == 35; /* R_RISCV_ADD32.  */
12833     default:
12834       return FALSE;
12835     }
12836 }
12837
12838 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12839    a 32-bit inplace sub RELA relocation used in DWARF debug sections.  */
12840
12841 static bfd_boolean
12842 is_32bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12843 {
12844   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12845   switch (filedata->file_header.e_machine)
12846     {
12847     case EM_RISCV:
12848       return reloc_type == 39; /* R_RISCV_SUB32.  */
12849     default:
12850       return FALSE;
12851     }
12852 }
12853
12854 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12855    a 64-bit inplace add RELA relocation used in DWARF debug sections.  */
12856
12857 static bfd_boolean
12858 is_64bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12859 {
12860   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12861   switch (filedata->file_header.e_machine)
12862     {
12863     case EM_RISCV:
12864       return reloc_type == 36; /* R_RISCV_ADD64.  */
12865     default:
12866       return FALSE;
12867     }
12868 }
12869
12870 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12871    a 64-bit inplace sub RELA relocation used in DWARF debug sections.  */
12872
12873 static bfd_boolean
12874 is_64bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12875 {
12876   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12877   switch (filedata->file_header.e_machine)
12878     {
12879     case EM_RISCV:
12880       return reloc_type == 40; /* R_RISCV_SUB64.  */
12881     default:
12882       return FALSE;
12883     }
12884 }
12885
12886 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12887    a 16-bit inplace add RELA relocation used in DWARF debug sections.  */
12888
12889 static bfd_boolean
12890 is_16bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12891 {
12892   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12893   switch (filedata->file_header.e_machine)
12894     {
12895     case EM_RISCV:
12896       return reloc_type == 34; /* R_RISCV_ADD16.  */
12897     default:
12898       return FALSE;
12899     }
12900 }
12901
12902 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12903    a 16-bit inplace sub RELA relocation used in DWARF debug sections.  */
12904
12905 static bfd_boolean
12906 is_16bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12907 {
12908   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12909   switch (filedata->file_header.e_machine)
12910     {
12911     case EM_RISCV:
12912       return reloc_type == 38; /* R_RISCV_SUB16.  */
12913     default:
12914       return FALSE;
12915     }
12916 }
12917
12918 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12919    a 8-bit inplace add RELA relocation used in DWARF debug sections.  */
12920
12921 static bfd_boolean
12922 is_8bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12923 {
12924   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12925   switch (filedata->file_header.e_machine)
12926     {
12927     case EM_RISCV:
12928       return reloc_type == 33; /* R_RISCV_ADD8.  */
12929     default:
12930       return FALSE;
12931     }
12932 }
12933
12934 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12935    a 8-bit inplace sub RELA relocation used in DWARF debug sections.  */
12936
12937 static bfd_boolean
12938 is_8bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12939 {
12940   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12941   switch (filedata->file_header.e_machine)
12942     {
12943     case EM_RISCV:
12944       return reloc_type == 37; /* R_RISCV_SUB8.  */
12945     default:
12946       return FALSE;
12947     }
12948 }
12949
12950 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12951    a 6-bit inplace sub RELA relocation used in DWARF debug sections.  */
12952
12953 static bfd_boolean
12954 is_6bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12955 {
12956   switch (filedata->file_header.e_machine)
12957     {
12958     case EM_RISCV:
12959       return reloc_type == 52; /* R_RISCV_SUB6.  */
12960     default:
12961       return FALSE;
12962     }
12963 }
12964
12965 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12966    relocation entries (possibly formerly used for SHT_GROUP sections).  */
12967
12968 static bfd_boolean
12969 is_none_reloc (Filedata * filedata, unsigned int reloc_type)
12970 {
12971   switch (filedata->file_header.e_machine)
12972     {
12973     case EM_386:     /* R_386_NONE.  */
12974     case EM_68K:     /* R_68K_NONE.  */
12975     case EM_ADAPTEVA_EPIPHANY:
12976     case EM_ALPHA:   /* R_ALPHA_NONE.  */
12977     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
12978     case EM_ARC:     /* R_ARC_NONE.  */
12979     case EM_ARC_COMPACT2: /* R_ARC_NONE.  */
12980     case EM_ARC_COMPACT: /* R_ARC_NONE.  */
12981     case EM_ARM:     /* R_ARM_NONE.  */
12982     case EM_C166:    /* R_XC16X_NONE.  */
12983     case EM_CRIS:    /* R_CRIS_NONE.  */
12984     case EM_FT32:    /* R_FT32_NONE.  */
12985     case EM_IA_64:   /* R_IA64_NONE.  */
12986     case EM_K1OM:    /* R_X86_64_NONE.  */
12987     case EM_L1OM:    /* R_X86_64_NONE.  */
12988     case EM_M32R:    /* R_M32R_NONE.  */
12989     case EM_MIPS:    /* R_MIPS_NONE.  */
12990     case EM_MN10300: /* R_MN10300_NONE.  */
12991     case EM_MOXIE:   /* R_MOXIE_NONE.  */
12992     case EM_NIOS32:  /* R_NIOS_NONE.  */
12993     case EM_OR1K:    /* R_OR1K_NONE. */
12994     case EM_PARISC:  /* R_PARISC_NONE.  */
12995     case EM_PPC64:   /* R_PPC64_NONE.  */
12996     case EM_PPC:     /* R_PPC_NONE.  */
12997     case EM_RISCV:   /* R_RISCV_NONE.  */
12998     case EM_S390:    /* R_390_NONE.  */
12999     case EM_S390_OLD:
13000     case EM_SH:      /* R_SH_NONE.  */
13001     case EM_SPARC32PLUS:
13002     case EM_SPARC:   /* R_SPARC_NONE.  */
13003     case EM_SPARCV9:
13004     case EM_TILEGX:  /* R_TILEGX_NONE.  */
13005     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
13006     case EM_TI_C6000:/* R_C6000_NONE.  */
13007     case EM_X86_64:  /* R_X86_64_NONE.  */
13008     case EM_XC16X:
13009     case EM_WEBASSEMBLY: /* R_WASM32_NONE.  */
13010       return reloc_type == 0;
13011
13012     case EM_AARCH64:
13013       return reloc_type == 0 || reloc_type == 256;
13014     case EM_AVR_OLD:
13015     case EM_AVR:
13016       return (reloc_type == 0 /* R_AVR_NONE.  */
13017               || reloc_type == 30 /* R_AVR_DIFF8.  */
13018               || reloc_type == 31 /* R_AVR_DIFF16.  */
13019               || reloc_type == 32 /* R_AVR_DIFF32.  */);
13020     case EM_METAG:
13021       return reloc_type == 3; /* R_METAG_NONE.  */
13022     case EM_NDS32:
13023       return (reloc_type == 0       /* R_XTENSA_NONE.  */
13024               || reloc_type == 204  /* R_NDS32_DIFF8.  */
13025               || reloc_type == 205  /* R_NDS32_DIFF16.  */
13026               || reloc_type == 206  /* R_NDS32_DIFF32.  */
13027               || reloc_type == 207  /* R_NDS32_ULEB128.  */);
13028     case EM_TI_PRU:
13029       return (reloc_type == 0       /* R_PRU_NONE.  */
13030               || reloc_type == 65   /* R_PRU_DIFF8.  */
13031               || reloc_type == 66   /* R_PRU_DIFF16.  */
13032               || reloc_type == 67   /* R_PRU_DIFF32.  */);
13033     case EM_XTENSA_OLD:
13034     case EM_XTENSA:
13035       return (reloc_type == 0      /* R_XTENSA_NONE.  */
13036               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
13037               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
13038               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
13039     }
13040   return FALSE;
13041 }
13042
13043 /* Returns TRUE if there is a relocation against
13044    section NAME at OFFSET bytes.  */
13045
13046 bfd_boolean
13047 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
13048 {
13049   Elf_Internal_Rela * relocs;
13050   Elf_Internal_Rela * rp;
13051
13052   if (dsec == NULL || dsec->reloc_info == NULL)
13053     return FALSE;
13054
13055   relocs = (Elf_Internal_Rela *) dsec->reloc_info;
13056
13057   for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
13058     if (rp->r_offset == offset)
13059       return TRUE;
13060
13061    return FALSE;
13062 }
13063
13064 /* Apply relocations to a section.
13065    Returns TRUE upon success, FALSE otherwise.
13066    If RELOCS_RETURN is non-NULL then it is set to point to the loaded relocs.
13067    It is then the caller's responsibility to free them.  NUM_RELOCS_RETURN
13068    will be set to the number of relocs loaded.
13069
13070    Note: So far support has been added only for those relocations
13071    which can be found in debug sections. FIXME: Add support for
13072    more relocations ?  */
13073
13074 static bfd_boolean
13075 apply_relocations (Filedata *                 filedata,
13076                    const Elf_Internal_Shdr *  section,
13077                    unsigned char *            start,
13078                    bfd_size_type              size,
13079                    void **                    relocs_return,
13080                    unsigned long *            num_relocs_return)
13081 {
13082   Elf_Internal_Shdr * relsec;
13083   unsigned char * end = start + size;
13084
13085   if (relocs_return != NULL)
13086     {
13087       * (Elf_Internal_Rela **) relocs_return = NULL;
13088       * num_relocs_return = 0;
13089     }
13090
13091   if (filedata->file_header.e_type != ET_REL)
13092     /* No relocs to apply.  */
13093     return TRUE;
13094
13095   /* Find the reloc section associated with the section.  */
13096   for (relsec = filedata->section_headers;
13097        relsec < filedata->section_headers + filedata->file_header.e_shnum;
13098        ++relsec)
13099     {
13100       bfd_boolean is_rela;
13101       unsigned long num_relocs;
13102       Elf_Internal_Rela * relocs;
13103       Elf_Internal_Rela * rp;
13104       Elf_Internal_Shdr * symsec;
13105       Elf_Internal_Sym * symtab;
13106       unsigned long num_syms;
13107       Elf_Internal_Sym * sym;
13108
13109       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13110           || relsec->sh_info >= filedata->file_header.e_shnum
13111           || filedata->section_headers + relsec->sh_info != section
13112           || relsec->sh_size == 0
13113           || relsec->sh_link >= filedata->file_header.e_shnum)
13114         continue;
13115
13116       is_rela = relsec->sh_type == SHT_RELA;
13117
13118       if (is_rela)
13119         {
13120           if (!slurp_rela_relocs (filedata, relsec->sh_offset,
13121                                   relsec->sh_size, & relocs, & num_relocs))
13122             return FALSE;
13123         }
13124       else
13125         {
13126           if (!slurp_rel_relocs (filedata, relsec->sh_offset,
13127                                  relsec->sh_size, & relocs, & num_relocs))
13128             return FALSE;
13129         }
13130
13131       /* SH uses RELA but uses in place value instead of the addend field.  */
13132       if (filedata->file_header.e_machine == EM_SH)
13133         is_rela = FALSE;
13134
13135       symsec = filedata->section_headers + relsec->sh_link;
13136       if (symsec->sh_type != SHT_SYMTAB
13137           && symsec->sh_type != SHT_DYNSYM)
13138         return FALSE;
13139       symtab = GET_ELF_SYMBOLS (filedata, symsec, & num_syms);
13140
13141       for (rp = relocs; rp < relocs + num_relocs; ++rp)
13142         {
13143           bfd_vma         addend;
13144           unsigned int    reloc_type;
13145           unsigned int    reloc_size;
13146           bfd_boolean     reloc_inplace = FALSE;
13147           bfd_boolean     reloc_subtract = FALSE;
13148           unsigned char * rloc;
13149           unsigned long   sym_index;
13150
13151           reloc_type = get_reloc_type (filedata, rp->r_info);
13152
13153           if (target_specific_reloc_handling (filedata, rp, start, end, symtab, num_syms))
13154             continue;
13155           else if (is_none_reloc (filedata, reloc_type))
13156             continue;
13157           else if (is_32bit_abs_reloc (filedata, reloc_type)
13158                    || is_32bit_pcrel_reloc (filedata, reloc_type))
13159             reloc_size = 4;
13160           else if (is_64bit_abs_reloc (filedata, reloc_type)
13161                    || is_64bit_pcrel_reloc (filedata, reloc_type))
13162             reloc_size = 8;
13163           else if (is_24bit_abs_reloc (filedata, reloc_type))
13164             reloc_size = 3;
13165           else if (is_16bit_abs_reloc (filedata, reloc_type))
13166             reloc_size = 2;
13167           else if (is_8bit_abs_reloc (filedata, reloc_type)
13168                    || is_6bit_abs_reloc (filedata, reloc_type))
13169             reloc_size = 1;
13170           else if ((reloc_subtract = is_32bit_inplace_sub_reloc (filedata,
13171                                                                  reloc_type))
13172                    || is_32bit_inplace_add_reloc (filedata, reloc_type))
13173             {
13174               reloc_size = 4;
13175               reloc_inplace = TRUE;
13176             }
13177           else if ((reloc_subtract = is_64bit_inplace_sub_reloc (filedata,
13178                                                                  reloc_type))
13179                    || is_64bit_inplace_add_reloc (filedata, reloc_type))
13180             {
13181               reloc_size = 8;
13182               reloc_inplace = TRUE;
13183             }
13184           else if ((reloc_subtract = is_16bit_inplace_sub_reloc (filedata,
13185                                                                  reloc_type))
13186                    || is_16bit_inplace_add_reloc (filedata, reloc_type))
13187             {
13188               reloc_size = 2;
13189               reloc_inplace = TRUE;
13190             }
13191           else if ((reloc_subtract = is_8bit_inplace_sub_reloc (filedata,
13192                                                                 reloc_type))
13193                    || is_8bit_inplace_add_reloc (filedata, reloc_type))
13194             {
13195               reloc_size = 1;
13196               reloc_inplace = TRUE;
13197             }
13198           else if ((reloc_subtract = is_6bit_inplace_sub_reloc (filedata,
13199                                                                 reloc_type)))
13200             {
13201               reloc_size = 1;
13202               reloc_inplace = TRUE;
13203             }
13204           else
13205             {
13206               static unsigned int prev_reloc = 0;
13207
13208               if (reloc_type != prev_reloc)
13209                 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
13210                       reloc_type, printable_section_name (filedata, section));
13211               prev_reloc = reloc_type;
13212               continue;
13213             }
13214
13215           rloc = start + rp->r_offset;
13216           if ((rloc + reloc_size) > end || (rloc < start))
13217             {
13218               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
13219                     (unsigned long) rp->r_offset,
13220                     printable_section_name (filedata, section));
13221               continue;
13222             }
13223
13224           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
13225           if (sym_index >= num_syms)
13226             {
13227               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
13228                     sym_index, printable_section_name (filedata, section));
13229               continue;
13230             }
13231           sym = symtab + sym_index;
13232
13233           /* If the reloc has a symbol associated with it,
13234              make sure that it is of an appropriate type.
13235
13236              Relocations against symbols without type can happen.
13237              Gcc -feliminate-dwarf2-dups may generate symbols
13238              without type for debug info.
13239
13240              Icc generates relocations against function symbols
13241              instead of local labels.
13242
13243              Relocations against object symbols can happen, eg when
13244              referencing a global array.  For an example of this see
13245              the _clz.o binary in libgcc.a.  */
13246           if (sym != symtab
13247               && ELF_ST_TYPE (sym->st_info) != STT_COMMON
13248               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
13249             {
13250               warn (_("skipping unexpected symbol type %s in section %s relocation %ld\n"),
13251                     get_symbol_type (filedata, ELF_ST_TYPE (sym->st_info)),
13252                     printable_section_name (filedata, relsec),
13253                     (long int)(rp - relocs));
13254               continue;
13255             }
13256
13257           addend = 0;
13258           if (is_rela)
13259             addend += rp->r_addend;
13260           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
13261              partial_inplace.  */
13262           if (!is_rela
13263               || (filedata->file_header.e_machine == EM_XTENSA
13264                   && reloc_type == 1)
13265               || ((filedata->file_header.e_machine == EM_PJ
13266                    || filedata->file_header.e_machine == EM_PJ_OLD)
13267                   && reloc_type == 1)
13268               || ((filedata->file_header.e_machine == EM_D30V
13269                    || filedata->file_header.e_machine == EM_CYGNUS_D30V)
13270                   && reloc_type == 12)
13271               || reloc_inplace)
13272             {
13273               if (is_6bit_inplace_sub_reloc (filedata, reloc_type))
13274                 addend += byte_get (rloc, reloc_size) & 0x3f;
13275               else
13276                 addend += byte_get (rloc, reloc_size);
13277             }
13278
13279           if (is_32bit_pcrel_reloc (filedata, reloc_type)
13280               || is_64bit_pcrel_reloc (filedata, reloc_type))
13281             {
13282               /* On HPPA, all pc-relative relocations are biased by 8.  */
13283               if (filedata->file_header.e_machine == EM_PARISC)
13284                 addend -= 8;
13285               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
13286                         reloc_size);
13287             }
13288           else if (is_6bit_abs_reloc (filedata, reloc_type)
13289                    || is_6bit_inplace_sub_reloc (filedata, reloc_type))
13290             {
13291               if (reloc_subtract)
13292                 addend -= sym->st_value;
13293               else
13294                 addend += sym->st_value;
13295               addend = (addend & 0x3f) | (byte_get (rloc, reloc_size) & 0xc0);
13296               byte_put (rloc, addend, reloc_size);
13297             }
13298           else if (reloc_subtract)
13299             byte_put (rloc, addend - sym->st_value, reloc_size);
13300           else
13301             byte_put (rloc, addend + sym->st_value, reloc_size);
13302         }
13303
13304       free (symtab);
13305       /* Let the target specific reloc processing code know that
13306          we have finished with these relocs.  */
13307       target_specific_reloc_handling (filedata, NULL, NULL, NULL, NULL, 0);
13308
13309       if (relocs_return)
13310         {
13311           * (Elf_Internal_Rela **) relocs_return = relocs;
13312           * num_relocs_return = num_relocs;
13313         }
13314       else
13315         free (relocs);
13316
13317       break;
13318     }
13319
13320   return TRUE;
13321 }
13322
13323 #ifdef SUPPORT_DISASSEMBLY
13324 static bfd_boolean
13325 disassemble_section (Elf_Internal_Shdr * section, Filedata * filedata)
13326 {
13327   printf (_("\nAssembly dump of section %s\n"), printable_section_name (filedata, section));
13328
13329   /* FIXME: XXX -- to be done --- XXX */
13330
13331   return TRUE;
13332 }
13333 #endif
13334
13335 /* Reads in the contents of SECTION from FILE, returning a pointer
13336    to a malloc'ed buffer or NULL if something went wrong.  */
13337
13338 static char *
13339 get_section_contents (Elf_Internal_Shdr * section, Filedata * filedata)
13340 {
13341   bfd_size_type num_bytes = section->sh_size;
13342
13343   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
13344     {
13345       printf (_("Section '%s' has no data to dump.\n"),
13346               printable_section_name (filedata, section));
13347       return NULL;
13348     }
13349
13350   return  (char *) get_data (NULL, filedata, section->sh_offset, 1, num_bytes,
13351                              _("section contents"));
13352 }
13353
13354 /* Uncompresses a section that was compressed using zlib, in place.  */
13355
13356 static bfd_boolean
13357 uncompress_section_contents (unsigned char **   buffer,
13358                              dwarf_size_type    uncompressed_size,
13359                              dwarf_size_type *  size)
13360 {
13361   dwarf_size_type compressed_size = *size;
13362   unsigned char * compressed_buffer = *buffer;
13363   unsigned char * uncompressed_buffer;
13364   z_stream strm;
13365   int rc;
13366
13367   /* It is possible the section consists of several compressed
13368      buffers concatenated together, so we uncompress in a loop.  */
13369   /* PR 18313: The state field in the z_stream structure is supposed
13370      to be invisible to the user (ie us), but some compilers will
13371      still complain about it being used without initialisation.  So
13372      we first zero the entire z_stream structure and then set the fields
13373      that we need.  */
13374   memset (& strm, 0, sizeof strm);
13375   strm.avail_in = compressed_size;
13376   strm.next_in = (Bytef *) compressed_buffer;
13377   strm.avail_out = uncompressed_size;
13378   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
13379
13380   rc = inflateInit (& strm);
13381   while (strm.avail_in > 0)
13382     {
13383       if (rc != Z_OK)
13384         goto fail;
13385       strm.next_out = ((Bytef *) uncompressed_buffer
13386                        + (uncompressed_size - strm.avail_out));
13387       rc = inflate (&strm, Z_FINISH);
13388       if (rc != Z_STREAM_END)
13389         goto fail;
13390       rc = inflateReset (& strm);
13391     }
13392   rc = inflateEnd (& strm);
13393   if (rc != Z_OK
13394       || strm.avail_out != 0)
13395     goto fail;
13396
13397   *buffer = uncompressed_buffer;
13398   *size = uncompressed_size;
13399   return TRUE;
13400
13401  fail:
13402   free (uncompressed_buffer);
13403   /* Indicate decompression failure.  */
13404   *buffer = NULL;
13405   return FALSE;
13406 }
13407
13408 static bfd_boolean
13409 dump_section_as_strings (Elf_Internal_Shdr * section, Filedata * filedata)
13410 {
13411   Elf_Internal_Shdr *  relsec;
13412   bfd_size_type        num_bytes;
13413   unsigned char *      data;
13414   unsigned char *      end;
13415   unsigned char *      real_start;
13416   unsigned char *      start;
13417   bfd_boolean          some_strings_shown;
13418
13419   real_start = start = (unsigned char *) get_section_contents (section, filedata);
13420   if (start == NULL)
13421     /* PR 21820: Do not fail if the section was empty.  */
13422     return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13423
13424   num_bytes = section->sh_size;
13425
13426   printf (_("\nString dump of section '%s':\n"), printable_section_name (filedata, section));
13427
13428   if (decompress_dumps)
13429     {
13430       dwarf_size_type new_size = num_bytes;
13431       dwarf_size_type uncompressed_size = 0;
13432
13433       if ((section->sh_flags & SHF_COMPRESSED) != 0)
13434         {
13435           Elf_Internal_Chdr chdr;
13436           unsigned int compression_header_size
13437             = get_compression_header (& chdr, (unsigned char *) start,
13438                                       num_bytes);
13439
13440           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13441             {
13442               warn (_("section '%s' has unsupported compress type: %d\n"),
13443                     printable_section_name (filedata, section), chdr.ch_type);
13444               return FALSE;
13445             }
13446           uncompressed_size = chdr.ch_size;
13447           start += compression_header_size;
13448           new_size -= compression_header_size;
13449         }
13450       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13451         {
13452           /* Read the zlib header.  In this case, it should be "ZLIB"
13453              followed by the uncompressed section size, 8 bytes in
13454              big-endian order.  */
13455           uncompressed_size = start[4]; uncompressed_size <<= 8;
13456           uncompressed_size += start[5]; uncompressed_size <<= 8;
13457           uncompressed_size += start[6]; uncompressed_size <<= 8;
13458           uncompressed_size += start[7]; uncompressed_size <<= 8;
13459           uncompressed_size += start[8]; uncompressed_size <<= 8;
13460           uncompressed_size += start[9]; uncompressed_size <<= 8;
13461           uncompressed_size += start[10]; uncompressed_size <<= 8;
13462           uncompressed_size += start[11];
13463           start += 12;
13464           new_size -= 12;
13465         }
13466
13467       if (uncompressed_size)
13468         {
13469           if (uncompress_section_contents (& start,
13470                                            uncompressed_size, & new_size))
13471             num_bytes = new_size;
13472           else
13473             {
13474               error (_("Unable to decompress section %s\n"),
13475                      printable_section_name (filedata, section));
13476               return FALSE;
13477             }
13478         }
13479       else
13480         start = real_start;
13481     }
13482
13483   /* If the section being dumped has relocations against it the user might
13484      be expecting these relocations to have been applied.  Check for this
13485      case and issue a warning message in order to avoid confusion.
13486      FIXME: Maybe we ought to have an option that dumps a section with
13487      relocs applied ?  */
13488   for (relsec = filedata->section_headers;
13489        relsec < filedata->section_headers + filedata->file_header.e_shnum;
13490        ++relsec)
13491     {
13492       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13493           || relsec->sh_info >= filedata->file_header.e_shnum
13494           || filedata->section_headers + relsec->sh_info != section
13495           || relsec->sh_size == 0
13496           || relsec->sh_link >= filedata->file_header.e_shnum)
13497         continue;
13498
13499       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13500       break;
13501     }
13502
13503   data = start;
13504   end  = start + num_bytes;
13505   some_strings_shown = FALSE;
13506
13507   while (data < end)
13508     {
13509       while (!ISPRINT (* data))
13510         if (++ data >= end)
13511           break;
13512
13513       if (data < end)
13514         {
13515           size_t maxlen = end - data;
13516
13517 #ifndef __MSVCRT__
13518           /* PR 11128: Use two separate invocations in order to work
13519              around bugs in the Solaris 8 implementation of printf.  */
13520           printf ("  [%6tx]  ", data - start);
13521 #else
13522           printf ("  [%6Ix]  ", (size_t) (data - start));
13523 #endif
13524           if (maxlen > 0)
13525             {
13526               print_symbol ((int) maxlen, (const char *) data);
13527               putchar ('\n');
13528               data += strnlen ((const char *) data, maxlen);
13529             }
13530           else
13531             {
13532               printf (_("<corrupt>\n"));
13533               data = end;
13534             }
13535           some_strings_shown = TRUE;
13536         }
13537     }
13538
13539   if (! some_strings_shown)
13540     printf (_("  No strings found in this section."));
13541
13542   free (real_start);
13543
13544   putchar ('\n');
13545   return TRUE;
13546 }
13547
13548 static bfd_boolean
13549 dump_section_as_bytes (Elf_Internal_Shdr *  section,
13550                        Filedata *           filedata,
13551                        bfd_boolean          relocate)
13552 {
13553   Elf_Internal_Shdr * relsec;
13554   bfd_size_type       bytes;
13555   bfd_size_type       section_size;
13556   bfd_vma             addr;
13557   unsigned char *     data;
13558   unsigned char *     real_start;
13559   unsigned char *     start;
13560
13561   real_start = start = (unsigned char *) get_section_contents (section, filedata);
13562   if (start == NULL)
13563     /* PR 21820: Do not fail if the section was empty.  */
13564     return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13565
13566   section_size = section->sh_size;
13567
13568   printf (_("\nHex dump of section '%s':\n"), printable_section_name (filedata, section));
13569
13570   if (decompress_dumps)
13571     {
13572       dwarf_size_type new_size = section_size;
13573       dwarf_size_type uncompressed_size = 0;
13574
13575       if ((section->sh_flags & SHF_COMPRESSED) != 0)
13576         {
13577           Elf_Internal_Chdr chdr;
13578           unsigned int compression_header_size
13579             = get_compression_header (& chdr, start, section_size);
13580
13581           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13582             {
13583               warn (_("section '%s' has unsupported compress type: %d\n"),
13584                     printable_section_name (filedata, section), chdr.ch_type);
13585               return FALSE;
13586             }
13587           uncompressed_size = chdr.ch_size;
13588           start += compression_header_size;
13589           new_size -= compression_header_size;
13590         }
13591       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13592         {
13593           /* Read the zlib header.  In this case, it should be "ZLIB"
13594              followed by the uncompressed section size, 8 bytes in
13595              big-endian order.  */
13596           uncompressed_size = start[4]; uncompressed_size <<= 8;
13597           uncompressed_size += start[5]; uncompressed_size <<= 8;
13598           uncompressed_size += start[6]; uncompressed_size <<= 8;
13599           uncompressed_size += start[7]; uncompressed_size <<= 8;
13600           uncompressed_size += start[8]; uncompressed_size <<= 8;
13601           uncompressed_size += start[9]; uncompressed_size <<= 8;
13602           uncompressed_size += start[10]; uncompressed_size <<= 8;
13603           uncompressed_size += start[11];
13604           start += 12;
13605           new_size -= 12;
13606         }
13607
13608       if (uncompressed_size)
13609         {
13610           if (uncompress_section_contents (& start, uncompressed_size,
13611                                            & new_size))
13612             {
13613               section_size = new_size;
13614             }
13615           else
13616             {
13617               error (_("Unable to decompress section %s\n"),
13618                      printable_section_name (filedata, section));
13619               /* FIXME: Print the section anyway ?  */
13620               return FALSE;
13621             }
13622         }
13623       else
13624         start = real_start;
13625     }
13626
13627   if (relocate)
13628     {
13629       if (! apply_relocations (filedata, section, start, section_size, NULL, NULL))
13630         return FALSE;
13631     }
13632   else
13633     {
13634       /* If the section being dumped has relocations against it the user might
13635          be expecting these relocations to have been applied.  Check for this
13636          case and issue a warning message in order to avoid confusion.
13637          FIXME: Maybe we ought to have an option that dumps a section with
13638          relocs applied ?  */
13639       for (relsec = filedata->section_headers;
13640            relsec < filedata->section_headers + filedata->file_header.e_shnum;
13641            ++relsec)
13642         {
13643           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13644               || relsec->sh_info >= filedata->file_header.e_shnum
13645               || filedata->section_headers + relsec->sh_info != section
13646               || relsec->sh_size == 0
13647               || relsec->sh_link >= filedata->file_header.e_shnum)
13648             continue;
13649
13650           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13651           break;
13652         }
13653     }
13654
13655   addr = section->sh_addr;
13656   bytes = section_size;
13657   data = start;
13658
13659   while (bytes)
13660     {
13661       int j;
13662       int k;
13663       int lbytes;
13664
13665       lbytes = (bytes > 16 ? 16 : bytes);
13666
13667       printf ("  0x%8.8lx ", (unsigned long) addr);
13668
13669       for (j = 0; j < 16; j++)
13670         {
13671           if (j < lbytes)
13672             printf ("%2.2x", data[j]);
13673           else
13674             printf ("  ");
13675
13676           if ((j & 3) == 3)
13677             printf (" ");
13678         }
13679
13680       for (j = 0; j < lbytes; j++)
13681         {
13682           k = data[j];
13683           if (k >= ' ' && k < 0x7f)
13684             printf ("%c", k);
13685           else
13686             printf (".");
13687         }
13688
13689       putchar ('\n');
13690
13691       data  += lbytes;
13692       addr  += lbytes;
13693       bytes -= lbytes;
13694     }
13695
13696   free (real_start);
13697
13698   putchar ('\n');
13699   return TRUE;
13700 }
13701
13702 static bfd_boolean
13703 load_specific_debug_section (enum dwarf_section_display_enum  debug,
13704                              const Elf_Internal_Shdr *        sec,
13705                              void *                           data)
13706 {
13707   struct dwarf_section * section = &debug_displays [debug].section;
13708   char buf [64];
13709   Filedata * filedata = (Filedata *) data;
13710   
13711   if (section->start != NULL)
13712     {
13713       /* If it is already loaded, do nothing.  */
13714       if (streq (section->filename, filedata->file_name))
13715         return TRUE;
13716       free (section->start);
13717     }
13718
13719   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
13720   section->address = sec->sh_addr;
13721   section->user_data = NULL;
13722   section->filename = filedata->file_name;
13723   section->start = (unsigned char *) get_data (NULL, filedata,
13724                                                sec->sh_offset, 1,
13725                                                sec->sh_size, buf);
13726   if (section->start == NULL)
13727     section->size = 0;
13728   else
13729     {
13730       unsigned char *start = section->start;
13731       dwarf_size_type size = sec->sh_size;
13732       dwarf_size_type uncompressed_size = 0;
13733
13734       if ((sec->sh_flags & SHF_COMPRESSED) != 0)
13735         {
13736           Elf_Internal_Chdr chdr;
13737           unsigned int compression_header_size;
13738
13739           if (size < (is_32bit_elf
13740                       ? sizeof (Elf32_External_Chdr)
13741                       : sizeof (Elf64_External_Chdr)))
13742             {
13743               warn (_("compressed section %s is too small to contain a compression header"),
13744                     section->name);
13745               return FALSE;
13746             }
13747
13748           compression_header_size = get_compression_header (&chdr, start, size);
13749
13750           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13751             {
13752               warn (_("section '%s' has unsupported compress type: %d\n"),
13753                     section->name, chdr.ch_type);
13754               return FALSE;
13755             }
13756           uncompressed_size = chdr.ch_size;
13757           start += compression_header_size;
13758           size -= compression_header_size;
13759         }
13760       else if (size > 12 && streq ((char *) start, "ZLIB"))
13761         {
13762           /* Read the zlib header.  In this case, it should be "ZLIB"
13763              followed by the uncompressed section size, 8 bytes in
13764              big-endian order.  */
13765           uncompressed_size = start[4]; uncompressed_size <<= 8;
13766           uncompressed_size += start[5]; uncompressed_size <<= 8;
13767           uncompressed_size += start[6]; uncompressed_size <<= 8;
13768           uncompressed_size += start[7]; uncompressed_size <<= 8;
13769           uncompressed_size += start[8]; uncompressed_size <<= 8;
13770           uncompressed_size += start[9]; uncompressed_size <<= 8;
13771           uncompressed_size += start[10]; uncompressed_size <<= 8;
13772           uncompressed_size += start[11];
13773           start += 12;
13774           size -= 12;
13775         }
13776
13777       if (uncompressed_size)
13778         {
13779           if (uncompress_section_contents (&start, uncompressed_size,
13780                                            &size))
13781             {
13782               /* Free the compressed buffer, update the section buffer
13783                  and the section size if uncompress is successful.  */
13784               free (section->start);
13785               section->start = start;
13786             }
13787           else
13788             {
13789               error (_("Unable to decompress section %s\n"),
13790                      printable_section_name (filedata, sec));
13791               return FALSE;
13792             }
13793         }
13794
13795       section->size = size;
13796     }
13797
13798   if (section->start == NULL)
13799     return FALSE;
13800
13801   if (debug_displays [debug].relocate)
13802     {
13803       if (! apply_relocations (filedata, sec, section->start, section->size,
13804                                & section->reloc_info, & section->num_relocs))
13805         return FALSE;
13806     }
13807   else
13808     {
13809       section->reloc_info = NULL;
13810       section->num_relocs = 0;
13811     }
13812
13813   return TRUE;
13814 }
13815
13816 /* If this is not NULL, load_debug_section will only look for sections
13817    within the list of sections given here.  */
13818 static unsigned int * section_subset = NULL;
13819
13820 bfd_boolean
13821 load_debug_section (enum dwarf_section_display_enum debug, void * data)
13822 {
13823   struct dwarf_section * section = &debug_displays [debug].section;
13824   Elf_Internal_Shdr * sec;
13825   Filedata * filedata = (Filedata *) data;
13826
13827   /* Without section headers we cannot find any sections.  */
13828   if (filedata->section_headers == NULL)
13829     return FALSE;
13830
13831   if (filedata->string_table == NULL
13832       && filedata->file_header.e_shstrndx != SHN_UNDEF
13833       && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
13834     {
13835       Elf_Internal_Shdr * strs;
13836
13837       /* Read in the string table, so that we have section names to scan.  */
13838       strs = filedata->section_headers + filedata->file_header.e_shstrndx;
13839
13840       if (strs != NULL && strs->sh_size != 0)
13841         {
13842           filedata->string_table
13843             = (char *) get_data (NULL, filedata, strs->sh_offset,
13844                                  1, strs->sh_size, _("string table"));
13845
13846           filedata->string_table_length
13847             = filedata->string_table != NULL ? strs->sh_size : 0;
13848         }
13849     }
13850
13851   /* Locate the debug section.  */
13852   sec = find_section_in_set (filedata, section->uncompressed_name, section_subset);
13853   if (sec != NULL)
13854     section->name = section->uncompressed_name;
13855   else
13856     {
13857       sec = find_section_in_set (filedata, section->compressed_name, section_subset);
13858       if (sec != NULL)
13859         section->name = section->compressed_name;
13860     }
13861   if (sec == NULL)
13862     return FALSE;
13863
13864   /* If we're loading from a subset of sections, and we've loaded
13865      a section matching this name before, it's likely that it's a
13866      different one.  */
13867   if (section_subset != NULL)
13868     free_debug_section (debug);
13869
13870   return load_specific_debug_section (debug, sec, data);
13871 }
13872
13873 void
13874 free_debug_section (enum dwarf_section_display_enum debug)
13875 {
13876   struct dwarf_section * section = &debug_displays [debug].section;
13877
13878   if (section->start == NULL)
13879     return;
13880
13881   free ((char *) section->start);
13882   section->start = NULL;
13883   section->address = 0;
13884   section->size = 0;
13885 }
13886
13887 static bfd_boolean
13888 display_debug_section (int shndx, Elf_Internal_Shdr * section, Filedata * filedata)
13889 {
13890   char * name = SECTION_NAME (section);
13891   const char * print_name = printable_section_name (filedata, section);
13892   bfd_size_type length;
13893   bfd_boolean result = TRUE;
13894   int i;
13895
13896   length = section->sh_size;
13897   if (length == 0)
13898     {
13899       printf (_("\nSection '%s' has no debugging data.\n"), print_name);
13900       return TRUE;
13901     }
13902   if (section->sh_type == SHT_NOBITS)
13903     {
13904       /* There is no point in dumping the contents of a debugging section
13905          which has the NOBITS type - the bits in the file will be random.
13906          This can happen when a file containing a .eh_frame section is
13907          stripped with the --only-keep-debug command line option.  */
13908       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
13909               print_name);
13910       return FALSE;
13911     }
13912
13913   if (const_strneq (name, ".gnu.linkonce.wi."))
13914     name = ".debug_info";
13915
13916   /* See if we know how to display the contents of this section.  */
13917   for (i = 0; i < max; i++)
13918     {
13919       enum dwarf_section_display_enum  id = (enum dwarf_section_display_enum) i;
13920       struct dwarf_section_display *   display = debug_displays + i;
13921       struct dwarf_section *           sec = & display->section;
13922
13923       if (streq (sec->uncompressed_name, name)
13924           || (id == line && const_strneq (name, ".debug_line."))
13925           || streq (sec->compressed_name, name))
13926         {
13927           bfd_boolean secondary = (section != find_section (filedata, name));
13928
13929           if (secondary)
13930             free_debug_section (id);
13931
13932           if (i == line && const_strneq (name, ".debug_line."))
13933             sec->name = name;
13934           else if (streq (sec->uncompressed_name, name))
13935             sec->name = sec->uncompressed_name;
13936           else
13937             sec->name = sec->compressed_name;
13938
13939           if (load_specific_debug_section (id, section, filedata))
13940             {
13941               /* If this debug section is part of a CU/TU set in a .dwp file,
13942                  restrict load_debug_section to the sections in that set.  */
13943               section_subset = find_cu_tu_set (filedata, shndx);
13944
13945               result &= display->display (sec, filedata);
13946
13947               section_subset = NULL;
13948
13949               if (secondary || (id != info && id != abbrev))
13950                 free_debug_section (id);
13951             }
13952           break;
13953         }
13954     }
13955
13956   if (i == max)
13957     {
13958       printf (_("Unrecognized debug section: %s\n"), print_name);
13959       result = FALSE;
13960     }
13961
13962   return result;
13963 }
13964
13965 /* Set DUMP_SECTS for all sections where dumps were requested
13966    based on section name.  */
13967
13968 static void
13969 initialise_dumps_byname (Filedata * filedata)
13970 {
13971   struct dump_list_entry * cur;
13972
13973   for (cur = dump_sects_byname; cur; cur = cur->next)
13974     {
13975       unsigned int i;
13976       bfd_boolean any = FALSE;
13977
13978       for (i = 0; i < filedata->file_header.e_shnum; i++)
13979         if (streq (SECTION_NAME (filedata->section_headers + i), cur->name))
13980           {
13981             request_dump_bynumber (filedata, i, cur->type);
13982             any = TRUE;
13983           }
13984
13985       if (!any)
13986         warn (_("Section '%s' was not dumped because it does not exist!\n"),
13987               cur->name);
13988     }
13989 }
13990
13991 static bfd_boolean
13992 process_section_contents (Filedata * filedata)
13993 {
13994   Elf_Internal_Shdr * section;
13995   unsigned int i;
13996   bfd_boolean res = TRUE;
13997
13998   if (! do_dump)
13999     return TRUE;
14000
14001   initialise_dumps_byname (filedata);
14002
14003   for (i = 0, section = filedata->section_headers;
14004        i < filedata->file_header.e_shnum && i < filedata->num_dump_sects;
14005        i++, section++)
14006     {
14007       dump_type dump = filedata->dump_sects[i];
14008
14009 #ifdef SUPPORT_DISASSEMBLY
14010       if (dump & DISASS_DUMP)
14011         {
14012           if (! disassemble_section (section, filedata))
14013             res = FALSE;
14014         }
14015 #endif
14016       if (dump & HEX_DUMP)
14017         {
14018           if (! dump_section_as_bytes (section, filedata, FALSE))
14019             res = FALSE;
14020         }
14021
14022       if (dump & RELOC_DUMP)
14023         {
14024           if (! dump_section_as_bytes (section, filedata, TRUE))
14025             res = FALSE;
14026         }
14027
14028       if (dump & STRING_DUMP)
14029         {
14030           if (! dump_section_as_strings (section, filedata))
14031             res = FALSE;
14032         }
14033
14034       if (dump & DEBUG_DUMP)
14035         {
14036           if (! display_debug_section (i, section, filedata))
14037             res = FALSE;
14038         }
14039     }
14040
14041   /* Check to see if the user requested a
14042      dump of a section that does not exist.  */
14043   while (i < filedata->num_dump_sects)
14044     {
14045       if (filedata->dump_sects[i])
14046         {
14047           warn (_("Section %d was not dumped because it does not exist!\n"), i);
14048           res = FALSE;
14049         }
14050       i++;
14051     }
14052
14053   return res;
14054 }
14055
14056 static void
14057 process_mips_fpe_exception (int mask)
14058 {
14059   if (mask)
14060     {
14061       bfd_boolean first = TRUE;
14062
14063       if (mask & OEX_FPU_INEX)
14064         fputs ("INEX", stdout), first = FALSE;
14065       if (mask & OEX_FPU_UFLO)
14066         printf ("%sUFLO", first ? "" : "|"), first = FALSE;
14067       if (mask & OEX_FPU_OFLO)
14068         printf ("%sOFLO", first ? "" : "|"), first = FALSE;
14069       if (mask & OEX_FPU_DIV0)
14070         printf ("%sDIV0", first ? "" : "|"), first = FALSE;
14071       if (mask & OEX_FPU_INVAL)
14072         printf ("%sINVAL", first ? "" : "|");
14073     }
14074   else
14075     fputs ("0", stdout);
14076 }
14077
14078 /* Display's the value of TAG at location P.  If TAG is
14079    greater than 0 it is assumed to be an unknown tag, and
14080    a message is printed to this effect.  Otherwise it is
14081    assumed that a message has already been printed.
14082
14083    If the bottom bit of TAG is set it assumed to have a
14084    string value, otherwise it is assumed to have an integer
14085    value.
14086
14087    Returns an updated P pointing to the first unread byte
14088    beyond the end of TAG's value.
14089
14090    Reads at or beyond END will not be made.  */
14091
14092 static unsigned char *
14093 display_tag_value (signed int tag,
14094                    unsigned char * p,
14095                    const unsigned char * const end)
14096 {
14097   unsigned long val;
14098
14099   if (tag > 0)
14100     printf ("  Tag_unknown_%d: ", tag);
14101
14102   if (p >= end)
14103     {
14104       warn (_("<corrupt tag>\n"));
14105     }
14106   else if (tag & 1)
14107     {
14108       /* PR 17531 file: 027-19978-0.004.  */
14109       size_t maxlen = (end - p) - 1;
14110
14111       putchar ('"');
14112       if (maxlen > 0)
14113         {
14114           print_symbol ((int) maxlen, (const char *) p);
14115           p += strnlen ((char *) p, maxlen) + 1;
14116         }
14117       else
14118         {
14119           printf (_("<corrupt string tag>"));
14120           p = (unsigned char *) end;
14121         }
14122       printf ("\"\n");
14123     }
14124   else
14125     {
14126       unsigned int len;
14127
14128       val = read_uleb128 (p, &len, end);
14129       p += len;
14130       printf ("%ld (0x%lx)\n", val, val);
14131     }
14132
14133   assert (p <= end);
14134   return p;
14135 }
14136
14137 /* ARC ABI attributes section.  */
14138
14139 static unsigned char *
14140 display_arc_attribute (unsigned char * p,
14141                        const unsigned char * const end)
14142 {
14143   unsigned int tag;
14144   unsigned int len;
14145   unsigned int val;
14146
14147   tag = read_uleb128 (p, &len, end);
14148   p += len;
14149
14150   switch (tag)
14151     {
14152     case Tag_ARC_PCS_config:
14153       val = read_uleb128 (p, &len, end);
14154       p += len;
14155       printf ("  Tag_ARC_PCS_config: ");
14156       switch (val)
14157         {
14158         case 0:
14159           printf (_("Absent/Non standard\n"));
14160           break;
14161         case 1:
14162           printf (_("Bare metal/mwdt\n"));
14163           break;
14164         case 2:
14165           printf (_("Bare metal/newlib\n"));
14166           break;
14167         case 3:
14168           printf (_("Linux/uclibc\n"));
14169           break;
14170         case 4:
14171           printf (_("Linux/glibc\n"));
14172           break;
14173         default:
14174           printf (_("Unknown\n"));
14175           break;
14176         }
14177       break;
14178
14179     case Tag_ARC_CPU_base:
14180       val = read_uleb128 (p, &len, end);
14181       p += len;
14182       printf ("  Tag_ARC_CPU_base: ");
14183       switch (val)
14184         {
14185         default:
14186         case TAG_CPU_NONE:
14187           printf (_("Absent\n"));
14188           break;
14189         case TAG_CPU_ARC6xx:
14190           printf ("ARC6xx\n");
14191           break;
14192         case TAG_CPU_ARC7xx:
14193           printf ("ARC7xx\n");
14194           break;
14195         case TAG_CPU_ARCEM:
14196           printf ("ARCEM\n");
14197           break;
14198         case TAG_CPU_ARCHS:
14199           printf ("ARCHS\n");
14200           break;
14201         }
14202       break;
14203
14204     case Tag_ARC_CPU_variation:
14205       val = read_uleb128 (p, &len, end);
14206       p += len;
14207       printf ("  Tag_ARC_CPU_variation: ");
14208       switch (val)
14209         {
14210         default:
14211           if (val > 0 && val < 16)
14212               printf ("Core%d\n", val);
14213           else
14214               printf ("Unknown\n");
14215           break;
14216
14217         case 0:
14218           printf (_("Absent\n"));
14219           break;
14220         }
14221       break;
14222
14223     case Tag_ARC_CPU_name:
14224       printf ("  Tag_ARC_CPU_name: ");
14225       p = display_tag_value (-1, p, end);
14226       break;
14227
14228     case Tag_ARC_ABI_rf16:
14229       val = read_uleb128 (p, &len, end);
14230       p += len;
14231       printf ("  Tag_ARC_ABI_rf16: %s\n", val ? _("yes") : _("no"));
14232       break;
14233
14234     case Tag_ARC_ABI_osver:
14235       val = read_uleb128 (p, &len, end);
14236       p += len;
14237       printf ("  Tag_ARC_ABI_osver: v%d\n", val);
14238       break;
14239
14240     case Tag_ARC_ABI_pic:
14241     case Tag_ARC_ABI_sda:
14242       val = read_uleb128 (p, &len, end);
14243       p += len;
14244       printf (tag == Tag_ARC_ABI_sda ? "  Tag_ARC_ABI_sda: "
14245               : "  Tag_ARC_ABI_pic: ");
14246       switch (val)
14247         {
14248         case 0:
14249           printf (_("Absent\n"));
14250           break;
14251         case 1:
14252           printf ("MWDT\n");
14253           break;
14254         case 2:
14255           printf ("GNU\n");
14256           break;
14257         default:
14258           printf (_("Unknown\n"));
14259           break;
14260         }
14261       break;
14262
14263     case Tag_ARC_ABI_tls:
14264       val = read_uleb128 (p, &len, end);
14265       p += len;
14266       printf ("  Tag_ARC_ABI_tls: %s\n", val ? "r25": "none");
14267       break;
14268
14269     case Tag_ARC_ABI_enumsize:
14270       val = read_uleb128 (p, &len, end);
14271       p += len;
14272       printf ("  Tag_ARC_ABI_enumsize: %s\n", val ? _("default") :
14273               _("smallest"));
14274       break;
14275
14276     case Tag_ARC_ABI_exceptions:
14277       val = read_uleb128 (p, &len, end);
14278       p += len;
14279       printf ("  Tag_ARC_ABI_exceptions: %s\n", val ? _("OPTFP")
14280               : _("default"));
14281       break;
14282
14283     case Tag_ARC_ABI_double_size:
14284       val = read_uleb128 (p, &len, end);
14285       p += len;
14286       printf ("  Tag_ARC_ABI_double_size: %d\n", val);
14287       break;
14288
14289     case Tag_ARC_ISA_config:
14290       printf ("  Tag_ARC_ISA_config: ");
14291       p = display_tag_value (-1, p, end);
14292       break;
14293
14294     case Tag_ARC_ISA_apex:
14295       printf ("  Tag_ARC_ISA_apex: ");
14296       p = display_tag_value (-1, p, end);
14297       break;
14298
14299     case Tag_ARC_ISA_mpy_option:
14300       val = read_uleb128 (p, &len, end);
14301       p += len;
14302       printf ("  Tag_ARC_ISA_mpy_option: %d\n", val);
14303       break;
14304
14305     case Tag_ARC_ATR_version:
14306       val = read_uleb128 (p, &len, end);
14307       p += len;
14308       printf ("  Tag_ARC_ATR_version: %d\n", val);
14309       break;
14310
14311     default:
14312       return display_tag_value (tag & 1, p, end);
14313     }
14314
14315   return p;
14316 }
14317
14318 /* ARM EABI attributes section.  */
14319 typedef struct
14320 {
14321   unsigned int tag;
14322   const char * name;
14323   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
14324   unsigned int type;
14325   const char ** table;
14326 } arm_attr_public_tag;
14327
14328 static const char * arm_attr_tag_CPU_arch[] =
14329   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
14330    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "v8-R", "v8-M.baseline",
14331    "v8-M.mainline"};
14332 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
14333 static const char * arm_attr_tag_THUMB_ISA_use[] =
14334   {"No", "Thumb-1", "Thumb-2", "Yes"};
14335 static const char * arm_attr_tag_FP_arch[] =
14336   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
14337    "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
14338 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
14339 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
14340   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
14341    "NEON for ARMv8.1"};
14342 static const char * arm_attr_tag_PCS_config[] =
14343   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
14344    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
14345 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
14346   {"V6", "SB", "TLS", "Unused"};
14347 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
14348   {"Absolute", "PC-relative", "SB-relative", "None"};
14349 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
14350   {"Absolute", "PC-relative", "None"};
14351 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
14352   {"None", "direct", "GOT-indirect"};
14353 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
14354   {"None", "??? 1", "2", "??? 3", "4"};
14355 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
14356 static const char * arm_attr_tag_ABI_FP_denormal[] =
14357   {"Unused", "Needed", "Sign only"};
14358 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
14359 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
14360 static const char * arm_attr_tag_ABI_FP_number_model[] =
14361   {"Unused", "Finite", "RTABI", "IEEE 754"};
14362 static const char * arm_attr_tag_ABI_enum_size[] =
14363   {"Unused", "small", "int", "forced to int"};
14364 static const char * arm_attr_tag_ABI_HardFP_use[] =
14365   {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
14366 static const char * arm_attr_tag_ABI_VFP_args[] =
14367   {"AAPCS", "VFP registers", "custom", "compatible"};
14368 static const char * arm_attr_tag_ABI_WMMX_args[] =
14369   {"AAPCS", "WMMX registers", "custom"};
14370 static const char * arm_attr_tag_ABI_optimization_goals[] =
14371   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14372     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
14373 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
14374   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14375     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
14376 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
14377 static const char * arm_attr_tag_FP_HP_extension[] =
14378   {"Not Allowed", "Allowed"};
14379 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
14380   {"None", "IEEE 754", "Alternative Format"};
14381 static const char * arm_attr_tag_DSP_extension[] =
14382   {"Follow architecture", "Allowed"};
14383 static const char * arm_attr_tag_MPextension_use[] =
14384   {"Not Allowed", "Allowed"};
14385 static const char * arm_attr_tag_DIV_use[] =
14386   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
14387     "Allowed in v7-A with integer division extension"};
14388 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
14389 static const char * arm_attr_tag_Virtualization_use[] =
14390   {"Not Allowed", "TrustZone", "Virtualization Extensions",
14391     "TrustZone and Virtualization Extensions"};
14392 static const char * arm_attr_tag_MPextension_use_legacy[] =
14393   {"Not Allowed", "Allowed"};
14394
14395 #define LOOKUP(id, name) \
14396   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
14397 static arm_attr_public_tag arm_attr_public_tags[] =
14398 {
14399   {4, "CPU_raw_name", 1, NULL},
14400   {5, "CPU_name", 1, NULL},
14401   LOOKUP(6, CPU_arch),
14402   {7, "CPU_arch_profile", 0, NULL},
14403   LOOKUP(8, ARM_ISA_use),
14404   LOOKUP(9, THUMB_ISA_use),
14405   LOOKUP(10, FP_arch),
14406   LOOKUP(11, WMMX_arch),
14407   LOOKUP(12, Advanced_SIMD_arch),
14408   LOOKUP(13, PCS_config),
14409   LOOKUP(14, ABI_PCS_R9_use),
14410   LOOKUP(15, ABI_PCS_RW_data),
14411   LOOKUP(16, ABI_PCS_RO_data),
14412   LOOKUP(17, ABI_PCS_GOT_use),
14413   LOOKUP(18, ABI_PCS_wchar_t),
14414   LOOKUP(19, ABI_FP_rounding),
14415   LOOKUP(20, ABI_FP_denormal),
14416   LOOKUP(21, ABI_FP_exceptions),
14417   LOOKUP(22, ABI_FP_user_exceptions),
14418   LOOKUP(23, ABI_FP_number_model),
14419   {24, "ABI_align_needed", 0, NULL},
14420   {25, "ABI_align_preserved", 0, NULL},
14421   LOOKUP(26, ABI_enum_size),
14422   LOOKUP(27, ABI_HardFP_use),
14423   LOOKUP(28, ABI_VFP_args),
14424   LOOKUP(29, ABI_WMMX_args),
14425   LOOKUP(30, ABI_optimization_goals),
14426   LOOKUP(31, ABI_FP_optimization_goals),
14427   {32, "compatibility", 0, NULL},
14428   LOOKUP(34, CPU_unaligned_access),
14429   LOOKUP(36, FP_HP_extension),
14430   LOOKUP(38, ABI_FP_16bit_format),
14431   LOOKUP(42, MPextension_use),
14432   LOOKUP(44, DIV_use),
14433   LOOKUP(46, DSP_extension),
14434   {64, "nodefaults", 0, NULL},
14435   {65, "also_compatible_with", 0, NULL},
14436   LOOKUP(66, T2EE_use),
14437   {67, "conformance", 1, NULL},
14438   LOOKUP(68, Virtualization_use),
14439   LOOKUP(70, MPextension_use_legacy)
14440 };
14441 #undef LOOKUP
14442
14443 static unsigned char *
14444 display_arm_attribute (unsigned char * p,
14445                        const unsigned char * const end)
14446 {
14447   unsigned int tag;
14448   unsigned int len;
14449   unsigned int val;
14450   arm_attr_public_tag * attr;
14451   unsigned i;
14452   unsigned int type;
14453
14454   tag = read_uleb128 (p, &len, end);
14455   p += len;
14456   attr = NULL;
14457   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
14458     {
14459       if (arm_attr_public_tags[i].tag == tag)
14460         {
14461           attr = &arm_attr_public_tags[i];
14462           break;
14463         }
14464     }
14465
14466   if (attr)
14467     {
14468       printf ("  Tag_%s: ", attr->name);
14469       switch (attr->type)
14470         {
14471         case 0:
14472           switch (tag)
14473             {
14474             case 7: /* Tag_CPU_arch_profile.  */
14475               val = read_uleb128 (p, &len, end);
14476               p += len;
14477               switch (val)
14478                 {
14479                 case 0: printf (_("None\n")); break;
14480                 case 'A': printf (_("Application\n")); break;
14481                 case 'R': printf (_("Realtime\n")); break;
14482                 case 'M': printf (_("Microcontroller\n")); break;
14483                 case 'S': printf (_("Application or Realtime\n")); break;
14484                 default: printf ("??? (%d)\n", val); break;
14485                 }
14486               break;
14487
14488             case 24: /* Tag_align_needed.  */
14489               val = read_uleb128 (p, &len, end);
14490               p += len;
14491               switch (val)
14492                 {
14493                 case 0: printf (_("None\n")); break;
14494                 case 1: printf (_("8-byte\n")); break;
14495                 case 2: printf (_("4-byte\n")); break;
14496                 case 3: printf ("??? 3\n"); break;
14497                 default:
14498                   if (val <= 12)
14499                     printf (_("8-byte and up to %d-byte extended\n"),
14500                             1 << val);
14501                   else
14502                     printf ("??? (%d)\n", val);
14503                   break;
14504                 }
14505               break;
14506
14507             case 25: /* Tag_align_preserved.  */
14508               val = read_uleb128 (p, &len, end);
14509               p += len;
14510               switch (val)
14511                 {
14512                 case 0: printf (_("None\n")); break;
14513                 case 1: printf (_("8-byte, except leaf SP\n")); break;
14514                 case 2: printf (_("8-byte\n")); break;
14515                 case 3: printf ("??? 3\n"); break;
14516                 default:
14517                   if (val <= 12)
14518                     printf (_("8-byte and up to %d-byte extended\n"),
14519                             1 << val);
14520                   else
14521                     printf ("??? (%d)\n", val);
14522                   break;
14523                 }
14524               break;
14525
14526             case 32: /* Tag_compatibility.  */
14527               {
14528                 val = read_uleb128 (p, &len, end);
14529                 p += len;
14530                 printf (_("flag = %d, vendor = "), val);
14531                 if (p < end - 1)
14532                   {
14533                     size_t maxlen = (end - p) - 1;
14534
14535                     print_symbol ((int) maxlen, (const char *) p);
14536                     p += strnlen ((char *) p, maxlen) + 1;
14537                   }
14538                 else
14539                   {
14540                     printf (_("<corrupt>"));
14541                     p = (unsigned char *) end;
14542                   }
14543                 putchar ('\n');
14544               }
14545               break;
14546
14547             case 64: /* Tag_nodefaults.  */
14548               /* PR 17531: file: 001-505008-0.01.  */
14549               if (p < end)
14550                 p++;
14551               printf (_("True\n"));
14552               break;
14553
14554             case 65: /* Tag_also_compatible_with.  */
14555               val = read_uleb128 (p, &len, end);
14556               p += len;
14557               if (val == 6 /* Tag_CPU_arch.  */)
14558                 {
14559                   val = read_uleb128 (p, &len, end);
14560                   p += len;
14561                   if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
14562                     printf ("??? (%d)\n", val);
14563                   else
14564                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
14565                 }
14566               else
14567                 printf ("???\n");
14568               while (p < end && *(p++) != '\0' /* NUL terminator.  */)
14569                 ;
14570               break;
14571
14572             default:
14573               printf (_("<unknown: %d>\n"), tag);
14574               break;
14575             }
14576           return p;
14577
14578         case 1:
14579           return display_tag_value (-1, p, end);
14580         case 2:
14581           return display_tag_value (0, p, end);
14582
14583         default:
14584           assert (attr->type & 0x80);
14585           val = read_uleb128 (p, &len, end);
14586           p += len;
14587           type = attr->type & 0x7f;
14588           if (val >= type)
14589             printf ("??? (%d)\n", val);
14590           else
14591             printf ("%s\n", attr->table[val]);
14592           return p;
14593         }
14594     }
14595
14596   return display_tag_value (tag, p, end);
14597 }
14598
14599 static unsigned char *
14600 display_gnu_attribute (unsigned char * p,
14601                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const),
14602                        const unsigned char * const end)
14603 {
14604   int tag;
14605   unsigned int len;
14606   unsigned int val;
14607
14608   tag = read_uleb128 (p, &len, end);
14609   p += len;
14610
14611   /* Tag_compatibility is the only generic GNU attribute defined at
14612      present.  */
14613   if (tag == 32)
14614     {
14615       val = read_uleb128 (p, &len, end);
14616       p += len;
14617
14618       printf (_("flag = %d, vendor = "), val);
14619       if (p == end)
14620         {
14621           printf (_("<corrupt>\n"));
14622           warn (_("corrupt vendor attribute\n"));
14623         }
14624       else
14625         {
14626           if (p < end - 1)
14627             {
14628               size_t maxlen = (end - p) - 1;
14629
14630               print_symbol ((int) maxlen, (const char *) p);
14631               p += strnlen ((char *) p, maxlen) + 1;
14632             }
14633           else
14634             {
14635               printf (_("<corrupt>"));
14636               p = (unsigned char *) end;
14637             }
14638           putchar ('\n');
14639         }
14640       return p;
14641     }
14642
14643   if ((tag & 2) == 0 && display_proc_gnu_attribute)
14644     return display_proc_gnu_attribute (p, tag, end);
14645
14646   return display_tag_value (tag, p, end);
14647 }
14648
14649 static unsigned char *
14650 display_power_gnu_attribute (unsigned char * p,
14651                              unsigned int tag,
14652                              const unsigned char * const end)
14653 {
14654   unsigned int len;
14655   unsigned int val;
14656
14657   if (tag == Tag_GNU_Power_ABI_FP)
14658     {
14659       val = read_uleb128 (p, &len, end);
14660       p += len;
14661       printf ("  Tag_GNU_Power_ABI_FP: ");
14662       if (len == 0)
14663         {
14664           printf (_("<corrupt>\n"));
14665           return p;
14666         }
14667
14668       if (val > 15)
14669         printf ("(%#x), ", val);
14670
14671       switch (val & 3)
14672         {
14673         case 0:
14674           printf (_("unspecified hard/soft float, "));
14675           break;
14676         case 1:
14677           printf (_("hard float, "));
14678           break;
14679         case 2:
14680           printf (_("soft float, "));
14681           break;
14682         case 3:
14683           printf (_("single-precision hard float, "));
14684           break;
14685         }
14686
14687       switch (val & 0xC)
14688         {
14689         case 0:
14690           printf (_("unspecified long double\n"));
14691           break;
14692         case 4:
14693           printf (_("128-bit IBM long double\n"));
14694           break;
14695         case 8:
14696           printf (_("64-bit long double\n"));
14697           break;
14698         case 12:
14699           printf (_("128-bit IEEE long double\n"));
14700           break;
14701         }
14702       return p;
14703     }
14704
14705   if (tag == Tag_GNU_Power_ABI_Vector)
14706     {
14707       val = read_uleb128 (p, &len, end);
14708       p += len;
14709       printf ("  Tag_GNU_Power_ABI_Vector: ");
14710       if (len == 0)
14711         {
14712           printf (_("<corrupt>\n"));
14713           return p;
14714         }
14715
14716       if (val > 3)
14717         printf ("(%#x), ", val);
14718
14719       switch (val & 3)
14720         {
14721         case 0:
14722           printf (_("unspecified\n"));
14723           break;
14724         case 1:
14725           printf (_("generic\n"));
14726           break;
14727         case 2:
14728           printf ("AltiVec\n");
14729           break;
14730         case 3:
14731           printf ("SPE\n");
14732           break;
14733         }
14734       return p;
14735     }
14736
14737   if (tag == Tag_GNU_Power_ABI_Struct_Return)
14738     {
14739       val = read_uleb128 (p, &len, end);
14740       p += len;
14741       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
14742       if (len == 0)
14743         {
14744           printf (_("<corrupt>\n"));
14745           return p;
14746         }
14747
14748       if (val > 2)
14749         printf ("(%#x), ", val);
14750
14751       switch (val & 3)
14752         {
14753         case 0:
14754           printf (_("unspecified\n"));
14755           break;
14756         case 1:
14757           printf ("r3/r4\n");
14758           break;
14759         case 2:
14760           printf (_("memory\n"));
14761           break;
14762         case 3:
14763           printf ("???\n");
14764           break;
14765         }
14766       return p;
14767     }
14768
14769   return display_tag_value (tag & 1, p, end);
14770 }
14771
14772 static unsigned char *
14773 display_s390_gnu_attribute (unsigned char * p,
14774                             unsigned int tag,
14775                             const unsigned char * const end)
14776 {
14777   unsigned int len;
14778   int val;
14779
14780   if (tag == Tag_GNU_S390_ABI_Vector)
14781     {
14782       val = read_uleb128 (p, &len, end);
14783       p += len;
14784       printf ("  Tag_GNU_S390_ABI_Vector: ");
14785
14786       switch (val)
14787         {
14788         case 0:
14789           printf (_("any\n"));
14790           break;
14791         case 1:
14792           printf (_("software\n"));
14793           break;
14794         case 2:
14795           printf (_("hardware\n"));
14796           break;
14797         default:
14798           printf ("??? (%d)\n", val);
14799           break;
14800         }
14801       return p;
14802    }
14803
14804   return display_tag_value (tag & 1, p, end);
14805 }
14806
14807 static void
14808 display_sparc_hwcaps (unsigned int mask)
14809 {
14810   if (mask)
14811     {
14812       bfd_boolean first = TRUE;
14813
14814       if (mask & ELF_SPARC_HWCAP_MUL32)
14815         fputs ("mul32", stdout), first = FALSE;
14816       if (mask & ELF_SPARC_HWCAP_DIV32)
14817         printf ("%sdiv32", first ? "" : "|"), first = FALSE;
14818       if (mask & ELF_SPARC_HWCAP_FSMULD)
14819         printf ("%sfsmuld", first ? "" : "|"), first = FALSE;
14820       if (mask & ELF_SPARC_HWCAP_V8PLUS)
14821         printf ("%sv8plus", first ? "" : "|"), first = FALSE;
14822       if (mask & ELF_SPARC_HWCAP_POPC)
14823         printf ("%spopc", first ? "" : "|"), first = FALSE;
14824       if (mask & ELF_SPARC_HWCAP_VIS)
14825         printf ("%svis", first ? "" : "|"), first = FALSE;
14826       if (mask & ELF_SPARC_HWCAP_VIS2)
14827         printf ("%svis2", first ? "" : "|"), first = FALSE;
14828       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
14829         printf ("%sASIBlkInit", first ? "" : "|"), first = FALSE;
14830       if (mask & ELF_SPARC_HWCAP_FMAF)
14831         printf ("%sfmaf", first ? "" : "|"), first = FALSE;
14832       if (mask & ELF_SPARC_HWCAP_VIS3)
14833         printf ("%svis3", first ? "" : "|"), first = FALSE;
14834       if (mask & ELF_SPARC_HWCAP_HPC)
14835         printf ("%shpc", first ? "" : "|"), first = FALSE;
14836       if (mask & ELF_SPARC_HWCAP_RANDOM)
14837         printf ("%srandom", first ? "" : "|"), first = FALSE;
14838       if (mask & ELF_SPARC_HWCAP_TRANS)
14839         printf ("%strans", first ? "" : "|"), first = FALSE;
14840       if (mask & ELF_SPARC_HWCAP_FJFMAU)
14841         printf ("%sfjfmau", first ? "" : "|"), first = FALSE;
14842       if (mask & ELF_SPARC_HWCAP_IMA)
14843         printf ("%sima", first ? "" : "|"), first = FALSE;
14844       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
14845         printf ("%scspare", first ? "" : "|"), first = FALSE;
14846     }
14847   else
14848     fputc ('0', stdout);
14849   fputc ('\n', stdout);
14850 }
14851
14852 static void
14853 display_sparc_hwcaps2 (unsigned int mask)
14854 {
14855   if (mask)
14856     {
14857       bfd_boolean first = TRUE;
14858
14859       if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
14860         fputs ("fjathplus", stdout), first = FALSE;
14861       if (mask & ELF_SPARC_HWCAP2_VIS3B)
14862         printf ("%svis3b", first ? "" : "|"), first = FALSE;
14863       if (mask & ELF_SPARC_HWCAP2_ADP)
14864         printf ("%sadp", first ? "" : "|"), first = FALSE;
14865       if (mask & ELF_SPARC_HWCAP2_SPARC5)
14866         printf ("%ssparc5", first ? "" : "|"), first = FALSE;
14867       if (mask & ELF_SPARC_HWCAP2_MWAIT)
14868         printf ("%smwait", first ? "" : "|"), first = FALSE;
14869       if (mask & ELF_SPARC_HWCAP2_XMPMUL)
14870         printf ("%sxmpmul", first ? "" : "|"), first = FALSE;
14871       if (mask & ELF_SPARC_HWCAP2_XMONT)
14872         printf ("%sxmont2", first ? "" : "|"), first = FALSE;
14873       if (mask & ELF_SPARC_HWCAP2_NSEC)
14874         printf ("%snsec", first ? "" : "|"), first = FALSE;
14875       if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
14876         printf ("%sfjathhpc", first ? "" : "|"), first = FALSE;
14877       if (mask & ELF_SPARC_HWCAP2_FJDES)
14878         printf ("%sfjdes", first ? "" : "|"), first = FALSE;
14879       if (mask & ELF_SPARC_HWCAP2_FJAES)
14880         printf ("%sfjaes", first ? "" : "|"), first = FALSE;
14881     }
14882   else
14883     fputc ('0', stdout);
14884   fputc ('\n', stdout);
14885 }
14886
14887 static unsigned char *
14888 display_sparc_gnu_attribute (unsigned char * p,
14889                              unsigned int tag,
14890                              const unsigned char * const end)
14891 {
14892   unsigned int len;
14893   int val;
14894
14895   if (tag == Tag_GNU_Sparc_HWCAPS)
14896     {
14897       val = read_uleb128 (p, &len, end);
14898       p += len;
14899       printf ("  Tag_GNU_Sparc_HWCAPS: ");
14900       display_sparc_hwcaps (val);
14901       return p;
14902     }
14903   if (tag == Tag_GNU_Sparc_HWCAPS2)
14904     {
14905       val = read_uleb128 (p, &len, end);
14906       p += len;
14907       printf ("  Tag_GNU_Sparc_HWCAPS2: ");
14908       display_sparc_hwcaps2 (val);
14909       return p;
14910     }
14911
14912   return display_tag_value (tag, p, end);
14913 }
14914
14915 static void
14916 print_mips_fp_abi_value (unsigned int val)
14917 {
14918   switch (val)
14919     {
14920     case Val_GNU_MIPS_ABI_FP_ANY:
14921       printf (_("Hard or soft float\n"));
14922       break;
14923     case Val_GNU_MIPS_ABI_FP_DOUBLE:
14924       printf (_("Hard float (double precision)\n"));
14925       break;
14926     case Val_GNU_MIPS_ABI_FP_SINGLE:
14927       printf (_("Hard float (single precision)\n"));
14928       break;
14929     case Val_GNU_MIPS_ABI_FP_SOFT:
14930       printf (_("Soft float\n"));
14931       break;
14932     case Val_GNU_MIPS_ABI_FP_OLD_64:
14933       printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
14934       break;
14935     case Val_GNU_MIPS_ABI_FP_XX:
14936       printf (_("Hard float (32-bit CPU, Any FPU)\n"));
14937       break;
14938     case Val_GNU_MIPS_ABI_FP_64:
14939       printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
14940       break;
14941     case Val_GNU_MIPS_ABI_FP_64A:
14942       printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
14943       break;
14944     case Val_GNU_MIPS_ABI_FP_NAN2008:
14945       printf (_("NaN 2008 compatibility\n"));
14946       break;
14947     default:
14948       printf ("??? (%d)\n", val);
14949       break;
14950     }
14951 }
14952
14953 static unsigned char *
14954 display_mips_gnu_attribute (unsigned char * p,
14955                             unsigned int tag,
14956                             const unsigned char * const end)
14957 {
14958   if (tag == Tag_GNU_MIPS_ABI_FP)
14959     {
14960       unsigned int len;
14961       unsigned int val;
14962
14963       val = read_uleb128 (p, &len, end);
14964       p += len;
14965       printf ("  Tag_GNU_MIPS_ABI_FP: ");
14966
14967       print_mips_fp_abi_value (val);
14968
14969       return p;
14970    }
14971
14972   if (tag == Tag_GNU_MIPS_ABI_MSA)
14973     {
14974       unsigned int len;
14975       unsigned int val;
14976
14977       val = read_uleb128 (p, &len, end);
14978       p += len;
14979       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
14980
14981       switch (val)
14982         {
14983         case Val_GNU_MIPS_ABI_MSA_ANY:
14984           printf (_("Any MSA or not\n"));
14985           break;
14986         case Val_GNU_MIPS_ABI_MSA_128:
14987           printf (_("128-bit MSA\n"));
14988           break;
14989         default:
14990           printf ("??? (%d)\n", val);
14991           break;
14992         }
14993       return p;
14994     }
14995
14996   return display_tag_value (tag & 1, p, end);
14997 }
14998
14999 static unsigned char *
15000 display_tic6x_attribute (unsigned char * p,
15001                          const unsigned char * const end)
15002 {
15003   unsigned int tag;
15004   unsigned int len;
15005   int val;
15006
15007   tag = read_uleb128 (p, &len, end);
15008   p += len;
15009
15010   switch (tag)
15011     {
15012     case Tag_ISA:
15013       val = read_uleb128 (p, &len, end);
15014       p += len;
15015       printf ("  Tag_ISA: ");
15016
15017       switch (val)
15018         {
15019         case C6XABI_Tag_ISA_none:
15020           printf (_("None\n"));
15021           break;
15022         case C6XABI_Tag_ISA_C62X:
15023           printf ("C62x\n");
15024           break;
15025         case C6XABI_Tag_ISA_C67X:
15026           printf ("C67x\n");
15027           break;
15028         case C6XABI_Tag_ISA_C67XP:
15029           printf ("C67x+\n");
15030           break;
15031         case C6XABI_Tag_ISA_C64X:
15032           printf ("C64x\n");
15033           break;
15034         case C6XABI_Tag_ISA_C64XP:
15035           printf ("C64x+\n");
15036           break;
15037         case C6XABI_Tag_ISA_C674X:
15038           printf ("C674x\n");
15039           break;
15040         default:
15041           printf ("??? (%d)\n", val);
15042           break;
15043         }
15044       return p;
15045
15046     case Tag_ABI_wchar_t:
15047       val = read_uleb128 (p, &len, end);
15048       p += len;
15049       printf ("  Tag_ABI_wchar_t: ");
15050       switch (val)
15051         {
15052         case 0:
15053           printf (_("Not used\n"));
15054           break;
15055         case 1:
15056           printf (_("2 bytes\n"));
15057           break;
15058         case 2:
15059           printf (_("4 bytes\n"));
15060           break;
15061         default:
15062           printf ("??? (%d)\n", val);
15063           break;
15064         }
15065       return p;
15066
15067     case Tag_ABI_stack_align_needed:
15068       val = read_uleb128 (p, &len, end);
15069       p += len;
15070       printf ("  Tag_ABI_stack_align_needed: ");
15071       switch (val)
15072         {
15073         case 0:
15074           printf (_("8-byte\n"));
15075           break;
15076         case 1:
15077           printf (_("16-byte\n"));
15078           break;
15079         default:
15080           printf ("??? (%d)\n", val);
15081           break;
15082         }
15083       return p;
15084
15085     case Tag_ABI_stack_align_preserved:
15086       val = read_uleb128 (p, &len, end);
15087       p += len;
15088       printf ("  Tag_ABI_stack_align_preserved: ");
15089       switch (val)
15090         {
15091         case 0:
15092           printf (_("8-byte\n"));
15093           break;
15094         case 1:
15095           printf (_("16-byte\n"));
15096           break;
15097         default:
15098           printf ("??? (%d)\n", val);
15099           break;
15100         }
15101       return p;
15102
15103     case Tag_ABI_DSBT:
15104       val = read_uleb128 (p, &len, end);
15105       p += len;
15106       printf ("  Tag_ABI_DSBT: ");
15107       switch (val)
15108         {
15109         case 0:
15110           printf (_("DSBT addressing not used\n"));
15111           break;
15112         case 1:
15113           printf (_("DSBT addressing used\n"));
15114           break;
15115         default:
15116           printf ("??? (%d)\n", val);
15117           break;
15118         }
15119       return p;
15120
15121     case Tag_ABI_PID:
15122       val = read_uleb128 (p, &len, end);
15123       p += len;
15124       printf ("  Tag_ABI_PID: ");
15125       switch (val)
15126         {
15127         case 0:
15128           printf (_("Data addressing position-dependent\n"));
15129           break;
15130         case 1:
15131           printf (_("Data addressing position-independent, GOT near DP\n"));
15132           break;
15133         case 2:
15134           printf (_("Data addressing position-independent, GOT far from DP\n"));
15135           break;
15136         default:
15137           printf ("??? (%d)\n", val);
15138           break;
15139         }
15140       return p;
15141
15142     case Tag_ABI_PIC:
15143       val = read_uleb128 (p, &len, end);
15144       p += len;
15145       printf ("  Tag_ABI_PIC: ");
15146       switch (val)
15147         {
15148         case 0:
15149           printf (_("Code addressing position-dependent\n"));
15150           break;
15151         case 1:
15152           printf (_("Code addressing position-independent\n"));
15153           break;
15154         default:
15155           printf ("??? (%d)\n", val);
15156           break;
15157         }
15158       return p;
15159
15160     case Tag_ABI_array_object_alignment:
15161       val = read_uleb128 (p, &len, end);
15162       p += len;
15163       printf ("  Tag_ABI_array_object_alignment: ");
15164       switch (val)
15165         {
15166         case 0:
15167           printf (_("8-byte\n"));
15168           break;
15169         case 1:
15170           printf (_("4-byte\n"));
15171           break;
15172         case 2:
15173           printf (_("16-byte\n"));
15174           break;
15175         default:
15176           printf ("??? (%d)\n", val);
15177           break;
15178         }
15179       return p;
15180
15181     case Tag_ABI_array_object_align_expected:
15182       val = read_uleb128 (p, &len, end);
15183       p += len;
15184       printf ("  Tag_ABI_array_object_align_expected: ");
15185       switch (val)
15186         {
15187         case 0:
15188           printf (_("8-byte\n"));
15189           break;
15190         case 1:
15191           printf (_("4-byte\n"));
15192           break;
15193         case 2:
15194           printf (_("16-byte\n"));
15195           break;
15196         default:
15197           printf ("??? (%d)\n", val);
15198           break;
15199         }
15200       return p;
15201
15202     case Tag_ABI_compatibility:
15203       {
15204         val = read_uleb128 (p, &len, end);
15205         p += len;
15206         printf ("  Tag_ABI_compatibility: ");
15207         printf (_("flag = %d, vendor = "), val);
15208         if (p < end - 1)
15209           {
15210             size_t maxlen = (end - p) - 1;
15211
15212             print_symbol ((int) maxlen, (const char *) p);
15213             p += strnlen ((char *) p, maxlen) + 1;
15214           }
15215         else
15216           {
15217             printf (_("<corrupt>"));
15218             p = (unsigned char *) end;
15219           }
15220         putchar ('\n');
15221         return p;
15222       }
15223
15224     case Tag_ABI_conformance:
15225       {
15226         printf ("  Tag_ABI_conformance: \"");
15227         if (p < end - 1)
15228           {
15229             size_t maxlen = (end - p) - 1;
15230
15231             print_symbol ((int) maxlen, (const char *) p);
15232             p += strnlen ((char *) p, maxlen) + 1;
15233           }
15234         else
15235           {
15236             printf (_("<corrupt>"));
15237             p = (unsigned char *) end;
15238           }
15239         printf ("\"\n");
15240         return p;
15241       }
15242     }
15243
15244   return display_tag_value (tag, p, end);
15245 }
15246
15247 static void
15248 display_raw_attribute (unsigned char * p, unsigned char const * const end)
15249 {
15250   unsigned long addr = 0;
15251   size_t bytes = end - p;
15252
15253   assert (end >= p);
15254   while (bytes)
15255     {
15256       int j;
15257       int k;
15258       int lbytes = (bytes > 16 ? 16 : bytes);
15259
15260       printf ("  0x%8.8lx ", addr);
15261
15262       for (j = 0; j < 16; j++)
15263         {
15264           if (j < lbytes)
15265             printf ("%2.2x", p[j]);
15266           else
15267             printf ("  ");
15268
15269           if ((j & 3) == 3)
15270             printf (" ");
15271         }
15272
15273       for (j = 0; j < lbytes; j++)
15274         {
15275           k = p[j];
15276           if (k >= ' ' && k < 0x7f)
15277             printf ("%c", k);
15278           else
15279             printf (".");
15280         }
15281
15282       putchar ('\n');
15283
15284       p  += lbytes;
15285       bytes -= lbytes;
15286       addr += lbytes;
15287     }
15288
15289   putchar ('\n');
15290 }
15291
15292 static unsigned char *
15293 display_msp430x_attribute (unsigned char * p,
15294                            const unsigned char * const end)
15295 {
15296   unsigned int len;
15297   unsigned int val;
15298   unsigned int tag;
15299
15300   tag = read_uleb128 (p, & len, end);
15301   p += len;
15302
15303   switch (tag)
15304     {
15305     case OFBA_MSPABI_Tag_ISA:
15306       val = read_uleb128 (p, &len, end);
15307       p += len;
15308       printf ("  Tag_ISA: ");
15309       switch (val)
15310         {
15311         case 0: printf (_("None\n")); break;
15312         case 1: printf (_("MSP430\n")); break;
15313         case 2: printf (_("MSP430X\n")); break;
15314         default: printf ("??? (%d)\n", val); break;
15315         }
15316       break;
15317
15318     case OFBA_MSPABI_Tag_Code_Model:
15319       val = read_uleb128 (p, &len, end);
15320       p += len;
15321       printf ("  Tag_Code_Model: ");
15322       switch (val)
15323         {
15324         case 0: printf (_("None\n")); break;
15325         case 1: printf (_("Small\n")); break;
15326         case 2: printf (_("Large\n")); break;
15327         default: printf ("??? (%d)\n", val); break;
15328         }
15329       break;
15330
15331     case OFBA_MSPABI_Tag_Data_Model:
15332       val = read_uleb128 (p, &len, end);
15333       p += len;
15334       printf ("  Tag_Data_Model: ");
15335       switch (val)
15336         {
15337         case 0: printf (_("None\n")); break;
15338         case 1: printf (_("Small\n")); break;
15339         case 2: printf (_("Large\n")); break;
15340         case 3: printf (_("Restricted Large\n")); break;
15341         default: printf ("??? (%d)\n", val); break;
15342         }
15343       break;
15344
15345     default:
15346       printf (_("  <unknown tag %d>: "), tag);
15347
15348       if (tag & 1)
15349         {
15350           putchar ('"');
15351           if (p < end - 1)
15352             {
15353               size_t maxlen = (end - p) - 1;
15354
15355               print_symbol ((int) maxlen, (const char *) p);
15356               p += strnlen ((char *) p, maxlen) + 1;
15357             }
15358           else
15359             {
15360               printf (_("<corrupt>"));
15361               p = (unsigned char *) end;
15362             }
15363           printf ("\"\n");
15364         }
15365       else
15366         {
15367           val = read_uleb128 (p, &len, end);
15368           p += len;
15369           printf ("%d (0x%x)\n", val, val);
15370         }
15371       break;
15372    }
15373
15374   assert (p <= end);
15375   return p;
15376 }
15377
15378 struct riscv_attr_tag_t {
15379   const char *name;
15380   int tag;
15381 };
15382
15383 static struct riscv_attr_tag_t riscv_attr_tag[] =
15384 {
15385 #define T(tag) {"Tag_RISCV_" #tag, Tag_RISCV_##tag}
15386   T(arch),
15387   T(priv_spec),
15388   T(priv_spec_minor),
15389   T(priv_spec_revision),
15390   T(unaligned_access),
15391   T(stack_align),
15392 #undef T
15393 };
15394
15395 static unsigned char *
15396 display_riscv_attribute (unsigned char *p,
15397                          const unsigned char * const end)
15398 {
15399   unsigned int len;
15400   int val;
15401   int tag;
15402   struct riscv_attr_tag_t *attr = NULL;
15403   unsigned i;
15404
15405   tag = read_uleb128 (p, &len, end);
15406   p += len;
15407
15408   /* Find the name of attribute. */
15409   for (i = 0; i < ARRAY_SIZE (riscv_attr_tag); i++)
15410     {
15411       if (riscv_attr_tag[i].tag == tag)
15412         {
15413           attr = &riscv_attr_tag[i];
15414           break;
15415         }
15416     }
15417
15418   if (attr)
15419     printf ("  %s: ", attr->name);
15420   else
15421     return display_tag_value (tag, p, end);
15422
15423   switch (tag)
15424     {
15425     case Tag_RISCV_priv_spec:
15426     case Tag_RISCV_priv_spec_minor:
15427     case Tag_RISCV_priv_spec_revision:
15428       val = read_uleb128 (p, &len, end);
15429       p += len;
15430       printf (_("%d\n"), val);
15431       break;
15432     case Tag_RISCV_unaligned_access:
15433       val = read_uleb128 (p, &len, end);
15434       p += len;
15435       switch (val)
15436         {
15437         case 0:
15438           printf (_("No unaligned access\n"));
15439           break;
15440         case 1:
15441           printf (_("Unaligned access\n"));
15442           break;
15443         }
15444       break;
15445     case Tag_RISCV_stack_align:
15446       val = read_uleb128 (p, &len, end);
15447       p += len;
15448       printf (_("%d-bytes\n"), val);
15449       break;
15450     case Tag_RISCV_arch:
15451       p = display_tag_value (-1, p, end);
15452       break;
15453     default:
15454       return display_tag_value (tag, p, end);
15455     }
15456
15457   return p;
15458 }
15459
15460 static bfd_boolean
15461 process_attributes (Filedata * filedata,
15462                     const char * public_name,
15463                     unsigned int proc_type,
15464                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
15465                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const))
15466 {
15467   Elf_Internal_Shdr * sect;
15468   unsigned i;
15469   bfd_boolean res = TRUE;
15470
15471   /* Find the section header so that we get the size.  */
15472   for (i = 0, sect = filedata->section_headers;
15473        i < filedata->file_header.e_shnum;
15474        i++, sect++)
15475     {
15476       unsigned char * contents;
15477       unsigned char * p;
15478
15479       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
15480         continue;
15481
15482       contents = (unsigned char *) get_data (NULL, filedata, sect->sh_offset, 1,
15483                                              sect->sh_size, _("attributes"));
15484       if (contents == NULL)
15485         {
15486           res = FALSE;
15487           continue;
15488         }
15489
15490       p = contents;
15491       /* The first character is the version of the attributes.
15492          Currently only version 1, (aka 'A') is recognised here.  */
15493       if (*p != 'A')
15494         {
15495           printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p);
15496           res = FALSE;
15497         }
15498       else
15499         {
15500           bfd_vma section_len;
15501
15502           section_len = sect->sh_size - 1;
15503           p++;
15504
15505           while (section_len > 0)
15506             {
15507               bfd_vma attr_len;
15508               unsigned int namelen;
15509               bfd_boolean public_section;
15510               bfd_boolean gnu_section;
15511
15512               if (section_len <= 4)
15513                 {
15514                   error (_("Tag section ends prematurely\n"));
15515                   res = FALSE;
15516                   break;
15517                 }
15518               attr_len = byte_get (p, 4);
15519               p += 4;
15520
15521               if (attr_len > section_len)
15522                 {
15523                   error (_("Bad attribute length (%u > %u)\n"),
15524                           (unsigned) attr_len, (unsigned) section_len);
15525                   attr_len = section_len;
15526                   res = FALSE;
15527                 }
15528               /* PR 17531: file: 001-101425-0.004  */
15529               else if (attr_len < 5)
15530                 {
15531                   error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
15532                   res = FALSE;
15533                   break;
15534                 }
15535
15536               section_len -= attr_len;
15537               attr_len -= 4;
15538
15539               namelen = strnlen ((char *) p, attr_len) + 1;
15540               if (namelen == 0 || namelen >= attr_len)
15541                 {
15542                   error (_("Corrupt attribute section name\n"));
15543                   res = FALSE;
15544                   break;
15545                 }
15546
15547               printf (_("Attribute Section: "));
15548               print_symbol (INT_MAX, (const char *) p);
15549               putchar ('\n');
15550
15551               if (public_name && streq ((char *) p, public_name))
15552                 public_section = TRUE;
15553               else
15554                 public_section = FALSE;
15555
15556               if (streq ((char *) p, "gnu"))
15557                 gnu_section = TRUE;
15558               else
15559                 gnu_section = FALSE;
15560
15561               p += namelen;
15562               attr_len -= namelen;
15563
15564               while (attr_len > 0 && p < contents + sect->sh_size)
15565                 {
15566                   int tag;
15567                   int val;
15568                   bfd_vma size;
15569                   unsigned char * end;
15570
15571                   /* PR binutils/17531: Safe handling of corrupt files.  */
15572                   if (attr_len < 6)
15573                     {
15574                       error (_("Unused bytes at end of section\n"));
15575                       res = FALSE;
15576                       section_len = 0;
15577                       break;
15578                     }
15579
15580                   tag = *(p++);
15581                   size = byte_get (p, 4);
15582                   if (size > attr_len)
15583                     {
15584                       error (_("Bad subsection length (%u > %u)\n"),
15585                               (unsigned) size, (unsigned) attr_len);
15586                       res = FALSE;
15587                       size = attr_len;
15588                     }
15589                   /* PR binutils/17531: Safe handling of corrupt files.  */
15590                   if (size < 6)
15591                     {
15592                       error (_("Bad subsection length (%u < 6)\n"),
15593                               (unsigned) size);
15594                       res = FALSE;
15595                       section_len = 0;
15596                       break;
15597                     }
15598
15599                   attr_len -= size;
15600                   end = p + size - 1;
15601                   assert (end <= contents + sect->sh_size);
15602                   p += 4;
15603
15604                   switch (tag)
15605                     {
15606                     case 1:
15607                       printf (_("File Attributes\n"));
15608                       break;
15609                     case 2:
15610                       printf (_("Section Attributes:"));
15611                       goto do_numlist;
15612                     case 3:
15613                       printf (_("Symbol Attributes:"));
15614                       /* Fall through.  */
15615                     do_numlist:
15616                       for (;;)
15617                         {
15618                           unsigned int j;
15619
15620                           val = read_uleb128 (p, &j, end);
15621                           p += j;
15622                           if (val == 0)
15623                             break;
15624                           printf (" %d", val);
15625                         }
15626                       printf ("\n");
15627                       break;
15628                     default:
15629                       printf (_("Unknown tag: %d\n"), tag);
15630                       public_section = FALSE;
15631                       break;
15632                     }
15633
15634                   if (public_section && display_pub_attribute != NULL)
15635                     {
15636                       while (p < end)
15637                         p = display_pub_attribute (p, end);
15638                       assert (p == end);
15639                     }
15640                   else if (gnu_section && display_proc_gnu_attribute != NULL)
15641                     {
15642                       while (p < end)
15643                         p = display_gnu_attribute (p,
15644                                                    display_proc_gnu_attribute,
15645                                                    end);
15646                       assert (p == end);
15647                     }
15648                   else if (p < end)
15649                     {
15650                       printf (_("  Unknown attribute:\n"));
15651                       display_raw_attribute (p, end);
15652                       p = end;
15653                     }
15654                   else
15655                     attr_len = 0;
15656                 }
15657             }
15658         }
15659
15660       free (contents);
15661     }
15662
15663   return res;
15664 }
15665
15666 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
15667    Print the Address, Access and Initial fields of an entry at VMA ADDR
15668    and return the VMA of the next entry, or -1 if there was a problem.
15669    Does not read from DATA_END or beyond.  */
15670
15671 static bfd_vma
15672 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
15673                       unsigned char * data_end)
15674 {
15675   printf ("  ");
15676   print_vma (addr, LONG_HEX);
15677   printf (" ");
15678   if (addr < pltgot + 0xfff0)
15679     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
15680   else
15681     printf ("%10s", "");
15682   printf (" ");
15683   if (data == NULL)
15684     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15685   else
15686     {
15687       bfd_vma entry;
15688       unsigned char * from = data + addr - pltgot;
15689
15690       if (from + (is_32bit_elf ? 4 : 8) > data_end)
15691         {
15692           warn (_("MIPS GOT entry extends beyond the end of available data\n"));
15693           printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
15694           return (bfd_vma) -1;
15695         }
15696       else
15697         {
15698           entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15699           print_vma (entry, LONG_HEX);
15700         }
15701     }
15702   return addr + (is_32bit_elf ? 4 : 8);
15703 }
15704
15705 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
15706    PLTGOT.  Print the Address and Initial fields of an entry at VMA
15707    ADDR and return the VMA of the next entry.  */
15708
15709 static bfd_vma
15710 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
15711 {
15712   printf ("  ");
15713   print_vma (addr, LONG_HEX);
15714   printf (" ");
15715   if (data == NULL)
15716     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15717   else
15718     {
15719       bfd_vma entry;
15720
15721       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15722       print_vma (entry, LONG_HEX);
15723     }
15724   return addr + (is_32bit_elf ? 4 : 8);
15725 }
15726
15727 static void
15728 print_mips_ases (unsigned int mask)
15729 {
15730   if (mask & AFL_ASE_DSP)
15731     fputs ("\n\tDSP ASE", stdout);
15732   if (mask & AFL_ASE_DSPR2)
15733     fputs ("\n\tDSP R2 ASE", stdout);
15734   if (mask & AFL_ASE_DSPR3)
15735     fputs ("\n\tDSP R3 ASE", stdout);
15736   if (mask & AFL_ASE_EVA)
15737     fputs ("\n\tEnhanced VA Scheme", stdout);
15738   if (mask & AFL_ASE_MCU)
15739     fputs ("\n\tMCU (MicroController) ASE", stdout);
15740   if (mask & AFL_ASE_MDMX)
15741     fputs ("\n\tMDMX ASE", stdout);
15742   if (mask & AFL_ASE_MIPS3D)
15743     fputs ("\n\tMIPS-3D ASE", stdout);
15744   if (mask & AFL_ASE_MT)
15745     fputs ("\n\tMT ASE", stdout);
15746   if (mask & AFL_ASE_SMARTMIPS)
15747     fputs ("\n\tSmartMIPS ASE", stdout);
15748   if (mask & AFL_ASE_VIRT)
15749     fputs ("\n\tVZ ASE", stdout);
15750   if (mask & AFL_ASE_MSA)
15751     fputs ("\n\tMSA ASE", stdout);
15752   if (mask & AFL_ASE_MIPS16)
15753     fputs ("\n\tMIPS16 ASE", stdout);
15754   if (mask & AFL_ASE_MICROMIPS)
15755     fputs ("\n\tMICROMIPS ASE", stdout);
15756   if (mask & AFL_ASE_XPA)
15757     fputs ("\n\tXPA ASE", stdout);
15758   if (mask & AFL_ASE_MIPS16E2)
15759     fputs ("\n\tMIPS16e2 ASE", stdout);
15760   if (mask & AFL_ASE_CRC)
15761     fputs ("\n\tCRC ASE", stdout);
15762   if (mask & AFL_ASE_GINV)
15763     fputs ("\n\tGINV ASE", stdout);
15764   if (mask & AFL_ASE_LOONGSON_MMI)
15765     fputs ("\n\tLoongson MMI ASE", stdout);
15766   if (mask & AFL_ASE_LOONGSON_CAM)
15767     fputs ("\n\tLoongson CAM ASE", stdout);
15768   if (mask & AFL_ASE_LOONGSON_EXT)
15769     fputs ("\n\tLoongson EXT ASE", stdout);
15770   if (mask & AFL_ASE_LOONGSON_EXT2)
15771     fputs ("\n\tLoongson EXT2 ASE", stdout);
15772   if (mask == 0)
15773     fprintf (stdout, "\n\t%s", _("None"));
15774   else if ((mask & ~AFL_ASE_MASK) != 0)
15775     fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
15776 }
15777
15778 static void
15779 print_mips_isa_ext (unsigned int isa_ext)
15780 {
15781   switch (isa_ext)
15782     {
15783     case 0:
15784       fputs (_("None"), stdout);
15785       break;
15786     case AFL_EXT_XLR:
15787       fputs ("RMI XLR", stdout);
15788       break;
15789     case AFL_EXT_OCTEON3:
15790       fputs ("Cavium Networks Octeon3", stdout);
15791       break;
15792     case AFL_EXT_OCTEON2:
15793       fputs ("Cavium Networks Octeon2", stdout);
15794       break;
15795     case AFL_EXT_OCTEONP:
15796       fputs ("Cavium Networks OcteonP", stdout);
15797       break;
15798     case AFL_EXT_OCTEON:
15799       fputs ("Cavium Networks Octeon", stdout);
15800       break;
15801     case AFL_EXT_5900:
15802       fputs ("Toshiba R5900", stdout);
15803       break;
15804     case AFL_EXT_4650:
15805       fputs ("MIPS R4650", stdout);
15806       break;
15807     case AFL_EXT_4010:
15808       fputs ("LSI R4010", stdout);
15809       break;
15810     case AFL_EXT_4100:
15811       fputs ("NEC VR4100", stdout);
15812       break;
15813     case AFL_EXT_3900:
15814       fputs ("Toshiba R3900", stdout);
15815       break;
15816     case AFL_EXT_10000:
15817       fputs ("MIPS R10000", stdout);
15818       break;
15819     case AFL_EXT_SB1:
15820       fputs ("Broadcom SB-1", stdout);
15821       break;
15822     case AFL_EXT_4111:
15823       fputs ("NEC VR4111/VR4181", stdout);
15824       break;
15825     case AFL_EXT_4120:
15826       fputs ("NEC VR4120", stdout);
15827       break;
15828     case AFL_EXT_5400:
15829       fputs ("NEC VR5400", stdout);
15830       break;
15831     case AFL_EXT_5500:
15832       fputs ("NEC VR5500", stdout);
15833       break;
15834     case AFL_EXT_LOONGSON_2E:
15835       fputs ("ST Microelectronics Loongson 2E", stdout);
15836       break;
15837     case AFL_EXT_LOONGSON_2F:
15838       fputs ("ST Microelectronics Loongson 2F", stdout);
15839       break;
15840     case AFL_EXT_INTERAPTIV_MR2:
15841       fputs ("Imagination interAptiv MR2", stdout);
15842       break;
15843     default:
15844       fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
15845     }
15846 }
15847
15848 static signed int
15849 get_mips_reg_size (int reg_size)
15850 {
15851   return (reg_size == AFL_REG_NONE) ? 0
15852          : (reg_size == AFL_REG_32) ? 32
15853          : (reg_size == AFL_REG_64) ? 64
15854          : (reg_size == AFL_REG_128) ? 128
15855          : -1;
15856 }
15857
15858 static bfd_boolean
15859 process_mips_specific (Filedata * filedata)
15860 {
15861   Elf_Internal_Dyn * entry;
15862   Elf_Internal_Shdr *sect = NULL;
15863   size_t liblist_offset = 0;
15864   size_t liblistno = 0;
15865   size_t conflictsno = 0;
15866   size_t options_offset = 0;
15867   size_t conflicts_offset = 0;
15868   size_t pltrelsz = 0;
15869   size_t pltrel = 0;
15870   bfd_vma pltgot = 0;
15871   bfd_vma mips_pltgot = 0;
15872   bfd_vma jmprel = 0;
15873   bfd_vma local_gotno = 0;
15874   bfd_vma gotsym = 0;
15875   bfd_vma symtabno = 0;
15876   bfd_boolean res = TRUE;
15877
15878   if (! process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
15879                             display_mips_gnu_attribute))
15880     res = FALSE;
15881
15882   sect = find_section (filedata, ".MIPS.abiflags");
15883
15884   if (sect != NULL)
15885     {
15886       Elf_External_ABIFlags_v0 *abiflags_ext;
15887       Elf_Internal_ABIFlags_v0 abiflags_in;
15888
15889       if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
15890         {
15891           error (_("Corrupt MIPS ABI Flags section.\n"));
15892           res = FALSE;
15893         }
15894       else
15895         {
15896           abiflags_ext = get_data (NULL, filedata, sect->sh_offset, 1,
15897                                    sect->sh_size, _("MIPS ABI Flags section"));
15898           if (abiflags_ext)
15899             {
15900               abiflags_in.version = BYTE_GET (abiflags_ext->version);
15901               abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
15902               abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
15903               abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
15904               abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
15905               abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
15906               abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
15907               abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
15908               abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
15909               abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
15910               abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
15911
15912               printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
15913               printf ("\nISA: MIPS%d", abiflags_in.isa_level);
15914               if (abiflags_in.isa_rev > 1)
15915                 printf ("r%d", abiflags_in.isa_rev);
15916               printf ("\nGPR size: %d",
15917                       get_mips_reg_size (abiflags_in.gpr_size));
15918               printf ("\nCPR1 size: %d",
15919                       get_mips_reg_size (abiflags_in.cpr1_size));
15920               printf ("\nCPR2 size: %d",
15921                       get_mips_reg_size (abiflags_in.cpr2_size));
15922               fputs ("\nFP ABI: ", stdout);
15923               print_mips_fp_abi_value (abiflags_in.fp_abi);
15924               fputs ("ISA Extension: ", stdout);
15925               print_mips_isa_ext (abiflags_in.isa_ext);
15926               fputs ("\nASEs:", stdout);
15927               print_mips_ases (abiflags_in.ases);
15928               printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
15929               printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
15930               fputc ('\n', stdout);
15931               free (abiflags_ext);
15932             }
15933         }
15934     }
15935
15936   /* We have a lot of special sections.  Thanks SGI!  */
15937   if (dynamic_section == NULL)
15938     {
15939       /* No dynamic information available.  See if there is static GOT.  */
15940       sect = find_section (filedata, ".got");
15941       if (sect != NULL)
15942         {
15943           unsigned char *data_end;
15944           unsigned char *data;
15945           bfd_vma ent, end;
15946           int addr_size;
15947
15948           pltgot = sect->sh_addr;
15949
15950           ent = pltgot;
15951           addr_size = (is_32bit_elf ? 4 : 8);
15952           end = pltgot + sect->sh_size;
15953
15954           data = (unsigned char *) get_data (NULL, filedata, sect->sh_offset,
15955                                              end - pltgot, 1,
15956                                              _("Global Offset Table data"));
15957           /* PR 12855: Null data is handled gracefully throughout.  */
15958           data_end = data + (end - pltgot);
15959
15960           printf (_("\nStatic GOT:\n"));
15961           printf (_(" Canonical gp value: "));
15962           print_vma (ent + 0x7ff0, LONG_HEX);
15963           printf ("\n\n");
15964
15965           /* In a dynamic binary GOT[0] is reserved for the dynamic
15966              loader to store the lazy resolver pointer, however in
15967              a static binary it may well have been omitted and GOT
15968              reduced to a table of addresses.
15969              PR 21344: Check for the entry being fully available
15970              before fetching it.  */
15971           if (data
15972               && data + ent - pltgot + addr_size <= data_end
15973               && byte_get (data + ent - pltgot, addr_size) == 0)
15974             {
15975               printf (_(" Reserved entries:\n"));
15976               printf (_("  %*s %10s %*s\n"),
15977                       addr_size * 2, _("Address"), _("Access"),
15978                       addr_size * 2, _("Value"));
15979               ent = print_mips_got_entry (data, pltgot, ent, data_end);
15980               printf ("\n");
15981               if (ent == (bfd_vma) -1)
15982                 goto sgot_print_fail;
15983
15984               /* Check for the MSB of GOT[1] being set, identifying a
15985                  GNU object.  This entry will be used by some runtime
15986                  loaders, to store the module pointer.  Otherwise this
15987                  is an ordinary local entry.
15988                  PR 21344: Check for the entry being fully available
15989                  before fetching it.  */
15990               if (data
15991                   && data + ent - pltgot + addr_size <= data_end
15992                   && (byte_get (data + ent - pltgot, addr_size)
15993                       >> (addr_size * 8 - 1)) != 0)
15994                 {
15995                   ent = print_mips_got_entry (data, pltgot, ent, data_end);
15996                   printf ("\n");
15997                   if (ent == (bfd_vma) -1)
15998                     goto sgot_print_fail;
15999                 }
16000               printf ("\n");
16001             }
16002
16003           if (data != NULL && ent < end)
16004             {
16005               printf (_(" Local entries:\n"));
16006               printf ("  %*s %10s %*s\n",
16007                       addr_size * 2, _("Address"), _("Access"),
16008                       addr_size * 2, _("Value"));
16009               while (ent < end)
16010                 {
16011                   ent = print_mips_got_entry (data, pltgot, ent, data_end);
16012                   printf ("\n");
16013                   if (ent == (bfd_vma) -1)
16014                     goto sgot_print_fail;
16015                 }
16016               printf ("\n");
16017             }
16018
16019         sgot_print_fail:
16020           if (data)
16021             free (data);
16022         }
16023       return res;
16024     }
16025
16026   for (entry = dynamic_section;
16027        /* PR 17531 file: 012-50589-0.004.  */
16028        entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
16029        ++entry)
16030     switch (entry->d_tag)
16031       {
16032       case DT_MIPS_LIBLIST:
16033         liblist_offset
16034           = offset_from_vma (filedata, entry->d_un.d_val,
16035                              liblistno * sizeof (Elf32_External_Lib));
16036         break;
16037       case DT_MIPS_LIBLISTNO:
16038         liblistno = entry->d_un.d_val;
16039         break;
16040       case DT_MIPS_OPTIONS:
16041         options_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
16042         break;
16043       case DT_MIPS_CONFLICT:
16044         conflicts_offset
16045           = offset_from_vma (filedata, entry->d_un.d_val,
16046                              conflictsno * sizeof (Elf32_External_Conflict));
16047         break;
16048       case DT_MIPS_CONFLICTNO:
16049         conflictsno = entry->d_un.d_val;
16050         break;
16051       case DT_PLTGOT:
16052         pltgot = entry->d_un.d_ptr;
16053         break;
16054       case DT_MIPS_LOCAL_GOTNO:
16055         local_gotno = entry->d_un.d_val;
16056         break;
16057       case DT_MIPS_GOTSYM:
16058         gotsym = entry->d_un.d_val;
16059         break;
16060       case DT_MIPS_SYMTABNO:
16061         symtabno = entry->d_un.d_val;
16062         break;
16063       case DT_MIPS_PLTGOT:
16064         mips_pltgot = entry->d_un.d_ptr;
16065         break;
16066       case DT_PLTREL:
16067         pltrel = entry->d_un.d_val;
16068         break;
16069       case DT_PLTRELSZ:
16070         pltrelsz = entry->d_un.d_val;
16071         break;
16072       case DT_JMPREL:
16073         jmprel = entry->d_un.d_ptr;
16074         break;
16075       default:
16076         break;
16077       }
16078
16079   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
16080     {
16081       Elf32_External_Lib * elib;
16082       size_t cnt;
16083
16084       elib = (Elf32_External_Lib *) get_data (NULL, filedata, liblist_offset,
16085                                               liblistno,
16086                                               sizeof (Elf32_External_Lib),
16087                                               _("liblist section data"));
16088       if (elib)
16089         {
16090           printf (ngettext ("\nSection '.liblist' contains %lu entry:\n",
16091                             "\nSection '.liblist' contains %lu entries:\n",
16092                             (unsigned long) liblistno),
16093                   (unsigned long) liblistno);
16094           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
16095                  stdout);
16096
16097           for (cnt = 0; cnt < liblistno; ++cnt)
16098             {
16099               Elf32_Lib liblist;
16100               time_t atime;
16101               char timebuf[128];
16102               struct tm * tmp;
16103
16104               liblist.l_name = BYTE_GET (elib[cnt].l_name);
16105               atime = BYTE_GET (elib[cnt].l_time_stamp);
16106               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16107               liblist.l_version = BYTE_GET (elib[cnt].l_version);
16108               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16109
16110               tmp = gmtime (&atime);
16111               snprintf (timebuf, sizeof (timebuf),
16112                         "%04u-%02u-%02uT%02u:%02u:%02u",
16113                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16114                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16115
16116               printf ("%3lu: ", (unsigned long) cnt);
16117               if (VALID_DYNAMIC_NAME (liblist.l_name))
16118                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
16119               else
16120                 printf (_("<corrupt: %9ld>"), liblist.l_name);
16121               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
16122                       liblist.l_version);
16123
16124               if (liblist.l_flags == 0)
16125                 puts (_(" NONE"));
16126               else
16127                 {
16128                   static const struct
16129                   {
16130                     const char * name;
16131                     int bit;
16132                   }
16133                   l_flags_vals[] =
16134                   {
16135                     { " EXACT_MATCH", LL_EXACT_MATCH },
16136                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
16137                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
16138                     { " EXPORTS", LL_EXPORTS },
16139                     { " DELAY_LOAD", LL_DELAY_LOAD },
16140                     { " DELTA", LL_DELTA }
16141                   };
16142                   int flags = liblist.l_flags;
16143                   size_t fcnt;
16144
16145                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
16146                     if ((flags & l_flags_vals[fcnt].bit) != 0)
16147                       {
16148                         fputs (l_flags_vals[fcnt].name, stdout);
16149                         flags ^= l_flags_vals[fcnt].bit;
16150                       }
16151                   if (flags != 0)
16152                     printf (" %#x", (unsigned int) flags);
16153
16154                   puts ("");
16155                 }
16156             }
16157
16158           free (elib);
16159         }
16160       else
16161         res = FALSE;
16162     }
16163
16164   if (options_offset != 0)
16165     {
16166       Elf_External_Options * eopt;
16167       Elf_Internal_Options * iopt;
16168       Elf_Internal_Options * option;
16169       size_t offset;
16170       int cnt;
16171       sect = filedata->section_headers;
16172
16173       /* Find the section header so that we get the size.  */
16174       sect = find_section_by_type (filedata, SHT_MIPS_OPTIONS);
16175       /* PR 17533 file: 012-277276-0.004.  */
16176       if (sect == NULL)
16177         {
16178           error (_("No MIPS_OPTIONS header found\n"));
16179           return FALSE;
16180         }
16181
16182       eopt = (Elf_External_Options *) get_data (NULL, filedata, options_offset, 1,
16183                                                 sect->sh_size, _("options"));
16184       if (eopt)
16185         {
16186           iopt = (Elf_Internal_Options *)
16187               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
16188           if (iopt == NULL)
16189             {
16190               error (_("Out of memory allocating space for MIPS options\n"));
16191               return FALSE;
16192             }
16193
16194           offset = cnt = 0;
16195           option = iopt;
16196
16197           while (offset <= sect->sh_size - sizeof (* eopt))
16198             {
16199               Elf_External_Options * eoption;
16200
16201               eoption = (Elf_External_Options *) ((char *) eopt + offset);
16202
16203               option->kind = BYTE_GET (eoption->kind);
16204               option->size = BYTE_GET (eoption->size);
16205               option->section = BYTE_GET (eoption->section);
16206               option->info = BYTE_GET (eoption->info);
16207
16208               /* PR 17531: file: ffa0fa3b.  */
16209               if (option->size < sizeof (* eopt)
16210                   || offset + option->size > sect->sh_size)
16211                 {
16212                   error (_("Invalid size (%u) for MIPS option\n"), option->size);
16213                   return FALSE;
16214                 }
16215               offset += option->size;
16216
16217               ++option;
16218               ++cnt;
16219             }
16220
16221           printf (ngettext ("\nSection '%s' contains %d entry:\n",
16222                             "\nSection '%s' contains %d entries:\n",
16223                             cnt),
16224                   printable_section_name (filedata, sect), cnt);
16225
16226           option = iopt;
16227           offset = 0;
16228
16229           while (cnt-- > 0)
16230             {
16231               size_t len;
16232
16233               switch (option->kind)
16234                 {
16235                 case ODK_NULL:
16236                   /* This shouldn't happen.  */
16237                   printf (" NULL       %d %lx", option->section, option->info);
16238                   break;
16239                 case ODK_REGINFO:
16240                   printf (" REGINFO    ");
16241                   if (filedata->file_header.e_machine == EM_MIPS)
16242                     {
16243                       /* 32bit form.  */
16244                       Elf32_External_RegInfo * ereg;
16245                       Elf32_RegInfo reginfo;
16246
16247                       ereg = (Elf32_External_RegInfo *) (option + 1);
16248                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
16249                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16250                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16251                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16252                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16253                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
16254
16255                       printf ("GPR %08lx  GP 0x%lx\n",
16256                               reginfo.ri_gprmask,
16257                               (unsigned long) reginfo.ri_gp_value);
16258                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
16259                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16260                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16261                     }
16262                   else
16263                     {
16264                       /* 64 bit form.  */
16265                       Elf64_External_RegInfo * ereg;
16266                       Elf64_Internal_RegInfo reginfo;
16267
16268                       ereg = (Elf64_External_RegInfo *) (option + 1);
16269                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
16270                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16271                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16272                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16273                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16274                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
16275
16276                       printf ("GPR %08lx  GP 0x",
16277                               reginfo.ri_gprmask);
16278                       printf_vma (reginfo.ri_gp_value);
16279                       printf ("\n");
16280
16281                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
16282                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16283                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16284                     }
16285                   ++option;
16286                   continue;
16287                 case ODK_EXCEPTIONS:
16288                   fputs (" EXCEPTIONS fpe_min(", stdout);
16289                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
16290                   fputs (") fpe_max(", stdout);
16291                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
16292                   fputs (")", stdout);
16293
16294                   if (option->info & OEX_PAGE0)
16295                     fputs (" PAGE0", stdout);
16296                   if (option->info & OEX_SMM)
16297                     fputs (" SMM", stdout);
16298                   if (option->info & OEX_FPDBUG)
16299                     fputs (" FPDBUG", stdout);
16300                   if (option->info & OEX_DISMISS)
16301                     fputs (" DISMISS", stdout);
16302                   break;
16303                 case ODK_PAD:
16304                   fputs (" PAD       ", stdout);
16305                   if (option->info & OPAD_PREFIX)
16306                     fputs (" PREFIX", stdout);
16307                   if (option->info & OPAD_POSTFIX)
16308                     fputs (" POSTFIX", stdout);
16309                   if (option->info & OPAD_SYMBOL)
16310                     fputs (" SYMBOL", stdout);
16311                   break;
16312                 case ODK_HWPATCH:
16313                   fputs (" HWPATCH   ", stdout);
16314                   if (option->info & OHW_R4KEOP)
16315                     fputs (" R4KEOP", stdout);
16316                   if (option->info & OHW_R8KPFETCH)
16317                     fputs (" R8KPFETCH", stdout);
16318                   if (option->info & OHW_R5KEOP)
16319                     fputs (" R5KEOP", stdout);
16320                   if (option->info & OHW_R5KCVTL)
16321                     fputs (" R5KCVTL", stdout);
16322                   break;
16323                 case ODK_FILL:
16324                   fputs (" FILL       ", stdout);
16325                   /* XXX Print content of info word?  */
16326                   break;
16327                 case ODK_TAGS:
16328                   fputs (" TAGS       ", stdout);
16329                   /* XXX Print content of info word?  */
16330                   break;
16331                 case ODK_HWAND:
16332                   fputs (" HWAND     ", stdout);
16333                   if (option->info & OHWA0_R4KEOP_CHECKED)
16334                     fputs (" R4KEOP_CHECKED", stdout);
16335                   if (option->info & OHWA0_R4KEOP_CLEAN)
16336                     fputs (" R4KEOP_CLEAN", stdout);
16337                   break;
16338                 case ODK_HWOR:
16339                   fputs (" HWOR      ", stdout);
16340                   if (option->info & OHWA0_R4KEOP_CHECKED)
16341                     fputs (" R4KEOP_CHECKED", stdout);
16342                   if (option->info & OHWA0_R4KEOP_CLEAN)
16343                     fputs (" R4KEOP_CLEAN", stdout);
16344                   break;
16345                 case ODK_GP_GROUP:
16346                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
16347                           option->info & OGP_GROUP,
16348                           (option->info & OGP_SELF) >> 16);
16349                   break;
16350                 case ODK_IDENT:
16351                   printf (" IDENT     %#06lx  self-contained %#06lx",
16352                           option->info & OGP_GROUP,
16353                           (option->info & OGP_SELF) >> 16);
16354                   break;
16355                 default:
16356                   /* This shouldn't happen.  */
16357                   printf (" %3d ???     %d %lx",
16358                           option->kind, option->section, option->info);
16359                   break;
16360                 }
16361
16362               len = sizeof (* eopt);
16363               while (len < option->size)
16364                 {
16365                   unsigned char datum = * ((unsigned char *) eopt + offset + len);
16366
16367                   if (ISPRINT (datum))
16368                     printf ("%c", datum);
16369                   else
16370                     printf ("\\%03o", datum);
16371                   len ++;
16372                 }
16373               fputs ("\n", stdout);
16374
16375               offset += option->size;
16376               ++option;
16377             }
16378
16379           free (eopt);
16380         }
16381       else
16382         res = FALSE;
16383     }
16384
16385   if (conflicts_offset != 0 && conflictsno != 0)
16386     {
16387       Elf32_Conflict * iconf;
16388       size_t cnt;
16389
16390       if (dynamic_symbols == NULL)
16391         {
16392           error (_("conflict list found without a dynamic symbol table\n"));
16393           return FALSE;
16394         }
16395
16396       /* PR 21345 - print a slightly more helpful error message
16397          if we are sure that the cmalloc will fail.  */
16398       if (conflictsno * sizeof (* iconf) > filedata->file_size)
16399         {
16400           error (_("Overlarge number of conflicts detected: %lx\n"),
16401                  (long) conflictsno);
16402           return FALSE;
16403         }
16404
16405       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
16406       if (iconf == NULL)
16407         {
16408           error (_("Out of memory allocating space for dynamic conflicts\n"));
16409           return FALSE;
16410         }
16411
16412       if (is_32bit_elf)
16413         {
16414           Elf32_External_Conflict * econf32;
16415
16416           econf32 = (Elf32_External_Conflict *)
16417               get_data (NULL, filedata, conflicts_offset, conflictsno,
16418                         sizeof (* econf32), _("conflict"));
16419           if (!econf32)
16420             return FALSE;
16421
16422           for (cnt = 0; cnt < conflictsno; ++cnt)
16423             iconf[cnt] = BYTE_GET (econf32[cnt]);
16424
16425           free (econf32);
16426         }
16427       else
16428         {
16429           Elf64_External_Conflict * econf64;
16430
16431           econf64 = (Elf64_External_Conflict *)
16432               get_data (NULL, filedata, conflicts_offset, conflictsno,
16433                         sizeof (* econf64), _("conflict"));
16434           if (!econf64)
16435             return FALSE;
16436
16437           for (cnt = 0; cnt < conflictsno; ++cnt)
16438             iconf[cnt] = BYTE_GET (econf64[cnt]);
16439
16440           free (econf64);
16441         }
16442
16443       printf (ngettext ("\nSection '.conflict' contains %lu entry:\n",
16444                         "\nSection '.conflict' contains %lu entries:\n",
16445                         (unsigned long) conflictsno),
16446               (unsigned long) conflictsno);
16447       puts (_("  Num:    Index       Value  Name"));
16448
16449       for (cnt = 0; cnt < conflictsno; ++cnt)
16450         {
16451           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
16452
16453           if (iconf[cnt] >= num_dynamic_syms)
16454             printf (_("<corrupt symbol index>"));
16455           else
16456             {
16457               Elf_Internal_Sym * psym;
16458
16459               psym = & dynamic_symbols[iconf[cnt]];
16460               print_vma (psym->st_value, FULL_HEX);
16461               putchar (' ');
16462               if (VALID_DYNAMIC_NAME (psym->st_name))
16463                 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
16464               else
16465                 printf (_("<corrupt: %14ld>"), psym->st_name);
16466             }
16467           putchar ('\n');
16468         }
16469
16470       free (iconf);
16471     }
16472
16473   if (pltgot != 0 && local_gotno != 0)
16474     {
16475       bfd_vma ent, local_end, global_end;
16476       size_t i, offset;
16477       unsigned char * data;
16478       unsigned char * data_end;
16479       int addr_size;
16480
16481       ent = pltgot;
16482       addr_size = (is_32bit_elf ? 4 : 8);
16483       local_end = pltgot + local_gotno * addr_size;
16484
16485       /* PR binutils/17533 file: 012-111227-0.004  */
16486       if (symtabno < gotsym)
16487         {
16488           error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
16489                  (unsigned long) gotsym, (unsigned long) symtabno);
16490           return FALSE;
16491         }
16492
16493       global_end = local_end + (symtabno - gotsym) * addr_size;
16494       /* PR 17531: file: 54c91a34.  */
16495       if (global_end < local_end)
16496         {
16497           error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
16498           return FALSE;
16499         }
16500
16501       offset = offset_from_vma (filedata, pltgot, global_end - pltgot);
16502       data = (unsigned char *) get_data (NULL, filedata, offset,
16503                                          global_end - pltgot, 1,
16504                                          _("Global Offset Table data"));
16505       /* PR 12855: Null data is handled gracefully throughout.  */
16506       data_end = data + (global_end - pltgot);
16507
16508       printf (_("\nPrimary GOT:\n"));
16509       printf (_(" Canonical gp value: "));
16510       print_vma (pltgot + 0x7ff0, LONG_HEX);
16511       printf ("\n\n");
16512
16513       printf (_(" Reserved entries:\n"));
16514       printf (_("  %*s %10s %*s Purpose\n"),
16515               addr_size * 2, _("Address"), _("Access"),
16516               addr_size * 2, _("Initial"));
16517       ent = print_mips_got_entry (data, pltgot, ent, data_end);
16518       printf (_(" Lazy resolver\n"));
16519       if (ent == (bfd_vma) -1)
16520         goto got_print_fail;
16521
16522       /* Check for the MSB of GOT[1] being set, denoting a GNU object.
16523          This entry will be used by some runtime loaders, to store the
16524          module pointer.  Otherwise this is an ordinary local entry.
16525          PR 21344: Check for the entry being fully available before
16526          fetching it.  */
16527       if (data
16528           && data + ent - pltgot + addr_size <= data_end
16529           && (byte_get (data + ent - pltgot, addr_size)
16530               >> (addr_size * 8 - 1)) != 0)
16531         {
16532           ent = print_mips_got_entry (data, pltgot, ent, data_end);
16533           printf (_(" Module pointer (GNU extension)\n"));
16534           if (ent == (bfd_vma) -1)
16535             goto got_print_fail;
16536         }
16537       printf ("\n");
16538
16539       if (data != NULL && ent < local_end)
16540         {
16541           printf (_(" Local entries:\n"));
16542           printf ("  %*s %10s %*s\n",
16543                   addr_size * 2, _("Address"), _("Access"),
16544                   addr_size * 2, _("Initial"));
16545           while (ent < local_end)
16546             {
16547               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16548               printf ("\n");
16549               if (ent == (bfd_vma) -1)
16550                 goto got_print_fail;
16551             }
16552           printf ("\n");
16553         }
16554
16555       if (data != NULL && gotsym < symtabno)
16556         {
16557           int sym_width;
16558
16559           printf (_(" Global entries:\n"));
16560           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
16561                   addr_size * 2, _("Address"),
16562                   _("Access"),
16563                   addr_size * 2, _("Initial"),
16564                   addr_size * 2, _("Sym.Val."),
16565                   _("Type"),
16566                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
16567                   _("Ndx"), _("Name"));
16568
16569           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
16570
16571           for (i = gotsym; i < symtabno; i++)
16572             {
16573               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16574               printf (" ");
16575
16576               if (dynamic_symbols == NULL)
16577                 printf (_("<no dynamic symbols>"));
16578               else if (i < num_dynamic_syms)
16579                 {
16580                   Elf_Internal_Sym * psym = dynamic_symbols + i;
16581
16582                   print_vma (psym->st_value, LONG_HEX);
16583                   printf (" %-7s %3s ",
16584                           get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16585                           get_symbol_index_type (filedata, psym->st_shndx));
16586
16587                   if (VALID_DYNAMIC_NAME (psym->st_name))
16588                     print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16589                   else
16590                     printf (_("<corrupt: %14ld>"), psym->st_name);
16591                 }
16592               else
16593                 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
16594                         (unsigned long) i);
16595
16596               printf ("\n");
16597               if (ent == (bfd_vma) -1)
16598                 break;
16599             }
16600           printf ("\n");
16601         }
16602
16603     got_print_fail:
16604       if (data)
16605         free (data);
16606     }
16607
16608   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
16609     {
16610       bfd_vma ent, end;
16611       size_t offset, rel_offset;
16612       unsigned long count, i;
16613       unsigned char * data;
16614       int addr_size, sym_width;
16615       Elf_Internal_Rela * rels;
16616
16617       rel_offset = offset_from_vma (filedata, jmprel, pltrelsz);
16618       if (pltrel == DT_RELA)
16619         {
16620           if (!slurp_rela_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16621             return FALSE;
16622         }
16623       else
16624         {
16625           if (!slurp_rel_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16626             return FALSE;
16627         }
16628
16629       ent = mips_pltgot;
16630       addr_size = (is_32bit_elf ? 4 : 8);
16631       end = mips_pltgot + (2 + count) * addr_size;
16632
16633       offset = offset_from_vma (filedata, mips_pltgot, end - mips_pltgot);
16634       data = (unsigned char *) get_data (NULL, filedata, offset, end - mips_pltgot,
16635                                          1, _("Procedure Linkage Table data"));
16636       if (data == NULL)
16637         return FALSE;
16638
16639       printf ("\nPLT GOT:\n\n");
16640       printf (_(" Reserved entries:\n"));
16641       printf (_("  %*s %*s Purpose\n"),
16642               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
16643       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16644       printf (_(" PLT lazy resolver\n"));
16645       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16646       printf (_(" Module pointer\n"));
16647       printf ("\n");
16648
16649       printf (_(" Entries:\n"));
16650       printf ("  %*s %*s %*s %-7s %3s %s\n",
16651               addr_size * 2, _("Address"),
16652               addr_size * 2, _("Initial"),
16653               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
16654       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
16655       for (i = 0; i < count; i++)
16656         {
16657           unsigned long idx = get_reloc_symindex (rels[i].r_info);
16658
16659           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16660           printf (" ");
16661
16662           if (idx >= num_dynamic_syms)
16663             printf (_("<corrupt symbol index: %lu>"), idx);
16664           else
16665             {
16666               Elf_Internal_Sym * psym = dynamic_symbols + idx;
16667
16668               print_vma (psym->st_value, LONG_HEX);
16669               printf (" %-7s %3s ",
16670                       get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16671                       get_symbol_index_type (filedata, psym->st_shndx));
16672               if (VALID_DYNAMIC_NAME (psym->st_name))
16673                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16674               else
16675                 printf (_("<corrupt: %14ld>"), psym->st_name);
16676             }
16677           printf ("\n");
16678         }
16679       printf ("\n");
16680
16681       if (data)
16682         free (data);
16683       free (rels);
16684     }
16685
16686   return res;
16687 }
16688
16689 static bfd_boolean
16690 process_nds32_specific (Filedata * filedata)
16691 {
16692   Elf_Internal_Shdr *sect = NULL;
16693
16694   sect = find_section (filedata, ".nds32_e_flags");
16695   if (sect != NULL)
16696     {
16697       unsigned int *flag;
16698
16699       printf ("\nNDS32 elf flags section:\n");
16700       flag = get_data (NULL, filedata, sect->sh_offset, 1,
16701                        sect->sh_size, _("NDS32 elf flags section"));
16702
16703       if (! flag)
16704         return FALSE;
16705
16706       switch ((*flag) & 0x3)
16707         {
16708         case 0:
16709           printf ("(VEC_SIZE):\tNo entry.\n");
16710           break;
16711         case 1:
16712           printf ("(VEC_SIZE):\t4 bytes\n");
16713           break;
16714         case 2:
16715           printf ("(VEC_SIZE):\t16 bytes\n");
16716           break;
16717         case 3:
16718           printf ("(VEC_SIZE):\treserved\n");
16719           break;
16720         }
16721     }
16722
16723   return TRUE;
16724 }
16725
16726 static bfd_boolean
16727 process_gnu_liblist (Filedata * filedata)
16728 {
16729   Elf_Internal_Shdr * section;
16730   Elf_Internal_Shdr * string_sec;
16731   Elf32_External_Lib * elib;
16732   char * strtab;
16733   size_t strtab_size;
16734   size_t cnt;
16735   unsigned long num_liblist;
16736   unsigned i;
16737   bfd_boolean res = TRUE;
16738
16739   if (! do_arch)
16740     return TRUE;
16741
16742   for (i = 0, section = filedata->section_headers;
16743        i < filedata->file_header.e_shnum;
16744        i++, section++)
16745     {
16746       switch (section->sh_type)
16747         {
16748         case SHT_GNU_LIBLIST:
16749           if (section->sh_link >= filedata->file_header.e_shnum)
16750             break;
16751
16752           elib = (Elf32_External_Lib *)
16753               get_data (NULL, filedata, section->sh_offset, 1, section->sh_size,
16754                         _("liblist section data"));
16755
16756           if (elib == NULL)
16757             {
16758               res = FALSE;
16759               break;
16760             }
16761
16762           string_sec = filedata->section_headers + section->sh_link;
16763           strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
16764                                       string_sec->sh_size,
16765                                       _("liblist string table"));
16766           if (strtab == NULL
16767               || section->sh_entsize != sizeof (Elf32_External_Lib))
16768             {
16769               free (elib);
16770               free (strtab);
16771               res = FALSE;
16772               break;
16773             }
16774           strtab_size = string_sec->sh_size;
16775
16776           num_liblist = section->sh_size / sizeof (Elf32_External_Lib);
16777           printf (ngettext ("\nLibrary list section '%s' contains %lu entries:\n",
16778                             "\nLibrary list section '%s' contains %lu entries:\n",
16779                             num_liblist),
16780                   printable_section_name (filedata, section),
16781                   num_liblist);
16782
16783           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
16784
16785           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
16786                ++cnt)
16787             {
16788               Elf32_Lib liblist;
16789               time_t atime;
16790               char timebuf[128];
16791               struct tm * tmp;
16792
16793               liblist.l_name = BYTE_GET (elib[cnt].l_name);
16794               atime = BYTE_GET (elib[cnt].l_time_stamp);
16795               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16796               liblist.l_version = BYTE_GET (elib[cnt].l_version);
16797               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16798
16799               tmp = gmtime (&atime);
16800               snprintf (timebuf, sizeof (timebuf),
16801                         "%04u-%02u-%02uT%02u:%02u:%02u",
16802                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16803                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16804
16805               printf ("%3lu: ", (unsigned long) cnt);
16806               if (do_wide)
16807                 printf ("%-20s", liblist.l_name < strtab_size
16808                         ? strtab + liblist.l_name : _("<corrupt>"));
16809               else
16810                 printf ("%-20.20s", liblist.l_name < strtab_size
16811                         ? strtab + liblist.l_name : _("<corrupt>"));
16812               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
16813                       liblist.l_version, liblist.l_flags);
16814             }
16815
16816           free (elib);
16817           free (strtab);
16818         }
16819     }
16820
16821   return res;
16822 }
16823
16824 static const char *
16825 get_note_type (Filedata * filedata, unsigned e_type)
16826 {
16827   static char buff[64];
16828
16829   if (filedata->file_header.e_type == ET_CORE)
16830     switch (e_type)
16831       {
16832       case NT_AUXV:
16833         return _("NT_AUXV (auxiliary vector)");
16834       case NT_PRSTATUS:
16835         return _("NT_PRSTATUS (prstatus structure)");
16836       case NT_FPREGSET:
16837         return _("NT_FPREGSET (floating point registers)");
16838       case NT_PRPSINFO:
16839         return _("NT_PRPSINFO (prpsinfo structure)");
16840       case NT_TASKSTRUCT:
16841         return _("NT_TASKSTRUCT (task structure)");
16842       case NT_PRXFPREG:
16843         return _("NT_PRXFPREG (user_xfpregs structure)");
16844       case NT_PPC_VMX:
16845         return _("NT_PPC_VMX (ppc Altivec registers)");
16846       case NT_PPC_VSX:
16847         return _("NT_PPC_VSX (ppc VSX registers)");
16848       case NT_PPC_TAR:
16849         return _("NT_PPC_TAR (ppc TAR register)");
16850       case NT_PPC_PPR:
16851         return _("NT_PPC_PPR (ppc PPR register)");
16852       case NT_PPC_DSCR:
16853         return _("NT_PPC_DSCR (ppc DSCR register)");
16854       case NT_PPC_EBB:
16855         return _("NT_PPC_EBB (ppc EBB registers)");
16856       case NT_PPC_PMU:
16857         return _("NT_PPC_PMU (ppc PMU registers)");
16858       case NT_PPC_TM_CGPR:
16859         return _("NT_PPC_TM_CGPR (ppc checkpointed GPR registers)");
16860       case NT_PPC_TM_CFPR:
16861         return _("NT_PPC_TM_CFPR (ppc checkpointed floating point registers)");
16862       case NT_PPC_TM_CVMX:
16863         return _("NT_PPC_TM_CVMX (ppc checkpointed Altivec registers)");
16864       case NT_PPC_TM_CVSX:
16865         return _("NT_PPC_TM_CVSX (ppc checkpointed VSX registers)");
16866       case NT_PPC_TM_SPR:
16867         return _("NT_PPC_TM_SPR (ppc TM special purpose registers)");
16868       case NT_PPC_TM_CTAR:
16869         return _("NT_PPC_TM_CTAR (ppc checkpointed TAR register)");
16870       case NT_PPC_TM_CPPR:
16871         return _("NT_PPC_TM_CPPR (ppc checkpointed PPR register)");
16872       case NT_PPC_TM_CDSCR:
16873         return _("NT_PPC_TM_CDSCR (ppc checkpointed DSCR register)");
16874       case NT_386_TLS:
16875         return _("NT_386_TLS (x86 TLS information)");
16876       case NT_386_IOPERM:
16877         return _("NT_386_IOPERM (x86 I/O permissions)");
16878       case NT_X86_XSTATE:
16879         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
16880       case NT_S390_HIGH_GPRS:
16881         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
16882       case NT_S390_TIMER:
16883         return _("NT_S390_TIMER (s390 timer register)");
16884       case NT_S390_TODCMP:
16885         return _("NT_S390_TODCMP (s390 TOD comparator register)");
16886       case NT_S390_TODPREG:
16887         return _("NT_S390_TODPREG (s390 TOD programmable register)");
16888       case NT_S390_CTRS:
16889         return _("NT_S390_CTRS (s390 control registers)");
16890       case NT_S390_PREFIX:
16891         return _("NT_S390_PREFIX (s390 prefix register)");
16892       case NT_S390_LAST_BREAK:
16893         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
16894       case NT_S390_SYSTEM_CALL:
16895         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
16896       case NT_S390_TDB:
16897         return _("NT_S390_TDB (s390 transaction diagnostic block)");
16898       case NT_S390_VXRS_LOW:
16899         return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
16900       case NT_S390_VXRS_HIGH:
16901         return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
16902       case NT_S390_GS_CB:
16903         return _("NT_S390_GS_CB (s390 guarded-storage registers)");
16904       case NT_S390_GS_BC:
16905         return _("NT_S390_GS_BC (s390 guarded-storage broadcast control)");
16906       case NT_ARM_VFP:
16907         return _("NT_ARM_VFP (arm VFP registers)");
16908       case NT_ARM_TLS:
16909         return _("NT_ARM_TLS (AArch TLS registers)");
16910       case NT_ARM_HW_BREAK:
16911         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
16912       case NT_ARM_HW_WATCH:
16913         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
16914       case NT_PSTATUS:
16915         return _("NT_PSTATUS (pstatus structure)");
16916       case NT_FPREGS:
16917         return _("NT_FPREGS (floating point registers)");
16918       case NT_PSINFO:
16919         return _("NT_PSINFO (psinfo structure)");
16920       case NT_LWPSTATUS:
16921         return _("NT_LWPSTATUS (lwpstatus_t structure)");
16922       case NT_LWPSINFO:
16923         return _("NT_LWPSINFO (lwpsinfo_t structure)");
16924       case NT_WIN32PSTATUS:
16925         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
16926       case NT_SIGINFO:
16927         return _("NT_SIGINFO (siginfo_t data)");
16928       case NT_FILE:
16929         return _("NT_FILE (mapped files)");
16930       default:
16931         break;
16932       }
16933   else
16934     switch (e_type)
16935       {
16936       case NT_VERSION:
16937         return _("NT_VERSION (version)");
16938       case NT_ARCH:
16939         return _("NT_ARCH (architecture)");
16940       case NT_GNU_BUILD_ATTRIBUTE_OPEN:
16941         return _("OPEN");
16942       case NT_GNU_BUILD_ATTRIBUTE_FUNC:
16943         return _("func");
16944       default:
16945         break;
16946       }
16947
16948   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16949   return buff;
16950 }
16951
16952 static bfd_boolean
16953 print_core_note (Elf_Internal_Note *pnote)
16954 {
16955   unsigned int addr_size = is_32bit_elf ? 4 : 8;
16956   bfd_vma count, page_size;
16957   unsigned char *descdata, *filenames, *descend;
16958
16959   if (pnote->type != NT_FILE)
16960     {
16961       if (do_wide)
16962         printf ("\n");
16963       return TRUE;
16964     }
16965
16966 #ifndef BFD64
16967   if (!is_32bit_elf)
16968     {
16969       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
16970       /* Still "successful".  */
16971       return TRUE;
16972     }
16973 #endif
16974
16975   if (pnote->descsz < 2 * addr_size)
16976     {
16977       error (_("    Malformed note - too short for header\n"));
16978       return FALSE;
16979     }
16980
16981   descdata = (unsigned char *) pnote->descdata;
16982   descend = descdata + pnote->descsz;
16983
16984   if (descdata[pnote->descsz - 1] != '\0')
16985     {
16986       error (_("    Malformed note - does not end with \\0\n"));
16987       return FALSE;
16988     }
16989
16990   count = byte_get (descdata, addr_size);
16991   descdata += addr_size;
16992
16993   page_size = byte_get (descdata, addr_size);
16994   descdata += addr_size;
16995
16996   if (count > ((bfd_vma) -1 - 2 * addr_size) / (3 * addr_size)
16997       || pnote->descsz < 2 * addr_size + count * 3 * addr_size)
16998     {
16999       error (_("    Malformed note - too short for supplied file count\n"));
17000       return FALSE;
17001     }
17002
17003   printf (_("    Page size: "));
17004   print_vma (page_size, DEC);
17005   printf ("\n");
17006
17007   printf (_("    %*s%*s%*s\n"),
17008           (int) (2 + 2 * addr_size), _("Start"),
17009           (int) (4 + 2 * addr_size), _("End"),
17010           (int) (4 + 2 * addr_size), _("Page Offset"));
17011   filenames = descdata + count * 3 * addr_size;
17012   while (count-- > 0)
17013     {
17014       bfd_vma start, end, file_ofs;
17015
17016       if (filenames == descend)
17017         {
17018           error (_("    Malformed note - filenames end too early\n"));
17019           return FALSE;
17020         }
17021
17022       start = byte_get (descdata, addr_size);
17023       descdata += addr_size;
17024       end = byte_get (descdata, addr_size);
17025       descdata += addr_size;
17026       file_ofs = byte_get (descdata, addr_size);
17027       descdata += addr_size;
17028
17029       printf ("    ");
17030       print_vma (start, FULL_HEX);
17031       printf ("  ");
17032       print_vma (end, FULL_HEX);
17033       printf ("  ");
17034       print_vma (file_ofs, FULL_HEX);
17035       printf ("\n        %s\n", filenames);
17036
17037       filenames += 1 + strlen ((char *) filenames);
17038     }
17039
17040   return TRUE;
17041 }
17042
17043 static const char *
17044 get_gnu_elf_note_type (unsigned e_type)
17045 {
17046   /* NB/ Keep this switch statement in sync with print_gnu_note ().  */
17047   switch (e_type)
17048     {
17049     case NT_GNU_ABI_TAG:
17050       return _("NT_GNU_ABI_TAG (ABI version tag)");
17051     case NT_GNU_HWCAP:
17052       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
17053     case NT_GNU_BUILD_ID:
17054       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
17055     case NT_GNU_GOLD_VERSION:
17056       return _("NT_GNU_GOLD_VERSION (gold version)");
17057     case NT_GNU_PROPERTY_TYPE_0:
17058       return _("NT_GNU_PROPERTY_TYPE_0");
17059     case NT_GNU_BUILD_ATTRIBUTE_OPEN:
17060       return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
17061     case NT_GNU_BUILD_ATTRIBUTE_FUNC:
17062       return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
17063     default:
17064       {
17065         static char buff[64];
17066
17067         snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17068         return buff;
17069       }
17070     }
17071 }
17072
17073 static void
17074 decode_x86_compat_isa (unsigned int bitmask)
17075 {
17076   while (bitmask)
17077     {
17078       unsigned int bit = bitmask & (- bitmask);
17079
17080       bitmask &= ~ bit;
17081       switch (bit)
17082         {
17083         case GNU_PROPERTY_X86_COMPAT_ISA_1_486:
17084           printf ("i486");
17085           break;
17086         case GNU_PROPERTY_X86_COMPAT_ISA_1_586:
17087           printf ("586");
17088           break;
17089         case GNU_PROPERTY_X86_COMPAT_ISA_1_686:
17090           printf ("686");
17091           break;
17092         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE:
17093           printf ("SSE");
17094           break;
17095         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE2:
17096           printf ("SSE2");
17097           break;
17098         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE3:
17099           printf ("SSE3");
17100           break;
17101         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSSE3:
17102           printf ("SSSE3");
17103           break;
17104         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_1:
17105           printf ("SSE4_1");
17106           break;
17107         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_2:
17108           printf ("SSE4_2");
17109           break;
17110         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX:
17111           printf ("AVX");
17112           break;
17113         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX2:
17114           printf ("AVX2");
17115           break;
17116         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512F:
17117           printf ("AVX512F");
17118           break;
17119         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512CD:
17120           printf ("AVX512CD");
17121           break;
17122         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512ER:
17123           printf ("AVX512ER");
17124           break;
17125         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512PF:
17126           printf ("AVX512PF");
17127           break;
17128         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512VL:
17129           printf ("AVX512VL");
17130           break;
17131         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512DQ:
17132           printf ("AVX512DQ");
17133           break;
17134         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512BW:
17135           printf ("AVX512BW");
17136           break;
17137         default:
17138           printf (_("<unknown: %x>"), bit);
17139           break;
17140         }
17141       if (bitmask)
17142         printf (", ");
17143     }
17144 }
17145
17146 static void
17147 decode_x86_isa (unsigned int bitmask)
17148 {
17149   if (!bitmask)
17150     {
17151       printf (_("<None>"));
17152       return;
17153     }
17154
17155   while (bitmask)
17156     {
17157       unsigned int bit = bitmask & (- bitmask);
17158
17159       bitmask &= ~ bit;
17160       switch (bit)
17161         {
17162         case GNU_PROPERTY_X86_ISA_1_CMOV:
17163           printf ("CMOV");
17164           break;
17165         case GNU_PROPERTY_X86_ISA_1_SSE:
17166           printf ("SSE");
17167           break;
17168         case GNU_PROPERTY_X86_ISA_1_SSE2:
17169           printf ("SSE2");
17170           break;
17171         case GNU_PROPERTY_X86_ISA_1_SSE3:
17172           printf ("SSE3");
17173           break;
17174         case GNU_PROPERTY_X86_ISA_1_SSSE3:
17175           printf ("SSSE3");
17176           break;
17177         case GNU_PROPERTY_X86_ISA_1_SSE4_1:
17178           printf ("SSE4_1");
17179           break;
17180         case GNU_PROPERTY_X86_ISA_1_SSE4_2:
17181           printf ("SSE4_2");
17182           break;
17183         case GNU_PROPERTY_X86_ISA_1_AVX:
17184           printf ("AVX");
17185           break;
17186         case GNU_PROPERTY_X86_ISA_1_AVX2:
17187           printf ("AVX2");
17188           break;
17189         case GNU_PROPERTY_X86_ISA_1_FMA:
17190           printf ("FMA");
17191           break;
17192         case GNU_PROPERTY_X86_ISA_1_AVX512F:
17193           printf ("AVX512F");
17194           break;
17195         case GNU_PROPERTY_X86_ISA_1_AVX512CD:
17196           printf ("AVX512CD");
17197           break;
17198         case GNU_PROPERTY_X86_ISA_1_AVX512ER:
17199           printf ("AVX512ER");
17200           break;
17201         case GNU_PROPERTY_X86_ISA_1_AVX512PF:
17202           printf ("AVX512PF");
17203           break;
17204         case GNU_PROPERTY_X86_ISA_1_AVX512VL:
17205           printf ("AVX512VL");
17206           break;
17207         case GNU_PROPERTY_X86_ISA_1_AVX512DQ:
17208           printf ("AVX512DQ");
17209           break;
17210         case GNU_PROPERTY_X86_ISA_1_AVX512BW:
17211           printf ("AVX512BW");
17212           break;
17213         case GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS:
17214           printf ("AVX512_4FMAPS");
17215           break;
17216         case GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW:
17217           printf ("AVX512_4VNNIW");
17218           break;
17219         case GNU_PROPERTY_X86_ISA_1_AVX512_BITALG:
17220           printf ("AVX512_BITALG");
17221           break;
17222         case GNU_PROPERTY_X86_ISA_1_AVX512_IFMA:
17223           printf ("AVX512_IFMA");
17224           break;
17225         case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI:
17226           printf ("AVX512_VBMI");
17227           break;
17228         case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2:
17229           printf ("AVX512_VBMI2");
17230           break;
17231         case GNU_PROPERTY_X86_ISA_1_AVX512_VNNI:
17232           printf ("AVX512_VNNI");
17233           break;
17234         default:
17235           printf (_("<unknown: %x>"), bit);
17236           break;
17237         }
17238       if (bitmask)
17239         printf (", ");
17240     }
17241 }
17242
17243 static void
17244 decode_x86_feature_1 (unsigned int bitmask)
17245 {
17246   if (!bitmask)
17247     {
17248       printf (_("<None>"));
17249       return;
17250     }
17251
17252   while (bitmask)
17253     {
17254       unsigned int bit = bitmask & (- bitmask);
17255
17256       bitmask &= ~ bit;
17257       switch (bit)
17258         {
17259         case GNU_PROPERTY_X86_FEATURE_1_IBT:
17260           printf ("IBT");
17261           break;
17262         case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
17263           printf ("SHSTK");
17264           break;
17265         default:
17266           printf (_("<unknown: %x>"), bit);
17267           break;
17268         }
17269       if (bitmask)
17270         printf (", ");
17271     }
17272 }
17273
17274 static void
17275 decode_x86_feature_2 (unsigned int bitmask)
17276 {
17277   if (!bitmask)
17278     {
17279       printf (_("<None>"));
17280       return;
17281     }
17282
17283   while (bitmask)
17284     {
17285       unsigned int bit = bitmask & (- bitmask);
17286
17287       bitmask &= ~ bit;
17288       switch (bit)
17289         {
17290         case GNU_PROPERTY_X86_FEATURE_2_X86:
17291           printf ("x86");
17292           break;
17293         case GNU_PROPERTY_X86_FEATURE_2_X87:
17294           printf ("x87");
17295           break;
17296         case GNU_PROPERTY_X86_FEATURE_2_MMX:
17297           printf ("MMX");
17298           break;
17299         case GNU_PROPERTY_X86_FEATURE_2_XMM:
17300           printf ("XMM");
17301           break;
17302         case GNU_PROPERTY_X86_FEATURE_2_YMM:
17303           printf ("YMM");
17304           break;
17305         case GNU_PROPERTY_X86_FEATURE_2_ZMM:
17306           printf ("ZMM");
17307           break;
17308         case GNU_PROPERTY_X86_FEATURE_2_FXSR:
17309           printf ("FXSR");
17310           break;
17311         case GNU_PROPERTY_X86_FEATURE_2_XSAVE:
17312           printf ("XSAVE");
17313           break;
17314         case GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT:
17315           printf ("XSAVEOPT");
17316           break;
17317         case GNU_PROPERTY_X86_FEATURE_2_XSAVEC:
17318           printf ("XSAVEC");
17319           break;
17320         default:
17321           printf (_("<unknown: %x>"), bit);
17322           break;
17323         }
17324       if (bitmask)
17325         printf (", ");
17326     }
17327 }
17328
17329 static void
17330 print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
17331 {
17332   unsigned char * ptr = (unsigned char *) pnote->descdata;
17333   unsigned char * ptr_end = ptr + pnote->descsz;
17334   unsigned int    size = is_32bit_elf ? 4 : 8;
17335
17336   printf (_("      Properties: "));
17337
17338   if (pnote->descsz < 8 || (pnote->descsz % size) != 0)
17339     {
17340       printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz);
17341       return;
17342     }
17343
17344   while (ptr < ptr_end)
17345     {
17346       unsigned int j;
17347       unsigned int type;
17348       unsigned int datasz;
17349
17350       if ((size_t) (ptr_end - ptr) < 8)
17351         {
17352           printf (_("<corrupt descsz: %#lx>\n"), pnote->descsz);
17353           break;
17354         }
17355
17356       type = byte_get (ptr, 4);
17357       datasz = byte_get (ptr + 4, 4);
17358
17359       ptr += 8;
17360
17361       if (datasz > (size_t) (ptr_end - ptr))
17362         {
17363           printf (_("<corrupt type (%#x) datasz: %#x>\n"),
17364                   type, datasz);
17365           break;
17366         }
17367
17368       if (type >= GNU_PROPERTY_LOPROC && type <= GNU_PROPERTY_HIPROC)
17369         {
17370           if (filedata->file_header.e_machine == EM_X86_64
17371               || filedata->file_header.e_machine == EM_IAMCU
17372               || filedata->file_header.e_machine == EM_386)
17373             {
17374               unsigned int bitmask;
17375
17376               if (datasz == 4)
17377                 bitmask = byte_get (ptr, 4);
17378               else
17379                 bitmask = 0;
17380
17381               switch (type)
17382                 {
17383                 case GNU_PROPERTY_X86_ISA_1_USED:
17384                   if (datasz != 4)
17385                     printf (_("x86 ISA used: <corrupt length: %#x> "),
17386                             datasz);
17387                   else
17388                     {
17389                       printf ("x86 ISA used: ");
17390                       decode_x86_isa (bitmask);
17391                     }
17392                   goto next;
17393
17394                 case GNU_PROPERTY_X86_ISA_1_NEEDED:
17395                   if (datasz != 4)
17396                     printf (_("x86 ISA needed: <corrupt length: %#x> "),
17397                             datasz);
17398                   else
17399                     {
17400                       printf ("x86 ISA needed: ");
17401                       decode_x86_isa (bitmask);
17402                     }
17403                   goto next;
17404
17405                 case GNU_PROPERTY_X86_FEATURE_1_AND:
17406                   if (datasz != 4)
17407                     printf (_("x86 feature: <corrupt length: %#x> "),
17408                             datasz);
17409                   else
17410                     {
17411                       printf ("x86 feature: ");
17412                       decode_x86_feature_1 (bitmask);
17413                     }
17414                   goto next;
17415
17416                 case GNU_PROPERTY_X86_FEATURE_2_USED:
17417                   if (datasz != 4)
17418                     printf (_("x86 feature used: <corrupt length: %#x> "),
17419                             datasz);
17420                   else
17421                     {
17422                       printf ("x86 feature used: ");
17423                       decode_x86_feature_2 (bitmask);
17424                     }
17425                   goto next;
17426
17427                 case GNU_PROPERTY_X86_FEATURE_2_NEEDED:
17428                   if (datasz != 4)
17429                     printf (_("x86 feature needed: <corrupt length: %#x> "), datasz);
17430                   else
17431                     {
17432                       printf ("x86 feature needed: ");
17433                       decode_x86_feature_2 (bitmask);
17434                     }
17435                   goto next;
17436
17437                 case GNU_PROPERTY_X86_COMPAT_ISA_1_USED:
17438                   if (datasz != 4)
17439                     printf (_("x86 ISA used: <corrupt length: %#x> "),
17440                             datasz);
17441                   else
17442                     {
17443                       printf ("x86 ISA used: ");
17444                       decode_x86_compat_isa (bitmask);
17445                     }
17446                   goto next;
17447
17448                 case GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED:
17449                   if (datasz != 4)
17450                     printf (_("x86 ISA needed: <corrupt length: %#x> "),
17451                             datasz);
17452                   else
17453                     {
17454                       printf ("x86 ISA needed: ");
17455                       decode_x86_compat_isa (bitmask);
17456                     }
17457                   goto next;
17458
17459                 default:
17460                   break;
17461                 }
17462             }
17463         }
17464       else
17465         {
17466           switch (type)
17467             {
17468             case GNU_PROPERTY_STACK_SIZE:
17469               printf (_("stack size: "));
17470               if (datasz != size)
17471                 printf (_("<corrupt length: %#x> "), datasz);
17472               else
17473                 printf ("%#lx", (unsigned long) byte_get (ptr, size));
17474               goto next;
17475
17476             case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
17477               printf ("no copy on protected ");
17478               if (datasz)
17479                 printf (_("<corrupt length: %#x> "), datasz);
17480               goto next;
17481
17482             default:
17483               break;
17484             }
17485         }
17486
17487       if (type < GNU_PROPERTY_LOPROC)
17488         printf (_("<unknown type %#x data: "), type);
17489       else if (type < GNU_PROPERTY_LOUSER)
17490         printf (_("<procesor-specific type %#x data: "), type);
17491       else
17492         printf (_("<application-specific type %#x data: "), type);
17493       for (j = 0; j < datasz; ++j)
17494         printf ("%02x ", ptr[j] & 0xff);
17495       printf (">");
17496
17497 next:
17498       ptr += ((datasz + (size - 1)) & ~ (size - 1));
17499       if (ptr == ptr_end)
17500         break;
17501
17502       if (do_wide)
17503         printf (", ");
17504       else
17505         printf ("\n\t");
17506     }
17507
17508   printf ("\n");
17509 }
17510
17511 static bfd_boolean
17512 print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
17513 {
17514   /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type ().  */
17515   switch (pnote->type)
17516     {
17517     case NT_GNU_BUILD_ID:
17518       {
17519         unsigned long i;
17520
17521         printf (_("    Build ID: "));
17522         for (i = 0; i < pnote->descsz; ++i)
17523           printf ("%02x", pnote->descdata[i] & 0xff);
17524         printf ("\n");
17525       }
17526       break;
17527
17528     case NT_GNU_ABI_TAG:
17529       {
17530         unsigned long os, major, minor, subminor;
17531         const char *osname;
17532
17533         /* PR 17531: file: 030-599401-0.004.  */
17534         if (pnote->descsz < 16)
17535           {
17536             printf (_("    <corrupt GNU_ABI_TAG>\n"));
17537             break;
17538           }
17539
17540         os = byte_get ((unsigned char *) pnote->descdata, 4);
17541         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17542         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
17543         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
17544
17545         switch (os)
17546           {
17547           case GNU_ABI_TAG_LINUX:
17548             osname = "Linux";
17549             break;
17550           case GNU_ABI_TAG_HURD:
17551             osname = "Hurd";
17552             break;
17553           case GNU_ABI_TAG_SOLARIS:
17554             osname = "Solaris";
17555             break;
17556           case GNU_ABI_TAG_FREEBSD:
17557             osname = "FreeBSD";
17558             break;
17559           case GNU_ABI_TAG_NETBSD:
17560             osname = "NetBSD";
17561             break;
17562           case GNU_ABI_TAG_SYLLABLE:
17563             osname = "Syllable";
17564             break;
17565           case GNU_ABI_TAG_NACL:
17566             osname = "NaCl";
17567             break;
17568           default:
17569             osname = "Unknown";
17570             break;
17571           }
17572
17573         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
17574                 major, minor, subminor);
17575       }
17576       break;
17577
17578     case NT_GNU_GOLD_VERSION:
17579       {
17580         unsigned long i;
17581
17582         printf (_("    Version: "));
17583         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
17584           printf ("%c", pnote->descdata[i]);
17585         printf ("\n");
17586       }
17587       break;
17588
17589     case NT_GNU_HWCAP:
17590       {
17591         unsigned long num_entries, mask;
17592
17593         /* Hardware capabilities information.  Word 0 is the number of entries.
17594            Word 1 is a bitmask of enabled entries.  The rest of the descriptor
17595            is a series of entries, where each entry is a single byte followed
17596            by a nul terminated string.  The byte gives the bit number to test
17597            if enabled in the bitmask.  */
17598         printf (_("      Hardware Capabilities: "));
17599         if (pnote->descsz < 8)
17600           {
17601             error (_("<corrupt GNU_HWCAP>\n"));
17602             return FALSE;
17603           }
17604         num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
17605         mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17606         printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
17607         /* FIXME: Add code to display the entries... */
17608       }
17609       break;
17610
17611     case NT_GNU_PROPERTY_TYPE_0:
17612       print_gnu_property_note (filedata, pnote);
17613       break;
17614       
17615     default:
17616       /* Handle unrecognised types.  An error message should have already been
17617          created by get_gnu_elf_note_type(), so all that we need to do is to
17618          display the data.  */
17619       {
17620         unsigned long i;
17621
17622         printf (_("    Description data: "));
17623         for (i = 0; i < pnote->descsz; ++i)
17624           printf ("%02x ", pnote->descdata[i] & 0xff);
17625         printf ("\n");
17626       }
17627       break;
17628     }
17629
17630   return TRUE;
17631 }
17632
17633 static const char *
17634 get_v850_elf_note_type (enum v850_notes n_type)
17635 {
17636   static char buff[64];
17637
17638   switch (n_type)
17639     {
17640     case V850_NOTE_ALIGNMENT:  return _("Alignment of 8-byte objects");
17641     case V850_NOTE_DATA_SIZE:  return _("Sizeof double and long double");
17642     case V850_NOTE_FPU_INFO:   return _("Type of FPU support needed");
17643     case V850_NOTE_SIMD_INFO:  return _("Use of SIMD instructions");
17644     case V850_NOTE_CACHE_INFO: return _("Use of cache");
17645     case V850_NOTE_MMU_INFO:   return _("Use of MMU");
17646     default:
17647       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
17648       return buff;
17649     }
17650 }
17651
17652 static bfd_boolean
17653 print_v850_note (Elf_Internal_Note * pnote)
17654 {
17655   unsigned int val;
17656
17657   if (pnote->descsz != 4)
17658     return FALSE;
17659
17660   val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
17661
17662   if (val == 0)
17663     {
17664       printf (_("not set\n"));
17665       return TRUE;
17666     }
17667
17668   switch (pnote->type)
17669     {
17670     case V850_NOTE_ALIGNMENT:
17671       switch (val)
17672         {
17673         case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return TRUE;
17674         case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return TRUE;
17675         }
17676       break;
17677
17678     case V850_NOTE_DATA_SIZE:
17679       switch (val)
17680         {
17681         case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return TRUE;
17682         case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return TRUE;
17683         }
17684       break;
17685
17686     case V850_NOTE_FPU_INFO:
17687       switch (val)
17688         {
17689         case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return TRUE;
17690         case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return TRUE;
17691         }
17692       break;
17693
17694     case V850_NOTE_MMU_INFO:
17695     case V850_NOTE_CACHE_INFO:
17696     case V850_NOTE_SIMD_INFO:
17697       if (val == EF_RH850_SIMD)
17698         {
17699           printf (_("yes\n"));
17700           return TRUE;
17701         }
17702       break;
17703
17704     default:
17705       /* An 'unknown note type' message will already have been displayed.  */
17706       break;
17707     }
17708
17709   printf (_("unknown value: %x\n"), val);
17710   return FALSE;
17711 }
17712
17713 static bfd_boolean
17714 process_netbsd_elf_note (Elf_Internal_Note * pnote)
17715 {
17716   unsigned int version;
17717
17718   switch (pnote->type)
17719     {
17720     case NT_NETBSD_IDENT:
17721       version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
17722       if ((version / 10000) % 100)
17723         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
17724                 version, version / 100000000, (version / 1000000) % 100,
17725                 (version / 10000) % 100 > 26 ? "Z" : "",
17726                 'A' + (version / 10000) % 26);
17727       else
17728         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
17729                 version, version / 100000000, (version / 1000000) % 100,
17730                 (version / 100) % 100);
17731       return TRUE;
17732
17733     case NT_NETBSD_MARCH:
17734       printf ("  NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
17735               pnote->descdata);
17736       return TRUE;
17737
17738     default:
17739       printf ("  NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
17740               pnote->type);
17741       return FALSE;
17742     }
17743 }
17744
17745 static const char *
17746 get_freebsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17747 {
17748   switch (e_type)
17749     {
17750     case NT_FREEBSD_THRMISC:
17751       return _("NT_THRMISC (thrmisc structure)");
17752     case NT_FREEBSD_PROCSTAT_PROC:
17753       return _("NT_PROCSTAT_PROC (proc data)");
17754     case NT_FREEBSD_PROCSTAT_FILES:
17755       return _("NT_PROCSTAT_FILES (files data)");
17756     case NT_FREEBSD_PROCSTAT_VMMAP:
17757       return _("NT_PROCSTAT_VMMAP (vmmap data)");
17758     case NT_FREEBSD_PROCSTAT_GROUPS:
17759       return _("NT_PROCSTAT_GROUPS (groups data)");
17760     case NT_FREEBSD_PROCSTAT_UMASK:
17761       return _("NT_PROCSTAT_UMASK (umask data)");
17762     case NT_FREEBSD_PROCSTAT_RLIMIT:
17763       return _("NT_PROCSTAT_RLIMIT (rlimit data)");
17764     case NT_FREEBSD_PROCSTAT_OSREL:
17765       return _("NT_PROCSTAT_OSREL (osreldate data)");
17766     case NT_FREEBSD_PROCSTAT_PSSTRINGS:
17767       return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
17768     case NT_FREEBSD_PROCSTAT_AUXV:
17769       return _("NT_PROCSTAT_AUXV (auxv data)");
17770     case NT_FREEBSD_PTLWPINFO:
17771       return _("NT_PTLWPINFO (ptrace_lwpinfo structure)");
17772     }
17773   return get_note_type (filedata, e_type);
17774 }
17775
17776 static const char *
17777 get_netbsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17778 {
17779   static char buff[64];
17780
17781   if (e_type == NT_NETBSDCORE_PROCINFO)
17782     return _("NetBSD procinfo structure");
17783
17784   /* As of Jan 2002 there are no other machine-independent notes
17785      defined for NetBSD core files.  If the note type is less
17786      than the start of the machine-dependent note types, we don't
17787      understand it.  */
17788
17789   if (e_type < NT_NETBSDCORE_FIRSTMACH)
17790     {
17791       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17792       return buff;
17793     }
17794
17795   switch (filedata->file_header.e_machine)
17796     {
17797     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
17798        and PT_GETFPREGS == mach+2.  */
17799
17800     case EM_OLD_ALPHA:
17801     case EM_ALPHA:
17802     case EM_SPARC:
17803     case EM_SPARC32PLUS:
17804     case EM_SPARCV9:
17805       switch (e_type)
17806         {
17807         case NT_NETBSDCORE_FIRSTMACH + 0:
17808           return _("PT_GETREGS (reg structure)");
17809         case NT_NETBSDCORE_FIRSTMACH + 2:
17810           return _("PT_GETFPREGS (fpreg structure)");
17811         default:
17812           break;
17813         }
17814       break;
17815
17816     /* On all other arch's, PT_GETREGS == mach+1 and
17817        PT_GETFPREGS == mach+3.  */
17818     default:
17819       switch (e_type)
17820         {
17821         case NT_NETBSDCORE_FIRSTMACH + 1:
17822           return _("PT_GETREGS (reg structure)");
17823         case NT_NETBSDCORE_FIRSTMACH + 3:
17824           return _("PT_GETFPREGS (fpreg structure)");
17825         default:
17826           break;
17827         }
17828     }
17829
17830   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
17831             e_type - NT_NETBSDCORE_FIRSTMACH);
17832   return buff;
17833 }
17834
17835 static const char *
17836 get_stapsdt_note_type (unsigned e_type)
17837 {
17838   static char buff[64];
17839
17840   switch (e_type)
17841     {
17842     case NT_STAPSDT:
17843       return _("NT_STAPSDT (SystemTap probe descriptors)");
17844
17845     default:
17846       break;
17847     }
17848
17849   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17850   return buff;
17851 }
17852
17853 static bfd_boolean
17854 print_stapsdt_note (Elf_Internal_Note *pnote)
17855 {
17856   int addr_size = is_32bit_elf ? 4 : 8;
17857   char *data = pnote->descdata;
17858   char *data_end = pnote->descdata + pnote->descsz;
17859   bfd_vma pc, base_addr, semaphore;
17860   char *provider, *probe, *arg_fmt;
17861
17862   pc = byte_get ((unsigned char *) data, addr_size);
17863   data += addr_size;
17864   base_addr = byte_get ((unsigned char *) data, addr_size);
17865   data += addr_size;
17866   semaphore = byte_get ((unsigned char *) data, addr_size);
17867   data += addr_size;
17868
17869   provider = data;
17870   data += strlen (data) + 1;
17871   probe = data;
17872   data += strlen (data) + 1;
17873   arg_fmt = data;
17874   data += strlen (data) + 1;
17875
17876   printf (_("    Provider: %s\n"), provider);
17877   printf (_("    Name: %s\n"), probe);
17878   printf (_("    Location: "));
17879   print_vma (pc, FULL_HEX);
17880   printf (_(", Base: "));
17881   print_vma (base_addr, FULL_HEX);
17882   printf (_(", Semaphore: "));
17883   print_vma (semaphore, FULL_HEX);
17884   printf ("\n");
17885   printf (_("    Arguments: %s\n"), arg_fmt);
17886
17887   return data == data_end;
17888 }
17889
17890 static const char *
17891 get_ia64_vms_note_type (unsigned e_type)
17892 {
17893   static char buff[64];
17894
17895   switch (e_type)
17896     {
17897     case NT_VMS_MHD:
17898       return _("NT_VMS_MHD (module header)");
17899     case NT_VMS_LNM:
17900       return _("NT_VMS_LNM (language name)");
17901     case NT_VMS_SRC:
17902       return _("NT_VMS_SRC (source files)");
17903     case NT_VMS_TITLE:
17904       return "NT_VMS_TITLE";
17905     case NT_VMS_EIDC:
17906       return _("NT_VMS_EIDC (consistency check)");
17907     case NT_VMS_FPMODE:
17908       return _("NT_VMS_FPMODE (FP mode)");
17909     case NT_VMS_LINKTIME:
17910       return "NT_VMS_LINKTIME";
17911     case NT_VMS_IMGNAM:
17912       return _("NT_VMS_IMGNAM (image name)");
17913     case NT_VMS_IMGID:
17914       return _("NT_VMS_IMGID (image id)");
17915     case NT_VMS_LINKID:
17916       return _("NT_VMS_LINKID (link id)");
17917     case NT_VMS_IMGBID:
17918       return _("NT_VMS_IMGBID (build id)");
17919     case NT_VMS_GSTNAM:
17920       return _("NT_VMS_GSTNAM (sym table name)");
17921     case NT_VMS_ORIG_DYN:
17922       return "NT_VMS_ORIG_DYN";
17923     case NT_VMS_PATCHTIME:
17924       return "NT_VMS_PATCHTIME";
17925     default:
17926       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17927       return buff;
17928     }
17929 }
17930
17931 static bfd_boolean
17932 print_ia64_vms_note (Elf_Internal_Note * pnote)
17933 {
17934   switch (pnote->type)
17935     {
17936     case NT_VMS_MHD:
17937       if (pnote->descsz > 36)
17938         {
17939           size_t l = strlen (pnote->descdata + 34);
17940           printf (_("    Creation date  : %.17s\n"), pnote->descdata);
17941           printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
17942           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
17943           printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
17944         }
17945       else
17946         printf (_("    Invalid size\n"));
17947       break;
17948     case NT_VMS_LNM:
17949       printf (_("   Language: %s\n"), pnote->descdata);
17950       break;
17951 #ifdef BFD64
17952     case NT_VMS_FPMODE:
17953       printf (_("   Floating Point mode: "));
17954       printf ("0x%016" BFD_VMA_FMT "x\n",
17955               (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
17956       break;
17957     case NT_VMS_LINKTIME:
17958       printf (_("   Link time: "));
17959       print_vms_time
17960         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
17961       printf ("\n");
17962       break;
17963     case NT_VMS_PATCHTIME:
17964       printf (_("   Patch time: "));
17965       print_vms_time
17966         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
17967       printf ("\n");
17968       break;
17969     case NT_VMS_ORIG_DYN:
17970       printf (_("   Major id: %u,  minor id: %u\n"),
17971               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
17972               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
17973       printf (_("   Last modified  : "));
17974       print_vms_time
17975         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
17976       printf (_("\n   Link flags  : "));
17977       printf ("0x%016" BFD_VMA_FMT "x\n",
17978               (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
17979       printf (_("   Header flags: 0x%08x\n"),
17980               (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
17981       printf (_("   Image id    : %s\n"), pnote->descdata + 32);
17982       break;
17983 #endif
17984     case NT_VMS_IMGNAM:
17985       printf (_("    Image name: %s\n"), pnote->descdata);
17986       break;
17987     case NT_VMS_GSTNAM:
17988       printf (_("    Global symbol table name: %s\n"), pnote->descdata);
17989       break;
17990     case NT_VMS_IMGID:
17991       printf (_("    Image id: %s\n"), pnote->descdata);
17992       break;
17993     case NT_VMS_LINKID:
17994       printf (_("    Linker id: %s\n"), pnote->descdata);
17995       break;
17996     default:
17997       return FALSE;
17998     }
17999   return TRUE;
18000 }
18001
18002 /* Find the symbol associated with a build attribute that is attached
18003    to address OFFSET.  If PNAME is non-NULL then store the name of
18004    the symbol (if found) in the provided pointer,  Returns NULL if a
18005    symbol could not be found.  */
18006
18007 static Elf_Internal_Sym *
18008 get_symbol_for_build_attribute (Filedata *       filedata,
18009                                 unsigned long    offset,
18010                                 bfd_boolean      is_open_attr,
18011                                 const char **    pname)
18012 {
18013   static Filedata *         saved_filedata = NULL;
18014   static char *             strtab;
18015   static unsigned long      strtablen;
18016   static Elf_Internal_Sym * symtab;
18017   static unsigned long      nsyms;
18018   Elf_Internal_Sym *        saved_sym = NULL;
18019   Elf_Internal_Sym *        sym;
18020
18021   if (filedata->section_headers != NULL
18022       && (saved_filedata == NULL || filedata != saved_filedata))
18023     {
18024       Elf_Internal_Shdr * symsec;
18025
18026       /* Load the symbol and string sections.  */
18027       for (symsec = filedata->section_headers;
18028            symsec < filedata->section_headers + filedata->file_header.e_shnum;
18029            symsec ++)
18030         {
18031           if (symsec->sh_type == SHT_SYMTAB)
18032             {
18033               symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
18034
18035               if (symsec->sh_link < filedata->file_header.e_shnum)
18036                 {
18037                   Elf_Internal_Shdr * strtab_sec = filedata->section_headers + symsec->sh_link;
18038
18039                   strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
18040                                               1, strtab_sec->sh_size,
18041                                               _("string table"));
18042                   strtablen = strtab != NULL ? strtab_sec->sh_size : 0;
18043                 }
18044             }
18045         }
18046       saved_filedata = filedata;
18047     }
18048
18049   if (symtab == NULL || strtab == NULL)
18050     return NULL;
18051
18052   /* Find a symbol whose value matches offset.  */
18053   for (sym = symtab; sym < symtab + nsyms; sym ++)
18054     if (sym->st_value == offset)
18055       {
18056         if (sym->st_name >= strtablen)
18057           /* Huh ?  This should not happen.  */
18058           continue;
18059
18060         if (strtab[sym->st_name] == 0)
18061           continue;
18062
18063         /* The AArch64 and ARM architectures define mapping symbols
18064            (eg $d, $x, $t) which we want to ignore.  */
18065         if (strtab[sym->st_name] == '$'
18066             && strtab[sym->st_name + 1] != 0
18067             && strtab[sym->st_name + 2] == 0)
18068           continue;
18069
18070         if (is_open_attr)
18071           {
18072             /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
18073                and FILE or OBJECT symbols over NOTYPE symbols.  We skip
18074                FUNC symbols entirely.  */
18075             switch (ELF_ST_TYPE (sym->st_info))
18076               {
18077               case STT_OBJECT:
18078               case STT_FILE:
18079                 saved_sym = sym;
18080                 if (sym->st_size)
18081                   {
18082                     /* If the symbol has a size associated
18083                        with it then we can stop searching.  */
18084                     sym = symtab + nsyms;
18085                   }
18086                 continue;
18087
18088               case STT_FUNC:
18089                 /* Ignore function symbols.  */
18090                 continue;
18091
18092               default:
18093                 break;
18094               }
18095
18096             switch (ELF_ST_BIND (sym->st_info))
18097               {
18098               case STB_GLOBAL:
18099                 if (saved_sym == NULL
18100                     || ELF_ST_TYPE (saved_sym->st_info) != STT_OBJECT)
18101                   saved_sym = sym;
18102                 break;
18103
18104               case STB_LOCAL:
18105                 if (saved_sym == NULL)
18106                   saved_sym = sym;
18107                 break;
18108
18109               default:
18110                 break;
18111               }
18112           }
18113         else
18114           {
18115             if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
18116               continue;
18117
18118             saved_sym = sym;
18119             break;
18120           }
18121       }
18122
18123   if (saved_sym && pname)
18124     * pname = strtab + saved_sym->st_name;
18125
18126   return saved_sym;
18127 }
18128
18129 /* Returns true iff addr1 and addr2 are in the same section.  */
18130
18131 static bfd_boolean
18132 same_section (Filedata * filedata, unsigned long addr1, unsigned long addr2)
18133 {
18134   Elf_Internal_Shdr * a1;
18135   Elf_Internal_Shdr * a2;
18136
18137   a1 = find_section_by_address (filedata, addr1);
18138   a2 = find_section_by_address (filedata, addr2);
18139   
18140   return a1 == a2 && a1 != NULL;
18141 }
18142
18143 static bfd_boolean
18144 print_gnu_build_attribute_description (Elf_Internal_Note *  pnote,
18145                                        Filedata *           filedata)
18146 {
18147   static unsigned long  global_offset = 0;
18148   static unsigned long  global_end = 0;
18149   static unsigned long  func_offset = 0;
18150   static unsigned long  func_end = 0;
18151
18152   Elf_Internal_Sym *    sym;
18153   const char *          name;
18154   unsigned long         start;
18155   unsigned long         end;
18156   bfd_boolean           is_open_attr = pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN;
18157
18158   switch (pnote->descsz)
18159     {
18160     case 0:
18161       /* A zero-length description means that the range of
18162          the previous note of the same type should be used.  */
18163       if (is_open_attr)
18164         {
18165           if (global_end > global_offset)
18166             printf (_("    Applies to region from %#lx to %#lx\n"),
18167                     global_offset, global_end);
18168           else
18169             printf (_("    Applies to region from %#lx\n"), global_offset);
18170         }
18171       else
18172         {
18173           if (func_end > func_offset)
18174             printf (_("    Applies to region from %#lx to %#lx\n"), func_offset, func_end);
18175           else
18176             printf (_("    Applies to region from %#lx\n"), func_offset);
18177         }
18178       return TRUE;
18179
18180     case 4:
18181       start = byte_get ((unsigned char *) pnote->descdata, 4);
18182       end = 0;
18183       break;
18184
18185     case 8:
18186       if (is_32bit_elf)
18187         {
18188           /* FIXME: We should check that version 3+ notes are being used here...  */
18189           start = byte_get ((unsigned char *) pnote->descdata, 4);
18190           end = byte_get ((unsigned char *) pnote->descdata + 4, 4);
18191         }
18192       else
18193         {
18194           start = byte_get ((unsigned char *) pnote->descdata, 8);
18195           end = 0;
18196         }
18197       break;
18198
18199     case 16:
18200       start = byte_get ((unsigned char *) pnote->descdata, 8);
18201       end = byte_get ((unsigned char *) pnote->descdata + 8, 8);
18202       break;
18203       
18204     default:
18205       error (_("    <invalid description size: %lx>\n"), pnote->descsz);
18206       printf (_("    <invalid descsz>"));
18207       return FALSE;
18208     }
18209
18210   name = NULL;
18211   sym = get_symbol_for_build_attribute (filedata, start, is_open_attr, & name);
18212   /* As of version 5 of the annobin plugin, filename symbols are biased by 2
18213      in order to avoid them being confused with the start address of the
18214      first function in the file...  */
18215   if (sym == NULL && is_open_attr)
18216     sym = get_symbol_for_build_attribute (filedata, start + 2, is_open_attr,
18217                                           & name);
18218
18219   if (end == 0 && sym != NULL && sym->st_size > 0)
18220     end = start + sym->st_size;
18221
18222   if (is_open_attr)
18223     {
18224       /* FIXME: Need to properly allow for section alignment.
18225          16 is just the alignment used on x86_64.  */
18226       if (global_end > 0
18227           && start > BFD_ALIGN (global_end, 16)
18228           /* Build notes are not guaranteed to be organised in order of
18229              increasing address, but we should find the all of the notes
18230              for one section in the same place.  */
18231           && same_section (filedata, start, global_end))
18232         warn (_("Gap in build notes detected from %#lx to %#lx\n"),
18233               global_end + 1, start - 1);
18234
18235       printf (_("    Applies to region from %#lx"), start);
18236       global_offset = start;
18237
18238       if (end)
18239         {
18240           printf (_(" to %#lx"), end);
18241           global_end = end;
18242         }
18243     }
18244   else
18245     {
18246       printf (_("    Applies to region from %#lx"), start);
18247       func_offset = start;
18248
18249       if (end)
18250         {
18251           printf (_(" to %#lx"), end);
18252           func_end = end;
18253         }
18254     }
18255
18256   if (sym && name)
18257     printf (_(" (%s)"), name);
18258
18259   printf ("\n");
18260   return TRUE;
18261 }
18262
18263 static bfd_boolean
18264 print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
18265 {
18266   static const char string_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_STRING, 0 };
18267   static const char number_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC, 0 };
18268   static const char bool_expected [3] = { GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE, GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE, 0 };
18269   char         name_type;
18270   char         name_attribute;
18271   const char * expected_types;
18272   const char * name = pnote->namedata;
18273   const char * text;
18274   signed int   left;
18275
18276   if (name == NULL || pnote->namesz < 2)
18277     {
18278       error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
18279       print_symbol (-20, _("  <corrupt name>"));
18280       return FALSE;
18281     }
18282
18283   if (do_wide)
18284     left = 28;
18285   else
18286     left = 20;
18287
18288   /* Version 2 of the spec adds a "GA" prefix to the name field.  */
18289   if (name[0] == 'G' && name[1] == 'A')
18290     {
18291       if (pnote->namesz < 4)
18292         {
18293           error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
18294           print_symbol (-20, _("  <corrupt name>"));
18295           return FALSE;
18296         }
18297
18298       printf ("GA");
18299       name += 2;
18300       left -= 2;
18301     }
18302
18303   switch ((name_type = * name))
18304     {
18305     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18306     case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
18307     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
18308     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
18309       printf ("%c", * name);
18310       left --;
18311       break;
18312     default:
18313       error (_("unrecognised attribute type in name field: %d\n"), name_type);
18314       print_symbol (-20, _("<unknown name type>"));
18315       return FALSE;
18316     }
18317
18318   ++ name;
18319   text = NULL;
18320
18321   switch ((name_attribute = * name))
18322     {
18323     case GNU_BUILD_ATTRIBUTE_VERSION:
18324       text = _("<version>");
18325       expected_types = string_expected;
18326       ++ name;
18327       break;
18328     case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18329       text = _("<stack prot>");
18330       expected_types = "!+*";
18331       ++ name;
18332       break;
18333     case GNU_BUILD_ATTRIBUTE_RELRO:
18334       text = _("<relro>");
18335       expected_types = bool_expected;
18336       ++ name;
18337       break;
18338     case GNU_BUILD_ATTRIBUTE_STACK_SIZE:
18339       text = _("<stack size>");
18340       expected_types = number_expected;
18341       ++ name;
18342       break;
18343     case GNU_BUILD_ATTRIBUTE_TOOL:
18344       text = _("<tool>");
18345       expected_types = string_expected;
18346       ++ name;
18347       break;
18348     case GNU_BUILD_ATTRIBUTE_ABI:
18349       text = _("<ABI>");
18350       expected_types = "$*";
18351       ++ name;
18352       break;
18353     case GNU_BUILD_ATTRIBUTE_PIC:
18354       text = _("<PIC>");
18355       expected_types = number_expected;
18356       ++ name;
18357       break;
18358     case GNU_BUILD_ATTRIBUTE_SHORT_ENUM:
18359       text = _("<short enum>");
18360       expected_types = bool_expected;
18361       ++ name;
18362       break;
18363     default:
18364       if (ISPRINT (* name))
18365         {
18366           int len = strnlen (name, pnote->namesz - (name - pnote->namedata)) + 1;
18367
18368           if (len > left && ! do_wide)
18369             len = left;
18370           printf ("%.*s:", len, name);
18371           left -= len;
18372           name += len;
18373         }
18374       else
18375         {
18376           static char tmpbuf [128];
18377
18378           error (_("unrecognised byte in name field: %d\n"), * name);
18379           sprintf (tmpbuf, _("<unknown:_%d>"), * name);
18380           text = tmpbuf;
18381           name ++;
18382         }
18383       expected_types = "*$!+";
18384       break;
18385     }
18386
18387   if (text)
18388     left -= printf ("%s", text);
18389
18390   if (strchr (expected_types, name_type) == NULL)
18391     warn (_("attribute does not have an expected type (%c)\n"), name_type);
18392
18393   if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
18394     {
18395       error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
18396              (unsigned long) pnote->namesz,
18397              (long) (name - pnote->namedata));
18398       return FALSE;
18399     }
18400
18401   if (left < 1 && ! do_wide)
18402     return TRUE;
18403
18404   switch (name_type)
18405     {
18406     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18407       {
18408         unsigned int        bytes;
18409         unsigned long long  val = 0;
18410         unsigned int        shift = 0;
18411         char *              decoded = NULL;
18412
18413         bytes = pnote->namesz - (name - pnote->namedata);
18414         if (bytes > 0)
18415           /* The -1 is because the name field is always 0 terminated, and we
18416              want to be able to ensure that the shift in the while loop below
18417              will not overflow.  */
18418           -- bytes;
18419
18420         if (bytes > sizeof (val))
18421           {
18422             error (_("corrupt numeric name field: too many bytes in the value: %x\n"),
18423                    bytes);
18424             bytes = sizeof (val);
18425           }
18426         /* We do not bother to warn if bytes == 0 as this can
18427            happen with some early versions of the gcc plugin.  */
18428
18429         while (bytes --)
18430           {
18431             unsigned long byte = (* name ++) & 0xff;
18432
18433             val |= byte << shift;
18434             shift += 8;
18435           }
18436
18437         switch (name_attribute)
18438           {
18439           case GNU_BUILD_ATTRIBUTE_PIC:
18440             switch (val)
18441               {
18442               case 0: decoded = "static"; break;
18443               case 1: decoded = "pic"; break;
18444               case 2: decoded = "PIC"; break;
18445               case 3: decoded = "pie"; break;
18446               case 4: decoded = "PIE"; break;
18447               default: break;
18448               }
18449             break;
18450           case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18451             switch (val)
18452               {
18453                 /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c.  */
18454               case 0: decoded = "off"; break;
18455               case 1: decoded = "on"; break;
18456               case 2: decoded = "all"; break;
18457               case 3: decoded = "strong"; break;
18458               case 4: decoded = "explicit"; break;
18459               default: break;
18460               }
18461             break;
18462           default:
18463             break;
18464           }
18465
18466         if (decoded != NULL)
18467           {
18468             print_symbol (-left, decoded);
18469             left = 0;
18470           }
18471         else if (val == 0)
18472           {
18473             printf ("0x0");
18474             left -= 3;
18475           }
18476         else
18477           {
18478             if (do_wide)
18479               left -= printf ("0x%llx", val);
18480             else
18481               left -= printf ("0x%-.*llx", left, val);
18482           }
18483       }
18484       break;
18485     case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
18486       left -= print_symbol (- left, name);
18487       break;
18488     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
18489       left -= print_symbol (- left, "true");
18490       break;
18491     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
18492       left -= print_symbol (- left, "false");
18493       break;
18494     }
18495
18496   if (do_wide && left > 0)
18497     printf ("%-*s", left, " ");
18498     
18499   return TRUE;
18500 }
18501
18502 /* Note that by the ELF standard, the name field is already null byte
18503    terminated, and namesz includes the terminating null byte.
18504    I.E. the value of namesz for the name "FSF" is 4.
18505
18506    If the value of namesz is zero, there is no name present.  */
18507
18508 static bfd_boolean
18509 process_note (Elf_Internal_Note *  pnote,
18510               Filedata *           filedata)
18511 {
18512   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
18513   const char * nt;
18514
18515   if (pnote->namesz == 0)
18516     /* If there is no note name, then use the default set of
18517        note type strings.  */
18518     nt = get_note_type (filedata, pnote->type);
18519
18520   else if (const_strneq (pnote->namedata, "GNU"))
18521     /* GNU-specific object file notes.  */
18522     nt = get_gnu_elf_note_type (pnote->type);
18523
18524   else if (const_strneq (pnote->namedata, "FreeBSD"))
18525     /* FreeBSD-specific core file notes.  */
18526     nt = get_freebsd_elfcore_note_type (filedata, pnote->type);
18527
18528   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
18529     /* NetBSD-specific core file notes.  */
18530     nt = get_netbsd_elfcore_note_type (filedata, pnote->type);
18531
18532   else if (const_strneq (pnote->namedata, "NetBSD"))
18533     /* NetBSD-specific core file notes.  */
18534     return process_netbsd_elf_note (pnote);
18535
18536   else if (strneq (pnote->namedata, "SPU/", 4))
18537     {
18538       /* SPU-specific core file notes.  */
18539       nt = pnote->namedata + 4;
18540       name = "SPU";
18541     }
18542
18543   else if (const_strneq (pnote->namedata, "IPF/VMS"))
18544     /* VMS/ia64-specific file notes.  */
18545     nt = get_ia64_vms_note_type (pnote->type);
18546
18547   else if (const_strneq (pnote->namedata, "stapsdt"))
18548     nt = get_stapsdt_note_type (pnote->type);
18549
18550   else
18551     /* Don't recognize this note name; just use the default set of
18552        note type strings.  */
18553     nt = get_note_type (filedata, pnote->type);
18554
18555   printf ("  ");
18556
18557   if (((const_strneq (pnote->namedata, "GA")
18558         && strchr ("*$!+", pnote->namedata[2]) != NULL)
18559        || strchr ("*$!+", pnote->namedata[0]) != NULL)
18560       && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18561           || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
18562     print_gnu_build_attribute_name (pnote);
18563   else
18564     print_symbol (-20, name);
18565
18566   if (do_wide)
18567     printf (" 0x%08lx\t%s\t", pnote->descsz, nt);
18568   else
18569     printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
18570
18571   if (const_strneq (pnote->namedata, "IPF/VMS"))
18572     return print_ia64_vms_note (pnote);
18573   else if (const_strneq (pnote->namedata, "GNU"))
18574     return print_gnu_note (filedata, pnote);
18575   else if (const_strneq (pnote->namedata, "stapsdt"))
18576     return print_stapsdt_note (pnote);
18577   else if (const_strneq (pnote->namedata, "CORE"))
18578     return print_core_note (pnote);
18579   else if (((const_strneq (pnote->namedata, "GA")
18580              && strchr ("*$!+", pnote->namedata[2]) != NULL)
18581             || strchr ("*$!+", pnote->namedata[0]) != NULL)
18582            && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18583                || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
18584     return print_gnu_build_attribute_description (pnote, filedata);
18585
18586   if (pnote->descsz)
18587     {
18588       unsigned long i;
18589
18590       printf (_("   description data: "));
18591       for (i = 0; i < pnote->descsz; i++)
18592         printf ("%02x ", pnote->descdata[i]);
18593       if (!do_wide)
18594         printf ("\n");
18595     }
18596
18597   if (do_wide)
18598     printf ("\n");
18599
18600   return TRUE;
18601 }
18602
18603 static bfd_boolean
18604 process_notes_at (Filedata *           filedata,
18605                   Elf_Internal_Shdr *  section,
18606                   bfd_vma              offset,
18607                   bfd_vma              length,
18608                   bfd_vma              align)
18609 {
18610   Elf_External_Note * pnotes;
18611   Elf_External_Note * external;
18612   char *              end;
18613   bfd_boolean         res = TRUE;
18614
18615   if (length <= 0)
18616     return FALSE;
18617
18618   if (section)
18619     {
18620       pnotes = (Elf_External_Note *) get_section_contents (section, filedata);
18621       if (pnotes)
18622         {
18623           if (! apply_relocations (filedata, section, (unsigned char *) pnotes, length, NULL, NULL))
18624             return FALSE;
18625         }
18626     }
18627   else
18628     pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18629                                              _("notes"));
18630
18631   if (pnotes == NULL)
18632     return FALSE;
18633
18634   external = pnotes;
18635
18636   if (section)
18637     printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (filedata, section));
18638   else
18639     printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
18640             (unsigned long) offset, (unsigned long) length);
18641
18642   /* NB: Some note sections may have alignment value of 0 or 1.  gABI
18643      specifies that notes should be aligned to 4 bytes in 32-bit
18644      objects and to 8 bytes in 64-bit objects.  As a Linux extension,
18645      we also support 4 byte alignment in 64-bit objects.  If section
18646      alignment is less than 4, we treate alignment as 4 bytes.   */
18647   if (align < 4)
18648     align = 4;
18649   else if (align != 4 && align != 8)
18650     {
18651       warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
18652             (long) align);
18653       return FALSE;
18654     }
18655
18656   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
18657
18658   end = (char *) pnotes + length;
18659   while ((char *) external < end)
18660     {
18661       Elf_Internal_Note inote;
18662       size_t min_notesz;
18663       char * next;
18664       char * temp = NULL;
18665       size_t data_remaining = end - (char *) external;
18666
18667       if (!is_ia64_vms (filedata))
18668         {
18669           /* PR binutils/15191
18670              Make sure that there is enough data to read.  */
18671           min_notesz = offsetof (Elf_External_Note, name);
18672           if (data_remaining < min_notesz)
18673             {
18674               warn (ngettext ("Corrupt note: only %ld byte remains, "
18675                               "not enough for a full note\n",
18676                               "Corrupt note: only %ld bytes remain, "
18677                               "not enough for a full note\n",
18678                               data_remaining),
18679                     (long) data_remaining);
18680               break;
18681             }
18682           data_remaining -= min_notesz;
18683
18684           inote.type     = BYTE_GET (external->type);
18685           inote.namesz   = BYTE_GET (external->namesz);
18686           inote.namedata = external->name;
18687           inote.descsz   = BYTE_GET (external->descsz);
18688           inote.descdata = ((char *) external
18689                             + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
18690           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
18691           next = ((char *) external
18692                   + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
18693         }
18694       else
18695         {
18696           Elf64_External_VMS_Note *vms_external;
18697
18698           /* PR binutils/15191
18699              Make sure that there is enough data to read.  */
18700           min_notesz = offsetof (Elf64_External_VMS_Note, name);
18701           if (data_remaining < min_notesz)
18702             {
18703               warn (ngettext ("Corrupt note: only %ld byte remains, "
18704                               "not enough for a full note\n",
18705                               "Corrupt note: only %ld bytes remain, "
18706                               "not enough for a full note\n",
18707                               data_remaining),
18708                     (long) data_remaining);
18709               break;
18710             }
18711           data_remaining -= min_notesz;
18712
18713           vms_external = (Elf64_External_VMS_Note *) external;
18714           inote.type     = BYTE_GET (vms_external->type);
18715           inote.namesz   = BYTE_GET (vms_external->namesz);
18716           inote.namedata = vms_external->name;
18717           inote.descsz   = BYTE_GET (vms_external->descsz);
18718           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
18719           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
18720           next = inote.descdata + align_power (inote.descsz, 3);
18721         }
18722
18723       /* PR 17531: file: 3443835e.  */
18724       /* PR 17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4.  */
18725       if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
18726           || (size_t) (inote.descdata - inote.namedata) > data_remaining
18727           || (size_t) (next - inote.descdata) < inote.descsz
18728           || ((size_t) (next - inote.descdata)
18729               > data_remaining - (size_t) (inote.descdata - inote.namedata)))
18730         {
18731           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
18732                 (unsigned long) ((char *) external - (char *) pnotes));
18733           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
18734                 inote.type, inote.namesz, inote.descsz, (int) align);
18735           break;
18736         }
18737
18738       external = (Elf_External_Note *) next;
18739
18740       /* Verify that name is null terminated.  It appears that at least
18741          one version of Linux (RedHat 6.0) generates corefiles that don't
18742          comply with the ELF spec by failing to include the null byte in
18743          namesz.  */
18744       if (inote.namedata[inote.namesz - 1] != '\0')
18745         {
18746           if ((size_t) (inote.descdata - inote.namedata) == inote.namesz)
18747             {
18748               temp = (char *) malloc (inote.namesz + 1);
18749               if (temp == NULL)
18750                 {
18751                   error (_("Out of memory allocating space for inote name\n"));
18752                   res = FALSE;
18753                   break;
18754                 }
18755
18756               memcpy (temp, inote.namedata, inote.namesz);
18757               inote.namedata = temp;
18758             }
18759           inote.namedata[inote.namesz] = 0;
18760         }
18761
18762       if (! process_note (& inote, filedata))
18763         res = FALSE;
18764
18765       if (temp != NULL)
18766         {
18767           free (temp);
18768           temp = NULL;
18769         }
18770     }
18771
18772   free (pnotes);
18773
18774   return res;
18775 }
18776
18777 static bfd_boolean
18778 process_corefile_note_segments (Filedata * filedata)
18779 {
18780   Elf_Internal_Phdr * segment;
18781   unsigned int i;
18782   bfd_boolean res = TRUE;
18783
18784   if (! get_program_headers (filedata))
18785     return TRUE;
18786
18787   for (i = 0, segment = filedata->program_headers;
18788        i < filedata->file_header.e_phnum;
18789        i++, segment++)
18790     {
18791       if (segment->p_type == PT_NOTE)
18792         if (! process_notes_at (filedata, NULL,
18793                                 (bfd_vma) segment->p_offset,
18794                                 (bfd_vma) segment->p_filesz,
18795                                 (bfd_vma) segment->p_align))
18796           res = FALSE;
18797     }
18798
18799   return res;
18800 }
18801
18802 static bfd_boolean
18803 process_v850_notes (Filedata * filedata, bfd_vma offset, bfd_vma length)
18804 {
18805   Elf_External_Note * pnotes;
18806   Elf_External_Note * external;
18807   char * end;
18808   bfd_boolean res = TRUE;
18809
18810   if (length <= 0)
18811     return FALSE;
18812
18813   pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18814                                            _("v850 notes"));
18815   if (pnotes == NULL)
18816     return FALSE;
18817
18818   external = pnotes;
18819   end = (char*) pnotes + length;
18820
18821   printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
18822           (unsigned long) offset, (unsigned long) length);
18823
18824   while ((char *) external + sizeof (Elf_External_Note) < end)
18825     {
18826       Elf_External_Note * next;
18827       Elf_Internal_Note inote;
18828
18829       inote.type     = BYTE_GET (external->type);
18830       inote.namesz   = BYTE_GET (external->namesz);
18831       inote.namedata = external->name;
18832       inote.descsz   = BYTE_GET (external->descsz);
18833       inote.descdata = inote.namedata + align_power (inote.namesz, 2);
18834       inote.descpos  = offset + (inote.descdata - (char *) pnotes);
18835
18836       if (inote.descdata < (char *) pnotes || inote.descdata >= end)
18837         {
18838           warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
18839           inote.descdata = inote.namedata;
18840           inote.namesz   = 0;
18841         }
18842
18843       next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
18844
18845       if (   ((char *) next > end)
18846           || ((char *) next <  (char *) pnotes))
18847         {
18848           warn (_("corrupt descsz found in note at offset 0x%lx\n"),
18849                 (unsigned long) ((char *) external - (char *) pnotes));
18850           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
18851                 inote.type, inote.namesz, inote.descsz);
18852           break;
18853         }
18854
18855       external = next;
18856
18857       /* Prevent out-of-bounds indexing.  */
18858       if (   inote.namedata + inote.namesz > end
18859           || inote.namedata + inote.namesz < inote.namedata)
18860         {
18861           warn (_("corrupt namesz found in note at offset 0x%lx\n"),
18862                 (unsigned long) ((char *) external - (char *) pnotes));
18863           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
18864                 inote.type, inote.namesz, inote.descsz);
18865           break;
18866         }
18867
18868       printf ("  %s: ", get_v850_elf_note_type (inote.type));
18869
18870       if (! print_v850_note (& inote))
18871         {
18872           res = FALSE;
18873           printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
18874                   inote.namesz, inote.descsz);
18875         }
18876     }
18877
18878   free (pnotes);
18879
18880   return res;
18881 }
18882
18883 static bfd_boolean
18884 process_note_sections (Filedata * filedata)
18885 {
18886   Elf_Internal_Shdr * section;
18887   unsigned long i;
18888   unsigned int n = 0;
18889   bfd_boolean res = TRUE;
18890
18891   for (i = 0, section = filedata->section_headers;
18892        i < filedata->file_header.e_shnum && section != NULL;
18893        i++, section++)
18894     {
18895       if (section->sh_type == SHT_NOTE)
18896         {
18897           if (! process_notes_at (filedata, section,
18898                                   (bfd_vma) section->sh_offset,
18899                                   (bfd_vma) section->sh_size,
18900                                   (bfd_vma) section->sh_addralign))
18901             res = FALSE;
18902           n++;
18903         }
18904
18905       if ((   filedata->file_header.e_machine == EM_V800
18906            || filedata->file_header.e_machine == EM_V850
18907            || filedata->file_header.e_machine == EM_CYGNUS_V850)
18908           && section->sh_type == SHT_RENESAS_INFO)
18909         {
18910           if (! process_v850_notes (filedata,
18911                                     (bfd_vma) section->sh_offset,
18912                                     (bfd_vma) section->sh_size))
18913             res = FALSE;
18914           n++;
18915         }
18916     }
18917
18918   if (n == 0)
18919     /* Try processing NOTE segments instead.  */
18920     return process_corefile_note_segments (filedata);
18921
18922   return res;
18923 }
18924
18925 static bfd_boolean
18926 process_notes (Filedata * filedata)
18927 {
18928   /* If we have not been asked to display the notes then do nothing.  */
18929   if (! do_notes)
18930     return TRUE;
18931
18932   if (filedata->file_header.e_type != ET_CORE)
18933     return process_note_sections (filedata);
18934
18935   /* No program headers means no NOTE segment.  */
18936   if (filedata->file_header.e_phnum > 0)
18937     return process_corefile_note_segments (filedata);
18938
18939   printf (_("No note segments present in the core file.\n"));
18940   return TRUE;
18941 }
18942
18943 static unsigned char *
18944 display_public_gnu_attributes (unsigned char * start,
18945                                const unsigned char * const end)
18946 {
18947   printf (_("  Unknown GNU attribute: %s\n"), start);
18948
18949   start += strnlen ((char *) start, end - start);
18950   display_raw_attribute (start, end);
18951
18952   return (unsigned char *) end;
18953 }
18954
18955 static unsigned char *
18956 display_generic_attribute (unsigned char * start,
18957                            unsigned int tag,
18958                            const unsigned char * const end)
18959 {
18960   if (tag == 0)
18961     return (unsigned char *) end;
18962
18963   return display_tag_value (tag, start, end);
18964 }
18965
18966 static bfd_boolean
18967 process_arch_specific (Filedata * filedata)
18968 {
18969   if (! do_arch)
18970     return TRUE;
18971
18972   switch (filedata->file_header.e_machine)
18973     {
18974     case EM_ARC:
18975     case EM_ARC_COMPACT:
18976     case EM_ARC_COMPACT2:
18977       return process_attributes (filedata, "ARC", SHT_ARC_ATTRIBUTES,
18978                                  display_arc_attribute,
18979                                  display_generic_attribute);
18980     case EM_ARM:
18981       return process_attributes (filedata, "aeabi", SHT_ARM_ATTRIBUTES,
18982                                  display_arm_attribute,
18983                                  display_generic_attribute);
18984
18985     case EM_MIPS:
18986     case EM_MIPS_RS3_LE:
18987       return process_mips_specific (filedata);
18988
18989     case EM_MSP430:
18990      return process_attributes (filedata, "mspabi", SHT_MSP430_ATTRIBUTES,
18991                                 display_msp430x_attribute,
18992                                 display_generic_attribute);
18993
18994     case EM_RISCV:
18995      return process_attributes (filedata, "riscv", SHT_RISCV_ATTRIBUTES,
18996                                 display_riscv_attribute,
18997                                 display_generic_attribute);
18998
18999     case EM_NDS32:
19000       return process_nds32_specific (filedata);
19001
19002     case EM_PPC:
19003     case EM_PPC64:
19004       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19005                                  display_power_gnu_attribute);
19006
19007     case EM_S390:
19008     case EM_S390_OLD:
19009       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19010                                  display_s390_gnu_attribute);
19011
19012     case EM_SPARC:
19013     case EM_SPARC32PLUS:
19014     case EM_SPARCV9:
19015       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19016                                  display_sparc_gnu_attribute);
19017
19018     case EM_TI_C6000:
19019       return process_attributes (filedata, "c6xabi", SHT_C6000_ATTRIBUTES,
19020                                  display_tic6x_attribute,
19021                                  display_generic_attribute);
19022
19023     default:
19024       return process_attributes (filedata, "gnu", SHT_GNU_ATTRIBUTES,
19025                                  display_public_gnu_attributes,
19026                                  display_generic_attribute);
19027     }
19028 }
19029
19030 static bfd_boolean
19031 get_file_header (Filedata * filedata)
19032 {
19033   /* Read in the identity array.  */
19034   if (fread (filedata->file_header.e_ident, EI_NIDENT, 1, filedata->handle) != 1)
19035     return FALSE;
19036
19037   /* Determine how to read the rest of the header.  */
19038   switch (filedata->file_header.e_ident[EI_DATA])
19039     {
19040     default:
19041     case ELFDATANONE:
19042     case ELFDATA2LSB:
19043       byte_get = byte_get_little_endian;
19044       byte_put = byte_put_little_endian;
19045       break;
19046     case ELFDATA2MSB:
19047       byte_get = byte_get_big_endian;
19048       byte_put = byte_put_big_endian;
19049       break;
19050     }
19051
19052   /* For now we only support 32 bit and 64 bit ELF files.  */
19053   is_32bit_elf = (filedata->file_header.e_ident[EI_CLASS] != ELFCLASS64);
19054
19055   /* Read in the rest of the header.  */
19056   if (is_32bit_elf)
19057     {
19058       Elf32_External_Ehdr ehdr32;
19059
19060       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, filedata->handle) != 1)
19061         return FALSE;
19062
19063       filedata->file_header.e_type      = BYTE_GET (ehdr32.e_type);
19064       filedata->file_header.e_machine   = BYTE_GET (ehdr32.e_machine);
19065       filedata->file_header.e_version   = BYTE_GET (ehdr32.e_version);
19066       filedata->file_header.e_entry     = BYTE_GET (ehdr32.e_entry);
19067       filedata->file_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
19068       filedata->file_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
19069       filedata->file_header.e_flags     = BYTE_GET (ehdr32.e_flags);
19070       filedata->file_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
19071       filedata->file_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
19072       filedata->file_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
19073       filedata->file_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
19074       filedata->file_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
19075       filedata->file_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
19076     }
19077   else
19078     {
19079       Elf64_External_Ehdr ehdr64;
19080
19081       /* If we have been compiled with sizeof (bfd_vma) == 4, then
19082          we will not be able to cope with the 64bit data found in
19083          64 ELF files.  Detect this now and abort before we start
19084          overwriting things.  */
19085       if (sizeof (bfd_vma) < 8)
19086         {
19087           error (_("This instance of readelf has been built without support for a\n\
19088 64 bit data type and so it cannot read 64 bit ELF files.\n"));
19089           return FALSE;
19090         }
19091
19092       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, filedata->handle) != 1)
19093         return FALSE;
19094
19095       filedata->file_header.e_type      = BYTE_GET (ehdr64.e_type);
19096       filedata->file_header.e_machine   = BYTE_GET (ehdr64.e_machine);
19097       filedata->file_header.e_version   = BYTE_GET (ehdr64.e_version);
19098       filedata->file_header.e_entry     = BYTE_GET (ehdr64.e_entry);
19099       filedata->file_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
19100       filedata->file_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
19101       filedata->file_header.e_flags     = BYTE_GET (ehdr64.e_flags);
19102       filedata->file_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
19103       filedata->file_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
19104       filedata->file_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
19105       filedata->file_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
19106       filedata->file_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
19107       filedata->file_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
19108     }
19109
19110   if (filedata->file_header.e_shoff)
19111     {
19112       /* There may be some extensions in the first section header.  Don't
19113          bomb if we can't read it.  */
19114       if (is_32bit_elf)
19115         get_32bit_section_headers (filedata, TRUE);
19116       else
19117         get_64bit_section_headers (filedata, TRUE);
19118     }
19119
19120   return TRUE;
19121 }
19122
19123 static void
19124 close_file (Filedata * filedata)
19125 {
19126   if (filedata)
19127     {
19128       if (filedata->handle)
19129         fclose (filedata->handle);
19130       free (filedata);
19131     }
19132 }
19133
19134 void
19135 close_debug_file (void * data)
19136 {
19137   close_file ((Filedata *) data);
19138 }
19139
19140 static Filedata *
19141 open_file (const char * pathname)
19142 {
19143   struct stat  statbuf;
19144   Filedata *   filedata = NULL;
19145
19146   if (stat (pathname, & statbuf) < 0
19147       || ! S_ISREG (statbuf.st_mode))
19148     goto fail;
19149
19150   filedata = calloc (1, sizeof * filedata);
19151   if (filedata == NULL)
19152     goto fail;
19153
19154   filedata->handle = fopen (pathname, "rb");
19155   if (filedata->handle == NULL)
19156     goto fail;
19157
19158   filedata->file_size = (bfd_size_type) statbuf.st_size;
19159   filedata->file_name = pathname;
19160
19161   if (! get_file_header (filedata))
19162     goto fail;
19163
19164   if (filedata->file_header.e_shoff)
19165     {
19166       bfd_boolean res;
19167
19168       /* Read the section headers again, this time for real.  */
19169       if (is_32bit_elf)
19170         res = get_32bit_section_headers (filedata, FALSE);
19171       else
19172         res = get_64bit_section_headers (filedata, FALSE);
19173
19174       if (!res)
19175         goto fail;
19176     }
19177
19178   return filedata;
19179
19180  fail:
19181   if (filedata)
19182     {
19183       if (filedata->handle)
19184         fclose (filedata->handle);
19185       free (filedata);
19186     }
19187   return NULL;
19188 }
19189
19190 void *
19191 open_debug_file (const char * pathname)
19192 {
19193   return open_file (pathname);
19194 }
19195
19196 /* Process one ELF object file according to the command line options.
19197    This file may actually be stored in an archive.  The file is
19198    positioned at the start of the ELF object.  Returns TRUE if no
19199    problems were encountered, FALSE otherwise.  */
19200
19201 static bfd_boolean
19202 process_object (Filedata * filedata)
19203 {
19204   Filedata * separates;
19205   unsigned int i;
19206   bfd_boolean res = TRUE;
19207
19208   if (! get_file_header (filedata))
19209     {
19210       error (_("%s: Failed to read file header\n"), filedata->file_name);
19211       return FALSE;
19212     }
19213
19214   /* Initialise per file variables.  */
19215   for (i = ARRAY_SIZE (version_info); i--;)
19216     version_info[i] = 0;
19217
19218   for (i = ARRAY_SIZE (dynamic_info); i--;)
19219     dynamic_info[i] = 0;
19220   dynamic_info_DT_GNU_HASH = 0;
19221
19222   /* Process the file.  */
19223   if (show_name)
19224     printf (_("\nFile: %s\n"), filedata->file_name);
19225
19226   /* Initialise the dump_sects array from the cmdline_dump_sects array.
19227      Note we do this even if cmdline_dump_sects is empty because we
19228      must make sure that the dump_sets array is zeroed out before each
19229      object file is processed.  */
19230   if (filedata->num_dump_sects > cmdline.num_dump_sects)
19231     memset (filedata->dump_sects, 0, filedata->num_dump_sects * sizeof (* filedata->dump_sects));
19232
19233   if (cmdline.num_dump_sects > 0)
19234     {
19235       if (filedata->num_dump_sects == 0)
19236         /* A sneaky way of allocating the dump_sects array.  */
19237         request_dump_bynumber (filedata, cmdline.num_dump_sects, 0);
19238
19239       assert (filedata->num_dump_sects >= cmdline.num_dump_sects);
19240       memcpy (filedata->dump_sects, cmdline.dump_sects,
19241               cmdline.num_dump_sects * sizeof (* filedata->dump_sects));
19242     }
19243
19244   if (! process_file_header (filedata))
19245     return FALSE;
19246
19247   if (! process_section_headers (filedata))
19248     {
19249       /* Without loaded section headers we cannot process lots of things.  */
19250       do_unwind = do_version = do_dump = do_arch = FALSE;
19251
19252       if (! do_using_dynamic)
19253         do_syms = do_dyn_syms = do_reloc = FALSE;
19254     }
19255
19256   if (! process_section_groups (filedata))
19257     /* Without loaded section groups we cannot process unwind.  */
19258     do_unwind = FALSE;
19259
19260   if (process_program_headers (filedata))
19261     process_dynamic_section (filedata);
19262   else
19263     res = FALSE;
19264
19265   if (! process_relocs (filedata))
19266     res = FALSE;
19267
19268   if (! process_unwind (filedata))
19269     res = FALSE;
19270
19271   if (! process_symbol_table (filedata))
19272     res = FALSE;
19273
19274   if (! process_syminfo (filedata))
19275     res = FALSE;
19276
19277   if (! process_version_sections (filedata))
19278     res = FALSE;
19279
19280   if (filedata->file_header.e_shstrndx != SHN_UNDEF)
19281     separates = load_separate_debug_file (filedata, filedata->file_name);
19282   else
19283     separates = NULL;
19284
19285   if (! process_section_contents (filedata))
19286     res = FALSE;
19287
19288   if (separates)
19289     {
19290       if (! process_section_headers (separates))
19291         res = FALSE;
19292       else if (! process_section_contents (separates))
19293         res = FALSE;
19294     }
19295
19296   if (! process_notes (filedata))
19297     res = FALSE;
19298
19299   if (! process_gnu_liblist (filedata))
19300     res = FALSE;
19301
19302   if (! process_arch_specific (filedata))
19303     res = FALSE;
19304
19305   free (filedata->program_headers);
19306   filedata->program_headers = NULL;
19307
19308   free (filedata->section_headers);
19309   filedata->section_headers = NULL;
19310
19311   free (filedata->string_table);
19312   filedata->string_table = NULL;
19313   filedata->string_table_length = 0;
19314
19315   if (dynamic_strings)
19316     {
19317       free (dynamic_strings);
19318       dynamic_strings = NULL;
19319       dynamic_strings_length = 0;
19320     }
19321
19322   if (dynamic_symbols)
19323     {
19324       free (dynamic_symbols);
19325       dynamic_symbols = NULL;
19326       num_dynamic_syms = 0;
19327     }
19328
19329   if (dynamic_syminfo)
19330     {
19331       free (dynamic_syminfo);
19332       dynamic_syminfo = NULL;
19333     }
19334
19335   if (dynamic_section)
19336     {
19337       free (dynamic_section);
19338       dynamic_section = NULL;
19339     }
19340
19341   if (section_headers_groups)
19342     {
19343       free (section_headers_groups);
19344       section_headers_groups = NULL;
19345     }
19346
19347   if (section_groups)
19348     {
19349       struct group_list * g;
19350       struct group_list * next;
19351
19352       for (i = 0; i < group_count; i++)
19353         {
19354           for (g = section_groups [i].root; g != NULL; g = next)
19355             {
19356               next = g->next;
19357               free (g);
19358             }
19359         }
19360
19361       free (section_groups);
19362       section_groups = NULL;
19363     }
19364
19365   free_debug_memory ();
19366
19367   return res;
19368 }
19369
19370 /* Process an ELF archive.
19371    On entry the file is positioned just after the ARMAG string.
19372    Returns TRUE upon success, FALSE otherwise.  */
19373
19374 static bfd_boolean
19375 process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
19376 {
19377   struct archive_info arch;
19378   struct archive_info nested_arch;
19379   size_t got;
19380   bfd_boolean ret = TRUE;
19381
19382   show_name = TRUE;
19383
19384   /* The ARCH structure is used to hold information about this archive.  */
19385   arch.file_name = NULL;
19386   arch.file = NULL;
19387   arch.index_array = NULL;
19388   arch.sym_table = NULL;
19389   arch.longnames = NULL;
19390
19391   /* The NESTED_ARCH structure is used as a single-item cache of information
19392      about a nested archive (when members of a thin archive reside within
19393      another regular archive file).  */
19394   nested_arch.file_name = NULL;
19395   nested_arch.file = NULL;
19396   nested_arch.index_array = NULL;
19397   nested_arch.sym_table = NULL;
19398   nested_arch.longnames = NULL;
19399
19400   if (setup_archive (&arch, filedata->file_name, filedata->handle,
19401                      is_thin_archive, do_archive_index) != 0)
19402     {
19403       ret = FALSE;
19404       goto out;
19405     }
19406
19407   if (do_archive_index)
19408     {
19409       if (arch.sym_table == NULL)
19410         error (_("%s: unable to dump the index as none was found\n"), filedata->file_name);
19411       else
19412         {
19413           unsigned long i, l;
19414           unsigned long current_pos;
19415
19416           printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
19417                   filedata->file_name, (unsigned long) arch.index_num, arch.sym_size);
19418
19419           current_pos = ftell (filedata->handle);
19420
19421           for (i = l = 0; i < arch.index_num; i++)
19422             {
19423               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
19424                 {
19425                   char * member_name;
19426
19427                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
19428
19429                   if (member_name != NULL)
19430                     {
19431                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
19432
19433                       if (qualified_name != NULL)
19434                         {
19435                           printf (_("Contents of binary %s at offset "), qualified_name);
19436                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
19437                           putchar ('\n');
19438                           free (qualified_name);
19439                         }
19440                     }
19441                 }
19442
19443               if (l >= arch.sym_size)
19444                 {
19445                   error (_("%s: end of the symbol table reached before the end of the index\n"),
19446                          filedata->file_name);
19447                   ret = FALSE;
19448                   break;
19449                 }
19450               /* PR 17531: file: 0b6630b2.  */
19451               printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
19452               l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
19453             }
19454
19455           if (arch.uses_64bit_indices)
19456             l = (l + 7) & ~ 7;
19457           else
19458             l += l & 1;
19459
19460           if (l < arch.sym_size)
19461             {
19462               error (ngettext ("%s: %ld byte remains in the symbol table, "
19463                                "but without corresponding entries in "
19464                                "the index table\n",
19465                                "%s: %ld bytes remain in the symbol table, "
19466                                "but without corresponding entries in "
19467                                "the index table\n",
19468                                arch.sym_size - l),
19469                      filedata->file_name, arch.sym_size - l);
19470               ret = FALSE;
19471             }
19472
19473           if (fseek (filedata->handle, current_pos, SEEK_SET) != 0)
19474             {
19475               error (_("%s: failed to seek back to start of object files in the archive\n"),
19476                      filedata->file_name);
19477               ret = FALSE;
19478               goto out;
19479             }
19480         }
19481
19482       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
19483           && !do_segments && !do_header && !do_dump && !do_version
19484           && !do_histogram && !do_debugging && !do_arch && !do_notes
19485           && !do_section_groups && !do_dyn_syms)
19486         {
19487           ret = TRUE; /* Archive index only.  */
19488           goto out;
19489         }
19490     }
19491
19492   while (1)
19493     {
19494       char * name;
19495       size_t namelen;
19496       char * qualified_name;
19497
19498       /* Read the next archive header.  */
19499       if (fseek (filedata->handle, arch.next_arhdr_offset, SEEK_SET) != 0)
19500         {
19501           error (_("%s: failed to seek to next archive header\n"), arch.file_name);
19502           return FALSE;
19503         }
19504       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, filedata->handle);
19505       if (got != sizeof arch.arhdr)
19506         {
19507           if (got == 0)
19508             break;
19509           /* PR 24049 - we cannot use filedata->file_name as this will
19510              have already been freed.  */
19511           error (_("%s: failed to read archive header\n"), arch.file_name);
19512             
19513           ret = FALSE;
19514           break;
19515         }
19516       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
19517         {
19518           error (_("%s: did not find a valid archive header\n"), arch.file_name);
19519           ret = FALSE;
19520           break;
19521         }
19522
19523       arch.next_arhdr_offset += sizeof arch.arhdr;
19524
19525       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
19526       if (archive_file_size & 01)
19527         ++archive_file_size;
19528
19529       name = get_archive_member_name (&arch, &nested_arch);
19530       if (name == NULL)
19531         {
19532           error (_("%s: bad archive file name\n"), arch.file_name);
19533           ret = FALSE;
19534           break;
19535         }
19536       namelen = strlen (name);
19537
19538       qualified_name = make_qualified_name (&arch, &nested_arch, name);
19539       if (qualified_name == NULL)
19540         {
19541           error (_("%s: bad archive file name\n"), arch.file_name);
19542           ret = FALSE;
19543           break;
19544         }
19545
19546       if (is_thin_archive && arch.nested_member_origin == 0)
19547         {
19548           /* This is a proxy for an external member of a thin archive.  */
19549           Filedata * member_filedata;
19550           char * member_file_name = adjust_relative_path
19551             (filedata->file_name, name, namelen);
19552
19553           if (member_file_name == NULL)
19554             {
19555               ret = FALSE;
19556               break;
19557             }
19558
19559           member_filedata = open_file (member_file_name);
19560           if (member_filedata == NULL)
19561             {
19562               error (_("Input file '%s' is not readable.\n"), member_file_name);
19563               free (member_file_name);
19564               ret = FALSE;
19565               break;
19566             }
19567
19568           archive_file_offset = arch.nested_member_origin;
19569           member_filedata->file_name = qualified_name;
19570
19571           if (! process_object (member_filedata))
19572             ret = FALSE;
19573
19574           close_file (member_filedata);
19575           free (member_file_name);
19576         }
19577       else if (is_thin_archive)
19578         {
19579           Filedata thin_filedata;
19580
19581           memset (&thin_filedata, 0, sizeof (thin_filedata));
19582
19583           /* PR 15140: Allow for corrupt thin archives.  */
19584           if (nested_arch.file == NULL)
19585             {
19586               error (_("%s: contains corrupt thin archive: %s\n"),
19587                      qualified_name, name);
19588               ret = FALSE;
19589               break;
19590             }
19591
19592           /* This is a proxy for a member of a nested archive.  */
19593           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
19594
19595           /* The nested archive file will have been opened and setup by
19596              get_archive_member_name.  */
19597           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
19598             {
19599               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
19600               ret = FALSE;
19601               break;
19602             }
19603
19604           thin_filedata.handle = nested_arch.file;
19605           thin_filedata.file_name = qualified_name;
19606           
19607           if (! process_object (& thin_filedata))
19608             ret = FALSE;
19609         }
19610       else
19611         {
19612           archive_file_offset = arch.next_arhdr_offset;
19613           arch.next_arhdr_offset += archive_file_size;
19614
19615           filedata->file_name = qualified_name;
19616           if (! process_object (filedata))
19617             ret = FALSE;
19618         }
19619
19620       if (filedata->dump_sects != NULL)
19621         {
19622           free (filedata->dump_sects);
19623           filedata->dump_sects = NULL;
19624           filedata->num_dump_sects = 0;
19625         }
19626
19627       free (qualified_name);
19628     }
19629
19630  out:
19631   if (nested_arch.file != NULL)
19632     fclose (nested_arch.file);
19633   release_archive (&nested_arch);
19634   release_archive (&arch);
19635
19636   return ret;
19637 }
19638
19639 static bfd_boolean
19640 process_file (char * file_name)
19641 {
19642   Filedata * filedata = NULL;
19643   struct stat statbuf;
19644   char armag[SARMAG];
19645   bfd_boolean ret = TRUE;
19646
19647   if (stat (file_name, &statbuf) < 0)
19648     {
19649       if (errno == ENOENT)
19650         error (_("'%s': No such file\n"), file_name);
19651       else
19652         error (_("Could not locate '%s'.  System error message: %s\n"),
19653                file_name, strerror (errno));
19654       return FALSE;
19655     }
19656
19657   if (! S_ISREG (statbuf.st_mode))
19658     {
19659       error (_("'%s' is not an ordinary file\n"), file_name);
19660       return FALSE;
19661     }
19662
19663   filedata = calloc (1, sizeof * filedata);
19664   if (filedata == NULL)
19665     {
19666       error (_("Out of memory allocating file data structure\n"));
19667       return FALSE;
19668     }
19669
19670   filedata->file_name = file_name;
19671   filedata->handle = fopen (file_name, "rb");
19672   if (filedata->handle == NULL)
19673     {
19674       error (_("Input file '%s' is not readable.\n"), file_name);
19675       free (filedata);
19676       return FALSE;
19677     }
19678
19679   if (fread (armag, SARMAG, 1, filedata->handle) != 1)
19680     {
19681       error (_("%s: Failed to read file's magic number\n"), file_name);
19682       fclose (filedata->handle);
19683       free (filedata);
19684       return FALSE;
19685     }
19686
19687   filedata->file_size = (bfd_size_type) statbuf.st_size;
19688
19689   if (memcmp (armag, ARMAG, SARMAG) == 0)
19690     {
19691       if (! process_archive (filedata, FALSE))
19692         ret = FALSE;
19693     }
19694   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
19695     {
19696       if ( ! process_archive (filedata, TRUE))
19697         ret = FALSE;
19698     }
19699   else
19700     {
19701       if (do_archive_index)
19702         error (_("File %s is not an archive so its index cannot be displayed.\n"),
19703                file_name);
19704
19705       rewind (filedata->handle);
19706       archive_file_size = archive_file_offset = 0;
19707
19708       if (! process_object (filedata))
19709         ret = FALSE;
19710     }
19711
19712   fclose (filedata->handle);
19713   free (filedata);
19714
19715   return ret;
19716 }
19717
19718 #ifdef SUPPORT_DISASSEMBLY
19719 /* Needed by the i386 disassembler.  For extra credit, someone could
19720    fix this so that we insert symbolic addresses here, esp for GOT/PLT
19721    symbols.  */
19722
19723 void
19724 print_address (unsigned int addr, FILE * outfile)
19725 {
19726   fprintf (outfile,"0x%8.8x", addr);
19727 }
19728
19729 /* Needed by the i386 disassembler.  */
19730
19731 void
19732 db_task_printsym (unsigned int addr)
19733 {
19734   print_address (addr, stderr);
19735 }
19736 #endif
19737
19738 int
19739 main (int argc, char ** argv)
19740 {
19741   int err;
19742
19743 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
19744   setlocale (LC_MESSAGES, "");
19745 #endif
19746 #if defined (HAVE_SETLOCALE)
19747   setlocale (LC_CTYPE, "");
19748 #endif
19749   bindtextdomain (PACKAGE, LOCALEDIR);
19750   textdomain (PACKAGE);
19751
19752   expandargv (&argc, &argv);
19753
19754   cmdline.file_name = "<cmdline>";
19755   parse_args (& cmdline, argc, argv);
19756
19757   if (optind < (argc - 1))
19758     show_name = TRUE;
19759   else if (optind >= argc)
19760     {
19761       warn (_("Nothing to do.\n"));
19762       usage (stderr);
19763     }
19764
19765   err = FALSE;
19766   while (optind < argc)
19767     if (! process_file (argv[optind++]))
19768       err = TRUE;
19769
19770   if (cmdline.dump_sects != NULL)
19771     free (cmdline.dump_sects);
19772
19773   return err ? EXIT_FAILURE : EXIT_SUCCESS;
19774 }