gdb/riscv: Prevent buffer overflow in riscv_return_value
[external/binutils.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2    Copyright (C) 1998-2018 Free Software Foundation, Inc.
3
4    Originally developed by Eric Youngdale <eric@andante.jic.com>
5    Modifications by Nick Clifton <nickc@redhat.com>
6
7    This file is part of GNU Binutils.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22    02110-1301, USA.  */
23 \f
24 /* The difference between readelf and objdump:
25
26   Both programs are capable of displaying the contents of ELF format files,
27   so why does the binutils project have two file dumpers ?
28
29   The reason is that objdump sees an ELF file through a BFD filter of the
30   world; if BFD has a bug where, say, it disagrees about a machine constant
31   in e_flags, then the odds are good that it will remain internally
32   consistent.  The linker sees it the BFD way, objdump sees it the BFD way,
33   GAS sees it the BFD way.  There was need for a tool to go find out what
34   the file actually says.
35
36   This is why the readelf program does not link against the BFD library - it
37   exists as an independent program to help verify the correct working of BFD.
38
39   There is also the case that readelf can provide more information about an
40   ELF file than is provided by objdump.  In particular it can display DWARF
41   debugging information which (at the moment) objdump cannot.  */
42 \f
43 #include "sysdep.h"
44 #include <assert.h>
45 #include <time.h>
46 #include <zlib.h>
47 #ifdef HAVE_WCHAR_H
48 #include <wchar.h>
49 #endif
50
51 #if __GNUC__ >= 2
52 /* Define BFD64 here, even if our default architecture is 32 bit ELF
53    as this will allow us to read in and parse 64bit and 32bit ELF files.
54    Only do this if we believe that the compiler can support a 64 bit
55    data type.  For now we only rely on GCC being able to do this.  */
56 #define BFD64
57 #endif
58
59 #include "bfd.h"
60 #include "bucomm.h"
61 #include "elfcomm.h"
62 #include "dwarf.h"
63
64 #include "elf/common.h"
65 #include "elf/external.h"
66 #include "elf/internal.h"
67
68
69 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
70    we can obtain the H8 reloc numbers.  We need these for the
71    get_reloc_size() function.  We include h8.h again after defining
72    RELOC_MACROS_GEN_FUNC so that we get the naming function as well.  */
73
74 #include "elf/h8.h"
75 #undef _ELF_H8_H
76
77 /* Undo the effects of #including reloc-macros.h.  */
78
79 #undef START_RELOC_NUMBERS
80 #undef RELOC_NUMBER
81 #undef FAKE_RELOC
82 #undef EMPTY_RELOC
83 #undef END_RELOC_NUMBERS
84 #undef _RELOC_MACROS_H
85
86 /* The following headers use the elf/reloc-macros.h file to
87    automatically generate relocation recognition functions
88    such as elf_mips_reloc_type()  */
89
90 #define RELOC_MACROS_GEN_FUNC
91
92 #include "elf/aarch64.h"
93 #include "elf/alpha.h"
94 #include "elf/arc.h"
95 #include "elf/arm.h"
96 #include "elf/avr.h"
97 #include "elf/bfin.h"
98 #include "elf/cr16.h"
99 #include "elf/cris.h"
100 #include "elf/crx.h"
101 #include "elf/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           break;
3693
3694         case EM_S390:
3695           if (e_flags & EF_S390_HIGH_GPRS)
3696             strcat (buf, ", highgprs");
3697           break;
3698
3699         case EM_TI_C6000:
3700           if ((e_flags & EF_C6000_REL))
3701             strcat (buf, ", relocatable module");
3702           break;
3703
3704         case EM_MSP430:
3705           strcat (buf, _(": architecture variant: "));
3706           switch (e_flags & EF_MSP430_MACH)
3707             {
3708             case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3709             case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3710             case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3711             case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3712             case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3713             case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3714             case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3715             case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3716             case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3717             case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3718             case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3719             case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3720             case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3721             case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3722             case E_MSP430_MACH_MSP430X  : strcat (buf, "MSP430X"); break;
3723             default:
3724               strcat (buf, _(": unknown")); break;
3725             }
3726
3727           if (e_flags & ~ EF_MSP430_MACH)
3728             strcat (buf, _(": unknown extra flag bits also present"));
3729         }
3730     }
3731
3732   return buf;
3733 }
3734
3735 static const char *
3736 get_osabi_name (Filedata * filedata, unsigned int osabi)
3737 {
3738   static char buff[32];
3739
3740   switch (osabi)
3741     {
3742     case ELFOSABI_NONE:         return "UNIX - System V";
3743     case ELFOSABI_HPUX:         return "UNIX - HP-UX";
3744     case ELFOSABI_NETBSD:       return "UNIX - NetBSD";
3745     case ELFOSABI_GNU:          return "UNIX - GNU";
3746     case ELFOSABI_SOLARIS:      return "UNIX - Solaris";
3747     case ELFOSABI_AIX:          return "UNIX - AIX";
3748     case ELFOSABI_IRIX:         return "UNIX - IRIX";
3749     case ELFOSABI_FREEBSD:      return "UNIX - FreeBSD";
3750     case ELFOSABI_TRU64:        return "UNIX - TRU64";
3751     case ELFOSABI_MODESTO:      return "Novell - Modesto";
3752     case ELFOSABI_OPENBSD:      return "UNIX - OpenBSD";
3753     case ELFOSABI_OPENVMS:      return "VMS - OpenVMS";
3754     case ELFOSABI_NSK:          return "HP - Non-Stop Kernel";
3755     case ELFOSABI_AROS:         return "AROS";
3756     case ELFOSABI_FENIXOS:      return "FenixOS";
3757     case ELFOSABI_CLOUDABI:     return "Nuxi CloudABI";
3758     case ELFOSABI_OPENVOS:      return "Stratus Technologies OpenVOS";
3759     default:
3760       if (osabi >= 64)
3761         switch (filedata->file_header.e_machine)
3762           {
3763           case EM_ARM:
3764             switch (osabi)
3765               {
3766               case ELFOSABI_ARM:        return "ARM";
3767               case ELFOSABI_ARM_FDPIC:  return "ARM FDPIC";
3768               default:
3769                 break;
3770               }
3771             break;
3772
3773           case EM_MSP430:
3774           case EM_MSP430_OLD:
3775           case EM_VISIUM:
3776             switch (osabi)
3777               {
3778               case ELFOSABI_STANDALONE: return _("Standalone App");
3779               default:
3780                 break;
3781               }
3782             break;
3783
3784           case EM_TI_C6000:
3785             switch (osabi)
3786               {
3787               case ELFOSABI_C6000_ELFABI:       return _("Bare-metal C6000");
3788               case ELFOSABI_C6000_LINUX:        return "Linux C6000";
3789               default:
3790                 break;
3791               }
3792             break;
3793
3794           default:
3795             break;
3796           }
3797       snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3798       return buff;
3799     }
3800 }
3801
3802 static const char *
3803 get_aarch64_segment_type (unsigned long type)
3804 {
3805   switch (type)
3806     {
3807     case PT_AARCH64_ARCHEXT:  return "AARCH64_ARCHEXT";
3808     default:                  return NULL;
3809     }
3810 }
3811
3812 static const char *
3813 get_arm_segment_type (unsigned long type)
3814 {
3815   switch (type)
3816     {
3817     case PT_ARM_EXIDX: return "EXIDX";
3818     default:           return NULL;
3819     }
3820 }
3821
3822 static const char *
3823 get_s390_segment_type (unsigned long type)
3824 {
3825   switch (type)
3826     {
3827     case PT_S390_PGSTE: return "S390_PGSTE";
3828     default:            return NULL;
3829     }
3830 }
3831
3832 static const char *
3833 get_mips_segment_type (unsigned long type)
3834 {
3835   switch (type)
3836     {
3837     case PT_MIPS_REGINFO:   return "REGINFO";
3838     case PT_MIPS_RTPROC:    return "RTPROC";
3839     case PT_MIPS_OPTIONS:   return "OPTIONS";
3840     case PT_MIPS_ABIFLAGS:  return "ABIFLAGS";
3841     default:                return NULL;
3842     }
3843 }
3844
3845 static const char *
3846 get_parisc_segment_type (unsigned long type)
3847 {
3848   switch (type)
3849     {
3850     case PT_HP_TLS:             return "HP_TLS";
3851     case PT_HP_CORE_NONE:       return "HP_CORE_NONE";
3852     case PT_HP_CORE_VERSION:    return "HP_CORE_VERSION";
3853     case PT_HP_CORE_KERNEL:     return "HP_CORE_KERNEL";
3854     case PT_HP_CORE_COMM:       return "HP_CORE_COMM";
3855     case PT_HP_CORE_PROC:       return "HP_CORE_PROC";
3856     case PT_HP_CORE_LOADABLE:   return "HP_CORE_LOADABLE";
3857     case PT_HP_CORE_STACK:      return "HP_CORE_STACK";
3858     case PT_HP_CORE_SHM:        return "HP_CORE_SHM";
3859     case PT_HP_CORE_MMF:        return "HP_CORE_MMF";
3860     case PT_HP_PARALLEL:        return "HP_PARALLEL";
3861     case PT_HP_FASTBIND:        return "HP_FASTBIND";
3862     case PT_HP_OPT_ANNOT:       return "HP_OPT_ANNOT";
3863     case PT_HP_HSL_ANNOT:       return "HP_HSL_ANNOT";
3864     case PT_HP_STACK:           return "HP_STACK";
3865     case PT_HP_CORE_UTSNAME:    return "HP_CORE_UTSNAME";
3866     case PT_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
3867     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
3868     case PT_PARISC_WEAKORDER:   return "PARISC_WEAKORDER";
3869     default:                    return NULL;
3870     }
3871 }
3872
3873 static const char *
3874 get_ia64_segment_type (unsigned long type)
3875 {
3876   switch (type)
3877     {
3878     case PT_IA_64_ARCHEXT:      return "IA_64_ARCHEXT";
3879     case PT_IA_64_UNWIND:       return "IA_64_UNWIND";
3880     case PT_HP_TLS:             return "HP_TLS";
3881     case PT_IA_64_HP_OPT_ANOT:  return "HP_OPT_ANNOT";
3882     case PT_IA_64_HP_HSL_ANOT:  return "HP_HSL_ANNOT";
3883     case PT_IA_64_HP_STACK:     return "HP_STACK";
3884     default:                    return NULL;
3885     }
3886 }
3887
3888 static const char *
3889 get_tic6x_segment_type (unsigned long type)
3890 {
3891   switch (type)
3892     {
3893     case PT_C6000_PHATTR:  return "C6000_PHATTR";
3894     default:               return NULL;
3895     }
3896 }
3897
3898 static const char *
3899 get_solaris_segment_type (unsigned long type)
3900 {
3901   switch (type)
3902     {
3903     case 0x6464e550: return "PT_SUNW_UNWIND";
3904     case 0x6474e550: return "PT_SUNW_EH_FRAME";
3905     case 0x6ffffff7: return "PT_LOSUNW";
3906     case 0x6ffffffa: return "PT_SUNWBSS";
3907     case 0x6ffffffb: return "PT_SUNWSTACK";
3908     case 0x6ffffffc: return "PT_SUNWDTRACE";
3909     case 0x6ffffffd: return "PT_SUNWCAP";
3910     case 0x6fffffff: return "PT_HISUNW";
3911     default:         return NULL;
3912     }
3913 }
3914
3915 static const char *
3916 get_segment_type (Filedata * filedata, unsigned long p_type)
3917 {
3918   static char buff[32];
3919
3920   switch (p_type)
3921     {
3922     case PT_NULL:       return "NULL";
3923     case PT_LOAD:       return "LOAD";
3924     case PT_DYNAMIC:    return "DYNAMIC";
3925     case PT_INTERP:     return "INTERP";
3926     case PT_NOTE:       return "NOTE";
3927     case PT_SHLIB:      return "SHLIB";
3928     case PT_PHDR:       return "PHDR";
3929     case PT_TLS:        return "TLS";
3930     case PT_GNU_EH_FRAME: return "GNU_EH_FRAME";
3931     case PT_GNU_STACK:  return "GNU_STACK";
3932     case PT_GNU_RELRO:  return "GNU_RELRO";
3933     case PT_GNU_PROPERTY: return "GNU_PROPERTY";
3934
3935     default:
3936       if (p_type >= PT_GNU_MBIND_LO && p_type <= PT_GNU_MBIND_HI)
3937         {
3938           sprintf (buff, "GNU_MBIND+%#lx",
3939                    p_type - PT_GNU_MBIND_LO);
3940         }
3941       else if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3942         {
3943           const char * result;
3944
3945           switch (filedata->file_header.e_machine)
3946             {
3947             case EM_AARCH64:
3948               result = get_aarch64_segment_type (p_type);
3949               break;
3950             case EM_ARM:
3951               result = get_arm_segment_type (p_type);
3952               break;
3953             case EM_MIPS:
3954             case EM_MIPS_RS3_LE:
3955               result = get_mips_segment_type (p_type);
3956               break;
3957             case EM_PARISC:
3958               result = get_parisc_segment_type (p_type);
3959               break;
3960             case EM_IA_64:
3961               result = get_ia64_segment_type (p_type);
3962               break;
3963             case EM_TI_C6000:
3964               result = get_tic6x_segment_type (p_type);
3965               break;
3966             case EM_S390:
3967             case EM_S390_OLD:
3968               result = get_s390_segment_type (p_type);
3969               break;
3970             default:
3971               result = NULL;
3972               break;
3973             }
3974
3975           if (result != NULL)
3976             return result;
3977
3978           sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
3979         }
3980       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3981         {
3982           const char * result;
3983
3984           switch (filedata->file_header.e_machine)
3985             {
3986             case EM_PARISC:
3987               result = get_parisc_segment_type (p_type);
3988               break;
3989             case EM_IA_64:
3990               result = get_ia64_segment_type (p_type);
3991               break;
3992             default:
3993               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
3994                 result = get_solaris_segment_type (p_type);
3995               else
3996                 result = NULL;
3997               break;
3998             }
3999
4000           if (result != NULL)
4001             return result;
4002
4003           sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
4004         }
4005       else
4006         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
4007
4008       return buff;
4009     }
4010 }
4011
4012 static const char *
4013 get_arc_section_type_name (unsigned int sh_type)
4014 {
4015   switch (sh_type)
4016     {
4017     case SHT_ARC_ATTRIBUTES:      return "ARC_ATTRIBUTES";
4018     default:
4019       break;
4020     }
4021   return NULL;
4022 }
4023
4024 static const char *
4025 get_mips_section_type_name (unsigned int sh_type)
4026 {
4027   switch (sh_type)
4028     {
4029     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
4030     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
4031     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
4032     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
4033     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
4034     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
4035     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
4036     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
4037     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
4038     case SHT_MIPS_RELD:          return "MIPS_RELD";
4039     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
4040     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
4041     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
4042     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
4043     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
4044     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
4045     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
4046     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
4047     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
4048     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
4049     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
4050     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
4051     case SHT_MIPS_LINE:          return "MIPS_LINE";
4052     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
4053     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
4054     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
4055     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
4056     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
4057     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
4058     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
4059     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
4060     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
4061     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
4062     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
4063     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
4064     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
4065     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
4066     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
4067     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
4068     case SHT_MIPS_ABIFLAGS:      return "MIPS_ABIFLAGS";
4069     default:
4070       break;
4071     }
4072   return NULL;
4073 }
4074
4075 static const char *
4076 get_parisc_section_type_name (unsigned int sh_type)
4077 {
4078   switch (sh_type)
4079     {
4080     case SHT_PARISC_EXT:        return "PARISC_EXT";
4081     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
4082     case SHT_PARISC_DOC:        return "PARISC_DOC";
4083     case SHT_PARISC_ANNOT:      return "PARISC_ANNOT";
4084     case SHT_PARISC_SYMEXTN:    return "PARISC_SYMEXTN";
4085     case SHT_PARISC_STUBS:      return "PARISC_STUBS";
4086     case SHT_PARISC_DLKM:       return "PARISC_DLKM";
4087     default:                    return NULL;
4088     }
4089 }
4090
4091 static const char *
4092 get_ia64_section_type_name (Filedata * filedata, unsigned int sh_type)
4093 {
4094   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
4095   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
4096     return get_osabi_name (filedata, (sh_type & 0x00FF0000) >> 16);
4097
4098   switch (sh_type)
4099     {
4100     case SHT_IA_64_EXT:                return "IA_64_EXT";
4101     case SHT_IA_64_UNWIND:             return "IA_64_UNWIND";
4102     case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
4103     case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
4104     case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
4105     case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
4106     case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
4107     case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
4108     case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
4109     case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
4110     default:
4111       break;
4112     }
4113   return NULL;
4114 }
4115
4116 static const char *
4117 get_x86_64_section_type_name (unsigned int sh_type)
4118 {
4119   switch (sh_type)
4120     {
4121     case SHT_X86_64_UNWIND:     return "X86_64_UNWIND";
4122     default:                    return NULL;
4123     }
4124 }
4125
4126 static const char *
4127 get_aarch64_section_type_name (unsigned int sh_type)
4128 {
4129   switch (sh_type)
4130     {
4131     case SHT_AARCH64_ATTRIBUTES: return "AARCH64_ATTRIBUTES";
4132     default:                     return NULL;
4133     }
4134 }
4135
4136 static const char *
4137 get_arm_section_type_name (unsigned int sh_type)
4138 {
4139   switch (sh_type)
4140     {
4141     case SHT_ARM_EXIDX:           return "ARM_EXIDX";
4142     case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
4143     case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
4144     case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
4145     case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
4146     default:                      return NULL;
4147     }
4148 }
4149
4150 static const char *
4151 get_tic6x_section_type_name (unsigned int sh_type)
4152 {
4153   switch (sh_type)
4154     {
4155     case SHT_C6000_UNWIND:      return "C6000_UNWIND";
4156     case SHT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
4157     case SHT_C6000_ATTRIBUTES:  return "C6000_ATTRIBUTES";
4158     case SHT_TI_ICODE:          return "TI_ICODE";
4159     case SHT_TI_XREF:           return "TI_XREF";
4160     case SHT_TI_HANDLER:        return "TI_HANDLER";
4161     case SHT_TI_INITINFO:       return "TI_INITINFO";
4162     case SHT_TI_PHATTRS:        return "TI_PHATTRS";
4163     default:                    return NULL;
4164     }
4165 }
4166
4167 static const char *
4168 get_msp430x_section_type_name (unsigned int sh_type)
4169 {
4170   switch (sh_type)
4171     {
4172     case SHT_MSP430_SEC_FLAGS:    return "MSP430_SEC_FLAGS";
4173     case SHT_MSP430_SYM_ALIASES:  return "MSP430_SYM_ALIASES";
4174     case SHT_MSP430_ATTRIBUTES:   return "MSP430_ATTRIBUTES";
4175     default:                      return NULL;
4176     }
4177 }
4178
4179 static const char *
4180 get_nfp_section_type_name (unsigned int sh_type)
4181 {
4182   switch (sh_type)
4183     {
4184     case SHT_NFP_MECONFIG:      return "NFP_MECONFIG";
4185     case SHT_NFP_INITREG:       return "NFP_INITREG";
4186     case SHT_NFP_UDEBUG:        return "NFP_UDEBUG";
4187     default:                    return NULL;
4188     }
4189 }
4190
4191 static const char *
4192 get_v850_section_type_name (unsigned int sh_type)
4193 {
4194   switch (sh_type)
4195     {
4196     case SHT_V850_SCOMMON:  return "V850 Small Common";
4197     case SHT_V850_TCOMMON:  return "V850 Tiny Common";
4198     case SHT_V850_ZCOMMON:  return "V850 Zero Common";
4199     case SHT_RENESAS_IOP:   return "RENESAS IOP";
4200     case SHT_RENESAS_INFO:  return "RENESAS INFO";
4201     default:                return NULL;
4202     }
4203 }
4204
4205 static const char *
4206 get_section_type_name (Filedata * filedata, unsigned int sh_type)
4207 {
4208   static char buff[32];
4209   const char * result;
4210
4211   switch (sh_type)
4212     {
4213     case SHT_NULL:              return "NULL";
4214     case SHT_PROGBITS:          return "PROGBITS";
4215     case SHT_SYMTAB:            return "SYMTAB";
4216     case SHT_STRTAB:            return "STRTAB";
4217     case SHT_RELA:              return "RELA";
4218     case SHT_HASH:              return "HASH";
4219     case SHT_DYNAMIC:           return "DYNAMIC";
4220     case SHT_NOTE:              return "NOTE";
4221     case SHT_NOBITS:            return "NOBITS";
4222     case SHT_REL:               return "REL";
4223     case SHT_SHLIB:             return "SHLIB";
4224     case SHT_DYNSYM:            return "DYNSYM";
4225     case SHT_INIT_ARRAY:        return "INIT_ARRAY";
4226     case SHT_FINI_ARRAY:        return "FINI_ARRAY";
4227     case SHT_PREINIT_ARRAY:     return "PREINIT_ARRAY";
4228     case SHT_GNU_HASH:          return "GNU_HASH";
4229     case SHT_GROUP:             return "GROUP";
4230     case SHT_SYMTAB_SHNDX:      return "SYMTAB SECTION INDICES";
4231     case SHT_GNU_verdef:        return "VERDEF";
4232     case SHT_GNU_verneed:       return "VERNEED";
4233     case SHT_GNU_versym:        return "VERSYM";
4234     case 0x6ffffff0:            return "VERSYM";
4235     case 0x6ffffffc:            return "VERDEF";
4236     case 0x7ffffffd:            return "AUXILIARY";
4237     case 0x7fffffff:            return "FILTER";
4238     case SHT_GNU_LIBLIST:       return "GNU_LIBLIST";
4239
4240     default:
4241       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4242         {
4243           switch (filedata->file_header.e_machine)
4244             {
4245             case EM_ARC:
4246             case EM_ARC_COMPACT:
4247             case EM_ARC_COMPACT2:
4248               result = get_arc_section_type_name (sh_type);
4249               break;
4250             case EM_MIPS:
4251             case EM_MIPS_RS3_LE:
4252               result = get_mips_section_type_name (sh_type);
4253               break;
4254             case EM_PARISC:
4255               result = get_parisc_section_type_name (sh_type);
4256               break;
4257             case EM_IA_64:
4258               result = get_ia64_section_type_name (filedata, sh_type);
4259               break;
4260             case EM_X86_64:
4261             case EM_L1OM:
4262             case EM_K1OM:
4263               result = get_x86_64_section_type_name (sh_type);
4264               break;
4265             case EM_AARCH64:
4266               result = get_aarch64_section_type_name (sh_type);
4267               break;
4268             case EM_ARM:
4269               result = get_arm_section_type_name (sh_type);
4270               break;
4271             case EM_TI_C6000:
4272               result = get_tic6x_section_type_name (sh_type);
4273               break;
4274             case EM_MSP430:
4275               result = get_msp430x_section_type_name (sh_type);
4276               break;
4277             case EM_NFP:
4278               result = get_nfp_section_type_name (sh_type);
4279               break;
4280             case EM_V800:
4281             case EM_V850:
4282             case EM_CYGNUS_V850:
4283               result = get_v850_section_type_name (sh_type);
4284               break;
4285             default:
4286               result = NULL;
4287               break;
4288             }
4289
4290           if (result != NULL)
4291             return result;
4292
4293           sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4294         }
4295       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4296         {
4297           switch (filedata->file_header.e_machine)
4298             {
4299             case EM_IA_64:
4300               result = get_ia64_section_type_name (filedata, sh_type);
4301               break;
4302             default:
4303               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4304                 result = get_solaris_section_type (sh_type);
4305               else
4306                 {
4307                   switch (sh_type)
4308                     {
4309                     case SHT_GNU_INCREMENTAL_INPUTS: result = "GNU_INCREMENTAL_INPUTS"; break;
4310                     case SHT_GNU_ATTRIBUTES: result = "GNU_ATTRIBUTES"; break;
4311                     case SHT_GNU_HASH: result = "GNU_HASH"; break;
4312                     case SHT_GNU_LIBLIST: result = "GNU_LIBLIST"; break;
4313                     default:
4314                       result = NULL;
4315                       break;
4316                     }
4317                 }
4318               break;
4319             }
4320
4321           if (result != NULL)
4322             return result;
4323
4324           sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4325         }
4326       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4327         {
4328           switch (filedata->file_header.e_machine)
4329             {
4330             case EM_V800:
4331             case EM_V850:
4332             case EM_CYGNUS_V850:
4333               result = get_v850_section_type_name (sh_type);
4334               break;
4335             default:
4336               result = NULL;
4337               break;
4338             }
4339
4340           if (result != NULL)
4341             return result;
4342
4343           sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4344         }
4345       else
4346         /* This message is probably going to be displayed in a 15
4347            character wide field, so put the hex value first.  */
4348         snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4349
4350       return buff;
4351     }
4352 }
4353
4354 #define OPTION_DEBUG_DUMP       512
4355 #define OPTION_DYN_SYMS         513
4356 #define OPTION_DWARF_DEPTH      514
4357 #define OPTION_DWARF_START      515
4358 #define OPTION_DWARF_CHECK      516
4359
4360 static struct option options[] =
4361 {
4362   {"all",              no_argument, 0, 'a'},
4363   {"file-header",      no_argument, 0, 'h'},
4364   {"program-headers",  no_argument, 0, 'l'},
4365   {"headers",          no_argument, 0, 'e'},
4366   {"histogram",        no_argument, 0, 'I'},
4367   {"segments",         no_argument, 0, 'l'},
4368   {"sections",         no_argument, 0, 'S'},
4369   {"section-headers",  no_argument, 0, 'S'},
4370   {"section-groups",   no_argument, 0, 'g'},
4371   {"section-details",  no_argument, 0, 't'},
4372   {"full-section-name",no_argument, 0, 'N'},
4373   {"symbols",          no_argument, 0, 's'},
4374   {"syms",             no_argument, 0, 's'},
4375   {"dyn-syms",         no_argument, 0, OPTION_DYN_SYMS},
4376   {"relocs",           no_argument, 0, 'r'},
4377   {"notes",            no_argument, 0, 'n'},
4378   {"dynamic",          no_argument, 0, 'd'},
4379   {"arch-specific",    no_argument, 0, 'A'},
4380   {"version-info",     no_argument, 0, 'V'},
4381   {"use-dynamic",      no_argument, 0, 'D'},
4382   {"unwind",           no_argument, 0, 'u'},
4383   {"archive-index",    no_argument, 0, 'c'},
4384   {"hex-dump",         required_argument, 0, 'x'},
4385   {"relocated-dump",   required_argument, 0, 'R'},
4386   {"string-dump",      required_argument, 0, 'p'},
4387   {"decompress",       no_argument, 0, 'z'},
4388 #ifdef SUPPORT_DISASSEMBLY
4389   {"instruction-dump", required_argument, 0, 'i'},
4390 #endif
4391   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
4392
4393   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
4394   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
4395   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
4396
4397   {"version",          no_argument, 0, 'v'},
4398   {"wide",             no_argument, 0, 'W'},
4399   {"help",             no_argument, 0, 'H'},
4400   {0,                  no_argument, 0, 0}
4401 };
4402
4403 static void
4404 usage (FILE * stream)
4405 {
4406   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4407   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4408   fprintf (stream, _(" Options are:\n\
4409   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4410   -h --file-header       Display the ELF file header\n\
4411   -l --program-headers   Display the program headers\n\
4412      --segments          An alias for --program-headers\n\
4413   -S --section-headers   Display the sections' header\n\
4414      --sections          An alias for --section-headers\n\
4415   -g --section-groups    Display the section groups\n\
4416   -t --section-details   Display the section details\n\
4417   -e --headers           Equivalent to: -h -l -S\n\
4418   -s --syms              Display the symbol table\n\
4419      --symbols           An alias for --syms\n\
4420   --dyn-syms             Display the dynamic symbol table\n\
4421   -n --notes             Display the core notes (if present)\n\
4422   -r --relocs            Display the relocations (if present)\n\
4423   -u --unwind            Display the unwind info (if present)\n\
4424   -d --dynamic           Display the dynamic section (if present)\n\
4425   -V --version-info      Display the version sections (if present)\n\
4426   -A --arch-specific     Display architecture specific information (if any)\n\
4427   -c --archive-index     Display the symbol/file index in an archive\n\
4428   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
4429   -x --hex-dump=<number|name>\n\
4430                          Dump the contents of section <number|name> as bytes\n\
4431   -p --string-dump=<number|name>\n\
4432                          Dump the contents of section <number|name> as strings\n\
4433   -R --relocated-dump=<number|name>\n\
4434                          Dump the contents of section <number|name> as relocated bytes\n\
4435   -z --decompress        Decompress section before dumping it\n\
4436   -w[lLiaprmfFsoRtUuTgAckK] or\n\
4437   --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4438                =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4439                =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4440                =addr,=cu_index,=links,=follow-links]\n\
4441                          Display the contents of DWARF debug sections\n"));
4442   fprintf (stream, _("\
4443   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
4444   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
4445                          or deeper\n"));
4446 #ifdef SUPPORT_DISASSEMBLY
4447   fprintf (stream, _("\
4448   -i --instruction-dump=<number|name>\n\
4449                          Disassemble the contents of section <number|name>\n"));
4450 #endif
4451   fprintf (stream, _("\
4452   -I --histogram         Display histogram of bucket list lengths\n\
4453   -W --wide              Allow output width to exceed 80 characters\n\
4454   @<file>                Read options from <file>\n\
4455   -H --help              Display this information\n\
4456   -v --version           Display the version number of readelf\n"));
4457
4458   if (REPORT_BUGS_TO[0] && stream == stdout)
4459     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4460
4461   exit (stream == stdout ? 0 : 1);
4462 }
4463
4464 /* Record the fact that the user wants the contents of section number
4465    SECTION to be displayed using the method(s) encoded as flags bits
4466    in TYPE.  Note, TYPE can be zero if we are creating the array for
4467    the first time.  */
4468
4469 static void
4470 request_dump_bynumber (Filedata * filedata, unsigned int section, dump_type type)
4471 {
4472   if (section >= filedata->num_dump_sects)
4473     {
4474       dump_type * new_dump_sects;
4475
4476       new_dump_sects = (dump_type *) calloc (section + 1,
4477                                              sizeof (* new_dump_sects));
4478
4479       if (new_dump_sects == NULL)
4480         error (_("Out of memory allocating dump request table.\n"));
4481       else
4482         {
4483           if (filedata->dump_sects)
4484             {
4485               /* Copy current flag settings.  */
4486               memcpy (new_dump_sects, filedata->dump_sects,
4487                       filedata->num_dump_sects * sizeof (* new_dump_sects));
4488
4489               free (filedata->dump_sects);
4490             }
4491
4492           filedata->dump_sects = new_dump_sects;
4493           filedata->num_dump_sects = section + 1;
4494         }
4495     }
4496
4497   if (filedata->dump_sects)
4498     filedata->dump_sects[section] |= type;
4499 }
4500
4501 /* Request a dump by section name.  */
4502
4503 static void
4504 request_dump_byname (const char * section, dump_type type)
4505 {
4506   struct dump_list_entry * new_request;
4507
4508   new_request = (struct dump_list_entry *)
4509       malloc (sizeof (struct dump_list_entry));
4510   if (!new_request)
4511     error (_("Out of memory allocating dump request table.\n"));
4512
4513   new_request->name = strdup (section);
4514   if (!new_request->name)
4515     error (_("Out of memory allocating dump request table.\n"));
4516
4517   new_request->type = type;
4518
4519   new_request->next = dump_sects_byname;
4520   dump_sects_byname = new_request;
4521 }
4522
4523 static inline void
4524 request_dump (Filedata * filedata, dump_type type)
4525 {
4526   int section;
4527   char * cp;
4528
4529   do_dump++;
4530   section = strtoul (optarg, & cp, 0);
4531
4532   if (! *cp && section >= 0)
4533     request_dump_bynumber (filedata, section, type);
4534   else
4535     request_dump_byname (optarg, type);
4536 }
4537
4538 static void
4539 parse_args (Filedata * filedata, int argc, char ** argv)
4540 {
4541   int c;
4542
4543   if (argc < 2)
4544     usage (stderr);
4545
4546   while ((c = getopt_long
4547           (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4548     {
4549       switch (c)
4550         {
4551         case 0:
4552           /* Long options.  */
4553           break;
4554         case 'H':
4555           usage (stdout);
4556           break;
4557
4558         case 'a':
4559           do_syms = TRUE;
4560           do_reloc = TRUE;
4561           do_unwind = TRUE;
4562           do_dynamic = TRUE;
4563           do_header = TRUE;
4564           do_sections = TRUE;
4565           do_section_groups = TRUE;
4566           do_segments = TRUE;
4567           do_version = TRUE;
4568           do_histogram = TRUE;
4569           do_arch = TRUE;
4570           do_notes = TRUE;
4571           break;
4572         case 'g':
4573           do_section_groups = TRUE;
4574           break;
4575         case 't':
4576         case 'N':
4577           do_sections = TRUE;
4578           do_section_details = TRUE;
4579           break;
4580         case 'e':
4581           do_header = TRUE;
4582           do_sections = TRUE;
4583           do_segments = TRUE;
4584           break;
4585         case 'A':
4586           do_arch = TRUE;
4587           break;
4588         case 'D':
4589           do_using_dynamic = TRUE;
4590           break;
4591         case 'r':
4592           do_reloc = TRUE;
4593           break;
4594         case 'u':
4595           do_unwind = TRUE;
4596           break;
4597         case 'h':
4598           do_header = TRUE;
4599           break;
4600         case 'l':
4601           do_segments = TRUE;
4602           break;
4603         case 's':
4604           do_syms = TRUE;
4605           break;
4606         case 'S':
4607           do_sections = TRUE;
4608           break;
4609         case 'd':
4610           do_dynamic = TRUE;
4611           break;
4612         case 'I':
4613           do_histogram = TRUE;
4614           break;
4615         case 'n':
4616           do_notes = TRUE;
4617           break;
4618         case 'c':
4619           do_archive_index = TRUE;
4620           break;
4621         case 'x':
4622           request_dump (filedata, HEX_DUMP);
4623           break;
4624         case 'p':
4625           request_dump (filedata, STRING_DUMP);
4626           break;
4627         case 'R':
4628           request_dump (filedata, RELOC_DUMP);
4629           break;
4630         case 'z':
4631           decompress_dumps = TRUE;
4632           break;
4633         case 'w':
4634           do_dump = TRUE;
4635           if (optarg == 0)
4636             {
4637               do_debugging = TRUE;
4638               dwarf_select_sections_all ();
4639             }
4640           else
4641             {
4642               do_debugging = FALSE;
4643               dwarf_select_sections_by_letters (optarg);
4644             }
4645           break;
4646         case OPTION_DEBUG_DUMP:
4647           do_dump = TRUE;
4648           if (optarg == 0)
4649             do_debugging = TRUE;
4650           else
4651             {
4652               do_debugging = FALSE;
4653               dwarf_select_sections_by_names (optarg);
4654             }
4655           break;
4656         case OPTION_DWARF_DEPTH:
4657           {
4658             char *cp;
4659
4660             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4661           }
4662           break;
4663         case OPTION_DWARF_START:
4664           {
4665             char *cp;
4666
4667             dwarf_start_die = strtoul (optarg, & cp, 0);
4668           }
4669           break;
4670         case OPTION_DWARF_CHECK:
4671           dwarf_check = TRUE;
4672           break;
4673         case OPTION_DYN_SYMS:
4674           do_dyn_syms = TRUE;
4675           break;
4676 #ifdef SUPPORT_DISASSEMBLY
4677         case 'i':
4678           request_dump (filedata, DISASS_DUMP);
4679           break;
4680 #endif
4681         case 'v':
4682           print_version (program_name);
4683           break;
4684         case 'V':
4685           do_version = TRUE;
4686           break;
4687         case 'W':
4688           do_wide = TRUE;
4689           break;
4690         default:
4691           /* xgettext:c-format */
4692           error (_("Invalid option '-%c'\n"), c);
4693           /* Fall through.  */
4694         case '?':
4695           usage (stderr);
4696         }
4697     }
4698
4699   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4700       && !do_segments && !do_header && !do_dump && !do_version
4701       && !do_histogram && !do_debugging && !do_arch && !do_notes
4702       && !do_section_groups && !do_archive_index
4703       && !do_dyn_syms)
4704     usage (stderr);
4705 }
4706
4707 static const char *
4708 get_elf_class (unsigned int elf_class)
4709 {
4710   static char buff[32];
4711
4712   switch (elf_class)
4713     {
4714     case ELFCLASSNONE: return _("none");
4715     case ELFCLASS32:   return "ELF32";
4716     case ELFCLASS64:   return "ELF64";
4717     default:
4718       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4719       return buff;
4720     }
4721 }
4722
4723 static const char *
4724 get_data_encoding (unsigned int encoding)
4725 {
4726   static char buff[32];
4727
4728   switch (encoding)
4729     {
4730     case ELFDATANONE: return _("none");
4731     case ELFDATA2LSB: return _("2's complement, little endian");
4732     case ELFDATA2MSB: return _("2's complement, big endian");
4733     default:
4734       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4735       return buff;
4736     }
4737 }
4738
4739 /* Decode the data held in 'filedata->file_header'.  */
4740
4741 static bfd_boolean
4742 process_file_header (Filedata * filedata)
4743 {
4744   Elf_Internal_Ehdr * header = & filedata->file_header;
4745
4746   if (   header->e_ident[EI_MAG0] != ELFMAG0
4747       || header->e_ident[EI_MAG1] != ELFMAG1
4748       || header->e_ident[EI_MAG2] != ELFMAG2
4749       || header->e_ident[EI_MAG3] != ELFMAG3)
4750     {
4751       error
4752         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4753       return FALSE;
4754     }
4755
4756   init_dwarf_regnames (header->e_machine);
4757
4758   if (do_header)
4759     {
4760       unsigned i;
4761
4762       printf (_("ELF Header:\n"));
4763       printf (_("  Magic:   "));
4764       for (i = 0; i < EI_NIDENT; i++)
4765         printf ("%2.2x ", header->e_ident[i]);
4766       printf ("\n");
4767       printf (_("  Class:                             %s\n"),
4768               get_elf_class (header->e_ident[EI_CLASS]));
4769       printf (_("  Data:                              %s\n"),
4770               get_data_encoding (header->e_ident[EI_DATA]));
4771       printf (_("  Version:                           %d%s\n"),
4772               header->e_ident[EI_VERSION],
4773               (header->e_ident[EI_VERSION] == EV_CURRENT
4774                ? _(" (current)")
4775                : (header->e_ident[EI_VERSION] != EV_NONE
4776                   ? _(" <unknown>")
4777                   : "")));
4778       printf (_("  OS/ABI:                            %s\n"),
4779               get_osabi_name (filedata, header->e_ident[EI_OSABI]));
4780       printf (_("  ABI Version:                       %d\n"),
4781               header->e_ident[EI_ABIVERSION]);
4782       printf (_("  Type:                              %s\n"),
4783               get_file_type (header->e_type));
4784       printf (_("  Machine:                           %s\n"),
4785               get_machine_name (header->e_machine));
4786       printf (_("  Version:                           0x%lx\n"),
4787               header->e_version);
4788
4789       printf (_("  Entry point address:               "));
4790       print_vma (header->e_entry, PREFIX_HEX);
4791       printf (_("\n  Start of program headers:          "));
4792       print_vma (header->e_phoff, DEC);
4793       printf (_(" (bytes into file)\n  Start of section headers:          "));
4794       print_vma (header->e_shoff, DEC);
4795       printf (_(" (bytes into file)\n"));
4796
4797       printf (_("  Flags:                             0x%lx%s\n"),
4798               header->e_flags,
4799               get_machine_flags (filedata, header->e_flags, header->e_machine));
4800       printf (_("  Size of this header:               %u (bytes)\n"),
4801               header->e_ehsize);
4802       printf (_("  Size of program headers:           %u (bytes)\n"),
4803               header->e_phentsize);
4804       printf (_("  Number of program headers:         %u"),
4805               header->e_phnum);
4806       if (filedata->section_headers != NULL
4807           && header->e_phnum == PN_XNUM
4808           && filedata->section_headers[0].sh_info != 0)
4809         {
4810           header->e_phnum = filedata->section_headers[0].sh_info;
4811           printf (" (%u)", header->e_phnum);
4812         }
4813       putc ('\n', stdout);
4814       printf (_("  Size of section headers:           %u (bytes)\n"),
4815               header->e_shentsize);
4816       printf (_("  Number of section headers:         %u"),
4817               header->e_shnum);
4818       if (filedata->section_headers != NULL && header->e_shnum == SHN_UNDEF)
4819         {
4820           header->e_shnum = filedata->section_headers[0].sh_size;
4821           printf (" (%u)", header->e_shnum);
4822         }
4823       putc ('\n', stdout);
4824       printf (_("  Section header string table index: %u"),
4825               header->e_shstrndx);
4826       if (filedata->section_headers != NULL
4827           && header->e_shstrndx == (SHN_XINDEX & 0xffff))
4828         {
4829           header->e_shstrndx = filedata->section_headers[0].sh_link;
4830           printf (" (%u)", header->e_shstrndx);
4831         }
4832       if (header->e_shstrndx != SHN_UNDEF
4833           && header->e_shstrndx >= header->e_shnum)
4834         {
4835           header->e_shstrndx = SHN_UNDEF;
4836           printf (_(" <corrupt: out of range>"));
4837         }
4838       putc ('\n', stdout);
4839     }
4840
4841   if (filedata->section_headers != NULL)
4842     {
4843       if (header->e_phnum == PN_XNUM
4844           && filedata->section_headers[0].sh_info != 0)
4845         header->e_phnum = filedata->section_headers[0].sh_info;
4846       if (header->e_shnum == SHN_UNDEF)
4847         header->e_shnum = filedata->section_headers[0].sh_size;
4848       if (header->e_shstrndx == (SHN_XINDEX & 0xffff))
4849         header->e_shstrndx = filedata->section_headers[0].sh_link;
4850       if (header->e_shstrndx >= header->e_shnum)
4851         header->e_shstrndx = SHN_UNDEF;
4852       free (filedata->section_headers);
4853       filedata->section_headers = NULL;
4854     }
4855
4856   return TRUE;
4857 }
4858
4859 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4860    Returns TRUE upon success, FALSE otherwise.  Loads 32-bit headers.  */
4861
4862 static bfd_boolean
4863 get_32bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4864 {
4865   Elf32_External_Phdr * phdrs;
4866   Elf32_External_Phdr * external;
4867   Elf_Internal_Phdr *   internal;
4868   unsigned int i;
4869   unsigned int size = filedata->file_header.e_phentsize;
4870   unsigned int num  = filedata->file_header.e_phnum;
4871
4872   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4873   if (size == 0 || num == 0)
4874     return FALSE;
4875   if (size < sizeof * phdrs)
4876     {
4877       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4878       return FALSE;
4879     }
4880   if (size > sizeof * phdrs)
4881     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4882
4883   phdrs = (Elf32_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4884                                             size, num, _("program headers"));
4885   if (phdrs == NULL)
4886     return FALSE;
4887
4888   for (i = 0, internal = pheaders, external = phdrs;
4889        i < filedata->file_header.e_phnum;
4890        i++, internal++, external++)
4891     {
4892       internal->p_type   = BYTE_GET (external->p_type);
4893       internal->p_offset = BYTE_GET (external->p_offset);
4894       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4895       internal->p_paddr  = BYTE_GET (external->p_paddr);
4896       internal->p_filesz = BYTE_GET (external->p_filesz);
4897       internal->p_memsz  = BYTE_GET (external->p_memsz);
4898       internal->p_flags  = BYTE_GET (external->p_flags);
4899       internal->p_align  = BYTE_GET (external->p_align);
4900     }
4901
4902   free (phdrs);
4903   return TRUE;
4904 }
4905
4906 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4907    Returns TRUE upon success, FALSE otherwise.  Loads 64-bit headers.  */
4908
4909 static bfd_boolean
4910 get_64bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4911 {
4912   Elf64_External_Phdr * phdrs;
4913   Elf64_External_Phdr * external;
4914   Elf_Internal_Phdr *   internal;
4915   unsigned int i;
4916   unsigned int size = filedata->file_header.e_phentsize;
4917   unsigned int num  = filedata->file_header.e_phnum;
4918
4919   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4920   if (size == 0 || num == 0)
4921     return FALSE;
4922   if (size < sizeof * phdrs)
4923     {
4924       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4925       return FALSE;
4926     }
4927   if (size > sizeof * phdrs)
4928     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4929
4930   phdrs = (Elf64_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4931                                             size, num, _("program headers"));
4932   if (!phdrs)
4933     return FALSE;
4934
4935   for (i = 0, internal = pheaders, external = phdrs;
4936        i < filedata->file_header.e_phnum;
4937        i++, internal++, external++)
4938     {
4939       internal->p_type   = BYTE_GET (external->p_type);
4940       internal->p_flags  = BYTE_GET (external->p_flags);
4941       internal->p_offset = BYTE_GET (external->p_offset);
4942       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4943       internal->p_paddr  = BYTE_GET (external->p_paddr);
4944       internal->p_filesz = BYTE_GET (external->p_filesz);
4945       internal->p_memsz  = BYTE_GET (external->p_memsz);
4946       internal->p_align  = BYTE_GET (external->p_align);
4947     }
4948
4949   free (phdrs);
4950   return TRUE;
4951 }
4952
4953 /* Returns TRUE if the program headers were read into `program_headers'.  */
4954
4955 static bfd_boolean
4956 get_program_headers (Filedata * filedata)
4957 {
4958   Elf_Internal_Phdr * phdrs;
4959
4960   /* Check cache of prior read.  */
4961   if (filedata->program_headers != NULL)
4962     return TRUE;
4963
4964   /* Be kind to memory checkers by looking for
4965      e_phnum values which we know must be invalid.  */
4966   if (filedata->file_header.e_phnum
4967       * (is_32bit_elf ? sizeof (Elf32_External_Phdr) : sizeof (Elf64_External_Phdr))
4968       >= filedata->file_size)
4969     {
4970       error (_("Too many program headers - %#x - the file is not that big\n"),
4971              filedata->file_header.e_phnum);
4972       return FALSE;
4973     }
4974
4975   phdrs = (Elf_Internal_Phdr *) cmalloc (filedata->file_header.e_phnum,
4976                                          sizeof (Elf_Internal_Phdr));
4977   if (phdrs == NULL)
4978     {
4979       error (_("Out of memory reading %u program headers\n"),
4980              filedata->file_header.e_phnum);
4981       return FALSE;
4982     }
4983
4984   if (is_32bit_elf
4985       ? get_32bit_program_headers (filedata, phdrs)
4986       : get_64bit_program_headers (filedata, phdrs))
4987     {
4988       filedata->program_headers = phdrs;
4989       return TRUE;
4990     }
4991
4992   free (phdrs);
4993   return FALSE;
4994 }
4995
4996 /* Returns TRUE if the program headers were loaded.  */
4997
4998 static bfd_boolean
4999 process_program_headers (Filedata * filedata)
5000 {
5001   Elf_Internal_Phdr * segment;
5002   unsigned int i;
5003   Elf_Internal_Phdr * previous_load = NULL;
5004
5005   if (filedata->file_header.e_phnum == 0)
5006     {
5007       /* PR binutils/12467.  */
5008       if (filedata->file_header.e_phoff != 0)
5009         {
5010           warn (_("possibly corrupt ELF header - it has a non-zero program"
5011                   " header offset, but no program headers\n"));
5012           return FALSE;
5013         }
5014       else if (do_segments)
5015         printf (_("\nThere are no program headers in this file.\n"));
5016       return TRUE;
5017     }
5018
5019   if (do_segments && !do_header)
5020     {
5021       printf (_("\nElf file type is %s\n"), get_file_type (filedata->file_header.e_type));
5022       printf (_("Entry point 0x%s\n"), bfd_vmatoa ("x", filedata->file_header.e_entry));
5023       printf (ngettext ("There is %d program header, starting at offset %s\n",
5024                         "There are %d program headers, starting at offset %s\n",
5025                         filedata->file_header.e_phnum),
5026               filedata->file_header.e_phnum,
5027               bfd_vmatoa ("u", filedata->file_header.e_phoff));
5028     }
5029
5030   if (! get_program_headers (filedata))
5031     return TRUE;
5032
5033   if (do_segments)
5034     {
5035       if (filedata->file_header.e_phnum > 1)
5036         printf (_("\nProgram Headers:\n"));
5037       else
5038         printf (_("\nProgram Headers:\n"));
5039
5040       if (is_32bit_elf)
5041         printf
5042           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
5043       else if (do_wide)
5044         printf
5045           (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
5046       else
5047         {
5048           printf
5049             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
5050           printf
5051             (_("                 FileSiz            MemSiz              Flags  Align\n"));
5052         }
5053     }
5054
5055   dynamic_addr = 0;
5056   dynamic_size = 0;
5057
5058   for (i = 0, segment = filedata->program_headers;
5059        i < filedata->file_header.e_phnum;
5060        i++, segment++)
5061     {
5062       if (do_segments)
5063         {
5064           printf ("  %-14.14s ", get_segment_type (filedata, segment->p_type));
5065
5066           if (is_32bit_elf)
5067             {
5068               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5069               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
5070               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
5071               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
5072               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
5073               printf ("%c%c%c ",
5074                       (segment->p_flags & PF_R ? 'R' : ' '),
5075                       (segment->p_flags & PF_W ? 'W' : ' '),
5076                       (segment->p_flags & PF_X ? 'E' : ' '));
5077               printf ("%#lx", (unsigned long) segment->p_align);
5078             }
5079           else if (do_wide)
5080             {
5081               if ((unsigned long) segment->p_offset == segment->p_offset)
5082                 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5083               else
5084                 {
5085                   print_vma (segment->p_offset, FULL_HEX);
5086                   putchar (' ');
5087                 }
5088
5089               print_vma (segment->p_vaddr, FULL_HEX);
5090               putchar (' ');
5091               print_vma (segment->p_paddr, FULL_HEX);
5092               putchar (' ');
5093
5094               if ((unsigned long) segment->p_filesz == segment->p_filesz)
5095                 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
5096               else
5097                 {
5098                   print_vma (segment->p_filesz, FULL_HEX);
5099                   putchar (' ');
5100                 }
5101
5102               if ((unsigned long) segment->p_memsz == segment->p_memsz)
5103                 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
5104               else
5105                 {
5106                   print_vma (segment->p_memsz, FULL_HEX);
5107                 }
5108
5109               printf (" %c%c%c ",
5110                       (segment->p_flags & PF_R ? 'R' : ' '),
5111                       (segment->p_flags & PF_W ? 'W' : ' '),
5112                       (segment->p_flags & PF_X ? 'E' : ' '));
5113
5114               if ((unsigned long) segment->p_align == segment->p_align)
5115                 printf ("%#lx", (unsigned long) segment->p_align);
5116               else
5117                 {
5118                   print_vma (segment->p_align, PREFIX_HEX);
5119                 }
5120             }
5121           else
5122             {
5123               print_vma (segment->p_offset, FULL_HEX);
5124               putchar (' ');
5125               print_vma (segment->p_vaddr, FULL_HEX);
5126               putchar (' ');
5127               print_vma (segment->p_paddr, FULL_HEX);
5128               printf ("\n                 ");
5129               print_vma (segment->p_filesz, FULL_HEX);
5130               putchar (' ');
5131               print_vma (segment->p_memsz, FULL_HEX);
5132               printf ("  %c%c%c    ",
5133                       (segment->p_flags & PF_R ? 'R' : ' '),
5134                       (segment->p_flags & PF_W ? 'W' : ' '),
5135                       (segment->p_flags & PF_X ? 'E' : ' '));
5136               print_vma (segment->p_align, PREFIX_HEX);
5137             }
5138
5139           putc ('\n', stdout);
5140         }
5141
5142       switch (segment->p_type)
5143         {
5144         case PT_LOAD:
5145 #if 0 /* Do not warn about out of order PT_LOAD segments.  Although officially
5146          required by the ELF standard, several programs, including the Linux
5147          kernel, make use of non-ordered segments.  */
5148           if (previous_load
5149               && previous_load->p_vaddr > segment->p_vaddr)
5150             error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
5151 #endif
5152           if (segment->p_memsz < segment->p_filesz)
5153             error (_("the segment's file size is larger than its memory size\n"));
5154           previous_load = segment;
5155           break;
5156
5157         case PT_PHDR:
5158           /* PR 20815 - Verify that the program header is loaded into memory.  */
5159           if (i > 0 && previous_load != NULL)
5160             error (_("the PHDR segment must occur before any LOAD segment\n"));
5161           if (filedata->file_header.e_machine != EM_PARISC)
5162             {
5163               unsigned int j;
5164
5165               for (j = 1; j < filedata->file_header.e_phnum; j++)
5166                 if (filedata->program_headers[j].p_vaddr <= segment->p_vaddr
5167                     && (filedata->program_headers[j].p_vaddr
5168                         + filedata->program_headers[j].p_memsz)
5169                     >= (segment->p_vaddr + segment->p_filesz))
5170                   break;
5171               if (j == filedata->file_header.e_phnum)
5172                 error (_("the PHDR segment is not covered by a LOAD segment\n"));
5173             }
5174           break;
5175
5176         case PT_DYNAMIC:
5177           if (dynamic_addr)
5178             error (_("more than one dynamic segment\n"));
5179
5180           /* By default, assume that the .dynamic section is the first
5181              section in the DYNAMIC segment.  */
5182           dynamic_addr = segment->p_offset;
5183           dynamic_size = segment->p_filesz;
5184
5185           /* Try to locate the .dynamic section. If there is
5186              a section header table, we can easily locate it.  */
5187           if (filedata->section_headers != NULL)
5188             {
5189               Elf_Internal_Shdr * sec;
5190
5191               sec = find_section (filedata, ".dynamic");
5192               if (sec == NULL || sec->sh_size == 0)
5193                 {
5194                   /* A corresponding .dynamic section is expected, but on
5195                      IA-64/OpenVMS it is OK for it to be missing.  */
5196                   if (!is_ia64_vms (filedata))
5197                     error (_("no .dynamic section in the dynamic segment\n"));
5198                   break;
5199                 }
5200
5201               if (sec->sh_type == SHT_NOBITS)
5202                 {
5203                   dynamic_size = 0;
5204                   break;
5205                 }
5206
5207               dynamic_addr = sec->sh_offset;
5208               dynamic_size = sec->sh_size;
5209
5210               if (dynamic_addr < segment->p_offset
5211                   || dynamic_addr > segment->p_offset + segment->p_filesz)
5212                 warn (_("the .dynamic section is not contained"
5213                         " within the dynamic segment\n"));
5214               else if (dynamic_addr > segment->p_offset)
5215                 warn (_("the .dynamic section is not the first section"
5216                         " in the dynamic segment.\n"));
5217             }
5218
5219           /* PR binutils/17512: Avoid corrupt dynamic section info in the
5220              segment.  Check this after matching against the section headers
5221              so we don't warn on debuginfo file (which have NOBITS .dynamic
5222              sections).  */
5223           if (dynamic_addr + dynamic_size >= filedata->file_size)
5224             {
5225               error (_("the dynamic segment offset + size exceeds the size of the file\n"));
5226               dynamic_addr = dynamic_size = 0;
5227             }
5228           break;
5229
5230         case PT_INTERP:
5231           if (fseek (filedata->handle, archive_file_offset + (long) segment->p_offset,
5232                      SEEK_SET))
5233             error (_("Unable to find program interpreter name\n"));
5234           else
5235             {
5236               char fmt [32];
5237               int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
5238
5239               if (ret >= (int) sizeof (fmt) || ret < 0)
5240                 error (_("Internal error: failed to create format string to display program interpreter\n"));
5241
5242               program_interpreter[0] = 0;
5243               if (fscanf (filedata->handle, fmt, program_interpreter) <= 0)
5244                 error (_("Unable to read program interpreter name\n"));
5245
5246               if (do_segments)
5247                 printf (_("      [Requesting program interpreter: %s]\n"),
5248                     program_interpreter);
5249             }
5250           break;
5251         }
5252     }
5253
5254   if (do_segments
5255       && filedata->section_headers != NULL
5256       && filedata->string_table != NULL)
5257     {
5258       printf (_("\n Section to Segment mapping:\n"));
5259       printf (_("  Segment Sections...\n"));
5260
5261       for (i = 0; i < filedata->file_header.e_phnum; i++)
5262         {
5263           unsigned int j;
5264           Elf_Internal_Shdr * section;
5265
5266           segment = filedata->program_headers + i;
5267           section = filedata->section_headers + 1;
5268
5269           printf ("   %2.2d     ", i);
5270
5271           for (j = 1; j < filedata->file_header.e_shnum; j++, section++)
5272             {
5273               if (!ELF_TBSS_SPECIAL (section, segment)
5274                   && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
5275                 printf ("%s ", printable_section_name (filedata, section));
5276             }
5277
5278           putc ('\n',stdout);
5279         }
5280     }
5281
5282   return TRUE;
5283 }
5284
5285
5286 /* Find the file offset corresponding to VMA by using the program headers.  */
5287
5288 static long
5289 offset_from_vma (Filedata * filedata, bfd_vma vma, bfd_size_type size)
5290 {
5291   Elf_Internal_Phdr * seg;
5292
5293   if (! get_program_headers (filedata))
5294     {
5295       warn (_("Cannot interpret virtual addresses without program headers.\n"));
5296       return (long) vma;
5297     }
5298
5299   for (seg = filedata->program_headers;
5300        seg < filedata->program_headers + filedata->file_header.e_phnum;
5301        ++seg)
5302     {
5303       if (seg->p_type != PT_LOAD)
5304         continue;
5305
5306       if (vma >= (seg->p_vaddr & -seg->p_align)
5307           && vma + size <= seg->p_vaddr + seg->p_filesz)
5308         return vma - seg->p_vaddr + seg->p_offset;
5309     }
5310
5311   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
5312         (unsigned long) vma);
5313   return (long) vma;
5314 }
5315
5316
5317 /* Allocate memory and load the sections headers into FILEDATA->filedata->section_headers.
5318    If PROBE is true, this is just a probe and we do not generate any error
5319    messages if the load fails.  */
5320
5321 static bfd_boolean
5322 get_32bit_section_headers (Filedata * filedata, bfd_boolean probe)
5323 {
5324   Elf32_External_Shdr * shdrs;
5325   Elf_Internal_Shdr *   internal;
5326   unsigned int          i;
5327   unsigned int          size = filedata->file_header.e_shentsize;
5328   unsigned int          num = probe ? 1 : filedata->file_header.e_shnum;
5329
5330   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5331   if (size == 0 || num == 0)
5332     return FALSE;
5333   if (size < sizeof * shdrs)
5334     {
5335       if (! probe)
5336         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5337       return FALSE;
5338     }
5339   if (!probe && size > sizeof * shdrs)
5340     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5341
5342   shdrs = (Elf32_External_Shdr *) get_data (NULL, filedata, filedata->file_header.e_shoff,
5343                                             size, num,
5344                                             probe ? NULL : _("section headers"));
5345   if (shdrs == NULL)
5346     return FALSE;
5347
5348   free (filedata->section_headers);
5349   filedata->section_headers = (Elf_Internal_Shdr *)
5350     cmalloc (num, sizeof (Elf_Internal_Shdr));
5351   if (filedata->section_headers == NULL)
5352     {
5353       if (!probe)
5354         error (_("Out of memory reading %u section headers\n"), num);
5355       free (shdrs);
5356       return FALSE;
5357     }
5358
5359   for (i = 0, internal = filedata->section_headers;
5360        i < num;
5361        i++, internal++)
5362     {
5363       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5364       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5365       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5366       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5367       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5368       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5369       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5370       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5371       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5372       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5373       if (!probe && internal->sh_link > num)
5374         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5375       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5376         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5377     }
5378
5379   free (shdrs);
5380   return TRUE;
5381 }
5382
5383 /* Like get_32bit_section_headers, except that it fetches 64-bit headers.  */
5384
5385 static bfd_boolean
5386 get_64bit_section_headers (Filedata * filedata, bfd_boolean probe)
5387 {
5388   Elf64_External_Shdr *  shdrs;
5389   Elf_Internal_Shdr *    internal;
5390   unsigned int           i;
5391   unsigned int           size = filedata->file_header.e_shentsize;
5392   unsigned int           num = probe ? 1 : filedata->file_header.e_shnum;
5393
5394   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5395   if (size == 0 || num == 0)
5396     return FALSE;
5397
5398   if (size < sizeof * shdrs)
5399     {
5400       if (! probe)
5401         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5402       return FALSE;
5403     }
5404
5405   if (! probe && size > sizeof * shdrs)
5406     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5407
5408   shdrs = (Elf64_External_Shdr *) get_data (NULL, filedata,
5409                                             filedata->file_header.e_shoff,
5410                                             size, num,
5411                                             probe ? NULL : _("section headers"));
5412   if (shdrs == NULL)
5413     return FALSE;
5414
5415   free (filedata->section_headers);
5416   filedata->section_headers = (Elf_Internal_Shdr *)
5417     cmalloc (num, sizeof (Elf_Internal_Shdr));
5418   if (filedata->section_headers == NULL)
5419     {
5420       if (! probe)
5421         error (_("Out of memory reading %u section headers\n"), num);
5422       free (shdrs);
5423       return FALSE;
5424     }
5425
5426   for (i = 0, internal = filedata->section_headers;
5427        i < num;
5428        i++, internal++)
5429     {
5430       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5431       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5432       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5433       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5434       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5435       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5436       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5437       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5438       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5439       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5440       if (!probe && internal->sh_link > num)
5441         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5442       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5443         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5444     }
5445
5446   free (shdrs);
5447   return TRUE;
5448 }
5449
5450 static Elf_Internal_Sym *
5451 get_32bit_elf_symbols (Filedata *           filedata,
5452                        Elf_Internal_Shdr *  section,
5453                        unsigned long *      num_syms_return)
5454 {
5455   unsigned long number = 0;
5456   Elf32_External_Sym * esyms = NULL;
5457   Elf_External_Sym_Shndx * shndx = NULL;
5458   Elf_Internal_Sym * isyms = NULL;
5459   Elf_Internal_Sym * psym;
5460   unsigned int j;
5461   elf_section_list * entry;
5462
5463   if (section->sh_size == 0)
5464     {
5465       if (num_syms_return != NULL)
5466         * num_syms_return = 0;
5467       return NULL;
5468     }
5469
5470   /* Run some sanity checks first.  */
5471   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5472     {
5473       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5474              printable_section_name (filedata, section),
5475              (unsigned long) section->sh_entsize);
5476       goto exit_point;
5477     }
5478
5479   if (section->sh_size > filedata->file_size)
5480     {
5481       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5482              printable_section_name (filedata, section),
5483              (unsigned long) section->sh_size);
5484       goto exit_point;
5485     }
5486
5487   number = section->sh_size / section->sh_entsize;
5488
5489   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5490     {
5491       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5492              (unsigned long) section->sh_size,
5493              printable_section_name (filedata, section),
5494              (unsigned long) section->sh_entsize);
5495       goto exit_point;
5496     }
5497
5498   esyms = (Elf32_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5499                                            section->sh_size, _("symbols"));
5500   if (esyms == NULL)
5501     goto exit_point;
5502
5503   shndx = NULL;
5504   for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5505     {
5506       if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5507         continue;
5508
5509       if (shndx != NULL)
5510         {
5511           error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5512           free (shndx);
5513         }
5514
5515       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5516                                                    entry->hdr->sh_offset,
5517                                                    1, entry->hdr->sh_size,
5518                                                    _("symbol table section indices"));
5519       if (shndx == NULL)
5520         goto exit_point;
5521
5522       /* PR17531: file: heap-buffer-overflow */
5523       if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5524         {
5525           error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5526                  printable_section_name (filedata, entry->hdr),
5527                  (unsigned long) entry->hdr->sh_size,
5528                  (unsigned long) section->sh_size);
5529           goto exit_point;
5530         }
5531     }
5532
5533   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5534
5535   if (isyms == NULL)
5536     {
5537       error (_("Out of memory reading %lu symbols\n"),
5538              (unsigned long) number);
5539       goto exit_point;
5540     }
5541
5542   for (j = 0, psym = isyms; j < number; j++, psym++)
5543     {
5544       psym->st_name  = BYTE_GET (esyms[j].st_name);
5545       psym->st_value = BYTE_GET (esyms[j].st_value);
5546       psym->st_size  = BYTE_GET (esyms[j].st_size);
5547       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5548       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5549         psym->st_shndx
5550           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5551       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5552         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5553       psym->st_info  = BYTE_GET (esyms[j].st_info);
5554       psym->st_other = BYTE_GET (esyms[j].st_other);
5555     }
5556
5557  exit_point:
5558   free (shndx);
5559   free (esyms);
5560
5561   if (num_syms_return != NULL)
5562     * num_syms_return = isyms == NULL ? 0 : number;
5563
5564   return isyms;
5565 }
5566
5567 static Elf_Internal_Sym *
5568 get_64bit_elf_symbols (Filedata *           filedata,
5569                        Elf_Internal_Shdr *  section,
5570                        unsigned long *      num_syms_return)
5571 {
5572   unsigned long number = 0;
5573   Elf64_External_Sym * esyms = NULL;
5574   Elf_External_Sym_Shndx * shndx = NULL;
5575   Elf_Internal_Sym * isyms = NULL;
5576   Elf_Internal_Sym * psym;
5577   unsigned int j;
5578   elf_section_list * entry;
5579
5580   if (section->sh_size == 0)
5581     {
5582       if (num_syms_return != NULL)
5583         * num_syms_return = 0;
5584       return NULL;
5585     }
5586
5587   /* Run some sanity checks first.  */
5588   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5589     {
5590       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5591              printable_section_name (filedata, section),
5592              (unsigned long) section->sh_entsize);
5593       goto exit_point;
5594     }
5595
5596   if (section->sh_size > filedata->file_size)
5597     {
5598       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5599              printable_section_name (filedata, section),
5600              (unsigned long) section->sh_size);
5601       goto exit_point;
5602     }
5603
5604   number = section->sh_size / section->sh_entsize;
5605
5606   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5607     {
5608       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5609              (unsigned long) section->sh_size,
5610              printable_section_name (filedata, section),
5611              (unsigned long) section->sh_entsize);
5612       goto exit_point;
5613     }
5614
5615   esyms = (Elf64_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5616                                            section->sh_size, _("symbols"));
5617   if (!esyms)
5618     goto exit_point;
5619
5620   shndx = NULL;
5621   for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5622     {
5623       if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5624         continue;
5625
5626       if (shndx != NULL)
5627         {
5628           error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5629           free (shndx);
5630         }
5631
5632       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5633                                                    entry->hdr->sh_offset,
5634                                                    1, entry->hdr->sh_size,
5635                                                    _("symbol table section indices"));
5636       if (shndx == NULL)
5637         goto exit_point;
5638
5639       /* PR17531: file: heap-buffer-overflow */
5640       if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5641         {
5642           error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5643                  printable_section_name (filedata, entry->hdr),
5644                  (unsigned long) entry->hdr->sh_size,
5645                  (unsigned long) section->sh_size);
5646           goto exit_point;
5647         }
5648     }
5649
5650   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5651
5652   if (isyms == NULL)
5653     {
5654       error (_("Out of memory reading %lu symbols\n"),
5655              (unsigned long) number);
5656       goto exit_point;
5657     }
5658
5659   for (j = 0, psym = isyms; j < number; j++, psym++)
5660     {
5661       psym->st_name  = BYTE_GET (esyms[j].st_name);
5662       psym->st_info  = BYTE_GET (esyms[j].st_info);
5663       psym->st_other = BYTE_GET (esyms[j].st_other);
5664       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5665
5666       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5667         psym->st_shndx
5668           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5669       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5670         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5671
5672       psym->st_value = BYTE_GET (esyms[j].st_value);
5673       psym->st_size  = BYTE_GET (esyms[j].st_size);
5674     }
5675
5676  exit_point:
5677   free (shndx);
5678   free (esyms);
5679
5680   if (num_syms_return != NULL)
5681     * num_syms_return = isyms == NULL ? 0 : number;
5682
5683   return isyms;
5684 }
5685
5686 static const char *
5687 get_elf_section_flags (Filedata * filedata, bfd_vma sh_flags)
5688 {
5689   static char buff[1024];
5690   char * p = buff;
5691   unsigned int field_size = is_32bit_elf ? 8 : 16;
5692   signed int sindex;
5693   unsigned int size = sizeof (buff) - (field_size + 4 + 1);
5694   bfd_vma os_flags = 0;
5695   bfd_vma proc_flags = 0;
5696   bfd_vma unknown_flags = 0;
5697   static const struct
5698     {
5699       const char * str;
5700       unsigned int len;
5701     }
5702   flags [] =
5703     {
5704       /*  0 */ { STRING_COMMA_LEN ("WRITE") },
5705       /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
5706       /*  2 */ { STRING_COMMA_LEN ("EXEC") },
5707       /*  3 */ { STRING_COMMA_LEN ("MERGE") },
5708       /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
5709       /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
5710       /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5711       /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5712       /*  8 */ { STRING_COMMA_LEN ("GROUP") },
5713       /*  9 */ { STRING_COMMA_LEN ("TLS") },
5714       /* IA-64 specific.  */
5715       /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5716       /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5717       /* IA-64 OpenVMS specific.  */
5718       /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5719       /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5720       /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5721       /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5722       /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5723       /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5724       /* Generic.  */
5725       /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5726       /* SPARC specific.  */
5727       /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5728       /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5729       /* ARM specific.  */
5730       /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5731       /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5732       /* 23 */ { STRING_COMMA_LEN ("COMDEF") },
5733       /* GNU specific.  */
5734       /* 24 */ { STRING_COMMA_LEN ("GNU_MBIND") },
5735       /* VLE specific.  */
5736       /* 25 */ { STRING_COMMA_LEN ("VLE") },
5737     };
5738
5739   if (do_section_details)
5740     {
5741       sprintf (buff, "[%*.*lx]: ",
5742                field_size, field_size, (unsigned long) sh_flags);
5743       p += field_size + 4;
5744     }
5745
5746   while (sh_flags)
5747     {
5748       bfd_vma flag;
5749
5750       flag = sh_flags & - sh_flags;
5751       sh_flags &= ~ flag;
5752
5753       if (do_section_details)
5754         {
5755           switch (flag)
5756             {
5757             case SHF_WRITE:             sindex = 0; break;
5758             case SHF_ALLOC:             sindex = 1; break;
5759             case SHF_EXECINSTR:         sindex = 2; break;
5760             case SHF_MERGE:             sindex = 3; break;
5761             case SHF_STRINGS:           sindex = 4; break;
5762             case SHF_INFO_LINK:         sindex = 5; break;
5763             case SHF_LINK_ORDER:        sindex = 6; break;
5764             case SHF_OS_NONCONFORMING:  sindex = 7; break;
5765             case SHF_GROUP:             sindex = 8; break;
5766             case SHF_TLS:               sindex = 9; break;
5767             case SHF_EXCLUDE:           sindex = 18; break;
5768             case SHF_COMPRESSED:        sindex = 20; break;
5769             case SHF_GNU_MBIND:         sindex = 24; break;
5770
5771             default:
5772               sindex = -1;
5773               switch (filedata->file_header.e_machine)
5774                 {
5775                 case EM_IA_64:
5776                   if (flag == SHF_IA_64_SHORT)
5777                     sindex = 10;
5778                   else if (flag == SHF_IA_64_NORECOV)
5779                     sindex = 11;
5780 #ifdef BFD64
5781                   else if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5782                     switch (flag)
5783                       {
5784                       case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
5785                       case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
5786                       case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
5787                       case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
5788                       case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5789                       case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
5790                       default:                        break;
5791                       }
5792 #endif
5793                   break;
5794
5795                 case EM_386:
5796                 case EM_IAMCU:
5797                 case EM_X86_64:
5798                 case EM_L1OM:
5799                 case EM_K1OM:
5800                 case EM_OLD_SPARCV9:
5801                 case EM_SPARC32PLUS:
5802                 case EM_SPARCV9:
5803                 case EM_SPARC:
5804                   if (flag == SHF_ORDERED)
5805                     sindex = 19;
5806                   break;
5807
5808                 case EM_ARM:
5809                   switch (flag)
5810                     {
5811                     case SHF_ENTRYSECT: sindex = 21; break;
5812                     case SHF_ARM_PURECODE: sindex = 22; break;
5813                     case SHF_COMDEF: sindex = 23; break;
5814                     default: break;
5815                     }
5816                   break;
5817                 case EM_PPC:
5818                   if (flag == SHF_PPC_VLE)
5819                     sindex = 25;
5820                   break;
5821
5822                 default:
5823                   break;
5824                 }
5825             }
5826
5827           if (sindex != -1)
5828             {
5829               if (p != buff + field_size + 4)
5830                 {
5831                   if (size < (10 + 2))
5832                     {
5833                       warn (_("Internal error: not enough buffer room for section flag info"));
5834                       return _("<unknown>");
5835                     }
5836                   size -= 2;
5837                   *p++ = ',';
5838                   *p++ = ' ';
5839                 }
5840
5841               size -= flags [sindex].len;
5842               p = stpcpy (p, flags [sindex].str);
5843             }
5844           else if (flag & SHF_MASKOS)
5845             os_flags |= flag;
5846           else if (flag & SHF_MASKPROC)
5847             proc_flags |= flag;
5848           else
5849             unknown_flags |= flag;
5850         }
5851       else
5852         {
5853           switch (flag)
5854             {
5855             case SHF_WRITE:             *p = 'W'; break;
5856             case SHF_ALLOC:             *p = 'A'; break;
5857             case SHF_EXECINSTR:         *p = 'X'; break;
5858             case SHF_MERGE:             *p = 'M'; break;
5859             case SHF_STRINGS:           *p = 'S'; break;
5860             case SHF_INFO_LINK:         *p = 'I'; break;
5861             case SHF_LINK_ORDER:        *p = 'L'; break;
5862             case SHF_OS_NONCONFORMING:  *p = 'O'; break;
5863             case SHF_GROUP:             *p = 'G'; break;
5864             case SHF_TLS:               *p = 'T'; break;
5865             case SHF_EXCLUDE:           *p = 'E'; break;
5866             case SHF_COMPRESSED:        *p = 'C'; break;
5867             case SHF_GNU_MBIND:         *p = 'D'; break;
5868
5869             default:
5870               if ((filedata->file_header.e_machine == EM_X86_64
5871                    || filedata->file_header.e_machine == EM_L1OM
5872                    || filedata->file_header.e_machine == EM_K1OM)
5873                   && flag == SHF_X86_64_LARGE)
5874                 *p = 'l';
5875               else if (filedata->file_header.e_machine == EM_ARM
5876                        && flag == SHF_ARM_PURECODE)
5877                   *p = 'y';
5878               else if (filedata->file_header.e_machine == EM_PPC
5879                        && flag == SHF_PPC_VLE)
5880                   *p = 'v';
5881               else if (flag & SHF_MASKOS)
5882                 {
5883                   *p = 'o';
5884                   sh_flags &= ~ SHF_MASKOS;
5885                 }
5886               else if (flag & SHF_MASKPROC)
5887                 {
5888                   *p = 'p';
5889                   sh_flags &= ~ SHF_MASKPROC;
5890                 }
5891               else
5892                 *p = 'x';
5893               break;
5894             }
5895           p++;
5896         }
5897     }
5898
5899   if (do_section_details)
5900     {
5901       if (os_flags)
5902         {
5903           size -= 5 + field_size;
5904           if (p != buff + field_size + 4)
5905             {
5906               if (size < (2 + 1))
5907                 {
5908                   warn (_("Internal error: not enough buffer room for section flag info"));
5909                   return _("<unknown>");
5910                 }
5911               size -= 2;
5912               *p++ = ',';
5913               *p++ = ' ';
5914             }
5915           sprintf (p, "OS (%*.*lx)", field_size, field_size,
5916                    (unsigned long) os_flags);
5917           p += 5 + field_size;
5918         }
5919       if (proc_flags)
5920         {
5921           size -= 7 + field_size;
5922           if (p != buff + field_size + 4)
5923             {
5924               if (size < (2 + 1))
5925                 {
5926                   warn (_("Internal error: not enough buffer room for section flag info"));
5927                   return _("<unknown>");
5928                 }
5929               size -= 2;
5930               *p++ = ',';
5931               *p++ = ' ';
5932             }
5933           sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5934                    (unsigned long) proc_flags);
5935           p += 7 + field_size;
5936         }
5937       if (unknown_flags)
5938         {
5939           size -= 10 + field_size;
5940           if (p != buff + field_size + 4)
5941             {
5942               if (size < (2 + 1))
5943                 {
5944                   warn (_("Internal error: not enough buffer room for section flag info"));
5945                   return _("<unknown>");
5946                 }
5947               size -= 2;
5948               *p++ = ',';
5949               *p++ = ' ';
5950             }
5951           sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5952                    (unsigned long) unknown_flags);
5953           p += 10 + field_size;
5954         }
5955     }
5956
5957   *p = '\0';
5958   return buff;
5959 }
5960
5961 static unsigned int
5962 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf, bfd_size_type size)
5963 {
5964   if (is_32bit_elf)
5965     {
5966       Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5967
5968       if (size < sizeof (* echdr))
5969         {
5970           error (_("Compressed section is too small even for a compression header\n"));
5971           return 0;
5972         }
5973
5974       chdr->ch_type = BYTE_GET (echdr->ch_type);
5975       chdr->ch_size = BYTE_GET (echdr->ch_size);
5976       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5977       return sizeof (*echdr);
5978     }
5979   else
5980     {
5981       Elf64_External_Chdr *echdr = (Elf64_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 }
5995
5996 static bfd_boolean
5997 process_section_headers (Filedata * filedata)
5998 {
5999   Elf_Internal_Shdr * section;
6000   unsigned int i;
6001
6002   filedata->section_headers = NULL;
6003
6004   if (filedata->file_header.e_shnum == 0)
6005     {
6006       /* PR binutils/12467.  */
6007       if (filedata->file_header.e_shoff != 0)
6008         {
6009           warn (_("possibly corrupt ELF file header - it has a non-zero"
6010                   " section header offset, but no section headers\n"));
6011           return FALSE;
6012         }
6013       else if (do_sections)
6014         printf (_("\nThere are no sections in this file.\n"));
6015
6016       return TRUE;
6017     }
6018
6019   if (do_sections && !do_header)
6020     printf (ngettext ("There is %d section header, "
6021                       "starting at offset 0x%lx:\n",
6022                       "There are %d section headers, "
6023                       "starting at offset 0x%lx:\n",
6024                       filedata->file_header.e_shnum),
6025             filedata->file_header.e_shnum,
6026             (unsigned long) filedata->file_header.e_shoff);
6027
6028   if (is_32bit_elf)
6029     {
6030       if (! get_32bit_section_headers (filedata, FALSE))
6031         return FALSE;
6032     }
6033   else
6034     {
6035       if (! get_64bit_section_headers (filedata, FALSE))
6036         return FALSE;
6037     }
6038
6039   /* Read in the string table, so that we have names to display.  */
6040   if (filedata->file_header.e_shstrndx != SHN_UNDEF
6041        && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
6042     {
6043       section = filedata->section_headers + filedata->file_header.e_shstrndx;
6044
6045       if (section->sh_size != 0)
6046         {
6047           filedata->string_table = (char *) get_data (NULL, filedata, section->sh_offset,
6048                                                       1, section->sh_size,
6049                                                       _("string table"));
6050
6051           filedata->string_table_length = filedata->string_table != NULL ? section->sh_size : 0;
6052         }
6053     }
6054
6055   /* Scan the sections for the dynamic symbol table
6056      and dynamic string table and debug sections.  */
6057   dynamic_symbols = NULL;
6058   dynamic_strings = NULL;
6059   dynamic_syminfo = NULL;
6060   symtab_shndx_list = NULL;
6061
6062   eh_addr_size = is_32bit_elf ? 4 : 8;
6063   switch (filedata->file_header.e_machine)
6064     {
6065     case EM_MIPS:
6066     case EM_MIPS_RS3_LE:
6067       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
6068          FDE addresses.  However, the ABI also has a semi-official ILP32
6069          variant for which the normal FDE address size rules apply.
6070
6071          GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
6072          section, where XX is the size of longs in bits.  Unfortunately,
6073          earlier compilers provided no way of distinguishing ILP32 objects
6074          from LP64 objects, so if there's any doubt, we should assume that
6075          the official LP64 form is being used.  */
6076       if ((filedata->file_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
6077           && find_section (filedata, ".gcc_compiled_long32") == NULL)
6078         eh_addr_size = 8;
6079       break;
6080
6081     case EM_H8_300:
6082     case EM_H8_300H:
6083       switch (filedata->file_header.e_flags & EF_H8_MACH)
6084         {
6085         case E_H8_MACH_H8300:
6086         case E_H8_MACH_H8300HN:
6087         case E_H8_MACH_H8300SN:
6088         case E_H8_MACH_H8300SXN:
6089           eh_addr_size = 2;
6090           break;
6091         case E_H8_MACH_H8300H:
6092         case E_H8_MACH_H8300S:
6093         case E_H8_MACH_H8300SX:
6094           eh_addr_size = 4;
6095           break;
6096         }
6097       break;
6098
6099     case EM_M32C_OLD:
6100     case EM_M32C:
6101       switch (filedata->file_header.e_flags & EF_M32C_CPU_MASK)
6102         {
6103         case EF_M32C_CPU_M16C:
6104           eh_addr_size = 2;
6105           break;
6106         }
6107       break;
6108     }
6109
6110 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64)                \
6111   do                                                                    \
6112     {                                                                   \
6113       bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64;  \
6114       if (section->sh_entsize != expected_entsize)                      \
6115         {                                                               \
6116           char buf[40];                                                 \
6117           sprintf_vma (buf, section->sh_entsize);                       \
6118           /* Note: coded this way so that there is a single string for  \
6119              translation.  */ \
6120           error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
6121           error (_("(Using the expected size of %u for the rest of this dump)\n"), \
6122                    (unsigned) expected_entsize);                        \
6123           section->sh_entsize = expected_entsize;                       \
6124         }                                                               \
6125     }                                                                   \
6126   while (0)
6127
6128 #define CHECK_ENTSIZE(section, i, type)                                 \
6129   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),         \
6130                         sizeof (Elf64_External_##type))
6131
6132   for (i = 0, section = filedata->section_headers;
6133        i < filedata->file_header.e_shnum;
6134        i++, section++)
6135     {
6136       char * name = SECTION_NAME (section);
6137
6138       if (section->sh_type == SHT_DYNSYM)
6139         {
6140           if (dynamic_symbols != NULL)
6141             {
6142               error (_("File contains multiple dynamic symbol tables\n"));
6143               continue;
6144             }
6145
6146           CHECK_ENTSIZE (section, i, Sym);
6147           dynamic_symbols = GET_ELF_SYMBOLS (filedata, section, & num_dynamic_syms);
6148         }
6149       else if (section->sh_type == SHT_STRTAB
6150                && streq (name, ".dynstr"))
6151         {
6152           if (dynamic_strings != NULL)
6153             {
6154               error (_("File contains multiple dynamic string tables\n"));
6155               continue;
6156             }
6157
6158           dynamic_strings = (char *) get_data (NULL, filedata, section->sh_offset,
6159                                                1, section->sh_size,
6160                                                _("dynamic strings"));
6161           dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
6162         }
6163       else if (section->sh_type == SHT_SYMTAB_SHNDX)
6164         {
6165           elf_section_list * entry = xmalloc (sizeof * entry);
6166
6167           entry->hdr = section;
6168           entry->next = symtab_shndx_list;
6169           symtab_shndx_list = entry;
6170         }
6171       else if (section->sh_type == SHT_SYMTAB)
6172         CHECK_ENTSIZE (section, i, Sym);
6173       else if (section->sh_type == SHT_GROUP)
6174         CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
6175       else if (section->sh_type == SHT_REL)
6176         CHECK_ENTSIZE (section, i, Rel);
6177       else if (section->sh_type == SHT_RELA)
6178         CHECK_ENTSIZE (section, i, Rela);
6179       else if ((do_debugging || do_debug_info || do_debug_abbrevs
6180                 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
6181                 || do_debug_aranges || do_debug_frames || do_debug_macinfo
6182                 || do_debug_str || do_debug_loc || do_debug_ranges
6183                 || do_debug_addr || do_debug_cu_index || do_debug_links)
6184                && (const_strneq (name, ".debug_")
6185                    || const_strneq (name, ".zdebug_")))
6186         {
6187           if (name[1] == 'z')
6188             name += sizeof (".zdebug_") - 1;
6189           else
6190             name += sizeof (".debug_") - 1;
6191
6192           if (do_debugging
6193               || (do_debug_info     && const_strneq (name, "info"))
6194               || (do_debug_info     && const_strneq (name, "types"))
6195               || (do_debug_abbrevs  && const_strneq (name, "abbrev"))
6196               || (do_debug_lines    && strcmp (name, "line") == 0)
6197               || (do_debug_lines    && const_strneq (name, "line."))
6198               || (do_debug_pubnames && const_strneq (name, "pubnames"))
6199               || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
6200               || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
6201               || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
6202               || (do_debug_aranges  && const_strneq (name, "aranges"))
6203               || (do_debug_ranges   && const_strneq (name, "ranges"))
6204               || (do_debug_ranges   && const_strneq (name, "rnglists"))
6205               || (do_debug_frames   && const_strneq (name, "frame"))
6206               || (do_debug_macinfo  && const_strneq (name, "macinfo"))
6207               || (do_debug_macinfo  && const_strneq (name, "macro"))
6208               || (do_debug_str      && const_strneq (name, "str"))
6209               || (do_debug_loc      && const_strneq (name, "loc"))
6210               || (do_debug_loc      && const_strneq (name, "loclists"))
6211               || (do_debug_addr     && const_strneq (name, "addr"))
6212               || (do_debug_cu_index && const_strneq (name, "cu_index"))
6213               || (do_debug_cu_index && const_strneq (name, "tu_index"))
6214               )
6215             request_dump_bynumber (filedata, i, DEBUG_DUMP);
6216         }
6217       /* Linkonce section to be combined with .debug_info at link time.  */
6218       else if ((do_debugging || do_debug_info)
6219                && const_strneq (name, ".gnu.linkonce.wi."))
6220         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6221       else if (do_debug_frames && streq (name, ".eh_frame"))
6222         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6223       else if (do_gdb_index && (streq (name, ".gdb_index")
6224                                 || streq (name, ".debug_names")))
6225         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6226       /* Trace sections for Itanium VMS.  */
6227       else if ((do_debugging || do_trace_info || do_trace_abbrevs
6228                 || do_trace_aranges)
6229                && const_strneq (name, ".trace_"))
6230         {
6231           name += sizeof (".trace_") - 1;
6232
6233           if (do_debugging
6234               || (do_trace_info     && streq (name, "info"))
6235               || (do_trace_abbrevs  && streq (name, "abbrev"))
6236               || (do_trace_aranges  && streq (name, "aranges"))
6237               )
6238             request_dump_bynumber (filedata, i, DEBUG_DUMP);
6239         }
6240       else if ((do_debugging || do_debug_links)
6241                && (const_strneq (name, ".gnu_debuglink")
6242                    || const_strneq (name, ".gnu_debugaltlink")))
6243         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6244     }
6245
6246   if (! do_sections)
6247     return TRUE;
6248
6249   if (filedata->file_header.e_shnum > 1)
6250     printf (_("\nSection Headers:\n"));
6251   else
6252     printf (_("\nSection Header:\n"));
6253
6254   if (is_32bit_elf)
6255     {
6256       if (do_section_details)
6257         {
6258           printf (_("  [Nr] Name\n"));
6259           printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
6260         }
6261       else
6262         printf
6263           (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
6264     }
6265   else if (do_wide)
6266     {
6267       if (do_section_details)
6268         {
6269           printf (_("  [Nr] Name\n"));
6270           printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
6271         }
6272       else
6273         printf
6274           (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
6275     }
6276   else
6277     {
6278       if (do_section_details)
6279         {
6280           printf (_("  [Nr] Name\n"));
6281           printf (_("       Type              Address          Offset            Link\n"));
6282           printf (_("       Size              EntSize          Info              Align\n"));
6283         }
6284       else
6285         {
6286           printf (_("  [Nr] Name              Type             Address           Offset\n"));
6287           printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
6288         }
6289     }
6290
6291   if (do_section_details)
6292     printf (_("       Flags\n"));
6293
6294   for (i = 0, section = filedata->section_headers;
6295        i < filedata->file_header.e_shnum;
6296        i++, section++)
6297     {
6298       /* Run some sanity checks on the section header.  */
6299
6300       /* Check the sh_link field.  */
6301       switch (section->sh_type)
6302         {
6303         case SHT_REL:
6304         case SHT_RELA:
6305           if (section->sh_link == 0
6306               && (filedata->file_header.e_type == ET_EXEC
6307                   || filedata->file_header.e_type == ET_DYN))
6308             /* A dynamic relocation section where all entries use a
6309                zero symbol index need not specify a symtab section.  */
6310             break;
6311           /* Fall through.  */
6312         case SHT_SYMTAB_SHNDX:
6313         case SHT_GROUP:
6314         case SHT_HASH:
6315         case SHT_GNU_HASH:
6316         case SHT_GNU_versym:
6317           if (section->sh_link == 0
6318               || section->sh_link >= filedata->file_header.e_shnum
6319               || (filedata->section_headers[section->sh_link].sh_type != SHT_SYMTAB
6320                   && filedata->section_headers[section->sh_link].sh_type != SHT_DYNSYM))
6321             warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6322                   i, section->sh_link);
6323           break;
6324
6325         case SHT_DYNAMIC:
6326         case SHT_SYMTAB:
6327         case SHT_DYNSYM:
6328         case SHT_GNU_verneed:
6329         case SHT_GNU_verdef:
6330         case SHT_GNU_LIBLIST:
6331           if (section->sh_link == 0
6332               || section->sh_link >= filedata->file_header.e_shnum
6333               || filedata->section_headers[section->sh_link].sh_type != SHT_STRTAB)
6334             warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6335                   i, section->sh_link);
6336           break;
6337
6338         case SHT_INIT_ARRAY:
6339         case SHT_FINI_ARRAY:
6340         case SHT_PREINIT_ARRAY:
6341           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6342             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6343                   i, section->sh_link);
6344           break;
6345
6346         default:
6347           /* FIXME: Add support for target specific section types.  */
6348 #if 0     /* Currently we do not check other section types as there are too
6349              many special cases.  Stab sections for example have a type
6350              of SHT_PROGBITS but an sh_link field that links to the .stabstr
6351              section.  */
6352           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6353             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6354                   i, section->sh_link);
6355 #endif
6356           break;
6357         }
6358
6359       /* Check the sh_info field.  */
6360       switch (section->sh_type)
6361         {
6362         case SHT_REL:
6363         case SHT_RELA:
6364           if (section->sh_info == 0
6365               && (filedata->file_header.e_type == ET_EXEC
6366                   || filedata->file_header.e_type == ET_DYN))
6367             /* Dynamic relocations apply to segments, so they do not
6368                need to specify the section they relocate.  */
6369             break;
6370           if (section->sh_info == 0
6371               || section->sh_info >= filedata->file_header.e_shnum
6372               || (filedata->section_headers[section->sh_info].sh_type != SHT_PROGBITS
6373                   && filedata->section_headers[section->sh_info].sh_type != SHT_NOBITS
6374                   && filedata->section_headers[section->sh_info].sh_type != SHT_NOTE
6375                   && filedata->section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
6376                   && filedata->section_headers[section->sh_info].sh_type != SHT_FINI_ARRAY
6377                   && filedata->section_headers[section->sh_info].sh_type != SHT_PREINIT_ARRAY
6378                   /* FIXME: Are other section types valid ?  */
6379                   && filedata->section_headers[section->sh_info].sh_type < SHT_LOOS))
6380             warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6381                   i, section->sh_info);
6382           break;
6383
6384         case SHT_DYNAMIC:
6385         case SHT_HASH:
6386         case SHT_SYMTAB_SHNDX:
6387         case SHT_INIT_ARRAY:
6388         case SHT_FINI_ARRAY:
6389         case SHT_PREINIT_ARRAY:
6390           if (section->sh_info != 0)
6391             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6392                   i, section->sh_info);
6393           break;
6394
6395         case SHT_GROUP:
6396         case SHT_SYMTAB:
6397         case SHT_DYNSYM:
6398           /* A symbol index - we assume that it is valid.  */
6399           break;
6400
6401         default:
6402           /* FIXME: Add support for target specific section types.  */
6403           if (section->sh_type == SHT_NOBITS)
6404             /* NOBITS section headers with non-zero sh_info fields can be
6405                created when a binary is stripped of everything but its debug
6406                information.  The stripped sections have their headers
6407                preserved but their types set to SHT_NOBITS.  So do not check
6408                this type of section.  */
6409             ;
6410           else if (section->sh_flags & SHF_INFO_LINK)
6411             {
6412               if (section->sh_info < 1 || section->sh_info >= filedata->file_header.e_shnum)
6413                 warn (_("[%2u]: Expected link to another section in info field"), i);
6414             }
6415           else if (section->sh_type < SHT_LOOS
6416                    && (section->sh_flags & SHF_GNU_MBIND) == 0
6417                    && section->sh_info != 0)
6418             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6419                   i, section->sh_info);
6420           break;
6421         }
6422
6423       /* Check the sh_size field.  */
6424       if (section->sh_size > filedata->file_size
6425           && section->sh_type != SHT_NOBITS
6426           && section->sh_type != SHT_NULL
6427           && section->sh_type < SHT_LOOS)
6428         warn (_("Size of section %u is larger than the entire file!\n"), i);
6429
6430       printf ("  [%2u] ", i);
6431       if (do_section_details)
6432         printf ("%s\n      ", printable_section_name (filedata, section));
6433       else
6434         print_symbol (-17, SECTION_NAME (section));
6435
6436       printf (do_wide ? " %-15s " : " %-15.15s ",
6437               get_section_type_name (filedata, section->sh_type));
6438
6439       if (is_32bit_elf)
6440         {
6441           const char * link_too_big = NULL;
6442
6443           print_vma (section->sh_addr, LONG_HEX);
6444
6445           printf ( " %6.6lx %6.6lx %2.2lx",
6446                    (unsigned long) section->sh_offset,
6447                    (unsigned long) section->sh_size,
6448                    (unsigned long) section->sh_entsize);
6449
6450           if (do_section_details)
6451             fputs ("  ", stdout);
6452           else
6453             printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6454
6455           if (section->sh_link >= filedata->file_header.e_shnum)
6456             {
6457               link_too_big = "";
6458               /* The sh_link value is out of range.  Normally this indicates
6459                  an error but it can have special values in Solaris binaries.  */
6460               switch (filedata->file_header.e_machine)
6461                 {
6462                 case EM_386:
6463                 case EM_IAMCU:
6464                 case EM_X86_64:
6465                 case EM_L1OM:
6466                 case EM_K1OM:
6467                 case EM_OLD_SPARCV9:
6468                 case EM_SPARC32PLUS:
6469                 case EM_SPARCV9:
6470                 case EM_SPARC:
6471                   if (section->sh_link == (SHN_BEFORE & 0xffff))
6472                     link_too_big = "BEFORE";
6473                   else if (section->sh_link == (SHN_AFTER & 0xffff))
6474                     link_too_big = "AFTER";
6475                   break;
6476                 default:
6477                   break;
6478                 }
6479             }
6480
6481           if (do_section_details)
6482             {
6483               if (link_too_big != NULL && * link_too_big)
6484                 printf ("<%s> ", link_too_big);
6485               else
6486                 printf ("%2u ", section->sh_link);
6487               printf ("%3u %2lu\n", section->sh_info,
6488                       (unsigned long) section->sh_addralign);
6489             }
6490           else
6491             printf ("%2u %3u %2lu\n",
6492                     section->sh_link,
6493                     section->sh_info,
6494                     (unsigned long) section->sh_addralign);
6495
6496           if (link_too_big && ! * link_too_big)
6497             warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6498                   i, section->sh_link);
6499         }
6500       else if (do_wide)
6501         {
6502           print_vma (section->sh_addr, LONG_HEX);
6503
6504           if ((long) section->sh_offset == section->sh_offset)
6505             printf (" %6.6lx", (unsigned long) section->sh_offset);
6506           else
6507             {
6508               putchar (' ');
6509               print_vma (section->sh_offset, LONG_HEX);
6510             }
6511
6512           if ((unsigned long) section->sh_size == section->sh_size)
6513             printf (" %6.6lx", (unsigned long) section->sh_size);
6514           else
6515             {
6516               putchar (' ');
6517               print_vma (section->sh_size, LONG_HEX);
6518             }
6519
6520           if ((unsigned long) section->sh_entsize == section->sh_entsize)
6521             printf (" %2.2lx", (unsigned long) section->sh_entsize);
6522           else
6523             {
6524               putchar (' ');
6525               print_vma (section->sh_entsize, LONG_HEX);
6526             }
6527
6528           if (do_section_details)
6529             fputs ("  ", stdout);
6530           else
6531             printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6532
6533           printf ("%2u %3u ", section->sh_link, section->sh_info);
6534
6535           if ((unsigned long) section->sh_addralign == section->sh_addralign)
6536             printf ("%2lu\n", (unsigned long) section->sh_addralign);
6537           else
6538             {
6539               print_vma (section->sh_addralign, DEC);
6540               putchar ('\n');
6541             }
6542         }
6543       else if (do_section_details)
6544         {
6545           putchar (' ');
6546           print_vma (section->sh_addr, LONG_HEX);
6547           if ((long) section->sh_offset == section->sh_offset)
6548             printf ("  %16.16lx", (unsigned long) section->sh_offset);
6549           else
6550             {
6551               printf ("  ");
6552               print_vma (section->sh_offset, LONG_HEX);
6553             }
6554           printf ("  %u\n       ", section->sh_link);
6555           print_vma (section->sh_size, LONG_HEX);
6556           putchar (' ');
6557           print_vma (section->sh_entsize, LONG_HEX);
6558
6559           printf ("  %-16u  %lu\n",
6560                   section->sh_info,
6561                   (unsigned long) section->sh_addralign);
6562         }
6563       else
6564         {
6565           putchar (' ');
6566           print_vma (section->sh_addr, LONG_HEX);
6567           if ((long) section->sh_offset == section->sh_offset)
6568             printf ("  %8.8lx", (unsigned long) section->sh_offset);
6569           else
6570             {
6571               printf ("  ");
6572               print_vma (section->sh_offset, LONG_HEX);
6573             }
6574           printf ("\n       ");
6575           print_vma (section->sh_size, LONG_HEX);
6576           printf ("  ");
6577           print_vma (section->sh_entsize, LONG_HEX);
6578
6579           printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6580
6581           printf ("     %2u   %3u     %lu\n",
6582                   section->sh_link,
6583                   section->sh_info,
6584                   (unsigned long) section->sh_addralign);
6585         }
6586
6587       if (do_section_details)
6588         {
6589           printf ("       %s\n", get_elf_section_flags (filedata, section->sh_flags));
6590           if ((section->sh_flags & SHF_COMPRESSED) != 0)
6591             {
6592               /* Minimum section size is 12 bytes for 32-bit compression
6593                  header + 12 bytes for compressed data header.  */
6594               unsigned char buf[24];
6595
6596               assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6597               if (get_data (&buf, filedata, section->sh_offset, 1,
6598                             sizeof (buf), _("compression header")))
6599                 {
6600                   Elf_Internal_Chdr chdr;
6601
6602                   (void) get_compression_header (&chdr, buf, sizeof (buf));
6603
6604                   if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6605                     printf ("       ZLIB, ");
6606                   else
6607                     printf (_("       [<unknown>: 0x%x], "),
6608                             chdr.ch_type);
6609                   print_vma (chdr.ch_size, LONG_HEX);
6610                   printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6611                 }
6612             }
6613         }
6614     }
6615
6616   if (!do_section_details)
6617     {
6618       /* The ordering of the letters shown here matches the ordering of the
6619          corresponding SHF_xxx values, and hence the order in which these
6620          letters will be displayed to the user.  */
6621       printf (_("Key to Flags:\n\
6622   W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6623   L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6624   C (compressed), x (unknown), o (OS specific), E (exclude),\n  "));
6625       if (filedata->file_header.e_machine == EM_X86_64
6626           || filedata->file_header.e_machine == EM_L1OM
6627           || filedata->file_header.e_machine == EM_K1OM)
6628         printf (_("l (large), "));
6629       else if (filedata->file_header.e_machine == EM_ARM)
6630         printf (_("y (purecode), "));
6631       else if (filedata->file_header.e_machine == EM_PPC)
6632         printf (_("v (VLE), "));
6633       printf ("p (processor specific)\n");
6634     }
6635
6636   return TRUE;
6637 }
6638
6639 static const char *
6640 get_group_flags (unsigned int flags)
6641 {
6642   static char buff[128];
6643
6644   if (flags == 0)
6645     return "";
6646   else if (flags == GRP_COMDAT)
6647     return "COMDAT ";
6648
6649   snprintf (buff, 14, _("[0x%x: "), flags);
6650
6651   flags &= ~ GRP_COMDAT;
6652   if (flags & GRP_MASKOS)
6653     {
6654       strcat (buff, "<OS specific>");
6655       flags &= ~ GRP_MASKOS;
6656     }
6657
6658   if (flags & GRP_MASKPROC)
6659     {
6660       strcat (buff, "<PROC specific>");
6661       flags &= ~ GRP_MASKPROC;
6662     }
6663
6664   if (flags)
6665     strcat (buff, "<unknown>");
6666
6667   strcat (buff, "]");
6668   return buff;
6669 }
6670
6671 static bfd_boolean
6672 process_section_groups (Filedata * filedata)
6673 {
6674   Elf_Internal_Shdr * section;
6675   unsigned int i;
6676   struct group * group;
6677   Elf_Internal_Shdr * symtab_sec;
6678   Elf_Internal_Shdr * strtab_sec;
6679   Elf_Internal_Sym * symtab;
6680   unsigned long num_syms;
6681   char * strtab;
6682   size_t strtab_size;
6683
6684   /* Don't process section groups unless needed.  */
6685   if (!do_unwind && !do_section_groups)
6686     return TRUE;
6687
6688   if (filedata->file_header.e_shnum == 0)
6689     {
6690       if (do_section_groups)
6691         printf (_("\nThere are no sections to group in this file.\n"));
6692
6693       return TRUE;
6694     }
6695
6696   if (filedata->section_headers == NULL)
6697     {
6698       error (_("Section headers are not available!\n"));
6699       /* PR 13622: This can happen with a corrupt ELF header.  */
6700       return FALSE;
6701     }
6702
6703   section_headers_groups = (struct group **) calloc (filedata->file_header.e_shnum,
6704                                                      sizeof (struct group *));
6705
6706   if (section_headers_groups == NULL)
6707     {
6708       error (_("Out of memory reading %u section group headers\n"),
6709              filedata->file_header.e_shnum);
6710       return FALSE;
6711     }
6712
6713   /* Scan the sections for the group section.  */
6714   group_count = 0;
6715   for (i = 0, section = filedata->section_headers;
6716        i < filedata->file_header.e_shnum;
6717        i++, section++)
6718     if (section->sh_type == SHT_GROUP)
6719       group_count++;
6720
6721   if (group_count == 0)
6722     {
6723       if (do_section_groups)
6724         printf (_("\nThere are no section groups in this file.\n"));
6725
6726       return TRUE;
6727     }
6728
6729   section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6730
6731   if (section_groups == NULL)
6732     {
6733       error (_("Out of memory reading %lu groups\n"),
6734              (unsigned long) group_count);
6735       return FALSE;
6736     }
6737
6738   symtab_sec = NULL;
6739   strtab_sec = NULL;
6740   symtab = NULL;
6741   num_syms = 0;
6742   strtab = NULL;
6743   strtab_size = 0;
6744   for (i = 0, section = filedata->section_headers, group = section_groups;
6745        i < filedata->file_header.e_shnum;
6746        i++, section++)
6747     {
6748       if (section->sh_type == SHT_GROUP)
6749         {
6750           const char * name = printable_section_name (filedata, section);
6751           const char * group_name;
6752           unsigned char * start;
6753           unsigned char * indices;
6754           unsigned int entry, j, size;
6755           Elf_Internal_Shdr * sec;
6756           Elf_Internal_Sym * sym;
6757
6758           /* Get the symbol table.  */
6759           if (section->sh_link >= filedata->file_header.e_shnum
6760               || ((sec = filedata->section_headers + section->sh_link)->sh_type
6761                   != SHT_SYMTAB))
6762             {
6763               error (_("Bad sh_link in group section `%s'\n"), name);
6764               continue;
6765             }
6766
6767           if (symtab_sec != sec)
6768             {
6769               symtab_sec = sec;
6770               if (symtab)
6771                 free (symtab);
6772               symtab = GET_ELF_SYMBOLS (filedata, symtab_sec, & num_syms);
6773             }
6774
6775           if (symtab == NULL)
6776             {
6777               error (_("Corrupt header in group section `%s'\n"), name);
6778               continue;
6779             }
6780
6781           if (section->sh_info >= num_syms)
6782             {
6783               error (_("Bad sh_info in group section `%s'\n"), name);
6784               continue;
6785             }
6786
6787           sym = symtab + section->sh_info;
6788
6789           if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6790             {
6791               if (sym->st_shndx == 0
6792                   || sym->st_shndx >= filedata->file_header.e_shnum)
6793                 {
6794                   error (_("Bad sh_info in group section `%s'\n"), name);
6795                   continue;
6796                 }
6797
6798               group_name = SECTION_NAME (filedata->section_headers + sym->st_shndx);
6799               strtab_sec = NULL;
6800               if (strtab)
6801                 free (strtab);
6802               strtab = NULL;
6803               strtab_size = 0;
6804             }
6805           else
6806             {
6807               /* Get the string table.  */
6808               if (symtab_sec->sh_link >= filedata->file_header.e_shnum)
6809                 {
6810                   strtab_sec = NULL;
6811                   if (strtab)
6812                     free (strtab);
6813                   strtab = NULL;
6814                   strtab_size = 0;
6815                 }
6816               else if (strtab_sec
6817                        != (sec = filedata->section_headers + symtab_sec->sh_link))
6818                 {
6819                   strtab_sec = sec;
6820                   if (strtab)
6821                     free (strtab);
6822
6823                   strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
6824                                               1, strtab_sec->sh_size,
6825                                               _("string table"));
6826                   strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6827                 }
6828               group_name = sym->st_name < strtab_size
6829                 ? strtab + sym->st_name : _("<corrupt>");
6830             }
6831
6832           /* PR 17531: file: loop.  */
6833           if (section->sh_entsize > section->sh_size)
6834             {
6835               error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6836                      printable_section_name (filedata, section),
6837                      (unsigned long) section->sh_entsize,
6838                      (unsigned long) section->sh_size);
6839               break;
6840             }
6841
6842           start = (unsigned char *) get_data (NULL, filedata, section->sh_offset,
6843                                               1, section->sh_size,
6844                                               _("section data"));
6845           if (start == NULL)
6846             continue;
6847
6848           indices = start;
6849           size = (section->sh_size / section->sh_entsize) - 1;
6850           entry = byte_get (indices, 4);
6851           indices += 4;
6852
6853           if (do_section_groups)
6854             {
6855               printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6856                       get_group_flags (entry), i, name, group_name, size);
6857
6858               printf (_("   [Index]    Name\n"));
6859             }
6860
6861           group->group_index = i;
6862
6863           for (j = 0; j < size; j++)
6864             {
6865               struct group_list * g;
6866
6867               entry = byte_get (indices, 4);
6868               indices += 4;
6869
6870               if (entry >= filedata->file_header.e_shnum)
6871                 {
6872                   static unsigned num_group_errors = 0;
6873
6874                   if (num_group_errors ++ < 10)
6875                     {
6876                       error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6877                              entry, i, filedata->file_header.e_shnum - 1);
6878                       if (num_group_errors == 10)
6879                         warn (_("Further error messages about overlarge group section indices suppressed\n"));
6880                     }
6881                   continue;
6882                 }
6883
6884               if (section_headers_groups [entry] != NULL)
6885                 {
6886                   if (entry)
6887                     {
6888                       static unsigned num_errs = 0;
6889
6890                       if (num_errs ++ < 10)
6891                         {
6892                           error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6893                                  entry, i,
6894                                  section_headers_groups [entry]->group_index);
6895                           if (num_errs == 10)
6896                             warn (_("Further error messages about already contained group sections suppressed\n"));
6897                         }
6898                       continue;
6899                     }
6900                   else
6901                     {
6902                       /* Intel C/C++ compiler may put section 0 in a
6903                          section group.  We just warn it the first time
6904                          and ignore it afterwards.  */
6905                       static bfd_boolean warned = FALSE;
6906                       if (!warned)
6907                         {
6908                           error (_("section 0 in group section [%5u]\n"),
6909                                  section_headers_groups [entry]->group_index);
6910                           warned = TRUE;
6911                         }
6912                     }
6913                 }
6914
6915               section_headers_groups [entry] = group;
6916
6917               if (do_section_groups)
6918                 {
6919                   sec = filedata->section_headers + entry;
6920                   printf ("   [%5u]   %s\n", entry, printable_section_name (filedata, sec));
6921                 }
6922
6923               g = (struct group_list *) xmalloc (sizeof (struct group_list));
6924               g->section_index = entry;
6925               g->next = group->root;
6926               group->root = g;
6927             }
6928
6929           if (start)
6930             free (start);
6931
6932           group++;
6933         }
6934     }
6935
6936   if (symtab)
6937     free (symtab);
6938   if (strtab)
6939     free (strtab);
6940   return TRUE;
6941 }
6942
6943 /* Data used to display dynamic fixups.  */
6944
6945 struct ia64_vms_dynfixup
6946 {
6947   bfd_vma needed_ident;         /* Library ident number.  */
6948   bfd_vma needed;               /* Index in the dstrtab of the library name.  */
6949   bfd_vma fixup_needed;         /* Index of the library.  */
6950   bfd_vma fixup_rela_cnt;       /* Number of fixups.  */
6951   bfd_vma fixup_rela_off;       /* Fixups offset in the dynamic segment.  */
6952 };
6953
6954 /* Data used to display dynamic relocations.  */
6955
6956 struct ia64_vms_dynimgrela
6957 {
6958   bfd_vma img_rela_cnt;         /* Number of relocations.  */
6959   bfd_vma img_rela_off;         /* Reloc offset in the dynamic segment.  */
6960 };
6961
6962 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6963    library).  */
6964
6965 static bfd_boolean
6966 dump_ia64_vms_dynamic_fixups (Filedata *                  filedata,
6967                               struct ia64_vms_dynfixup *  fixup,
6968                               const char *                strtab,
6969                               unsigned int                strtab_sz)
6970 {
6971   Elf64_External_VMS_IMAGE_FIXUP * imfs;
6972   long i;
6973   const char * lib_name;
6974
6975   imfs = get_data (NULL, filedata, dynamic_addr + fixup->fixup_rela_off,
6976                    1, fixup->fixup_rela_cnt * sizeof (*imfs),
6977                    _("dynamic section image fixups"));
6978   if (!imfs)
6979     return FALSE;
6980
6981   if (fixup->needed < strtab_sz)
6982     lib_name = strtab + fixup->needed;
6983   else
6984     {
6985       warn (_("corrupt library name index of 0x%lx found in dynamic entry"),
6986             (unsigned long) fixup->needed);
6987       lib_name = "???";
6988     }
6989   printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6990           (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6991   printf
6992     (_("Seg Offset           Type                             SymVec DataType\n"));
6993
6994   for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6995     {
6996       unsigned int type;
6997       const char *rtype;
6998
6999       printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
7000       printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
7001       type = BYTE_GET (imfs [i].type);
7002       rtype = elf_ia64_reloc_type (type);
7003       if (rtype == NULL)
7004         printf (" 0x%08x                       ", type);
7005       else
7006         printf (" %-32s ", rtype);
7007       printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
7008       printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
7009     }
7010
7011   free (imfs);
7012   return TRUE;
7013 }
7014
7015 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
7016
7017 static bfd_boolean
7018 dump_ia64_vms_dynamic_relocs (Filedata * filedata, struct ia64_vms_dynimgrela *imgrela)
7019 {
7020   Elf64_External_VMS_IMAGE_RELA *imrs;
7021   long i;
7022
7023   imrs = get_data (NULL, filedata, dynamic_addr + imgrela->img_rela_off,
7024                    1, imgrela->img_rela_cnt * sizeof (*imrs),
7025                    _("dynamic section image relocations"));
7026   if (!imrs)
7027     return FALSE;
7028
7029   printf (_("\nImage relocs\n"));
7030   printf
7031     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
7032
7033   for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
7034     {
7035       unsigned int type;
7036       const char *rtype;
7037
7038       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
7039       printf ("%08" BFD_VMA_FMT "x ",
7040               (bfd_vma) BYTE_GET (imrs [i].rela_offset));
7041       type = BYTE_GET (imrs [i].type);
7042       rtype = elf_ia64_reloc_type (type);
7043       if (rtype == NULL)
7044         printf ("0x%08x                      ", type);
7045       else
7046         printf ("%-31s ", rtype);
7047       print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
7048       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
7049       printf ("%08" BFD_VMA_FMT "x\n",
7050               (bfd_vma) BYTE_GET (imrs [i].sym_offset));
7051     }
7052
7053   free (imrs);
7054   return TRUE;
7055 }
7056
7057 /* Display IA-64 OpenVMS dynamic relocations and fixups.  */
7058
7059 static bfd_boolean
7060 process_ia64_vms_dynamic_relocs (Filedata * filedata)
7061 {
7062   struct ia64_vms_dynfixup fixup;
7063   struct ia64_vms_dynimgrela imgrela;
7064   Elf_Internal_Dyn *entry;
7065   bfd_vma strtab_off = 0;
7066   bfd_vma strtab_sz = 0;
7067   char *strtab = NULL;
7068   bfd_boolean res = TRUE;
7069
7070   memset (&fixup, 0, sizeof (fixup));
7071   memset (&imgrela, 0, sizeof (imgrela));
7072
7073   /* Note: the order of the entries is specified by the OpenVMS specs.  */
7074   for (entry = dynamic_section;
7075        entry < dynamic_section + dynamic_nent;
7076        entry++)
7077     {
7078       switch (entry->d_tag)
7079         {
7080         case DT_IA_64_VMS_STRTAB_OFFSET:
7081           strtab_off = entry->d_un.d_val;
7082           break;
7083         case DT_STRSZ:
7084           strtab_sz = entry->d_un.d_val;
7085           if (strtab == NULL)
7086             strtab = get_data (NULL, filedata, dynamic_addr + strtab_off,
7087                                1, strtab_sz, _("dynamic string section"));
7088           break;
7089
7090         case DT_IA_64_VMS_NEEDED_IDENT:
7091           fixup.needed_ident = entry->d_un.d_val;
7092           break;
7093         case DT_NEEDED:
7094           fixup.needed = entry->d_un.d_val;
7095           break;
7096         case DT_IA_64_VMS_FIXUP_NEEDED:
7097           fixup.fixup_needed = entry->d_un.d_val;
7098           break;
7099         case DT_IA_64_VMS_FIXUP_RELA_CNT:
7100           fixup.fixup_rela_cnt = entry->d_un.d_val;
7101           break;
7102         case DT_IA_64_VMS_FIXUP_RELA_OFF:
7103           fixup.fixup_rela_off = entry->d_un.d_val;
7104           if (! dump_ia64_vms_dynamic_fixups (filedata, &fixup, strtab, strtab_sz))
7105             res = FALSE;
7106           break;
7107         case DT_IA_64_VMS_IMG_RELA_CNT:
7108           imgrela.img_rela_cnt = entry->d_un.d_val;
7109           break;
7110         case DT_IA_64_VMS_IMG_RELA_OFF:
7111           imgrela.img_rela_off = entry->d_un.d_val;
7112           if (! dump_ia64_vms_dynamic_relocs (filedata, &imgrela))
7113             res = FALSE;
7114           break;
7115
7116         default:
7117           break;
7118         }
7119     }
7120
7121   if (strtab != NULL)
7122     free (strtab);
7123
7124   return res;
7125 }
7126
7127 static struct
7128 {
7129   const char * name;
7130   int reloc;
7131   int size;
7132   int rela;
7133 }
7134   dynamic_relocations [] =
7135 {
7136   { "REL", DT_REL, DT_RELSZ, FALSE },
7137   { "RELA", DT_RELA, DT_RELASZ, TRUE },
7138   { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
7139 };
7140
7141 /* Process the reloc section.  */
7142
7143 static bfd_boolean
7144 process_relocs (Filedata * filedata)
7145 {
7146   unsigned long rel_size;
7147   unsigned long rel_offset;
7148
7149   if (!do_reloc)
7150     return TRUE;
7151
7152   if (do_using_dynamic)
7153     {
7154       int          is_rela;
7155       const char * name;
7156       bfd_boolean  has_dynamic_reloc;
7157       unsigned int i;
7158
7159       has_dynamic_reloc = FALSE;
7160
7161       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7162         {
7163           is_rela = dynamic_relocations [i].rela;
7164           name = dynamic_relocations [i].name;
7165           rel_size = dynamic_info [dynamic_relocations [i].size];
7166           rel_offset = dynamic_info [dynamic_relocations [i].reloc];
7167
7168           if (rel_size)
7169             has_dynamic_reloc = TRUE;
7170
7171           if (is_rela == UNKNOWN)
7172             {
7173               if (dynamic_relocations [i].reloc == DT_JMPREL)
7174                 switch (dynamic_info[DT_PLTREL])
7175                   {
7176                   case DT_REL:
7177                     is_rela = FALSE;
7178                     break;
7179                   case DT_RELA:
7180                     is_rela = TRUE;
7181                     break;
7182                   }
7183             }
7184
7185           if (rel_size)
7186             {
7187               printf
7188                 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
7189                  name, rel_offset, rel_size);
7190
7191               dump_relocations (filedata,
7192                                 offset_from_vma (filedata, rel_offset, rel_size),
7193                                 rel_size,
7194                                 dynamic_symbols, num_dynamic_syms,
7195                                 dynamic_strings, dynamic_strings_length,
7196                                 is_rela, TRUE /* is_dynamic */);
7197             }
7198         }
7199
7200       if (is_ia64_vms (filedata))
7201         if (process_ia64_vms_dynamic_relocs (filedata))
7202           has_dynamic_reloc = TRUE;
7203
7204       if (! has_dynamic_reloc)
7205         printf (_("\nThere are no dynamic relocations in this file.\n"));
7206     }
7207   else
7208     {
7209       Elf_Internal_Shdr * section;
7210       unsigned long i;
7211       bfd_boolean found = FALSE;
7212
7213       for (i = 0, section = filedata->section_headers;
7214            i < filedata->file_header.e_shnum;
7215            i++, section++)
7216         {
7217           if (   section->sh_type != SHT_RELA
7218               && section->sh_type != SHT_REL)
7219             continue;
7220
7221           rel_offset = section->sh_offset;
7222           rel_size   = section->sh_size;
7223
7224           if (rel_size)
7225             {
7226               Elf_Internal_Shdr * strsec;
7227               int is_rela;
7228               unsigned long num_rela;
7229
7230               printf (_("\nRelocation section "));
7231
7232               if (filedata->string_table == NULL)
7233                 printf ("%d", section->sh_name);
7234               else
7235                 printf ("'%s'", printable_section_name (filedata, section));
7236
7237               num_rela = rel_size / section->sh_entsize;
7238               printf (ngettext (" at offset 0x%lx contains %lu entry:\n",
7239                                 " at offset 0x%lx contains %lu entries:\n",
7240                                 num_rela),
7241                       rel_offset, num_rela);
7242
7243               is_rela = section->sh_type == SHT_RELA;
7244
7245               if (section->sh_link != 0
7246                   && section->sh_link < filedata->file_header.e_shnum)
7247                 {
7248                   Elf_Internal_Shdr * symsec;
7249                   Elf_Internal_Sym *  symtab;
7250                   unsigned long nsyms;
7251                   unsigned long strtablen = 0;
7252                   char * strtab = NULL;
7253
7254                   symsec = filedata->section_headers + section->sh_link;
7255                   if (symsec->sh_type != SHT_SYMTAB
7256                       && symsec->sh_type != SHT_DYNSYM)
7257                     continue;
7258
7259                   symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
7260
7261                   if (symtab == NULL)
7262                     continue;
7263
7264                   if (symsec->sh_link != 0
7265                       && symsec->sh_link < filedata->file_header.e_shnum)
7266                     {
7267                       strsec = filedata->section_headers + symsec->sh_link;
7268
7269                       strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7270                                                   1, strsec->sh_size,
7271                                                   _("string table"));
7272                       strtablen = strtab == NULL ? 0 : strsec->sh_size;
7273                     }
7274
7275                   dump_relocations (filedata, rel_offset, rel_size,
7276                                     symtab, nsyms, strtab, strtablen,
7277                                     is_rela,
7278                                     symsec->sh_type == SHT_DYNSYM);
7279                   if (strtab)
7280                     free (strtab);
7281                   free (symtab);
7282                 }
7283               else
7284                 dump_relocations (filedata, rel_offset, rel_size,
7285                                   NULL, 0, NULL, 0, is_rela,
7286                                   FALSE /* is_dynamic */);
7287
7288               found = TRUE;
7289             }
7290         }
7291
7292       if (! found)
7293         {
7294           /* Users sometimes forget the -D option, so try to be helpful.  */
7295           for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7296             {
7297               if (dynamic_info [dynamic_relocations [i].size])
7298                 {
7299                   printf (_("\nThere are no static relocations in this file."));
7300                   printf (_("\nTo see the dynamic relocations add --use-dynamic to the command line.\n"));
7301
7302                   break;
7303                 }
7304             }
7305           if (i == ARRAY_SIZE (dynamic_relocations))
7306             printf (_("\nThere are no relocations in this file.\n"));
7307         }
7308     }
7309
7310   return TRUE;
7311 }
7312
7313 /* An absolute address consists of a section and an offset.  If the
7314    section is NULL, the offset itself is the address, otherwise, the
7315    address equals to LOAD_ADDRESS(section) + offset.  */
7316
7317 struct absaddr
7318 {
7319   unsigned short section;
7320   bfd_vma offset;
7321 };
7322
7323 #define ABSADDR(a) \
7324   ((a).section \
7325    ? filedata->section_headers [(a).section].sh_addr + (a).offset \
7326    : (a).offset)
7327
7328 /* Find the nearest symbol at or below ADDR.  Returns the symbol
7329    name, if found, and the offset from the symbol to ADDR.  */
7330
7331 static void
7332 find_symbol_for_address (Filedata *          filedata,
7333                          Elf_Internal_Sym *  symtab,
7334                          unsigned long       nsyms,
7335                          const char *        strtab,
7336                          unsigned long       strtab_size,
7337                          struct absaddr      addr,
7338                          const char **       symname,
7339                          bfd_vma *           offset)
7340 {
7341   bfd_vma dist = 0x100000;
7342   Elf_Internal_Sym * sym;
7343   Elf_Internal_Sym * beg;
7344   Elf_Internal_Sym * end;
7345   Elf_Internal_Sym * best = NULL;
7346
7347   REMOVE_ARCH_BITS (addr.offset);
7348   beg = symtab;
7349   end = symtab + nsyms;
7350
7351   while (beg < end)
7352     {
7353       bfd_vma value;
7354
7355       sym = beg + (end - beg) / 2;
7356
7357       value = sym->st_value;
7358       REMOVE_ARCH_BITS (value);
7359
7360       if (sym->st_name != 0
7361           && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
7362           && addr.offset >= value
7363           && addr.offset - value < dist)
7364         {
7365           best = sym;
7366           dist = addr.offset - value;
7367           if (!dist)
7368             break;
7369         }
7370
7371       if (addr.offset < value)
7372         end = sym;
7373       else
7374         beg = sym + 1;
7375     }
7376
7377   if (best)
7378     {
7379       *symname = (best->st_name >= strtab_size
7380                   ? _("<corrupt>") : strtab + best->st_name);
7381       *offset = dist;
7382       return;
7383     }
7384
7385   *symname = NULL;
7386   *offset = addr.offset;
7387 }
7388
7389 static /* signed */ int
7390 symcmp (const void *p, const void *q)
7391 {
7392   Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7393   Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7394
7395   return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7396 }
7397
7398 /* Process the unwind section.  */
7399
7400 #include "unwind-ia64.h"
7401
7402 struct ia64_unw_table_entry
7403 {
7404   struct absaddr start;
7405   struct absaddr end;
7406   struct absaddr info;
7407 };
7408
7409 struct ia64_unw_aux_info
7410 {
7411   struct ia64_unw_table_entry * table;          /* Unwind table.  */
7412   unsigned long                 table_len;      /* Length of unwind table.  */
7413   unsigned char *               info;           /* Unwind info.  */
7414   unsigned long                 info_size;      /* Size of unwind info.  */
7415   bfd_vma                       info_addr;      /* Starting address of unwind info.  */
7416   bfd_vma                       seg_base;       /* Starting address of segment.  */
7417   Elf_Internal_Sym *            symtab;         /* The symbol table.  */
7418   unsigned long                 nsyms;          /* Number of symbols.  */
7419   Elf_Internal_Sym *            funtab;         /* Sorted table of STT_FUNC symbols.  */
7420   unsigned long                 nfuns;          /* Number of entries in funtab.  */
7421   char *                        strtab;         /* The string table.  */
7422   unsigned long                 strtab_size;    /* Size of string table.  */
7423 };
7424
7425 static bfd_boolean
7426 dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
7427 {
7428   struct ia64_unw_table_entry * tp;
7429   unsigned long j, nfuns;
7430   int in_body;
7431   bfd_boolean res = TRUE;
7432
7433   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7434   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7435     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7436       aux->funtab[nfuns++] = aux->symtab[j];
7437   aux->nfuns = nfuns;
7438   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7439
7440   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7441     {
7442       bfd_vma stamp;
7443       bfd_vma offset;
7444       const unsigned char * dp;
7445       const unsigned char * head;
7446       const unsigned char * end;
7447       const char * procname;
7448
7449       find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7450                                aux->strtab_size, tp->start, &procname, &offset);
7451
7452       fputs ("\n<", stdout);
7453
7454       if (procname)
7455         {
7456           fputs (procname, stdout);
7457
7458           if (offset)
7459             printf ("+%lx", (unsigned long) offset);
7460         }
7461
7462       fputs (">: [", stdout);
7463       print_vma (tp->start.offset, PREFIX_HEX);
7464       fputc ('-', stdout);
7465       print_vma (tp->end.offset, PREFIX_HEX);
7466       printf ("], info at +0x%lx\n",
7467               (unsigned long) (tp->info.offset - aux->seg_base));
7468
7469       /* PR 17531: file: 86232b32.  */
7470       if (aux->info == NULL)
7471         continue;
7472
7473       /* PR 17531: file: 0997b4d1.  */
7474       if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7475         {
7476           warn (_("Invalid offset %lx in table entry %ld\n"),
7477                 (long) tp->info.offset, (long) (tp - aux->table));
7478           res = FALSE;
7479           continue;
7480         }
7481
7482       head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
7483       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7484
7485       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7486               (unsigned) UNW_VER (stamp),
7487               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7488               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7489               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7490               (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7491
7492       if (UNW_VER (stamp) != 1)
7493         {
7494           printf (_("\tUnknown version.\n"));
7495           continue;
7496         }
7497
7498       in_body = 0;
7499       end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7500       /* PR 17531: file: 16ceda89.  */
7501       if (end > aux->info + aux->info_size)
7502         end = aux->info + aux->info_size;
7503       for (dp = head + 8; dp < end;)
7504         dp = unw_decode (dp, in_body, & in_body, end);
7505     }
7506
7507   free (aux->funtab);
7508
7509   return res;
7510 }
7511
7512 static bfd_boolean
7513 slurp_ia64_unwind_table (Filedata *                  filedata,
7514                          struct ia64_unw_aux_info *  aux,
7515                          Elf_Internal_Shdr *         sec)
7516 {
7517   unsigned long size, nrelas, i;
7518   Elf_Internal_Phdr * seg;
7519   struct ia64_unw_table_entry * tep;
7520   Elf_Internal_Shdr * relsec;
7521   Elf_Internal_Rela * rela;
7522   Elf_Internal_Rela * rp;
7523   unsigned char * table;
7524   unsigned char * tp;
7525   Elf_Internal_Sym * sym;
7526   const char * relname;
7527
7528   aux->table_len = 0;
7529
7530   /* First, find the starting address of the segment that includes
7531      this section: */
7532
7533   if (filedata->file_header.e_phnum)
7534     {
7535       if (! get_program_headers (filedata))
7536           return FALSE;
7537
7538       for (seg = filedata->program_headers;
7539            seg < filedata->program_headers + filedata->file_header.e_phnum;
7540            ++seg)
7541         {
7542           if (seg->p_type != PT_LOAD)
7543             continue;
7544
7545           if (sec->sh_addr >= seg->p_vaddr
7546               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7547             {
7548               aux->seg_base = seg->p_vaddr;
7549               break;
7550             }
7551         }
7552     }
7553
7554   /* Second, build the unwind table from the contents of the unwind section:  */
7555   size = sec->sh_size;
7556   table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7557                                       _("unwind table"));
7558   if (!table)
7559     return FALSE;
7560
7561   aux->table_len = size / (3 * eh_addr_size);
7562   aux->table = (struct ia64_unw_table_entry *)
7563     xcmalloc (aux->table_len, sizeof (aux->table[0]));
7564   tep = aux->table;
7565
7566   for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7567     {
7568       tep->start.section = SHN_UNDEF;
7569       tep->end.section   = SHN_UNDEF;
7570       tep->info.section  = SHN_UNDEF;
7571       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7572       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7573       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7574       tep->start.offset += aux->seg_base;
7575       tep->end.offset   += aux->seg_base;
7576       tep->info.offset  += aux->seg_base;
7577     }
7578   free (table);
7579
7580   /* Third, apply any relocations to the unwind table:  */
7581   for (relsec = filedata->section_headers;
7582        relsec < filedata->section_headers + filedata->file_header.e_shnum;
7583        ++relsec)
7584     {
7585       if (relsec->sh_type != SHT_RELA
7586           || relsec->sh_info >= filedata->file_header.e_shnum
7587           || filedata->section_headers + relsec->sh_info != sec)
7588         continue;
7589
7590       if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
7591                               & rela, & nrelas))
7592         {
7593           free (aux->table);
7594           aux->table = NULL;
7595           aux->table_len = 0;
7596           return FALSE;
7597         }
7598
7599       for (rp = rela; rp < rela + nrelas; ++rp)
7600         {
7601           unsigned int sym_ndx;
7602           unsigned int r_type = get_reloc_type (filedata, rp->r_info);
7603           relname = elf_ia64_reloc_type (r_type);
7604
7605           /* PR 17531: file: 9fa67536.  */
7606           if (relname == NULL)
7607             {
7608               warn (_("Skipping unknown relocation type: %u\n"), r_type);
7609               continue;
7610             }
7611
7612           if (! const_strneq (relname, "R_IA64_SEGREL"))
7613             {
7614               warn (_("Skipping unexpected relocation type: %s\n"), relname);
7615               continue;
7616             }
7617
7618           i = rp->r_offset / (3 * eh_addr_size);
7619
7620           /* PR 17531: file: 5bc8d9bf.  */
7621           if (i >= aux->table_len)
7622             {
7623               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7624               continue;
7625             }
7626
7627           sym_ndx = get_reloc_symindex (rp->r_info);
7628           if (sym_ndx >= aux->nsyms)
7629             {
7630               warn (_("Skipping reloc with invalid symbol index: %u\n"),
7631                     sym_ndx);
7632               continue;
7633             }
7634           sym = aux->symtab + sym_ndx;
7635
7636           switch (rp->r_offset / eh_addr_size % 3)
7637             {
7638             case 0:
7639               aux->table[i].start.section = sym->st_shndx;
7640               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
7641               break;
7642             case 1:
7643               aux->table[i].end.section   = sym->st_shndx;
7644               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
7645               break;
7646             case 2:
7647               aux->table[i].info.section  = sym->st_shndx;
7648               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
7649               break;
7650             default:
7651               break;
7652             }
7653         }
7654
7655       free (rela);
7656     }
7657
7658   return TRUE;
7659 }
7660
7661 static bfd_boolean
7662 ia64_process_unwind (Filedata * filedata)
7663 {
7664   Elf_Internal_Shdr * sec;
7665   Elf_Internal_Shdr * unwsec = NULL;
7666   Elf_Internal_Shdr * strsec;
7667   unsigned long i, unwcount = 0, unwstart = 0;
7668   struct ia64_unw_aux_info aux;
7669   bfd_boolean res = TRUE;
7670
7671   memset (& aux, 0, sizeof (aux));
7672
7673   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
7674     {
7675       if (sec->sh_type == SHT_SYMTAB
7676           && sec->sh_link < filedata->file_header.e_shnum)
7677         {
7678           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
7679
7680           strsec = filedata->section_headers + sec->sh_link;
7681           if (aux.strtab != NULL)
7682             {
7683               error (_("Multiple auxillary string tables encountered\n"));
7684               free (aux.strtab);
7685               res = FALSE;
7686             }
7687           aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7688                                           1, strsec->sh_size,
7689                                           _("string table"));
7690           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7691         }
7692       else if (sec->sh_type == SHT_IA_64_UNWIND)
7693         unwcount++;
7694     }
7695
7696   if (!unwcount)
7697     printf (_("\nThere are no unwind sections in this file.\n"));
7698
7699   while (unwcount-- > 0)
7700     {
7701       char * suffix;
7702       size_t len, len2;
7703
7704       for (i = unwstart, sec = filedata->section_headers + unwstart, unwsec = NULL;
7705            i < filedata->file_header.e_shnum; ++i, ++sec)
7706         if (sec->sh_type == SHT_IA_64_UNWIND)
7707           {
7708             unwsec = sec;
7709             break;
7710           }
7711       /* We have already counted the number of SHT_IA64_UNWIND
7712          sections so the loop above should never fail.  */
7713       assert (unwsec != NULL);
7714
7715       unwstart = i + 1;
7716       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7717
7718       if ((unwsec->sh_flags & SHF_GROUP) != 0)
7719         {
7720           /* We need to find which section group it is in.  */
7721           struct group_list * g;
7722
7723           if (section_headers_groups == NULL
7724               || section_headers_groups [i] == NULL)
7725             i = filedata->file_header.e_shnum;
7726           else
7727             {
7728               g = section_headers_groups [i]->root;
7729
7730               for (; g != NULL; g = g->next)
7731                 {
7732                   sec = filedata->section_headers + g->section_index;
7733
7734                   if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7735                     break;
7736                 }
7737
7738               if (g == NULL)
7739                 i = filedata->file_header.e_shnum;
7740             }
7741         }
7742       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7743         {
7744           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
7745           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7746           suffix = SECTION_NAME (unwsec) + len;
7747           for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7748                ++i, ++sec)
7749             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7750                 && streq (SECTION_NAME (sec) + len2, suffix))
7751               break;
7752         }
7753       else
7754         {
7755           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7756              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
7757           len = sizeof (ELF_STRING_ia64_unwind) - 1;
7758           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7759           suffix = "";
7760           if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
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, len2)
7765                 && streq (SECTION_NAME (sec) + len2, suffix))
7766               break;
7767         }
7768
7769       if (i == filedata->file_header.e_shnum)
7770         {
7771           printf (_("\nCould not find unwind info section for "));
7772
7773           if (filedata->string_table == NULL)
7774             printf ("%d", unwsec->sh_name);
7775           else
7776             printf ("'%s'", printable_section_name (filedata, unwsec));
7777         }
7778       else
7779         {
7780           aux.info_addr = sec->sh_addr;
7781           aux.info = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1,
7782                                                  sec->sh_size,
7783                                                  _("unwind info"));
7784           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7785
7786           printf (_("\nUnwind section "));
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           printf (_(" at offset 0x%lx contains %lu entries:\n"),
7794                   (unsigned long) unwsec->sh_offset,
7795                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7796
7797           if (slurp_ia64_unwind_table (filedata, & aux, unwsec)
7798               && aux.table_len > 0)
7799             dump_ia64_unwind (filedata, & aux);
7800
7801           if (aux.table)
7802             free ((char *) aux.table);
7803           if (aux.info)
7804             free ((char *) aux.info);
7805           aux.table = NULL;
7806           aux.info = NULL;
7807         }
7808     }
7809
7810   if (aux.symtab)
7811     free (aux.symtab);
7812   if (aux.strtab)
7813     free ((char *) aux.strtab);
7814
7815   return res;
7816 }
7817
7818 struct hppa_unw_table_entry
7819 {
7820   struct absaddr start;
7821   struct absaddr end;
7822   unsigned int Cannot_unwind:1;                 /* 0 */
7823   unsigned int Millicode:1;                     /* 1 */
7824   unsigned int Millicode_save_sr0:1;            /* 2 */
7825   unsigned int Region_description:2;            /* 3..4 */
7826   unsigned int reserved1:1;                     /* 5 */
7827   unsigned int Entry_SR:1;                      /* 6 */
7828   unsigned int Entry_FR:4;     /* Number saved     7..10 */
7829   unsigned int Entry_GR:5;     /* Number saved     11..15 */
7830   unsigned int Args_stored:1;                   /* 16 */
7831   unsigned int Variable_Frame:1;                /* 17 */
7832   unsigned int Separate_Package_Body:1;         /* 18 */
7833   unsigned int Frame_Extension_Millicode:1;     /* 19 */
7834   unsigned int Stack_Overflow_Check:1;          /* 20 */
7835   unsigned int Two_Instruction_SP_Increment:1;  /* 21 */
7836   unsigned int Ada_Region:1;                    /* 22 */
7837   unsigned int cxx_info:1;                      /* 23 */
7838   unsigned int cxx_try_catch:1;                 /* 24 */
7839   unsigned int sched_entry_seq:1;               /* 25 */
7840   unsigned int reserved2:1;                     /* 26 */
7841   unsigned int Save_SP:1;                       /* 27 */
7842   unsigned int Save_RP:1;                       /* 28 */
7843   unsigned int Save_MRP_in_frame:1;             /* 29 */
7844   unsigned int extn_ptr_defined:1;              /* 30 */
7845   unsigned int Cleanup_defined:1;               /* 31 */
7846
7847   unsigned int MPE_XL_interrupt_marker:1;       /* 0 */
7848   unsigned int HP_UX_interrupt_marker:1;        /* 1 */
7849   unsigned int Large_frame:1;                   /* 2 */
7850   unsigned int Pseudo_SP_Set:1;                 /* 3 */
7851   unsigned int reserved4:1;                     /* 4 */
7852   unsigned int Total_frame_size:27;             /* 5..31 */
7853 };
7854
7855 struct hppa_unw_aux_info
7856 {
7857   struct hppa_unw_table_entry *  table;         /* Unwind table.  */
7858   unsigned long                  table_len;     /* Length of unwind table.  */
7859   bfd_vma                        seg_base;      /* Starting address of segment.  */
7860   Elf_Internal_Sym *             symtab;        /* The symbol table.  */
7861   unsigned long                  nsyms;         /* Number of symbols.  */
7862   Elf_Internal_Sym *             funtab;        /* Sorted table of STT_FUNC symbols.  */
7863   unsigned long                  nfuns;         /* Number of entries in funtab.  */
7864   char *                         strtab;        /* The string table.  */
7865   unsigned long                  strtab_size;   /* Size of string table.  */
7866 };
7867
7868 static bfd_boolean
7869 dump_hppa_unwind (Filedata * filedata, struct hppa_unw_aux_info * aux)
7870 {
7871   struct hppa_unw_table_entry * tp;
7872   unsigned long j, nfuns;
7873   bfd_boolean res = TRUE;
7874
7875   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7876   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7877     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7878       aux->funtab[nfuns++] = aux->symtab[j];
7879   aux->nfuns = nfuns;
7880   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7881
7882   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7883     {
7884       bfd_vma offset;
7885       const char * procname;
7886
7887       find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7888                                aux->strtab_size, tp->start, &procname,
7889                                &offset);
7890
7891       fputs ("\n<", stdout);
7892
7893       if (procname)
7894         {
7895           fputs (procname, stdout);
7896
7897           if (offset)
7898             printf ("+%lx", (unsigned long) offset);
7899         }
7900
7901       fputs (">: [", stdout);
7902       print_vma (tp->start.offset, PREFIX_HEX);
7903       fputc ('-', stdout);
7904       print_vma (tp->end.offset, PREFIX_HEX);
7905       printf ("]\n\t");
7906
7907 #define PF(_m) if (tp->_m) printf (#_m " ");
7908 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7909       PF(Cannot_unwind);
7910       PF(Millicode);
7911       PF(Millicode_save_sr0);
7912       /* PV(Region_description);  */
7913       PF(Entry_SR);
7914       PV(Entry_FR);
7915       PV(Entry_GR);
7916       PF(Args_stored);
7917       PF(Variable_Frame);
7918       PF(Separate_Package_Body);
7919       PF(Frame_Extension_Millicode);
7920       PF(Stack_Overflow_Check);
7921       PF(Two_Instruction_SP_Increment);
7922       PF(Ada_Region);
7923       PF(cxx_info);
7924       PF(cxx_try_catch);
7925       PF(sched_entry_seq);
7926       PF(Save_SP);
7927       PF(Save_RP);
7928       PF(Save_MRP_in_frame);
7929       PF(extn_ptr_defined);
7930       PF(Cleanup_defined);
7931       PF(MPE_XL_interrupt_marker);
7932       PF(HP_UX_interrupt_marker);
7933       PF(Large_frame);
7934       PF(Pseudo_SP_Set);
7935       PV(Total_frame_size);
7936 #undef PF
7937 #undef PV
7938     }
7939
7940   printf ("\n");
7941
7942   free (aux->funtab);
7943
7944   return res;
7945 }
7946
7947 static bfd_boolean
7948 slurp_hppa_unwind_table (Filedata *                  filedata,
7949                          struct hppa_unw_aux_info *  aux,
7950                          Elf_Internal_Shdr *         sec)
7951 {
7952   unsigned long size, unw_ent_size, nentries, nrelas, i;
7953   Elf_Internal_Phdr * seg;
7954   struct hppa_unw_table_entry * tep;
7955   Elf_Internal_Shdr * relsec;
7956   Elf_Internal_Rela * rela;
7957   Elf_Internal_Rela * rp;
7958   unsigned char * table;
7959   unsigned char * tp;
7960   Elf_Internal_Sym * sym;
7961   const char * relname;
7962
7963   /* First, find the starting address of the segment that includes
7964      this section.  */
7965   if (filedata->file_header.e_phnum)
7966     {
7967       if (! get_program_headers (filedata))
7968         return FALSE;
7969
7970       for (seg = filedata->program_headers;
7971            seg < filedata->program_headers + filedata->file_header.e_phnum;
7972            ++seg)
7973         {
7974           if (seg->p_type != PT_LOAD)
7975             continue;
7976
7977           if (sec->sh_addr >= seg->p_vaddr
7978               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7979             {
7980               aux->seg_base = seg->p_vaddr;
7981               break;
7982             }
7983         }
7984     }
7985
7986   /* Second, build the unwind table from the contents of the unwind
7987      section.  */
7988   size = sec->sh_size;
7989   table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7990                                       _("unwind table"));
7991   if (!table)
7992     return FALSE;
7993
7994   unw_ent_size = 16;
7995   nentries = size / unw_ent_size;
7996   size = unw_ent_size * nentries;
7997
7998   tep = aux->table = (struct hppa_unw_table_entry *)
7999       xcmalloc (nentries, sizeof (aux->table[0]));
8000
8001   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
8002     {
8003       unsigned int tmp1, tmp2;
8004
8005       tep->start.section = SHN_UNDEF;
8006       tep->end.section   = SHN_UNDEF;
8007
8008       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
8009       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
8010       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
8011       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
8012
8013       tep->start.offset += aux->seg_base;
8014       tep->end.offset   += aux->seg_base;
8015
8016       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
8017       tep->Millicode = (tmp1 >> 30) & 0x1;
8018       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
8019       tep->Region_description = (tmp1 >> 27) & 0x3;
8020       tep->reserved1 = (tmp1 >> 26) & 0x1;
8021       tep->Entry_SR = (tmp1 >> 25) & 0x1;
8022       tep->Entry_FR = (tmp1 >> 21) & 0xf;
8023       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
8024       tep->Args_stored = (tmp1 >> 15) & 0x1;
8025       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
8026       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
8027       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
8028       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
8029       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
8030       tep->Ada_Region = (tmp1 >> 9) & 0x1;
8031       tep->cxx_info = (tmp1 >> 8) & 0x1;
8032       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
8033       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
8034       tep->reserved2 = (tmp1 >> 5) & 0x1;
8035       tep->Save_SP = (tmp1 >> 4) & 0x1;
8036       tep->Save_RP = (tmp1 >> 3) & 0x1;
8037       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
8038       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
8039       tep->Cleanup_defined = tmp1 & 0x1;
8040
8041       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
8042       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
8043       tep->Large_frame = (tmp2 >> 29) & 0x1;
8044       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
8045       tep->reserved4 = (tmp2 >> 27) & 0x1;
8046       tep->Total_frame_size = tmp2 & 0x7ffffff;
8047     }
8048   free (table);
8049
8050   /* Third, apply any relocations to the unwind table.  */
8051   for (relsec = filedata->section_headers;
8052        relsec < filedata->section_headers + filedata->file_header.e_shnum;
8053        ++relsec)
8054     {
8055       if (relsec->sh_type != SHT_RELA
8056           || relsec->sh_info >= filedata->file_header.e_shnum
8057           || filedata->section_headers + relsec->sh_info != sec)
8058         continue;
8059
8060       if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
8061                               & rela, & nrelas))
8062         return FALSE;
8063
8064       for (rp = rela; rp < rela + nrelas; ++rp)
8065         {
8066           unsigned int sym_ndx;
8067           unsigned int r_type = get_reloc_type (filedata, rp->r_info);
8068           relname = elf_hppa_reloc_type (r_type);
8069
8070           if (relname == NULL)
8071             {
8072               warn (_("Skipping unknown relocation type: %u\n"), r_type);
8073               continue;
8074             }
8075
8076           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
8077           if (! const_strneq (relname, "R_PARISC_SEGREL"))
8078             {
8079               warn (_("Skipping unexpected relocation type: %s\n"), relname);
8080               continue;
8081             }
8082
8083           i = rp->r_offset / unw_ent_size;
8084           if (i >= aux->table_len)
8085             {
8086               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
8087               continue;
8088             }
8089
8090           sym_ndx = get_reloc_symindex (rp->r_info);
8091           if (sym_ndx >= aux->nsyms)
8092             {
8093               warn (_("Skipping reloc with invalid symbol index: %u\n"),
8094                     sym_ndx);
8095               continue;
8096             }
8097           sym = aux->symtab + sym_ndx;
8098
8099           switch ((rp->r_offset % unw_ent_size) / 4)
8100             {
8101             case 0:
8102               aux->table[i].start.section = sym->st_shndx;
8103               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
8104               break;
8105             case 1:
8106               aux->table[i].end.section   = sym->st_shndx;
8107               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
8108               break;
8109             default:
8110               break;
8111             }
8112         }
8113
8114       free (rela);
8115     }
8116
8117   aux->table_len = nentries;
8118
8119   return TRUE;
8120 }
8121
8122 static bfd_boolean
8123 hppa_process_unwind (Filedata * filedata)
8124 {
8125   struct hppa_unw_aux_info aux;
8126   Elf_Internal_Shdr * unwsec = NULL;
8127   Elf_Internal_Shdr * strsec;
8128   Elf_Internal_Shdr * sec;
8129   unsigned long i;
8130   bfd_boolean res = TRUE;
8131
8132   if (filedata->string_table == NULL)
8133     return FALSE;
8134
8135   memset (& aux, 0, sizeof (aux));
8136
8137   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8138     {
8139       if (sec->sh_type == SHT_SYMTAB
8140           && sec->sh_link < filedata->file_header.e_shnum)
8141         {
8142           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
8143
8144           strsec = filedata->section_headers + sec->sh_link;
8145           if (aux.strtab != NULL)
8146             {
8147               error (_("Multiple auxillary string tables encountered\n"));
8148               free (aux.strtab);
8149               res = FALSE;
8150             }
8151           aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
8152                                           1, strsec->sh_size,
8153                                           _("string table"));
8154           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8155         }
8156       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8157         unwsec = sec;
8158     }
8159
8160   if (!unwsec)
8161     printf (_("\nThere are no unwind sections in this file.\n"));
8162
8163   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8164     {
8165       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8166         {
8167           unsigned long num_unwind = sec->sh_size / 16;
8168
8169           printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
8170                             "contains %lu entry:\n",
8171                             "\nUnwind section '%s' at offset 0x%lx "
8172                             "contains %lu entries:\n",
8173                             num_unwind),
8174                   printable_section_name (filedata, sec),
8175                   (unsigned long) sec->sh_offset,
8176                   num_unwind);
8177
8178           if (! slurp_hppa_unwind_table (filedata, &aux, sec))
8179             res = FALSE;
8180
8181           if (res && aux.table_len > 0)
8182             {
8183               if (! dump_hppa_unwind (filedata, &aux))
8184                 res = FALSE;
8185             }
8186
8187           if (aux.table)
8188             free ((char *) aux.table);
8189           aux.table = NULL;
8190         }
8191     }
8192
8193   if (aux.symtab)
8194     free (aux.symtab);
8195   if (aux.strtab)
8196     free ((char *) aux.strtab);
8197
8198   return res;
8199 }
8200
8201 struct arm_section
8202 {
8203   unsigned char *      data;            /* The unwind data.  */
8204   Elf_Internal_Shdr *  sec;             /* The cached unwind section header.  */
8205   Elf_Internal_Rela *  rela;            /* The cached relocations for this section.  */
8206   unsigned long        nrelas;          /* The number of relocations.  */
8207   unsigned int         rel_type;        /* REL or RELA ?  */
8208   Elf_Internal_Rela *  next_rela;       /* Cyclic pointer to the next reloc to process.  */
8209 };
8210
8211 struct arm_unw_aux_info
8212 {
8213   Filedata *          filedata;         /* The file containing the unwind sections.  */
8214   Elf_Internal_Sym *  symtab;           /* The file's symbol table.  */
8215   unsigned long       nsyms;            /* Number of symbols.  */
8216   Elf_Internal_Sym *  funtab;           /* Sorted table of STT_FUNC symbols.  */
8217   unsigned long       nfuns;            /* Number of these symbols.  */
8218   char *              strtab;           /* The file's string table.  */
8219   unsigned long       strtab_size;      /* Size of string table.  */
8220 };
8221
8222 static const char *
8223 arm_print_vma_and_name (Filedata *                 filedata,
8224                         struct arm_unw_aux_info *  aux,
8225                         bfd_vma                    fn,
8226                         struct absaddr             addr)
8227 {
8228   const char *procname;
8229   bfd_vma sym_offset;
8230
8231   if (addr.section == SHN_UNDEF)
8232     addr.offset = fn;
8233
8234   find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
8235                            aux->strtab_size, addr, &procname,
8236                            &sym_offset);
8237
8238   print_vma (fn, PREFIX_HEX);
8239
8240   if (procname)
8241     {
8242       fputs (" <", stdout);
8243       fputs (procname, stdout);
8244
8245       if (sym_offset)
8246         printf ("+0x%lx", (unsigned long) sym_offset);
8247       fputc ('>', stdout);
8248     }
8249
8250   return procname;
8251 }
8252
8253 static void
8254 arm_free_section (struct arm_section *arm_sec)
8255 {
8256   if (arm_sec->data != NULL)
8257     free (arm_sec->data);
8258
8259   if (arm_sec->rela != NULL)
8260     free (arm_sec->rela);
8261 }
8262
8263 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
8264       cached section and install SEC instead.
8265    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
8266       and return its valued in * WORDP, relocating if necessary.
8267    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
8268       relocation's offset in ADDR.
8269    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
8270       into the string table of the symbol associated with the reloc.  If no
8271       reloc was applied store -1 there.
8272    5) Return TRUE upon success, FALSE otherwise.  */
8273
8274 static bfd_boolean
8275 get_unwind_section_word (Filedata *                 filedata,
8276                          struct arm_unw_aux_info *  aux,
8277                          struct arm_section *       arm_sec,
8278                          Elf_Internal_Shdr *        sec,
8279                          bfd_vma                    word_offset,
8280                          unsigned int *             wordp,
8281                          struct absaddr *           addr,
8282                          bfd_vma *                  sym_name)
8283 {
8284   Elf_Internal_Rela *rp;
8285   Elf_Internal_Sym *sym;
8286   const char * relname;
8287   unsigned int word;
8288   bfd_boolean wrapped;
8289
8290   if (sec == NULL || arm_sec == NULL)
8291     return FALSE;
8292
8293   addr->section = SHN_UNDEF;
8294   addr->offset = 0;
8295
8296   if (sym_name != NULL)
8297     *sym_name = (bfd_vma) -1;
8298
8299   /* If necessary, update the section cache.  */
8300   if (sec != arm_sec->sec)
8301     {
8302       Elf_Internal_Shdr *relsec;
8303
8304       arm_free_section (arm_sec);
8305
8306       arm_sec->sec = sec;
8307       arm_sec->data = get_data (NULL, aux->filedata, sec->sh_offset, 1,
8308                                 sec->sh_size, _("unwind data"));
8309       arm_sec->rela = NULL;
8310       arm_sec->nrelas = 0;
8311
8312       for (relsec = filedata->section_headers;
8313            relsec < filedata->section_headers + filedata->file_header.e_shnum;
8314            ++relsec)
8315         {
8316           if (relsec->sh_info >= filedata->file_header.e_shnum
8317               || filedata->section_headers + relsec->sh_info != sec
8318               /* PR 15745: Check the section type as well.  */
8319               || (relsec->sh_type != SHT_REL
8320                   && relsec->sh_type != SHT_RELA))
8321             continue;
8322
8323           arm_sec->rel_type = relsec->sh_type;
8324           if (relsec->sh_type == SHT_REL)
8325             {
8326               if (!slurp_rel_relocs (aux->filedata, relsec->sh_offset,
8327                                      relsec->sh_size,
8328                                      & arm_sec->rela, & arm_sec->nrelas))
8329                 return FALSE;
8330             }
8331           else /* relsec->sh_type == SHT_RELA */
8332             {
8333               if (!slurp_rela_relocs (aux->filedata, relsec->sh_offset,
8334                                       relsec->sh_size,
8335                                       & arm_sec->rela, & arm_sec->nrelas))
8336                 return FALSE;
8337             }
8338           break;
8339         }
8340
8341       arm_sec->next_rela = arm_sec->rela;
8342     }
8343
8344   /* If there is no unwind data we can do nothing.  */
8345   if (arm_sec->data == NULL)
8346     return FALSE;
8347
8348   /* If the offset is invalid then fail.  */
8349   if (/* PR 21343 *//* PR 18879 */
8350       sec->sh_size < 4
8351       || word_offset > (sec->sh_size - 4)
8352       || ((bfd_signed_vma) word_offset) < 0)
8353     return FALSE;
8354
8355   /* Get the word at the required offset.  */
8356   word = byte_get (arm_sec->data + word_offset, 4);
8357
8358   /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128.  */
8359   if (arm_sec->rela == NULL)
8360     {
8361       * wordp = word;
8362       return TRUE;
8363     }
8364
8365   /* Look through the relocs to find the one that applies to the provided offset.  */
8366   wrapped = FALSE;
8367   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
8368     {
8369       bfd_vma prelval, offset;
8370
8371       if (rp->r_offset > word_offset && !wrapped)
8372         {
8373           rp = arm_sec->rela;
8374           wrapped = TRUE;
8375         }
8376       if (rp->r_offset > word_offset)
8377         break;
8378
8379       if (rp->r_offset & 3)
8380         {
8381           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8382                 (unsigned long) rp->r_offset);
8383           continue;
8384         }
8385
8386       if (rp->r_offset < word_offset)
8387         continue;
8388
8389       /* PR 17531: file: 027-161405-0.004  */
8390       if (aux->symtab == NULL)
8391         continue;
8392
8393       if (arm_sec->rel_type == SHT_REL)
8394         {
8395           offset = word & 0x7fffffff;
8396           if (offset & 0x40000000)
8397             offset |= ~ (bfd_vma) 0x7fffffff;
8398         }
8399       else if (arm_sec->rel_type == SHT_RELA)
8400         offset = rp->r_addend;
8401       else
8402         {
8403           error (_("Unknown section relocation type %d encountered\n"),
8404                  arm_sec->rel_type);
8405           break;
8406         }
8407
8408       /* PR 17531 file: 027-1241568-0.004.  */
8409       if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8410         {
8411           error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8412                  (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8413           break;
8414         }
8415
8416       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
8417       offset += sym->st_value;
8418       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8419
8420       /* Check that we are processing the expected reloc type.  */
8421       if (filedata->file_header.e_machine == EM_ARM)
8422         {
8423           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
8424           if (relname == NULL)
8425             {
8426               warn (_("Skipping unknown ARM relocation type: %d\n"),
8427                     (int) ELF32_R_TYPE (rp->r_info));
8428               continue;
8429             }
8430
8431           if (streq (relname, "R_ARM_NONE"))
8432               continue;
8433
8434           if (! streq (relname, "R_ARM_PREL31"))
8435             {
8436               warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
8437               continue;
8438             }
8439         }
8440       else if (filedata->file_header.e_machine == EM_TI_C6000)
8441         {
8442           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
8443           if (relname == NULL)
8444             {
8445               warn (_("Skipping unknown C6000 relocation type: %d\n"),
8446                     (int) ELF32_R_TYPE (rp->r_info));
8447               continue;
8448             }
8449
8450           if (streq (relname, "R_C6000_NONE"))
8451             continue;
8452
8453           if (! streq (relname, "R_C6000_PREL31"))
8454             {
8455               warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
8456               continue;
8457             }
8458
8459           prelval >>= 1;
8460         }
8461       else
8462         {
8463           /* This function currently only supports ARM and TI unwinders.  */
8464           warn (_("Only TI and ARM unwinders are currently supported\n"));
8465           break;
8466         }
8467
8468       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8469       addr->section = sym->st_shndx;
8470       addr->offset = offset;
8471
8472       if (sym_name)
8473         * sym_name = sym->st_name;
8474       break;
8475     }
8476
8477   *wordp = word;
8478   arm_sec->next_rela = rp;
8479
8480   return TRUE;
8481 }
8482
8483 static const char *tic6x_unwind_regnames[16] =
8484 {
8485   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8486   "A14", "A13", "A12", "A11", "A10",
8487   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8488 };
8489
8490 static void
8491 decode_tic6x_unwind_regmask (unsigned int mask)
8492 {
8493   int i;
8494
8495   for (i = 12; mask; mask >>= 1, i--)
8496     {
8497       if (mask & 1)
8498         {
8499           fputs (tic6x_unwind_regnames[i], stdout);
8500           if (mask > 1)
8501             fputs (", ", stdout);
8502         }
8503     }
8504 }
8505
8506 #define ADVANCE                                                 \
8507   if (remaining == 0 && more_words)                             \
8508     {                                                           \
8509       data_offset += 4;                                         \
8510       if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec,     \
8511                                      data_offset, & word, & addr, NULL))        \
8512         return FALSE;                                           \
8513       remaining = 4;                                            \
8514       more_words--;                                             \
8515     }                                                           \
8516
8517 #define GET_OP(OP)                      \
8518   ADVANCE;                              \
8519   if (remaining)                        \
8520     {                                   \
8521       remaining--;                      \
8522       (OP) = word >> 24;                \
8523       word <<= 8;                       \
8524     }                                   \
8525   else                                  \
8526     {                                   \
8527       printf (_("[Truncated opcode]\n"));       \
8528       return FALSE;                     \
8529     }                                   \
8530   printf ("0x%02x ", OP)
8531
8532 static bfd_boolean
8533 decode_arm_unwind_bytecode (Filedata *                 filedata,
8534                             struct arm_unw_aux_info *  aux,
8535                             unsigned int               word,
8536                             unsigned int               remaining,
8537                             unsigned int               more_words,
8538                             bfd_vma                    data_offset,
8539                             Elf_Internal_Shdr *        data_sec,
8540                             struct arm_section *       data_arm_sec)
8541 {
8542   struct absaddr addr;
8543   bfd_boolean res = TRUE;
8544
8545   /* Decode the unwinding instructions.  */
8546   while (1)
8547     {
8548       unsigned int op, op2;
8549
8550       ADVANCE;
8551       if (remaining == 0)
8552         break;
8553       remaining--;
8554       op = word >> 24;
8555       word <<= 8;
8556
8557       printf ("  0x%02x ", op);
8558
8559       if ((op & 0xc0) == 0x00)
8560         {
8561           int offset = ((op & 0x3f) << 2) + 4;
8562
8563           printf ("     vsp = vsp + %d", offset);
8564         }
8565       else if ((op & 0xc0) == 0x40)
8566         {
8567           int offset = ((op & 0x3f) << 2) + 4;
8568
8569           printf ("     vsp = vsp - %d", offset);
8570         }
8571       else if ((op & 0xf0) == 0x80)
8572         {
8573           GET_OP (op2);
8574           if (op == 0x80 && op2 == 0)
8575             printf (_("Refuse to unwind"));
8576           else
8577             {
8578               unsigned int mask = ((op & 0x0f) << 8) | op2;
8579               bfd_boolean first = TRUE;
8580               int i;
8581
8582               printf ("pop {");
8583               for (i = 0; i < 12; i++)
8584                 if (mask & (1 << i))
8585                   {
8586                     if (first)
8587                       first = FALSE;
8588                     else
8589                       printf (", ");
8590                     printf ("r%d", 4 + i);
8591                   }
8592               printf ("}");
8593             }
8594         }
8595       else if ((op & 0xf0) == 0x90)
8596         {
8597           if (op == 0x9d || op == 0x9f)
8598             printf (_("     [Reserved]"));
8599           else
8600             printf ("     vsp = r%d", op & 0x0f);
8601         }
8602       else if ((op & 0xf0) == 0xa0)
8603         {
8604           int end = 4 + (op & 0x07);
8605           bfd_boolean first = TRUE;
8606           int i;
8607
8608           printf ("     pop {");
8609           for (i = 4; i <= end; i++)
8610             {
8611               if (first)
8612                 first = FALSE;
8613               else
8614                 printf (", ");
8615               printf ("r%d", i);
8616             }
8617           if (op & 0x08)
8618             {
8619               if (!first)
8620                 printf (", ");
8621               printf ("r14");
8622             }
8623           printf ("}");
8624         }
8625       else if (op == 0xb0)
8626         printf (_("     finish"));
8627       else if (op == 0xb1)
8628         {
8629           GET_OP (op2);
8630           if (op2 == 0 || (op2 & 0xf0) != 0)
8631             printf (_("[Spare]"));
8632           else
8633             {
8634               unsigned int mask = op2 & 0x0f;
8635               bfd_boolean first = TRUE;
8636               int i;
8637
8638               printf ("pop {");
8639               for (i = 0; i < 12; i++)
8640                 if (mask & (1 << i))
8641                   {
8642                     if (first)
8643                       first = FALSE;
8644                     else
8645                       printf (", ");
8646                     printf ("r%d", i);
8647                   }
8648               printf ("}");
8649             }
8650         }
8651       else if (op == 0xb2)
8652         {
8653           unsigned char buf[9];
8654           unsigned int i, len;
8655           unsigned long offset;
8656
8657           for (i = 0; i < sizeof (buf); i++)
8658             {
8659               GET_OP (buf[i]);
8660               if ((buf[i] & 0x80) == 0)
8661                 break;
8662             }
8663           if (i == sizeof (buf))
8664             {
8665               error (_("corrupt change to vsp"));
8666               res = FALSE;
8667             }
8668           else
8669             {
8670               offset = read_uleb128 (buf, &len, buf + i + 1);
8671               assert (len == i + 1);
8672               offset = offset * 4 + 0x204;
8673               printf ("vsp = vsp + %ld", offset);
8674             }
8675         }
8676       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8677         {
8678           unsigned int first, last;
8679
8680           GET_OP (op2);
8681           first = op2 >> 4;
8682           last = op2 & 0x0f;
8683           if (op == 0xc8)
8684             first = first + 16;
8685           printf ("pop {D%d", first);
8686           if (last)
8687             printf ("-D%d", first + last);
8688           printf ("}");
8689         }
8690       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8691         {
8692           unsigned int count = op & 0x07;
8693
8694           printf ("pop {D8");
8695           if (count)
8696             printf ("-D%d", 8 + count);
8697           printf ("}");
8698         }
8699       else if (op >= 0xc0 && op <= 0xc5)
8700         {
8701           unsigned int count = op & 0x07;
8702
8703           printf ("     pop {wR10");
8704           if (count)
8705             printf ("-wR%d", 10 + count);
8706           printf ("}");
8707         }
8708       else if (op == 0xc6)
8709         {
8710           unsigned int first, last;
8711
8712           GET_OP (op2);
8713           first = op2 >> 4;
8714           last = op2 & 0x0f;
8715           printf ("pop {wR%d", first);
8716           if (last)
8717             printf ("-wR%d", first + last);
8718           printf ("}");
8719         }
8720       else if (op == 0xc7)
8721         {
8722           GET_OP (op2);
8723           if (op2 == 0 || (op2 & 0xf0) != 0)
8724             printf (_("[Spare]"));
8725           else
8726             {
8727               unsigned int mask = op2 & 0x0f;
8728               bfd_boolean first = TRUE;
8729               int i;
8730
8731               printf ("pop {");
8732               for (i = 0; i < 4; i++)
8733                 if (mask & (1 << i))
8734                   {
8735                     if (first)
8736                       first = FALSE;
8737                     else
8738                       printf (", ");
8739                     printf ("wCGR%d", i);
8740                   }
8741               printf ("}");
8742             }
8743         }
8744       else
8745         {
8746           printf (_("     [unsupported opcode]"));
8747           res = FALSE;
8748         }
8749
8750       printf ("\n");
8751     }
8752
8753   return res;
8754 }
8755
8756 static bfd_boolean
8757 decode_tic6x_unwind_bytecode (Filedata *                 filedata,
8758                               struct arm_unw_aux_info *  aux,
8759                               unsigned int               word,
8760                               unsigned int               remaining,
8761                               unsigned int               more_words,
8762                               bfd_vma                    data_offset,
8763                               Elf_Internal_Shdr *        data_sec,
8764                               struct arm_section *       data_arm_sec)
8765 {
8766   struct absaddr addr;
8767
8768   /* Decode the unwinding instructions.  */
8769   while (1)
8770     {
8771       unsigned int op, op2;
8772
8773       ADVANCE;
8774       if (remaining == 0)
8775         break;
8776       remaining--;
8777       op = word >> 24;
8778       word <<= 8;
8779
8780       printf ("  0x%02x ", op);
8781
8782       if ((op & 0xc0) == 0x00)
8783         {
8784           int offset = ((op & 0x3f) << 3) + 8;
8785           printf ("     sp = sp + %d", offset);
8786         }
8787       else if ((op & 0xc0) == 0x80)
8788         {
8789           GET_OP (op2);
8790           if (op == 0x80 && op2 == 0)
8791             printf (_("Refuse to unwind"));
8792           else
8793             {
8794               unsigned int mask = ((op & 0x1f) << 8) | op2;
8795               if (op & 0x20)
8796                 printf ("pop compact {");
8797               else
8798                 printf ("pop {");
8799
8800               decode_tic6x_unwind_regmask (mask);
8801               printf("}");
8802             }
8803         }
8804       else if ((op & 0xf0) == 0xc0)
8805         {
8806           unsigned int reg;
8807           unsigned int nregs;
8808           unsigned int i;
8809           const char *name;
8810           struct
8811           {
8812             unsigned int offset;
8813             unsigned int reg;
8814           } regpos[16];
8815
8816           /* Scan entire instruction first so that GET_OP output is not
8817              interleaved with disassembly.  */
8818           nregs = 0;
8819           for (i = 0; nregs < (op & 0xf); i++)
8820             {
8821               GET_OP (op2);
8822               reg = op2 >> 4;
8823               if (reg != 0xf)
8824                 {
8825                   regpos[nregs].offset = i * 2;
8826                   regpos[nregs].reg = reg;
8827                   nregs++;
8828                 }
8829
8830               reg = op2 & 0xf;
8831               if (reg != 0xf)
8832                 {
8833                   regpos[nregs].offset = i * 2 + 1;
8834                   regpos[nregs].reg = reg;
8835                   nregs++;
8836                 }
8837             }
8838
8839           printf (_("pop frame {"));
8840           reg = nregs - 1;
8841           for (i = i * 2; i > 0; i--)
8842             {
8843               if (regpos[reg].offset == i - 1)
8844                 {
8845                   name = tic6x_unwind_regnames[regpos[reg].reg];
8846                   if (reg > 0)
8847                     reg--;
8848                 }
8849               else
8850                 name = _("[pad]");
8851
8852               fputs (name, stdout);
8853               if (i > 1)
8854                 printf (", ");
8855             }
8856
8857           printf ("}");
8858         }
8859       else if (op == 0xd0)
8860         printf ("     MOV FP, SP");
8861       else if (op == 0xd1)
8862         printf ("     __c6xabi_pop_rts");
8863       else if (op == 0xd2)
8864         {
8865           unsigned char buf[9];
8866           unsigned int i, len;
8867           unsigned long offset;
8868
8869           for (i = 0; i < sizeof (buf); i++)
8870             {
8871               GET_OP (buf[i]);
8872               if ((buf[i] & 0x80) == 0)
8873                 break;
8874             }
8875           /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2.  */
8876           if (i == sizeof (buf))
8877             {
8878               warn (_("Corrupt stack pointer adjustment detected\n"));
8879               return FALSE;
8880             }
8881
8882           offset = read_uleb128 (buf, &len, buf + i + 1);
8883           assert (len == i + 1);
8884           offset = offset * 8 + 0x408;
8885           printf (_("sp = sp + %ld"), offset);
8886         }
8887       else if ((op & 0xf0) == 0xe0)
8888         {
8889           if ((op & 0x0f) == 7)
8890             printf ("     RETURN");
8891           else
8892             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8893         }
8894       else
8895         {
8896           printf (_("     [unsupported opcode]"));
8897         }
8898       putchar ('\n');
8899     }
8900
8901   return TRUE;
8902 }
8903
8904 static bfd_vma
8905 arm_expand_prel31 (Filedata * filedata, bfd_vma word, bfd_vma where)
8906 {
8907   bfd_vma offset;
8908
8909   offset = word & 0x7fffffff;
8910   if (offset & 0x40000000)
8911     offset |= ~ (bfd_vma) 0x7fffffff;
8912
8913   if (filedata->file_header.e_machine == EM_TI_C6000)
8914     offset <<= 1;
8915
8916   return offset + where;
8917 }
8918
8919 static bfd_boolean
8920 decode_arm_unwind (Filedata *                 filedata,
8921                    struct arm_unw_aux_info *  aux,
8922                    unsigned int               word,
8923                    unsigned int               remaining,
8924                    bfd_vma                    data_offset,
8925                    Elf_Internal_Shdr *        data_sec,
8926                    struct arm_section *       data_arm_sec)
8927 {
8928   int per_index;
8929   unsigned int more_words = 0;
8930   struct absaddr addr;
8931   bfd_vma sym_name = (bfd_vma) -1;
8932   bfd_boolean res = TRUE;
8933
8934   if (remaining == 0)
8935     {
8936       /* Fetch the first word.
8937          Note - when decoding an object file the address extracted
8938          here will always be 0.  So we also pass in the sym_name
8939          parameter so that we can find the symbol associated with
8940          the personality routine.  */
8941       if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, data_offset,
8942                                      & word, & addr, & sym_name))
8943         return FALSE;
8944
8945       remaining = 4;
8946     }
8947
8948   if ((word & 0x80000000) == 0)
8949     {
8950       /* Expand prel31 for personality routine.  */
8951       bfd_vma fn;
8952       const char *procname;
8953
8954       fn = arm_expand_prel31 (filedata, word, data_sec->sh_addr + data_offset);
8955       printf (_("  Personality routine: "));
8956       if (fn == 0
8957           && addr.section == SHN_UNDEF && addr.offset == 0
8958           && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8959         {
8960           procname = aux->strtab + sym_name;
8961           print_vma (fn, PREFIX_HEX);
8962           if (procname)
8963             {
8964               fputs (" <", stdout);
8965               fputs (procname, stdout);
8966               fputc ('>', stdout);
8967             }
8968         }
8969       else
8970         procname = arm_print_vma_and_name (filedata, aux, fn, addr);
8971       fputc ('\n', stdout);
8972
8973       /* The GCC personality routines use the standard compact
8974          encoding, starting with one byte giving the number of
8975          words.  */
8976       if (procname != NULL
8977           && (const_strneq (procname, "__gcc_personality_v0")
8978               || const_strneq (procname, "__gxx_personality_v0")
8979               || const_strneq (procname, "__gcj_personality_v0")
8980               || const_strneq (procname, "__gnu_objc_personality_v0")))
8981         {
8982           remaining = 0;
8983           more_words = 1;
8984           ADVANCE;
8985           if (!remaining)
8986             {
8987               printf (_("  [Truncated data]\n"));
8988               return FALSE;
8989             }
8990           more_words = word >> 24;
8991           word <<= 8;
8992           remaining--;
8993           per_index = -1;
8994         }
8995       else
8996         return TRUE;
8997     }
8998   else
8999     {
9000       /* ARM EHABI Section 6.3:
9001
9002          An exception-handling table entry for the compact model looks like:
9003
9004            31 30-28 27-24 23-0
9005            -- ----- ----- ----
9006             1   0   index Data for personalityRoutine[index]    */
9007
9008       if (filedata->file_header.e_machine == EM_ARM
9009           && (word & 0x70000000))
9010         {
9011           warn (_("Corrupt ARM compact model table entry: %x \n"), word);
9012           res = FALSE;
9013         }
9014
9015       per_index = (word >> 24) & 0x7f;
9016       printf (_("  Compact model index: %d\n"), per_index);
9017       if (per_index == 0)
9018         {
9019           more_words = 0;
9020           word <<= 8;
9021           remaining--;
9022         }
9023       else if (per_index < 3)
9024         {
9025           more_words = (word >> 16) & 0xff;
9026           word <<= 16;
9027           remaining -= 2;
9028         }
9029     }
9030
9031   switch (filedata->file_header.e_machine)
9032     {
9033     case EM_ARM:
9034       if (per_index < 3)
9035         {
9036           if (! decode_arm_unwind_bytecode (filedata, aux, word, remaining, more_words,
9037                                             data_offset, data_sec, data_arm_sec))
9038             res = FALSE;
9039         }
9040       else
9041         {
9042           warn (_("Unknown ARM compact model index encountered\n"));
9043           printf (_("  [reserved]\n"));
9044           res = FALSE;
9045         }
9046       break;
9047
9048     case EM_TI_C6000:
9049       if (per_index < 3)
9050         {
9051           if (! decode_tic6x_unwind_bytecode (filedata, aux, word, remaining, more_words,
9052                                               data_offset, data_sec, data_arm_sec))
9053             res = FALSE;
9054         }
9055       else if (per_index < 5)
9056         {
9057           if (((word >> 17) & 0x7f) == 0x7f)
9058             printf (_("  Restore stack from frame pointer\n"));
9059           else
9060             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
9061           printf (_("  Registers restored: "));
9062           if (per_index == 4)
9063             printf (" (compact) ");
9064           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
9065           putchar ('\n');
9066           printf (_("  Return register: %s\n"),
9067                   tic6x_unwind_regnames[word & 0xf]);
9068         }
9069       else
9070         printf (_("  [reserved (%d)]\n"), per_index);
9071       break;
9072
9073     default:
9074       error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
9075              filedata->file_header.e_machine);
9076       res = FALSE;
9077     }
9078
9079   /* Decode the descriptors.  Not implemented.  */
9080
9081   return res;
9082 }
9083
9084 static bfd_boolean
9085 dump_arm_unwind (Filedata *                 filedata,
9086                  struct arm_unw_aux_info *  aux,
9087                  Elf_Internal_Shdr *        exidx_sec)
9088 {
9089   struct arm_section exidx_arm_sec, extab_arm_sec;
9090   unsigned int i, exidx_len;
9091   unsigned long j, nfuns;
9092   bfd_boolean res = TRUE;
9093
9094   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
9095   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
9096   exidx_len = exidx_sec->sh_size / 8;
9097
9098   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
9099   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
9100     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
9101       aux->funtab[nfuns++] = aux->symtab[j];
9102   aux->nfuns = nfuns;
9103   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
9104
9105   for (i = 0; i < exidx_len; i++)
9106     {
9107       unsigned int exidx_fn, exidx_entry;
9108       struct absaddr fn_addr, entry_addr;
9109       bfd_vma fn;
9110
9111       fputc ('\n', stdout);
9112
9113       if (! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9114                                      8 * i, & exidx_fn, & fn_addr, NULL)
9115           || ! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9116                                         8 * i + 4, & exidx_entry, & entry_addr, NULL))
9117         {
9118           free (aux->funtab);
9119           arm_free_section (& exidx_arm_sec);
9120           arm_free_section (& extab_arm_sec);
9121           return FALSE;
9122         }
9123
9124       /* ARM EHABI, Section 5:
9125          An index table entry consists of 2 words.
9126          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
9127       if (exidx_fn & 0x80000000)
9128         {
9129           warn (_("corrupt index table entry: %x\n"), exidx_fn);
9130           res = FALSE;
9131         }
9132
9133       fn = arm_expand_prel31 (filedata, exidx_fn, exidx_sec->sh_addr + 8 * i);
9134
9135       arm_print_vma_and_name (filedata, aux, fn, fn_addr);
9136       fputs (": ", stdout);
9137
9138       if (exidx_entry == 1)
9139         {
9140           print_vma (exidx_entry, PREFIX_HEX);
9141           fputs (" [cantunwind]\n", stdout);
9142         }
9143       else if (exidx_entry & 0x80000000)
9144         {
9145           print_vma (exidx_entry, PREFIX_HEX);
9146           fputc ('\n', stdout);
9147           decode_arm_unwind (filedata, aux, exidx_entry, 4, 0, NULL, NULL);
9148         }
9149       else
9150         {
9151           bfd_vma table, table_offset = 0;
9152           Elf_Internal_Shdr *table_sec;
9153
9154           fputs ("@", stdout);
9155           table = arm_expand_prel31 (filedata, exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
9156           print_vma (table, PREFIX_HEX);
9157           printf ("\n");
9158
9159           /* Locate the matching .ARM.extab.  */
9160           if (entry_addr.section != SHN_UNDEF
9161               && entry_addr.section < filedata->file_header.e_shnum)
9162             {
9163               table_sec = filedata->section_headers + entry_addr.section;
9164               table_offset = entry_addr.offset;
9165               /* PR 18879 */
9166               if (table_offset > table_sec->sh_size
9167                   || ((bfd_signed_vma) table_offset) < 0)
9168                 {
9169                   warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
9170                         (unsigned long) table_offset,
9171                         printable_section_name (filedata, table_sec));
9172                   res = FALSE;
9173                   continue;
9174                 }
9175             }
9176           else
9177             {
9178               table_sec = find_section_by_address (filedata, table);
9179               if (table_sec != NULL)
9180                 table_offset = table - table_sec->sh_addr;
9181             }
9182
9183           if (table_sec == NULL)
9184             {
9185               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
9186                     (unsigned long) table);
9187               res = FALSE;
9188               continue;
9189             }
9190
9191           if (! decode_arm_unwind (filedata, aux, 0, 0, table_offset, table_sec,
9192                                    &extab_arm_sec))
9193             res = FALSE;
9194         }
9195     }
9196
9197   printf ("\n");
9198
9199   free (aux->funtab);
9200   arm_free_section (&exidx_arm_sec);
9201   arm_free_section (&extab_arm_sec);
9202
9203   return res;
9204 }
9205
9206 /* Used for both ARM and C6X unwinding tables.  */
9207
9208 static bfd_boolean
9209 arm_process_unwind (Filedata * filedata)
9210 {
9211   struct arm_unw_aux_info aux;
9212   Elf_Internal_Shdr *unwsec = NULL;
9213   Elf_Internal_Shdr *strsec;
9214   Elf_Internal_Shdr *sec;
9215   unsigned long i;
9216   unsigned int sec_type;
9217   bfd_boolean res = TRUE;
9218
9219   switch (filedata->file_header.e_machine)
9220     {
9221     case EM_ARM:
9222       sec_type = SHT_ARM_EXIDX;
9223       break;
9224
9225     case EM_TI_C6000:
9226       sec_type = SHT_C6000_UNWIND;
9227       break;
9228
9229     default:
9230       error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
9231              filedata->file_header.e_machine);
9232       return FALSE;
9233     }
9234
9235   if (filedata->string_table == NULL)
9236     return FALSE;
9237
9238   memset (& aux, 0, sizeof (aux));
9239   aux.filedata = filedata;
9240
9241   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9242     {
9243       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < filedata->file_header.e_shnum)
9244         {
9245           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
9246
9247           strsec = filedata->section_headers + sec->sh_link;
9248
9249           /* PR binutils/17531 file: 011-12666-0.004.  */
9250           if (aux.strtab != NULL)
9251             {
9252               error (_("Multiple string tables found in file.\n"));
9253               free (aux.strtab);
9254               res = FALSE;
9255             }
9256           aux.strtab = get_data (NULL, filedata, strsec->sh_offset,
9257                                  1, strsec->sh_size, _("string table"));
9258           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
9259         }
9260       else if (sec->sh_type == sec_type)
9261         unwsec = sec;
9262     }
9263
9264   if (unwsec == NULL)
9265     printf (_("\nThere are no unwind sections in this file.\n"));
9266   else
9267     for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9268       {
9269         if (sec->sh_type == sec_type)
9270           {
9271             unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size);
9272             printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
9273                               "contains %lu entry:\n",
9274                               "\nUnwind section '%s' at offset 0x%lx "
9275                               "contains %lu entries:\n",
9276                               num_unwind),
9277                     printable_section_name (filedata, sec),
9278                     (unsigned long) sec->sh_offset,
9279                     num_unwind);
9280
9281             if (! dump_arm_unwind (filedata, &aux, sec))
9282               res = FALSE;
9283           }
9284       }
9285
9286   if (aux.symtab)
9287     free (aux.symtab);
9288   if (aux.strtab)
9289     free ((char *) aux.strtab);
9290
9291   return res;
9292 }
9293
9294 static bfd_boolean
9295 process_unwind (Filedata * filedata)
9296 {
9297   struct unwind_handler
9298   {
9299     unsigned int machtype;
9300     bfd_boolean (* handler)(Filedata *);
9301   } handlers[] =
9302   {
9303     { EM_ARM, arm_process_unwind },
9304     { EM_IA_64, ia64_process_unwind },
9305     { EM_PARISC, hppa_process_unwind },
9306     { EM_TI_C6000, arm_process_unwind },
9307     { 0, NULL }
9308   };
9309   int i;
9310
9311   if (!do_unwind)
9312     return TRUE;
9313
9314   for (i = 0; handlers[i].handler != NULL; i++)
9315     if (filedata->file_header.e_machine == handlers[i].machtype)
9316       return handlers[i].handler (filedata);
9317
9318   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
9319           get_machine_name (filedata->file_header.e_machine));
9320   return TRUE;
9321 }
9322
9323 static void
9324 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
9325 {
9326   switch (entry->d_tag)
9327     {
9328     case DT_MIPS_FLAGS:
9329       if (entry->d_un.d_val == 0)
9330         printf (_("NONE"));
9331       else
9332         {
9333           static const char * opts[] =
9334           {
9335             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
9336             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
9337             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
9338             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
9339             "RLD_ORDER_SAFE"
9340           };
9341           unsigned int cnt;
9342           bfd_boolean first = TRUE;
9343
9344           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
9345             if (entry->d_un.d_val & (1 << cnt))
9346               {
9347                 printf ("%s%s", first ? "" : " ", opts[cnt]);
9348                 first = FALSE;
9349               }
9350         }
9351       break;
9352
9353     case DT_MIPS_IVERSION:
9354       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9355         printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
9356       else
9357         {
9358           char buf[40];
9359           sprintf_vma (buf, entry->d_un.d_ptr);
9360           /* Note: coded this way so that there is a single string for translation.  */
9361           printf (_("<corrupt: %s>"), buf);
9362         }
9363       break;
9364
9365     case DT_MIPS_TIME_STAMP:
9366       {
9367         char timebuf[128];
9368         struct tm * tmp;
9369         time_t atime = entry->d_un.d_val;
9370
9371         tmp = gmtime (&atime);
9372         /* PR 17531: file: 6accc532.  */
9373         if (tmp == NULL)
9374           snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
9375         else
9376           snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
9377                     tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9378                     tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9379         printf (_("Time Stamp: %s"), timebuf);
9380       }
9381       break;
9382
9383     case DT_MIPS_RLD_VERSION:
9384     case DT_MIPS_LOCAL_GOTNO:
9385     case DT_MIPS_CONFLICTNO:
9386     case DT_MIPS_LIBLISTNO:
9387     case DT_MIPS_SYMTABNO:
9388     case DT_MIPS_UNREFEXTNO:
9389     case DT_MIPS_HIPAGENO:
9390     case DT_MIPS_DELTA_CLASS_NO:
9391     case DT_MIPS_DELTA_INSTANCE_NO:
9392     case DT_MIPS_DELTA_RELOC_NO:
9393     case DT_MIPS_DELTA_SYM_NO:
9394     case DT_MIPS_DELTA_CLASSSYM_NO:
9395     case DT_MIPS_COMPACT_SIZE:
9396       print_vma (entry->d_un.d_val, DEC);
9397       break;
9398
9399     default:
9400       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9401     }
9402     putchar ('\n');
9403 }
9404
9405 static void
9406 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
9407 {
9408   switch (entry->d_tag)
9409     {
9410     case DT_HP_DLD_FLAGS:
9411       {
9412         static struct
9413         {
9414           long int bit;
9415           const char * str;
9416         }
9417         flags[] =
9418         {
9419           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
9420           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
9421           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
9422           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
9423           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
9424           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
9425           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9426           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9427           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9428           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
9429           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9430           { DT_HP_GST, "HP_GST" },
9431           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9432           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9433           { DT_HP_NODELETE, "HP_NODELETE" },
9434           { DT_HP_GROUP, "HP_GROUP" },
9435           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
9436         };
9437         bfd_boolean first = TRUE;
9438         size_t cnt;
9439         bfd_vma val = entry->d_un.d_val;
9440
9441         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
9442           if (val & flags[cnt].bit)
9443             {
9444               if (! first)
9445                 putchar (' ');
9446               fputs (flags[cnt].str, stdout);
9447               first = FALSE;
9448               val ^= flags[cnt].bit;
9449             }
9450
9451         if (val != 0 || first)
9452           {
9453             if (! first)
9454               putchar (' ');
9455             print_vma (val, HEX);
9456           }
9457       }
9458       break;
9459
9460     default:
9461       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9462       break;
9463     }
9464   putchar ('\n');
9465 }
9466
9467 #ifdef BFD64
9468
9469 /* VMS vs Unix time offset and factor.  */
9470
9471 #define VMS_EPOCH_OFFSET 35067168000000000LL
9472 #define VMS_GRANULARITY_FACTOR 10000000
9473
9474 /* Display a VMS time in a human readable format.  */
9475
9476 static void
9477 print_vms_time (bfd_int64_t vmstime)
9478 {
9479   struct tm *tm;
9480   time_t unxtime;
9481
9482   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9483   tm = gmtime (&unxtime);
9484   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9485           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9486           tm->tm_hour, tm->tm_min, tm->tm_sec);
9487 }
9488 #endif /* BFD64 */
9489
9490 static void
9491 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
9492 {
9493   switch (entry->d_tag)
9494     {
9495     case DT_IA_64_PLT_RESERVE:
9496       /* First 3 slots reserved.  */
9497       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9498       printf (" -- ");
9499       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
9500       break;
9501
9502     case DT_IA_64_VMS_LINKTIME:
9503 #ifdef BFD64
9504       print_vms_time (entry->d_un.d_val);
9505 #endif
9506       break;
9507
9508     case DT_IA_64_VMS_LNKFLAGS:
9509       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9510       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9511         printf (" CALL_DEBUG");
9512       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9513         printf (" NOP0BUFS");
9514       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9515         printf (" P0IMAGE");
9516       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9517         printf (" MKTHREADS");
9518       if (entry->d_un.d_val & VMS_LF_UPCALLS)
9519         printf (" UPCALLS");
9520       if (entry->d_un.d_val & VMS_LF_IMGSTA)
9521         printf (" IMGSTA");
9522       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9523         printf (" INITIALIZE");
9524       if (entry->d_un.d_val & VMS_LF_MAIN)
9525         printf (" MAIN");
9526       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9527         printf (" EXE_INIT");
9528       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9529         printf (" TBK_IN_IMG");
9530       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9531         printf (" DBG_IN_IMG");
9532       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9533         printf (" TBK_IN_DSF");
9534       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9535         printf (" DBG_IN_DSF");
9536       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9537         printf (" SIGNATURES");
9538       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9539         printf (" REL_SEG_OFF");
9540       break;
9541
9542     default:
9543       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9544       break;
9545     }
9546   putchar ('\n');
9547 }
9548
9549 static bfd_boolean
9550 get_32bit_dynamic_section (Filedata * filedata)
9551 {
9552   Elf32_External_Dyn * edyn;
9553   Elf32_External_Dyn * ext;
9554   Elf_Internal_Dyn * entry;
9555
9556   edyn = (Elf32_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9557                                           dynamic_size, _("dynamic section"));
9558   if (!edyn)
9559     return FALSE;
9560
9561   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9562      might not have the luxury of section headers.  Look for the DT_NULL
9563      terminator to determine the number of entries.  */
9564   for (ext = edyn, dynamic_nent = 0;
9565        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9566        ext++)
9567     {
9568       dynamic_nent++;
9569       if (BYTE_GET (ext->d_tag) == DT_NULL)
9570         break;
9571     }
9572
9573   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9574                                                   sizeof (* entry));
9575   if (dynamic_section == NULL)
9576     {
9577       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9578              (unsigned long) dynamic_nent);
9579       free (edyn);
9580       return FALSE;
9581     }
9582
9583   for (ext = edyn, entry = dynamic_section;
9584        entry < dynamic_section + dynamic_nent;
9585        ext++, entry++)
9586     {
9587       entry->d_tag      = BYTE_GET (ext->d_tag);
9588       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9589     }
9590
9591   free (edyn);
9592
9593   return TRUE;
9594 }
9595
9596 static bfd_boolean
9597 get_64bit_dynamic_section (Filedata * filedata)
9598 {
9599   Elf64_External_Dyn * edyn;
9600   Elf64_External_Dyn * ext;
9601   Elf_Internal_Dyn * entry;
9602
9603   /* Read in the data.  */
9604   edyn = (Elf64_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9605                                           dynamic_size, _("dynamic section"));
9606   if (!edyn)
9607     return FALSE;
9608
9609   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9610      might not have the luxury of section headers.  Look for the DT_NULL
9611      terminator to determine the number of entries.  */
9612   for (ext = edyn, dynamic_nent = 0;
9613        /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer.  */
9614        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9615        ext++)
9616     {
9617       dynamic_nent++;
9618       if (BYTE_GET (ext->d_tag) == DT_NULL)
9619         break;
9620     }
9621
9622   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9623                                                   sizeof (* entry));
9624   if (dynamic_section == NULL)
9625     {
9626       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9627              (unsigned long) dynamic_nent);
9628       free (edyn);
9629       return FALSE;
9630     }
9631
9632   /* Convert from external to internal formats.  */
9633   for (ext = edyn, entry = dynamic_section;
9634        entry < dynamic_section + dynamic_nent;
9635        ext++, entry++)
9636     {
9637       entry->d_tag      = BYTE_GET (ext->d_tag);
9638       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9639     }
9640
9641   free (edyn);
9642
9643   return TRUE;
9644 }
9645
9646 static void
9647 print_dynamic_flags (bfd_vma flags)
9648 {
9649   bfd_boolean first = TRUE;
9650
9651   while (flags)
9652     {
9653       bfd_vma flag;
9654
9655       flag = flags & - flags;
9656       flags &= ~ flag;
9657
9658       if (first)
9659         first = FALSE;
9660       else
9661         putc (' ', stdout);
9662
9663       switch (flag)
9664         {
9665         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
9666         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
9667         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
9668         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
9669         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
9670         default:                fputs (_("unknown"), stdout); break;
9671         }
9672     }
9673   puts ("");
9674 }
9675
9676 /* Parse and display the contents of the dynamic section.  */
9677
9678 static bfd_boolean
9679 process_dynamic_section (Filedata * filedata)
9680 {
9681   Elf_Internal_Dyn * entry;
9682
9683   if (dynamic_size == 0)
9684     {
9685       if (do_dynamic)
9686         printf (_("\nThere is no dynamic section in this file.\n"));
9687
9688       return TRUE;
9689     }
9690
9691   if (is_32bit_elf)
9692     {
9693       if (! get_32bit_dynamic_section (filedata))
9694         return FALSE;
9695     }
9696   else
9697     {
9698       if (! get_64bit_dynamic_section (filedata))
9699         return FALSE;
9700     }
9701
9702   /* Find the appropriate symbol table.  */
9703   if (dynamic_symbols == NULL)
9704     {
9705       for (entry = dynamic_section;
9706            entry < dynamic_section + dynamic_nent;
9707            ++entry)
9708         {
9709           Elf_Internal_Shdr section;
9710
9711           if (entry->d_tag != DT_SYMTAB)
9712             continue;
9713
9714           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9715
9716           /* Since we do not know how big the symbol table is,
9717              we default to reading in the entire file (!) and
9718              processing that.  This is overkill, I know, but it
9719              should work.  */
9720           section.sh_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9721           if ((bfd_size_type) section.sh_offset > filedata->file_size)
9722             {
9723               /* See PR 21379 for a reproducer.  */
9724               error (_("Invalid DT_SYMTAB entry: %lx"), (long) section.sh_offset);
9725               return FALSE;
9726             }
9727
9728           if (archive_file_offset != 0)
9729             section.sh_size = archive_file_size - section.sh_offset;
9730           else
9731             section.sh_size = filedata->file_size - section.sh_offset;
9732
9733           if (is_32bit_elf)
9734             section.sh_entsize = sizeof (Elf32_External_Sym);
9735           else
9736             section.sh_entsize = sizeof (Elf64_External_Sym);
9737           section.sh_name = filedata->string_table_length;
9738
9739           if (dynamic_symbols != NULL)
9740             {
9741               error (_("Multiple dynamic symbol table sections found\n"));
9742               free (dynamic_symbols);
9743             }
9744           dynamic_symbols = GET_ELF_SYMBOLS (filedata, &section, & num_dynamic_syms);
9745           if (num_dynamic_syms < 1)
9746             {
9747               error (_("Unable to determine the number of symbols to load\n"));
9748               continue;
9749             }
9750         }
9751     }
9752
9753   /* Similarly find a string table.  */
9754   if (dynamic_strings == NULL)
9755     {
9756       for (entry = dynamic_section;
9757            entry < dynamic_section + dynamic_nent;
9758            ++entry)
9759         {
9760           unsigned long offset;
9761           long str_tab_len;
9762
9763           if (entry->d_tag != DT_STRTAB)
9764             continue;
9765
9766           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9767
9768           /* Since we do not know how big the string table is,
9769              we default to reading in the entire file (!) and
9770              processing that.  This is overkill, I know, but it
9771              should work.  */
9772
9773           offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9774
9775           if (archive_file_offset != 0)
9776             str_tab_len = archive_file_size - offset;
9777           else
9778             str_tab_len = filedata->file_size - offset;
9779
9780           if (str_tab_len < 1)
9781             {
9782               error
9783                 (_("Unable to determine the length of the dynamic string table\n"));
9784               continue;
9785             }
9786
9787           if (dynamic_strings != NULL)
9788             {
9789               error (_("Multiple dynamic string tables found\n"));
9790               free (dynamic_strings);
9791             }
9792
9793           dynamic_strings = (char *) get_data (NULL, filedata, offset, 1,
9794                                                str_tab_len,
9795                                                _("dynamic string table"));
9796           dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9797         }
9798     }
9799
9800   /* And find the syminfo section if available.  */
9801   if (dynamic_syminfo == NULL)
9802     {
9803       unsigned long syminsz = 0;
9804
9805       for (entry = dynamic_section;
9806            entry < dynamic_section + dynamic_nent;
9807            ++entry)
9808         {
9809           if (entry->d_tag == DT_SYMINENT)
9810             {
9811               /* Note: these braces are necessary to avoid a syntax
9812                  error from the SunOS4 C compiler.  */
9813               /* PR binutils/17531: A corrupt file can trigger this test.
9814                  So do not use an assert, instead generate an error message.  */
9815               if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9816                 error (_("Bad value (%d) for SYMINENT entry\n"),
9817                        (int) entry->d_un.d_val);
9818             }
9819           else if (entry->d_tag == DT_SYMINSZ)
9820             syminsz = entry->d_un.d_val;
9821           else if (entry->d_tag == DT_SYMINFO)
9822             dynamic_syminfo_offset = offset_from_vma (filedata, entry->d_un.d_val,
9823                                                       syminsz);
9824         }
9825
9826       if (dynamic_syminfo_offset != 0 && syminsz != 0)
9827         {
9828           Elf_External_Syminfo * extsyminfo;
9829           Elf_External_Syminfo * extsym;
9830           Elf_Internal_Syminfo * syminfo;
9831
9832           /* There is a syminfo section.  Read the data.  */
9833           extsyminfo = (Elf_External_Syminfo *)
9834               get_data (NULL, filedata, dynamic_syminfo_offset, 1, syminsz,
9835                         _("symbol information"));
9836           if (!extsyminfo)
9837             return FALSE;
9838
9839           if (dynamic_syminfo != NULL)
9840             {
9841               error (_("Multiple dynamic symbol information sections found\n"));
9842               free (dynamic_syminfo);
9843             }
9844           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9845           if (dynamic_syminfo == NULL)
9846             {
9847               error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9848                      (unsigned long) syminsz);
9849               return FALSE;
9850             }
9851
9852           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9853           for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9854                syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9855                ++syminfo, ++extsym)
9856             {
9857               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9858               syminfo->si_flags = BYTE_GET (extsym->si_flags);
9859             }
9860
9861           free (extsyminfo);
9862         }
9863     }
9864
9865   if (do_dynamic && dynamic_addr)
9866     printf (ngettext ("\nDynamic section at offset 0x%lx "
9867                       "contains %lu entry:\n",
9868                       "\nDynamic section at offset 0x%lx "
9869                       "contains %lu entries:\n",
9870                       dynamic_nent),
9871             dynamic_addr, (unsigned long) dynamic_nent);
9872   if (do_dynamic)
9873     printf (_("  Tag        Type                         Name/Value\n"));
9874
9875   for (entry = dynamic_section;
9876        entry < dynamic_section + dynamic_nent;
9877        entry++)
9878     {
9879       if (do_dynamic)
9880         {
9881           const char * dtype;
9882
9883           putchar (' ');
9884           print_vma (entry->d_tag, FULL_HEX);
9885           dtype = get_dynamic_type (filedata, entry->d_tag);
9886           printf (" (%s)%*s", dtype,
9887                   ((is_32bit_elf ? 27 : 19) - (int) strlen (dtype)), " ");
9888         }
9889
9890       switch (entry->d_tag)
9891         {
9892         case DT_FLAGS:
9893           if (do_dynamic)
9894             print_dynamic_flags (entry->d_un.d_val);
9895           break;
9896
9897         case DT_AUXILIARY:
9898         case DT_FILTER:
9899         case DT_CONFIG:
9900         case DT_DEPAUDIT:
9901         case DT_AUDIT:
9902           if (do_dynamic)
9903             {
9904               switch (entry->d_tag)
9905                 {
9906                 case DT_AUXILIARY:
9907                   printf (_("Auxiliary library"));
9908                   break;
9909
9910                 case DT_FILTER:
9911                   printf (_("Filter library"));
9912                   break;
9913
9914                 case DT_CONFIG:
9915                   printf (_("Configuration file"));
9916                   break;
9917
9918                 case DT_DEPAUDIT:
9919                   printf (_("Dependency audit library"));
9920                   break;
9921
9922                 case DT_AUDIT:
9923                   printf (_("Audit library"));
9924                   break;
9925                 }
9926
9927               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9928                 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9929               else
9930                 {
9931                   printf (": ");
9932                   print_vma (entry->d_un.d_val, PREFIX_HEX);
9933                   putchar ('\n');
9934                 }
9935             }
9936           break;
9937
9938         case DT_FEATURE:
9939           if (do_dynamic)
9940             {
9941               printf (_("Flags:"));
9942
9943               if (entry->d_un.d_val == 0)
9944                 printf (_(" None\n"));
9945               else
9946                 {
9947                   unsigned long int val = entry->d_un.d_val;
9948
9949                   if (val & DTF_1_PARINIT)
9950                     {
9951                       printf (" PARINIT");
9952                       val ^= DTF_1_PARINIT;
9953                     }
9954                   if (val & DTF_1_CONFEXP)
9955                     {
9956                       printf (" CONFEXP");
9957                       val ^= DTF_1_CONFEXP;
9958                     }
9959                   if (val != 0)
9960                     printf (" %lx", val);
9961                   puts ("");
9962                 }
9963             }
9964           break;
9965
9966         case DT_POSFLAG_1:
9967           if (do_dynamic)
9968             {
9969               printf (_("Flags:"));
9970
9971               if (entry->d_un.d_val == 0)
9972                 printf (_(" None\n"));
9973               else
9974                 {
9975                   unsigned long int val = entry->d_un.d_val;
9976
9977                   if (val & DF_P1_LAZYLOAD)
9978                     {
9979                       printf (" LAZYLOAD");
9980                       val ^= DF_P1_LAZYLOAD;
9981                     }
9982                   if (val & DF_P1_GROUPPERM)
9983                     {
9984                       printf (" GROUPPERM");
9985                       val ^= DF_P1_GROUPPERM;
9986                     }
9987                   if (val != 0)
9988                     printf (" %lx", val);
9989                   puts ("");
9990                 }
9991             }
9992           break;
9993
9994         case DT_FLAGS_1:
9995           if (do_dynamic)
9996             {
9997               printf (_("Flags:"));
9998               if (entry->d_un.d_val == 0)
9999                 printf (_(" None\n"));
10000               else
10001                 {
10002                   unsigned long int val = entry->d_un.d_val;
10003
10004                   if (val & DF_1_NOW)
10005                     {
10006                       printf (" NOW");
10007                       val ^= DF_1_NOW;
10008                     }
10009                   if (val & DF_1_GLOBAL)
10010                     {
10011                       printf (" GLOBAL");
10012                       val ^= DF_1_GLOBAL;
10013                     }
10014                   if (val & DF_1_GROUP)
10015                     {
10016                       printf (" GROUP");
10017                       val ^= DF_1_GROUP;
10018                     }
10019                   if (val & DF_1_NODELETE)
10020                     {
10021                       printf (" NODELETE");
10022                       val ^= DF_1_NODELETE;
10023                     }
10024                   if (val & DF_1_LOADFLTR)
10025                     {
10026                       printf (" LOADFLTR");
10027                       val ^= DF_1_LOADFLTR;
10028                     }
10029                   if (val & DF_1_INITFIRST)
10030                     {
10031                       printf (" INITFIRST");
10032                       val ^= DF_1_INITFIRST;
10033                     }
10034                   if (val & DF_1_NOOPEN)
10035                     {
10036                       printf (" NOOPEN");
10037                       val ^= DF_1_NOOPEN;
10038                     }
10039                   if (val & DF_1_ORIGIN)
10040                     {
10041                       printf (" ORIGIN");
10042                       val ^= DF_1_ORIGIN;
10043                     }
10044                   if (val & DF_1_DIRECT)
10045                     {
10046                       printf (" DIRECT");
10047                       val ^= DF_1_DIRECT;
10048                     }
10049                   if (val & DF_1_TRANS)
10050                     {
10051                       printf (" TRANS");
10052                       val ^= DF_1_TRANS;
10053                     }
10054                   if (val & DF_1_INTERPOSE)
10055                     {
10056                       printf (" INTERPOSE");
10057                       val ^= DF_1_INTERPOSE;
10058                     }
10059                   if (val & DF_1_NODEFLIB)
10060                     {
10061                       printf (" NODEFLIB");
10062                       val ^= DF_1_NODEFLIB;
10063                     }
10064                   if (val & DF_1_NODUMP)
10065                     {
10066                       printf (" NODUMP");
10067                       val ^= DF_1_NODUMP;
10068                     }
10069                   if (val & DF_1_CONFALT)
10070                     {
10071                       printf (" CONFALT");
10072                       val ^= DF_1_CONFALT;
10073                     }
10074                   if (val & DF_1_ENDFILTEE)
10075                     {
10076                       printf (" ENDFILTEE");
10077                       val ^= DF_1_ENDFILTEE;
10078                     }
10079                   if (val & DF_1_DISPRELDNE)
10080                     {
10081                       printf (" DISPRELDNE");
10082                       val ^= DF_1_DISPRELDNE;
10083                     }
10084                   if (val & DF_1_DISPRELPND)
10085                     {
10086                       printf (" DISPRELPND");
10087                       val ^= DF_1_DISPRELPND;
10088                     }
10089                   if (val & DF_1_NODIRECT)
10090                     {
10091                       printf (" NODIRECT");
10092                       val ^= DF_1_NODIRECT;
10093                     }
10094                   if (val & DF_1_IGNMULDEF)
10095                     {
10096                       printf (" IGNMULDEF");
10097                       val ^= DF_1_IGNMULDEF;
10098                     }
10099                   if (val & DF_1_NOKSYMS)
10100                     {
10101                       printf (" NOKSYMS");
10102                       val ^= DF_1_NOKSYMS;
10103                     }
10104                   if (val & DF_1_NOHDR)
10105                     {
10106                       printf (" NOHDR");
10107                       val ^= DF_1_NOHDR;
10108                     }
10109                   if (val & DF_1_EDITED)
10110                     {
10111                       printf (" EDITED");
10112                       val ^= DF_1_EDITED;
10113                     }
10114                   if (val & DF_1_NORELOC)
10115                     {
10116                       printf (" NORELOC");
10117                       val ^= DF_1_NORELOC;
10118                     }
10119                   if (val & DF_1_SYMINTPOSE)
10120                     {
10121                       printf (" SYMINTPOSE");
10122                       val ^= DF_1_SYMINTPOSE;
10123                     }
10124                   if (val & DF_1_GLOBAUDIT)
10125                     {
10126                       printf (" GLOBAUDIT");
10127                       val ^= DF_1_GLOBAUDIT;
10128                     }
10129                   if (val & DF_1_SINGLETON)
10130                     {
10131                       printf (" SINGLETON");
10132                       val ^= DF_1_SINGLETON;
10133                     }
10134                   if (val & DF_1_STUB)
10135                     {
10136                       printf (" STUB");
10137                       val ^= DF_1_STUB;
10138                     }
10139                   if (val & DF_1_PIE)
10140                     {
10141                       printf (" PIE");
10142                       val ^= DF_1_PIE;
10143                     }
10144                   if (val & DF_1_KMOD)
10145                     {
10146                       printf (" KMOD");
10147                       val ^= DF_1_KMOD;
10148                     }
10149                   if (val & DF_1_WEAKFILTER)
10150                     {
10151                       printf (" WEAKFILTER");
10152                       val ^= DF_1_WEAKFILTER;
10153                     }
10154                   if (val & DF_1_NOCOMMON)
10155                     {
10156                       printf (" NOCOMMON");
10157                       val ^= DF_1_NOCOMMON;
10158                     }
10159                   if (val != 0)
10160                     printf (" %lx", val);
10161                   puts ("");
10162                 }
10163             }
10164           break;
10165
10166         case DT_PLTREL:
10167           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10168           if (do_dynamic)
10169             puts (get_dynamic_type (filedata, entry->d_un.d_val));
10170           break;
10171
10172         case DT_NULL    :
10173         case DT_NEEDED  :
10174         case DT_PLTGOT  :
10175         case DT_HASH    :
10176         case DT_STRTAB  :
10177         case DT_SYMTAB  :
10178         case DT_RELA    :
10179         case DT_INIT    :
10180         case DT_FINI    :
10181         case DT_SONAME  :
10182         case DT_RPATH   :
10183         case DT_SYMBOLIC:
10184         case DT_REL     :
10185         case DT_DEBUG   :
10186         case DT_TEXTREL :
10187         case DT_JMPREL  :
10188         case DT_RUNPATH :
10189           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10190
10191           if (do_dynamic)
10192             {
10193               char * name;
10194
10195               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
10196                 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10197               else
10198                 name = NULL;
10199
10200               if (name)
10201                 {
10202                   switch (entry->d_tag)
10203                     {
10204                     case DT_NEEDED:
10205                       printf (_("Shared library: [%s]"), name);
10206
10207                       if (streq (name, program_interpreter))
10208                         printf (_(" program interpreter"));
10209                       break;
10210
10211                     case DT_SONAME:
10212                       printf (_("Library soname: [%s]"), name);
10213                       break;
10214
10215                     case DT_RPATH:
10216                       printf (_("Library rpath: [%s]"), name);
10217                       break;
10218
10219                     case DT_RUNPATH:
10220                       printf (_("Library runpath: [%s]"), name);
10221                       break;
10222
10223                     default:
10224                       print_vma (entry->d_un.d_val, PREFIX_HEX);
10225                       break;
10226                     }
10227                 }
10228               else
10229                 print_vma (entry->d_un.d_val, PREFIX_HEX);
10230
10231               putchar ('\n');
10232             }
10233           break;
10234
10235         case DT_PLTRELSZ:
10236         case DT_RELASZ  :
10237         case DT_STRSZ   :
10238         case DT_RELSZ   :
10239         case DT_RELAENT :
10240         case DT_SYMENT  :
10241         case DT_RELENT  :
10242           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10243           /* Fall through.  */
10244         case DT_PLTPADSZ:
10245         case DT_MOVEENT :
10246         case DT_MOVESZ  :
10247         case DT_INIT_ARRAYSZ:
10248         case DT_FINI_ARRAYSZ:
10249         case DT_GNU_CONFLICTSZ:
10250         case DT_GNU_LIBLISTSZ:
10251           if (do_dynamic)
10252             {
10253               print_vma (entry->d_un.d_val, UNSIGNED);
10254               printf (_(" (bytes)\n"));
10255             }
10256           break;
10257
10258         case DT_VERDEFNUM:
10259         case DT_VERNEEDNUM:
10260         case DT_RELACOUNT:
10261         case DT_RELCOUNT:
10262           if (do_dynamic)
10263             {
10264               print_vma (entry->d_un.d_val, UNSIGNED);
10265               putchar ('\n');
10266             }
10267           break;
10268
10269         case DT_SYMINSZ:
10270         case DT_SYMINENT:
10271         case DT_SYMINFO:
10272         case DT_USED:
10273         case DT_INIT_ARRAY:
10274         case DT_FINI_ARRAY:
10275           if (do_dynamic)
10276             {
10277               if (entry->d_tag == DT_USED
10278                   && VALID_DYNAMIC_NAME (entry->d_un.d_val))
10279                 {
10280                   char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10281
10282                   if (*name)
10283                     {
10284                       printf (_("Not needed object: [%s]\n"), name);
10285                       break;
10286                     }
10287                 }
10288
10289               print_vma (entry->d_un.d_val, PREFIX_HEX);
10290               putchar ('\n');
10291             }
10292           break;
10293
10294         case DT_BIND_NOW:
10295           /* The value of this entry is ignored.  */
10296           if (do_dynamic)
10297             putchar ('\n');
10298           break;
10299
10300         case DT_GNU_PRELINKED:
10301           if (do_dynamic)
10302             {
10303               struct tm * tmp;
10304               time_t atime = entry->d_un.d_val;
10305
10306               tmp = gmtime (&atime);
10307               /* PR 17533 file: 041-1244816-0.004.  */
10308               if (tmp == NULL)
10309                 printf (_("<corrupt time val: %lx"),
10310                         (unsigned long) atime);
10311               else
10312                 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
10313                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
10314                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
10315
10316             }
10317           break;
10318
10319         case DT_GNU_HASH:
10320           dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
10321           if (do_dynamic)
10322             {
10323               print_vma (entry->d_un.d_val, PREFIX_HEX);
10324               putchar ('\n');
10325             }
10326           break;
10327
10328         default:
10329           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
10330             version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
10331               entry->d_un.d_val;
10332
10333           if (do_dynamic)
10334             {
10335               switch (filedata->file_header.e_machine)
10336                 {
10337                 case EM_MIPS:
10338                 case EM_MIPS_RS3_LE:
10339                   dynamic_section_mips_val (entry);
10340                   break;
10341                 case EM_PARISC:
10342                   dynamic_section_parisc_val (entry);
10343                   break;
10344                 case EM_IA_64:
10345                   dynamic_section_ia64_val (entry);
10346                   break;
10347                 default:
10348                   print_vma (entry->d_un.d_val, PREFIX_HEX);
10349                   putchar ('\n');
10350                 }
10351             }
10352           break;
10353         }
10354     }
10355
10356   return TRUE;
10357 }
10358
10359 static char *
10360 get_ver_flags (unsigned int flags)
10361 {
10362   static char buff[128];
10363
10364   buff[0] = 0;
10365
10366   if (flags == 0)
10367     return _("none");
10368
10369   if (flags & VER_FLG_BASE)
10370     strcat (buff, "BASE");
10371
10372   if (flags & VER_FLG_WEAK)
10373     {
10374       if (flags & VER_FLG_BASE)
10375         strcat (buff, " | ");
10376
10377       strcat (buff, "WEAK");
10378     }
10379
10380   if (flags & VER_FLG_INFO)
10381     {
10382       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
10383         strcat (buff, " | ");
10384
10385       strcat (buff, "INFO");
10386     }
10387
10388   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10389     {
10390       if (flags & (VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10391         strcat (buff, " | ");
10392
10393       strcat (buff, _("<unknown>"));
10394     }
10395
10396   return buff;
10397 }
10398
10399 /* Display the contents of the version sections.  */
10400
10401 static bfd_boolean
10402 process_version_sections (Filedata * filedata)
10403 {
10404   Elf_Internal_Shdr * section;
10405   unsigned i;
10406   bfd_boolean found = FALSE;
10407
10408   if (! do_version)
10409     return TRUE;
10410
10411   for (i = 0, section = filedata->section_headers;
10412        i < filedata->file_header.e_shnum;
10413        i++, section++)
10414     {
10415       switch (section->sh_type)
10416         {
10417         case SHT_GNU_verdef:
10418           {
10419             Elf_External_Verdef * edefs;
10420             unsigned long idx;
10421             unsigned long cnt;
10422             char * endbuf;
10423
10424             found = TRUE;
10425
10426             printf (ngettext ("\nVersion definition section '%s' "
10427                               "contains %u entry:\n",
10428                               "\nVersion definition section '%s' "
10429                               "contains %u entries:\n",
10430                               section->sh_info),
10431                     printable_section_name (filedata, section),
10432                     section->sh_info);
10433
10434             printf (_("  Addr: 0x"));
10435             printf_vma (section->sh_addr);
10436             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10437                     (unsigned long) section->sh_offset, section->sh_link,
10438                     printable_section_name_from_index (filedata, section->sh_link));
10439
10440             edefs = (Elf_External_Verdef *)
10441                 get_data (NULL, filedata, section->sh_offset, 1,section->sh_size,
10442                           _("version definition section"));
10443             if (!edefs)
10444               break;
10445             endbuf = (char *) edefs + section->sh_size;
10446
10447             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10448               {
10449                 char * vstart;
10450                 Elf_External_Verdef * edef;
10451                 Elf_Internal_Verdef ent;
10452                 Elf_External_Verdaux * eaux;
10453                 Elf_Internal_Verdaux aux;
10454                 unsigned long isum;
10455                 int j;
10456
10457                 vstart = ((char *) edefs) + idx;
10458                 if (vstart + sizeof (*edef) > endbuf)
10459                   break;
10460
10461                 edef = (Elf_External_Verdef *) vstart;
10462
10463                 ent.vd_version = BYTE_GET (edef->vd_version);
10464                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
10465                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
10466                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
10467                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
10468                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
10469                 ent.vd_next    = BYTE_GET (edef->vd_next);
10470
10471                 printf (_("  %#06lx: Rev: %d  Flags: %s"),
10472                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
10473
10474                 printf (_("  Index: %d  Cnt: %d  "),
10475                         ent.vd_ndx, ent.vd_cnt);
10476
10477                 /* Check for overflow.  */
10478                 if (ent.vd_aux > (size_t) (endbuf - vstart))
10479                   break;
10480
10481                 vstart += ent.vd_aux;
10482
10483                 if (vstart + sizeof (*eaux) > endbuf)
10484                   break;
10485                 eaux = (Elf_External_Verdaux *) vstart;
10486
10487                 aux.vda_name = BYTE_GET (eaux->vda_name);
10488                 aux.vda_next = BYTE_GET (eaux->vda_next);
10489
10490                 if (VALID_DYNAMIC_NAME (aux.vda_name))
10491                   printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
10492                 else
10493                   printf (_("Name index: %ld\n"), aux.vda_name);
10494
10495                 isum = idx + ent.vd_aux;
10496
10497                 for (j = 1; j < ent.vd_cnt; j++)
10498                   {
10499                     if (aux.vda_next < sizeof (*eaux)
10500                         && !(j == ent.vd_cnt - 1 && aux.vda_next == 0))
10501                       {
10502                         warn (_("Invalid vda_next field of %lx\n"),
10503                               aux.vda_next);
10504                         j = ent.vd_cnt;
10505                         break;
10506                       }
10507                     /* Check for overflow.  */
10508                     if (aux.vda_next > (size_t) (endbuf - vstart))
10509                       break;
10510
10511                     isum   += aux.vda_next;
10512                     vstart += aux.vda_next;
10513
10514                     if (vstart + sizeof (*eaux) > endbuf)
10515                       break;
10516                     eaux = (Elf_External_Verdaux *) vstart;
10517
10518                     aux.vda_name = BYTE_GET (eaux->vda_name);
10519                     aux.vda_next = BYTE_GET (eaux->vda_next);
10520
10521                     if (VALID_DYNAMIC_NAME (aux.vda_name))
10522                       printf (_("  %#06lx: Parent %d: %s\n"),
10523                               isum, j, GET_DYNAMIC_NAME (aux.vda_name));
10524                     else
10525                       printf (_("  %#06lx: Parent %d, name index: %ld\n"),
10526                               isum, j, aux.vda_name);
10527                   }
10528
10529                 if (j < ent.vd_cnt)
10530                   printf (_("  Version def aux past end of section\n"));
10531
10532                 /* PR 17531:
10533                    file: id:000001,src:000172+005151,op:splice,rep:2.  */
10534                 if (ent.vd_next < sizeof (*edef)
10535                     && !(cnt == section->sh_info - 1 && ent.vd_next == 0))
10536                   {
10537                     warn (_("Invalid vd_next field of %lx\n"), ent.vd_next);
10538                     cnt = section->sh_info;
10539                     break;
10540                   }
10541                 if (ent.vd_next > (size_t) (endbuf - ((char *) edefs + idx)))
10542                   break;
10543
10544                 idx += ent.vd_next;
10545               }
10546
10547             if (cnt < section->sh_info)
10548               printf (_("  Version definition past end of section\n"));
10549
10550             free (edefs);
10551           }
10552           break;
10553
10554         case SHT_GNU_verneed:
10555           {
10556             Elf_External_Verneed * eneed;
10557             unsigned long idx;
10558             unsigned long cnt;
10559             char * endbuf;
10560
10561             found = TRUE;
10562
10563             printf (ngettext ("\nVersion needs section '%s' "
10564                               "contains %u entry:\n",
10565                               "\nVersion needs section '%s' "
10566                               "contains %u entries:\n",
10567                               section->sh_info),
10568                     printable_section_name (filedata, section), section->sh_info);
10569
10570             printf (_(" Addr: 0x"));
10571             printf_vma (section->sh_addr);
10572             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10573                     (unsigned long) section->sh_offset, section->sh_link,
10574                     printable_section_name_from_index (filedata, section->sh_link));
10575
10576             eneed = (Elf_External_Verneed *) get_data (NULL, filedata,
10577                                                        section->sh_offset, 1,
10578                                                        section->sh_size,
10579                                                        _("Version Needs section"));
10580             if (!eneed)
10581               break;
10582             endbuf = (char *) eneed + section->sh_size;
10583
10584             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10585               {
10586                 Elf_External_Verneed * entry;
10587                 Elf_Internal_Verneed ent;
10588                 unsigned long isum;
10589                 int j;
10590                 char * vstart;
10591
10592                 vstart = ((char *) eneed) + idx;
10593                 if (vstart + sizeof (*entry) > endbuf)
10594                   break;
10595
10596                 entry = (Elf_External_Verneed *) vstart;
10597
10598                 ent.vn_version = BYTE_GET (entry->vn_version);
10599                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
10600                 ent.vn_file    = BYTE_GET (entry->vn_file);
10601                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
10602                 ent.vn_next    = BYTE_GET (entry->vn_next);
10603
10604                 printf (_("  %#06lx: Version: %d"), idx, ent.vn_version);
10605
10606                 if (VALID_DYNAMIC_NAME (ent.vn_file))
10607                   printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
10608                 else
10609                   printf (_("  File: %lx"), ent.vn_file);
10610
10611                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
10612
10613                 /* Check for overflow.  */
10614                 if (ent.vn_aux > (size_t) (endbuf - vstart))
10615                   break;
10616                 vstart += ent.vn_aux;
10617
10618                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10619                   {
10620                     Elf_External_Vernaux * eaux;
10621                     Elf_Internal_Vernaux aux;
10622
10623                     if (vstart + sizeof (*eaux) > endbuf)
10624                       break;
10625                     eaux = (Elf_External_Vernaux *) vstart;
10626
10627                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
10628                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
10629                     aux.vna_other = BYTE_GET (eaux->vna_other);
10630                     aux.vna_name  = BYTE_GET (eaux->vna_name);
10631                     aux.vna_next  = BYTE_GET (eaux->vna_next);
10632
10633                     if (VALID_DYNAMIC_NAME (aux.vna_name))
10634                       printf (_("  %#06lx:   Name: %s"),
10635                               isum, GET_DYNAMIC_NAME (aux.vna_name));
10636                     else
10637                       printf (_("  %#06lx:   Name index: %lx"),
10638                               isum, aux.vna_name);
10639
10640                     printf (_("  Flags: %s  Version: %d\n"),
10641                             get_ver_flags (aux.vna_flags), aux.vna_other);
10642
10643                     if (aux.vna_next < sizeof (*eaux)
10644                         && !(j == ent.vn_cnt - 1 && aux.vna_next == 0))
10645                       {
10646                         warn (_("Invalid vna_next field of %lx\n"),
10647                               aux.vna_next);
10648                         j = ent.vn_cnt;
10649                         break;
10650                       }
10651                     /* Check for overflow.  */
10652                     if (aux.vna_next > (size_t) (endbuf - vstart))
10653                       break;
10654                     isum   += aux.vna_next;
10655                     vstart += aux.vna_next;
10656                   }
10657
10658                 if (j < ent.vn_cnt)
10659                   warn (_("Missing Version Needs auxillary information\n"));
10660
10661                 if (ent.vn_next < sizeof (*entry)
10662                     && !(cnt == section->sh_info - 1 && ent.vn_next == 0))
10663                   {
10664                     warn (_("Invalid vn_next field of %lx\n"), ent.vn_next);
10665                     cnt = section->sh_info;
10666                     break;
10667                   }
10668                 if (ent.vn_next > (size_t) (endbuf - ((char *) eneed + idx)))
10669                   break;
10670                 idx += ent.vn_next;
10671               }
10672
10673             if (cnt < section->sh_info)
10674               warn (_("Missing Version Needs information\n"));
10675
10676             free (eneed);
10677           }
10678           break;
10679
10680         case SHT_GNU_versym:
10681           {
10682             Elf_Internal_Shdr * link_section;
10683             size_t total;
10684             unsigned int cnt;
10685             unsigned char * edata;
10686             unsigned short * data;
10687             char * strtab;
10688             Elf_Internal_Sym * symbols;
10689             Elf_Internal_Shdr * string_sec;
10690             unsigned long num_syms;
10691             long off;
10692
10693             if (section->sh_link >= filedata->file_header.e_shnum)
10694               break;
10695
10696             link_section = filedata->section_headers + section->sh_link;
10697             total = section->sh_size / sizeof (Elf_External_Versym);
10698
10699             if (link_section->sh_link >= filedata->file_header.e_shnum)
10700               break;
10701
10702             found = TRUE;
10703
10704             symbols = GET_ELF_SYMBOLS (filedata, link_section, & num_syms);
10705             if (symbols == NULL)
10706               break;
10707
10708             string_sec = filedata->section_headers + link_section->sh_link;
10709
10710             strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
10711                                         string_sec->sh_size,
10712                                         _("version string table"));
10713             if (!strtab)
10714               {
10715                 free (symbols);
10716                 break;
10717               }
10718
10719             printf (ngettext ("\nVersion symbols section '%s' "
10720                               "contains %lu entry:\n",
10721                               "\nVersion symbols section '%s' "
10722                               "contains %lu entries:\n",
10723                               total),
10724                     printable_section_name (filedata, section), (unsigned long) total);
10725
10726             printf (_(" Addr: "));
10727             printf_vma (section->sh_addr);
10728             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10729                     (unsigned long) section->sh_offset, section->sh_link,
10730                     printable_section_name (filedata, link_section));
10731
10732             off = offset_from_vma (filedata,
10733                                    version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10734                                    total * sizeof (short));
10735             edata = (unsigned char *) get_data (NULL, filedata, off, total,
10736                                                 sizeof (short),
10737                                                 _("version symbol data"));
10738             if (!edata)
10739               {
10740                 free (strtab);
10741                 free (symbols);
10742                 break;
10743               }
10744
10745             data = (short unsigned int *) cmalloc (total, sizeof (short));
10746
10747             for (cnt = total; cnt --;)
10748               data[cnt] = byte_get (edata + cnt * sizeof (short),
10749                                     sizeof (short));
10750
10751             free (edata);
10752
10753             for (cnt = 0; cnt < total; cnt += 4)
10754               {
10755                 int j, nn;
10756                 char *name;
10757                 char *invalid = _("*invalid*");
10758
10759                 printf ("  %03x:", cnt);
10760
10761                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10762                   switch (data[cnt + j])
10763                     {
10764                     case 0:
10765                       fputs (_("   0 (*local*)    "), stdout);
10766                       break;
10767
10768                     case 1:
10769                       fputs (_("   1 (*global*)   "), stdout);
10770                       break;
10771
10772                     default:
10773                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10774                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10775
10776                       /* If this index value is greater than the size of the symbols
10777                          array, break to avoid an out-of-bounds read.  */
10778                       if ((unsigned long)(cnt + j) >= num_syms)
10779                         {
10780                           warn (_("invalid index into symbol array\n"));
10781                           break;
10782                         }
10783
10784                       name = NULL;
10785                       if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10786                         {
10787                           Elf_Internal_Verneed ivn;
10788                           unsigned long offset;
10789
10790                           offset = offset_from_vma
10791                             (filedata, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10792                              sizeof (Elf_External_Verneed));
10793
10794                           do
10795                             {
10796                               Elf_Internal_Vernaux ivna;
10797                               Elf_External_Verneed evn;
10798                               Elf_External_Vernaux evna;
10799                               unsigned long a_off;
10800
10801                               if (get_data (&evn, filedata, offset, sizeof (evn), 1,
10802                                             _("version need")) == NULL)
10803                                 break;
10804
10805                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10806                               ivn.vn_next = BYTE_GET (evn.vn_next);
10807
10808                               a_off = offset + ivn.vn_aux;
10809
10810                               do
10811                                 {
10812                                   if (get_data (&evna, filedata, a_off, sizeof (evna),
10813                                                 1, _("version need aux (2)")) == NULL)
10814                                     {
10815                                       ivna.vna_next  = 0;
10816                                       ivna.vna_other = 0;
10817                                     }
10818                                   else
10819                                     {
10820                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
10821                                       ivna.vna_other = BYTE_GET (evna.vna_other);
10822                                     }
10823
10824                                   a_off += ivna.vna_next;
10825                                 }
10826                               while (ivna.vna_other != data[cnt + j]
10827                                      && ivna.vna_next != 0);
10828
10829                               if (ivna.vna_other == data[cnt + j])
10830                                 {
10831                                   ivna.vna_name = BYTE_GET (evna.vna_name);
10832
10833                                   if (ivna.vna_name >= string_sec->sh_size)
10834                                     name = invalid;
10835                                   else
10836                                     name = strtab + ivna.vna_name;
10837                                   break;
10838                                 }
10839
10840                               offset += ivn.vn_next;
10841                             }
10842                           while (ivn.vn_next);
10843                         }
10844
10845                       if (data[cnt + j] != 0x8001
10846                           && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10847                         {
10848                           Elf_Internal_Verdef ivd;
10849                           Elf_External_Verdef evd;
10850                           unsigned long offset;
10851
10852                           offset = offset_from_vma
10853                             (filedata, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10854                              sizeof evd);
10855
10856                           do
10857                             {
10858                               if (get_data (&evd, filedata, offset, sizeof (evd), 1,
10859                                             _("version def")) == NULL)
10860                                 {
10861                                   ivd.vd_next = 0;
10862                                   /* PR 17531: file: 046-1082287-0.004.  */
10863                                   ivd.vd_ndx  = (data[cnt + j] & VERSYM_VERSION) + 1;
10864                                   break;
10865                                 }
10866                               else
10867                                 {
10868                                   ivd.vd_next = BYTE_GET (evd.vd_next);
10869                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
10870                                 }
10871
10872                               offset += ivd.vd_next;
10873                             }
10874                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10875                                  && ivd.vd_next != 0);
10876
10877                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10878                             {
10879                               Elf_External_Verdaux evda;
10880                               Elf_Internal_Verdaux ivda;
10881
10882                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
10883
10884                               if (get_data (&evda, filedata,
10885                                             offset - ivd.vd_next + ivd.vd_aux,
10886                                             sizeof (evda), 1,
10887                                             _("version def aux")) == NULL)
10888                                 break;
10889
10890                               ivda.vda_name = BYTE_GET (evda.vda_name);
10891
10892                               if (ivda.vda_name >= string_sec->sh_size)
10893                                 name = invalid;
10894                               else if (name != NULL && name != invalid)
10895                                 name = _("*both*");
10896                               else
10897                                 name = strtab + ivda.vda_name;
10898                             }
10899                         }
10900                       if (name != NULL)
10901                         nn += printf ("(%s%-*s",
10902                                       name,
10903                                       12 - (int) strlen (name),
10904                                       ")");
10905
10906                       if (nn < 18)
10907                         printf ("%*c", 18 - nn, ' ');
10908                     }
10909
10910                 putchar ('\n');
10911               }
10912
10913             free (data);
10914             free (strtab);
10915             free (symbols);
10916           }
10917           break;
10918
10919         default:
10920           break;
10921         }
10922     }
10923
10924   if (! found)
10925     printf (_("\nNo version information found in this file.\n"));
10926
10927   return TRUE;
10928 }
10929
10930 static const char *
10931 get_symbol_binding (Filedata * filedata, unsigned int binding)
10932 {
10933   static char buff[32];
10934
10935   switch (binding)
10936     {
10937     case STB_LOCAL:     return "LOCAL";
10938     case STB_GLOBAL:    return "GLOBAL";
10939     case STB_WEAK:      return "WEAK";
10940     default:
10941       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10942         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10943                   binding);
10944       else if (binding >= STB_LOOS && binding <= STB_HIOS)
10945         {
10946           if (binding == STB_GNU_UNIQUE
10947               && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10948                   /* GNU is still using the default value 0.  */
10949                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10950             return "UNIQUE";
10951           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10952         }
10953       else
10954         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
10955       return buff;
10956     }
10957 }
10958
10959 static const char *
10960 get_symbol_type (Filedata * filedata, unsigned int type)
10961 {
10962   static char buff[32];
10963
10964   switch (type)
10965     {
10966     case STT_NOTYPE:    return "NOTYPE";
10967     case STT_OBJECT:    return "OBJECT";
10968     case STT_FUNC:      return "FUNC";
10969     case STT_SECTION:   return "SECTION";
10970     case STT_FILE:      return "FILE";
10971     case STT_COMMON:    return "COMMON";
10972     case STT_TLS:       return "TLS";
10973     case STT_RELC:      return "RELC";
10974     case STT_SRELC:     return "SRELC";
10975     default:
10976       if (type >= STT_LOPROC && type <= STT_HIPROC)
10977         {
10978           if (filedata->file_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10979             return "THUMB_FUNC";
10980
10981           if (filedata->file_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
10982             return "REGISTER";
10983
10984           if (filedata->file_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10985             return "PARISC_MILLI";
10986
10987           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
10988         }
10989       else if (type >= STT_LOOS && type <= STT_HIOS)
10990         {
10991           if (filedata->file_header.e_machine == EM_PARISC)
10992             {
10993               if (type == STT_HP_OPAQUE)
10994                 return "HP_OPAQUE";
10995               if (type == STT_HP_STUB)
10996                 return "HP_STUB";
10997             }
10998
10999           if (type == STT_GNU_IFUNC
11000               && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
11001                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
11002                   /* GNU is still using the default value 0.  */
11003                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
11004             return "IFUNC";
11005
11006           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
11007         }
11008       else
11009         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
11010       return buff;
11011     }
11012 }
11013
11014 static const char *
11015 get_symbol_visibility (unsigned int visibility)
11016 {
11017   switch (visibility)
11018     {
11019     case STV_DEFAULT:   return "DEFAULT";
11020     case STV_INTERNAL:  return "INTERNAL";
11021     case STV_HIDDEN:    return "HIDDEN";
11022     case STV_PROTECTED: return "PROTECTED";
11023     default:
11024       error (_("Unrecognized visibility value: %u"), visibility);
11025       return _("<unknown>");
11026     }
11027 }
11028
11029 static const char *
11030 get_solaris_symbol_visibility (unsigned int visibility)
11031 {
11032   switch (visibility)
11033     {
11034     case 4: return "EXPORTED";
11035     case 5: return "SINGLETON";
11036     case 6: return "ELIMINATE";
11037     default: return get_symbol_visibility (visibility);
11038     }
11039 }
11040
11041 static const char *
11042 get_mips_symbol_other (unsigned int other)
11043 {
11044   switch (other)
11045     {
11046     case STO_OPTIONAL:      return "OPTIONAL";
11047     case STO_MIPS_PLT:      return "MIPS PLT";
11048     case STO_MIPS_PIC:      return "MIPS PIC";
11049     case STO_MICROMIPS:     return "MICROMIPS";
11050     case STO_MICROMIPS | STO_MIPS_PIC:      return "MICROMIPS, MIPS PIC";
11051     case STO_MIPS16:        return "MIPS16";
11052     default:                return NULL;
11053     }
11054 }
11055
11056 static const char *
11057 get_ia64_symbol_other (Filedata * filedata, unsigned int other)
11058 {
11059   if (is_ia64_vms (filedata))
11060     {
11061       static char res[32];
11062
11063       res[0] = 0;
11064
11065       /* Function types is for images and .STB files only.  */
11066       switch (filedata->file_header.e_type)
11067         {
11068         case ET_DYN:
11069         case ET_EXEC:
11070           switch (VMS_ST_FUNC_TYPE (other))
11071             {
11072             case VMS_SFT_CODE_ADDR:
11073               strcat (res, " CA");
11074               break;
11075             case VMS_SFT_SYMV_IDX:
11076               strcat (res, " VEC");
11077               break;
11078             case VMS_SFT_FD:
11079               strcat (res, " FD");
11080               break;
11081             case VMS_SFT_RESERVE:
11082               strcat (res, " RSV");
11083               break;
11084             default:
11085               warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
11086                     VMS_ST_FUNC_TYPE (other));
11087               strcat (res, " <unknown>");
11088               break;
11089             }
11090           break;
11091         default:
11092           break;
11093         }
11094       switch (VMS_ST_LINKAGE (other))
11095         {
11096         case VMS_STL_IGNORE:
11097           strcat (res, " IGN");
11098           break;
11099         case VMS_STL_RESERVE:
11100           strcat (res, " RSV");
11101           break;
11102         case VMS_STL_STD:
11103           strcat (res, " STD");
11104           break;
11105         case VMS_STL_LNK:
11106           strcat (res, " LNK");
11107           break;
11108         default:
11109           warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
11110                 VMS_ST_LINKAGE (other));
11111           strcat (res, " <unknown>");
11112           break;
11113         }
11114
11115       if (res[0] != 0)
11116         return res + 1;
11117       else
11118         return res;
11119     }
11120   return NULL;
11121 }
11122
11123 static const char *
11124 get_ppc64_symbol_other (unsigned int other)
11125 {
11126   if ((other & ~STO_PPC64_LOCAL_MASK) != 0)
11127     return NULL;
11128
11129   other >>= STO_PPC64_LOCAL_BIT;
11130   if (other <= 6)
11131     {
11132       static char buf[32];
11133       if (other >= 2)
11134         other = ppc64_decode_local_entry (other);
11135       snprintf (buf, sizeof buf, _("<localentry>: %d"), other);
11136       return buf;
11137     }
11138   return NULL;
11139 }
11140
11141 static const char *
11142 get_symbol_other (Filedata * filedata, unsigned int other)
11143 {
11144   const char * result = NULL;
11145   static char buff [32];
11146
11147   if (other == 0)
11148     return "";
11149
11150   switch (filedata->file_header.e_machine)
11151     {
11152     case EM_MIPS:
11153       result = get_mips_symbol_other (other);
11154       break;
11155     case EM_IA_64:
11156       result = get_ia64_symbol_other (filedata, other);
11157       break;
11158     case EM_PPC64:
11159       result = get_ppc64_symbol_other (other);
11160       break;
11161     default:
11162       result = NULL;
11163       break;
11164     }
11165
11166   if (result)
11167     return result;
11168
11169   snprintf (buff, sizeof buff, _("<other>: %x"), other);
11170   return buff;
11171 }
11172
11173 static const char *
11174 get_symbol_index_type (Filedata * filedata, unsigned int type)
11175 {
11176   static char buff[32];
11177
11178   switch (type)
11179     {
11180     case SHN_UNDEF:     return "UND";
11181     case SHN_ABS:       return "ABS";
11182     case SHN_COMMON:    return "COM";
11183     default:
11184       if (type == SHN_IA_64_ANSI_COMMON
11185           && filedata->file_header.e_machine == EM_IA_64
11186           && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
11187         return "ANSI_COM";
11188       else if ((filedata->file_header.e_machine == EM_X86_64
11189                 || filedata->file_header.e_machine == EM_L1OM
11190                 || filedata->file_header.e_machine == EM_K1OM)
11191                && type == SHN_X86_64_LCOMMON)
11192         return "LARGE_COM";
11193       else if ((type == SHN_MIPS_SCOMMON
11194                 && filedata->file_header.e_machine == EM_MIPS)
11195                || (type == SHN_TIC6X_SCOMMON
11196                    && filedata->file_header.e_machine == EM_TI_C6000))
11197         return "SCOM";
11198       else if (type == SHN_MIPS_SUNDEFINED
11199                && filedata->file_header.e_machine == EM_MIPS)
11200         return "SUND";
11201       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
11202         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
11203       else if (type >= SHN_LOOS && type <= SHN_HIOS)
11204         sprintf (buff, "OS [0x%04x]", type & 0xffff);
11205       else if (type >= SHN_LORESERVE)
11206         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
11207       else if (type >= filedata->file_header.e_shnum)
11208         sprintf (buff, _("bad section index[%3d]"), type);
11209       else
11210         sprintf (buff, "%3d", type);
11211       break;
11212     }
11213
11214   return buff;
11215 }
11216
11217 static bfd_vma *
11218 get_dynamic_data (Filedata * filedata, bfd_size_type number, unsigned int ent_size)
11219 {
11220   unsigned char * e_data;
11221   bfd_vma * i_data;
11222
11223   /* If the size_t type is smaller than the bfd_size_type, eg because
11224      you are building a 32-bit tool on a 64-bit host, then make sure
11225      that when (number) is cast to (size_t) no information is lost.  */
11226   if (sizeof (size_t) < sizeof (bfd_size_type)
11227       && (bfd_size_type) ((size_t) number) != number)
11228     {
11229       error (_("Size truncation prevents reading %s elements of size %u\n"),
11230              bfd_vmatoa ("u", number), ent_size);
11231       return NULL;
11232     }
11233
11234   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
11235      attempting to allocate memory when the read is bound to fail.  */
11236   if (ent_size * number > filedata->file_size)
11237     {
11238       error (_("Invalid number of dynamic entries: %s\n"),
11239              bfd_vmatoa ("u", number));
11240       return NULL;
11241     }
11242
11243   e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
11244   if (e_data == NULL)
11245     {
11246       error (_("Out of memory reading %s dynamic entries\n"),
11247              bfd_vmatoa ("u", number));
11248       return NULL;
11249     }
11250
11251   if (fread (e_data, ent_size, (size_t) number, filedata->handle) != number)
11252     {
11253       error (_("Unable to read in %s bytes of dynamic data\n"),
11254              bfd_vmatoa ("u", number * ent_size));
11255       free (e_data);
11256       return NULL;
11257     }
11258
11259   i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
11260   if (i_data == NULL)
11261     {
11262       error (_("Out of memory allocating space for %s dynamic entries\n"),
11263              bfd_vmatoa ("u", number));
11264       free (e_data);
11265       return NULL;
11266     }
11267
11268   while (number--)
11269     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
11270
11271   free (e_data);
11272
11273   return i_data;
11274 }
11275
11276 static void
11277 print_dynamic_symbol (Filedata * filedata, bfd_vma si, unsigned long hn)
11278 {
11279   Elf_Internal_Sym * psym;
11280   int n;
11281
11282   n = print_vma (si, DEC_5);
11283   if (n < 5)
11284     fputs (&"     "[n], stdout);
11285   printf (" %3lu: ", hn);
11286
11287   if (dynamic_symbols == NULL || si >= num_dynamic_syms)
11288     {
11289       printf (_("<No info available for dynamic symbol number %lu>\n"),
11290               (unsigned long) si);
11291       return;
11292     }
11293
11294   psym = dynamic_symbols + si;
11295   print_vma (psym->st_value, LONG_HEX);
11296   putchar (' ');
11297   print_vma (psym->st_size, DEC_5);
11298
11299   printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11300   printf (" %-6s",  get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11301
11302   if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11303     printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11304   else
11305     {
11306       unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11307
11308       printf (" %-7s",  get_symbol_visibility (vis));
11309       /* Check to see if any other bits in the st_other field are set.
11310          Note - displaying this information disrupts the layout of the
11311          table being generated, but for the moment this case is very
11312          rare.  */
11313       if (psym->st_other ^ vis)
11314         printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11315     }
11316
11317   printf (" %3.3s ", get_symbol_index_type (filedata, psym->st_shndx));
11318   if (VALID_DYNAMIC_NAME (psym->st_name))
11319     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11320   else
11321     printf (_(" <corrupt: %14ld>"), psym->st_name);
11322   putchar ('\n');
11323 }
11324
11325 static const char *
11326 get_symbol_version_string (Filedata *                   filedata,
11327                            bfd_boolean                  is_dynsym,
11328                            const char *                 strtab,
11329                            unsigned long int            strtab_size,
11330                            unsigned int                 si,
11331                            Elf_Internal_Sym *           psym,
11332                            enum versioned_symbol_info * sym_info,
11333                            unsigned short *             vna_other)
11334 {
11335   unsigned char data[2];
11336   unsigned short vers_data;
11337   unsigned long offset;
11338   unsigned short max_vd_ndx;
11339
11340   if (!is_dynsym
11341       || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
11342     return NULL;
11343
11344   offset = offset_from_vma (filedata, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
11345                             sizeof data + si * sizeof (vers_data));
11346
11347   if (get_data (&data, filedata, offset + si * sizeof (vers_data),
11348                 sizeof (data), 1, _("version data")) == NULL)
11349     return NULL;
11350
11351   vers_data = byte_get (data, 2);
11352
11353   if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data == 0)
11354     return NULL;
11355
11356   max_vd_ndx = 0;
11357
11358   /* Usually we'd only see verdef for defined symbols, and verneed for
11359      undefined symbols.  However, symbols defined by the linker in
11360      .dynbss for variables copied from a shared library in order to
11361      avoid text relocations are defined yet have verneed.  We could
11362      use a heuristic to detect the special case, for example, check
11363      for verneed first on symbols defined in SHT_NOBITS sections, but
11364      it is simpler and more reliable to just look for both verdef and
11365      verneed.  .dynbss might not be mapped to a SHT_NOBITS section.  */
11366
11367   if (psym->st_shndx != SHN_UNDEF
11368       && vers_data != 0x8001
11369       && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
11370     {
11371       Elf_Internal_Verdef ivd;
11372       Elf_Internal_Verdaux ivda;
11373       Elf_External_Verdaux evda;
11374       unsigned long off;
11375
11376       off = offset_from_vma (filedata,
11377                              version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
11378                              sizeof (Elf_External_Verdef));
11379
11380       do
11381         {
11382           Elf_External_Verdef evd;
11383
11384           if (get_data (&evd, filedata, off, sizeof (evd), 1,
11385                         _("version def")) == NULL)
11386             {
11387               ivd.vd_ndx = 0;
11388               ivd.vd_aux = 0;
11389               ivd.vd_next = 0;
11390               ivd.vd_flags = 0;
11391             }
11392           else
11393             {
11394               ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
11395               ivd.vd_aux = BYTE_GET (evd.vd_aux);
11396               ivd.vd_next = BYTE_GET (evd.vd_next);
11397               ivd.vd_flags = BYTE_GET (evd.vd_flags);
11398             }
11399
11400           if ((ivd.vd_ndx & VERSYM_VERSION) > max_vd_ndx)
11401             max_vd_ndx = ivd.vd_ndx & VERSYM_VERSION;
11402
11403           off += ivd.vd_next;
11404         }
11405       while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
11406
11407       if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
11408         {
11409           if (ivd.vd_ndx == 1 && ivd.vd_flags == VER_FLG_BASE) 
11410             return NULL;
11411
11412           off -= ivd.vd_next;
11413           off += ivd.vd_aux;
11414
11415           if (get_data (&evda, filedata, off, sizeof (evda), 1,
11416                         _("version def aux")) != NULL)
11417             {
11418               ivda.vda_name = BYTE_GET (evda.vda_name);
11419
11420               if (psym->st_name != ivda.vda_name)
11421                 {
11422                   *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
11423                                ? symbol_hidden : symbol_public);
11424                   return (ivda.vda_name < strtab_size
11425                           ? strtab + ivda.vda_name : _("<corrupt>"));
11426                 }
11427             }
11428         }
11429     }
11430
11431   if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
11432     {
11433       Elf_External_Verneed evn;
11434       Elf_Internal_Verneed ivn;
11435       Elf_Internal_Vernaux ivna;
11436
11437       offset = offset_from_vma (filedata,
11438                                 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
11439                                 sizeof evn);
11440       do
11441         {
11442           unsigned long vna_off;
11443
11444           if (get_data (&evn, filedata, offset, sizeof (evn), 1,
11445                         _("version need")) == NULL)
11446             {
11447               ivna.vna_next = 0;
11448               ivna.vna_other = 0;
11449               ivna.vna_name = 0;
11450               break;
11451             }
11452
11453           ivn.vn_aux  = BYTE_GET (evn.vn_aux);
11454           ivn.vn_next = BYTE_GET (evn.vn_next);
11455
11456           vna_off = offset + ivn.vn_aux;
11457
11458           do
11459             {
11460               Elf_External_Vernaux evna;
11461
11462               if (get_data (&evna, filedata, vna_off, sizeof (evna), 1,
11463                             _("version need aux (3)")) == NULL)
11464                 {
11465                   ivna.vna_next = 0;
11466                   ivna.vna_other = 0;
11467                   ivna.vna_name = 0;
11468                 }
11469               else
11470                 {
11471                   ivna.vna_other = BYTE_GET (evna.vna_other);
11472                   ivna.vna_next  = BYTE_GET (evna.vna_next);
11473                   ivna.vna_name  = BYTE_GET (evna.vna_name);
11474                 }
11475
11476               vna_off += ivna.vna_next;
11477             }
11478           while (ivna.vna_other != vers_data && ivna.vna_next != 0);
11479
11480           if (ivna.vna_other == vers_data)
11481             break;
11482
11483           offset += ivn.vn_next;
11484         }
11485       while (ivn.vn_next != 0);
11486
11487       if (ivna.vna_other == vers_data)
11488         {
11489           *sym_info = symbol_undefined;
11490           *vna_other = ivna.vna_other;
11491           return (ivna.vna_name < strtab_size
11492                   ? strtab + ivna.vna_name : _("<corrupt>"));
11493         }
11494       else if ((max_vd_ndx || (vers_data & VERSYM_VERSION) != 1)
11495                && (vers_data & VERSYM_VERSION) > max_vd_ndx)
11496         return _("<corrupt>");
11497     }
11498   return NULL;
11499 }
11500
11501 /* Dump the symbol table.  */
11502 static bfd_boolean
11503 process_symbol_table (Filedata * filedata)
11504 {
11505   Elf_Internal_Shdr * section;
11506   bfd_size_type nbuckets = 0;
11507   bfd_size_type nchains = 0;
11508   bfd_vma * buckets = NULL;
11509   bfd_vma * chains = NULL;
11510   bfd_vma ngnubuckets = 0;
11511   bfd_vma * gnubuckets = NULL;
11512   bfd_vma * gnuchains = NULL;
11513   bfd_vma gnusymidx = 0;
11514   bfd_size_type ngnuchains = 0;
11515
11516   if (!do_syms && !do_dyn_syms && !do_histogram)
11517     return TRUE;
11518
11519   if (dynamic_info[DT_HASH]
11520       && (do_histogram
11521           || (do_using_dynamic
11522               && !do_dyn_syms
11523               && dynamic_strings != NULL)))
11524     {
11525       unsigned char nb[8];
11526       unsigned char nc[8];
11527       unsigned int hash_ent_size = 4;
11528
11529       if ((filedata->file_header.e_machine == EM_ALPHA
11530            || filedata->file_header.e_machine == EM_S390
11531            || filedata->file_header.e_machine == EM_S390_OLD)
11532           && filedata->file_header.e_ident[EI_CLASS] == ELFCLASS64)
11533         hash_ent_size = 8;
11534
11535       if (fseek (filedata->handle,
11536                  (archive_file_offset
11537                   + offset_from_vma (filedata, dynamic_info[DT_HASH],
11538                                      sizeof nb + sizeof nc)),
11539                  SEEK_SET))
11540         {
11541           error (_("Unable to seek to start of dynamic information\n"));
11542           goto no_hash;
11543         }
11544
11545       if (fread (nb, hash_ent_size, 1, filedata->handle) != 1)
11546         {
11547           error (_("Failed to read in number of buckets\n"));
11548           goto no_hash;
11549         }
11550
11551       if (fread (nc, hash_ent_size, 1, filedata->handle) != 1)
11552         {
11553           error (_("Failed to read in number of chains\n"));
11554           goto no_hash;
11555         }
11556
11557       nbuckets = byte_get (nb, hash_ent_size);
11558       nchains  = byte_get (nc, hash_ent_size);
11559
11560       buckets = get_dynamic_data (filedata, nbuckets, hash_ent_size);
11561       chains  = get_dynamic_data (filedata, nchains, hash_ent_size);
11562
11563     no_hash:
11564       if (buckets == NULL || chains == NULL)
11565         {
11566           if (do_using_dynamic)
11567             return FALSE;
11568           free (buckets);
11569           free (chains);
11570           buckets = NULL;
11571           chains = NULL;
11572           nbuckets = 0;
11573           nchains = 0;
11574         }
11575     }
11576
11577   if (dynamic_info_DT_GNU_HASH
11578       && (do_histogram
11579           || (do_using_dynamic
11580               && !do_dyn_syms
11581               && dynamic_strings != NULL)))
11582     {
11583       unsigned char nb[16];
11584       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11585       bfd_vma buckets_vma;
11586
11587       if (fseek (filedata->handle,
11588                  (archive_file_offset
11589                   + offset_from_vma (filedata, dynamic_info_DT_GNU_HASH,
11590                                      sizeof nb)),
11591                  SEEK_SET))
11592         {
11593           error (_("Unable to seek to start of dynamic information\n"));
11594           goto no_gnu_hash;
11595         }
11596
11597       if (fread (nb, 16, 1, filedata->handle) != 1)
11598         {
11599           error (_("Failed to read in number of buckets\n"));
11600           goto no_gnu_hash;
11601         }
11602
11603       ngnubuckets = byte_get (nb, 4);
11604       gnusymidx = byte_get (nb + 4, 4);
11605       bitmaskwords = byte_get (nb + 8, 4);
11606       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
11607       if (is_32bit_elf)
11608         buckets_vma += bitmaskwords * 4;
11609       else
11610         buckets_vma += bitmaskwords * 8;
11611
11612       if (fseek (filedata->handle,
11613                  (archive_file_offset
11614                   + offset_from_vma (filedata, buckets_vma, 4)),
11615                  SEEK_SET))
11616         {
11617           error (_("Unable to seek to start of dynamic information\n"));
11618           goto no_gnu_hash;
11619         }
11620
11621       gnubuckets = get_dynamic_data (filedata, ngnubuckets, 4);
11622
11623       if (gnubuckets == NULL)
11624         goto no_gnu_hash;
11625
11626       for (i = 0; i < ngnubuckets; i++)
11627         if (gnubuckets[i] != 0)
11628           {
11629             if (gnubuckets[i] < gnusymidx)
11630               return FALSE;
11631
11632             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11633               maxchain = gnubuckets[i];
11634           }
11635
11636       if (maxchain == 0xffffffff)
11637         goto no_gnu_hash;
11638
11639       maxchain -= gnusymidx;
11640
11641       if (fseek (filedata->handle,
11642                  (archive_file_offset
11643                   + offset_from_vma (filedata, buckets_vma
11644                                            + 4 * (ngnubuckets + maxchain), 4)),
11645                  SEEK_SET))
11646         {
11647           error (_("Unable to seek to start of dynamic information\n"));
11648           goto no_gnu_hash;
11649         }
11650
11651       do
11652         {
11653           if (fread (nb, 4, 1, filedata->handle) != 1)
11654             {
11655               error (_("Failed to determine last chain length\n"));
11656               goto no_gnu_hash;
11657             }
11658
11659           if (maxchain + 1 == 0)
11660             goto no_gnu_hash;
11661
11662           ++maxchain;
11663         }
11664       while ((byte_get (nb, 4) & 1) == 0);
11665
11666       if (fseek (filedata->handle,
11667                  (archive_file_offset
11668                   + offset_from_vma (filedata, buckets_vma + 4 * ngnubuckets, 4)),
11669                  SEEK_SET))
11670         {
11671           error (_("Unable to seek to start of dynamic information\n"));
11672           goto no_gnu_hash;
11673         }
11674
11675       gnuchains = get_dynamic_data (filedata, maxchain, 4);
11676       ngnuchains = maxchain;
11677
11678     no_gnu_hash:
11679       if (gnuchains == NULL)
11680         {
11681           free (gnubuckets);
11682           gnubuckets = NULL;
11683           ngnubuckets = 0;
11684           if (do_using_dynamic)
11685             return FALSE;
11686         }
11687     }
11688
11689   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11690       && do_syms
11691       && do_using_dynamic
11692       && dynamic_strings != NULL
11693       && dynamic_symbols != NULL)
11694     {
11695       unsigned long hn;
11696
11697       if (dynamic_info[DT_HASH])
11698         {
11699           bfd_vma si;
11700           char *visited;
11701
11702           printf (_("\nSymbol table for image:\n"));
11703           if (is_32bit_elf)
11704             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11705           else
11706             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11707
11708           visited = xcmalloc (nchains, 1);
11709           memset (visited, 0, nchains);
11710           for (hn = 0; hn < nbuckets; hn++)
11711             {
11712               for (si = buckets[hn]; si > 0; si = chains[si])
11713                 {
11714                   print_dynamic_symbol (filedata, si, hn);
11715                   if (si >= nchains || visited[si])
11716                     {
11717                       error (_("histogram chain is corrupt\n"));
11718                       break;
11719                     }
11720                   visited[si] = 1;
11721                 }
11722             }
11723           free (visited);
11724         }
11725
11726       if (dynamic_info_DT_GNU_HASH)
11727         {
11728           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11729           if (is_32bit_elf)
11730             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11731           else
11732             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11733
11734           for (hn = 0; hn < ngnubuckets; ++hn)
11735             if (gnubuckets[hn] != 0)
11736               {
11737                 bfd_vma si = gnubuckets[hn];
11738                 bfd_vma off = si - gnusymidx;
11739
11740                 do
11741                   {
11742                     print_dynamic_symbol (filedata, si, hn);
11743                     si++;
11744                   }
11745                 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11746               }
11747         }
11748     }
11749   else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11750            && filedata->section_headers != NULL)
11751     {
11752       unsigned int i;
11753
11754       for (i = 0, section = filedata->section_headers;
11755            i < filedata->file_header.e_shnum;
11756            i++, section++)
11757         {
11758           unsigned int si;
11759           char * strtab = NULL;
11760           unsigned long int strtab_size = 0;
11761           Elf_Internal_Sym * symtab;
11762           Elf_Internal_Sym * psym;
11763           unsigned long num_syms;
11764
11765           if ((section->sh_type != SHT_SYMTAB
11766                && section->sh_type != SHT_DYNSYM)
11767               || (!do_syms
11768                   && section->sh_type == SHT_SYMTAB))
11769             continue;
11770
11771           if (section->sh_entsize == 0)
11772             {
11773               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11774                       printable_section_name (filedata, section));
11775               continue;
11776             }
11777
11778           num_syms = section->sh_size / section->sh_entsize;
11779           printf (ngettext ("\nSymbol table '%s' contains %lu entry:\n",
11780                             "\nSymbol table '%s' contains %lu entries:\n",
11781                             num_syms),
11782                   printable_section_name (filedata, section),
11783                   num_syms);
11784
11785           if (is_32bit_elf)
11786             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
11787           else
11788             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
11789
11790           symtab = GET_ELF_SYMBOLS (filedata, section, & num_syms);
11791           if (symtab == NULL)
11792             continue;
11793
11794           if (section->sh_link == filedata->file_header.e_shstrndx)
11795             {
11796               strtab = filedata->string_table;
11797               strtab_size = filedata->string_table_length;
11798             }
11799           else if (section->sh_link < filedata->file_header.e_shnum)
11800             {
11801               Elf_Internal_Shdr * string_sec;
11802
11803               string_sec = filedata->section_headers + section->sh_link;
11804
11805               strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset,
11806                                           1, string_sec->sh_size,
11807                                           _("string table"));
11808               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11809             }
11810
11811           for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11812             {
11813               const char *version_string;
11814               enum versioned_symbol_info sym_info;
11815               unsigned short vna_other;
11816
11817               printf ("%6d: ", si);
11818               print_vma (psym->st_value, LONG_HEX);
11819               putchar (' ');
11820               print_vma (psym->st_size, DEC_5);
11821               printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11822               printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11823               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11824                 printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11825               else
11826                 {
11827                   unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11828
11829                   printf (" %-7s", get_symbol_visibility (vis));
11830                   /* Check to see if any other bits in the st_other field are set.
11831                      Note - displaying this information disrupts the layout of the
11832                      table being generated, but for the moment this case is very rare.  */
11833                   if (psym->st_other ^ vis)
11834                     printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11835                 }
11836               printf (" %4s ", get_symbol_index_type (filedata, psym->st_shndx));
11837               print_symbol (25, psym->st_name < strtab_size
11838                             ? strtab + psym->st_name : _("<corrupt>"));
11839
11840               version_string
11841                 = get_symbol_version_string (filedata,
11842                                              section->sh_type == SHT_DYNSYM,
11843                                              strtab, strtab_size, si,
11844                                              psym, &sym_info, &vna_other);
11845               if (version_string)
11846                 {
11847                   if (sym_info == symbol_undefined)
11848                     printf ("@%s (%d)", version_string, vna_other);
11849                   else
11850                     printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11851                             version_string);
11852                 }
11853
11854               putchar ('\n');
11855
11856               if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
11857                   && si >= section->sh_info
11858                   /* Irix 5 and 6 MIPS binaries are known to ignore this requirement.  */
11859                   && filedata->file_header.e_machine != EM_MIPS
11860                   /* Solaris binaries have been found to violate this requirement as
11861                      well.  Not sure if this is a bug or an ABI requirement.  */
11862                   && filedata->file_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
11863                 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11864                       si, printable_section_name (filedata, section), section->sh_info);
11865             }
11866
11867           free (symtab);
11868           if (strtab != filedata->string_table)
11869             free (strtab);
11870         }
11871     }
11872   else if (do_syms)
11873     printf
11874       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11875
11876   if (do_histogram && buckets != NULL)
11877     {
11878       unsigned long * lengths;
11879       unsigned long * counts;
11880       unsigned long hn;
11881       bfd_vma si;
11882       unsigned long maxlength = 0;
11883       unsigned long nzero_counts = 0;
11884       unsigned long nsyms = 0;
11885       char *visited;
11886
11887       printf (ngettext ("\nHistogram for bucket list length "
11888                         "(total of %lu bucket):\n",
11889                         "\nHistogram for bucket list length "
11890                         "(total of %lu buckets):\n",
11891                         (unsigned long) nbuckets),
11892               (unsigned long) nbuckets);
11893
11894       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11895       if (lengths == NULL)
11896         {
11897           error (_("Out of memory allocating space for histogram buckets\n"));
11898           return FALSE;
11899         }
11900       visited = xcmalloc (nchains, 1);
11901       memset (visited, 0, nchains);
11902
11903       printf (_(" Length  Number     %% of total  Coverage\n"));
11904       for (hn = 0; hn < nbuckets; ++hn)
11905         {
11906           for (si = buckets[hn]; si > 0; si = chains[si])
11907             {
11908               ++nsyms;
11909               if (maxlength < ++lengths[hn])
11910                 ++maxlength;
11911               if (si >= nchains || visited[si])
11912                 {
11913                   error (_("histogram chain is corrupt\n"));
11914                   break;
11915                 }
11916               visited[si] = 1;
11917             }
11918         }
11919       free (visited);
11920
11921       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11922       if (counts == NULL)
11923         {
11924           free (lengths);
11925           error (_("Out of memory allocating space for histogram counts\n"));
11926           return FALSE;
11927         }
11928
11929       for (hn = 0; hn < nbuckets; ++hn)
11930         ++counts[lengths[hn]];
11931
11932       if (nbuckets > 0)
11933         {
11934           unsigned long i;
11935           printf ("      0  %-10lu (%5.1f%%)\n",
11936                   counts[0], (counts[0] * 100.0) / nbuckets);
11937           for (i = 1; i <= maxlength; ++i)
11938             {
11939               nzero_counts += counts[i] * i;
11940               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
11941                       i, counts[i], (counts[i] * 100.0) / nbuckets,
11942                       (nzero_counts * 100.0) / nsyms);
11943             }
11944         }
11945
11946       free (counts);
11947       free (lengths);
11948     }
11949
11950   if (buckets != NULL)
11951     {
11952       free (buckets);
11953       free (chains);
11954     }
11955
11956   if (do_histogram && gnubuckets != NULL)
11957     {
11958       unsigned long * lengths;
11959       unsigned long * counts;
11960       unsigned long hn;
11961       unsigned long maxlength = 0;
11962       unsigned long nzero_counts = 0;
11963       unsigned long nsyms = 0;
11964
11965       printf (ngettext ("\nHistogram for `.gnu.hash' bucket list length "
11966                         "(total of %lu bucket):\n",
11967                         "\nHistogram for `.gnu.hash' bucket list length "
11968                         "(total of %lu buckets):\n",
11969                         (unsigned long) ngnubuckets),
11970               (unsigned long) ngnubuckets);
11971
11972       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
11973       if (lengths == NULL)
11974         {
11975           error (_("Out of memory allocating space for gnu histogram buckets\n"));
11976           return FALSE;
11977         }
11978
11979       printf (_(" Length  Number     %% of total  Coverage\n"));
11980
11981       for (hn = 0; hn < ngnubuckets; ++hn)
11982         if (gnubuckets[hn] != 0)
11983           {
11984             bfd_vma off, length = 1;
11985
11986             for (off = gnubuckets[hn] - gnusymidx;
11987                  /* PR 17531 file: 010-77222-0.004.  */
11988                  off < ngnuchains && (gnuchains[off] & 1) == 0;
11989                  ++off)
11990               ++length;
11991             lengths[hn] = length;
11992             if (length > maxlength)
11993               maxlength = length;
11994             nsyms += length;
11995           }
11996
11997       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11998       if (counts == NULL)
11999         {
12000           free (lengths);
12001           error (_("Out of memory allocating space for gnu histogram counts\n"));
12002           return FALSE;
12003         }
12004
12005       for (hn = 0; hn < ngnubuckets; ++hn)
12006         ++counts[lengths[hn]];
12007
12008       if (ngnubuckets > 0)
12009         {
12010           unsigned long j;
12011           printf ("      0  %-10lu (%5.1f%%)\n",
12012                   counts[0], (counts[0] * 100.0) / ngnubuckets);
12013           for (j = 1; j <= maxlength; ++j)
12014             {
12015               nzero_counts += counts[j] * j;
12016               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
12017                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
12018                       (nzero_counts * 100.0) / nsyms);
12019             }
12020         }
12021
12022       free (counts);
12023       free (lengths);
12024       free (gnubuckets);
12025       free (gnuchains);
12026     }
12027
12028   return TRUE;
12029 }
12030
12031 static bfd_boolean
12032 process_syminfo (Filedata * filedata ATTRIBUTE_UNUSED)
12033 {
12034   unsigned int i;
12035
12036   if (dynamic_syminfo == NULL
12037       || !do_dynamic)
12038     /* No syminfo, this is ok.  */
12039     return TRUE;
12040
12041   /* There better should be a dynamic symbol section.  */
12042   if (dynamic_symbols == NULL || dynamic_strings == NULL)
12043     return FALSE;
12044
12045   if (dynamic_addr)
12046     printf (ngettext ("\nDynamic info segment at offset 0x%lx "
12047                       "contains %d entry:\n",
12048                       "\nDynamic info segment at offset 0x%lx "
12049                       "contains %d entries:\n",
12050                       dynamic_syminfo_nent),
12051             dynamic_syminfo_offset, dynamic_syminfo_nent);
12052
12053   printf (_(" Num: Name                           BoundTo     Flags\n"));
12054   for (i = 0; i < dynamic_syminfo_nent; ++i)
12055     {
12056       unsigned short int flags = dynamic_syminfo[i].si_flags;
12057
12058       printf ("%4d: ", i);
12059       if (i >= num_dynamic_syms)
12060         printf (_("<corrupt index>"));
12061       else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
12062         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
12063       else
12064         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
12065       putchar (' ');
12066
12067       switch (dynamic_syminfo[i].si_boundto)
12068         {
12069         case SYMINFO_BT_SELF:
12070           fputs ("SELF       ", stdout);
12071           break;
12072         case SYMINFO_BT_PARENT:
12073           fputs ("PARENT     ", stdout);
12074           break;
12075         default:
12076           if (dynamic_syminfo[i].si_boundto > 0
12077               && dynamic_syminfo[i].si_boundto < dynamic_nent
12078               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
12079             {
12080               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
12081               putchar (' ' );
12082             }
12083           else
12084             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
12085           break;
12086         }
12087
12088       if (flags & SYMINFO_FLG_DIRECT)
12089         printf (" DIRECT");
12090       if (flags & SYMINFO_FLG_PASSTHRU)
12091         printf (" PASSTHRU");
12092       if (flags & SYMINFO_FLG_COPY)
12093         printf (" COPY");
12094       if (flags & SYMINFO_FLG_LAZYLOAD)
12095         printf (" LAZYLOAD");
12096
12097       puts ("");
12098     }
12099
12100   return TRUE;
12101 }
12102
12103 #define IN_RANGE(START,END,ADDR,OFF)            \
12104   (((ADDR) >= (START)) && ((ADDR) + (OFF) < (END)))
12105
12106 /* Check to see if the given reloc needs to be handled in a target specific
12107    manner.  If so then process the reloc and return TRUE otherwise return
12108    FALSE.
12109
12110    If called with reloc == NULL, then this is a signal that reloc processing
12111    for the current section has finished, and any saved state should be
12112    discarded.  */
12113
12114 static bfd_boolean
12115 target_specific_reloc_handling (Filedata *           filedata,
12116                                 Elf_Internal_Rela *  reloc,
12117                                 unsigned char *      start,
12118                                 unsigned char *      end,
12119                                 Elf_Internal_Sym *   symtab,
12120                                 unsigned long        num_syms)
12121 {
12122   unsigned int reloc_type = 0;
12123   unsigned long sym_index = 0;
12124
12125   if (reloc)
12126     {
12127       reloc_type = get_reloc_type (filedata, reloc->r_info);
12128       sym_index = get_reloc_symindex (reloc->r_info);
12129     }
12130
12131   switch (filedata->file_header.e_machine)
12132     {
12133     case EM_MSP430:
12134     case EM_MSP430_OLD:
12135       {
12136         static Elf_Internal_Sym * saved_sym = NULL;
12137
12138         if (reloc == NULL)
12139           {
12140             saved_sym = NULL;
12141             return TRUE;
12142           }
12143
12144         switch (reloc_type)
12145           {
12146           case 10: /* R_MSP430_SYM_DIFF */
12147             if (uses_msp430x_relocs (filedata))
12148               break;
12149             /* Fall through.  */
12150           case 21: /* R_MSP430X_SYM_DIFF */
12151             /* PR 21139.  */
12152             if (sym_index >= num_syms)
12153               error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
12154                      sym_index);
12155             else
12156               saved_sym = symtab + sym_index;
12157             return TRUE;
12158
12159           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
12160           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
12161             goto handle_sym_diff;
12162
12163           case 5: /* R_MSP430_16_BYTE */
12164           case 9: /* R_MSP430_8 */
12165             if (uses_msp430x_relocs (filedata))
12166               break;
12167             goto handle_sym_diff;
12168
12169           case 2: /* R_MSP430_ABS16 */
12170           case 15: /* R_MSP430X_ABS16 */
12171             if (! uses_msp430x_relocs (filedata))
12172               break;
12173             goto handle_sym_diff;
12174
12175           handle_sym_diff:
12176             if (saved_sym != NULL)
12177               {
12178                 int reloc_size = reloc_type == 1 ? 4 : 2;
12179                 bfd_vma value;
12180
12181                 if (sym_index >= num_syms)
12182                   error (_("MSP430 reloc contains invalid symbol index %lu\n"),
12183                          sym_index);
12184                 else
12185                   {
12186                     value = reloc->r_addend + (symtab[sym_index].st_value
12187                                                - saved_sym->st_value);
12188
12189                     if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12190                       byte_put (start + reloc->r_offset, value, reloc_size);
12191                     else
12192                       /* PR 21137 */
12193                       error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
12194                              (long) reloc->r_offset);
12195                   }
12196
12197                 saved_sym = NULL;
12198                 return TRUE;
12199               }
12200             break;
12201
12202           default:
12203             if (saved_sym != NULL)
12204               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
12205             break;
12206           }
12207         break;
12208       }
12209
12210     case EM_MN10300:
12211     case EM_CYGNUS_MN10300:
12212       {
12213         static Elf_Internal_Sym * saved_sym = NULL;
12214
12215         if (reloc == NULL)
12216           {
12217             saved_sym = NULL;
12218             return TRUE;
12219           }
12220
12221         switch (reloc_type)
12222           {
12223           case 34: /* R_MN10300_ALIGN */
12224             return TRUE;
12225           case 33: /* R_MN10300_SYM_DIFF */
12226             if (sym_index >= num_syms)
12227               error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
12228                      sym_index);
12229             else
12230               saved_sym = symtab + sym_index;
12231             return TRUE;
12232
12233           case 1: /* R_MN10300_32 */
12234           case 2: /* R_MN10300_16 */
12235             if (saved_sym != NULL)
12236               {
12237                 int reloc_size = reloc_type == 1 ? 4 : 2;
12238                 bfd_vma value;
12239
12240                 if (sym_index >= num_syms)
12241                   error (_("MN10300 reloc contains invalid symbol index %lu\n"),
12242                          sym_index);
12243                 else
12244                   {
12245                     value = reloc->r_addend + (symtab[sym_index].st_value
12246                                                - saved_sym->st_value);
12247
12248                     if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12249                       byte_put (start + reloc->r_offset, value, reloc_size);
12250                     else
12251                       error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
12252                              (long) reloc->r_offset);
12253                   }
12254
12255                 saved_sym = NULL;
12256                 return TRUE;
12257               }
12258             break;
12259           default:
12260             if (saved_sym != NULL)
12261               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
12262             break;
12263           }
12264         break;
12265       }
12266
12267     case EM_RL78:
12268       {
12269         static bfd_vma saved_sym1 = 0;
12270         static bfd_vma saved_sym2 = 0;
12271         static bfd_vma value;
12272
12273         if (reloc == NULL)
12274           {
12275             saved_sym1 = saved_sym2 = 0;
12276             return TRUE;
12277           }
12278
12279         switch (reloc_type)
12280           {
12281           case 0x80: /* R_RL78_SYM.  */
12282             saved_sym1 = saved_sym2;
12283             if (sym_index >= num_syms)
12284               error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
12285                      sym_index);
12286             else
12287               {
12288                 saved_sym2 = symtab[sym_index].st_value;
12289                 saved_sym2 += reloc->r_addend;
12290               }
12291             return TRUE;
12292
12293           case 0x83: /* R_RL78_OPsub.  */
12294             value = saved_sym1 - saved_sym2;
12295             saved_sym2 = saved_sym1 = 0;
12296             return TRUE;
12297             break;
12298
12299           case 0x41: /* R_RL78_ABS32.  */
12300             if (IN_RANGE (start, end, start + reloc->r_offset, 4))
12301               byte_put (start + reloc->r_offset, value, 4);
12302             else
12303               error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12304                      (long) reloc->r_offset);
12305             value = 0;
12306             return TRUE;
12307
12308           case 0x43: /* R_RL78_ABS16.  */
12309             if (IN_RANGE (start, end, start + reloc->r_offset, 2))
12310               byte_put (start + reloc->r_offset, value, 2);
12311             else
12312               error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12313                      (long) reloc->r_offset);
12314             value = 0;
12315             return TRUE;
12316
12317           default:
12318             break;
12319           }
12320         break;
12321       }
12322     }
12323
12324   return FALSE;
12325 }
12326
12327 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
12328    DWARF debug sections.  This is a target specific test.  Note - we do not
12329    go through the whole including-target-headers-multiple-times route, (as
12330    we have already done with <elf/h8.h>) because this would become very
12331    messy and even then this function would have to contain target specific
12332    information (the names of the relocs instead of their numeric values).
12333    FIXME: This is not the correct way to solve this problem.  The proper way
12334    is to have target specific reloc sizing and typing functions created by
12335    the reloc-macros.h header, in the same way that it already creates the
12336    reloc naming functions.  */
12337
12338 static bfd_boolean
12339 is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12340 {
12341   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12342   switch (filedata->file_header.e_machine)
12343     {
12344     case EM_386:
12345     case EM_IAMCU:
12346       return reloc_type == 1; /* R_386_32.  */
12347     case EM_68K:
12348       return reloc_type == 1; /* R_68K_32.  */
12349     case EM_860:
12350       return reloc_type == 1; /* R_860_32.  */
12351     case EM_960:
12352       return reloc_type == 2; /* R_960_32.  */
12353     case EM_AARCH64:
12354       return (reloc_type == 258
12355               || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
12356     case EM_ADAPTEVA_EPIPHANY:
12357       return reloc_type == 3;
12358     case EM_ALPHA:
12359       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
12360     case EM_ARC:
12361       return reloc_type == 1; /* R_ARC_32.  */
12362     case EM_ARC_COMPACT:
12363     case EM_ARC_COMPACT2:
12364       return reloc_type == 4; /* R_ARC_32.  */
12365     case EM_ARM:
12366       return reloc_type == 2; /* R_ARM_ABS32 */
12367     case EM_AVR_OLD:
12368     case EM_AVR:
12369       return reloc_type == 1;
12370     case EM_BLACKFIN:
12371       return reloc_type == 0x12; /* R_byte4_data.  */
12372     case EM_CRIS:
12373       return reloc_type == 3; /* R_CRIS_32.  */
12374     case EM_CR16:
12375       return reloc_type == 3; /* R_CR16_NUM32.  */
12376     case EM_CRX:
12377       return reloc_type == 15; /* R_CRX_NUM32.  */
12378     case EM_CSKY:
12379       return reloc_type == 1; /* R_CKCORE_ADDR32.  */
12380     case EM_CYGNUS_FRV:
12381       return reloc_type == 1;
12382     case EM_CYGNUS_D10V:
12383     case EM_D10V:
12384       return reloc_type == 6; /* R_D10V_32.  */
12385     case EM_CYGNUS_D30V:
12386     case EM_D30V:
12387       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
12388     case EM_DLX:
12389       return reloc_type == 3; /* R_DLX_RELOC_32.  */
12390     case EM_CYGNUS_FR30:
12391     case EM_FR30:
12392       return reloc_type == 3; /* R_FR30_32.  */
12393     case EM_FT32:
12394       return reloc_type == 1; /* R_FT32_32.  */
12395     case EM_H8S:
12396     case EM_H8_300:
12397     case EM_H8_300H:
12398       return reloc_type == 1; /* R_H8_DIR32.  */
12399     case EM_IA_64:
12400       return (reloc_type == 0x64    /* R_IA64_SECREL32MSB.  */
12401               || reloc_type == 0x65 /* R_IA64_SECREL32LSB.  */
12402               || reloc_type == 0x24 /* R_IA64_DIR32MSB.  */
12403               || reloc_type == 0x25 /* R_IA64_DIR32LSB.  */);
12404     case EM_IP2K_OLD:
12405     case EM_IP2K:
12406       return reloc_type == 2; /* R_IP2K_32.  */
12407     case EM_IQ2000:
12408       return reloc_type == 2; /* R_IQ2000_32.  */
12409     case EM_LATTICEMICO32:
12410       return reloc_type == 3; /* R_LM32_32.  */
12411     case EM_M32C_OLD:
12412     case EM_M32C:
12413       return reloc_type == 3; /* R_M32C_32.  */
12414     case EM_M32R:
12415       return reloc_type == 34; /* R_M32R_32_RELA.  */
12416     case EM_68HC11:
12417     case EM_68HC12:
12418       return reloc_type == 6; /* R_M68HC11_32.  */
12419     case EM_S12Z:
12420       return reloc_type == 7 || /* R_S12Z_EXT32 */
12421         reloc_type == 6;        /* R_S12Z_CW32.  */
12422     case EM_MCORE:
12423       return reloc_type == 1; /* R_MCORE_ADDR32.  */
12424     case EM_CYGNUS_MEP:
12425       return reloc_type == 4; /* R_MEP_32.  */
12426     case EM_METAG:
12427       return reloc_type == 2; /* R_METAG_ADDR32.  */
12428     case EM_MICROBLAZE:
12429       return reloc_type == 1; /* R_MICROBLAZE_32.  */
12430     case EM_MIPS:
12431       return reloc_type == 2; /* R_MIPS_32.  */
12432     case EM_MMIX:
12433       return reloc_type == 4; /* R_MMIX_32.  */
12434     case EM_CYGNUS_MN10200:
12435     case EM_MN10200:
12436       return reloc_type == 1; /* R_MN10200_32.  */
12437     case EM_CYGNUS_MN10300:
12438     case EM_MN10300:
12439       return reloc_type == 1; /* R_MN10300_32.  */
12440     case EM_MOXIE:
12441       return reloc_type == 1; /* R_MOXIE_32.  */
12442     case EM_MSP430_OLD:
12443     case EM_MSP430:
12444       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
12445     case EM_MT:
12446       return reloc_type == 2; /* R_MT_32.  */
12447     case EM_NDS32:
12448       return reloc_type == 20; /* R_NDS32_RELA.  */
12449     case EM_ALTERA_NIOS2:
12450       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
12451     case EM_NIOS32:
12452       return reloc_type == 1; /* R_NIOS_32.  */
12453     case EM_OR1K:
12454       return reloc_type == 1; /* R_OR1K_32.  */
12455     case EM_PARISC:
12456       return (reloc_type == 1 /* R_PARISC_DIR32.  */          
12457               || reloc_type == 2 /* R_PARISC_DIR21L.  */
12458               || reloc_type == 41); /* R_PARISC_SECREL32.  */
12459     case EM_PJ:
12460     case EM_PJ_OLD:
12461       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
12462     case EM_PPC64:
12463       return reloc_type == 1; /* R_PPC64_ADDR32.  */
12464     case EM_PPC:
12465       return reloc_type == 1; /* R_PPC_ADDR32.  */
12466     case EM_TI_PRU:
12467       return reloc_type == 11; /* R_PRU_BFD_RELOC_32.  */
12468     case EM_RISCV:
12469       return reloc_type == 1; /* R_RISCV_32.  */
12470     case EM_RL78:
12471       return reloc_type == 1; /* R_RL78_DIR32.  */
12472     case EM_RX:
12473       return reloc_type == 1; /* R_RX_DIR32.  */
12474     case EM_S370:
12475       return reloc_type == 1; /* R_I370_ADDR31.  */
12476     case EM_S390_OLD:
12477     case EM_S390:
12478       return reloc_type == 4; /* R_S390_32.  */
12479     case EM_SCORE:
12480       return reloc_type == 8; /* R_SCORE_ABS32.  */
12481     case EM_SH:
12482       return reloc_type == 1; /* R_SH_DIR32.  */
12483     case EM_SPARC32PLUS:
12484     case EM_SPARCV9:
12485     case EM_SPARC:
12486       return reloc_type == 3 /* R_SPARC_32.  */
12487         || reloc_type == 23; /* R_SPARC_UA32.  */
12488     case EM_SPU:
12489       return reloc_type == 6; /* R_SPU_ADDR32 */
12490     case EM_TI_C6000:
12491       return reloc_type == 1; /* R_C6000_ABS32.  */
12492     case EM_TILEGX:
12493       return reloc_type == 2; /* R_TILEGX_32.  */
12494     case EM_TILEPRO:
12495       return reloc_type == 1; /* R_TILEPRO_32.  */
12496     case EM_CYGNUS_V850:
12497     case EM_V850:
12498       return reloc_type == 6; /* R_V850_ABS32.  */
12499     case EM_V800:
12500       return reloc_type == 0x33; /* R_V810_WORD.  */
12501     case EM_VAX:
12502       return reloc_type == 1; /* R_VAX_32.  */
12503     case EM_VISIUM:
12504       return reloc_type == 3;  /* R_VISIUM_32. */
12505     case EM_WEBASSEMBLY:
12506       return reloc_type == 1;  /* R_WASM32_32.  */
12507     case EM_X86_64:
12508     case EM_L1OM:
12509     case EM_K1OM:
12510       return reloc_type == 10; /* R_X86_64_32.  */
12511     case EM_XC16X:
12512     case EM_C166:
12513       return reloc_type == 3; /* R_XC16C_ABS_32.  */
12514     case EM_XGATE:
12515       return reloc_type == 4; /* R_XGATE_32.  */
12516     case EM_XSTORMY16:
12517       return reloc_type == 1; /* R_XSTROMY16_32.  */
12518     case EM_XTENSA_OLD:
12519     case EM_XTENSA:
12520       return reloc_type == 1; /* R_XTENSA_32.  */
12521     default:
12522       {
12523         static unsigned int prev_warn = 0;
12524
12525         /* Avoid repeating the same warning multiple times.  */
12526         if (prev_warn != filedata->file_header.e_machine)
12527           error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
12528                  filedata->file_header.e_machine);
12529         prev_warn = filedata->file_header.e_machine;
12530         return FALSE;
12531       }
12532     }
12533 }
12534
12535 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12536    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
12537
12538 static bfd_boolean
12539 is_32bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12540 {
12541   switch (filedata->file_header.e_machine)
12542   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12543     {
12544     case EM_386:
12545     case EM_IAMCU:
12546       return reloc_type == 2;  /* R_386_PC32.  */
12547     case EM_68K:
12548       return reloc_type == 4;  /* R_68K_PC32.  */
12549     case EM_AARCH64:
12550       return reloc_type == 261; /* R_AARCH64_PREL32 */
12551     case EM_ADAPTEVA_EPIPHANY:
12552       return reloc_type == 6;
12553     case EM_ALPHA:
12554       return reloc_type == 10; /* R_ALPHA_SREL32.  */
12555     case EM_ARC_COMPACT:
12556     case EM_ARC_COMPACT2:
12557       return reloc_type == 49; /* R_ARC_32_PCREL.  */
12558     case EM_ARM:
12559       return reloc_type == 3;  /* R_ARM_REL32 */
12560     case EM_AVR_OLD:
12561     case EM_AVR:
12562       return reloc_type == 36; /* R_AVR_32_PCREL.  */
12563     case EM_MICROBLAZE:
12564       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
12565     case EM_OR1K:
12566       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
12567     case EM_PARISC:
12568       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
12569     case EM_PPC:
12570       return reloc_type == 26; /* R_PPC_REL32.  */
12571     case EM_PPC64:
12572       return reloc_type == 26; /* R_PPC64_REL32.  */
12573     case EM_RISCV:
12574       return reloc_type == 57;  /* R_RISCV_32_PCREL.  */
12575     case EM_S390_OLD:
12576     case EM_S390:
12577       return reloc_type == 5;  /* R_390_PC32.  */
12578     case EM_SH:
12579       return reloc_type == 2;  /* R_SH_REL32.  */
12580     case EM_SPARC32PLUS:
12581     case EM_SPARCV9:
12582     case EM_SPARC:
12583       return reloc_type == 6;  /* R_SPARC_DISP32.  */
12584     case EM_SPU:
12585       return reloc_type == 13; /* R_SPU_REL32.  */
12586     case EM_TILEGX:
12587       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
12588     case EM_TILEPRO:
12589       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
12590     case EM_VISIUM:
12591       return reloc_type == 6;  /* R_VISIUM_32_PCREL */
12592     case EM_X86_64:
12593     case EM_L1OM:
12594     case EM_K1OM:
12595       return reloc_type == 2;  /* R_X86_64_PC32.  */
12596     case EM_XTENSA_OLD:
12597     case EM_XTENSA:
12598       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
12599     default:
12600       /* Do not abort or issue an error message here.  Not all targets use
12601          pc-relative 32-bit relocs in their DWARF debug information and we
12602          have already tested for target coverage in is_32bit_abs_reloc.  A
12603          more helpful warning message will be generated by apply_relocations
12604          anyway, so just return.  */
12605       return FALSE;
12606     }
12607 }
12608
12609 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12610    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
12611
12612 static bfd_boolean
12613 is_64bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12614 {
12615   switch (filedata->file_header.e_machine)
12616     {
12617     case EM_AARCH64:
12618       return reloc_type == 257; /* R_AARCH64_ABS64.  */
12619     case EM_ALPHA:
12620       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
12621     case EM_IA_64:
12622       return (reloc_type == 0x26    /* R_IA64_DIR64MSB.  */
12623               || reloc_type == 0x27 /* R_IA64_DIR64LSB.  */);
12624     case EM_PARISC:
12625       return reloc_type == 80; /* R_PARISC_DIR64.  */
12626     case EM_PPC64:
12627       return reloc_type == 38; /* R_PPC64_ADDR64.  */
12628     case EM_RISCV:
12629       return reloc_type == 2; /* R_RISCV_64.  */
12630     case EM_SPARC32PLUS:
12631     case EM_SPARCV9:
12632     case EM_SPARC:
12633       return reloc_type == 32 /* R_SPARC_64.  */
12634         || reloc_type == 54; /* R_SPARC_UA64.  */
12635     case EM_X86_64:
12636     case EM_L1OM:
12637     case EM_K1OM:
12638       return reloc_type == 1; /* R_X86_64_64.  */
12639     case EM_S390_OLD:
12640     case EM_S390:
12641       return reloc_type == 22;  /* R_S390_64.  */
12642     case EM_TILEGX:
12643       return reloc_type == 1; /* R_TILEGX_64.  */
12644     case EM_MIPS:
12645       return reloc_type == 18;  /* R_MIPS_64.  */
12646     default:
12647       return FALSE;
12648     }
12649 }
12650
12651 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12652    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
12653
12654 static bfd_boolean
12655 is_64bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12656 {
12657   switch (filedata->file_header.e_machine)
12658     {
12659     case EM_AARCH64:
12660       return reloc_type == 260; /* R_AARCH64_PREL64.  */
12661     case EM_ALPHA:
12662       return reloc_type == 11; /* R_ALPHA_SREL64.  */
12663     case EM_IA_64:
12664       return (reloc_type == 0x4e    /* R_IA64_PCREL64MSB.  */
12665               || reloc_type == 0x4f /* R_IA64_PCREL64LSB.  */);
12666     case EM_PARISC:
12667       return reloc_type == 72; /* R_PARISC_PCREL64.  */
12668     case EM_PPC64:
12669       return reloc_type == 44; /* R_PPC64_REL64.  */
12670     case EM_SPARC32PLUS:
12671     case EM_SPARCV9:
12672     case EM_SPARC:
12673       return reloc_type == 46; /* R_SPARC_DISP64.  */
12674     case EM_X86_64:
12675     case EM_L1OM:
12676     case EM_K1OM:
12677       return reloc_type == 24; /* R_X86_64_PC64.  */
12678     case EM_S390_OLD:
12679     case EM_S390:
12680       return reloc_type == 23;  /* R_S390_PC64.  */
12681     case EM_TILEGX:
12682       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
12683     default:
12684       return FALSE;
12685     }
12686 }
12687
12688 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12689    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
12690
12691 static bfd_boolean
12692 is_24bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12693 {
12694   switch (filedata->file_header.e_machine)
12695     {
12696     case EM_CYGNUS_MN10200:
12697     case EM_MN10200:
12698       return reloc_type == 4; /* R_MN10200_24.  */
12699     case EM_FT32:
12700       return reloc_type == 5; /* R_FT32_20.  */
12701     default:
12702       return FALSE;
12703     }
12704 }
12705
12706 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12707    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
12708
12709 static bfd_boolean
12710 is_16bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12711 {
12712   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12713   switch (filedata->file_header.e_machine)
12714     {
12715     case EM_ARC:
12716     case EM_ARC_COMPACT:
12717     case EM_ARC_COMPACT2:
12718       return reloc_type == 2; /* R_ARC_16.  */
12719     case EM_ADAPTEVA_EPIPHANY:
12720       return reloc_type == 5;
12721     case EM_AVR_OLD:
12722     case EM_AVR:
12723       return reloc_type == 4; /* R_AVR_16.  */
12724     case EM_CYGNUS_D10V:
12725     case EM_D10V:
12726       return reloc_type == 3; /* R_D10V_16.  */
12727     case EM_FT32:
12728       return reloc_type == 2; /* R_FT32_16.  */
12729     case EM_H8S:
12730     case EM_H8_300:
12731     case EM_H8_300H:
12732       return reloc_type == R_H8_DIR16;
12733     case EM_IP2K_OLD:
12734     case EM_IP2K:
12735       return reloc_type == 1; /* R_IP2K_16.  */
12736     case EM_M32C_OLD:
12737     case EM_M32C:
12738       return reloc_type == 1; /* R_M32C_16 */
12739     case EM_CYGNUS_MN10200:
12740     case EM_MN10200:
12741       return reloc_type == 2; /* R_MN10200_16.  */
12742     case EM_CYGNUS_MN10300:
12743     case EM_MN10300:
12744       return reloc_type == 2; /* R_MN10300_16.  */
12745     case EM_MSP430:
12746       if (uses_msp430x_relocs (filedata))
12747         return reloc_type == 2; /* R_MSP430_ABS16.  */
12748       /* Fall through.  */
12749     case EM_MSP430_OLD:
12750       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
12751     case EM_NDS32:
12752       return reloc_type == 19; /* R_NDS32_RELA.  */
12753     case EM_ALTERA_NIOS2:
12754       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
12755     case EM_NIOS32:
12756       return reloc_type == 9; /* R_NIOS_16.  */
12757     case EM_OR1K:
12758       return reloc_type == 2; /* R_OR1K_16.  */
12759     case EM_RISCV:
12760       return reloc_type == 55; /* R_RISCV_SET16.  */
12761     case EM_TI_PRU:
12762       return reloc_type == 8; /* R_PRU_BFD_RELOC_16.  */
12763     case EM_TI_C6000:
12764       return reloc_type == 2; /* R_C6000_ABS16.  */
12765     case EM_VISIUM:
12766       return reloc_type == 2; /* R_VISIUM_16. */
12767     case EM_XC16X:
12768     case EM_C166:
12769       return reloc_type == 2; /* R_XC16C_ABS_16.  */
12770     case EM_XGATE:
12771       return reloc_type == 3; /* R_XGATE_16.  */
12772     default:
12773       return FALSE;
12774     }
12775 }
12776
12777 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12778    a 8-bit absolute RELA relocation used in DWARF debug sections.  */
12779
12780 static bfd_boolean
12781 is_8bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12782 {
12783   switch (filedata->file_header.e_machine)
12784     {
12785     case EM_RISCV:
12786       return reloc_type == 54; /* R_RISCV_SET8.  */
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 6-bit absolute RELA relocation used in DWARF debug sections.  */
12794
12795 static bfd_boolean
12796 is_6bit_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 == 53; /* R_RISCV_SET6.  */
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 32-bit inplace add RELA relocation used in DWARF debug sections.  */
12809
12810 static bfd_boolean
12811 is_32bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12812 {
12813   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12814   switch (filedata->file_header.e_machine)
12815     {
12816     case EM_RISCV:
12817       return reloc_type == 35; /* R_RISCV_ADD32.  */
12818     default:
12819       return FALSE;
12820     }
12821 }
12822
12823 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12824    a 32-bit inplace sub RELA relocation used in DWARF debug sections.  */
12825
12826 static bfd_boolean
12827 is_32bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12828 {
12829   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12830   switch (filedata->file_header.e_machine)
12831     {
12832     case EM_RISCV:
12833       return reloc_type == 39; /* R_RISCV_SUB32.  */
12834     default:
12835       return FALSE;
12836     }
12837 }
12838
12839 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12840    a 64-bit inplace add RELA relocation used in DWARF debug sections.  */
12841
12842 static bfd_boolean
12843 is_64bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12844 {
12845   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12846   switch (filedata->file_header.e_machine)
12847     {
12848     case EM_RISCV:
12849       return reloc_type == 36; /* R_RISCV_ADD64.  */
12850     default:
12851       return FALSE;
12852     }
12853 }
12854
12855 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12856    a 64-bit inplace sub RELA relocation used in DWARF debug sections.  */
12857
12858 static bfd_boolean
12859 is_64bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12860 {
12861   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12862   switch (filedata->file_header.e_machine)
12863     {
12864     case EM_RISCV:
12865       return reloc_type == 40; /* R_RISCV_SUB64.  */
12866     default:
12867       return FALSE;
12868     }
12869 }
12870
12871 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12872    a 16-bit inplace add RELA relocation used in DWARF debug sections.  */
12873
12874 static bfd_boolean
12875 is_16bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12876 {
12877   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12878   switch (filedata->file_header.e_machine)
12879     {
12880     case EM_RISCV:
12881       return reloc_type == 34; /* R_RISCV_ADD16.  */
12882     default:
12883       return FALSE;
12884     }
12885 }
12886
12887 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12888    a 16-bit inplace sub RELA relocation used in DWARF debug sections.  */
12889
12890 static bfd_boolean
12891 is_16bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12892 {
12893   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12894   switch (filedata->file_header.e_machine)
12895     {
12896     case EM_RISCV:
12897       return reloc_type == 38; /* R_RISCV_SUB16.  */
12898     default:
12899       return FALSE;
12900     }
12901 }
12902
12903 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12904    a 8-bit inplace add RELA relocation used in DWARF debug sections.  */
12905
12906 static bfd_boolean
12907 is_8bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12908 {
12909   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12910   switch (filedata->file_header.e_machine)
12911     {
12912     case EM_RISCV:
12913       return reloc_type == 33; /* R_RISCV_ADD8.  */
12914     default:
12915       return FALSE;
12916     }
12917 }
12918
12919 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12920    a 8-bit inplace sub RELA relocation used in DWARF debug sections.  */
12921
12922 static bfd_boolean
12923 is_8bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12924 {
12925   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12926   switch (filedata->file_header.e_machine)
12927     {
12928     case EM_RISCV:
12929       return reloc_type == 37; /* R_RISCV_SUB8.  */
12930     default:
12931       return FALSE;
12932     }
12933 }
12934
12935 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12936    a 6-bit inplace sub RELA relocation used in DWARF debug sections.  */
12937
12938 static bfd_boolean
12939 is_6bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12940 {
12941   switch (filedata->file_header.e_machine)
12942     {
12943     case EM_RISCV:
12944       return reloc_type == 52; /* R_RISCV_SUB6.  */
12945     default:
12946       return FALSE;
12947     }
12948 }
12949
12950 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12951    relocation entries (possibly formerly used for SHT_GROUP sections).  */
12952
12953 static bfd_boolean
12954 is_none_reloc (Filedata * filedata, unsigned int reloc_type)
12955 {
12956   switch (filedata->file_header.e_machine)
12957     {
12958     case EM_386:     /* R_386_NONE.  */
12959     case EM_68K:     /* R_68K_NONE.  */
12960     case EM_ADAPTEVA_EPIPHANY:
12961     case EM_ALPHA:   /* R_ALPHA_NONE.  */
12962     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
12963     case EM_ARC:     /* R_ARC_NONE.  */
12964     case EM_ARC_COMPACT2: /* R_ARC_NONE.  */
12965     case EM_ARC_COMPACT: /* R_ARC_NONE.  */
12966     case EM_ARM:     /* R_ARM_NONE.  */
12967     case EM_C166:    /* R_XC16X_NONE.  */
12968     case EM_CRIS:    /* R_CRIS_NONE.  */
12969     case EM_FT32:    /* R_FT32_NONE.  */
12970     case EM_IA_64:   /* R_IA64_NONE.  */
12971     case EM_K1OM:    /* R_X86_64_NONE.  */
12972     case EM_L1OM:    /* R_X86_64_NONE.  */
12973     case EM_M32R:    /* R_M32R_NONE.  */
12974     case EM_MIPS:    /* R_MIPS_NONE.  */
12975     case EM_MN10300: /* R_MN10300_NONE.  */
12976     case EM_MOXIE:   /* R_MOXIE_NONE.  */
12977     case EM_NIOS32:  /* R_NIOS_NONE.  */
12978     case EM_OR1K:    /* R_OR1K_NONE. */
12979     case EM_PARISC:  /* R_PARISC_NONE.  */
12980     case EM_PPC64:   /* R_PPC64_NONE.  */
12981     case EM_PPC:     /* R_PPC_NONE.  */
12982     case EM_RISCV:   /* R_RISCV_NONE.  */
12983     case EM_S390:    /* R_390_NONE.  */
12984     case EM_S390_OLD:
12985     case EM_SH:      /* R_SH_NONE.  */
12986     case EM_SPARC32PLUS:
12987     case EM_SPARC:   /* R_SPARC_NONE.  */
12988     case EM_SPARCV9:
12989     case EM_TILEGX:  /* R_TILEGX_NONE.  */
12990     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
12991     case EM_TI_C6000:/* R_C6000_NONE.  */
12992     case EM_X86_64:  /* R_X86_64_NONE.  */
12993     case EM_XC16X:
12994     case EM_WEBASSEMBLY: /* R_WASM32_NONE.  */
12995       return reloc_type == 0;
12996
12997     case EM_AARCH64:
12998       return reloc_type == 0 || reloc_type == 256;
12999     case EM_AVR_OLD:
13000     case EM_AVR:
13001       return (reloc_type == 0 /* R_AVR_NONE.  */
13002               || reloc_type == 30 /* R_AVR_DIFF8.  */
13003               || reloc_type == 31 /* R_AVR_DIFF16.  */
13004               || reloc_type == 32 /* R_AVR_DIFF32.  */);
13005     case EM_METAG:
13006       return reloc_type == 3; /* R_METAG_NONE.  */
13007     case EM_NDS32:
13008       return (reloc_type == 0       /* R_XTENSA_NONE.  */
13009               || reloc_type == 204  /* R_NDS32_DIFF8.  */
13010               || reloc_type == 205  /* R_NDS32_DIFF16.  */
13011               || reloc_type == 206  /* R_NDS32_DIFF32.  */
13012               || reloc_type == 207  /* R_NDS32_ULEB128.  */);
13013     case EM_TI_PRU:
13014       return (reloc_type == 0       /* R_PRU_NONE.  */
13015               || reloc_type == 65   /* R_PRU_DIFF8.  */
13016               || reloc_type == 66   /* R_PRU_DIFF16.  */
13017               || reloc_type == 67   /* R_PRU_DIFF32.  */);
13018     case EM_XTENSA_OLD:
13019     case EM_XTENSA:
13020       return (reloc_type == 0      /* R_XTENSA_NONE.  */
13021               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
13022               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
13023               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
13024     }
13025   return FALSE;
13026 }
13027
13028 /* Returns TRUE if there is a relocation against
13029    section NAME at OFFSET bytes.  */
13030
13031 bfd_boolean
13032 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
13033 {
13034   Elf_Internal_Rela * relocs;
13035   Elf_Internal_Rela * rp;
13036
13037   if (dsec == NULL || dsec->reloc_info == NULL)
13038     return FALSE;
13039
13040   relocs = (Elf_Internal_Rela *) dsec->reloc_info;
13041
13042   for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
13043     if (rp->r_offset == offset)
13044       return TRUE;
13045
13046    return FALSE;
13047 }
13048
13049 /* Apply relocations to a section.
13050    Returns TRUE upon success, FALSE otherwise.
13051    If RELOCS_RETURN is non-NULL then it is set to point to the loaded relocs.
13052    It is then the caller's responsibility to free them.  NUM_RELOCS_RETURN
13053    will be set to the number of relocs loaded.
13054
13055    Note: So far support has been added only for those relocations
13056    which can be found in debug sections. FIXME: Add support for
13057    more relocations ?  */
13058
13059 static bfd_boolean
13060 apply_relocations (Filedata *                 filedata,
13061                    const Elf_Internal_Shdr *  section,
13062                    unsigned char *            start,
13063                    bfd_size_type              size,
13064                    void **                    relocs_return,
13065                    unsigned long *            num_relocs_return)
13066 {
13067   Elf_Internal_Shdr * relsec;
13068   unsigned char * end = start + size;
13069
13070   if (relocs_return != NULL)
13071     {
13072       * (Elf_Internal_Rela **) relocs_return = NULL;
13073       * num_relocs_return = 0;
13074     }
13075
13076   if (filedata->file_header.e_type != ET_REL)
13077     /* No relocs to apply.  */
13078     return TRUE;
13079
13080   /* Find the reloc section associated with the section.  */
13081   for (relsec = filedata->section_headers;
13082        relsec < filedata->section_headers + filedata->file_header.e_shnum;
13083        ++relsec)
13084     {
13085       bfd_boolean is_rela;
13086       unsigned long num_relocs;
13087       Elf_Internal_Rela * relocs;
13088       Elf_Internal_Rela * rp;
13089       Elf_Internal_Shdr * symsec;
13090       Elf_Internal_Sym * symtab;
13091       unsigned long num_syms;
13092       Elf_Internal_Sym * sym;
13093
13094       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13095           || relsec->sh_info >= filedata->file_header.e_shnum
13096           || filedata->section_headers + relsec->sh_info != section
13097           || relsec->sh_size == 0
13098           || relsec->sh_link >= filedata->file_header.e_shnum)
13099         continue;
13100
13101       is_rela = relsec->sh_type == SHT_RELA;
13102
13103       if (is_rela)
13104         {
13105           if (!slurp_rela_relocs (filedata, relsec->sh_offset,
13106                                   relsec->sh_size, & relocs, & num_relocs))
13107             return FALSE;
13108         }
13109       else
13110         {
13111           if (!slurp_rel_relocs (filedata, relsec->sh_offset,
13112                                  relsec->sh_size, & relocs, & num_relocs))
13113             return FALSE;
13114         }
13115
13116       /* SH uses RELA but uses in place value instead of the addend field.  */
13117       if (filedata->file_header.e_machine == EM_SH)
13118         is_rela = FALSE;
13119
13120       symsec = filedata->section_headers + relsec->sh_link;
13121       if (symsec->sh_type != SHT_SYMTAB
13122           && symsec->sh_type != SHT_DYNSYM)
13123         return FALSE;
13124       symtab = GET_ELF_SYMBOLS (filedata, symsec, & num_syms);
13125
13126       for (rp = relocs; rp < relocs + num_relocs; ++rp)
13127         {
13128           bfd_vma         addend;
13129           unsigned int    reloc_type;
13130           unsigned int    reloc_size;
13131           bfd_boolean     reloc_inplace = FALSE;
13132           bfd_boolean     reloc_subtract = FALSE;
13133           unsigned char * rloc;
13134           unsigned long   sym_index;
13135
13136           reloc_type = get_reloc_type (filedata, rp->r_info);
13137
13138           if (target_specific_reloc_handling (filedata, rp, start, end, symtab, num_syms))
13139             continue;
13140           else if (is_none_reloc (filedata, reloc_type))
13141             continue;
13142           else if (is_32bit_abs_reloc (filedata, reloc_type)
13143                    || is_32bit_pcrel_reloc (filedata, reloc_type))
13144             reloc_size = 4;
13145           else if (is_64bit_abs_reloc (filedata, reloc_type)
13146                    || is_64bit_pcrel_reloc (filedata, reloc_type))
13147             reloc_size = 8;
13148           else if (is_24bit_abs_reloc (filedata, reloc_type))
13149             reloc_size = 3;
13150           else if (is_16bit_abs_reloc (filedata, reloc_type))
13151             reloc_size = 2;
13152           else if (is_8bit_abs_reloc (filedata, reloc_type)
13153                    || is_6bit_abs_reloc (filedata, reloc_type))
13154             reloc_size = 1;
13155           else if ((reloc_subtract = is_32bit_inplace_sub_reloc (filedata,
13156                                                                  reloc_type))
13157                    || is_32bit_inplace_add_reloc (filedata, reloc_type))
13158             {
13159               reloc_size = 4;
13160               reloc_inplace = TRUE;
13161             }
13162           else if ((reloc_subtract = is_64bit_inplace_sub_reloc (filedata,
13163                                                                  reloc_type))
13164                    || is_64bit_inplace_add_reloc (filedata, reloc_type))
13165             {
13166               reloc_size = 8;
13167               reloc_inplace = TRUE;
13168             }
13169           else if ((reloc_subtract = is_16bit_inplace_sub_reloc (filedata,
13170                                                                  reloc_type))
13171                    || is_16bit_inplace_add_reloc (filedata, reloc_type))
13172             {
13173               reloc_size = 2;
13174               reloc_inplace = TRUE;
13175             }
13176           else if ((reloc_subtract = is_8bit_inplace_sub_reloc (filedata,
13177                                                                 reloc_type))
13178                    || is_8bit_inplace_add_reloc (filedata, reloc_type))
13179             {
13180               reloc_size = 1;
13181               reloc_inplace = TRUE;
13182             }
13183           else if ((reloc_subtract = is_6bit_inplace_sub_reloc (filedata,
13184                                                                 reloc_type)))
13185             {
13186               reloc_size = 1;
13187               reloc_inplace = TRUE;
13188             }
13189           else
13190             {
13191               static unsigned int prev_reloc = 0;
13192
13193               if (reloc_type != prev_reloc)
13194                 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
13195                       reloc_type, printable_section_name (filedata, section));
13196               prev_reloc = reloc_type;
13197               continue;
13198             }
13199
13200           rloc = start + rp->r_offset;
13201           if ((rloc + reloc_size) > end || (rloc < start))
13202             {
13203               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
13204                     (unsigned long) rp->r_offset,
13205                     printable_section_name (filedata, section));
13206               continue;
13207             }
13208
13209           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
13210           if (sym_index >= num_syms)
13211             {
13212               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
13213                     sym_index, printable_section_name (filedata, section));
13214               continue;
13215             }
13216           sym = symtab + sym_index;
13217
13218           /* If the reloc has a symbol associated with it,
13219              make sure that it is of an appropriate type.
13220
13221              Relocations against symbols without type can happen.
13222              Gcc -feliminate-dwarf2-dups may generate symbols
13223              without type for debug info.
13224
13225              Icc generates relocations against function symbols
13226              instead of local labels.
13227
13228              Relocations against object symbols can happen, eg when
13229              referencing a global array.  For an example of this see
13230              the _clz.o binary in libgcc.a.  */
13231           if (sym != symtab
13232               && ELF_ST_TYPE (sym->st_info) != STT_COMMON
13233               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
13234             {
13235               warn (_("skipping unexpected symbol type %s in section %s relocation %ld\n"),
13236                     get_symbol_type (filedata, ELF_ST_TYPE (sym->st_info)),
13237                     printable_section_name (filedata, relsec),
13238                     (long int)(rp - relocs));
13239               continue;
13240             }
13241
13242           addend = 0;
13243           if (is_rela)
13244             addend += rp->r_addend;
13245           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
13246              partial_inplace.  */
13247           if (!is_rela
13248               || (filedata->file_header.e_machine == EM_XTENSA
13249                   && reloc_type == 1)
13250               || ((filedata->file_header.e_machine == EM_PJ
13251                    || filedata->file_header.e_machine == EM_PJ_OLD)
13252                   && reloc_type == 1)
13253               || ((filedata->file_header.e_machine == EM_D30V
13254                    || filedata->file_header.e_machine == EM_CYGNUS_D30V)
13255                   && reloc_type == 12)
13256               || reloc_inplace)
13257             {
13258               if (is_6bit_inplace_sub_reloc (filedata, reloc_type))
13259                 addend += byte_get (rloc, reloc_size) & 0x3f;
13260               else
13261                 addend += byte_get (rloc, reloc_size);
13262             }
13263
13264           if (is_32bit_pcrel_reloc (filedata, reloc_type)
13265               || is_64bit_pcrel_reloc (filedata, reloc_type))
13266             {
13267               /* On HPPA, all pc-relative relocations are biased by 8.  */
13268               if (filedata->file_header.e_machine == EM_PARISC)
13269                 addend -= 8;
13270               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
13271                         reloc_size);
13272             }
13273           else if (is_6bit_abs_reloc (filedata, reloc_type)
13274                    || is_6bit_inplace_sub_reloc (filedata, reloc_type))
13275             {
13276               if (reloc_subtract)
13277                 addend -= sym->st_value;
13278               else
13279                 addend += sym->st_value;
13280               addend = (addend & 0x3f) | (byte_get (rloc, reloc_size) & 0xc0);
13281               byte_put (rloc, addend, reloc_size);
13282             }
13283           else if (reloc_subtract)
13284             byte_put (rloc, addend - sym->st_value, reloc_size);
13285           else
13286             byte_put (rloc, addend + sym->st_value, reloc_size);
13287         }
13288
13289       free (symtab);
13290       /* Let the target specific reloc processing code know that
13291          we have finished with these relocs.  */
13292       target_specific_reloc_handling (filedata, NULL, NULL, NULL, NULL, 0);
13293
13294       if (relocs_return)
13295         {
13296           * (Elf_Internal_Rela **) relocs_return = relocs;
13297           * num_relocs_return = num_relocs;
13298         }
13299       else
13300         free (relocs);
13301
13302       break;
13303     }
13304
13305   return TRUE;
13306 }
13307
13308 #ifdef SUPPORT_DISASSEMBLY
13309 static bfd_boolean
13310 disassemble_section (Elf_Internal_Shdr * section, Filedata * filedata)
13311 {
13312   printf (_("\nAssembly dump of section %s\n"), printable_section_name (filedata, section));
13313
13314   /* FIXME: XXX -- to be done --- XXX */
13315
13316   return TRUE;
13317 }
13318 #endif
13319
13320 /* Reads in the contents of SECTION from FILE, returning a pointer
13321    to a malloc'ed buffer or NULL if something went wrong.  */
13322
13323 static char *
13324 get_section_contents (Elf_Internal_Shdr * section, Filedata * filedata)
13325 {
13326   bfd_size_type num_bytes = section->sh_size;
13327
13328   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
13329     {
13330       printf (_("Section '%s' has no data to dump.\n"),
13331               printable_section_name (filedata, section));
13332       return NULL;
13333     }
13334
13335   return  (char *) get_data (NULL, filedata, section->sh_offset, 1, num_bytes,
13336                              _("section contents"));
13337 }
13338
13339 /* Uncompresses a section that was compressed using zlib, in place.  */
13340
13341 static bfd_boolean
13342 uncompress_section_contents (unsigned char **   buffer,
13343                              dwarf_size_type    uncompressed_size,
13344                              dwarf_size_type *  size)
13345 {
13346   dwarf_size_type compressed_size = *size;
13347   unsigned char * compressed_buffer = *buffer;
13348   unsigned char * uncompressed_buffer;
13349   z_stream strm;
13350   int rc;
13351
13352   /* It is possible the section consists of several compressed
13353      buffers concatenated together, so we uncompress in a loop.  */
13354   /* PR 18313: The state field in the z_stream structure is supposed
13355      to be invisible to the user (ie us), but some compilers will
13356      still complain about it being used without initialisation.  So
13357      we first zero the entire z_stream structure and then set the fields
13358      that we need.  */
13359   memset (& strm, 0, sizeof strm);
13360   strm.avail_in = compressed_size;
13361   strm.next_in = (Bytef *) compressed_buffer;
13362   strm.avail_out = uncompressed_size;
13363   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
13364
13365   rc = inflateInit (& strm);
13366   while (strm.avail_in > 0)
13367     {
13368       if (rc != Z_OK)
13369         goto fail;
13370       strm.next_out = ((Bytef *) uncompressed_buffer
13371                        + (uncompressed_size - strm.avail_out));
13372       rc = inflate (&strm, Z_FINISH);
13373       if (rc != Z_STREAM_END)
13374         goto fail;
13375       rc = inflateReset (& strm);
13376     }
13377   rc = inflateEnd (& strm);
13378   if (rc != Z_OK
13379       || strm.avail_out != 0)
13380     goto fail;
13381
13382   *buffer = uncompressed_buffer;
13383   *size = uncompressed_size;
13384   return TRUE;
13385
13386  fail:
13387   free (uncompressed_buffer);
13388   /* Indicate decompression failure.  */
13389   *buffer = NULL;
13390   return FALSE;
13391 }
13392
13393 static bfd_boolean
13394 dump_section_as_strings (Elf_Internal_Shdr * section, Filedata * filedata)
13395 {
13396   Elf_Internal_Shdr *  relsec;
13397   bfd_size_type        num_bytes;
13398   unsigned char *      data;
13399   unsigned char *      end;
13400   unsigned char *      real_start;
13401   unsigned char *      start;
13402   bfd_boolean          some_strings_shown;
13403
13404   real_start = start = (unsigned char *) get_section_contents (section, filedata);
13405   if (start == NULL)
13406     /* PR 21820: Do not fail if the section was empty.  */
13407     return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13408
13409   num_bytes = section->sh_size;
13410
13411   printf (_("\nString dump of section '%s':\n"), printable_section_name (filedata, section));
13412
13413   if (decompress_dumps)
13414     {
13415       dwarf_size_type new_size = num_bytes;
13416       dwarf_size_type uncompressed_size = 0;
13417
13418       if ((section->sh_flags & SHF_COMPRESSED) != 0)
13419         {
13420           Elf_Internal_Chdr chdr;
13421           unsigned int compression_header_size
13422             = get_compression_header (& chdr, (unsigned char *) start,
13423                                       num_bytes);
13424
13425           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13426             {
13427               warn (_("section '%s' has unsupported compress type: %d\n"),
13428                     printable_section_name (filedata, section), chdr.ch_type);
13429               return FALSE;
13430             }
13431           uncompressed_size = chdr.ch_size;
13432           start += compression_header_size;
13433           new_size -= compression_header_size;
13434         }
13435       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13436         {
13437           /* Read the zlib header.  In this case, it should be "ZLIB"
13438              followed by the uncompressed section size, 8 bytes in
13439              big-endian order.  */
13440           uncompressed_size = start[4]; uncompressed_size <<= 8;
13441           uncompressed_size += start[5]; uncompressed_size <<= 8;
13442           uncompressed_size += start[6]; uncompressed_size <<= 8;
13443           uncompressed_size += start[7]; uncompressed_size <<= 8;
13444           uncompressed_size += start[8]; uncompressed_size <<= 8;
13445           uncompressed_size += start[9]; uncompressed_size <<= 8;
13446           uncompressed_size += start[10]; uncompressed_size <<= 8;
13447           uncompressed_size += start[11];
13448           start += 12;
13449           new_size -= 12;
13450         }
13451
13452       if (uncompressed_size)
13453         {
13454           if (uncompress_section_contents (& start,
13455                                            uncompressed_size, & new_size))
13456             num_bytes = new_size;
13457           else
13458             {
13459               error (_("Unable to decompress section %s\n"),
13460                      printable_section_name (filedata, section));
13461               return FALSE;
13462             }
13463         }
13464       else
13465         start = real_start;
13466     }
13467
13468   /* If the section being dumped has relocations against it the user might
13469      be expecting these relocations to have been applied.  Check for this
13470      case and issue a warning message in order to avoid confusion.
13471      FIXME: Maybe we ought to have an option that dumps a section with
13472      relocs applied ?  */
13473   for (relsec = filedata->section_headers;
13474        relsec < filedata->section_headers + filedata->file_header.e_shnum;
13475        ++relsec)
13476     {
13477       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13478           || relsec->sh_info >= filedata->file_header.e_shnum
13479           || filedata->section_headers + relsec->sh_info != section
13480           || relsec->sh_size == 0
13481           || relsec->sh_link >= filedata->file_header.e_shnum)
13482         continue;
13483
13484       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13485       break;
13486     }
13487
13488   data = start;
13489   end  = start + num_bytes;
13490   some_strings_shown = FALSE;
13491
13492   while (data < end)
13493     {
13494       while (!ISPRINT (* data))
13495         if (++ data >= end)
13496           break;
13497
13498       if (data < end)
13499         {
13500           size_t maxlen = end - data;
13501
13502 #ifndef __MSVCRT__
13503           /* PR 11128: Use two separate invocations in order to work
13504              around bugs in the Solaris 8 implementation of printf.  */
13505           printf ("  [%6tx]  ", data - start);
13506 #else
13507           printf ("  [%6Ix]  ", (size_t) (data - start));
13508 #endif
13509           if (maxlen > 0)
13510             {
13511               print_symbol ((int) maxlen, (const char *) data);
13512               putchar ('\n');
13513               data += strnlen ((const char *) data, maxlen);
13514             }
13515           else
13516             {
13517               printf (_("<corrupt>\n"));
13518               data = end;
13519             }
13520           some_strings_shown = TRUE;
13521         }
13522     }
13523
13524   if (! some_strings_shown)
13525     printf (_("  No strings found in this section."));
13526
13527   free (real_start);
13528
13529   putchar ('\n');
13530   return TRUE;
13531 }
13532
13533 static bfd_boolean
13534 dump_section_as_bytes (Elf_Internal_Shdr *  section,
13535                        Filedata *           filedata,
13536                        bfd_boolean          relocate)
13537 {
13538   Elf_Internal_Shdr * relsec;
13539   bfd_size_type       bytes;
13540   bfd_size_type       section_size;
13541   bfd_vma             addr;
13542   unsigned char *     data;
13543   unsigned char *     real_start;
13544   unsigned char *     start;
13545
13546   real_start = start = (unsigned char *) get_section_contents (section, filedata);
13547   if (start == NULL)
13548     /* PR 21820: Do not fail if the section was empty.  */
13549     return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13550
13551   section_size = section->sh_size;
13552
13553   printf (_("\nHex dump of section '%s':\n"), printable_section_name (filedata, section));
13554
13555   if (decompress_dumps)
13556     {
13557       dwarf_size_type new_size = section_size;
13558       dwarf_size_type uncompressed_size = 0;
13559
13560       if ((section->sh_flags & SHF_COMPRESSED) != 0)
13561         {
13562           Elf_Internal_Chdr chdr;
13563           unsigned int compression_header_size
13564             = get_compression_header (& chdr, start, section_size);
13565
13566           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13567             {
13568               warn (_("section '%s' has unsupported compress type: %d\n"),
13569                     printable_section_name (filedata, section), chdr.ch_type);
13570               return FALSE;
13571             }
13572           uncompressed_size = chdr.ch_size;
13573           start += compression_header_size;
13574           new_size -= compression_header_size;
13575         }
13576       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13577         {
13578           /* Read the zlib header.  In this case, it should be "ZLIB"
13579              followed by the uncompressed section size, 8 bytes in
13580              big-endian order.  */
13581           uncompressed_size = start[4]; uncompressed_size <<= 8;
13582           uncompressed_size += start[5]; uncompressed_size <<= 8;
13583           uncompressed_size += start[6]; uncompressed_size <<= 8;
13584           uncompressed_size += start[7]; uncompressed_size <<= 8;
13585           uncompressed_size += start[8]; uncompressed_size <<= 8;
13586           uncompressed_size += start[9]; uncompressed_size <<= 8;
13587           uncompressed_size += start[10]; uncompressed_size <<= 8;
13588           uncompressed_size += start[11];
13589           start += 12;
13590           new_size -= 12;
13591         }
13592
13593       if (uncompressed_size)
13594         {
13595           if (uncompress_section_contents (& start, uncompressed_size,
13596                                            & new_size))
13597             {
13598               section_size = new_size;
13599             }
13600           else
13601             {
13602               error (_("Unable to decompress section %s\n"),
13603                      printable_section_name (filedata, section));
13604               /* FIXME: Print the section anyway ?  */
13605               return FALSE;
13606             }
13607         }
13608       else
13609         start = real_start;
13610     }
13611
13612   if (relocate)
13613     {
13614       if (! apply_relocations (filedata, section, start, section_size, NULL, NULL))
13615         return FALSE;
13616     }
13617   else
13618     {
13619       /* If the section being dumped has relocations against it the user might
13620          be expecting these relocations to have been applied.  Check for this
13621          case and issue a warning message in order to avoid confusion.
13622          FIXME: Maybe we ought to have an option that dumps a section with
13623          relocs applied ?  */
13624       for (relsec = filedata->section_headers;
13625            relsec < filedata->section_headers + filedata->file_header.e_shnum;
13626            ++relsec)
13627         {
13628           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13629               || relsec->sh_info >= filedata->file_header.e_shnum
13630               || filedata->section_headers + relsec->sh_info != section
13631               || relsec->sh_size == 0
13632               || relsec->sh_link >= filedata->file_header.e_shnum)
13633             continue;
13634
13635           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13636           break;
13637         }
13638     }
13639
13640   addr = section->sh_addr;
13641   bytes = section_size;
13642   data = start;
13643
13644   while (bytes)
13645     {
13646       int j;
13647       int k;
13648       int lbytes;
13649
13650       lbytes = (bytes > 16 ? 16 : bytes);
13651
13652       printf ("  0x%8.8lx ", (unsigned long) addr);
13653
13654       for (j = 0; j < 16; j++)
13655         {
13656           if (j < lbytes)
13657             printf ("%2.2x", data[j]);
13658           else
13659             printf ("  ");
13660
13661           if ((j & 3) == 3)
13662             printf (" ");
13663         }
13664
13665       for (j = 0; j < lbytes; j++)
13666         {
13667           k = data[j];
13668           if (k >= ' ' && k < 0x7f)
13669             printf ("%c", k);
13670           else
13671             printf (".");
13672         }
13673
13674       putchar ('\n');
13675
13676       data  += lbytes;
13677       addr  += lbytes;
13678       bytes -= lbytes;
13679     }
13680
13681   free (real_start);
13682
13683   putchar ('\n');
13684   return TRUE;
13685 }
13686
13687 static bfd_boolean
13688 load_specific_debug_section (enum dwarf_section_display_enum  debug,
13689                              const Elf_Internal_Shdr *        sec,
13690                              void *                           data)
13691 {
13692   struct dwarf_section * section = &debug_displays [debug].section;
13693   char buf [64];
13694   Filedata * filedata = (Filedata *) data;
13695   
13696   if (section->start != NULL)
13697     {
13698       /* If it is already loaded, do nothing.  */
13699       if (streq (section->filename, filedata->file_name))
13700         return TRUE;
13701       free (section->start);
13702     }
13703
13704   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
13705   section->address = sec->sh_addr;
13706   section->user_data = NULL;
13707   section->filename = filedata->file_name;
13708   section->start = (unsigned char *) get_data (NULL, filedata,
13709                                                sec->sh_offset, 1,
13710                                                sec->sh_size, buf);
13711   if (section->start == NULL)
13712     section->size = 0;
13713   else
13714     {
13715       unsigned char *start = section->start;
13716       dwarf_size_type size = sec->sh_size;
13717       dwarf_size_type uncompressed_size = 0;
13718
13719       if ((sec->sh_flags & SHF_COMPRESSED) != 0)
13720         {
13721           Elf_Internal_Chdr chdr;
13722           unsigned int compression_header_size;
13723
13724           if (size < (is_32bit_elf
13725                       ? sizeof (Elf32_External_Chdr)
13726                       : sizeof (Elf64_External_Chdr)))
13727             {
13728               warn (_("compressed section %s is too small to contain a compression header"),
13729                     section->name);
13730               return FALSE;
13731             }
13732
13733           compression_header_size = get_compression_header (&chdr, start, size);
13734
13735           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13736             {
13737               warn (_("section '%s' has unsupported compress type: %d\n"),
13738                     section->name, chdr.ch_type);
13739               return FALSE;
13740             }
13741           uncompressed_size = chdr.ch_size;
13742           start += compression_header_size;
13743           size -= compression_header_size;
13744         }
13745       else if (size > 12 && streq ((char *) start, "ZLIB"))
13746         {
13747           /* Read the zlib header.  In this case, it should be "ZLIB"
13748              followed by the uncompressed section size, 8 bytes in
13749              big-endian order.  */
13750           uncompressed_size = start[4]; uncompressed_size <<= 8;
13751           uncompressed_size += start[5]; uncompressed_size <<= 8;
13752           uncompressed_size += start[6]; uncompressed_size <<= 8;
13753           uncompressed_size += start[7]; uncompressed_size <<= 8;
13754           uncompressed_size += start[8]; uncompressed_size <<= 8;
13755           uncompressed_size += start[9]; uncompressed_size <<= 8;
13756           uncompressed_size += start[10]; uncompressed_size <<= 8;
13757           uncompressed_size += start[11];
13758           start += 12;
13759           size -= 12;
13760         }
13761
13762       if (uncompressed_size)
13763         {
13764           if (uncompress_section_contents (&start, uncompressed_size,
13765                                            &size))
13766             {
13767               /* Free the compressed buffer, update the section buffer
13768                  and the section size if uncompress is successful.  */
13769               free (section->start);
13770               section->start = start;
13771             }
13772           else
13773             {
13774               error (_("Unable to decompress section %s\n"),
13775                      printable_section_name (filedata, sec));
13776               return FALSE;
13777             }
13778         }
13779
13780       section->size = size;
13781     }
13782
13783   if (section->start == NULL)
13784     return FALSE;
13785
13786   if (debug_displays [debug].relocate)
13787     {
13788       if (! apply_relocations (filedata, sec, section->start, section->size,
13789                                & section->reloc_info, & section->num_relocs))
13790         return FALSE;
13791     }
13792   else
13793     {
13794       section->reloc_info = NULL;
13795       section->num_relocs = 0;
13796     }
13797
13798   return TRUE;
13799 }
13800
13801 /* If this is not NULL, load_debug_section will only look for sections
13802    within the list of sections given here.  */
13803 static unsigned int * section_subset = NULL;
13804
13805 bfd_boolean
13806 load_debug_section (enum dwarf_section_display_enum debug, void * data)
13807 {
13808   struct dwarf_section * section = &debug_displays [debug].section;
13809   Elf_Internal_Shdr * sec;
13810   Filedata * filedata = (Filedata *) data;
13811
13812   /* Without section headers we cannot find any sections.  */
13813   if (filedata->section_headers == NULL)
13814     return FALSE;
13815
13816   if (filedata->string_table == NULL
13817       && filedata->file_header.e_shstrndx != SHN_UNDEF
13818       && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
13819     {
13820       Elf_Internal_Shdr * strs;
13821
13822       /* Read in the string table, so that we have section names to scan.  */
13823       strs = filedata->section_headers + filedata->file_header.e_shstrndx;
13824
13825       if (strs != NULL && strs->sh_size != 0)
13826         {
13827           filedata->string_table
13828             = (char *) get_data (NULL, filedata, strs->sh_offset,
13829                                  1, strs->sh_size, _("string table"));
13830
13831           filedata->string_table_length
13832             = filedata->string_table != NULL ? strs->sh_size : 0;
13833         }
13834     }
13835
13836   /* Locate the debug section.  */
13837   sec = find_section_in_set (filedata, section->uncompressed_name, section_subset);
13838   if (sec != NULL)
13839     section->name = section->uncompressed_name;
13840   else
13841     {
13842       sec = find_section_in_set (filedata, section->compressed_name, section_subset);
13843       if (sec != NULL)
13844         section->name = section->compressed_name;
13845     }
13846   if (sec == NULL)
13847     return FALSE;
13848
13849   /* If we're loading from a subset of sections, and we've loaded
13850      a section matching this name before, it's likely that it's a
13851      different one.  */
13852   if (section_subset != NULL)
13853     free_debug_section (debug);
13854
13855   return load_specific_debug_section (debug, sec, data);
13856 }
13857
13858 void
13859 free_debug_section (enum dwarf_section_display_enum debug)
13860 {
13861   struct dwarf_section * section = &debug_displays [debug].section;
13862
13863   if (section->start == NULL)
13864     return;
13865
13866   free ((char *) section->start);
13867   section->start = NULL;
13868   section->address = 0;
13869   section->size = 0;
13870 }
13871
13872 static bfd_boolean
13873 display_debug_section (int shndx, Elf_Internal_Shdr * section, Filedata * filedata)
13874 {
13875   char * name = SECTION_NAME (section);
13876   const char * print_name = printable_section_name (filedata, section);
13877   bfd_size_type length;
13878   bfd_boolean result = TRUE;
13879   int i;
13880
13881   length = section->sh_size;
13882   if (length == 0)
13883     {
13884       printf (_("\nSection '%s' has no debugging data.\n"), print_name);
13885       return TRUE;
13886     }
13887   if (section->sh_type == SHT_NOBITS)
13888     {
13889       /* There is no point in dumping the contents of a debugging section
13890          which has the NOBITS type - the bits in the file will be random.
13891          This can happen when a file containing a .eh_frame section is
13892          stripped with the --only-keep-debug command line option.  */
13893       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
13894               print_name);
13895       return FALSE;
13896     }
13897
13898   if (const_strneq (name, ".gnu.linkonce.wi."))
13899     name = ".debug_info";
13900
13901   /* See if we know how to display the contents of this section.  */
13902   for (i = 0; i < max; i++)
13903     {
13904       enum dwarf_section_display_enum  id = (enum dwarf_section_display_enum) i;
13905       struct dwarf_section_display *   display = debug_displays + i;
13906       struct dwarf_section *           sec = & display->section;
13907
13908       if (streq (sec->uncompressed_name, name)
13909           || (id == line && const_strneq (name, ".debug_line."))
13910           || streq (sec->compressed_name, name))
13911         {
13912           bfd_boolean secondary = (section != find_section (filedata, name));
13913
13914           if (secondary)
13915             free_debug_section (id);
13916
13917           if (i == line && const_strneq (name, ".debug_line."))
13918             sec->name = name;
13919           else if (streq (sec->uncompressed_name, name))
13920             sec->name = sec->uncompressed_name;
13921           else
13922             sec->name = sec->compressed_name;
13923
13924           if (load_specific_debug_section (id, section, filedata))
13925             {
13926               /* If this debug section is part of a CU/TU set in a .dwp file,
13927                  restrict load_debug_section to the sections in that set.  */
13928               section_subset = find_cu_tu_set (filedata, shndx);
13929
13930               result &= display->display (sec, filedata);
13931
13932               section_subset = NULL;
13933
13934               if (secondary || (id != info && id != abbrev))
13935                 free_debug_section (id);
13936             }
13937           break;
13938         }
13939     }
13940
13941   if (i == max)
13942     {
13943       printf (_("Unrecognized debug section: %s\n"), print_name);
13944       result = FALSE;
13945     }
13946
13947   return result;
13948 }
13949
13950 /* Set DUMP_SECTS for all sections where dumps were requested
13951    based on section name.  */
13952
13953 static void
13954 initialise_dumps_byname (Filedata * filedata)
13955 {
13956   struct dump_list_entry * cur;
13957
13958   for (cur = dump_sects_byname; cur; cur = cur->next)
13959     {
13960       unsigned int i;
13961       bfd_boolean any = FALSE;
13962
13963       for (i = 0; i < filedata->file_header.e_shnum; i++)
13964         if (streq (SECTION_NAME (filedata->section_headers + i), cur->name))
13965           {
13966             request_dump_bynumber (filedata, i, cur->type);
13967             any = TRUE;
13968           }
13969
13970       if (!any)
13971         warn (_("Section '%s' was not dumped because it does not exist!\n"),
13972               cur->name);
13973     }
13974 }
13975
13976 static bfd_boolean
13977 process_section_contents (Filedata * filedata)
13978 {
13979   Elf_Internal_Shdr * section;
13980   unsigned int i;
13981   bfd_boolean res = TRUE;
13982
13983   if (! do_dump)
13984     return TRUE;
13985
13986   initialise_dumps_byname (filedata);
13987
13988   for (i = 0, section = filedata->section_headers;
13989        i < filedata->file_header.e_shnum && i < filedata->num_dump_sects;
13990        i++, section++)
13991     {
13992       dump_type dump = filedata->dump_sects[i];
13993
13994 #ifdef SUPPORT_DISASSEMBLY
13995       if (dump & DISASS_DUMP)
13996         {
13997           if (! disassemble_section (section, filedata))
13998             res = FALSE;
13999         }
14000 #endif
14001       if (dump & HEX_DUMP)
14002         {
14003           if (! dump_section_as_bytes (section, filedata, FALSE))
14004             res = FALSE;
14005         }
14006
14007       if (dump & RELOC_DUMP)
14008         {
14009           if (! dump_section_as_bytes (section, filedata, TRUE))
14010             res = FALSE;
14011         }
14012
14013       if (dump & STRING_DUMP)
14014         {
14015           if (! dump_section_as_strings (section, filedata))
14016             res = FALSE;
14017         }
14018
14019       if (dump & DEBUG_DUMP)
14020         {
14021           if (! display_debug_section (i, section, filedata))
14022             res = FALSE;
14023         }
14024     }
14025
14026   /* Check to see if the user requested a
14027      dump of a section that does not exist.  */
14028   while (i < filedata->num_dump_sects)
14029     {
14030       if (filedata->dump_sects[i])
14031         {
14032           warn (_("Section %d was not dumped because it does not exist!\n"), i);
14033           res = FALSE;
14034         }
14035       i++;
14036     }
14037
14038   return res;
14039 }
14040
14041 static void
14042 process_mips_fpe_exception (int mask)
14043 {
14044   if (mask)
14045     {
14046       bfd_boolean first = TRUE;
14047
14048       if (mask & OEX_FPU_INEX)
14049         fputs ("INEX", stdout), first = FALSE;
14050       if (mask & OEX_FPU_UFLO)
14051         printf ("%sUFLO", first ? "" : "|"), first = FALSE;
14052       if (mask & OEX_FPU_OFLO)
14053         printf ("%sOFLO", first ? "" : "|"), first = FALSE;
14054       if (mask & OEX_FPU_DIV0)
14055         printf ("%sDIV0", first ? "" : "|"), first = FALSE;
14056       if (mask & OEX_FPU_INVAL)
14057         printf ("%sINVAL", first ? "" : "|");
14058     }
14059   else
14060     fputs ("0", stdout);
14061 }
14062
14063 /* Display's the value of TAG at location P.  If TAG is
14064    greater than 0 it is assumed to be an unknown tag, and
14065    a message is printed to this effect.  Otherwise it is
14066    assumed that a message has already been printed.
14067
14068    If the bottom bit of TAG is set it assumed to have a
14069    string value, otherwise it is assumed to have an integer
14070    value.
14071
14072    Returns an updated P pointing to the first unread byte
14073    beyond the end of TAG's value.
14074
14075    Reads at or beyond END will not be made.  */
14076
14077 static unsigned char *
14078 display_tag_value (signed int tag,
14079                    unsigned char * p,
14080                    const unsigned char * const end)
14081 {
14082   unsigned long val;
14083
14084   if (tag > 0)
14085     printf ("  Tag_unknown_%d: ", tag);
14086
14087   if (p >= end)
14088     {
14089       warn (_("<corrupt tag>\n"));
14090     }
14091   else if (tag & 1)
14092     {
14093       /* PR 17531 file: 027-19978-0.004.  */
14094       size_t maxlen = (end - p) - 1;
14095
14096       putchar ('"');
14097       if (maxlen > 0)
14098         {
14099           print_symbol ((int) maxlen, (const char *) p);
14100           p += strnlen ((char *) p, maxlen) + 1;
14101         }
14102       else
14103         {
14104           printf (_("<corrupt string tag>"));
14105           p = (unsigned char *) end;
14106         }
14107       printf ("\"\n");
14108     }
14109   else
14110     {
14111       unsigned int len;
14112
14113       val = read_uleb128 (p, &len, end);
14114       p += len;
14115       printf ("%ld (0x%lx)\n", val, val);
14116     }
14117
14118   assert (p <= end);
14119   return p;
14120 }
14121
14122 /* ARC ABI attributes section.  */
14123
14124 static unsigned char *
14125 display_arc_attribute (unsigned char * p,
14126                        const unsigned char * const end)
14127 {
14128   unsigned int tag;
14129   unsigned int len;
14130   unsigned int val;
14131
14132   tag = read_uleb128 (p, &len, end);
14133   p += len;
14134
14135   switch (tag)
14136     {
14137     case Tag_ARC_PCS_config:
14138       val = read_uleb128 (p, &len, end);
14139       p += len;
14140       printf ("  Tag_ARC_PCS_config: ");
14141       switch (val)
14142         {
14143         case 0:
14144           printf (_("Absent/Non standard\n"));
14145           break;
14146         case 1:
14147           printf (_("Bare metal/mwdt\n"));
14148           break;
14149         case 2:
14150           printf (_("Bare metal/newlib\n"));
14151           break;
14152         case 3:
14153           printf (_("Linux/uclibc\n"));
14154           break;
14155         case 4:
14156           printf (_("Linux/glibc\n"));
14157           break;
14158         default:
14159           printf (_("Unknown\n"));
14160           break;
14161         }
14162       break;
14163
14164     case Tag_ARC_CPU_base:
14165       val = read_uleb128 (p, &len, end);
14166       p += len;
14167       printf ("  Tag_ARC_CPU_base: ");
14168       switch (val)
14169         {
14170         default:
14171         case TAG_CPU_NONE:
14172           printf (_("Absent\n"));
14173           break;
14174         case TAG_CPU_ARC6xx:
14175           printf ("ARC6xx\n");
14176           break;
14177         case TAG_CPU_ARC7xx:
14178           printf ("ARC7xx\n");
14179           break;
14180         case TAG_CPU_ARCEM:
14181           printf ("ARCEM\n");
14182           break;
14183         case TAG_CPU_ARCHS:
14184           printf ("ARCHS\n");
14185           break;
14186         }
14187       break;
14188
14189     case Tag_ARC_CPU_variation:
14190       val = read_uleb128 (p, &len, end);
14191       p += len;
14192       printf ("  Tag_ARC_CPU_variation: ");
14193       switch (val)
14194         {
14195         default:
14196           if (val > 0 && val < 16)
14197               printf ("Core%d\n", val);
14198           else
14199               printf ("Unknown\n");
14200           break;
14201
14202         case 0:
14203           printf (_("Absent\n"));
14204           break;
14205         }
14206       break;
14207
14208     case Tag_ARC_CPU_name:
14209       printf ("  Tag_ARC_CPU_name: ");
14210       p = display_tag_value (-1, p, end);
14211       break;
14212
14213     case Tag_ARC_ABI_rf16:
14214       val = read_uleb128 (p, &len, end);
14215       p += len;
14216       printf ("  Tag_ARC_ABI_rf16: %s\n", val ? _("yes") : _("no"));
14217       break;
14218
14219     case Tag_ARC_ABI_osver:
14220       val = read_uleb128 (p, &len, end);
14221       p += len;
14222       printf ("  Tag_ARC_ABI_osver: v%d\n", val);
14223       break;
14224
14225     case Tag_ARC_ABI_pic:
14226     case Tag_ARC_ABI_sda:
14227       val = read_uleb128 (p, &len, end);
14228       p += len;
14229       printf (tag == Tag_ARC_ABI_sda ? "  Tag_ARC_ABI_sda: "
14230               : "  Tag_ARC_ABI_pic: ");
14231       switch (val)
14232         {
14233         case 0:
14234           printf (_("Absent\n"));
14235           break;
14236         case 1:
14237           printf ("MWDT\n");
14238           break;
14239         case 2:
14240           printf ("GNU\n");
14241           break;
14242         default:
14243           printf (_("Unknown\n"));
14244           break;
14245         }
14246       break;
14247
14248     case Tag_ARC_ABI_tls:
14249       val = read_uleb128 (p, &len, end);
14250       p += len;
14251       printf ("  Tag_ARC_ABI_tls: %s\n", val ? "r25": "none");
14252       break;
14253
14254     case Tag_ARC_ABI_enumsize:
14255       val = read_uleb128 (p, &len, end);
14256       p += len;
14257       printf ("  Tag_ARC_ABI_enumsize: %s\n", val ? _("default") :
14258               _("smallest"));
14259       break;
14260
14261     case Tag_ARC_ABI_exceptions:
14262       val = read_uleb128 (p, &len, end);
14263       p += len;
14264       printf ("  Tag_ARC_ABI_exceptions: %s\n", val ? _("OPTFP")
14265               : _("default"));
14266       break;
14267
14268     case Tag_ARC_ABI_double_size:
14269       val = read_uleb128 (p, &len, end);
14270       p += len;
14271       printf ("  Tag_ARC_ABI_double_size: %d\n", val);
14272       break;
14273
14274     case Tag_ARC_ISA_config:
14275       printf ("  Tag_ARC_ISA_config: ");
14276       p = display_tag_value (-1, p, end);
14277       break;
14278
14279     case Tag_ARC_ISA_apex:
14280       printf ("  Tag_ARC_ISA_apex: ");
14281       p = display_tag_value (-1, p, end);
14282       break;
14283
14284     case Tag_ARC_ISA_mpy_option:
14285       val = read_uleb128 (p, &len, end);
14286       p += len;
14287       printf ("  Tag_ARC_ISA_mpy_option: %d\n", val);
14288       break;
14289
14290     case Tag_ARC_ATR_version:
14291       val = read_uleb128 (p, &len, end);
14292       p += len;
14293       printf ("  Tag_ARC_ATR_version: %d\n", val);
14294       break;
14295
14296     default:
14297       return display_tag_value (tag & 1, p, end);
14298     }
14299
14300   return p;
14301 }
14302
14303 /* ARM EABI attributes section.  */
14304 typedef struct
14305 {
14306   unsigned int tag;
14307   const char * name;
14308   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
14309   unsigned int type;
14310   const char ** table;
14311 } arm_attr_public_tag;
14312
14313 static const char * arm_attr_tag_CPU_arch[] =
14314   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
14315    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "v8-R", "v8-M.baseline",
14316    "v8-M.mainline"};
14317 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
14318 static const char * arm_attr_tag_THUMB_ISA_use[] =
14319   {"No", "Thumb-1", "Thumb-2", "Yes"};
14320 static const char * arm_attr_tag_FP_arch[] =
14321   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
14322    "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
14323 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
14324 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
14325   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
14326    "NEON for ARMv8.1"};
14327 static const char * arm_attr_tag_PCS_config[] =
14328   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
14329    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
14330 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
14331   {"V6", "SB", "TLS", "Unused"};
14332 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
14333   {"Absolute", "PC-relative", "SB-relative", "None"};
14334 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
14335   {"Absolute", "PC-relative", "None"};
14336 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
14337   {"None", "direct", "GOT-indirect"};
14338 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
14339   {"None", "??? 1", "2", "??? 3", "4"};
14340 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
14341 static const char * arm_attr_tag_ABI_FP_denormal[] =
14342   {"Unused", "Needed", "Sign only"};
14343 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
14344 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
14345 static const char * arm_attr_tag_ABI_FP_number_model[] =
14346   {"Unused", "Finite", "RTABI", "IEEE 754"};
14347 static const char * arm_attr_tag_ABI_enum_size[] =
14348   {"Unused", "small", "int", "forced to int"};
14349 static const char * arm_attr_tag_ABI_HardFP_use[] =
14350   {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
14351 static const char * arm_attr_tag_ABI_VFP_args[] =
14352   {"AAPCS", "VFP registers", "custom", "compatible"};
14353 static const char * arm_attr_tag_ABI_WMMX_args[] =
14354   {"AAPCS", "WMMX registers", "custom"};
14355 static const char * arm_attr_tag_ABI_optimization_goals[] =
14356   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14357     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
14358 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
14359   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14360     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
14361 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
14362 static const char * arm_attr_tag_FP_HP_extension[] =
14363   {"Not Allowed", "Allowed"};
14364 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
14365   {"None", "IEEE 754", "Alternative Format"};
14366 static const char * arm_attr_tag_DSP_extension[] =
14367   {"Follow architecture", "Allowed"};
14368 static const char * arm_attr_tag_MPextension_use[] =
14369   {"Not Allowed", "Allowed"};
14370 static const char * arm_attr_tag_DIV_use[] =
14371   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
14372     "Allowed in v7-A with integer division extension"};
14373 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
14374 static const char * arm_attr_tag_Virtualization_use[] =
14375   {"Not Allowed", "TrustZone", "Virtualization Extensions",
14376     "TrustZone and Virtualization Extensions"};
14377 static const char * arm_attr_tag_MPextension_use_legacy[] =
14378   {"Not Allowed", "Allowed"};
14379
14380 #define LOOKUP(id, name) \
14381   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
14382 static arm_attr_public_tag arm_attr_public_tags[] =
14383 {
14384   {4, "CPU_raw_name", 1, NULL},
14385   {5, "CPU_name", 1, NULL},
14386   LOOKUP(6, CPU_arch),
14387   {7, "CPU_arch_profile", 0, NULL},
14388   LOOKUP(8, ARM_ISA_use),
14389   LOOKUP(9, THUMB_ISA_use),
14390   LOOKUP(10, FP_arch),
14391   LOOKUP(11, WMMX_arch),
14392   LOOKUP(12, Advanced_SIMD_arch),
14393   LOOKUP(13, PCS_config),
14394   LOOKUP(14, ABI_PCS_R9_use),
14395   LOOKUP(15, ABI_PCS_RW_data),
14396   LOOKUP(16, ABI_PCS_RO_data),
14397   LOOKUP(17, ABI_PCS_GOT_use),
14398   LOOKUP(18, ABI_PCS_wchar_t),
14399   LOOKUP(19, ABI_FP_rounding),
14400   LOOKUP(20, ABI_FP_denormal),
14401   LOOKUP(21, ABI_FP_exceptions),
14402   LOOKUP(22, ABI_FP_user_exceptions),
14403   LOOKUP(23, ABI_FP_number_model),
14404   {24, "ABI_align_needed", 0, NULL},
14405   {25, "ABI_align_preserved", 0, NULL},
14406   LOOKUP(26, ABI_enum_size),
14407   LOOKUP(27, ABI_HardFP_use),
14408   LOOKUP(28, ABI_VFP_args),
14409   LOOKUP(29, ABI_WMMX_args),
14410   LOOKUP(30, ABI_optimization_goals),
14411   LOOKUP(31, ABI_FP_optimization_goals),
14412   {32, "compatibility", 0, NULL},
14413   LOOKUP(34, CPU_unaligned_access),
14414   LOOKUP(36, FP_HP_extension),
14415   LOOKUP(38, ABI_FP_16bit_format),
14416   LOOKUP(42, MPextension_use),
14417   LOOKUP(44, DIV_use),
14418   LOOKUP(46, DSP_extension),
14419   {64, "nodefaults", 0, NULL},
14420   {65, "also_compatible_with", 0, NULL},
14421   LOOKUP(66, T2EE_use),
14422   {67, "conformance", 1, NULL},
14423   LOOKUP(68, Virtualization_use),
14424   LOOKUP(70, MPextension_use_legacy)
14425 };
14426 #undef LOOKUP
14427
14428 static unsigned char *
14429 display_arm_attribute (unsigned char * p,
14430                        const unsigned char * const end)
14431 {
14432   unsigned int tag;
14433   unsigned int len;
14434   unsigned int val;
14435   arm_attr_public_tag * attr;
14436   unsigned i;
14437   unsigned int type;
14438
14439   tag = read_uleb128 (p, &len, end);
14440   p += len;
14441   attr = NULL;
14442   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
14443     {
14444       if (arm_attr_public_tags[i].tag == tag)
14445         {
14446           attr = &arm_attr_public_tags[i];
14447           break;
14448         }
14449     }
14450
14451   if (attr)
14452     {
14453       printf ("  Tag_%s: ", attr->name);
14454       switch (attr->type)
14455         {
14456         case 0:
14457           switch (tag)
14458             {
14459             case 7: /* Tag_CPU_arch_profile.  */
14460               val = read_uleb128 (p, &len, end);
14461               p += len;
14462               switch (val)
14463                 {
14464                 case 0: printf (_("None\n")); break;
14465                 case 'A': printf (_("Application\n")); break;
14466                 case 'R': printf (_("Realtime\n")); break;
14467                 case 'M': printf (_("Microcontroller\n")); break;
14468                 case 'S': printf (_("Application or Realtime\n")); break;
14469                 default: printf ("??? (%d)\n", val); break;
14470                 }
14471               break;
14472
14473             case 24: /* Tag_align_needed.  */
14474               val = read_uleb128 (p, &len, end);
14475               p += len;
14476               switch (val)
14477                 {
14478                 case 0: printf (_("None\n")); break;
14479                 case 1: printf (_("8-byte\n")); break;
14480                 case 2: printf (_("4-byte\n")); break;
14481                 case 3: printf ("??? 3\n"); break;
14482                 default:
14483                   if (val <= 12)
14484                     printf (_("8-byte and up to %d-byte extended\n"),
14485                             1 << val);
14486                   else
14487                     printf ("??? (%d)\n", val);
14488                   break;
14489                 }
14490               break;
14491
14492             case 25: /* Tag_align_preserved.  */
14493               val = read_uleb128 (p, &len, end);
14494               p += len;
14495               switch (val)
14496                 {
14497                 case 0: printf (_("None\n")); break;
14498                 case 1: printf (_("8-byte, except leaf SP\n")); break;
14499                 case 2: printf (_("8-byte\n")); break;
14500                 case 3: printf ("??? 3\n"); break;
14501                 default:
14502                   if (val <= 12)
14503                     printf (_("8-byte and up to %d-byte extended\n"),
14504                             1 << val);
14505                   else
14506                     printf ("??? (%d)\n", val);
14507                   break;
14508                 }
14509               break;
14510
14511             case 32: /* Tag_compatibility.  */
14512               {
14513                 val = read_uleb128 (p, &len, end);
14514                 p += len;
14515                 printf (_("flag = %d, vendor = "), val);
14516                 if (p < end - 1)
14517                   {
14518                     size_t maxlen = (end - p) - 1;
14519
14520                     print_symbol ((int) maxlen, (const char *) p);
14521                     p += strnlen ((char *) p, maxlen) + 1;
14522                   }
14523                 else
14524                   {
14525                     printf (_("<corrupt>"));
14526                     p = (unsigned char *) end;
14527                   }
14528                 putchar ('\n');
14529               }
14530               break;
14531
14532             case 64: /* Tag_nodefaults.  */
14533               /* PR 17531: file: 001-505008-0.01.  */
14534               if (p < end)
14535                 p++;
14536               printf (_("True\n"));
14537               break;
14538
14539             case 65: /* Tag_also_compatible_with.  */
14540               val = read_uleb128 (p, &len, end);
14541               p += len;
14542               if (val == 6 /* Tag_CPU_arch.  */)
14543                 {
14544                   val = read_uleb128 (p, &len, end);
14545                   p += len;
14546                   if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
14547                     printf ("??? (%d)\n", val);
14548                   else
14549                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
14550                 }
14551               else
14552                 printf ("???\n");
14553               while (p < end && *(p++) != '\0' /* NUL terminator.  */)
14554                 ;
14555               break;
14556
14557             default:
14558               printf (_("<unknown: %d>\n"), tag);
14559               break;
14560             }
14561           return p;
14562
14563         case 1:
14564           return display_tag_value (-1, p, end);
14565         case 2:
14566           return display_tag_value (0, p, end);
14567
14568         default:
14569           assert (attr->type & 0x80);
14570           val = read_uleb128 (p, &len, end);
14571           p += len;
14572           type = attr->type & 0x7f;
14573           if (val >= type)
14574             printf ("??? (%d)\n", val);
14575           else
14576             printf ("%s\n", attr->table[val]);
14577           return p;
14578         }
14579     }
14580
14581   return display_tag_value (tag, p, end);
14582 }
14583
14584 static unsigned char *
14585 display_gnu_attribute (unsigned char * p,
14586                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const),
14587                        const unsigned char * const end)
14588 {
14589   int tag;
14590   unsigned int len;
14591   unsigned int val;
14592
14593   tag = read_uleb128 (p, &len, end);
14594   p += len;
14595
14596   /* Tag_compatibility is the only generic GNU attribute defined at
14597      present.  */
14598   if (tag == 32)
14599     {
14600       val = read_uleb128 (p, &len, end);
14601       p += len;
14602
14603       printf (_("flag = %d, vendor = "), val);
14604       if (p == end)
14605         {
14606           printf (_("<corrupt>\n"));
14607           warn (_("corrupt vendor attribute\n"));
14608         }
14609       else
14610         {
14611           if (p < end - 1)
14612             {
14613               size_t maxlen = (end - p) - 1;
14614
14615               print_symbol ((int) maxlen, (const char *) p);
14616               p += strnlen ((char *) p, maxlen) + 1;
14617             }
14618           else
14619             {
14620               printf (_("<corrupt>"));
14621               p = (unsigned char *) end;
14622             }
14623           putchar ('\n');
14624         }
14625       return p;
14626     }
14627
14628   if ((tag & 2) == 0 && display_proc_gnu_attribute)
14629     return display_proc_gnu_attribute (p, tag, end);
14630
14631   return display_tag_value (tag, p, end);
14632 }
14633
14634 static unsigned char *
14635 display_power_gnu_attribute (unsigned char * p,
14636                              unsigned int tag,
14637                              const unsigned char * const end)
14638 {
14639   unsigned int len;
14640   unsigned int val;
14641
14642   if (tag == Tag_GNU_Power_ABI_FP)
14643     {
14644       val = read_uleb128 (p, &len, end);
14645       p += len;
14646       printf ("  Tag_GNU_Power_ABI_FP: ");
14647       if (len == 0)
14648         {
14649           printf (_("<corrupt>\n"));
14650           return p;
14651         }
14652
14653       if (val > 15)
14654         printf ("(%#x), ", val);
14655
14656       switch (val & 3)
14657         {
14658         case 0:
14659           printf (_("unspecified hard/soft float, "));
14660           break;
14661         case 1:
14662           printf (_("hard float, "));
14663           break;
14664         case 2:
14665           printf (_("soft float, "));
14666           break;
14667         case 3:
14668           printf (_("single-precision hard float, "));
14669           break;
14670         }
14671
14672       switch (val & 0xC)
14673         {
14674         case 0:
14675           printf (_("unspecified long double\n"));
14676           break;
14677         case 4:
14678           printf (_("128-bit IBM long double\n"));
14679           break;
14680         case 8:
14681           printf (_("64-bit long double\n"));
14682           break;
14683         case 12:
14684           printf (_("128-bit IEEE long double\n"));
14685           break;
14686         }
14687       return p;
14688     }
14689
14690   if (tag == Tag_GNU_Power_ABI_Vector)
14691     {
14692       val = read_uleb128 (p, &len, end);
14693       p += len;
14694       printf ("  Tag_GNU_Power_ABI_Vector: ");
14695       if (len == 0)
14696         {
14697           printf (_("<corrupt>\n"));
14698           return p;
14699         }
14700
14701       if (val > 3)
14702         printf ("(%#x), ", val);
14703
14704       switch (val & 3)
14705         {
14706         case 0:
14707           printf (_("unspecified\n"));
14708           break;
14709         case 1:
14710           printf (_("generic\n"));
14711           break;
14712         case 2:
14713           printf ("AltiVec\n");
14714           break;
14715         case 3:
14716           printf ("SPE\n");
14717           break;
14718         }
14719       return p;
14720     }
14721
14722   if (tag == Tag_GNU_Power_ABI_Struct_Return)
14723     {
14724       val = read_uleb128 (p, &len, end);
14725       p += len;
14726       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
14727       if (len == 0)
14728         {
14729           printf (_("<corrupt>\n"));
14730           return p;
14731         }
14732
14733       if (val > 2)
14734         printf ("(%#x), ", val);
14735
14736       switch (val & 3)
14737         {
14738         case 0:
14739           printf (_("unspecified\n"));
14740           break;
14741         case 1:
14742           printf ("r3/r4\n");
14743           break;
14744         case 2:
14745           printf (_("memory\n"));
14746           break;
14747         case 3:
14748           printf ("???\n");
14749           break;
14750         }
14751       return p;
14752     }
14753
14754   return display_tag_value (tag & 1, p, end);
14755 }
14756
14757 static unsigned char *
14758 display_s390_gnu_attribute (unsigned char * p,
14759                             unsigned int tag,
14760                             const unsigned char * const end)
14761 {
14762   unsigned int len;
14763   int val;
14764
14765   if (tag == Tag_GNU_S390_ABI_Vector)
14766     {
14767       val = read_uleb128 (p, &len, end);
14768       p += len;
14769       printf ("  Tag_GNU_S390_ABI_Vector: ");
14770
14771       switch (val)
14772         {
14773         case 0:
14774           printf (_("any\n"));
14775           break;
14776         case 1:
14777           printf (_("software\n"));
14778           break;
14779         case 2:
14780           printf (_("hardware\n"));
14781           break;
14782         default:
14783           printf ("??? (%d)\n", val);
14784           break;
14785         }
14786       return p;
14787    }
14788
14789   return display_tag_value (tag & 1, p, end);
14790 }
14791
14792 static void
14793 display_sparc_hwcaps (unsigned int mask)
14794 {
14795   if (mask)
14796     {
14797       bfd_boolean first = TRUE;
14798
14799       if (mask & ELF_SPARC_HWCAP_MUL32)
14800         fputs ("mul32", stdout), first = FALSE;
14801       if (mask & ELF_SPARC_HWCAP_DIV32)
14802         printf ("%sdiv32", first ? "" : "|"), first = FALSE;
14803       if (mask & ELF_SPARC_HWCAP_FSMULD)
14804         printf ("%sfsmuld", first ? "" : "|"), first = FALSE;
14805       if (mask & ELF_SPARC_HWCAP_V8PLUS)
14806         printf ("%sv8plus", first ? "" : "|"), first = FALSE;
14807       if (mask & ELF_SPARC_HWCAP_POPC)
14808         printf ("%spopc", first ? "" : "|"), first = FALSE;
14809       if (mask & ELF_SPARC_HWCAP_VIS)
14810         printf ("%svis", first ? "" : "|"), first = FALSE;
14811       if (mask & ELF_SPARC_HWCAP_VIS2)
14812         printf ("%svis2", first ? "" : "|"), first = FALSE;
14813       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
14814         printf ("%sASIBlkInit", first ? "" : "|"), first = FALSE;
14815       if (mask & ELF_SPARC_HWCAP_FMAF)
14816         printf ("%sfmaf", first ? "" : "|"), first = FALSE;
14817       if (mask & ELF_SPARC_HWCAP_VIS3)
14818         printf ("%svis3", first ? "" : "|"), first = FALSE;
14819       if (mask & ELF_SPARC_HWCAP_HPC)
14820         printf ("%shpc", first ? "" : "|"), first = FALSE;
14821       if (mask & ELF_SPARC_HWCAP_RANDOM)
14822         printf ("%srandom", first ? "" : "|"), first = FALSE;
14823       if (mask & ELF_SPARC_HWCAP_TRANS)
14824         printf ("%strans", first ? "" : "|"), first = FALSE;
14825       if (mask & ELF_SPARC_HWCAP_FJFMAU)
14826         printf ("%sfjfmau", first ? "" : "|"), first = FALSE;
14827       if (mask & ELF_SPARC_HWCAP_IMA)
14828         printf ("%sima", first ? "" : "|"), first = FALSE;
14829       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
14830         printf ("%scspare", first ? "" : "|"), first = FALSE;
14831     }
14832   else
14833     fputc ('0', stdout);
14834   fputc ('\n', stdout);
14835 }
14836
14837 static void
14838 display_sparc_hwcaps2 (unsigned int mask)
14839 {
14840   if (mask)
14841     {
14842       bfd_boolean first = TRUE;
14843
14844       if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
14845         fputs ("fjathplus", stdout), first = FALSE;
14846       if (mask & ELF_SPARC_HWCAP2_VIS3B)
14847         printf ("%svis3b", first ? "" : "|"), first = FALSE;
14848       if (mask & ELF_SPARC_HWCAP2_ADP)
14849         printf ("%sadp", first ? "" : "|"), first = FALSE;
14850       if (mask & ELF_SPARC_HWCAP2_SPARC5)
14851         printf ("%ssparc5", first ? "" : "|"), first = FALSE;
14852       if (mask & ELF_SPARC_HWCAP2_MWAIT)
14853         printf ("%smwait", first ? "" : "|"), first = FALSE;
14854       if (mask & ELF_SPARC_HWCAP2_XMPMUL)
14855         printf ("%sxmpmul", first ? "" : "|"), first = FALSE;
14856       if (mask & ELF_SPARC_HWCAP2_XMONT)
14857         printf ("%sxmont2", first ? "" : "|"), first = FALSE;
14858       if (mask & ELF_SPARC_HWCAP2_NSEC)
14859         printf ("%snsec", first ? "" : "|"), first = FALSE;
14860       if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
14861         printf ("%sfjathhpc", first ? "" : "|"), first = FALSE;
14862       if (mask & ELF_SPARC_HWCAP2_FJDES)
14863         printf ("%sfjdes", first ? "" : "|"), first = FALSE;
14864       if (mask & ELF_SPARC_HWCAP2_FJAES)
14865         printf ("%sfjaes", first ? "" : "|"), first = FALSE;
14866     }
14867   else
14868     fputc ('0', stdout);
14869   fputc ('\n', stdout);
14870 }
14871
14872 static unsigned char *
14873 display_sparc_gnu_attribute (unsigned char * p,
14874                              unsigned int tag,
14875                              const unsigned char * const end)
14876 {
14877   unsigned int len;
14878   int val;
14879
14880   if (tag == Tag_GNU_Sparc_HWCAPS)
14881     {
14882       val = read_uleb128 (p, &len, end);
14883       p += len;
14884       printf ("  Tag_GNU_Sparc_HWCAPS: ");
14885       display_sparc_hwcaps (val);
14886       return p;
14887     }
14888   if (tag == Tag_GNU_Sparc_HWCAPS2)
14889     {
14890       val = read_uleb128 (p, &len, end);
14891       p += len;
14892       printf ("  Tag_GNU_Sparc_HWCAPS2: ");
14893       display_sparc_hwcaps2 (val);
14894       return p;
14895     }
14896
14897   return display_tag_value (tag, p, end);
14898 }
14899
14900 static void
14901 print_mips_fp_abi_value (unsigned int val)
14902 {
14903   switch (val)
14904     {
14905     case Val_GNU_MIPS_ABI_FP_ANY:
14906       printf (_("Hard or soft float\n"));
14907       break;
14908     case Val_GNU_MIPS_ABI_FP_DOUBLE:
14909       printf (_("Hard float (double precision)\n"));
14910       break;
14911     case Val_GNU_MIPS_ABI_FP_SINGLE:
14912       printf (_("Hard float (single precision)\n"));
14913       break;
14914     case Val_GNU_MIPS_ABI_FP_SOFT:
14915       printf (_("Soft float\n"));
14916       break;
14917     case Val_GNU_MIPS_ABI_FP_OLD_64:
14918       printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
14919       break;
14920     case Val_GNU_MIPS_ABI_FP_XX:
14921       printf (_("Hard float (32-bit CPU, Any FPU)\n"));
14922       break;
14923     case Val_GNU_MIPS_ABI_FP_64:
14924       printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
14925       break;
14926     case Val_GNU_MIPS_ABI_FP_64A:
14927       printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
14928       break;
14929     case Val_GNU_MIPS_ABI_FP_NAN2008:
14930       printf (_("NaN 2008 compatibility\n"));
14931       break;
14932     default:
14933       printf ("??? (%d)\n", val);
14934       break;
14935     }
14936 }
14937
14938 static unsigned char *
14939 display_mips_gnu_attribute (unsigned char * p,
14940                             unsigned int tag,
14941                             const unsigned char * const end)
14942 {
14943   if (tag == Tag_GNU_MIPS_ABI_FP)
14944     {
14945       unsigned int len;
14946       unsigned int val;
14947
14948       val = read_uleb128 (p, &len, end);
14949       p += len;
14950       printf ("  Tag_GNU_MIPS_ABI_FP: ");
14951
14952       print_mips_fp_abi_value (val);
14953
14954       return p;
14955    }
14956
14957   if (tag == Tag_GNU_MIPS_ABI_MSA)
14958     {
14959       unsigned int len;
14960       unsigned int val;
14961
14962       val = read_uleb128 (p, &len, end);
14963       p += len;
14964       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
14965
14966       switch (val)
14967         {
14968         case Val_GNU_MIPS_ABI_MSA_ANY:
14969           printf (_("Any MSA or not\n"));
14970           break;
14971         case Val_GNU_MIPS_ABI_MSA_128:
14972           printf (_("128-bit MSA\n"));
14973           break;
14974         default:
14975           printf ("??? (%d)\n", val);
14976           break;
14977         }
14978       return p;
14979     }
14980
14981   return display_tag_value (tag & 1, p, end);
14982 }
14983
14984 static unsigned char *
14985 display_tic6x_attribute (unsigned char * p,
14986                          const unsigned char * const end)
14987 {
14988   unsigned int tag;
14989   unsigned int len;
14990   int val;
14991
14992   tag = read_uleb128 (p, &len, end);
14993   p += len;
14994
14995   switch (tag)
14996     {
14997     case Tag_ISA:
14998       val = read_uleb128 (p, &len, end);
14999       p += len;
15000       printf ("  Tag_ISA: ");
15001
15002       switch (val)
15003         {
15004         case C6XABI_Tag_ISA_none:
15005           printf (_("None\n"));
15006           break;
15007         case C6XABI_Tag_ISA_C62X:
15008           printf ("C62x\n");
15009           break;
15010         case C6XABI_Tag_ISA_C67X:
15011           printf ("C67x\n");
15012           break;
15013         case C6XABI_Tag_ISA_C67XP:
15014           printf ("C67x+\n");
15015           break;
15016         case C6XABI_Tag_ISA_C64X:
15017           printf ("C64x\n");
15018           break;
15019         case C6XABI_Tag_ISA_C64XP:
15020           printf ("C64x+\n");
15021           break;
15022         case C6XABI_Tag_ISA_C674X:
15023           printf ("C674x\n");
15024           break;
15025         default:
15026           printf ("??? (%d)\n", val);
15027           break;
15028         }
15029       return p;
15030
15031     case Tag_ABI_wchar_t:
15032       val = read_uleb128 (p, &len, end);
15033       p += len;
15034       printf ("  Tag_ABI_wchar_t: ");
15035       switch (val)
15036         {
15037         case 0:
15038           printf (_("Not used\n"));
15039           break;
15040         case 1:
15041           printf (_("2 bytes\n"));
15042           break;
15043         case 2:
15044           printf (_("4 bytes\n"));
15045           break;
15046         default:
15047           printf ("??? (%d)\n", val);
15048           break;
15049         }
15050       return p;
15051
15052     case Tag_ABI_stack_align_needed:
15053       val = read_uleb128 (p, &len, end);
15054       p += len;
15055       printf ("  Tag_ABI_stack_align_needed: ");
15056       switch (val)
15057         {
15058         case 0:
15059           printf (_("8-byte\n"));
15060           break;
15061         case 1:
15062           printf (_("16-byte\n"));
15063           break;
15064         default:
15065           printf ("??? (%d)\n", val);
15066           break;
15067         }
15068       return p;
15069
15070     case Tag_ABI_stack_align_preserved:
15071       val = read_uleb128 (p, &len, end);
15072       p += len;
15073       printf ("  Tag_ABI_stack_align_preserved: ");
15074       switch (val)
15075         {
15076         case 0:
15077           printf (_("8-byte\n"));
15078           break;
15079         case 1:
15080           printf (_("16-byte\n"));
15081           break;
15082         default:
15083           printf ("??? (%d)\n", val);
15084           break;
15085         }
15086       return p;
15087
15088     case Tag_ABI_DSBT:
15089       val = read_uleb128 (p, &len, end);
15090       p += len;
15091       printf ("  Tag_ABI_DSBT: ");
15092       switch (val)
15093         {
15094         case 0:
15095           printf (_("DSBT addressing not used\n"));
15096           break;
15097         case 1:
15098           printf (_("DSBT addressing used\n"));
15099           break;
15100         default:
15101           printf ("??? (%d)\n", val);
15102           break;
15103         }
15104       return p;
15105
15106     case Tag_ABI_PID:
15107       val = read_uleb128 (p, &len, end);
15108       p += len;
15109       printf ("  Tag_ABI_PID: ");
15110       switch (val)
15111         {
15112         case 0:
15113           printf (_("Data addressing position-dependent\n"));
15114           break;
15115         case 1:
15116           printf (_("Data addressing position-independent, GOT near DP\n"));
15117           break;
15118         case 2:
15119           printf (_("Data addressing position-independent, GOT far from DP\n"));
15120           break;
15121         default:
15122           printf ("??? (%d)\n", val);
15123           break;
15124         }
15125       return p;
15126
15127     case Tag_ABI_PIC:
15128       val = read_uleb128 (p, &len, end);
15129       p += len;
15130       printf ("  Tag_ABI_PIC: ");
15131       switch (val)
15132         {
15133         case 0:
15134           printf (_("Code addressing position-dependent\n"));
15135           break;
15136         case 1:
15137           printf (_("Code addressing position-independent\n"));
15138           break;
15139         default:
15140           printf ("??? (%d)\n", val);
15141           break;
15142         }
15143       return p;
15144
15145     case Tag_ABI_array_object_alignment:
15146       val = read_uleb128 (p, &len, end);
15147       p += len;
15148       printf ("  Tag_ABI_array_object_alignment: ");
15149       switch (val)
15150         {
15151         case 0:
15152           printf (_("8-byte\n"));
15153           break;
15154         case 1:
15155           printf (_("4-byte\n"));
15156           break;
15157         case 2:
15158           printf (_("16-byte\n"));
15159           break;
15160         default:
15161           printf ("??? (%d)\n", val);
15162           break;
15163         }
15164       return p;
15165
15166     case Tag_ABI_array_object_align_expected:
15167       val = read_uleb128 (p, &len, end);
15168       p += len;
15169       printf ("  Tag_ABI_array_object_align_expected: ");
15170       switch (val)
15171         {
15172         case 0:
15173           printf (_("8-byte\n"));
15174           break;
15175         case 1:
15176           printf (_("4-byte\n"));
15177           break;
15178         case 2:
15179           printf (_("16-byte\n"));
15180           break;
15181         default:
15182           printf ("??? (%d)\n", val);
15183           break;
15184         }
15185       return p;
15186
15187     case Tag_ABI_compatibility:
15188       {
15189         val = read_uleb128 (p, &len, end);
15190         p += len;
15191         printf ("  Tag_ABI_compatibility: ");
15192         printf (_("flag = %d, vendor = "), val);
15193         if (p < end - 1)
15194           {
15195             size_t maxlen = (end - p) - 1;
15196
15197             print_symbol ((int) maxlen, (const char *) p);
15198             p += strnlen ((char *) p, maxlen) + 1;
15199           }
15200         else
15201           {
15202             printf (_("<corrupt>"));
15203             p = (unsigned char *) end;
15204           }
15205         putchar ('\n');
15206         return p;
15207       }
15208
15209     case Tag_ABI_conformance:
15210       {
15211         printf ("  Tag_ABI_conformance: \"");
15212         if (p < end - 1)
15213           {
15214             size_t maxlen = (end - p) - 1;
15215
15216             print_symbol ((int) maxlen, (const char *) p);
15217             p += strnlen ((char *) p, maxlen) + 1;
15218           }
15219         else
15220           {
15221             printf (_("<corrupt>"));
15222             p = (unsigned char *) end;
15223           }
15224         printf ("\"\n");
15225         return p;
15226       }
15227     }
15228
15229   return display_tag_value (tag, p, end);
15230 }
15231
15232 static void
15233 display_raw_attribute (unsigned char * p, unsigned char const * const end)
15234 {
15235   unsigned long addr = 0;
15236   size_t bytes = end - p;
15237
15238   assert (end >= p);
15239   while (bytes)
15240     {
15241       int j;
15242       int k;
15243       int lbytes = (bytes > 16 ? 16 : bytes);
15244
15245       printf ("  0x%8.8lx ", addr);
15246
15247       for (j = 0; j < 16; j++)
15248         {
15249           if (j < lbytes)
15250             printf ("%2.2x", p[j]);
15251           else
15252             printf ("  ");
15253
15254           if ((j & 3) == 3)
15255             printf (" ");
15256         }
15257
15258       for (j = 0; j < lbytes; j++)
15259         {
15260           k = p[j];
15261           if (k >= ' ' && k < 0x7f)
15262             printf ("%c", k);
15263           else
15264             printf (".");
15265         }
15266
15267       putchar ('\n');
15268
15269       p  += lbytes;
15270       bytes -= lbytes;
15271       addr += lbytes;
15272     }
15273
15274   putchar ('\n');
15275 }
15276
15277 static unsigned char *
15278 display_msp430x_attribute (unsigned char * p,
15279                            const unsigned char * const end)
15280 {
15281   unsigned int len;
15282   unsigned int val;
15283   unsigned int tag;
15284
15285   tag = read_uleb128 (p, & len, end);
15286   p += len;
15287
15288   switch (tag)
15289     {
15290     case OFBA_MSPABI_Tag_ISA:
15291       val = read_uleb128 (p, &len, end);
15292       p += len;
15293       printf ("  Tag_ISA: ");
15294       switch (val)
15295         {
15296         case 0: printf (_("None\n")); break;
15297         case 1: printf (_("MSP430\n")); break;
15298         case 2: printf (_("MSP430X\n")); break;
15299         default: printf ("??? (%d)\n", val); break;
15300         }
15301       break;
15302
15303     case OFBA_MSPABI_Tag_Code_Model:
15304       val = read_uleb128 (p, &len, end);
15305       p += len;
15306       printf ("  Tag_Code_Model: ");
15307       switch (val)
15308         {
15309         case 0: printf (_("None\n")); break;
15310         case 1: printf (_("Small\n")); break;
15311         case 2: printf (_("Large\n")); break;
15312         default: printf ("??? (%d)\n", val); break;
15313         }
15314       break;
15315
15316     case OFBA_MSPABI_Tag_Data_Model:
15317       val = read_uleb128 (p, &len, end);
15318       p += len;
15319       printf ("  Tag_Data_Model: ");
15320       switch (val)
15321         {
15322         case 0: printf (_("None\n")); break;
15323         case 1: printf (_("Small\n")); break;
15324         case 2: printf (_("Large\n")); break;
15325         case 3: printf (_("Restricted Large\n")); break;
15326         default: printf ("??? (%d)\n", val); break;
15327         }
15328       break;
15329
15330     default:
15331       printf (_("  <unknown tag %d>: "), tag);
15332
15333       if (tag & 1)
15334         {
15335           putchar ('"');
15336           if (p < end - 1)
15337             {
15338               size_t maxlen = (end - p) - 1;
15339
15340               print_symbol ((int) maxlen, (const char *) p);
15341               p += strnlen ((char *) p, maxlen) + 1;
15342             }
15343           else
15344             {
15345               printf (_("<corrupt>"));
15346               p = (unsigned char *) end;
15347             }
15348           printf ("\"\n");
15349         }
15350       else
15351         {
15352           val = read_uleb128 (p, &len, end);
15353           p += len;
15354           printf ("%d (0x%x)\n", val, val);
15355         }
15356       break;
15357    }
15358
15359   assert (p <= end);
15360   return p;
15361 }
15362
15363 static bfd_boolean
15364 process_attributes (Filedata * filedata,
15365                     const char * public_name,
15366                     unsigned int proc_type,
15367                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
15368                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const))
15369 {
15370   Elf_Internal_Shdr * sect;
15371   unsigned i;
15372   bfd_boolean res = TRUE;
15373
15374   /* Find the section header so that we get the size.  */
15375   for (i = 0, sect = filedata->section_headers;
15376        i < filedata->file_header.e_shnum;
15377        i++, sect++)
15378     {
15379       unsigned char * contents;
15380       unsigned char * p;
15381
15382       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
15383         continue;
15384
15385       contents = (unsigned char *) get_data (NULL, filedata, sect->sh_offset, 1,
15386                                              sect->sh_size, _("attributes"));
15387       if (contents == NULL)
15388         {
15389           res = FALSE;
15390           continue;
15391         }
15392
15393       p = contents;
15394       /* The first character is the version of the attributes.
15395          Currently only version 1, (aka 'A') is recognised here.  */
15396       if (*p != 'A')
15397         {
15398           printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p);
15399           res = FALSE;
15400         }
15401       else
15402         {
15403           bfd_vma section_len;
15404
15405           section_len = sect->sh_size - 1;
15406           p++;
15407
15408           while (section_len > 0)
15409             {
15410               bfd_vma attr_len;
15411               unsigned int namelen;
15412               bfd_boolean public_section;
15413               bfd_boolean gnu_section;
15414
15415               if (section_len <= 4)
15416                 {
15417                   error (_("Tag section ends prematurely\n"));
15418                   res = FALSE;
15419                   break;
15420                 }
15421               attr_len = byte_get (p, 4);
15422               p += 4;
15423
15424               if (attr_len > section_len)
15425                 {
15426                   error (_("Bad attribute length (%u > %u)\n"),
15427                           (unsigned) attr_len, (unsigned) section_len);
15428                   attr_len = section_len;
15429                   res = FALSE;
15430                 }
15431               /* PR 17531: file: 001-101425-0.004  */
15432               else if (attr_len < 5)
15433                 {
15434                   error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
15435                   res = FALSE;
15436                   break;
15437                 }
15438
15439               section_len -= attr_len;
15440               attr_len -= 4;
15441
15442               namelen = strnlen ((char *) p, attr_len) + 1;
15443               if (namelen == 0 || namelen >= attr_len)
15444                 {
15445                   error (_("Corrupt attribute section name\n"));
15446                   res = FALSE;
15447                   break;
15448                 }
15449
15450               printf (_("Attribute Section: "));
15451               print_symbol (INT_MAX, (const char *) p);
15452               putchar ('\n');
15453
15454               if (public_name && streq ((char *) p, public_name))
15455                 public_section = TRUE;
15456               else
15457                 public_section = FALSE;
15458
15459               if (streq ((char *) p, "gnu"))
15460                 gnu_section = TRUE;
15461               else
15462                 gnu_section = FALSE;
15463
15464               p += namelen;
15465               attr_len -= namelen;
15466
15467               while (attr_len > 0 && p < contents + sect->sh_size)
15468                 {
15469                   int tag;
15470                   int val;
15471                   bfd_vma size;
15472                   unsigned char * end;
15473
15474                   /* PR binutils/17531: Safe handling of corrupt files.  */
15475                   if (attr_len < 6)
15476                     {
15477                       error (_("Unused bytes at end of section\n"));
15478                       res = FALSE;
15479                       section_len = 0;
15480                       break;
15481                     }
15482
15483                   tag = *(p++);
15484                   size = byte_get (p, 4);
15485                   if (size > attr_len)
15486                     {
15487                       error (_("Bad subsection length (%u > %u)\n"),
15488                               (unsigned) size, (unsigned) attr_len);
15489                       res = FALSE;
15490                       size = attr_len;
15491                     }
15492                   /* PR binutils/17531: Safe handling of corrupt files.  */
15493                   if (size < 6)
15494                     {
15495                       error (_("Bad subsection length (%u < 6)\n"),
15496                               (unsigned) size);
15497                       res = FALSE;
15498                       section_len = 0;
15499                       break;
15500                     }
15501
15502                   attr_len -= size;
15503                   end = p + size - 1;
15504                   assert (end <= contents + sect->sh_size);
15505                   p += 4;
15506
15507                   switch (tag)
15508                     {
15509                     case 1:
15510                       printf (_("File Attributes\n"));
15511                       break;
15512                     case 2:
15513                       printf (_("Section Attributes:"));
15514                       goto do_numlist;
15515                     case 3:
15516                       printf (_("Symbol Attributes:"));
15517                       /* Fall through.  */
15518                     do_numlist:
15519                       for (;;)
15520                         {
15521                           unsigned int j;
15522
15523                           val = read_uleb128 (p, &j, end);
15524                           p += j;
15525                           if (val == 0)
15526                             break;
15527                           printf (" %d", val);
15528                         }
15529                       printf ("\n");
15530                       break;
15531                     default:
15532                       printf (_("Unknown tag: %d\n"), tag);
15533                       public_section = FALSE;
15534                       break;
15535                     }
15536
15537                   if (public_section && display_pub_attribute != NULL)
15538                     {
15539                       while (p < end)
15540                         p = display_pub_attribute (p, end);
15541                       assert (p == end);
15542                     }
15543                   else if (gnu_section && display_proc_gnu_attribute != NULL)
15544                     {
15545                       while (p < end)
15546                         p = display_gnu_attribute (p,
15547                                                    display_proc_gnu_attribute,
15548                                                    end);
15549                       assert (p == end);
15550                     }
15551                   else if (p < end)
15552                     {
15553                       printf (_("  Unknown attribute:\n"));
15554                       display_raw_attribute (p, end);
15555                       p = end;
15556                     }
15557                   else
15558                     attr_len = 0;
15559                 }
15560             }
15561         }
15562
15563       free (contents);
15564     }
15565
15566   return res;
15567 }
15568
15569 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
15570    Print the Address, Access and Initial fields of an entry at VMA ADDR
15571    and return the VMA of the next entry, or -1 if there was a problem.
15572    Does not read from DATA_END or beyond.  */
15573
15574 static bfd_vma
15575 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
15576                       unsigned char * data_end)
15577 {
15578   printf ("  ");
15579   print_vma (addr, LONG_HEX);
15580   printf (" ");
15581   if (addr < pltgot + 0xfff0)
15582     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
15583   else
15584     printf ("%10s", "");
15585   printf (" ");
15586   if (data == NULL)
15587     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15588   else
15589     {
15590       bfd_vma entry;
15591       unsigned char * from = data + addr - pltgot;
15592
15593       if (from + (is_32bit_elf ? 4 : 8) > data_end)
15594         {
15595           warn (_("MIPS GOT entry extends beyond the end of available data\n"));
15596           printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
15597           return (bfd_vma) -1;
15598         }
15599       else
15600         {
15601           entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15602           print_vma (entry, LONG_HEX);
15603         }
15604     }
15605   return addr + (is_32bit_elf ? 4 : 8);
15606 }
15607
15608 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
15609    PLTGOT.  Print the Address and Initial fields of an entry at VMA
15610    ADDR and return the VMA of the next entry.  */
15611
15612 static bfd_vma
15613 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
15614 {
15615   printf ("  ");
15616   print_vma (addr, LONG_HEX);
15617   printf (" ");
15618   if (data == NULL)
15619     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15620   else
15621     {
15622       bfd_vma entry;
15623
15624       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15625       print_vma (entry, LONG_HEX);
15626     }
15627   return addr + (is_32bit_elf ? 4 : 8);
15628 }
15629
15630 static void
15631 print_mips_ases (unsigned int mask)
15632 {
15633   if (mask & AFL_ASE_DSP)
15634     fputs ("\n\tDSP ASE", stdout);
15635   if (mask & AFL_ASE_DSPR2)
15636     fputs ("\n\tDSP R2 ASE", stdout);
15637   if (mask & AFL_ASE_DSPR3)
15638     fputs ("\n\tDSP R3 ASE", stdout);
15639   if (mask & AFL_ASE_EVA)
15640     fputs ("\n\tEnhanced VA Scheme", stdout);
15641   if (mask & AFL_ASE_MCU)
15642     fputs ("\n\tMCU (MicroController) ASE", stdout);
15643   if (mask & AFL_ASE_MDMX)
15644     fputs ("\n\tMDMX ASE", stdout);
15645   if (mask & AFL_ASE_MIPS3D)
15646     fputs ("\n\tMIPS-3D ASE", stdout);
15647   if (mask & AFL_ASE_MT)
15648     fputs ("\n\tMT ASE", stdout);
15649   if (mask & AFL_ASE_SMARTMIPS)
15650     fputs ("\n\tSmartMIPS ASE", stdout);
15651   if (mask & AFL_ASE_VIRT)
15652     fputs ("\n\tVZ ASE", stdout);
15653   if (mask & AFL_ASE_MSA)
15654     fputs ("\n\tMSA ASE", stdout);
15655   if (mask & AFL_ASE_MIPS16)
15656     fputs ("\n\tMIPS16 ASE", stdout);
15657   if (mask & AFL_ASE_MICROMIPS)
15658     fputs ("\n\tMICROMIPS ASE", stdout);
15659   if (mask & AFL_ASE_XPA)
15660     fputs ("\n\tXPA ASE", stdout);
15661   if (mask & AFL_ASE_MIPS16E2)
15662     fputs ("\n\tMIPS16e2 ASE", stdout);
15663   if (mask & AFL_ASE_CRC)
15664     fputs ("\n\tCRC ASE", stdout);
15665   if (mask & AFL_ASE_GINV)
15666     fputs ("\n\tGINV ASE", stdout);
15667   if (mask & AFL_ASE_LOONGSON_MMI)
15668     fputs ("\n\tLoongson MMI ASE", stdout);
15669   if (mask & AFL_ASE_LOONGSON_CAM)
15670     fputs ("\n\tLoongson CAM ASE", stdout);
15671   if (mask & AFL_ASE_LOONGSON_EXT)
15672     fputs ("\n\tLoongson EXT ASE", stdout);
15673   if (mask & AFL_ASE_LOONGSON_EXT2)
15674     fputs ("\n\tLoongson EXT2 ASE", stdout);
15675   if (mask == 0)
15676     fprintf (stdout, "\n\t%s", _("None"));
15677   else if ((mask & ~AFL_ASE_MASK) != 0)
15678     fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
15679 }
15680
15681 static void
15682 print_mips_isa_ext (unsigned int isa_ext)
15683 {
15684   switch (isa_ext)
15685     {
15686     case 0:
15687       fputs (_("None"), stdout);
15688       break;
15689     case AFL_EXT_XLR:
15690       fputs ("RMI XLR", stdout);
15691       break;
15692     case AFL_EXT_OCTEON3:
15693       fputs ("Cavium Networks Octeon3", stdout);
15694       break;
15695     case AFL_EXT_OCTEON2:
15696       fputs ("Cavium Networks Octeon2", stdout);
15697       break;
15698     case AFL_EXT_OCTEONP:
15699       fputs ("Cavium Networks OcteonP", stdout);
15700       break;
15701     case AFL_EXT_OCTEON:
15702       fputs ("Cavium Networks Octeon", stdout);
15703       break;
15704     case AFL_EXT_5900:
15705       fputs ("Toshiba R5900", stdout);
15706       break;
15707     case AFL_EXT_4650:
15708       fputs ("MIPS R4650", stdout);
15709       break;
15710     case AFL_EXT_4010:
15711       fputs ("LSI R4010", stdout);
15712       break;
15713     case AFL_EXT_4100:
15714       fputs ("NEC VR4100", stdout);
15715       break;
15716     case AFL_EXT_3900:
15717       fputs ("Toshiba R3900", stdout);
15718       break;
15719     case AFL_EXT_10000:
15720       fputs ("MIPS R10000", stdout);
15721       break;
15722     case AFL_EXT_SB1:
15723       fputs ("Broadcom SB-1", stdout);
15724       break;
15725     case AFL_EXT_4111:
15726       fputs ("NEC VR4111/VR4181", stdout);
15727       break;
15728     case AFL_EXT_4120:
15729       fputs ("NEC VR4120", stdout);
15730       break;
15731     case AFL_EXT_5400:
15732       fputs ("NEC VR5400", stdout);
15733       break;
15734     case AFL_EXT_5500:
15735       fputs ("NEC VR5500", stdout);
15736       break;
15737     case AFL_EXT_LOONGSON_2E:
15738       fputs ("ST Microelectronics Loongson 2E", stdout);
15739       break;
15740     case AFL_EXT_LOONGSON_2F:
15741       fputs ("ST Microelectronics Loongson 2F", stdout);
15742       break;
15743     case AFL_EXT_INTERAPTIV_MR2:
15744       fputs ("Imagination interAptiv MR2", stdout);
15745       break;
15746     default:
15747       fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
15748     }
15749 }
15750
15751 static signed int
15752 get_mips_reg_size (int reg_size)
15753 {
15754   return (reg_size == AFL_REG_NONE) ? 0
15755          : (reg_size == AFL_REG_32) ? 32
15756          : (reg_size == AFL_REG_64) ? 64
15757          : (reg_size == AFL_REG_128) ? 128
15758          : -1;
15759 }
15760
15761 static bfd_boolean
15762 process_mips_specific (Filedata * filedata)
15763 {
15764   Elf_Internal_Dyn * entry;
15765   Elf_Internal_Shdr *sect = NULL;
15766   size_t liblist_offset = 0;
15767   size_t liblistno = 0;
15768   size_t conflictsno = 0;
15769   size_t options_offset = 0;
15770   size_t conflicts_offset = 0;
15771   size_t pltrelsz = 0;
15772   size_t pltrel = 0;
15773   bfd_vma pltgot = 0;
15774   bfd_vma mips_pltgot = 0;
15775   bfd_vma jmprel = 0;
15776   bfd_vma local_gotno = 0;
15777   bfd_vma gotsym = 0;
15778   bfd_vma symtabno = 0;
15779   bfd_boolean res = TRUE;
15780
15781   if (! process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
15782                             display_mips_gnu_attribute))
15783     res = FALSE;
15784
15785   sect = find_section (filedata, ".MIPS.abiflags");
15786
15787   if (sect != NULL)
15788     {
15789       Elf_External_ABIFlags_v0 *abiflags_ext;
15790       Elf_Internal_ABIFlags_v0 abiflags_in;
15791
15792       if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
15793         {
15794           error (_("Corrupt MIPS ABI Flags section.\n"));
15795           res = FALSE;
15796         }
15797       else
15798         {
15799           abiflags_ext = get_data (NULL, filedata, sect->sh_offset, 1,
15800                                    sect->sh_size, _("MIPS ABI Flags section"));
15801           if (abiflags_ext)
15802             {
15803               abiflags_in.version = BYTE_GET (abiflags_ext->version);
15804               abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
15805               abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
15806               abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
15807               abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
15808               abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
15809               abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
15810               abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
15811               abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
15812               abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
15813               abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
15814
15815               printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
15816               printf ("\nISA: MIPS%d", abiflags_in.isa_level);
15817               if (abiflags_in.isa_rev > 1)
15818                 printf ("r%d", abiflags_in.isa_rev);
15819               printf ("\nGPR size: %d",
15820                       get_mips_reg_size (abiflags_in.gpr_size));
15821               printf ("\nCPR1 size: %d",
15822                       get_mips_reg_size (abiflags_in.cpr1_size));
15823               printf ("\nCPR2 size: %d",
15824                       get_mips_reg_size (abiflags_in.cpr2_size));
15825               fputs ("\nFP ABI: ", stdout);
15826               print_mips_fp_abi_value (abiflags_in.fp_abi);
15827               fputs ("ISA Extension: ", stdout);
15828               print_mips_isa_ext (abiflags_in.isa_ext);
15829               fputs ("\nASEs:", stdout);
15830               print_mips_ases (abiflags_in.ases);
15831               printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
15832               printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
15833               fputc ('\n', stdout);
15834               free (abiflags_ext);
15835             }
15836         }
15837     }
15838
15839   /* We have a lot of special sections.  Thanks SGI!  */
15840   if (dynamic_section == NULL)
15841     {
15842       /* No dynamic information available.  See if there is static GOT.  */
15843       sect = find_section (filedata, ".got");
15844       if (sect != NULL)
15845         {
15846           unsigned char *data_end;
15847           unsigned char *data;
15848           bfd_vma ent, end;
15849           int addr_size;
15850
15851           pltgot = sect->sh_addr;
15852
15853           ent = pltgot;
15854           addr_size = (is_32bit_elf ? 4 : 8);
15855           end = pltgot + sect->sh_size;
15856
15857           data = (unsigned char *) get_data (NULL, filedata, sect->sh_offset,
15858                                              end - pltgot, 1,
15859                                              _("Global Offset Table data"));
15860           /* PR 12855: Null data is handled gracefully throughout.  */
15861           data_end = data + (end - pltgot);
15862
15863           printf (_("\nStatic GOT:\n"));
15864           printf (_(" Canonical gp value: "));
15865           print_vma (ent + 0x7ff0, LONG_HEX);
15866           printf ("\n\n");
15867
15868           /* In a dynamic binary GOT[0] is reserved for the dynamic
15869              loader to store the lazy resolver pointer, however in
15870              a static binary it may well have been omitted and GOT
15871              reduced to a table of addresses.
15872              PR 21344: Check for the entry being fully available
15873              before fetching it.  */
15874           if (data
15875               && data + ent - pltgot + addr_size <= data_end
15876               && byte_get (data + ent - pltgot, addr_size) == 0)
15877             {
15878               printf (_(" Reserved entries:\n"));
15879               printf (_("  %*s %10s %*s\n"),
15880                       addr_size * 2, _("Address"), _("Access"),
15881                       addr_size * 2, _("Value"));
15882               ent = print_mips_got_entry (data, pltgot, ent, data_end);
15883               printf ("\n");
15884               if (ent == (bfd_vma) -1)
15885                 goto sgot_print_fail;
15886
15887               /* Check for the MSB of GOT[1] being set, identifying a
15888                  GNU object.  This entry will be used by some runtime
15889                  loaders, to store the module pointer.  Otherwise this
15890                  is an ordinary local entry.
15891                  PR 21344: Check for the entry being fully available
15892                  before fetching it.  */
15893               if (data
15894                   && data + ent - pltgot + addr_size <= data_end
15895                   && (byte_get (data + ent - pltgot, addr_size)
15896                       >> (addr_size * 8 - 1)) != 0)
15897                 {
15898                   ent = print_mips_got_entry (data, pltgot, ent, data_end);
15899                   printf ("\n");
15900                   if (ent == (bfd_vma) -1)
15901                     goto sgot_print_fail;
15902                 }
15903               printf ("\n");
15904             }
15905
15906           if (data != NULL && ent < end)
15907             {
15908               printf (_(" Local entries:\n"));
15909               printf ("  %*s %10s %*s\n",
15910                       addr_size * 2, _("Address"), _("Access"),
15911                       addr_size * 2, _("Value"));
15912               while (ent < end)
15913                 {
15914                   ent = print_mips_got_entry (data, pltgot, ent, data_end);
15915                   printf ("\n");
15916                   if (ent == (bfd_vma) -1)
15917                     goto sgot_print_fail;
15918                 }
15919               printf ("\n");
15920             }
15921
15922         sgot_print_fail:
15923           if (data)
15924             free (data);
15925         }
15926       return res;
15927     }
15928
15929   for (entry = dynamic_section;
15930        /* PR 17531 file: 012-50589-0.004.  */
15931        entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
15932        ++entry)
15933     switch (entry->d_tag)
15934       {
15935       case DT_MIPS_LIBLIST:
15936         liblist_offset
15937           = offset_from_vma (filedata, entry->d_un.d_val,
15938                              liblistno * sizeof (Elf32_External_Lib));
15939         break;
15940       case DT_MIPS_LIBLISTNO:
15941         liblistno = entry->d_un.d_val;
15942         break;
15943       case DT_MIPS_OPTIONS:
15944         options_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
15945         break;
15946       case DT_MIPS_CONFLICT:
15947         conflicts_offset
15948           = offset_from_vma (filedata, entry->d_un.d_val,
15949                              conflictsno * sizeof (Elf32_External_Conflict));
15950         break;
15951       case DT_MIPS_CONFLICTNO:
15952         conflictsno = entry->d_un.d_val;
15953         break;
15954       case DT_PLTGOT:
15955         pltgot = entry->d_un.d_ptr;
15956         break;
15957       case DT_MIPS_LOCAL_GOTNO:
15958         local_gotno = entry->d_un.d_val;
15959         break;
15960       case DT_MIPS_GOTSYM:
15961         gotsym = entry->d_un.d_val;
15962         break;
15963       case DT_MIPS_SYMTABNO:
15964         symtabno = entry->d_un.d_val;
15965         break;
15966       case DT_MIPS_PLTGOT:
15967         mips_pltgot = entry->d_un.d_ptr;
15968         break;
15969       case DT_PLTREL:
15970         pltrel = entry->d_un.d_val;
15971         break;
15972       case DT_PLTRELSZ:
15973         pltrelsz = entry->d_un.d_val;
15974         break;
15975       case DT_JMPREL:
15976         jmprel = entry->d_un.d_ptr;
15977         break;
15978       default:
15979         break;
15980       }
15981
15982   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
15983     {
15984       Elf32_External_Lib * elib;
15985       size_t cnt;
15986
15987       elib = (Elf32_External_Lib *) get_data (NULL, filedata, liblist_offset,
15988                                               liblistno,
15989                                               sizeof (Elf32_External_Lib),
15990                                               _("liblist section data"));
15991       if (elib)
15992         {
15993           printf (ngettext ("\nSection '.liblist' contains %lu entry:\n",
15994                             "\nSection '.liblist' contains %lu entries:\n",
15995                             (unsigned long) liblistno),
15996                   (unsigned long) liblistno);
15997           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
15998                  stdout);
15999
16000           for (cnt = 0; cnt < liblistno; ++cnt)
16001             {
16002               Elf32_Lib liblist;
16003               time_t atime;
16004               char timebuf[128];
16005               struct tm * tmp;
16006
16007               liblist.l_name = BYTE_GET (elib[cnt].l_name);
16008               atime = BYTE_GET (elib[cnt].l_time_stamp);
16009               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16010               liblist.l_version = BYTE_GET (elib[cnt].l_version);
16011               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16012
16013               tmp = gmtime (&atime);
16014               snprintf (timebuf, sizeof (timebuf),
16015                         "%04u-%02u-%02uT%02u:%02u:%02u",
16016                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16017                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16018
16019               printf ("%3lu: ", (unsigned long) cnt);
16020               if (VALID_DYNAMIC_NAME (liblist.l_name))
16021                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
16022               else
16023                 printf (_("<corrupt: %9ld>"), liblist.l_name);
16024               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
16025                       liblist.l_version);
16026
16027               if (liblist.l_flags == 0)
16028                 puts (_(" NONE"));
16029               else
16030                 {
16031                   static const struct
16032                   {
16033                     const char * name;
16034                     int bit;
16035                   }
16036                   l_flags_vals[] =
16037                   {
16038                     { " EXACT_MATCH", LL_EXACT_MATCH },
16039                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
16040                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
16041                     { " EXPORTS", LL_EXPORTS },
16042                     { " DELAY_LOAD", LL_DELAY_LOAD },
16043                     { " DELTA", LL_DELTA }
16044                   };
16045                   int flags = liblist.l_flags;
16046                   size_t fcnt;
16047
16048                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
16049                     if ((flags & l_flags_vals[fcnt].bit) != 0)
16050                       {
16051                         fputs (l_flags_vals[fcnt].name, stdout);
16052                         flags ^= l_flags_vals[fcnt].bit;
16053                       }
16054                   if (flags != 0)
16055                     printf (" %#x", (unsigned int) flags);
16056
16057                   puts ("");
16058                 }
16059             }
16060
16061           free (elib);
16062         }
16063       else
16064         res = FALSE;
16065     }
16066
16067   if (options_offset != 0)
16068     {
16069       Elf_External_Options * eopt;
16070       Elf_Internal_Options * iopt;
16071       Elf_Internal_Options * option;
16072       size_t offset;
16073       int cnt;
16074       sect = filedata->section_headers;
16075
16076       /* Find the section header so that we get the size.  */
16077       sect = find_section_by_type (filedata, SHT_MIPS_OPTIONS);
16078       /* PR 17533 file: 012-277276-0.004.  */
16079       if (sect == NULL)
16080         {
16081           error (_("No MIPS_OPTIONS header found\n"));
16082           return FALSE;
16083         }
16084
16085       eopt = (Elf_External_Options *) get_data (NULL, filedata, options_offset, 1,
16086                                                 sect->sh_size, _("options"));
16087       if (eopt)
16088         {
16089           iopt = (Elf_Internal_Options *)
16090               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
16091           if (iopt == NULL)
16092             {
16093               error (_("Out of memory allocating space for MIPS options\n"));
16094               return FALSE;
16095             }
16096
16097           offset = cnt = 0;
16098           option = iopt;
16099
16100           while (offset <= sect->sh_size - sizeof (* eopt))
16101             {
16102               Elf_External_Options * eoption;
16103
16104               eoption = (Elf_External_Options *) ((char *) eopt + offset);
16105
16106               option->kind = BYTE_GET (eoption->kind);
16107               option->size = BYTE_GET (eoption->size);
16108               option->section = BYTE_GET (eoption->section);
16109               option->info = BYTE_GET (eoption->info);
16110
16111               /* PR 17531: file: ffa0fa3b.  */
16112               if (option->size < sizeof (* eopt)
16113                   || offset + option->size > sect->sh_size)
16114                 {
16115                   error (_("Invalid size (%u) for MIPS option\n"), option->size);
16116                   return FALSE;
16117                 }
16118               offset += option->size;
16119
16120               ++option;
16121               ++cnt;
16122             }
16123
16124           printf (ngettext ("\nSection '%s' contains %d entry:\n",
16125                             "\nSection '%s' contains %d entries:\n",
16126                             cnt),
16127                   printable_section_name (filedata, sect), cnt);
16128
16129           option = iopt;
16130           offset = 0;
16131
16132           while (cnt-- > 0)
16133             {
16134               size_t len;
16135
16136               switch (option->kind)
16137                 {
16138                 case ODK_NULL:
16139                   /* This shouldn't happen.  */
16140                   printf (" NULL       %d %lx", option->section, option->info);
16141                   break;
16142                 case ODK_REGINFO:
16143                   printf (" REGINFO    ");
16144                   if (filedata->file_header.e_machine == EM_MIPS)
16145                     {
16146                       /* 32bit form.  */
16147                       Elf32_External_RegInfo * ereg;
16148                       Elf32_RegInfo reginfo;
16149
16150                       ereg = (Elf32_External_RegInfo *) (option + 1);
16151                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
16152                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16153                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16154                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16155                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16156                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
16157
16158                       printf ("GPR %08lx  GP 0x%lx\n",
16159                               reginfo.ri_gprmask,
16160                               (unsigned long) reginfo.ri_gp_value);
16161                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
16162                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16163                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16164                     }
16165                   else
16166                     {
16167                       /* 64 bit form.  */
16168                       Elf64_External_RegInfo * ereg;
16169                       Elf64_Internal_RegInfo reginfo;
16170
16171                       ereg = (Elf64_External_RegInfo *) (option + 1);
16172                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
16173                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16174                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16175                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16176                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16177                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
16178
16179                       printf ("GPR %08lx  GP 0x",
16180                               reginfo.ri_gprmask);
16181                       printf_vma (reginfo.ri_gp_value);
16182                       printf ("\n");
16183
16184                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
16185                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16186                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16187                     }
16188                   ++option;
16189                   continue;
16190                 case ODK_EXCEPTIONS:
16191                   fputs (" EXCEPTIONS fpe_min(", stdout);
16192                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
16193                   fputs (") fpe_max(", stdout);
16194                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
16195                   fputs (")", stdout);
16196
16197                   if (option->info & OEX_PAGE0)
16198                     fputs (" PAGE0", stdout);
16199                   if (option->info & OEX_SMM)
16200                     fputs (" SMM", stdout);
16201                   if (option->info & OEX_FPDBUG)
16202                     fputs (" FPDBUG", stdout);
16203                   if (option->info & OEX_DISMISS)
16204                     fputs (" DISMISS", stdout);
16205                   break;
16206                 case ODK_PAD:
16207                   fputs (" PAD       ", stdout);
16208                   if (option->info & OPAD_PREFIX)
16209                     fputs (" PREFIX", stdout);
16210                   if (option->info & OPAD_POSTFIX)
16211                     fputs (" POSTFIX", stdout);
16212                   if (option->info & OPAD_SYMBOL)
16213                     fputs (" SYMBOL", stdout);
16214                   break;
16215                 case ODK_HWPATCH:
16216                   fputs (" HWPATCH   ", stdout);
16217                   if (option->info & OHW_R4KEOP)
16218                     fputs (" R4KEOP", stdout);
16219                   if (option->info & OHW_R8KPFETCH)
16220                     fputs (" R8KPFETCH", stdout);
16221                   if (option->info & OHW_R5KEOP)
16222                     fputs (" R5KEOP", stdout);
16223                   if (option->info & OHW_R5KCVTL)
16224                     fputs (" R5KCVTL", stdout);
16225                   break;
16226                 case ODK_FILL:
16227                   fputs (" FILL       ", stdout);
16228                   /* XXX Print content of info word?  */
16229                   break;
16230                 case ODK_TAGS:
16231                   fputs (" TAGS       ", stdout);
16232                   /* XXX Print content of info word?  */
16233                   break;
16234                 case ODK_HWAND:
16235                   fputs (" HWAND     ", stdout);
16236                   if (option->info & OHWA0_R4KEOP_CHECKED)
16237                     fputs (" R4KEOP_CHECKED", stdout);
16238                   if (option->info & OHWA0_R4KEOP_CLEAN)
16239                     fputs (" R4KEOP_CLEAN", stdout);
16240                   break;
16241                 case ODK_HWOR:
16242                   fputs (" HWOR      ", stdout);
16243                   if (option->info & OHWA0_R4KEOP_CHECKED)
16244                     fputs (" R4KEOP_CHECKED", stdout);
16245                   if (option->info & OHWA0_R4KEOP_CLEAN)
16246                     fputs (" R4KEOP_CLEAN", stdout);
16247                   break;
16248                 case ODK_GP_GROUP:
16249                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
16250                           option->info & OGP_GROUP,
16251                           (option->info & OGP_SELF) >> 16);
16252                   break;
16253                 case ODK_IDENT:
16254                   printf (" IDENT     %#06lx  self-contained %#06lx",
16255                           option->info & OGP_GROUP,
16256                           (option->info & OGP_SELF) >> 16);
16257                   break;
16258                 default:
16259                   /* This shouldn't happen.  */
16260                   printf (" %3d ???     %d %lx",
16261                           option->kind, option->section, option->info);
16262                   break;
16263                 }
16264
16265               len = sizeof (* eopt);
16266               while (len < option->size)
16267                 {
16268                   unsigned char datum = * ((unsigned char *) eopt + offset + len);
16269
16270                   if (ISPRINT (datum))
16271                     printf ("%c", datum);
16272                   else
16273                     printf ("\\%03o", datum);
16274                   len ++;
16275                 }
16276               fputs ("\n", stdout);
16277
16278               offset += option->size;
16279               ++option;
16280             }
16281
16282           free (eopt);
16283         }
16284       else
16285         res = FALSE;
16286     }
16287
16288   if (conflicts_offset != 0 && conflictsno != 0)
16289     {
16290       Elf32_Conflict * iconf;
16291       size_t cnt;
16292
16293       if (dynamic_symbols == NULL)
16294         {
16295           error (_("conflict list found without a dynamic symbol table\n"));
16296           return FALSE;
16297         }
16298
16299       /* PR 21345 - print a slightly more helpful error message
16300          if we are sure that the cmalloc will fail.  */
16301       if (conflictsno * sizeof (* iconf) > filedata->file_size)
16302         {
16303           error (_("Overlarge number of conflicts detected: %lx\n"),
16304                  (long) conflictsno);
16305           return FALSE;
16306         }
16307
16308       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
16309       if (iconf == NULL)
16310         {
16311           error (_("Out of memory allocating space for dynamic conflicts\n"));
16312           return FALSE;
16313         }
16314
16315       if (is_32bit_elf)
16316         {
16317           Elf32_External_Conflict * econf32;
16318
16319           econf32 = (Elf32_External_Conflict *)
16320               get_data (NULL, filedata, conflicts_offset, conflictsno,
16321                         sizeof (* econf32), _("conflict"));
16322           if (!econf32)
16323             return FALSE;
16324
16325           for (cnt = 0; cnt < conflictsno; ++cnt)
16326             iconf[cnt] = BYTE_GET (econf32[cnt]);
16327
16328           free (econf32);
16329         }
16330       else
16331         {
16332           Elf64_External_Conflict * econf64;
16333
16334           econf64 = (Elf64_External_Conflict *)
16335               get_data (NULL, filedata, conflicts_offset, conflictsno,
16336                         sizeof (* econf64), _("conflict"));
16337           if (!econf64)
16338             return FALSE;
16339
16340           for (cnt = 0; cnt < conflictsno; ++cnt)
16341             iconf[cnt] = BYTE_GET (econf64[cnt]);
16342
16343           free (econf64);
16344         }
16345
16346       printf (ngettext ("\nSection '.conflict' contains %lu entry:\n",
16347                         "\nSection '.conflict' contains %lu entries:\n",
16348                         (unsigned long) conflictsno),
16349               (unsigned long) conflictsno);
16350       puts (_("  Num:    Index       Value  Name"));
16351
16352       for (cnt = 0; cnt < conflictsno; ++cnt)
16353         {
16354           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
16355
16356           if (iconf[cnt] >= num_dynamic_syms)
16357             printf (_("<corrupt symbol index>"));
16358           else
16359             {
16360               Elf_Internal_Sym * psym;
16361
16362               psym = & dynamic_symbols[iconf[cnt]];
16363               print_vma (psym->st_value, FULL_HEX);
16364               putchar (' ');
16365               if (VALID_DYNAMIC_NAME (psym->st_name))
16366                 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
16367               else
16368                 printf (_("<corrupt: %14ld>"), psym->st_name);
16369             }
16370           putchar ('\n');
16371         }
16372
16373       free (iconf);
16374     }
16375
16376   if (pltgot != 0 && local_gotno != 0)
16377     {
16378       bfd_vma ent, local_end, global_end;
16379       size_t i, offset;
16380       unsigned char * data;
16381       unsigned char * data_end;
16382       int addr_size;
16383
16384       ent = pltgot;
16385       addr_size = (is_32bit_elf ? 4 : 8);
16386       local_end = pltgot + local_gotno * addr_size;
16387
16388       /* PR binutils/17533 file: 012-111227-0.004  */
16389       if (symtabno < gotsym)
16390         {
16391           error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
16392                  (unsigned long) gotsym, (unsigned long) symtabno);
16393           return FALSE;
16394         }
16395
16396       global_end = local_end + (symtabno - gotsym) * addr_size;
16397       /* PR 17531: file: 54c91a34.  */
16398       if (global_end < local_end)
16399         {
16400           error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
16401           return FALSE;
16402         }
16403
16404       offset = offset_from_vma (filedata, pltgot, global_end - pltgot);
16405       data = (unsigned char *) get_data (NULL, filedata, offset,
16406                                          global_end - pltgot, 1,
16407                                          _("Global Offset Table data"));
16408       /* PR 12855: Null data is handled gracefully throughout.  */
16409       data_end = data + (global_end - pltgot);
16410
16411       printf (_("\nPrimary GOT:\n"));
16412       printf (_(" Canonical gp value: "));
16413       print_vma (pltgot + 0x7ff0, LONG_HEX);
16414       printf ("\n\n");
16415
16416       printf (_(" Reserved entries:\n"));
16417       printf (_("  %*s %10s %*s Purpose\n"),
16418               addr_size * 2, _("Address"), _("Access"),
16419               addr_size * 2, _("Initial"));
16420       ent = print_mips_got_entry (data, pltgot, ent, data_end);
16421       printf (_(" Lazy resolver\n"));
16422       if (ent == (bfd_vma) -1)
16423         goto got_print_fail;
16424
16425       /* Check for the MSB of GOT[1] being set, denoting a GNU object.
16426          This entry will be used by some runtime loaders, to store the
16427          module pointer.  Otherwise this is an ordinary local entry.
16428          PR 21344: Check for the entry being fully available before
16429          fetching it.  */
16430       if (data
16431           && data + ent - pltgot + addr_size <= data_end
16432           && (byte_get (data + ent - pltgot, addr_size)
16433               >> (addr_size * 8 - 1)) != 0)
16434         {
16435           ent = print_mips_got_entry (data, pltgot, ent, data_end);
16436           printf (_(" Module pointer (GNU extension)\n"));
16437           if (ent == (bfd_vma) -1)
16438             goto got_print_fail;
16439         }
16440       printf ("\n");
16441
16442       if (data != NULL && ent < local_end)
16443         {
16444           printf (_(" Local entries:\n"));
16445           printf ("  %*s %10s %*s\n",
16446                   addr_size * 2, _("Address"), _("Access"),
16447                   addr_size * 2, _("Initial"));
16448           while (ent < local_end)
16449             {
16450               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16451               printf ("\n");
16452               if (ent == (bfd_vma) -1)
16453                 goto got_print_fail;
16454             }
16455           printf ("\n");
16456         }
16457
16458       if (data != NULL && gotsym < symtabno)
16459         {
16460           int sym_width;
16461
16462           printf (_(" Global entries:\n"));
16463           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
16464                   addr_size * 2, _("Address"),
16465                   _("Access"),
16466                   addr_size * 2, _("Initial"),
16467                   addr_size * 2, _("Sym.Val."),
16468                   _("Type"),
16469                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
16470                   _("Ndx"), _("Name"));
16471
16472           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
16473
16474           for (i = gotsym; i < symtabno; i++)
16475             {
16476               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16477               printf (" ");
16478
16479               if (dynamic_symbols == NULL)
16480                 printf (_("<no dynamic symbols>"));
16481               else if (i < num_dynamic_syms)
16482                 {
16483                   Elf_Internal_Sym * psym = dynamic_symbols + i;
16484
16485                   print_vma (psym->st_value, LONG_HEX);
16486                   printf (" %-7s %3s ",
16487                           get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16488                           get_symbol_index_type (filedata, psym->st_shndx));
16489
16490                   if (VALID_DYNAMIC_NAME (psym->st_name))
16491                     print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16492                   else
16493                     printf (_("<corrupt: %14ld>"), psym->st_name);
16494                 }
16495               else
16496                 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
16497                         (unsigned long) i);
16498
16499               printf ("\n");
16500               if (ent == (bfd_vma) -1)
16501                 break;
16502             }
16503           printf ("\n");
16504         }
16505
16506     got_print_fail:
16507       if (data)
16508         free (data);
16509     }
16510
16511   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
16512     {
16513       bfd_vma ent, end;
16514       size_t offset, rel_offset;
16515       unsigned long count, i;
16516       unsigned char * data;
16517       int addr_size, sym_width;
16518       Elf_Internal_Rela * rels;
16519
16520       rel_offset = offset_from_vma (filedata, jmprel, pltrelsz);
16521       if (pltrel == DT_RELA)
16522         {
16523           if (!slurp_rela_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16524             return FALSE;
16525         }
16526       else
16527         {
16528           if (!slurp_rel_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16529             return FALSE;
16530         }
16531
16532       ent = mips_pltgot;
16533       addr_size = (is_32bit_elf ? 4 : 8);
16534       end = mips_pltgot + (2 + count) * addr_size;
16535
16536       offset = offset_from_vma (filedata, mips_pltgot, end - mips_pltgot);
16537       data = (unsigned char *) get_data (NULL, filedata, offset, end - mips_pltgot,
16538                                          1, _("Procedure Linkage Table data"));
16539       if (data == NULL)
16540         return FALSE;
16541
16542       printf ("\nPLT GOT:\n\n");
16543       printf (_(" Reserved entries:\n"));
16544       printf (_("  %*s %*s Purpose\n"),
16545               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
16546       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16547       printf (_(" PLT lazy resolver\n"));
16548       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16549       printf (_(" Module pointer\n"));
16550       printf ("\n");
16551
16552       printf (_(" Entries:\n"));
16553       printf ("  %*s %*s %*s %-7s %3s %s\n",
16554               addr_size * 2, _("Address"),
16555               addr_size * 2, _("Initial"),
16556               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
16557       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
16558       for (i = 0; i < count; i++)
16559         {
16560           unsigned long idx = get_reloc_symindex (rels[i].r_info);
16561
16562           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16563           printf (" ");
16564
16565           if (idx >= num_dynamic_syms)
16566             printf (_("<corrupt symbol index: %lu>"), idx);
16567           else
16568             {
16569               Elf_Internal_Sym * psym = dynamic_symbols + idx;
16570
16571               print_vma (psym->st_value, LONG_HEX);
16572               printf (" %-7s %3s ",
16573                       get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16574                       get_symbol_index_type (filedata, psym->st_shndx));
16575               if (VALID_DYNAMIC_NAME (psym->st_name))
16576                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16577               else
16578                 printf (_("<corrupt: %14ld>"), psym->st_name);
16579             }
16580           printf ("\n");
16581         }
16582       printf ("\n");
16583
16584       if (data)
16585         free (data);
16586       free (rels);
16587     }
16588
16589   return res;
16590 }
16591
16592 static bfd_boolean
16593 process_nds32_specific (Filedata * filedata)
16594 {
16595   Elf_Internal_Shdr *sect = NULL;
16596
16597   sect = find_section (filedata, ".nds32_e_flags");
16598   if (sect != NULL)
16599     {
16600       unsigned int *flag;
16601
16602       printf ("\nNDS32 elf flags section:\n");
16603       flag = get_data (NULL, filedata, sect->sh_offset, 1,
16604                        sect->sh_size, _("NDS32 elf flags section"));
16605
16606       if (! flag)
16607         return FALSE;
16608
16609       switch ((*flag) & 0x3)
16610         {
16611         case 0:
16612           printf ("(VEC_SIZE):\tNo entry.\n");
16613           break;
16614         case 1:
16615           printf ("(VEC_SIZE):\t4 bytes\n");
16616           break;
16617         case 2:
16618           printf ("(VEC_SIZE):\t16 bytes\n");
16619           break;
16620         case 3:
16621           printf ("(VEC_SIZE):\treserved\n");
16622           break;
16623         }
16624     }
16625
16626   return TRUE;
16627 }
16628
16629 static bfd_boolean
16630 process_gnu_liblist (Filedata * filedata)
16631 {
16632   Elf_Internal_Shdr * section;
16633   Elf_Internal_Shdr * string_sec;
16634   Elf32_External_Lib * elib;
16635   char * strtab;
16636   size_t strtab_size;
16637   size_t cnt;
16638   unsigned long num_liblist;
16639   unsigned i;
16640   bfd_boolean res = TRUE;
16641
16642   if (! do_arch)
16643     return TRUE;
16644
16645   for (i = 0, section = filedata->section_headers;
16646        i < filedata->file_header.e_shnum;
16647        i++, section++)
16648     {
16649       switch (section->sh_type)
16650         {
16651         case SHT_GNU_LIBLIST:
16652           if (section->sh_link >= filedata->file_header.e_shnum)
16653             break;
16654
16655           elib = (Elf32_External_Lib *)
16656               get_data (NULL, filedata, section->sh_offset, 1, section->sh_size,
16657                         _("liblist section data"));
16658
16659           if (elib == NULL)
16660             {
16661               res = FALSE;
16662               break;
16663             }
16664
16665           string_sec = filedata->section_headers + section->sh_link;
16666           strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
16667                                       string_sec->sh_size,
16668                                       _("liblist string table"));
16669           if (strtab == NULL
16670               || section->sh_entsize != sizeof (Elf32_External_Lib))
16671             {
16672               free (elib);
16673               free (strtab);
16674               res = FALSE;
16675               break;
16676             }
16677           strtab_size = string_sec->sh_size;
16678
16679           num_liblist = section->sh_size / sizeof (Elf32_External_Lib);
16680           printf (ngettext ("\nLibrary list section '%s' contains %lu entries:\n",
16681                             "\nLibrary list section '%s' contains %lu entries:\n",
16682                             num_liblist),
16683                   printable_section_name (filedata, section),
16684                   num_liblist);
16685
16686           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
16687
16688           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
16689                ++cnt)
16690             {
16691               Elf32_Lib liblist;
16692               time_t atime;
16693               char timebuf[128];
16694               struct tm * tmp;
16695
16696               liblist.l_name = BYTE_GET (elib[cnt].l_name);
16697               atime = BYTE_GET (elib[cnt].l_time_stamp);
16698               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16699               liblist.l_version = BYTE_GET (elib[cnt].l_version);
16700               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16701
16702               tmp = gmtime (&atime);
16703               snprintf (timebuf, sizeof (timebuf),
16704                         "%04u-%02u-%02uT%02u:%02u:%02u",
16705                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16706                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16707
16708               printf ("%3lu: ", (unsigned long) cnt);
16709               if (do_wide)
16710                 printf ("%-20s", liblist.l_name < strtab_size
16711                         ? strtab + liblist.l_name : _("<corrupt>"));
16712               else
16713                 printf ("%-20.20s", liblist.l_name < strtab_size
16714                         ? strtab + liblist.l_name : _("<corrupt>"));
16715               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
16716                       liblist.l_version, liblist.l_flags);
16717             }
16718
16719           free (elib);
16720           free (strtab);
16721         }
16722     }
16723
16724   return res;
16725 }
16726
16727 static const char *
16728 get_note_type (Filedata * filedata, unsigned e_type)
16729 {
16730   static char buff[64];
16731
16732   if (filedata->file_header.e_type == ET_CORE)
16733     switch (e_type)
16734       {
16735       case NT_AUXV:
16736         return _("NT_AUXV (auxiliary vector)");
16737       case NT_PRSTATUS:
16738         return _("NT_PRSTATUS (prstatus structure)");
16739       case NT_FPREGSET:
16740         return _("NT_FPREGSET (floating point registers)");
16741       case NT_PRPSINFO:
16742         return _("NT_PRPSINFO (prpsinfo structure)");
16743       case NT_TASKSTRUCT:
16744         return _("NT_TASKSTRUCT (task structure)");
16745       case NT_PRXFPREG:
16746         return _("NT_PRXFPREG (user_xfpregs structure)");
16747       case NT_PPC_VMX:
16748         return _("NT_PPC_VMX (ppc Altivec registers)");
16749       case NT_PPC_VSX:
16750         return _("NT_PPC_VSX (ppc VSX registers)");
16751       case NT_PPC_TAR:
16752         return _("NT_PPC_TAR (ppc TAR register)");
16753       case NT_PPC_PPR:
16754         return _("NT_PPC_PPR (ppc PPR register)");
16755       case NT_PPC_DSCR:
16756         return _("NT_PPC_DSCR (ppc DSCR register)");
16757       case NT_PPC_EBB:
16758         return _("NT_PPC_EBB (ppc EBB registers)");
16759       case NT_PPC_PMU:
16760         return _("NT_PPC_PMU (ppc PMU registers)");
16761       case NT_PPC_TM_CGPR:
16762         return _("NT_PPC_TM_CGPR (ppc checkpointed GPR registers)");
16763       case NT_PPC_TM_CFPR:
16764         return _("NT_PPC_TM_CFPR (ppc checkpointed floating point registers)");
16765       case NT_PPC_TM_CVMX:
16766         return _("NT_PPC_TM_CVMX (ppc checkpointed Altivec registers)");
16767       case NT_PPC_TM_CVSX:
16768         return _("NT_PPC_TM_CVSX (ppc checkpointed VSX registers)");
16769       case NT_PPC_TM_SPR:
16770         return _("NT_PPC_TM_SPR (ppc TM special purpose registers)");
16771       case NT_PPC_TM_CTAR:
16772         return _("NT_PPC_TM_CTAR (ppc checkpointed TAR register)");
16773       case NT_PPC_TM_CPPR:
16774         return _("NT_PPC_TM_CPPR (ppc checkpointed PPR register)");
16775       case NT_PPC_TM_CDSCR:
16776         return _("NT_PPC_TM_CDSCR (ppc checkpointed DSCR register)");
16777       case NT_386_TLS:
16778         return _("NT_386_TLS (x86 TLS information)");
16779       case NT_386_IOPERM:
16780         return _("NT_386_IOPERM (x86 I/O permissions)");
16781       case NT_X86_XSTATE:
16782         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
16783       case NT_S390_HIGH_GPRS:
16784         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
16785       case NT_S390_TIMER:
16786         return _("NT_S390_TIMER (s390 timer register)");
16787       case NT_S390_TODCMP:
16788         return _("NT_S390_TODCMP (s390 TOD comparator register)");
16789       case NT_S390_TODPREG:
16790         return _("NT_S390_TODPREG (s390 TOD programmable register)");
16791       case NT_S390_CTRS:
16792         return _("NT_S390_CTRS (s390 control registers)");
16793       case NT_S390_PREFIX:
16794         return _("NT_S390_PREFIX (s390 prefix register)");
16795       case NT_S390_LAST_BREAK:
16796         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
16797       case NT_S390_SYSTEM_CALL:
16798         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
16799       case NT_S390_TDB:
16800         return _("NT_S390_TDB (s390 transaction diagnostic block)");
16801       case NT_S390_VXRS_LOW:
16802         return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
16803       case NT_S390_VXRS_HIGH:
16804         return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
16805       case NT_S390_GS_CB:
16806         return _("NT_S390_GS_CB (s390 guarded-storage registers)");
16807       case NT_S390_GS_BC:
16808         return _("NT_S390_GS_BC (s390 guarded-storage broadcast control)");
16809       case NT_ARM_VFP:
16810         return _("NT_ARM_VFP (arm VFP registers)");
16811       case NT_ARM_TLS:
16812         return _("NT_ARM_TLS (AArch TLS registers)");
16813       case NT_ARM_HW_BREAK:
16814         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
16815       case NT_ARM_HW_WATCH:
16816         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
16817       case NT_PSTATUS:
16818         return _("NT_PSTATUS (pstatus structure)");
16819       case NT_FPREGS:
16820         return _("NT_FPREGS (floating point registers)");
16821       case NT_PSINFO:
16822         return _("NT_PSINFO (psinfo structure)");
16823       case NT_LWPSTATUS:
16824         return _("NT_LWPSTATUS (lwpstatus_t structure)");
16825       case NT_LWPSINFO:
16826         return _("NT_LWPSINFO (lwpsinfo_t structure)");
16827       case NT_WIN32PSTATUS:
16828         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
16829       case NT_SIGINFO:
16830         return _("NT_SIGINFO (siginfo_t data)");
16831       case NT_FILE:
16832         return _("NT_FILE (mapped files)");
16833       default:
16834         break;
16835       }
16836   else
16837     switch (e_type)
16838       {
16839       case NT_VERSION:
16840         return _("NT_VERSION (version)");
16841       case NT_ARCH:
16842         return _("NT_ARCH (architecture)");
16843       case NT_GNU_BUILD_ATTRIBUTE_OPEN:
16844         return _("OPEN");
16845       case NT_GNU_BUILD_ATTRIBUTE_FUNC:
16846         return _("func");
16847       default:
16848         break;
16849       }
16850
16851   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16852   return buff;
16853 }
16854
16855 static bfd_boolean
16856 print_core_note (Elf_Internal_Note *pnote)
16857 {
16858   unsigned int addr_size = is_32bit_elf ? 4 : 8;
16859   bfd_vma count, page_size;
16860   unsigned char *descdata, *filenames, *descend;
16861
16862   if (pnote->type != NT_FILE)
16863     {
16864       if (do_wide)
16865         printf ("\n");
16866       return TRUE;
16867     }
16868
16869 #ifndef BFD64
16870   if (!is_32bit_elf)
16871     {
16872       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
16873       /* Still "successful".  */
16874       return TRUE;
16875     }
16876 #endif
16877
16878   if (pnote->descsz < 2 * addr_size)
16879     {
16880       error (_("    Malformed note - too short for header\n"));
16881       return FALSE;
16882     }
16883
16884   descdata = (unsigned char *) pnote->descdata;
16885   descend = descdata + pnote->descsz;
16886
16887   if (descdata[pnote->descsz - 1] != '\0')
16888     {
16889       error (_("    Malformed note - does not end with \\0\n"));
16890       return FALSE;
16891     }
16892
16893   count = byte_get (descdata, addr_size);
16894   descdata += addr_size;
16895
16896   page_size = byte_get (descdata, addr_size);
16897   descdata += addr_size;
16898
16899   if (count > ((bfd_vma) -1 - 2 * addr_size) / (3 * addr_size)
16900       || pnote->descsz < 2 * addr_size + count * 3 * addr_size)
16901     {
16902       error (_("    Malformed note - too short for supplied file count\n"));
16903       return FALSE;
16904     }
16905
16906   printf (_("    Page size: "));
16907   print_vma (page_size, DEC);
16908   printf ("\n");
16909
16910   printf (_("    %*s%*s%*s\n"),
16911           (int) (2 + 2 * addr_size), _("Start"),
16912           (int) (4 + 2 * addr_size), _("End"),
16913           (int) (4 + 2 * addr_size), _("Page Offset"));
16914   filenames = descdata + count * 3 * addr_size;
16915   while (count-- > 0)
16916     {
16917       bfd_vma start, end, file_ofs;
16918
16919       if (filenames == descend)
16920         {
16921           error (_("    Malformed note - filenames end too early\n"));
16922           return FALSE;
16923         }
16924
16925       start = byte_get (descdata, addr_size);
16926       descdata += addr_size;
16927       end = byte_get (descdata, addr_size);
16928       descdata += addr_size;
16929       file_ofs = byte_get (descdata, addr_size);
16930       descdata += addr_size;
16931
16932       printf ("    ");
16933       print_vma (start, FULL_HEX);
16934       printf ("  ");
16935       print_vma (end, FULL_HEX);
16936       printf ("  ");
16937       print_vma (file_ofs, FULL_HEX);
16938       printf ("\n        %s\n", filenames);
16939
16940       filenames += 1 + strlen ((char *) filenames);
16941     }
16942
16943   return TRUE;
16944 }
16945
16946 static const char *
16947 get_gnu_elf_note_type (unsigned e_type)
16948 {
16949   /* NB/ Keep this switch statement in sync with print_gnu_note ().  */
16950   switch (e_type)
16951     {
16952     case NT_GNU_ABI_TAG:
16953       return _("NT_GNU_ABI_TAG (ABI version tag)");
16954     case NT_GNU_HWCAP:
16955       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
16956     case NT_GNU_BUILD_ID:
16957       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
16958     case NT_GNU_GOLD_VERSION:
16959       return _("NT_GNU_GOLD_VERSION (gold version)");
16960     case NT_GNU_PROPERTY_TYPE_0:
16961       return _("NT_GNU_PROPERTY_TYPE_0");
16962     case NT_GNU_BUILD_ATTRIBUTE_OPEN:
16963       return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
16964     case NT_GNU_BUILD_ATTRIBUTE_FUNC:
16965       return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
16966     default:
16967       {
16968         static char buff[64];
16969
16970         snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16971         return buff;
16972       }
16973     }
16974 }
16975
16976 static void
16977 decode_x86_compat_isa (unsigned int bitmask)
16978 {
16979   while (bitmask)
16980     {
16981       unsigned int bit = bitmask & (- bitmask);
16982
16983       bitmask &= ~ bit;
16984       switch (bit)
16985         {
16986         case GNU_PROPERTY_X86_COMPAT_ISA_1_486:
16987           printf ("i486");
16988           break;
16989         case GNU_PROPERTY_X86_COMPAT_ISA_1_586:
16990           printf ("586");
16991           break;
16992         case GNU_PROPERTY_X86_COMPAT_ISA_1_686:
16993           printf ("686");
16994           break;
16995         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE:
16996           printf ("SSE");
16997           break;
16998         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE2:
16999           printf ("SSE2");
17000           break;
17001         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE3:
17002           printf ("SSE3");
17003           break;
17004         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSSE3:
17005           printf ("SSSE3");
17006           break;
17007         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_1:
17008           printf ("SSE4_1");
17009           break;
17010         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_2:
17011           printf ("SSE4_2");
17012           break;
17013         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX:
17014           printf ("AVX");
17015           break;
17016         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX2:
17017           printf ("AVX2");
17018           break;
17019         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512F:
17020           printf ("AVX512F");
17021           break;
17022         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512CD:
17023           printf ("AVX512CD");
17024           break;
17025         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512ER:
17026           printf ("AVX512ER");
17027           break;
17028         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512PF:
17029           printf ("AVX512PF");
17030           break;
17031         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512VL:
17032           printf ("AVX512VL");
17033           break;
17034         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512DQ:
17035           printf ("AVX512DQ");
17036           break;
17037         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512BW:
17038           printf ("AVX512BW");
17039           break;
17040         default:
17041           printf (_("<unknown: %x>"), bit);
17042           break;
17043         }
17044       if (bitmask)
17045         printf (", ");
17046     }
17047 }
17048
17049 static void
17050 decode_x86_isa (unsigned int bitmask)
17051 {
17052   if (!bitmask)
17053     {
17054       printf (_("<None>"));
17055       return;
17056     }
17057
17058   while (bitmask)
17059     {
17060       unsigned int bit = bitmask & (- bitmask);
17061
17062       bitmask &= ~ bit;
17063       switch (bit)
17064         {
17065         case GNU_PROPERTY_X86_ISA_1_CMOV:
17066           printf ("CMOV");
17067           break;
17068         case GNU_PROPERTY_X86_ISA_1_SSE:
17069           printf ("SSE");
17070           break;
17071         case GNU_PROPERTY_X86_ISA_1_SSE2:
17072           printf ("SSE2");
17073           break;
17074         case GNU_PROPERTY_X86_ISA_1_SSE3:
17075           printf ("SSE3");
17076           break;
17077         case GNU_PROPERTY_X86_ISA_1_SSSE3:
17078           printf ("SSSE3");
17079           break;
17080         case GNU_PROPERTY_X86_ISA_1_SSE4_1:
17081           printf ("SSE4_1");
17082           break;
17083         case GNU_PROPERTY_X86_ISA_1_SSE4_2:
17084           printf ("SSE4_2");
17085           break;
17086         case GNU_PROPERTY_X86_ISA_1_AVX:
17087           printf ("AVX");
17088           break;
17089         case GNU_PROPERTY_X86_ISA_1_AVX2:
17090           printf ("AVX2");
17091           break;
17092         case GNU_PROPERTY_X86_ISA_1_FMA:
17093           printf ("FMA");
17094           break;
17095         case GNU_PROPERTY_X86_ISA_1_AVX512F:
17096           printf ("AVX512F");
17097           break;
17098         case GNU_PROPERTY_X86_ISA_1_AVX512CD:
17099           printf ("AVX512CD");
17100           break;
17101         case GNU_PROPERTY_X86_ISA_1_AVX512ER:
17102           printf ("AVX512ER");
17103           break;
17104         case GNU_PROPERTY_X86_ISA_1_AVX512PF:
17105           printf ("AVX512PF");
17106           break;
17107         case GNU_PROPERTY_X86_ISA_1_AVX512VL:
17108           printf ("AVX512VL");
17109           break;
17110         case GNU_PROPERTY_X86_ISA_1_AVX512DQ:
17111           printf ("AVX512DQ");
17112           break;
17113         case GNU_PROPERTY_X86_ISA_1_AVX512BW:
17114           printf ("AVX512BW");
17115           break;
17116         case GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS:
17117           printf ("AVX512_4FMAPS");
17118           break;
17119         case GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW:
17120           printf ("AVX512_4VNNIW");
17121           break;
17122         case GNU_PROPERTY_X86_ISA_1_AVX512_BITALG:
17123           printf ("AVX512_BITALG");
17124           break;
17125         case GNU_PROPERTY_X86_ISA_1_AVX512_IFMA:
17126           printf ("AVX512_IFMA");
17127           break;
17128         case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI:
17129           printf ("AVX512_VBMI");
17130           break;
17131         case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2:
17132           printf ("AVX512_VBMI2");
17133           break;
17134         case GNU_PROPERTY_X86_ISA_1_AVX512_VNNI:
17135           printf ("AVX512_VNNI");
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_feature_1 (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_FEATURE_1_IBT:
17163           printf ("IBT");
17164           break;
17165         case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
17166           printf ("SHSTK");
17167           break;
17168         default:
17169           printf (_("<unknown: %x>"), bit);
17170           break;
17171         }
17172       if (bitmask)
17173         printf (", ");
17174     }
17175 }
17176
17177 static void
17178 decode_x86_feature_2 (unsigned int bitmask)
17179 {
17180   if (!bitmask)
17181     {
17182       printf (_("<None>"));
17183       return;
17184     }
17185
17186   while (bitmask)
17187     {
17188       unsigned int bit = bitmask & (- bitmask);
17189
17190       bitmask &= ~ bit;
17191       switch (bit)
17192         {
17193         case GNU_PROPERTY_X86_FEATURE_2_X86:
17194           printf ("x86");
17195           break;
17196         case GNU_PROPERTY_X86_FEATURE_2_X87:
17197           printf ("x87");
17198           break;
17199         case GNU_PROPERTY_X86_FEATURE_2_MMX:
17200           printf ("MMX");
17201           break;
17202         case GNU_PROPERTY_X86_FEATURE_2_XMM:
17203           printf ("XMM");
17204           break;
17205         case GNU_PROPERTY_X86_FEATURE_2_YMM:
17206           printf ("YMM");
17207           break;
17208         case GNU_PROPERTY_X86_FEATURE_2_ZMM:
17209           printf ("ZMM");
17210           break;
17211         case GNU_PROPERTY_X86_FEATURE_2_FXSR:
17212           printf ("FXSR");
17213           break;
17214         case GNU_PROPERTY_X86_FEATURE_2_XSAVE:
17215           printf ("XSAVE");
17216           break;
17217         case GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT:
17218           printf ("XSAVEOPT");
17219           break;
17220         case GNU_PROPERTY_X86_FEATURE_2_XSAVEC:
17221           printf ("XSAVEC");
17222           break;
17223         default:
17224           printf (_("<unknown: %x>"), bit);
17225           break;
17226         }
17227       if (bitmask)
17228         printf (", ");
17229     }
17230 }
17231
17232 static void
17233 print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
17234 {
17235   unsigned char * ptr = (unsigned char *) pnote->descdata;
17236   unsigned char * ptr_end = ptr + pnote->descsz;
17237   unsigned int    size = is_32bit_elf ? 4 : 8;
17238
17239   printf (_("      Properties: "));
17240
17241   if (pnote->descsz < 8 || (pnote->descsz % size) != 0)
17242     {
17243       printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz);
17244       return;
17245     }
17246
17247   while (ptr < ptr_end)
17248     {
17249       unsigned int j;
17250       unsigned int type;
17251       unsigned int datasz;
17252
17253       if ((size_t) (ptr_end - ptr) < 8)
17254         {
17255           printf (_("<corrupt descsz: %#lx>\n"), pnote->descsz);
17256           break;
17257         }
17258
17259       type = byte_get (ptr, 4);
17260       datasz = byte_get (ptr + 4, 4);
17261
17262       ptr += 8;
17263
17264       if (datasz > (size_t) (ptr_end - ptr))
17265         {
17266           printf (_("<corrupt type (%#x) datasz: %#x>\n"),
17267                   type, datasz);
17268           break;
17269         }
17270
17271       if (type >= GNU_PROPERTY_LOPROC && type <= GNU_PROPERTY_HIPROC)
17272         {
17273           if (filedata->file_header.e_machine == EM_X86_64
17274               || filedata->file_header.e_machine == EM_IAMCU
17275               || filedata->file_header.e_machine == EM_386)
17276             {
17277               unsigned int bitmask;
17278
17279               if (datasz == 4)
17280                 bitmask = byte_get (ptr, 4);
17281               else
17282                 bitmask = 0;
17283
17284               switch (type)
17285                 {
17286                 case GNU_PROPERTY_X86_ISA_1_USED:
17287                   if (datasz != 4)
17288                     printf (_("x86 ISA used: <corrupt length: %#x> "),
17289                             datasz);
17290                   else
17291                     {
17292                       printf ("x86 ISA used: ");
17293                       decode_x86_isa (bitmask);
17294                     }
17295                   goto next;
17296
17297                 case GNU_PROPERTY_X86_ISA_1_NEEDED:
17298                   if (datasz != 4)
17299                     printf (_("x86 ISA needed: <corrupt length: %#x> "),
17300                             datasz);
17301                   else
17302                     {
17303                       printf ("x86 ISA needed: ");
17304                       decode_x86_isa (bitmask);
17305                     }
17306                   goto next;
17307
17308                 case GNU_PROPERTY_X86_FEATURE_1_AND:
17309                   if (datasz != 4)
17310                     printf (_("x86 feature: <corrupt length: %#x> "),
17311                             datasz);
17312                   else
17313                     {
17314                       printf ("x86 feature: ");
17315                       decode_x86_feature_1 (bitmask);
17316                     }
17317                   goto next;
17318
17319                 case GNU_PROPERTY_X86_FEATURE_2_USED:
17320                   if (datasz != 4)
17321                     printf (_("x86 feature used: <corrupt length: %#x> "),
17322                             datasz);
17323                   else
17324                     {
17325                       printf ("x86 feature used: ");
17326                       decode_x86_feature_2 (bitmask);
17327                     }
17328                   goto next;
17329
17330                 case GNU_PROPERTY_X86_FEATURE_2_NEEDED:
17331                   if (datasz != 4)
17332                     printf (_("x86 feature needed: <corrupt length: %#x> "), datasz);
17333                   else
17334                     {
17335                       printf ("x86 feature needed: ");
17336                       decode_x86_feature_2 (bitmask);
17337                     }
17338                   goto next;
17339
17340                 case GNU_PROPERTY_X86_COMPAT_ISA_1_USED:
17341                   if (datasz != 4)
17342                     printf (_("x86 ISA used: <corrupt length: %#x> "),
17343                             datasz);
17344                   else
17345                     {
17346                       printf ("x86 ISA used: ");
17347                       decode_x86_compat_isa (bitmask);
17348                     }
17349                   goto next;
17350
17351                 case GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED:
17352                   if (datasz != 4)
17353                     printf (_("x86 ISA needed: <corrupt length: %#x> "),
17354                             datasz);
17355                   else
17356                     {
17357                       printf ("x86 ISA needed: ");
17358                       decode_x86_compat_isa (bitmask);
17359                     }
17360                   goto next;
17361
17362                 default:
17363                   break;
17364                 }
17365             }
17366         }
17367       else
17368         {
17369           switch (type)
17370             {
17371             case GNU_PROPERTY_STACK_SIZE:
17372               printf (_("stack size: "));
17373               if (datasz != size)
17374                 printf (_("<corrupt length: %#x> "), datasz);
17375               else
17376                 printf ("%#lx", (unsigned long) byte_get (ptr, size));
17377               goto next;
17378
17379             case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
17380               printf ("no copy on protected ");
17381               if (datasz)
17382                 printf (_("<corrupt length: %#x> "), datasz);
17383               goto next;
17384
17385             default:
17386               break;
17387             }
17388         }
17389
17390       if (type < GNU_PROPERTY_LOPROC)
17391         printf (_("<unknown type %#x data: "), type);
17392       else if (type < GNU_PROPERTY_LOUSER)
17393         printf (_("<procesor-specific type %#x data: "), type);
17394       else
17395         printf (_("<application-specific type %#x data: "), type);
17396       for (j = 0; j < datasz; ++j)
17397         printf ("%02x ", ptr[j] & 0xff);
17398       printf (">");
17399
17400 next:
17401       ptr += ((datasz + (size - 1)) & ~ (size - 1));
17402       if (ptr == ptr_end)
17403         break;
17404
17405       if (do_wide)
17406         printf (", ");
17407       else
17408         printf ("\n\t");
17409     }
17410
17411   printf ("\n");
17412 }
17413
17414 static bfd_boolean
17415 print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
17416 {
17417   /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type ().  */
17418   switch (pnote->type)
17419     {
17420     case NT_GNU_BUILD_ID:
17421       {
17422         unsigned long i;
17423
17424         printf (_("    Build ID: "));
17425         for (i = 0; i < pnote->descsz; ++i)
17426           printf ("%02x", pnote->descdata[i] & 0xff);
17427         printf ("\n");
17428       }
17429       break;
17430
17431     case NT_GNU_ABI_TAG:
17432       {
17433         unsigned long os, major, minor, subminor;
17434         const char *osname;
17435
17436         /* PR 17531: file: 030-599401-0.004.  */
17437         if (pnote->descsz < 16)
17438           {
17439             printf (_("    <corrupt GNU_ABI_TAG>\n"));
17440             break;
17441           }
17442
17443         os = byte_get ((unsigned char *) pnote->descdata, 4);
17444         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17445         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
17446         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
17447
17448         switch (os)
17449           {
17450           case GNU_ABI_TAG_LINUX:
17451             osname = "Linux";
17452             break;
17453           case GNU_ABI_TAG_HURD:
17454             osname = "Hurd";
17455             break;
17456           case GNU_ABI_TAG_SOLARIS:
17457             osname = "Solaris";
17458             break;
17459           case GNU_ABI_TAG_FREEBSD:
17460             osname = "FreeBSD";
17461             break;
17462           case GNU_ABI_TAG_NETBSD:
17463             osname = "NetBSD";
17464             break;
17465           case GNU_ABI_TAG_SYLLABLE:
17466             osname = "Syllable";
17467             break;
17468           case GNU_ABI_TAG_NACL:
17469             osname = "NaCl";
17470             break;
17471           default:
17472             osname = "Unknown";
17473             break;
17474           }
17475
17476         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
17477                 major, minor, subminor);
17478       }
17479       break;
17480
17481     case NT_GNU_GOLD_VERSION:
17482       {
17483         unsigned long i;
17484
17485         printf (_("    Version: "));
17486         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
17487           printf ("%c", pnote->descdata[i]);
17488         printf ("\n");
17489       }
17490       break;
17491
17492     case NT_GNU_HWCAP:
17493       {
17494         unsigned long num_entries, mask;
17495
17496         /* Hardware capabilities information.  Word 0 is the number of entries.
17497            Word 1 is a bitmask of enabled entries.  The rest of the descriptor
17498            is a series of entries, where each entry is a single byte followed
17499            by a nul terminated string.  The byte gives the bit number to test
17500            if enabled in the bitmask.  */
17501         printf (_("      Hardware Capabilities: "));
17502         if (pnote->descsz < 8)
17503           {
17504             error (_("<corrupt GNU_HWCAP>\n"));
17505             return FALSE;
17506           }
17507         num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
17508         mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17509         printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
17510         /* FIXME: Add code to display the entries... */
17511       }
17512       break;
17513
17514     case NT_GNU_PROPERTY_TYPE_0:
17515       print_gnu_property_note (filedata, pnote);
17516       break;
17517       
17518     default:
17519       /* Handle unrecognised types.  An error message should have already been
17520          created by get_gnu_elf_note_type(), so all that we need to do is to
17521          display the data.  */
17522       {
17523         unsigned long i;
17524
17525         printf (_("    Description data: "));
17526         for (i = 0; i < pnote->descsz; ++i)
17527           printf ("%02x ", pnote->descdata[i] & 0xff);
17528         printf ("\n");
17529       }
17530       break;
17531     }
17532
17533   return TRUE;
17534 }
17535
17536 static const char *
17537 get_v850_elf_note_type (enum v850_notes n_type)
17538 {
17539   static char buff[64];
17540
17541   switch (n_type)
17542     {
17543     case V850_NOTE_ALIGNMENT:  return _("Alignment of 8-byte objects");
17544     case V850_NOTE_DATA_SIZE:  return _("Sizeof double and long double");
17545     case V850_NOTE_FPU_INFO:   return _("Type of FPU support needed");
17546     case V850_NOTE_SIMD_INFO:  return _("Use of SIMD instructions");
17547     case V850_NOTE_CACHE_INFO: return _("Use of cache");
17548     case V850_NOTE_MMU_INFO:   return _("Use of MMU");
17549     default:
17550       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
17551       return buff;
17552     }
17553 }
17554
17555 static bfd_boolean
17556 print_v850_note (Elf_Internal_Note * pnote)
17557 {
17558   unsigned int val;
17559
17560   if (pnote->descsz != 4)
17561     return FALSE;
17562
17563   val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
17564
17565   if (val == 0)
17566     {
17567       printf (_("not set\n"));
17568       return TRUE;
17569     }
17570
17571   switch (pnote->type)
17572     {
17573     case V850_NOTE_ALIGNMENT:
17574       switch (val)
17575         {
17576         case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return TRUE;
17577         case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return TRUE;
17578         }
17579       break;
17580
17581     case V850_NOTE_DATA_SIZE:
17582       switch (val)
17583         {
17584         case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return TRUE;
17585         case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return TRUE;
17586         }
17587       break;
17588
17589     case V850_NOTE_FPU_INFO:
17590       switch (val)
17591         {
17592         case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return TRUE;
17593         case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return TRUE;
17594         }
17595       break;
17596
17597     case V850_NOTE_MMU_INFO:
17598     case V850_NOTE_CACHE_INFO:
17599     case V850_NOTE_SIMD_INFO:
17600       if (val == EF_RH850_SIMD)
17601         {
17602           printf (_("yes\n"));
17603           return TRUE;
17604         }
17605       break;
17606
17607     default:
17608       /* An 'unknown note type' message will already have been displayed.  */
17609       break;
17610     }
17611
17612   printf (_("unknown value: %x\n"), val);
17613   return FALSE;
17614 }
17615
17616 static bfd_boolean
17617 process_netbsd_elf_note (Elf_Internal_Note * pnote)
17618 {
17619   unsigned int version;
17620
17621   switch (pnote->type)
17622     {
17623     case NT_NETBSD_IDENT:
17624       version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
17625       if ((version / 10000) % 100)
17626         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
17627                 version, version / 100000000, (version / 1000000) % 100,
17628                 (version / 10000) % 100 > 26 ? "Z" : "",
17629                 'A' + (version / 10000) % 26);
17630       else
17631         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
17632                 version, version / 100000000, (version / 1000000) % 100,
17633                 (version / 100) % 100);
17634       return TRUE;
17635
17636     case NT_NETBSD_MARCH:
17637       printf ("  NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
17638               pnote->descdata);
17639       return TRUE;
17640
17641     default:
17642       printf ("  NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
17643               pnote->type);
17644       return FALSE;
17645     }
17646 }
17647
17648 static const char *
17649 get_freebsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17650 {
17651   switch (e_type)
17652     {
17653     case NT_FREEBSD_THRMISC:
17654       return _("NT_THRMISC (thrmisc structure)");
17655     case NT_FREEBSD_PROCSTAT_PROC:
17656       return _("NT_PROCSTAT_PROC (proc data)");
17657     case NT_FREEBSD_PROCSTAT_FILES:
17658       return _("NT_PROCSTAT_FILES (files data)");
17659     case NT_FREEBSD_PROCSTAT_VMMAP:
17660       return _("NT_PROCSTAT_VMMAP (vmmap data)");
17661     case NT_FREEBSD_PROCSTAT_GROUPS:
17662       return _("NT_PROCSTAT_GROUPS (groups data)");
17663     case NT_FREEBSD_PROCSTAT_UMASK:
17664       return _("NT_PROCSTAT_UMASK (umask data)");
17665     case NT_FREEBSD_PROCSTAT_RLIMIT:
17666       return _("NT_PROCSTAT_RLIMIT (rlimit data)");
17667     case NT_FREEBSD_PROCSTAT_OSREL:
17668       return _("NT_PROCSTAT_OSREL (osreldate data)");
17669     case NT_FREEBSD_PROCSTAT_PSSTRINGS:
17670       return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
17671     case NT_FREEBSD_PROCSTAT_AUXV:
17672       return _("NT_PROCSTAT_AUXV (auxv data)");
17673     case NT_FREEBSD_PTLWPINFO:
17674       return _("NT_PTLWPINFO (ptrace_lwpinfo structure)");
17675     }
17676   return get_note_type (filedata, e_type);
17677 }
17678
17679 static const char *
17680 get_netbsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17681 {
17682   static char buff[64];
17683
17684   if (e_type == NT_NETBSDCORE_PROCINFO)
17685     return _("NetBSD procinfo structure");
17686
17687   /* As of Jan 2002 there are no other machine-independent notes
17688      defined for NetBSD core files.  If the note type is less
17689      than the start of the machine-dependent note types, we don't
17690      understand it.  */
17691
17692   if (e_type < NT_NETBSDCORE_FIRSTMACH)
17693     {
17694       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17695       return buff;
17696     }
17697
17698   switch (filedata->file_header.e_machine)
17699     {
17700     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
17701        and PT_GETFPREGS == mach+2.  */
17702
17703     case EM_OLD_ALPHA:
17704     case EM_ALPHA:
17705     case EM_SPARC:
17706     case EM_SPARC32PLUS:
17707     case EM_SPARCV9:
17708       switch (e_type)
17709         {
17710         case NT_NETBSDCORE_FIRSTMACH + 0:
17711           return _("PT_GETREGS (reg structure)");
17712         case NT_NETBSDCORE_FIRSTMACH + 2:
17713           return _("PT_GETFPREGS (fpreg structure)");
17714         default:
17715           break;
17716         }
17717       break;
17718
17719     /* On all other arch's, PT_GETREGS == mach+1 and
17720        PT_GETFPREGS == mach+3.  */
17721     default:
17722       switch (e_type)
17723         {
17724         case NT_NETBSDCORE_FIRSTMACH + 1:
17725           return _("PT_GETREGS (reg structure)");
17726         case NT_NETBSDCORE_FIRSTMACH + 3:
17727           return _("PT_GETFPREGS (fpreg structure)");
17728         default:
17729           break;
17730         }
17731     }
17732
17733   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
17734             e_type - NT_NETBSDCORE_FIRSTMACH);
17735   return buff;
17736 }
17737
17738 static const char *
17739 get_stapsdt_note_type (unsigned e_type)
17740 {
17741   static char buff[64];
17742
17743   switch (e_type)
17744     {
17745     case NT_STAPSDT:
17746       return _("NT_STAPSDT (SystemTap probe descriptors)");
17747
17748     default:
17749       break;
17750     }
17751
17752   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17753   return buff;
17754 }
17755
17756 static bfd_boolean
17757 print_stapsdt_note (Elf_Internal_Note *pnote)
17758 {
17759   int addr_size = is_32bit_elf ? 4 : 8;
17760   char *data = pnote->descdata;
17761   char *data_end = pnote->descdata + pnote->descsz;
17762   bfd_vma pc, base_addr, semaphore;
17763   char *provider, *probe, *arg_fmt;
17764
17765   pc = byte_get ((unsigned char *) data, addr_size);
17766   data += addr_size;
17767   base_addr = byte_get ((unsigned char *) data, addr_size);
17768   data += addr_size;
17769   semaphore = byte_get ((unsigned char *) data, addr_size);
17770   data += addr_size;
17771
17772   provider = data;
17773   data += strlen (data) + 1;
17774   probe = data;
17775   data += strlen (data) + 1;
17776   arg_fmt = data;
17777   data += strlen (data) + 1;
17778
17779   printf (_("    Provider: %s\n"), provider);
17780   printf (_("    Name: %s\n"), probe);
17781   printf (_("    Location: "));
17782   print_vma (pc, FULL_HEX);
17783   printf (_(", Base: "));
17784   print_vma (base_addr, FULL_HEX);
17785   printf (_(", Semaphore: "));
17786   print_vma (semaphore, FULL_HEX);
17787   printf ("\n");
17788   printf (_("    Arguments: %s\n"), arg_fmt);
17789
17790   return data == data_end;
17791 }
17792
17793 static const char *
17794 get_ia64_vms_note_type (unsigned e_type)
17795 {
17796   static char buff[64];
17797
17798   switch (e_type)
17799     {
17800     case NT_VMS_MHD:
17801       return _("NT_VMS_MHD (module header)");
17802     case NT_VMS_LNM:
17803       return _("NT_VMS_LNM (language name)");
17804     case NT_VMS_SRC:
17805       return _("NT_VMS_SRC (source files)");
17806     case NT_VMS_TITLE:
17807       return "NT_VMS_TITLE";
17808     case NT_VMS_EIDC:
17809       return _("NT_VMS_EIDC (consistency check)");
17810     case NT_VMS_FPMODE:
17811       return _("NT_VMS_FPMODE (FP mode)");
17812     case NT_VMS_LINKTIME:
17813       return "NT_VMS_LINKTIME";
17814     case NT_VMS_IMGNAM:
17815       return _("NT_VMS_IMGNAM (image name)");
17816     case NT_VMS_IMGID:
17817       return _("NT_VMS_IMGID (image id)");
17818     case NT_VMS_LINKID:
17819       return _("NT_VMS_LINKID (link id)");
17820     case NT_VMS_IMGBID:
17821       return _("NT_VMS_IMGBID (build id)");
17822     case NT_VMS_GSTNAM:
17823       return _("NT_VMS_GSTNAM (sym table name)");
17824     case NT_VMS_ORIG_DYN:
17825       return "NT_VMS_ORIG_DYN";
17826     case NT_VMS_PATCHTIME:
17827       return "NT_VMS_PATCHTIME";
17828     default:
17829       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17830       return buff;
17831     }
17832 }
17833
17834 static bfd_boolean
17835 print_ia64_vms_note (Elf_Internal_Note * pnote)
17836 {
17837   switch (pnote->type)
17838     {
17839     case NT_VMS_MHD:
17840       if (pnote->descsz > 36)
17841         {
17842           size_t l = strlen (pnote->descdata + 34);
17843           printf (_("    Creation date  : %.17s\n"), pnote->descdata);
17844           printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
17845           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
17846           printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
17847         }
17848       else
17849         printf (_("    Invalid size\n"));
17850       break;
17851     case NT_VMS_LNM:
17852       printf (_("   Language: %s\n"), pnote->descdata);
17853       break;
17854 #ifdef BFD64
17855     case NT_VMS_FPMODE:
17856       printf (_("   Floating Point mode: "));
17857       printf ("0x%016" BFD_VMA_FMT "x\n",
17858               (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
17859       break;
17860     case NT_VMS_LINKTIME:
17861       printf (_("   Link time: "));
17862       print_vms_time
17863         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
17864       printf ("\n");
17865       break;
17866     case NT_VMS_PATCHTIME:
17867       printf (_("   Patch time: "));
17868       print_vms_time
17869         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
17870       printf ("\n");
17871       break;
17872     case NT_VMS_ORIG_DYN:
17873       printf (_("   Major id: %u,  minor id: %u\n"),
17874               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
17875               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
17876       printf (_("   Last modified  : "));
17877       print_vms_time
17878         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
17879       printf (_("\n   Link flags  : "));
17880       printf ("0x%016" BFD_VMA_FMT "x\n",
17881               (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
17882       printf (_("   Header flags: 0x%08x\n"),
17883               (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
17884       printf (_("   Image id    : %s\n"), pnote->descdata + 32);
17885       break;
17886 #endif
17887     case NT_VMS_IMGNAM:
17888       printf (_("    Image name: %s\n"), pnote->descdata);
17889       break;
17890     case NT_VMS_GSTNAM:
17891       printf (_("    Global symbol table name: %s\n"), pnote->descdata);
17892       break;
17893     case NT_VMS_IMGID:
17894       printf (_("    Image id: %s\n"), pnote->descdata);
17895       break;
17896     case NT_VMS_LINKID:
17897       printf (_("    Linker id: %s\n"), pnote->descdata);
17898       break;
17899     default:
17900       return FALSE;
17901     }
17902   return TRUE;
17903 }
17904
17905 /* Find the symbol associated with a build attribute that is attached
17906    to address OFFSET.  If PNAME is non-NULL then store the name of
17907    the symbol (if found) in the provided pointer,  Returns NULL if a
17908    symbol could not be found.  */
17909
17910 static Elf_Internal_Sym *
17911 get_symbol_for_build_attribute (Filedata *       filedata,
17912                                 unsigned long    offset,
17913                                 bfd_boolean      is_open_attr,
17914                                 const char **    pname)
17915 {
17916   static Filedata *         saved_filedata = NULL;
17917   static char *             strtab;
17918   static unsigned long      strtablen;
17919   static Elf_Internal_Sym * symtab;
17920   static unsigned long      nsyms;
17921   Elf_Internal_Sym *        saved_sym = NULL;
17922   Elf_Internal_Sym *        sym;
17923
17924   if (filedata->section_headers != NULL
17925       && (saved_filedata == NULL || filedata != saved_filedata))
17926     {
17927       Elf_Internal_Shdr * symsec;
17928
17929       /* Load the symbol and string sections.  */
17930       for (symsec = filedata->section_headers;
17931            symsec < filedata->section_headers + filedata->file_header.e_shnum;
17932            symsec ++)
17933         {
17934           if (symsec->sh_type == SHT_SYMTAB)
17935             {
17936               symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
17937
17938               if (symsec->sh_link < filedata->file_header.e_shnum)
17939                 {
17940                   Elf_Internal_Shdr * strtab_sec = filedata->section_headers + symsec->sh_link;
17941
17942                   strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
17943                                               1, strtab_sec->sh_size,
17944                                               _("string table"));
17945                   strtablen = strtab != NULL ? strtab_sec->sh_size : 0;
17946                 }
17947             }
17948         }
17949       saved_filedata = filedata;
17950     }
17951
17952   if (symtab == NULL || strtab == NULL)
17953     return NULL;
17954
17955   /* Find a symbol whose value matches offset.  */
17956   for (sym = symtab; sym < symtab + nsyms; sym ++)
17957     if (sym->st_value == offset)
17958       {
17959         if (sym->st_name >= strtablen)
17960           /* Huh ?  This should not happen.  */
17961           continue;
17962
17963         if (strtab[sym->st_name] == 0)
17964           continue;
17965
17966         /* The AArch64 and ARM architectures define mapping symbols
17967            (eg $d, $x, $t) which we want to ignore.  */
17968         if (strtab[sym->st_name] == '$'
17969             && strtab[sym->st_name + 1] != 0
17970             && strtab[sym->st_name + 2] == 0)
17971           continue;
17972
17973         if (is_open_attr)
17974           {
17975             /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
17976                and FILE or OBJECT symbols over NOTYPE symbols.  We skip
17977                FUNC symbols entirely.  */
17978             switch (ELF_ST_TYPE (sym->st_info))
17979               {
17980               case STT_OBJECT:
17981               case STT_FILE:
17982                 saved_sym = sym;
17983                 if (sym->st_size)
17984                   {
17985                     /* If the symbol has a size associated
17986                        with it then we can stop searching.  */
17987                     sym = symtab + nsyms;
17988                   }
17989                 continue;
17990
17991               case STT_FUNC:
17992                 /* Ignore function symbols.  */
17993                 continue;
17994
17995               default:
17996                 break;
17997               }
17998
17999             switch (ELF_ST_BIND (sym->st_info))
18000               {
18001               case STB_GLOBAL:
18002                 if (saved_sym == NULL
18003                     || ELF_ST_TYPE (saved_sym->st_info) != STT_OBJECT)
18004                   saved_sym = sym;
18005                 break;
18006
18007               case STB_LOCAL:
18008                 if (saved_sym == NULL)
18009                   saved_sym = sym;
18010                 break;
18011
18012               default:
18013                 break;
18014               }
18015           }
18016         else
18017           {
18018             if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
18019               continue;
18020
18021             saved_sym = sym;
18022             break;
18023           }
18024       }
18025
18026   if (saved_sym && pname)
18027     * pname = strtab + saved_sym->st_name;
18028
18029   return saved_sym;
18030 }
18031
18032 /* Returns true iff addr1 and addr2 are in the same section.  */
18033
18034 static bfd_boolean
18035 same_section (Filedata * filedata, unsigned long addr1, unsigned long addr2)
18036 {
18037   Elf_Internal_Shdr * a1;
18038   Elf_Internal_Shdr * a2;
18039
18040   a1 = find_section_by_address (filedata, addr1);
18041   a2 = find_section_by_address (filedata, addr2);
18042   
18043   return a1 == a2 && a1 != NULL;
18044 }
18045
18046 static bfd_boolean
18047 print_gnu_build_attribute_description (Elf_Internal_Note *  pnote,
18048                                        Filedata *           filedata)
18049 {
18050   static unsigned long  global_offset = 0;
18051   static unsigned long  global_end = 0;
18052   static unsigned long  func_offset = 0;
18053   static unsigned long  func_end = 0;
18054
18055   Elf_Internal_Sym *    sym;
18056   const char *          name;
18057   unsigned long         start;
18058   unsigned long         end;
18059   bfd_boolean           is_open_attr = pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN;
18060
18061   switch (pnote->descsz)
18062     {
18063     case 0:
18064       /* A zero-length description means that the range of
18065          the previous note of the same type should be used.  */
18066       if (is_open_attr)
18067         {
18068           if (global_end > global_offset)
18069             printf (_("    Applies to region from %#lx to %#lx\n"),
18070                     global_offset, global_end);
18071           else
18072             printf (_("    Applies to region from %#lx\n"), global_offset);
18073         }
18074       else
18075         {
18076           if (func_end > func_offset)
18077             printf (_("    Applies to region from %#lx to %#lx\n"), func_offset, func_end);
18078           else
18079             printf (_("    Applies to region from %#lx\n"), func_offset);
18080         }
18081       return TRUE;
18082
18083     case 4:
18084       start = byte_get ((unsigned char *) pnote->descdata, 4);
18085       end = 0;
18086       break;
18087
18088     case 8:
18089       if (is_32bit_elf)
18090         {
18091           /* FIXME: We should check that version 3+ notes are being used here...  */
18092           start = byte_get ((unsigned char *) pnote->descdata, 4);
18093           end = byte_get ((unsigned char *) pnote->descdata + 4, 4);
18094         }
18095       else
18096         {
18097           start = byte_get ((unsigned char *) pnote->descdata, 8);
18098           end = 0;
18099         }
18100       break;
18101
18102     case 16:
18103       start = byte_get ((unsigned char *) pnote->descdata, 8);
18104       end = byte_get ((unsigned char *) pnote->descdata + 8, 8);
18105       break;
18106       
18107     default:
18108       error (_("    <invalid description size: %lx>\n"), pnote->descsz);
18109       printf (_("    <invalid descsz>"));
18110       return FALSE;
18111     }
18112
18113   name = NULL;
18114   sym = get_symbol_for_build_attribute (filedata, start, is_open_attr, & name);
18115   /* As of version 5 of the annobin plugin, filename symbols are biased by 2
18116      in order to avoid them being confused with the start address of the
18117      first function in the file...  */
18118   if (sym == NULL && is_open_attr)
18119     sym = get_symbol_for_build_attribute (filedata, start + 2, is_open_attr,
18120                                           & name);
18121
18122   if (end == 0 && sym != NULL && sym->st_size > 0)
18123     end = start + sym->st_size;
18124
18125   if (is_open_attr)
18126     {
18127       /* FIXME: Need to properly allow for section alignment.
18128          16 is just the alignment used on x86_64.  */
18129       if (global_end > 0
18130           && start > BFD_ALIGN (global_end, 16)
18131           /* Build notes are not guaranteed to be organised in order of
18132              increasing address, but we should find the all of the notes
18133              for one section in the same place.  */
18134           && same_section (filedata, start, global_end))
18135         warn (_("Gap in build notes detected from %#lx to %#lx\n"),
18136               global_end + 1, start - 1);
18137
18138       printf (_("    Applies to region from %#lx"), start);
18139       global_offset = start;
18140
18141       if (end)
18142         {
18143           printf (_(" to %#lx"), end);
18144           global_end = end;
18145         }
18146     }
18147   else
18148     {
18149       printf (_("    Applies to region from %#lx"), start);
18150       func_offset = start;
18151
18152       if (end)
18153         {
18154           printf (_(" to %#lx"), end);
18155           func_end = end;
18156         }
18157     }
18158
18159   if (sym && name)
18160     printf (_(" (%s)"), name);
18161
18162   printf ("\n");
18163   return TRUE;
18164 }
18165
18166 static bfd_boolean
18167 print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
18168 {
18169   static const char string_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_STRING, 0 };
18170   static const char number_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC, 0 };
18171   static const char bool_expected [3] = { GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE, GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE, 0 };
18172   char         name_type;
18173   char         name_attribute;
18174   const char * expected_types;
18175   const char * name = pnote->namedata;
18176   const char * text;
18177   signed int   left;
18178
18179   if (name == NULL || pnote->namesz < 2)
18180     {
18181       error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
18182       print_symbol (-20, _("  <corrupt name>"));
18183       return FALSE;
18184     }
18185
18186   if (do_wide)
18187     left = 28;
18188   else
18189     left = 20;
18190
18191   /* Version 2 of the spec adds a "GA" prefix to the name field.  */
18192   if (name[0] == 'G' && name[1] == 'A')
18193     {
18194       if (pnote->namesz < 4)
18195         {
18196           error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
18197           print_symbol (-20, _("  <corrupt name>"));
18198           return FALSE;
18199         }
18200
18201       printf ("GA");
18202       name += 2;
18203       left -= 2;
18204     }
18205
18206   switch ((name_type = * name))
18207     {
18208     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18209     case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
18210     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
18211     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
18212       printf ("%c", * name);
18213       left --;
18214       break;
18215     default:
18216       error (_("unrecognised attribute type in name field: %d\n"), name_type);
18217       print_symbol (-20, _("<unknown name type>"));
18218       return FALSE;
18219     }
18220
18221   ++ name;
18222   text = NULL;
18223
18224   switch ((name_attribute = * name))
18225     {
18226     case GNU_BUILD_ATTRIBUTE_VERSION:
18227       text = _("<version>");
18228       expected_types = string_expected;
18229       ++ name;
18230       break;
18231     case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18232       text = _("<stack prot>");
18233       expected_types = "!+*";
18234       ++ name;
18235       break;
18236     case GNU_BUILD_ATTRIBUTE_RELRO:
18237       text = _("<relro>");
18238       expected_types = bool_expected;
18239       ++ name;
18240       break;
18241     case GNU_BUILD_ATTRIBUTE_STACK_SIZE:
18242       text = _("<stack size>");
18243       expected_types = number_expected;
18244       ++ name;
18245       break;
18246     case GNU_BUILD_ATTRIBUTE_TOOL:
18247       text = _("<tool>");
18248       expected_types = string_expected;
18249       ++ name;
18250       break;
18251     case GNU_BUILD_ATTRIBUTE_ABI:
18252       text = _("<ABI>");
18253       expected_types = "$*";
18254       ++ name;
18255       break;
18256     case GNU_BUILD_ATTRIBUTE_PIC:
18257       text = _("<PIC>");
18258       expected_types = number_expected;
18259       ++ name;
18260       break;
18261     case GNU_BUILD_ATTRIBUTE_SHORT_ENUM:
18262       text = _("<short enum>");
18263       expected_types = bool_expected;
18264       ++ name;
18265       break;
18266     default:
18267       if (ISPRINT (* name))
18268         {
18269           int len = strnlen (name, pnote->namesz - (name - pnote->namedata)) + 1;
18270
18271           if (len > left && ! do_wide)
18272             len = left;
18273           printf ("%.*s:", len, name);
18274           left -= len;
18275           name += len;
18276         }
18277       else
18278         {
18279           static char tmpbuf [128];
18280
18281           error (_("unrecognised byte in name field: %d\n"), * name);
18282           sprintf (tmpbuf, _("<unknown:_%d>"), * name);
18283           text = tmpbuf;
18284           name ++;
18285         }
18286       expected_types = "*$!+";
18287       break;
18288     }
18289
18290   if (text)
18291     left -= printf ("%s", text);
18292
18293   if (strchr (expected_types, name_type) == NULL)
18294     warn (_("attribute does not have an expected type (%c)\n"), name_type);
18295
18296   if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
18297     {
18298       error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
18299              (unsigned long) pnote->namesz,
18300              (long) (name - pnote->namedata));
18301       return FALSE;
18302     }
18303
18304   if (left < 1 && ! do_wide)
18305     return TRUE;
18306
18307   switch (name_type)
18308     {
18309     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18310       {
18311         unsigned int        bytes;
18312         unsigned long long  val = 0;
18313         unsigned int        shift = 0;
18314         char *              decoded = NULL;
18315
18316         bytes = pnote->namesz - (name - pnote->namedata);
18317         if (bytes > 0)
18318           /* The -1 is because the name field is always 0 terminated, and we
18319              want to be able to ensure that the shift in the while loop below
18320              will not overflow.  */
18321           -- bytes;
18322
18323         if (bytes > sizeof (val))
18324           {
18325             error (_("corrupt numeric name field: too many bytes in the value: %x\n"),
18326                    bytes);
18327             bytes = sizeof (val);
18328           }
18329         /* We do not bother to warn if bytes == 0 as this can
18330            happen with some early versions of the gcc plugin.  */
18331
18332         while (bytes --)
18333           {
18334             unsigned long byte = (* name ++) & 0xff;
18335
18336             val |= byte << shift;
18337             shift += 8;
18338           }
18339
18340         switch (name_attribute)
18341           {
18342           case GNU_BUILD_ATTRIBUTE_PIC:
18343             switch (val)
18344               {
18345               case 0: decoded = "static"; break;
18346               case 1: decoded = "pic"; break;
18347               case 2: decoded = "PIC"; break;
18348               case 3: decoded = "pie"; break;
18349               case 4: decoded = "PIE"; break;
18350               default: break;
18351               }
18352             break;
18353           case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18354             switch (val)
18355               {
18356                 /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c.  */
18357               case 0: decoded = "off"; break;
18358               case 1: decoded = "on"; break;
18359               case 2: decoded = "all"; break;
18360               case 3: decoded = "strong"; break;
18361               case 4: decoded = "explicit"; break;
18362               default: break;
18363               }
18364             break;
18365           default:
18366             break;
18367           }
18368
18369         if (decoded != NULL)
18370           {
18371             print_symbol (-left, decoded);
18372             left = 0;
18373           }
18374         else if (val == 0)
18375           {
18376             printf ("0x0");
18377             left -= 3;
18378           }
18379         else
18380           {
18381             if (do_wide)
18382               left -= printf ("0x%llx", val);
18383             else
18384               left -= printf ("0x%-.*llx", left, val);
18385           }
18386       }
18387       break;
18388     case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
18389       left -= print_symbol (- left, name);
18390       break;
18391     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
18392       left -= print_symbol (- left, "true");
18393       break;
18394     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
18395       left -= print_symbol (- left, "false");
18396       break;
18397     }
18398
18399   if (do_wide && left > 0)
18400     printf ("%-*s", left, " ");
18401     
18402   return TRUE;
18403 }
18404
18405 /* Note that by the ELF standard, the name field is already null byte
18406    terminated, and namesz includes the terminating null byte.
18407    I.E. the value of namesz for the name "FSF" is 4.
18408
18409    If the value of namesz is zero, there is no name present.  */
18410
18411 static bfd_boolean
18412 process_note (Elf_Internal_Note *  pnote,
18413               Filedata *           filedata)
18414 {
18415   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
18416   const char * nt;
18417
18418   if (pnote->namesz == 0)
18419     /* If there is no note name, then use the default set of
18420        note type strings.  */
18421     nt = get_note_type (filedata, pnote->type);
18422
18423   else if (const_strneq (pnote->namedata, "GNU"))
18424     /* GNU-specific object file notes.  */
18425     nt = get_gnu_elf_note_type (pnote->type);
18426
18427   else if (const_strneq (pnote->namedata, "FreeBSD"))
18428     /* FreeBSD-specific core file notes.  */
18429     nt = get_freebsd_elfcore_note_type (filedata, pnote->type);
18430
18431   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
18432     /* NetBSD-specific core file notes.  */
18433     nt = get_netbsd_elfcore_note_type (filedata, pnote->type);
18434
18435   else if (const_strneq (pnote->namedata, "NetBSD"))
18436     /* NetBSD-specific core file notes.  */
18437     return process_netbsd_elf_note (pnote);
18438
18439   else if (strneq (pnote->namedata, "SPU/", 4))
18440     {
18441       /* SPU-specific core file notes.  */
18442       nt = pnote->namedata + 4;
18443       name = "SPU";
18444     }
18445
18446   else if (const_strneq (pnote->namedata, "IPF/VMS"))
18447     /* VMS/ia64-specific file notes.  */
18448     nt = get_ia64_vms_note_type (pnote->type);
18449
18450   else if (const_strneq (pnote->namedata, "stapsdt"))
18451     nt = get_stapsdt_note_type (pnote->type);
18452
18453   else
18454     /* Don't recognize this note name; just use the default set of
18455        note type strings.  */
18456     nt = get_note_type (filedata, pnote->type);
18457
18458   printf ("  ");
18459
18460   if (((const_strneq (pnote->namedata, "GA")
18461         && strchr ("*$!+", pnote->namedata[2]) != NULL)
18462        || strchr ("*$!+", pnote->namedata[0]) != NULL)
18463       && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18464           || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
18465     print_gnu_build_attribute_name (pnote);
18466   else
18467     print_symbol (-20, name);
18468
18469   if (do_wide)
18470     printf (" 0x%08lx\t%s\t", pnote->descsz, nt);
18471   else
18472     printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
18473
18474   if (const_strneq (pnote->namedata, "IPF/VMS"))
18475     return print_ia64_vms_note (pnote);
18476   else if (const_strneq (pnote->namedata, "GNU"))
18477     return print_gnu_note (filedata, pnote);
18478   else if (const_strneq (pnote->namedata, "stapsdt"))
18479     return print_stapsdt_note (pnote);
18480   else if (const_strneq (pnote->namedata, "CORE"))
18481     return print_core_note (pnote);
18482   else if (((const_strneq (pnote->namedata, "GA")
18483              && strchr ("*$!+", pnote->namedata[2]) != NULL)
18484             || strchr ("*$!+", pnote->namedata[0]) != NULL)
18485            && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18486                || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
18487     return print_gnu_build_attribute_description (pnote, filedata);
18488
18489   if (pnote->descsz)
18490     {
18491       unsigned long i;
18492
18493       printf (_("   description data: "));
18494       for (i = 0; i < pnote->descsz; i++)
18495         printf ("%02x ", pnote->descdata[i]);
18496       if (!do_wide)
18497         printf ("\n");
18498     }
18499
18500   if (do_wide)
18501     printf ("\n");
18502
18503   return TRUE;
18504 }
18505
18506 static bfd_boolean
18507 process_notes_at (Filedata *           filedata,
18508                   Elf_Internal_Shdr *  section,
18509                   bfd_vma              offset,
18510                   bfd_vma              length,
18511                   bfd_vma              align)
18512 {
18513   Elf_External_Note * pnotes;
18514   Elf_External_Note * external;
18515   char *              end;
18516   bfd_boolean         res = TRUE;
18517
18518   if (length <= 0)
18519     return FALSE;
18520
18521   if (section)
18522     {
18523       pnotes = (Elf_External_Note *) get_section_contents (section, filedata);
18524       if (pnotes)
18525         {
18526           if (! apply_relocations (filedata, section, (unsigned char *) pnotes, length, NULL, NULL))
18527             return FALSE;
18528         }
18529     }
18530   else
18531     pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18532                                              _("notes"));
18533
18534   if (pnotes == NULL)
18535     return FALSE;
18536
18537   external = pnotes;
18538
18539   if (section)
18540     printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (filedata, section));
18541   else
18542     printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
18543             (unsigned long) offset, (unsigned long) length);
18544
18545   /* NB: Some note sections may have alignment value of 0 or 1.  gABI
18546      specifies that notes should be aligned to 4 bytes in 32-bit
18547      objects and to 8 bytes in 64-bit objects.  As a Linux extension,
18548      we also support 4 byte alignment in 64-bit objects.  If section
18549      alignment is less than 4, we treate alignment as 4 bytes.   */
18550   if (align < 4)
18551     align = 4;
18552   else if (align != 4 && align != 8)
18553     {
18554       warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
18555             (long) align);
18556       return FALSE;
18557     }
18558
18559   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
18560
18561   end = (char *) pnotes + length;
18562   while ((char *) external < end)
18563     {
18564       Elf_Internal_Note inote;
18565       size_t min_notesz;
18566       char * next;
18567       char * temp = NULL;
18568       size_t data_remaining = end - (char *) external;
18569
18570       if (!is_ia64_vms (filedata))
18571         {
18572           /* PR binutils/15191
18573              Make sure that there is enough data to read.  */
18574           min_notesz = offsetof (Elf_External_Note, name);
18575           if (data_remaining < min_notesz)
18576             {
18577               warn (ngettext ("Corrupt note: only %ld byte remains, "
18578                               "not enough for a full note\n",
18579                               "Corrupt note: only %ld bytes remain, "
18580                               "not enough for a full note\n",
18581                               data_remaining),
18582                     (long) data_remaining);
18583               break;
18584             }
18585           data_remaining -= min_notesz;
18586
18587           inote.type     = BYTE_GET (external->type);
18588           inote.namesz   = BYTE_GET (external->namesz);
18589           inote.namedata = external->name;
18590           inote.descsz   = BYTE_GET (external->descsz);
18591           inote.descdata = ((char *) external
18592                             + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
18593           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
18594           next = ((char *) external
18595                   + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
18596         }
18597       else
18598         {
18599           Elf64_External_VMS_Note *vms_external;
18600
18601           /* PR binutils/15191
18602              Make sure that there is enough data to read.  */
18603           min_notesz = offsetof (Elf64_External_VMS_Note, name);
18604           if (data_remaining < min_notesz)
18605             {
18606               warn (ngettext ("Corrupt note: only %ld byte remains, "
18607                               "not enough for a full note\n",
18608                               "Corrupt note: only %ld bytes remain, "
18609                               "not enough for a full note\n",
18610                               data_remaining),
18611                     (long) data_remaining);
18612               break;
18613             }
18614           data_remaining -= min_notesz;
18615
18616           vms_external = (Elf64_External_VMS_Note *) external;
18617           inote.type     = BYTE_GET (vms_external->type);
18618           inote.namesz   = BYTE_GET (vms_external->namesz);
18619           inote.namedata = vms_external->name;
18620           inote.descsz   = BYTE_GET (vms_external->descsz);
18621           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
18622           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
18623           next = inote.descdata + align_power (inote.descsz, 3);
18624         }
18625
18626       /* PR 17531: file: 3443835e.  */
18627       /* PR 17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4.  */
18628       if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
18629           || (size_t) (inote.descdata - inote.namedata) > data_remaining
18630           || (size_t) (next - inote.descdata) < inote.descsz
18631           || ((size_t) (next - inote.descdata)
18632               > data_remaining - (size_t) (inote.descdata - inote.namedata)))
18633         {
18634           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
18635                 (unsigned long) ((char *) external - (char *) pnotes));
18636           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
18637                 inote.type, inote.namesz, inote.descsz, (int) align);
18638           break;
18639         }
18640
18641       external = (Elf_External_Note *) next;
18642
18643       /* Verify that name is null terminated.  It appears that at least
18644          one version of Linux (RedHat 6.0) generates corefiles that don't
18645          comply with the ELF spec by failing to include the null byte in
18646          namesz.  */
18647       if (inote.namedata[inote.namesz - 1] != '\0')
18648         {
18649           if ((size_t) (inote.descdata - inote.namedata) == inote.namesz)
18650             {
18651               temp = (char *) malloc (inote.namesz + 1);
18652               if (temp == NULL)
18653                 {
18654                   error (_("Out of memory allocating space for inote name\n"));
18655                   res = FALSE;
18656                   break;
18657                 }
18658
18659               memcpy (temp, inote.namedata, inote.namesz);
18660               inote.namedata = temp;
18661             }
18662           inote.namedata[inote.namesz] = 0;
18663         }
18664
18665       if (! process_note (& inote, filedata))
18666         res = FALSE;
18667
18668       if (temp != NULL)
18669         {
18670           free (temp);
18671           temp = NULL;
18672         }
18673     }
18674
18675   free (pnotes);
18676
18677   return res;
18678 }
18679
18680 static bfd_boolean
18681 process_corefile_note_segments (Filedata * filedata)
18682 {
18683   Elf_Internal_Phdr * segment;
18684   unsigned int i;
18685   bfd_boolean res = TRUE;
18686
18687   if (! get_program_headers (filedata))
18688     return TRUE;
18689
18690   for (i = 0, segment = filedata->program_headers;
18691        i < filedata->file_header.e_phnum;
18692        i++, segment++)
18693     {
18694       if (segment->p_type == PT_NOTE)
18695         if (! process_notes_at (filedata, NULL,
18696                                 (bfd_vma) segment->p_offset,
18697                                 (bfd_vma) segment->p_filesz,
18698                                 (bfd_vma) segment->p_align))
18699           res = FALSE;
18700     }
18701
18702   return res;
18703 }
18704
18705 static bfd_boolean
18706 process_v850_notes (Filedata * filedata, bfd_vma offset, bfd_vma length)
18707 {
18708   Elf_External_Note * pnotes;
18709   Elf_External_Note * external;
18710   char * end;
18711   bfd_boolean res = TRUE;
18712
18713   if (length <= 0)
18714     return FALSE;
18715
18716   pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18717                                            _("v850 notes"));
18718   if (pnotes == NULL)
18719     return FALSE;
18720
18721   external = pnotes;
18722   end = (char*) pnotes + length;
18723
18724   printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
18725           (unsigned long) offset, (unsigned long) length);
18726
18727   while ((char *) external + sizeof (Elf_External_Note) < end)
18728     {
18729       Elf_External_Note * next;
18730       Elf_Internal_Note inote;
18731
18732       inote.type     = BYTE_GET (external->type);
18733       inote.namesz   = BYTE_GET (external->namesz);
18734       inote.namedata = external->name;
18735       inote.descsz   = BYTE_GET (external->descsz);
18736       inote.descdata = inote.namedata + align_power (inote.namesz, 2);
18737       inote.descpos  = offset + (inote.descdata - (char *) pnotes);
18738
18739       if (inote.descdata < (char *) pnotes || inote.descdata >= end)
18740         {
18741           warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
18742           inote.descdata = inote.namedata;
18743           inote.namesz   = 0;
18744         }
18745
18746       next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
18747
18748       if (   ((char *) next > end)
18749           || ((char *) next <  (char *) pnotes))
18750         {
18751           warn (_("corrupt descsz found in note at offset 0x%lx\n"),
18752                 (unsigned long) ((char *) external - (char *) pnotes));
18753           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
18754                 inote.type, inote.namesz, inote.descsz);
18755           break;
18756         }
18757
18758       external = next;
18759
18760       /* Prevent out-of-bounds indexing.  */
18761       if (   inote.namedata + inote.namesz > end
18762           || inote.namedata + inote.namesz < inote.namedata)
18763         {
18764           warn (_("corrupt namesz found in note at offset 0x%lx\n"),
18765                 (unsigned long) ((char *) external - (char *) pnotes));
18766           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
18767                 inote.type, inote.namesz, inote.descsz);
18768           break;
18769         }
18770
18771       printf ("  %s: ", get_v850_elf_note_type (inote.type));
18772
18773       if (! print_v850_note (& inote))
18774         {
18775           res = FALSE;
18776           printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
18777                   inote.namesz, inote.descsz);
18778         }
18779     }
18780
18781   free (pnotes);
18782
18783   return res;
18784 }
18785
18786 static bfd_boolean
18787 process_note_sections (Filedata * filedata)
18788 {
18789   Elf_Internal_Shdr * section;
18790   unsigned long i;
18791   unsigned int n = 0;
18792   bfd_boolean res = TRUE;
18793
18794   for (i = 0, section = filedata->section_headers;
18795        i < filedata->file_header.e_shnum && section != NULL;
18796        i++, section++)
18797     {
18798       if (section->sh_type == SHT_NOTE)
18799         {
18800           if (! process_notes_at (filedata, section,
18801                                   (bfd_vma) section->sh_offset,
18802                                   (bfd_vma) section->sh_size,
18803                                   (bfd_vma) section->sh_addralign))
18804             res = FALSE;
18805           n++;
18806         }
18807
18808       if ((   filedata->file_header.e_machine == EM_V800
18809            || filedata->file_header.e_machine == EM_V850
18810            || filedata->file_header.e_machine == EM_CYGNUS_V850)
18811           && section->sh_type == SHT_RENESAS_INFO)
18812         {
18813           if (! process_v850_notes (filedata,
18814                                     (bfd_vma) section->sh_offset,
18815                                     (bfd_vma) section->sh_size))
18816             res = FALSE;
18817           n++;
18818         }
18819     }
18820
18821   if (n == 0)
18822     /* Try processing NOTE segments instead.  */
18823     return process_corefile_note_segments (filedata);
18824
18825   return res;
18826 }
18827
18828 static bfd_boolean
18829 process_notes (Filedata * filedata)
18830 {
18831   /* If we have not been asked to display the notes then do nothing.  */
18832   if (! do_notes)
18833     return TRUE;
18834
18835   if (filedata->file_header.e_type != ET_CORE)
18836     return process_note_sections (filedata);
18837
18838   /* No program headers means no NOTE segment.  */
18839   if (filedata->file_header.e_phnum > 0)
18840     return process_corefile_note_segments (filedata);
18841
18842   printf (_("No note segments present in the core file.\n"));
18843   return TRUE;
18844 }
18845
18846 static unsigned char *
18847 display_public_gnu_attributes (unsigned char * start,
18848                                const unsigned char * const end)
18849 {
18850   printf (_("  Unknown GNU attribute: %s\n"), start);
18851
18852   start += strnlen ((char *) start, end - start);
18853   display_raw_attribute (start, end);
18854
18855   return (unsigned char *) end;
18856 }
18857
18858 static unsigned char *
18859 display_generic_attribute (unsigned char * start,
18860                            unsigned int tag,
18861                            const unsigned char * const end)
18862 {
18863   if (tag == 0)
18864     return (unsigned char *) end;
18865
18866   return display_tag_value (tag, start, end);
18867 }
18868
18869 static bfd_boolean
18870 process_arch_specific (Filedata * filedata)
18871 {
18872   if (! do_arch)
18873     return TRUE;
18874
18875   switch (filedata->file_header.e_machine)
18876     {
18877     case EM_ARC:
18878     case EM_ARC_COMPACT:
18879     case EM_ARC_COMPACT2:
18880       return process_attributes (filedata, "ARC", SHT_ARC_ATTRIBUTES,
18881                                  display_arc_attribute,
18882                                  display_generic_attribute);
18883     case EM_ARM:
18884       return process_attributes (filedata, "aeabi", SHT_ARM_ATTRIBUTES,
18885                                  display_arm_attribute,
18886                                  display_generic_attribute);
18887
18888     case EM_MIPS:
18889     case EM_MIPS_RS3_LE:
18890       return process_mips_specific (filedata);
18891
18892     case EM_MSP430:
18893      return process_attributes (filedata, "mspabi", SHT_MSP430_ATTRIBUTES,
18894                                 display_msp430x_attribute,
18895                                 display_generic_attribute);
18896
18897     case EM_NDS32:
18898       return process_nds32_specific (filedata);
18899
18900     case EM_PPC:
18901     case EM_PPC64:
18902       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
18903                                  display_power_gnu_attribute);
18904
18905     case EM_S390:
18906     case EM_S390_OLD:
18907       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
18908                                  display_s390_gnu_attribute);
18909
18910     case EM_SPARC:
18911     case EM_SPARC32PLUS:
18912     case EM_SPARCV9:
18913       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
18914                                  display_sparc_gnu_attribute);
18915
18916     case EM_TI_C6000:
18917       return process_attributes (filedata, "c6xabi", SHT_C6000_ATTRIBUTES,
18918                                  display_tic6x_attribute,
18919                                  display_generic_attribute);
18920
18921     default:
18922       return process_attributes (filedata, "gnu", SHT_GNU_ATTRIBUTES,
18923                                  display_public_gnu_attributes,
18924                                  display_generic_attribute);
18925     }
18926 }
18927
18928 static bfd_boolean
18929 get_file_header (Filedata * filedata)
18930 {
18931   /* Read in the identity array.  */
18932   if (fread (filedata->file_header.e_ident, EI_NIDENT, 1, filedata->handle) != 1)
18933     return FALSE;
18934
18935   /* Determine how to read the rest of the header.  */
18936   switch (filedata->file_header.e_ident[EI_DATA])
18937     {
18938     default:
18939     case ELFDATANONE:
18940     case ELFDATA2LSB:
18941       byte_get = byte_get_little_endian;
18942       byte_put = byte_put_little_endian;
18943       break;
18944     case ELFDATA2MSB:
18945       byte_get = byte_get_big_endian;
18946       byte_put = byte_put_big_endian;
18947       break;
18948     }
18949
18950   /* For now we only support 32 bit and 64 bit ELF files.  */
18951   is_32bit_elf = (filedata->file_header.e_ident[EI_CLASS] != ELFCLASS64);
18952
18953   /* Read in the rest of the header.  */
18954   if (is_32bit_elf)
18955     {
18956       Elf32_External_Ehdr ehdr32;
18957
18958       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, filedata->handle) != 1)
18959         return FALSE;
18960
18961       filedata->file_header.e_type      = BYTE_GET (ehdr32.e_type);
18962       filedata->file_header.e_machine   = BYTE_GET (ehdr32.e_machine);
18963       filedata->file_header.e_version   = BYTE_GET (ehdr32.e_version);
18964       filedata->file_header.e_entry     = BYTE_GET (ehdr32.e_entry);
18965       filedata->file_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
18966       filedata->file_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
18967       filedata->file_header.e_flags     = BYTE_GET (ehdr32.e_flags);
18968       filedata->file_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
18969       filedata->file_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
18970       filedata->file_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
18971       filedata->file_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
18972       filedata->file_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
18973       filedata->file_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
18974     }
18975   else
18976     {
18977       Elf64_External_Ehdr ehdr64;
18978
18979       /* If we have been compiled with sizeof (bfd_vma) == 4, then
18980          we will not be able to cope with the 64bit data found in
18981          64 ELF files.  Detect this now and abort before we start
18982          overwriting things.  */
18983       if (sizeof (bfd_vma) < 8)
18984         {
18985           error (_("This instance of readelf has been built without support for a\n\
18986 64 bit data type and so it cannot read 64 bit ELF files.\n"));
18987           return FALSE;
18988         }
18989
18990       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, filedata->handle) != 1)
18991         return FALSE;
18992
18993       filedata->file_header.e_type      = BYTE_GET (ehdr64.e_type);
18994       filedata->file_header.e_machine   = BYTE_GET (ehdr64.e_machine);
18995       filedata->file_header.e_version   = BYTE_GET (ehdr64.e_version);
18996       filedata->file_header.e_entry     = BYTE_GET (ehdr64.e_entry);
18997       filedata->file_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
18998       filedata->file_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
18999       filedata->file_header.e_flags     = BYTE_GET (ehdr64.e_flags);
19000       filedata->file_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
19001       filedata->file_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
19002       filedata->file_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
19003       filedata->file_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
19004       filedata->file_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
19005       filedata->file_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
19006     }
19007
19008   if (filedata->file_header.e_shoff)
19009     {
19010       /* There may be some extensions in the first section header.  Don't
19011          bomb if we can't read it.  */
19012       if (is_32bit_elf)
19013         get_32bit_section_headers (filedata, TRUE);
19014       else
19015         get_64bit_section_headers (filedata, TRUE);
19016     }
19017
19018   return TRUE;
19019 }
19020
19021 static void
19022 close_file (Filedata * filedata)
19023 {
19024   if (filedata)
19025     {
19026       if (filedata->handle)
19027         fclose (filedata->handle);
19028       free (filedata);
19029     }
19030 }
19031
19032 void
19033 close_debug_file (void * data)
19034 {
19035   close_file ((Filedata *) data);
19036 }
19037
19038 static Filedata *
19039 open_file (const char * pathname)
19040 {
19041   struct stat  statbuf;
19042   Filedata *   filedata = NULL;
19043
19044   if (stat (pathname, & statbuf) < 0
19045       || ! S_ISREG (statbuf.st_mode))
19046     goto fail;
19047
19048   filedata = calloc (1, sizeof * filedata);
19049   if (filedata == NULL)
19050     goto fail;
19051
19052   filedata->handle = fopen (pathname, "rb");
19053   if (filedata->handle == NULL)
19054     goto fail;
19055
19056   filedata->file_size = (bfd_size_type) statbuf.st_size;
19057   filedata->file_name = pathname;
19058
19059   if (! get_file_header (filedata))
19060     goto fail;
19061
19062   if (filedata->file_header.e_shoff)
19063     {
19064       bfd_boolean res;
19065
19066       /* Read the section headers again, this time for real.  */
19067       if (is_32bit_elf)
19068         res = get_32bit_section_headers (filedata, FALSE);
19069       else
19070         res = get_64bit_section_headers (filedata, FALSE);
19071
19072       if (!res)
19073         goto fail;
19074     }
19075
19076   return filedata;
19077
19078  fail:
19079   if (filedata)
19080     {
19081       if (filedata->handle)
19082         fclose (filedata->handle);
19083       free (filedata);
19084     }
19085   return NULL;
19086 }
19087
19088 void *
19089 open_debug_file (const char * pathname)
19090 {
19091   return open_file (pathname);
19092 }
19093
19094 /* Process one ELF object file according to the command line options.
19095    This file may actually be stored in an archive.  The file is
19096    positioned at the start of the ELF object.  Returns TRUE if no
19097    problems were encountered, FALSE otherwise.  */
19098
19099 static bfd_boolean
19100 process_object (Filedata * filedata)
19101 {
19102   Filedata * separates;
19103   unsigned int i;
19104   bfd_boolean res = TRUE;
19105
19106   if (! get_file_header (filedata))
19107     {
19108       error (_("%s: Failed to read file header\n"), filedata->file_name);
19109       return FALSE;
19110     }
19111
19112   /* Initialise per file variables.  */
19113   for (i = ARRAY_SIZE (version_info); i--;)
19114     version_info[i] = 0;
19115
19116   for (i = ARRAY_SIZE (dynamic_info); i--;)
19117     dynamic_info[i] = 0;
19118   dynamic_info_DT_GNU_HASH = 0;
19119
19120   /* Process the file.  */
19121   if (show_name)
19122     printf (_("\nFile: %s\n"), filedata->file_name);
19123
19124   /* Initialise the dump_sects array from the cmdline_dump_sects array.
19125      Note we do this even if cmdline_dump_sects is empty because we
19126      must make sure that the dump_sets array is zeroed out before each
19127      object file is processed.  */
19128   if (filedata->num_dump_sects > cmdline.num_dump_sects)
19129     memset (filedata->dump_sects, 0, filedata->num_dump_sects * sizeof (* filedata->dump_sects));
19130
19131   if (cmdline.num_dump_sects > 0)
19132     {
19133       if (filedata->num_dump_sects == 0)
19134         /* A sneaky way of allocating the dump_sects array.  */
19135         request_dump_bynumber (filedata, cmdline.num_dump_sects, 0);
19136
19137       assert (filedata->num_dump_sects >= cmdline.num_dump_sects);
19138       memcpy (filedata->dump_sects, cmdline.dump_sects,
19139               cmdline.num_dump_sects * sizeof (* filedata->dump_sects));
19140     }
19141
19142   if (! process_file_header (filedata))
19143     return FALSE;
19144
19145   if (! process_section_headers (filedata))
19146     {
19147       /* Without loaded section headers we cannot process lots of things.  */
19148       do_unwind = do_version = do_dump = do_arch = FALSE;
19149
19150       if (! do_using_dynamic)
19151         do_syms = do_dyn_syms = do_reloc = FALSE;
19152     }
19153
19154   if (! process_section_groups (filedata))
19155     /* Without loaded section groups we cannot process unwind.  */
19156     do_unwind = FALSE;
19157
19158   if (process_program_headers (filedata))
19159     process_dynamic_section (filedata);
19160   else
19161     res = FALSE;
19162
19163   if (! process_relocs (filedata))
19164     res = FALSE;
19165
19166   if (! process_unwind (filedata))
19167     res = FALSE;
19168
19169   if (! process_symbol_table (filedata))
19170     res = FALSE;
19171
19172   if (! process_syminfo (filedata))
19173     res = FALSE;
19174
19175   if (! process_version_sections (filedata))
19176     res = FALSE;
19177
19178   if (filedata->file_header.e_shstrndx != SHN_UNDEF)
19179     separates = load_separate_debug_file (filedata, filedata->file_name);
19180   else
19181     separates = NULL;
19182
19183   if (! process_section_contents (filedata))
19184     res = FALSE;
19185
19186   if (separates)
19187     {
19188       if (! process_section_headers (separates))
19189         res = FALSE;
19190       else if (! process_section_contents (separates))
19191         res = FALSE;
19192     }
19193
19194   if (! process_notes (filedata))
19195     res = FALSE;
19196
19197   if (! process_gnu_liblist (filedata))
19198     res = FALSE;
19199
19200   if (! process_arch_specific (filedata))
19201     res = FALSE;
19202
19203   free (filedata->program_headers);
19204   filedata->program_headers = NULL;
19205
19206   free (filedata->section_headers);
19207   filedata->section_headers = NULL;
19208
19209   free (filedata->string_table);
19210   filedata->string_table = NULL;
19211   filedata->string_table_length = 0;
19212
19213   if (dynamic_strings)
19214     {
19215       free (dynamic_strings);
19216       dynamic_strings = NULL;
19217       dynamic_strings_length = 0;
19218     }
19219
19220   if (dynamic_symbols)
19221     {
19222       free (dynamic_symbols);
19223       dynamic_symbols = NULL;
19224       num_dynamic_syms = 0;
19225     }
19226
19227   if (dynamic_syminfo)
19228     {
19229       free (dynamic_syminfo);
19230       dynamic_syminfo = NULL;
19231     }
19232
19233   if (dynamic_section)
19234     {
19235       free (dynamic_section);
19236       dynamic_section = NULL;
19237     }
19238
19239   if (section_headers_groups)
19240     {
19241       free (section_headers_groups);
19242       section_headers_groups = NULL;
19243     }
19244
19245   if (section_groups)
19246     {
19247       struct group_list * g;
19248       struct group_list * next;
19249
19250       for (i = 0; i < group_count; i++)
19251         {
19252           for (g = section_groups [i].root; g != NULL; g = next)
19253             {
19254               next = g->next;
19255               free (g);
19256             }
19257         }
19258
19259       free (section_groups);
19260       section_groups = NULL;
19261     }
19262
19263   free_debug_memory ();
19264
19265   return res;
19266 }
19267
19268 /* Process an ELF archive.
19269    On entry the file is positioned just after the ARMAG string.
19270    Returns TRUE upon success, FALSE otherwise.  */
19271
19272 static bfd_boolean
19273 process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
19274 {
19275   struct archive_info arch;
19276   struct archive_info nested_arch;
19277   size_t got;
19278   bfd_boolean ret = TRUE;
19279
19280   show_name = TRUE;
19281
19282   /* The ARCH structure is used to hold information about this archive.  */
19283   arch.file_name = NULL;
19284   arch.file = NULL;
19285   arch.index_array = NULL;
19286   arch.sym_table = NULL;
19287   arch.longnames = NULL;
19288
19289   /* The NESTED_ARCH structure is used as a single-item cache of information
19290      about a nested archive (when members of a thin archive reside within
19291      another regular archive file).  */
19292   nested_arch.file_name = NULL;
19293   nested_arch.file = NULL;
19294   nested_arch.index_array = NULL;
19295   nested_arch.sym_table = NULL;
19296   nested_arch.longnames = NULL;
19297
19298   if (setup_archive (&arch, filedata->file_name, filedata->handle,
19299                      is_thin_archive, do_archive_index) != 0)
19300     {
19301       ret = FALSE;
19302       goto out;
19303     }
19304
19305   if (do_archive_index)
19306     {
19307       if (arch.sym_table == NULL)
19308         error (_("%s: unable to dump the index as none was found\n"), filedata->file_name);
19309       else
19310         {
19311           unsigned long i, l;
19312           unsigned long current_pos;
19313
19314           printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
19315                   filedata->file_name, (unsigned long) arch.index_num, arch.sym_size);
19316
19317           current_pos = ftell (filedata->handle);
19318
19319           for (i = l = 0; i < arch.index_num; i++)
19320             {
19321               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
19322                 {
19323                   char * member_name;
19324
19325                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
19326
19327                   if (member_name != NULL)
19328                     {
19329                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
19330
19331                       if (qualified_name != NULL)
19332                         {
19333                           printf (_("Contents of binary %s at offset "), qualified_name);
19334                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
19335                           putchar ('\n');
19336                           free (qualified_name);
19337                         }
19338                     }
19339                 }
19340
19341               if (l >= arch.sym_size)
19342                 {
19343                   error (_("%s: end of the symbol table reached before the end of the index\n"),
19344                          filedata->file_name);
19345                   ret = FALSE;
19346                   break;
19347                 }
19348               /* PR 17531: file: 0b6630b2.  */
19349               printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
19350               l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
19351             }
19352
19353           if (arch.uses_64bit_indices)
19354             l = (l + 7) & ~ 7;
19355           else
19356             l += l & 1;
19357
19358           if (l < arch.sym_size)
19359             {
19360               error (ngettext ("%s: %ld byte remains in the symbol table, "
19361                                "but without corresponding entries in "
19362                                "the index table\n",
19363                                "%s: %ld bytes remain in the symbol table, "
19364                                "but without corresponding entries in "
19365                                "the index table\n",
19366                                arch.sym_size - l),
19367                      filedata->file_name, arch.sym_size - l);
19368               ret = FALSE;
19369             }
19370
19371           if (fseek (filedata->handle, current_pos, SEEK_SET) != 0)
19372             {
19373               error (_("%s: failed to seek back to start of object files in the archive\n"),
19374                      filedata->file_name);
19375               ret = FALSE;
19376               goto out;
19377             }
19378         }
19379
19380       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
19381           && !do_segments && !do_header && !do_dump && !do_version
19382           && !do_histogram && !do_debugging && !do_arch && !do_notes
19383           && !do_section_groups && !do_dyn_syms)
19384         {
19385           ret = TRUE; /* Archive index only.  */
19386           goto out;
19387         }
19388     }
19389
19390   while (1)
19391     {
19392       char * name;
19393       size_t namelen;
19394       char * qualified_name;
19395
19396       /* Read the next archive header.  */
19397       if (fseek (filedata->handle, arch.next_arhdr_offset, SEEK_SET) != 0)
19398         {
19399           error (_("%s: failed to seek to next archive header\n"), filedata->file_name);
19400           return FALSE;
19401         }
19402       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, filedata->handle);
19403       if (got != sizeof arch.arhdr)
19404         {
19405           if (got == 0)
19406             break;
19407           error (_("%s: failed to read archive header\n"), filedata->file_name);
19408           ret = FALSE;
19409           break;
19410         }
19411       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
19412         {
19413           error (_("%s: did not find a valid archive header\n"), arch.file_name);
19414           ret = FALSE;
19415           break;
19416         }
19417
19418       arch.next_arhdr_offset += sizeof arch.arhdr;
19419
19420       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
19421       if (archive_file_size & 01)
19422         ++archive_file_size;
19423
19424       name = get_archive_member_name (&arch, &nested_arch);
19425       if (name == NULL)
19426         {
19427           error (_("%s: bad archive file name\n"), filedata->file_name);
19428           ret = FALSE;
19429           break;
19430         }
19431       namelen = strlen (name);
19432
19433       qualified_name = make_qualified_name (&arch, &nested_arch, name);
19434       if (qualified_name == NULL)
19435         {
19436           error (_("%s: bad archive file name\n"), filedata->file_name);
19437           ret = FALSE;
19438           break;
19439         }
19440
19441       if (is_thin_archive && arch.nested_member_origin == 0)
19442         {
19443           /* This is a proxy for an external member of a thin archive.  */
19444           Filedata * member_filedata;
19445           char * member_file_name = adjust_relative_path
19446             (filedata->file_name, name, namelen);
19447
19448           if (member_file_name == NULL)
19449             {
19450               ret = FALSE;
19451               break;
19452             }
19453
19454           member_filedata = open_file (member_file_name);
19455           if (member_filedata == NULL)
19456             {
19457               error (_("Input file '%s' is not readable.\n"), member_file_name);
19458               free (member_file_name);
19459               ret = FALSE;
19460               break;
19461             }
19462
19463           archive_file_offset = arch.nested_member_origin;
19464           member_filedata->file_name = qualified_name;
19465
19466           if (! process_object (member_filedata))
19467             ret = FALSE;
19468
19469           close_file (member_filedata);
19470           free (member_file_name);
19471         }
19472       else if (is_thin_archive)
19473         {
19474           Filedata thin_filedata;
19475
19476           memset (&thin_filedata, 0, sizeof (thin_filedata));
19477
19478           /* PR 15140: Allow for corrupt thin archives.  */
19479           if (nested_arch.file == NULL)
19480             {
19481               error (_("%s: contains corrupt thin archive: %s\n"),
19482                      filedata->file_name, name);
19483               ret = FALSE;
19484               break;
19485             }
19486
19487           /* This is a proxy for a member of a nested archive.  */
19488           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
19489
19490           /* The nested archive file will have been opened and setup by
19491              get_archive_member_name.  */
19492           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
19493             {
19494               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
19495               ret = FALSE;
19496               break;
19497             }
19498
19499           thin_filedata.handle = nested_arch.file;
19500           thin_filedata.file_name = qualified_name;
19501           
19502           if (! process_object (& thin_filedata))
19503             ret = FALSE;
19504         }
19505       else
19506         {
19507           archive_file_offset = arch.next_arhdr_offset;
19508           arch.next_arhdr_offset += archive_file_size;
19509
19510           filedata->file_name = qualified_name;
19511           if (! process_object (filedata))
19512             ret = FALSE;
19513         }
19514
19515       if (filedata->dump_sects != NULL)
19516         {
19517           free (filedata->dump_sects);
19518           filedata->dump_sects = NULL;
19519           filedata->num_dump_sects = 0;
19520         }
19521
19522       free (qualified_name);
19523     }
19524
19525  out:
19526   if (nested_arch.file != NULL)
19527     fclose (nested_arch.file);
19528   release_archive (&nested_arch);
19529   release_archive (&arch);
19530
19531   return ret;
19532 }
19533
19534 static bfd_boolean
19535 process_file (char * file_name)
19536 {
19537   Filedata * filedata = NULL;
19538   struct stat statbuf;
19539   char armag[SARMAG];
19540   bfd_boolean ret = TRUE;
19541
19542   if (stat (file_name, &statbuf) < 0)
19543     {
19544       if (errno == ENOENT)
19545         error (_("'%s': No such file\n"), file_name);
19546       else
19547         error (_("Could not locate '%s'.  System error message: %s\n"),
19548                file_name, strerror (errno));
19549       return FALSE;
19550     }
19551
19552   if (! S_ISREG (statbuf.st_mode))
19553     {
19554       error (_("'%s' is not an ordinary file\n"), file_name);
19555       return FALSE;
19556     }
19557
19558   filedata = calloc (1, sizeof * filedata);
19559   if (filedata == NULL)
19560     {
19561       error (_("Out of memory allocating file data structure\n"));
19562       return FALSE;
19563     }
19564
19565   filedata->file_name = file_name;
19566   filedata->handle = fopen (file_name, "rb");
19567   if (filedata->handle == NULL)
19568     {
19569       error (_("Input file '%s' is not readable.\n"), file_name);
19570       free (filedata);
19571       return FALSE;
19572     }
19573
19574   if (fread (armag, SARMAG, 1, filedata->handle) != 1)
19575     {
19576       error (_("%s: Failed to read file's magic number\n"), file_name);
19577       fclose (filedata->handle);
19578       free (filedata);
19579       return FALSE;
19580     }
19581
19582   filedata->file_size = (bfd_size_type) statbuf.st_size;
19583
19584   if (memcmp (armag, ARMAG, SARMAG) == 0)
19585     {
19586       if (! process_archive (filedata, FALSE))
19587         ret = FALSE;
19588     }
19589   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
19590     {
19591       if ( ! process_archive (filedata, TRUE))
19592         ret = FALSE;
19593     }
19594   else
19595     {
19596       if (do_archive_index)
19597         error (_("File %s is not an archive so its index cannot be displayed.\n"),
19598                file_name);
19599
19600       rewind (filedata->handle);
19601       archive_file_size = archive_file_offset = 0;
19602
19603       if (! process_object (filedata))
19604         ret = FALSE;
19605     }
19606
19607   fclose (filedata->handle);
19608   free (filedata);
19609
19610   return ret;
19611 }
19612
19613 #ifdef SUPPORT_DISASSEMBLY
19614 /* Needed by the i386 disassembler.  For extra credit, someone could
19615    fix this so that we insert symbolic addresses here, esp for GOT/PLT
19616    symbols.  */
19617
19618 void
19619 print_address (unsigned int addr, FILE * outfile)
19620 {
19621   fprintf (outfile,"0x%8.8x", addr);
19622 }
19623
19624 /* Needed by the i386 disassembler.  */
19625
19626 void
19627 db_task_printsym (unsigned int addr)
19628 {
19629   print_address (addr, stderr);
19630 }
19631 #endif
19632
19633 int
19634 main (int argc, char ** argv)
19635 {
19636   int err;
19637
19638 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
19639   setlocale (LC_MESSAGES, "");
19640 #endif
19641 #if defined (HAVE_SETLOCALE)
19642   setlocale (LC_CTYPE, "");
19643 #endif
19644   bindtextdomain (PACKAGE, LOCALEDIR);
19645   textdomain (PACKAGE);
19646
19647   expandargv (&argc, &argv);
19648
19649   cmdline.file_name = "<cmdline>";
19650   parse_args (& cmdline, argc, argv);
19651
19652   if (optind < (argc - 1))
19653     show_name = TRUE;
19654   else if (optind >= argc)
19655     {
19656       warn (_("Nothing to do.\n"));
19657       usage (stderr);
19658     }
19659
19660   err = FALSE;
19661   while (optind < argc)
19662     if (! process_file (argv[optind++]))
19663       err = TRUE;
19664
19665   if (cmdline.dump_sects != NULL)
19666     free (cmdline.dump_sects);
19667
19668   return err ? EXIT_FAILURE : EXIT_SUCCESS;
19669 }