Automatic date update in version.in
[external/binutils.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2    Copyright (C) 1998-2019 Free Software Foundation, Inc.
3
4    Originally developed by Eric Youngdale <eric@andante.jic.com>
5    Modifications by Nick Clifton <nickc@redhat.com>
6
7    This file is part of GNU Binutils.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22    02110-1301, USA.  */
23 \f
24 /* The difference between readelf and objdump:
25
26   Both programs are capable of displaying the contents of ELF format files,
27   so why does the binutils project have two file dumpers ?
28
29   The reason is that objdump sees an ELF file through a BFD filter of the
30   world; if BFD has a bug where, say, it disagrees about a machine constant
31   in e_flags, then the odds are good that it will remain internally
32   consistent.  The linker sees it the BFD way, objdump sees it the BFD way,
33   GAS sees it the BFD way.  There was need for a tool to go find out what
34   the file actually says.
35
36   This is why the readelf program does not link against the BFD library - it
37   exists as an independent program to help verify the correct working of BFD.
38
39   There is also the case that readelf can provide more information about an
40   ELF file than is provided by objdump.  In particular it can display DWARF
41   debugging information which (at the moment) objdump cannot.  */
42 \f
43 #include "sysdep.h"
44 #include <assert.h>
45 #include <time.h>
46 #include <zlib.h>
47 #ifdef HAVE_WCHAR_H
48 #include <wchar.h>
49 #endif
50
51 #if __GNUC__ >= 2
52 /* Define BFD64 here, even if our default architecture is 32 bit ELF
53    as this will allow us to read in and parse 64bit and 32bit ELF files.
54    Only do this if we believe that the compiler can support a 64 bit
55    data type.  For now we only rely on GCC being able to do this.  */
56 #define BFD64
57 #endif
58
59 #include "bfd.h"
60 #include "bucomm.h"
61 #include "elfcomm.h"
62 #include "dwarf.h"
63
64 #include "elf/common.h"
65 #include "elf/external.h"
66 #include "elf/internal.h"
67
68
69 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
70    we can obtain the H8 reloc numbers.  We need these for the
71    get_reloc_size() function.  We include h8.h again after defining
72    RELOC_MACROS_GEN_FUNC so that we get the naming function as well.  */
73
74 #include "elf/h8.h"
75 #undef _ELF_H8_H
76
77 /* Undo the effects of #including reloc-macros.h.  */
78
79 #undef START_RELOC_NUMBERS
80 #undef RELOC_NUMBER
81 #undef FAKE_RELOC
82 #undef EMPTY_RELOC
83 #undef END_RELOC_NUMBERS
84 #undef _RELOC_MACROS_H
85
86 /* The following headers use the elf/reloc-macros.h file to
87    automatically generate relocation recognition functions
88    such as elf_mips_reloc_type()  */
89
90 #define RELOC_MACROS_GEN_FUNC
91
92 #include "elf/aarch64.h"
93 #include "elf/alpha.h"
94 #include "elf/arc.h"
95 #include "elf/arm.h"
96 #include "elf/avr.h"
97 #include "elf/bfin.h"
98 #include "elf/cr16.h"
99 #include "elf/cris.h"
100 #include "elf/crx.h"
101 #include "elf/csky.h"
102 #include "elf/d10v.h"
103 #include "elf/d30v.h"
104 #include "elf/dlx.h"
105 #include "elf/epiphany.h"
106 #include "elf/fr30.h"
107 #include "elf/frv.h"
108 #include "elf/ft32.h"
109 #include "elf/h8.h"
110 #include "elf/hppa.h"
111 #include "elf/i386.h"
112 #include "elf/i370.h"
113 #include "elf/i860.h"
114 #include "elf/i960.h"
115 #include "elf/ia64.h"
116 #include "elf/ip2k.h"
117 #include "elf/lm32.h"
118 #include "elf/iq2000.h"
119 #include "elf/m32c.h"
120 #include "elf/m32r.h"
121 #include "elf/m68k.h"
122 #include "elf/m68hc11.h"
123 #include "elf/s12z.h"
124 #include "elf/mcore.h"
125 #include "elf/mep.h"
126 #include "elf/metag.h"
127 #include "elf/microblaze.h"
128 #include "elf/mips.h"
129 #include "elf/mmix.h"
130 #include "elf/mn10200.h"
131 #include "elf/mn10300.h"
132 #include "elf/moxie.h"
133 #include "elf/mt.h"
134 #include "elf/msp430.h"
135 #include "elf/nds32.h"
136 #include "elf/nfp.h"
137 #include "elf/nios2.h"
138 #include "elf/or1k.h"
139 #include "elf/pj.h"
140 #include "elf/ppc.h"
141 #include "elf/ppc64.h"
142 #include "elf/pru.h"
143 #include "elf/riscv.h"
144 #include "elf/rl78.h"
145 #include "elf/rx.h"
146 #include "elf/s390.h"
147 #include "elf/score.h"
148 #include "elf/sh.h"
149 #include "elf/sparc.h"
150 #include "elf/spu.h"
151 #include "elf/tic6x.h"
152 #include "elf/tilegx.h"
153 #include "elf/tilepro.h"
154 #include "elf/v850.h"
155 #include "elf/vax.h"
156 #include "elf/visium.h"
157 #include "elf/wasm32.h"
158 #include "elf/x86-64.h"
159 #include "elf/xc16x.h"
160 #include "elf/xgate.h"
161 #include "elf/xstormy16.h"
162 #include "elf/xtensa.h"
163
164 #include "getopt.h"
165 #include "libiberty.h"
166 #include "safe-ctype.h"
167 #include "filenames.h"
168
169 #ifndef offsetof
170 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
171 #endif
172
173 typedef struct elf_section_list
174 {
175   Elf_Internal_Shdr *        hdr;
176   struct elf_section_list *  next;
177 } elf_section_list;
178
179 /* Flag bits indicating particular types of dump.  */
180 #define HEX_DUMP        (1 << 0)        /* The -x command line switch.  */
181 #define DISASS_DUMP     (1 << 1)        /* The -i command line switch.  */
182 #define DEBUG_DUMP      (1 << 2)        /* The -w command line switch.  */
183 #define STRING_DUMP     (1 << 3)        /* The -p command line switch.  */
184 #define RELOC_DUMP      (1 << 4)        /* The -R command line switch.  */
185
186 typedef unsigned char dump_type;
187
188 /* A linked list of the section names for which dumps were requested.  */
189 struct dump_list_entry
190 {
191   char *                    name;
192   dump_type                 type;
193   struct dump_list_entry *  next;
194 };
195
196 typedef struct filedata
197 {
198   const char *         file_name;
199   FILE *               handle;
200   bfd_size_type        file_size;
201   Elf_Internal_Ehdr    file_header;
202   Elf_Internal_Shdr *  section_headers;
203   Elf_Internal_Phdr *  program_headers;
204   char *               string_table;
205   unsigned long        string_table_length;
206   /* A dynamic array of flags indicating for which sections a dump of
207      some kind has been requested.  It is reset on a per-object file
208      basis and then initialised from the cmdline_dump_sects array,
209      the results of interpreting the -w switch, and the
210      dump_sects_byname list.  */
211   dump_type *          dump_sects;
212   unsigned int         num_dump_sects;
213 } Filedata;
214
215 char * program_name = "readelf";
216
217 static unsigned long archive_file_offset;
218 static unsigned long archive_file_size;
219 static unsigned long dynamic_addr;
220 static bfd_size_type dynamic_size;
221 static size_t dynamic_nent;
222 static char * dynamic_strings;
223 static unsigned long dynamic_strings_length;
224 static unsigned long num_dynamic_syms;
225 static Elf_Internal_Sym * dynamic_symbols;
226 static Elf_Internal_Syminfo * dynamic_syminfo;
227 static unsigned long dynamic_syminfo_offset;
228 static unsigned int dynamic_syminfo_nent;
229 static char program_interpreter[PATH_MAX];
230 static bfd_vma dynamic_info[DT_ENCODING];
231 static bfd_vma dynamic_info_DT_GNU_HASH;
232 static bfd_vma version_info[16];
233 static Elf_Internal_Dyn *  dynamic_section;
234 static elf_section_list * symtab_shndx_list;
235 static bfd_boolean show_name = FALSE;
236 static bfd_boolean do_dynamic = FALSE;
237 static bfd_boolean do_syms = FALSE;
238 static bfd_boolean do_dyn_syms = FALSE;
239 static bfd_boolean do_reloc = FALSE;
240 static bfd_boolean do_sections = FALSE;
241 static bfd_boolean do_section_groups = FALSE;
242 static bfd_boolean do_section_details = FALSE;
243 static bfd_boolean do_segments = FALSE;
244 static bfd_boolean do_unwind = FALSE;
245 static bfd_boolean do_using_dynamic = FALSE;
246 static bfd_boolean do_header = FALSE;
247 static bfd_boolean do_dump = FALSE;
248 static bfd_boolean do_version = FALSE;
249 static bfd_boolean do_histogram = FALSE;
250 static bfd_boolean do_debugging = FALSE;
251 static bfd_boolean do_arch = FALSE;
252 static bfd_boolean do_notes = FALSE;
253 static bfd_boolean do_archive_index = FALSE;
254 static bfd_boolean is_32bit_elf = FALSE;
255 static bfd_boolean decompress_dumps = FALSE;
256
257 struct group_list
258 {
259   struct group_list *  next;
260   unsigned int         section_index;
261 };
262
263 struct group
264 {
265   struct group_list *  root;
266   unsigned int         group_index;
267 };
268
269 static size_t           group_count;
270 static struct group *   section_groups;
271 static struct group **  section_headers_groups;
272
273 /* A dynamic array of flags indicating for which sections a dump
274    has been requested via command line switches.  */
275 static Filedata         cmdline;
276
277 static struct dump_list_entry * dump_sects_byname;
278
279 /* How to print a vma value.  */
280 typedef enum print_mode
281 {
282   HEX,
283   DEC,
284   DEC_5,
285   UNSIGNED,
286   PREFIX_HEX,
287   FULL_HEX,
288   LONG_HEX
289 }
290 print_mode;
291
292 /* Versioned symbol info.  */
293 enum versioned_symbol_info
294 {
295   symbol_undefined,
296   symbol_hidden,
297   symbol_public
298 };
299
300 static const char * get_symbol_version_string
301   (Filedata *, bfd_boolean, const char *, unsigned long, unsigned,
302    Elf_Internal_Sym *, enum versioned_symbol_info *, unsigned short *);
303
304 #define UNKNOWN -1
305
306 #define SECTION_NAME(X)                                         \
307   ((X) == NULL ? _("<none>")                                    \
308    : filedata->string_table == NULL ? _("<no-strings>")         \
309    : ((X)->sh_name >= filedata->string_table_length ? _("<corrupt>")    \
310   : filedata->string_table + (X)->sh_name))
311
312 #define DT_VERSIONTAGIDX(tag)   (DT_VERNEEDNUM - (tag)) /* Reverse order!  */
313
314 #define GET_ELF_SYMBOLS(file, section, sym_count)                       \
315   (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count)      \
316    : get_64bit_elf_symbols (file, section, sym_count))
317
318 #define VALID_DYNAMIC_NAME(offset)      ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
319 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
320    already been called and verified that the string exists.  */
321 #define GET_DYNAMIC_NAME(offset)        (dynamic_strings + offset)
322
323 #define REMOVE_ARCH_BITS(ADDR)                  \
324   do                                            \
325     {                                           \
326       if (filedata->file_header.e_machine == EM_ARM)    \
327         (ADDR) &= ~1;                           \
328     }                                           \
329   while (0)
330 \f
331 /* Print a BFD_VMA to an internal buffer, for use in error messages.
332    BFD_FMA_FMT can't be used in translated strings.  */
333
334 static const char *
335 bfd_vmatoa (char *fmtch, bfd_vma value)
336 {
337   /* bfd_vmatoa is used more then once in a printf call for output.
338      Cycle through an array of buffers.  */
339   static int buf_pos = 0;
340   static struct bfd_vmatoa_buf
341   {
342     char place[64];
343   } buf[4];
344   char *ret;
345   char fmt[32];
346
347   ret = buf[buf_pos++].place;
348   buf_pos %= ARRAY_SIZE (buf);
349
350   sprintf (fmt, "%%%s%s", BFD_VMA_FMT, fmtch);
351   snprintf (ret, sizeof (buf[0].place), fmt, value);
352   return ret;
353 }
354
355 /* Retrieve NMEMB structures, each SIZE bytes long from FILEDATA starting at
356    OFFSET + the offset of the current archive member, if we are examining an
357    archive.  Put the retrieved data into VAR, if it is not NULL.  Otherwise
358    allocate a buffer using malloc and fill that.  In either case return the
359    pointer to the start of the retrieved data or NULL if something went wrong.
360    If something does go wrong and REASON is not NULL then emit an error
361    message using REASON as part of the context.  */
362
363 static void *
364 get_data (void *         var,
365           Filedata *     filedata,
366           unsigned long  offset,
367           bfd_size_type  size,
368           bfd_size_type  nmemb,
369           const char *   reason)
370 {
371   void * mvar;
372   bfd_size_type amt = size * nmemb;
373
374   if (size == 0 || nmemb == 0)
375     return NULL;
376
377   /* If the size_t type is smaller than the bfd_size_type, eg because
378      you are building a 32-bit tool on a 64-bit host, then make sure
379      that when the sizes are cast to (size_t) no information is lost.  */
380   if (sizeof (size_t) < sizeof (bfd_size_type)
381       && (   (bfd_size_type) ((size_t) size) != size
382           || (bfd_size_type) ((size_t) nmemb) != nmemb))
383     {
384       if (reason)
385         error (_("Size truncation prevents reading %s"
386                  " elements of size %s for %s\n"),
387                bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
388       return NULL;
389     }
390
391   /* Check for size overflow.  */
392   if (amt < nmemb)
393     {
394       if (reason)
395         error (_("Size overflow prevents reading %s"
396                  " elements of size %s for %s\n"),
397                bfd_vmatoa ("u", nmemb), bfd_vmatoa ("u", size), reason);
398       return NULL;
399     }
400
401   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
402      attempting to allocate memory when the read is bound to fail.  */
403   if (amt > filedata->file_size
404       || offset + archive_file_offset + amt > filedata->file_size)
405     {
406       if (reason)
407         error (_("Reading %s bytes extends past end of file for %s\n"),
408                bfd_vmatoa ("u", amt), reason);
409       return NULL;
410     }
411
412   if (fseek (filedata->handle, archive_file_offset + offset, SEEK_SET))
413     {
414       if (reason)
415         error (_("Unable to seek to 0x%lx for %s\n"),
416                archive_file_offset + offset, reason);
417       return NULL;
418     }
419
420   mvar = var;
421   if (mvar == NULL)
422     {
423       /* Check for overflow.  */
424       if (nmemb < (~(bfd_size_type) 0 - 1) / size)
425         /* + 1 so that we can '\0' terminate invalid string table sections.  */
426         mvar = malloc ((size_t) amt + 1);
427
428       if (mvar == NULL)
429         {
430           if (reason)
431             error (_("Out of memory allocating %s bytes for %s\n"),
432                    bfd_vmatoa ("u", amt), reason);
433           return NULL;
434         }
435
436       ((char *) mvar)[amt] = '\0';
437     }
438
439   if (fread (mvar, (size_t) size, (size_t) nmemb, filedata->handle) != nmemb)
440     {
441       if (reason)
442         error (_("Unable to read in %s bytes of %s\n"),
443                bfd_vmatoa ("u", amt), reason);
444       if (mvar != var)
445         free (mvar);
446       return NULL;
447     }
448
449   return mvar;
450 }
451
452 /* Print a VMA value in the MODE specified.
453    Returns the number of characters displayed.  */
454
455 static unsigned int
456 print_vma (bfd_vma vma, print_mode mode)
457 {
458   unsigned int nc = 0;
459
460   switch (mode)
461     {
462     case FULL_HEX:
463       nc = printf ("0x");
464       /* Fall through.  */
465     case LONG_HEX:
466 #ifdef BFD64
467       if (is_32bit_elf)
468         return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
469 #endif
470       printf_vma (vma);
471       return nc + 16;
472
473     case DEC_5:
474       if (vma <= 99999)
475         return printf ("%5" BFD_VMA_FMT "d", vma);
476       /* Fall through.  */
477     case PREFIX_HEX:
478       nc = printf ("0x");
479       /* Fall through.  */
480     case HEX:
481       return nc + printf ("%" BFD_VMA_FMT "x", vma);
482
483     case DEC:
484       return printf ("%" BFD_VMA_FMT "d", vma);
485
486     case UNSIGNED:
487       return printf ("%" BFD_VMA_FMT "u", vma);
488
489     default:
490       /* FIXME: Report unrecognised mode ?  */
491       return 0;
492     }
493 }
494
495 /* Display a symbol on stdout.  Handles the display of control characters and
496    multibye characters (assuming the host environment supports them).
497
498    Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
499
500    If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
501    padding as necessary.
502
503    Returns the number of emitted characters.  */
504
505 static unsigned int
506 print_symbol (signed int width, const char *symbol)
507 {
508   bfd_boolean extra_padding = FALSE;
509   signed int num_printed = 0;
510 #ifdef HAVE_MBSTATE_T
511   mbstate_t state;
512 #endif
513   unsigned int width_remaining;
514
515   if (width < 0)
516     {
517       /* Keep the width positive.  This helps the code below.  */
518       width = - width;
519       extra_padding = TRUE;
520     }
521   else if (width == 0)
522     return 0;
523
524   if (do_wide)
525     /* Set the remaining width to a very large value.
526        This simplifies the code below.  */
527     width_remaining = INT_MAX;
528   else
529     width_remaining = width;
530
531 #ifdef HAVE_MBSTATE_T
532   /* Initialise the multibyte conversion state.  */
533   memset (& state, 0, sizeof (state));
534 #endif
535
536   while (width_remaining)
537     {
538       size_t  n;
539       const char c = *symbol++;
540
541       if (c == 0)
542         break;
543
544       /* Do not print control characters directly as they can affect terminal
545          settings.  Such characters usually appear in the names generated
546          by the assembler for local labels.  */
547       if (ISCNTRL (c))
548         {
549           if (width_remaining < 2)
550             break;
551
552           printf ("^%c", c + 0x40);
553           width_remaining -= 2;
554           num_printed += 2;
555         }
556       else if (ISPRINT (c))
557         {
558           putchar (c);
559           width_remaining --;
560           num_printed ++;
561         }
562       else
563         {
564 #ifdef HAVE_MBSTATE_T
565           wchar_t w;
566 #endif
567           /* Let printf do the hard work of displaying multibyte characters.  */
568           printf ("%.1s", symbol - 1);
569           width_remaining --;
570           num_printed ++;
571
572 #ifdef HAVE_MBSTATE_T
573           /* Try to find out how many bytes made up the character that was
574              just printed.  Advance the symbol pointer past the bytes that
575              were displayed.  */
576           n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
577 #else
578           n = 1;
579 #endif
580           if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
581             symbol += (n - 1);
582         }
583     }
584
585   if (extra_padding && num_printed < width)
586     {
587       /* Fill in the remaining spaces.  */
588       printf ("%-*s", width - num_printed, " ");
589       num_printed = width;
590     }
591
592   return num_printed;
593 }
594
595 /* Returns a pointer to a static buffer containing a printable version of
596    the given section's name.  Like print_symbol, except that it does not try
597    to print multibyte characters, it just interprets them as hex values.  */
598
599 static const char *
600 printable_section_name (Filedata * filedata, const Elf_Internal_Shdr * sec)
601 {
602 #define MAX_PRINT_SEC_NAME_LEN 128
603   static char  sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
604   const char * name = SECTION_NAME (sec);
605   char *       buf = sec_name_buf;
606   char         c;
607   unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
608
609   while ((c = * name ++) != 0)
610     {
611       if (ISCNTRL (c))
612         {
613           if (remaining < 2)
614             break;
615
616           * buf ++ = '^';
617           * buf ++ = c + 0x40;
618           remaining -= 2;
619         }
620       else if (ISPRINT (c))
621         {
622           * buf ++ = c;
623           remaining -= 1;
624         }
625       else
626         {
627           static char hex[17] = "0123456789ABCDEF";
628
629           if (remaining < 4)
630             break;
631           * buf ++ = '<';
632           * buf ++ = hex[(c & 0xf0) >> 4];
633           * buf ++ = hex[c & 0x0f];
634           * buf ++ = '>';
635           remaining -= 4;
636         }
637
638       if (remaining == 0)
639         break;
640     }
641
642   * buf = 0;
643   return sec_name_buf;
644 }
645
646 static const char *
647 printable_section_name_from_index (Filedata * filedata, unsigned long ndx)
648 {
649   if (ndx >= filedata->file_header.e_shnum)
650     return _("<corrupt>");
651
652   return printable_section_name (filedata, filedata->section_headers + ndx);
653 }
654
655 /* Return a pointer to section NAME, or NULL if no such section exists.  */
656
657 static Elf_Internal_Shdr *
658 find_section (Filedata * filedata, const char * name)
659 {
660   unsigned int i;
661
662   if (filedata->section_headers == NULL)
663     return NULL;
664
665   for (i = 0; i < filedata->file_header.e_shnum; i++)
666     if (streq (SECTION_NAME (filedata->section_headers + i), name))
667       return filedata->section_headers + i;
668
669   return NULL;
670 }
671
672 /* Return a pointer to a section containing ADDR, or NULL if no such
673    section exists.  */
674
675 static Elf_Internal_Shdr *
676 find_section_by_address (Filedata * filedata, bfd_vma addr)
677 {
678   unsigned int i;
679
680   if (filedata->section_headers == NULL)
681     return NULL;
682
683   for (i = 0; i < filedata->file_header.e_shnum; i++)
684     {
685       Elf_Internal_Shdr *sec = filedata->section_headers + i;
686
687       if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
688         return sec;
689     }
690
691   return NULL;
692 }
693
694 static Elf_Internal_Shdr *
695 find_section_by_type (Filedata * filedata, unsigned int type)
696 {
697   unsigned int i;
698
699   if (filedata->section_headers == NULL)
700     return NULL;
701
702   for (i = 0; i < filedata->file_header.e_shnum; i++)
703     {
704       Elf_Internal_Shdr *sec = filedata->section_headers + i;
705
706       if (sec->sh_type == type)
707         return sec;
708     }
709
710   return NULL;
711 }
712
713 /* Return a pointer to section NAME, or NULL if no such section exists,
714    restricted to the list of sections given in SET.  */
715
716 static Elf_Internal_Shdr *
717 find_section_in_set (Filedata * filedata, const char * name, unsigned int * set)
718 {
719   unsigned int i;
720
721   if (filedata->section_headers == NULL)
722     return NULL;
723
724   if (set != NULL)
725     {
726       while ((i = *set++) > 0)
727         {
728           /* See PR 21156 for a reproducer.  */
729           if (i >= filedata->file_header.e_shnum)
730             continue; /* FIXME: Should we issue an error message ?  */
731
732           if (streq (SECTION_NAME (filedata->section_headers + i), name))
733             return filedata->section_headers + i;
734         }
735     }
736
737   return find_section (filedata, name);
738 }
739
740 /* Read an unsigned LEB128 encoded value from DATA.
741    Set *LENGTH_RETURN to the number of bytes read.  */
742
743 static inline unsigned long
744 read_uleb128 (unsigned char * data,
745               unsigned int * length_return,
746               const unsigned char * const end)
747 {
748   return read_leb128 (data, length_return, FALSE, end);
749 }
750
751 /* Return TRUE if the current file is for IA-64 machine and OpenVMS ABI.
752    This OS has so many departures from the ELF standard that we test it at
753    many places.  */
754
755 static inline bfd_boolean
756 is_ia64_vms (Filedata * filedata)
757 {
758   return filedata->file_header.e_machine == EM_IA_64
759     && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
760 }
761
762 /* Guess the relocation size commonly used by the specific machines.  */
763
764 static bfd_boolean
765 guess_is_rela (unsigned int e_machine)
766 {
767   switch (e_machine)
768     {
769       /* Targets that use REL relocations.  */
770     case EM_386:
771     case EM_IAMCU:
772     case EM_960:
773     case EM_ARM:
774     case EM_D10V:
775     case EM_CYGNUS_D10V:
776     case EM_DLX:
777     case EM_MIPS:
778     case EM_MIPS_RS3_LE:
779     case EM_CYGNUS_M32R:
780     case EM_SCORE:
781     case EM_XGATE:
782     case EM_NFP:
783       return FALSE;
784
785       /* Targets that use RELA relocations.  */
786     case EM_68K:
787     case EM_860:
788     case EM_AARCH64:
789     case EM_ADAPTEVA_EPIPHANY:
790     case EM_ALPHA:
791     case EM_ALTERA_NIOS2:
792     case EM_ARC:
793     case EM_ARC_COMPACT:
794     case EM_ARC_COMPACT2:
795     case EM_AVR:
796     case EM_AVR_OLD:
797     case EM_BLACKFIN:
798     case EM_CR16:
799     case EM_CRIS:
800     case EM_CRX:
801     case EM_CSKY:
802     case EM_D30V:
803     case EM_CYGNUS_D30V:
804     case EM_FR30:
805     case EM_FT32:
806     case EM_CYGNUS_FR30:
807     case EM_CYGNUS_FRV:
808     case EM_H8S:
809     case EM_H8_300:
810     case EM_H8_300H:
811     case EM_IA_64:
812     case EM_IP2K:
813     case EM_IP2K_OLD:
814     case EM_IQ2000:
815     case EM_LATTICEMICO32:
816     case EM_M32C_OLD:
817     case EM_M32C:
818     case EM_M32R:
819     case EM_MCORE:
820     case EM_CYGNUS_MEP:
821     case EM_METAG:
822     case EM_MMIX:
823     case EM_MN10200:
824     case EM_CYGNUS_MN10200:
825     case EM_MN10300:
826     case EM_CYGNUS_MN10300:
827     case EM_MOXIE:
828     case EM_MSP430:
829     case EM_MSP430_OLD:
830     case EM_MT:
831     case EM_NDS32:
832     case EM_NIOS32:
833     case EM_OR1K:
834     case EM_PPC64:
835     case EM_PPC:
836     case EM_TI_PRU:
837     case EM_RISCV:
838     case EM_RL78:
839     case EM_RX:
840     case EM_S390:
841     case EM_S390_OLD:
842     case EM_SH:
843     case EM_SPARC:
844     case EM_SPARC32PLUS:
845     case EM_SPARCV9:
846     case EM_SPU:
847     case EM_TI_C6000:
848     case EM_TILEGX:
849     case EM_TILEPRO:
850     case EM_V800:
851     case EM_V850:
852     case EM_CYGNUS_V850:
853     case EM_VAX:
854     case EM_VISIUM:
855     case EM_X86_64:
856     case EM_L1OM:
857     case EM_K1OM:
858     case EM_XSTORMY16:
859     case EM_XTENSA:
860     case EM_XTENSA_OLD:
861     case EM_MICROBLAZE:
862     case EM_MICROBLAZE_OLD:
863     case EM_WEBASSEMBLY:
864       return TRUE;
865
866     case EM_68HC05:
867     case EM_68HC08:
868     case EM_68HC11:
869     case EM_68HC16:
870     case EM_FX66:
871     case EM_ME16:
872     case EM_MMA:
873     case EM_NCPU:
874     case EM_NDR1:
875     case EM_PCP:
876     case EM_ST100:
877     case EM_ST19:
878     case EM_ST7:
879     case EM_ST9PLUS:
880     case EM_STARCORE:
881     case EM_SVX:
882     case EM_TINYJ:
883     default:
884       warn (_("Don't know about relocations on this machine architecture\n"));
885       return FALSE;
886     }
887 }
888
889 /* Load RELA type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
890    Returns TRUE upon success, FALSE otherwise.  If successful then a
891    pointer to a malloc'ed buffer containing the relocs is placed in *RELASP,
892    and the number of relocs loaded is placed in *NRELASP.  It is the caller's
893    responsibility to free the allocated buffer.  */
894
895 static bfd_boolean
896 slurp_rela_relocs (Filedata *            filedata,
897                    unsigned long         rel_offset,
898                    unsigned long         rel_size,
899                    Elf_Internal_Rela **  relasp,
900                    unsigned long *       nrelasp)
901 {
902   Elf_Internal_Rela * relas;
903   size_t nrelas;
904   unsigned int i;
905
906   if (is_32bit_elf)
907     {
908       Elf32_External_Rela * erelas;
909
910       erelas = (Elf32_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
911                                                  rel_size, _("32-bit relocation data"));
912       if (!erelas)
913         return FALSE;
914
915       nrelas = rel_size / sizeof (Elf32_External_Rela);
916
917       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
918                                              sizeof (Elf_Internal_Rela));
919
920       if (relas == NULL)
921         {
922           free (erelas);
923           error (_("out of memory parsing relocs\n"));
924           return FALSE;
925         }
926
927       for (i = 0; i < nrelas; i++)
928         {
929           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
930           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
931           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
932         }
933
934       free (erelas);
935     }
936   else
937     {
938       Elf64_External_Rela * erelas;
939
940       erelas = (Elf64_External_Rela *) get_data (NULL, filedata, rel_offset, 1,
941                                                  rel_size, _("64-bit relocation data"));
942       if (!erelas)
943         return FALSE;
944
945       nrelas = rel_size / sizeof (Elf64_External_Rela);
946
947       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
948                                              sizeof (Elf_Internal_Rela));
949
950       if (relas == NULL)
951         {
952           free (erelas);
953           error (_("out of memory parsing relocs\n"));
954           return FALSE;
955         }
956
957       for (i = 0; i < nrelas; i++)
958         {
959           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
960           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
961           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
962
963           /* The #ifdef BFD64 below is to prevent a compile time
964              warning.  We know that if we do not have a 64 bit data
965              type that we will never execute this code anyway.  */
966 #ifdef BFD64
967           if (filedata->file_header.e_machine == EM_MIPS
968               && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
969             {
970               /* In little-endian objects, r_info isn't really a
971                  64-bit little-endian value: it has a 32-bit
972                  little-endian symbol index followed by four
973                  individual byte fields.  Reorder INFO
974                  accordingly.  */
975               bfd_vma inf = relas[i].r_info;
976               inf = (((inf & 0xffffffff) << 32)
977                       | ((inf >> 56) & 0xff)
978                       | ((inf >> 40) & 0xff00)
979                       | ((inf >> 24) & 0xff0000)
980                       | ((inf >> 8) & 0xff000000));
981               relas[i].r_info = inf;
982             }
983 #endif /* BFD64 */
984         }
985
986       free (erelas);
987     }
988
989   *relasp = relas;
990   *nrelasp = nrelas;
991   return TRUE;
992 }
993
994 /* Load REL type relocations from FILEDATA at REL_OFFSET extending for REL_SIZE bytes.
995    Returns TRUE upon success, FALSE otherwise.  If successful then a
996    pointer to a malloc'ed buffer containing the relocs is placed in *RELSP,
997    and the number of relocs loaded is placed in *NRELSP.  It is the caller's
998    responsibility to free the allocated buffer.  */
999
1000 static bfd_boolean
1001 slurp_rel_relocs (Filedata *            filedata,
1002                   unsigned long         rel_offset,
1003                   unsigned long         rel_size,
1004                   Elf_Internal_Rela **  relsp,
1005                   unsigned long *       nrelsp)
1006 {
1007   Elf_Internal_Rela * rels;
1008   size_t nrels;
1009   unsigned int i;
1010
1011   if (is_32bit_elf)
1012     {
1013       Elf32_External_Rel * erels;
1014
1015       erels = (Elf32_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1016                                                rel_size, _("32-bit relocation data"));
1017       if (!erels)
1018         return FALSE;
1019
1020       nrels = rel_size / sizeof (Elf32_External_Rel);
1021
1022       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1023
1024       if (rels == NULL)
1025         {
1026           free (erels);
1027           error (_("out of memory parsing relocs\n"));
1028           return FALSE;
1029         }
1030
1031       for (i = 0; i < nrels; i++)
1032         {
1033           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1034           rels[i].r_info   = BYTE_GET (erels[i].r_info);
1035           rels[i].r_addend = 0;
1036         }
1037
1038       free (erels);
1039     }
1040   else
1041     {
1042       Elf64_External_Rel * erels;
1043
1044       erels = (Elf64_External_Rel *) get_data (NULL, filedata, rel_offset, 1,
1045                                                rel_size, _("64-bit relocation data"));
1046       if (!erels)
1047         return FALSE;
1048
1049       nrels = rel_size / sizeof (Elf64_External_Rel);
1050
1051       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
1052
1053       if (rels == NULL)
1054         {
1055           free (erels);
1056           error (_("out of memory parsing relocs\n"));
1057           return FALSE;
1058         }
1059
1060       for (i = 0; i < nrels; i++)
1061         {
1062           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
1063           rels[i].r_info   = BYTE_GET (erels[i].r_info);
1064           rels[i].r_addend = 0;
1065
1066           /* The #ifdef BFD64 below is to prevent a compile time
1067              warning.  We know that if we do not have a 64 bit data
1068              type that we will never execute this code anyway.  */
1069 #ifdef BFD64
1070           if (filedata->file_header.e_machine == EM_MIPS
1071               && filedata->file_header.e_ident[EI_DATA] != ELFDATA2MSB)
1072             {
1073               /* In little-endian objects, r_info isn't really a
1074                  64-bit little-endian value: it has a 32-bit
1075                  little-endian symbol index followed by four
1076                  individual byte fields.  Reorder INFO
1077                  accordingly.  */
1078               bfd_vma inf = rels[i].r_info;
1079               inf = (((inf & 0xffffffff) << 32)
1080                      | ((inf >> 56) & 0xff)
1081                      | ((inf >> 40) & 0xff00)
1082                      | ((inf >> 24) & 0xff0000)
1083                      | ((inf >> 8) & 0xff000000));
1084               rels[i].r_info = inf;
1085             }
1086 #endif /* BFD64 */
1087         }
1088
1089       free (erels);
1090     }
1091
1092   *relsp = rels;
1093   *nrelsp = nrels;
1094   return TRUE;
1095 }
1096
1097 /* Returns the reloc type extracted from the reloc info field.  */
1098
1099 static unsigned int
1100 get_reloc_type (Filedata * filedata, bfd_vma reloc_info)
1101 {
1102   if (is_32bit_elf)
1103     return ELF32_R_TYPE (reloc_info);
1104
1105   switch (filedata->file_header.e_machine)
1106     {
1107     case EM_MIPS:
1108       /* Note: We assume that reloc_info has already been adjusted for us.  */
1109       return ELF64_MIPS_R_TYPE (reloc_info);
1110
1111     case EM_SPARCV9:
1112       return ELF64_R_TYPE_ID (reloc_info);
1113
1114     default:
1115       return ELF64_R_TYPE (reloc_info);
1116     }
1117 }
1118
1119 /* Return the symbol index extracted from the reloc info field.  */
1120
1121 static bfd_vma
1122 get_reloc_symindex (bfd_vma reloc_info)
1123 {
1124   return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1125 }
1126
1127 static inline bfd_boolean
1128 uses_msp430x_relocs (Filedata * filedata)
1129 {
1130   return
1131     filedata->file_header.e_machine == EM_MSP430 /* Paranoia.  */
1132     /* GCC uses osabi == ELFOSBI_STANDALONE.  */
1133     && (((filedata->file_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1134         /* TI compiler uses ELFOSABI_NONE.  */
1135         || (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1136 }
1137
1138 /* Display the contents of the relocation data found at the specified
1139    offset.  */
1140
1141 static bfd_boolean
1142 dump_relocations (Filedata *          filedata,
1143                   unsigned long       rel_offset,
1144                   unsigned long       rel_size,
1145                   Elf_Internal_Sym *  symtab,
1146                   unsigned long       nsyms,
1147                   char *              strtab,
1148                   unsigned long       strtablen,
1149                   int                 is_rela,
1150                   bfd_boolean         is_dynsym)
1151 {
1152   unsigned long i;
1153   Elf_Internal_Rela * rels;
1154   bfd_boolean res = TRUE;
1155
1156   if (is_rela == UNKNOWN)
1157     is_rela = guess_is_rela (filedata->file_header.e_machine);
1158
1159   if (is_rela)
1160     {
1161       if (!slurp_rela_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1162         return FALSE;
1163     }
1164   else
1165     {
1166       if (!slurp_rel_relocs (filedata, rel_offset, rel_size, &rels, &rel_size))
1167         return FALSE;
1168     }
1169
1170   if (is_32bit_elf)
1171     {
1172       if (is_rela)
1173         {
1174           if (do_wide)
1175             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name + Addend\n"));
1176           else
1177             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name + Addend\n"));
1178         }
1179       else
1180         {
1181           if (do_wide)
1182             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name\n"));
1183           else
1184             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name\n"));
1185         }
1186     }
1187   else
1188     {
1189       if (is_rela)
1190         {
1191           if (do_wide)
1192             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend\n"));
1193           else
1194             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name + Addend\n"));
1195         }
1196       else
1197         {
1198           if (do_wide)
1199             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name\n"));
1200           else
1201             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name\n"));
1202         }
1203     }
1204
1205   for (i = 0; i < rel_size; i++)
1206     {
1207       const char * rtype;
1208       bfd_vma offset;
1209       bfd_vma inf;
1210       bfd_vma symtab_index;
1211       bfd_vma type;
1212
1213       offset = rels[i].r_offset;
1214       inf    = rels[i].r_info;
1215
1216       type = get_reloc_type (filedata, inf);
1217       symtab_index = get_reloc_symindex  (inf);
1218
1219       if (is_32bit_elf)
1220         {
1221           printf ("%8.8lx  %8.8lx ",
1222                   (unsigned long) offset & 0xffffffff,
1223                   (unsigned long) inf & 0xffffffff);
1224         }
1225       else
1226         {
1227 #if BFD_HOST_64BIT_LONG
1228           printf (do_wide
1229                   ? "%16.16lx  %16.16lx "
1230                   : "%12.12lx  %12.12lx ",
1231                   offset, inf);
1232 #elif BFD_HOST_64BIT_LONG_LONG
1233 #ifndef __MSVCRT__
1234           printf (do_wide
1235                   ? "%16.16llx  %16.16llx "
1236                   : "%12.12llx  %12.12llx ",
1237                   offset, inf);
1238 #else
1239           printf (do_wide
1240                   ? "%16.16I64x  %16.16I64x "
1241                   : "%12.12I64x  %12.12I64x ",
1242                   offset, inf);
1243 #endif
1244 #else
1245           printf (do_wide
1246                   ? "%8.8lx%8.8lx  %8.8lx%8.8lx "
1247                   : "%4.4lx%8.8lx  %4.4lx%8.8lx ",
1248                   _bfd_int64_high (offset),
1249                   _bfd_int64_low (offset),
1250                   _bfd_int64_high (inf),
1251                   _bfd_int64_low (inf));
1252 #endif
1253         }
1254
1255       switch (filedata->file_header.e_machine)
1256         {
1257         default:
1258           rtype = NULL;
1259           break;
1260
1261         case EM_AARCH64:
1262           rtype = elf_aarch64_reloc_type (type);
1263           break;
1264
1265         case EM_M32R:
1266         case EM_CYGNUS_M32R:
1267           rtype = elf_m32r_reloc_type (type);
1268           break;
1269
1270         case EM_386:
1271         case EM_IAMCU:
1272           rtype = elf_i386_reloc_type (type);
1273           break;
1274
1275         case EM_68HC11:
1276         case EM_68HC12:
1277           rtype = elf_m68hc11_reloc_type (type);
1278           break;
1279
1280         case EM_S12Z:
1281           rtype = elf_s12z_reloc_type (type);
1282           break;
1283
1284         case EM_68K:
1285           rtype = elf_m68k_reloc_type (type);
1286           break;
1287
1288         case EM_960:
1289           rtype = elf_i960_reloc_type (type);
1290           break;
1291
1292         case EM_AVR:
1293         case EM_AVR_OLD:
1294           rtype = elf_avr_reloc_type (type);
1295           break;
1296
1297         case EM_OLD_SPARCV9:
1298         case EM_SPARC32PLUS:
1299         case EM_SPARCV9:
1300         case EM_SPARC:
1301           rtype = elf_sparc_reloc_type (type);
1302           break;
1303
1304         case EM_SPU:
1305           rtype = elf_spu_reloc_type (type);
1306           break;
1307
1308         case EM_V800:
1309           rtype = v800_reloc_type (type);
1310           break;
1311         case EM_V850:
1312         case EM_CYGNUS_V850:
1313           rtype = v850_reloc_type (type);
1314           break;
1315
1316         case EM_D10V:
1317         case EM_CYGNUS_D10V:
1318           rtype = elf_d10v_reloc_type (type);
1319           break;
1320
1321         case EM_D30V:
1322         case EM_CYGNUS_D30V:
1323           rtype = elf_d30v_reloc_type (type);
1324           break;
1325
1326         case EM_DLX:
1327           rtype = elf_dlx_reloc_type (type);
1328           break;
1329
1330         case EM_SH:
1331           rtype = elf_sh_reloc_type (type);
1332           break;
1333
1334         case EM_MN10300:
1335         case EM_CYGNUS_MN10300:
1336           rtype = elf_mn10300_reloc_type (type);
1337           break;
1338
1339         case EM_MN10200:
1340         case EM_CYGNUS_MN10200:
1341           rtype = elf_mn10200_reloc_type (type);
1342           break;
1343
1344         case EM_FR30:
1345         case EM_CYGNUS_FR30:
1346           rtype = elf_fr30_reloc_type (type);
1347           break;
1348
1349         case EM_CYGNUS_FRV:
1350           rtype = elf_frv_reloc_type (type);
1351           break;
1352
1353         case EM_CSKY:
1354           rtype = elf_csky_reloc_type (type);
1355           break;
1356
1357         case EM_FT32:
1358           rtype = elf_ft32_reloc_type (type);
1359           break;
1360
1361         case EM_MCORE:
1362           rtype = elf_mcore_reloc_type (type);
1363           break;
1364
1365         case EM_MMIX:
1366           rtype = elf_mmix_reloc_type (type);
1367           break;
1368
1369         case EM_MOXIE:
1370           rtype = elf_moxie_reloc_type (type);
1371           break;
1372
1373         case EM_MSP430:
1374           if (uses_msp430x_relocs (filedata))
1375             {
1376               rtype = elf_msp430x_reloc_type (type);
1377               break;
1378             }
1379           /* Fall through.  */
1380         case EM_MSP430_OLD:
1381           rtype = elf_msp430_reloc_type (type);
1382           break;
1383
1384         case EM_NDS32:
1385           rtype = elf_nds32_reloc_type (type);
1386           break;
1387
1388         case EM_PPC:
1389           rtype = elf_ppc_reloc_type (type);
1390           break;
1391
1392         case EM_PPC64:
1393           rtype = elf_ppc64_reloc_type (type);
1394           break;
1395
1396         case EM_MIPS:
1397         case EM_MIPS_RS3_LE:
1398           rtype = elf_mips_reloc_type (type);
1399           break;
1400
1401         case EM_RISCV:
1402           rtype = elf_riscv_reloc_type (type);
1403           break;
1404
1405         case EM_ALPHA:
1406           rtype = elf_alpha_reloc_type (type);
1407           break;
1408
1409         case EM_ARM:
1410           rtype = elf_arm_reloc_type (type);
1411           break;
1412
1413         case EM_ARC:
1414         case EM_ARC_COMPACT:
1415         case EM_ARC_COMPACT2:
1416           rtype = elf_arc_reloc_type (type);
1417           break;
1418
1419         case EM_PARISC:
1420           rtype = elf_hppa_reloc_type (type);
1421           break;
1422
1423         case EM_H8_300:
1424         case EM_H8_300H:
1425         case EM_H8S:
1426           rtype = elf_h8_reloc_type (type);
1427           break;
1428
1429         case EM_OR1K:
1430           rtype = elf_or1k_reloc_type (type);
1431           break;
1432
1433         case EM_PJ:
1434         case EM_PJ_OLD:
1435           rtype = elf_pj_reloc_type (type);
1436           break;
1437         case EM_IA_64:
1438           rtype = elf_ia64_reloc_type (type);
1439           break;
1440
1441         case EM_CRIS:
1442           rtype = elf_cris_reloc_type (type);
1443           break;
1444
1445         case EM_860:
1446           rtype = elf_i860_reloc_type (type);
1447           break;
1448
1449         case EM_X86_64:
1450         case EM_L1OM:
1451         case EM_K1OM:
1452           rtype = elf_x86_64_reloc_type (type);
1453           break;
1454
1455         case EM_S370:
1456           rtype = i370_reloc_type (type);
1457           break;
1458
1459         case EM_S390_OLD:
1460         case EM_S390:
1461           rtype = elf_s390_reloc_type (type);
1462           break;
1463
1464         case EM_SCORE:
1465           rtype = elf_score_reloc_type (type);
1466           break;
1467
1468         case EM_XSTORMY16:
1469           rtype = elf_xstormy16_reloc_type (type);
1470           break;
1471
1472         case EM_CRX:
1473           rtype = elf_crx_reloc_type (type);
1474           break;
1475
1476         case EM_VAX:
1477           rtype = elf_vax_reloc_type (type);
1478           break;
1479
1480         case EM_VISIUM:
1481           rtype = elf_visium_reloc_type (type);
1482           break;
1483
1484         case EM_ADAPTEVA_EPIPHANY:
1485           rtype = elf_epiphany_reloc_type (type);
1486           break;
1487
1488         case EM_IP2K:
1489         case EM_IP2K_OLD:
1490           rtype = elf_ip2k_reloc_type (type);
1491           break;
1492
1493         case EM_IQ2000:
1494           rtype = elf_iq2000_reloc_type (type);
1495           break;
1496
1497         case EM_XTENSA_OLD:
1498         case EM_XTENSA:
1499           rtype = elf_xtensa_reloc_type (type);
1500           break;
1501
1502         case EM_LATTICEMICO32:
1503           rtype = elf_lm32_reloc_type (type);
1504           break;
1505
1506         case EM_M32C_OLD:
1507         case EM_M32C:
1508           rtype = elf_m32c_reloc_type (type);
1509           break;
1510
1511         case EM_MT:
1512           rtype = elf_mt_reloc_type (type);
1513           break;
1514
1515         case EM_BLACKFIN:
1516           rtype = elf_bfin_reloc_type (type);
1517           break;
1518
1519         case EM_CYGNUS_MEP:
1520           rtype = elf_mep_reloc_type (type);
1521           break;
1522
1523         case EM_CR16:
1524           rtype = elf_cr16_reloc_type (type);
1525           break;
1526
1527         case EM_MICROBLAZE:
1528         case EM_MICROBLAZE_OLD:
1529           rtype = elf_microblaze_reloc_type (type);
1530           break;
1531
1532         case EM_RL78:
1533           rtype = elf_rl78_reloc_type (type);
1534           break;
1535
1536         case EM_RX:
1537           rtype = elf_rx_reloc_type (type);
1538           break;
1539
1540         case EM_METAG:
1541           rtype = elf_metag_reloc_type (type);
1542           break;
1543
1544         case EM_XC16X:
1545         case EM_C166:
1546           rtype = elf_xc16x_reloc_type (type);
1547           break;
1548
1549         case EM_TI_C6000:
1550           rtype = elf_tic6x_reloc_type (type);
1551           break;
1552
1553         case EM_TILEGX:
1554           rtype = elf_tilegx_reloc_type (type);
1555           break;
1556
1557         case EM_TILEPRO:
1558           rtype = elf_tilepro_reloc_type (type);
1559           break;
1560
1561         case EM_WEBASSEMBLY:
1562           rtype = elf_wasm32_reloc_type (type);
1563           break;
1564
1565         case EM_XGATE:
1566           rtype = elf_xgate_reloc_type (type);
1567           break;
1568
1569         case EM_ALTERA_NIOS2:
1570           rtype = elf_nios2_reloc_type (type);
1571           break;
1572
1573         case EM_TI_PRU:
1574           rtype = elf_pru_reloc_type (type);
1575           break;
1576
1577         case EM_NFP:
1578           if (EF_NFP_MACH (filedata->file_header.e_flags) == E_NFP_MACH_3200)
1579             rtype = elf_nfp3200_reloc_type (type);
1580           else
1581             rtype = elf_nfp_reloc_type (type);
1582           break;
1583         }
1584
1585       if (rtype == NULL)
1586         printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1587       else
1588         printf (do_wide ? "%-22s" : "%-17.17s", rtype);
1589
1590       if (filedata->file_header.e_machine == EM_ALPHA
1591           && rtype != NULL
1592           && streq (rtype, "R_ALPHA_LITUSE")
1593           && is_rela)
1594         {
1595           switch (rels[i].r_addend)
1596             {
1597             case LITUSE_ALPHA_ADDR:   rtype = "ADDR";   break;
1598             case LITUSE_ALPHA_BASE:   rtype = "BASE";   break;
1599             case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1600             case LITUSE_ALPHA_JSR:    rtype = "JSR";    break;
1601             case LITUSE_ALPHA_TLSGD:  rtype = "TLSGD";  break;
1602             case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1603             case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1604             default: rtype = NULL;
1605             }
1606
1607           if (rtype)
1608             printf (" (%s)", rtype);
1609           else
1610             {
1611               putchar (' ');
1612               printf (_("<unknown addend: %lx>"),
1613                       (unsigned long) rels[i].r_addend);
1614               res = FALSE;
1615             }
1616         }
1617       else if (symtab_index)
1618         {
1619           if (symtab == NULL || symtab_index >= nsyms)
1620             {
1621               error (_(" bad symbol index: %08lx in reloc"), (unsigned long) symtab_index);
1622               res = FALSE;
1623             }
1624           else
1625             {
1626               Elf_Internal_Sym * psym;
1627               const char * version_string;
1628               enum versioned_symbol_info sym_info;
1629               unsigned short vna_other;
1630
1631               psym = symtab + symtab_index;
1632
1633               version_string
1634                 = get_symbol_version_string (filedata, is_dynsym,
1635                                              strtab, strtablen,
1636                                              symtab_index,
1637                                              psym,
1638                                              &sym_info,
1639                                              &vna_other);
1640
1641               printf (" ");
1642
1643               if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1644                 {
1645                   const char * name;
1646                   unsigned int len;
1647                   unsigned int width = is_32bit_elf ? 8 : 14;
1648
1649                   /* Relocations against GNU_IFUNC symbols do not use the value
1650                      of the symbol as the address to relocate against.  Instead
1651                      they invoke the function named by the symbol and use its
1652                      result as the address for relocation.
1653
1654                      To indicate this to the user, do not display the value of
1655                      the symbol in the "Symbols's Value" field.  Instead show
1656                      its name followed by () as a hint that the symbol is
1657                      invoked.  */
1658
1659                   if (strtab == NULL
1660                       || psym->st_name == 0
1661                       || psym->st_name >= strtablen)
1662                     name = "??";
1663                   else
1664                     name = strtab + psym->st_name;
1665
1666                   len = print_symbol (width, name);
1667                   if (version_string)
1668                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1669                             version_string);
1670                   printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1671                 }
1672               else
1673                 {
1674                   print_vma (psym->st_value, LONG_HEX);
1675
1676                   printf (is_32bit_elf ? "   " : " ");
1677                 }
1678
1679               if (psym->st_name == 0)
1680                 {
1681                   const char * sec_name = "<null>";
1682                   char name_buf[40];
1683
1684                   if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1685                     {
1686                       if (psym->st_shndx < filedata->file_header.e_shnum)
1687                         sec_name = SECTION_NAME (filedata->section_headers + psym->st_shndx);
1688                       else if (psym->st_shndx == SHN_ABS)
1689                         sec_name = "ABS";
1690                       else if (psym->st_shndx == SHN_COMMON)
1691                         sec_name = "COMMON";
1692                       else if ((filedata->file_header.e_machine == EM_MIPS
1693                                 && psym->st_shndx == SHN_MIPS_SCOMMON)
1694                                || (filedata->file_header.e_machine == EM_TI_C6000
1695                                    && psym->st_shndx == SHN_TIC6X_SCOMMON))
1696                         sec_name = "SCOMMON";
1697                       else if (filedata->file_header.e_machine == EM_MIPS
1698                                && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1699                         sec_name = "SUNDEF";
1700                       else if ((filedata->file_header.e_machine == EM_X86_64
1701                                 || filedata->file_header.e_machine == EM_L1OM
1702                                 || filedata->file_header.e_machine == EM_K1OM)
1703                                && psym->st_shndx == SHN_X86_64_LCOMMON)
1704                         sec_name = "LARGE_COMMON";
1705                       else if (filedata->file_header.e_machine == EM_IA_64
1706                                && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1707                                && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1708                         sec_name = "ANSI_COM";
1709                       else if (is_ia64_vms (filedata)
1710                                && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1711                         sec_name = "VMS_SYMVEC";
1712                       else
1713                         {
1714                           sprintf (name_buf, "<section 0x%x>",
1715                                    (unsigned int) psym->st_shndx);
1716                           sec_name = name_buf;
1717                         }
1718                     }
1719                   print_symbol (22, sec_name);
1720                 }
1721               else if (strtab == NULL)
1722                 printf (_("<string table index: %3ld>"), psym->st_name);
1723               else if (psym->st_name >= strtablen)
1724                 {
1725                   error (_("<corrupt string table index: %3ld>"), psym->st_name);
1726                   res = FALSE;
1727                 }
1728               else
1729                 {
1730                   print_symbol (22, strtab + psym->st_name);
1731                   if (version_string)
1732                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1733                             version_string);
1734                 }
1735
1736               if (is_rela)
1737                 {
1738                   bfd_vma off = rels[i].r_addend;
1739
1740                   if ((bfd_signed_vma) off < 0)
1741                     printf (" - %" BFD_VMA_FMT "x", - off);
1742                   else
1743                     printf (" + %" BFD_VMA_FMT "x", off);
1744                 }
1745             }
1746         }
1747       else if (is_rela)
1748         {
1749           bfd_vma off = rels[i].r_addend;
1750
1751           printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1752           if ((bfd_signed_vma) off < 0)
1753             printf ("-%" BFD_VMA_FMT "x", - off);
1754           else
1755             printf ("%" BFD_VMA_FMT "x", off);
1756         }
1757
1758       if (filedata->file_header.e_machine == EM_SPARCV9
1759           && rtype != NULL
1760           && streq (rtype, "R_SPARC_OLO10"))
1761         printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1762
1763       putchar ('\n');
1764
1765 #ifdef BFD64
1766       if (! is_32bit_elf && filedata->file_header.e_machine == EM_MIPS)
1767         {
1768           bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1769           bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1770           const char * rtype2 = elf_mips_reloc_type (type2);
1771           const char * rtype3 = elf_mips_reloc_type (type3);
1772
1773           printf ("                    Type2: ");
1774
1775           if (rtype2 == NULL)
1776             printf (_("unrecognized: %-7lx"),
1777                     (unsigned long) type2 & 0xffffffff);
1778           else
1779             printf ("%-17.17s", rtype2);
1780
1781           printf ("\n                    Type3: ");
1782
1783           if (rtype3 == NULL)
1784             printf (_("unrecognized: %-7lx"),
1785                     (unsigned long) type3 & 0xffffffff);
1786           else
1787             printf ("%-17.17s", rtype3);
1788
1789           putchar ('\n');
1790         }
1791 #endif /* BFD64 */
1792     }
1793
1794   free (rels);
1795
1796   return res;
1797 }
1798
1799 static const char *
1800 get_mips_dynamic_type (unsigned long type)
1801 {
1802   switch (type)
1803     {
1804     case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1805     case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1806     case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1807     case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1808     case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1809     case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1810     case DT_MIPS_MSYM: return "MIPS_MSYM";
1811     case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1812     case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1813     case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1814     case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1815     case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1816     case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1817     case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1818     case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1819     case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1820     case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1821     case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1822     case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1823     case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1824     case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1825     case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1826     case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1827     case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1828     case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1829     case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1830     case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1831     case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1832     case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1833     case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1834     case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1835     case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1836     case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1837     case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1838     case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1839     case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1840     case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1841     case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1842     case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1843     case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1844     case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1845     case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1846     case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1847     case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1848     case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1849     case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1850     default:
1851       return NULL;
1852     }
1853 }
1854
1855 static const char *
1856 get_sparc64_dynamic_type (unsigned long type)
1857 {
1858   switch (type)
1859     {
1860     case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1861     default:
1862       return NULL;
1863     }
1864 }
1865
1866 static const char *
1867 get_ppc_dynamic_type (unsigned long type)
1868 {
1869   switch (type)
1870     {
1871     case DT_PPC_GOT:    return "PPC_GOT";
1872     case DT_PPC_OPT:    return "PPC_OPT";
1873     default:
1874       return NULL;
1875     }
1876 }
1877
1878 static const char *
1879 get_ppc64_dynamic_type (unsigned long type)
1880 {
1881   switch (type)
1882     {
1883     case DT_PPC64_GLINK:  return "PPC64_GLINK";
1884     case DT_PPC64_OPD:    return "PPC64_OPD";
1885     case DT_PPC64_OPDSZ:  return "PPC64_OPDSZ";
1886     case DT_PPC64_OPT:    return "PPC64_OPT";
1887     default:
1888       return NULL;
1889     }
1890 }
1891
1892 static const char *
1893 get_parisc_dynamic_type (unsigned long type)
1894 {
1895   switch (type)
1896     {
1897     case DT_HP_LOAD_MAP:        return "HP_LOAD_MAP";
1898     case DT_HP_DLD_FLAGS:       return "HP_DLD_FLAGS";
1899     case DT_HP_DLD_HOOK:        return "HP_DLD_HOOK";
1900     case DT_HP_UX10_INIT:       return "HP_UX10_INIT";
1901     case DT_HP_UX10_INITSZ:     return "HP_UX10_INITSZ";
1902     case DT_HP_PREINIT:         return "HP_PREINIT";
1903     case DT_HP_PREINITSZ:       return "HP_PREINITSZ";
1904     case DT_HP_NEEDED:          return "HP_NEEDED";
1905     case DT_HP_TIME_STAMP:      return "HP_TIME_STAMP";
1906     case DT_HP_CHECKSUM:        return "HP_CHECKSUM";
1907     case DT_HP_GST_SIZE:        return "HP_GST_SIZE";
1908     case DT_HP_GST_VERSION:     return "HP_GST_VERSION";
1909     case DT_HP_GST_HASHVAL:     return "HP_GST_HASHVAL";
1910     case DT_HP_EPLTREL:         return "HP_GST_EPLTREL";
1911     case DT_HP_EPLTRELSZ:       return "HP_GST_EPLTRELSZ";
1912     case DT_HP_FILTERED:        return "HP_FILTERED";
1913     case DT_HP_FILTER_TLS:      return "HP_FILTER_TLS";
1914     case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1915     case DT_HP_LAZYLOAD:        return "HP_LAZYLOAD";
1916     case DT_HP_BIND_NOW_COUNT:  return "HP_BIND_NOW_COUNT";
1917     case DT_PLT:                return "PLT";
1918     case DT_PLT_SIZE:           return "PLT_SIZE";
1919     case DT_DLT:                return "DLT";
1920     case DT_DLT_SIZE:           return "DLT_SIZE";
1921     default:
1922       return NULL;
1923     }
1924 }
1925
1926 static const char *
1927 get_ia64_dynamic_type (unsigned long type)
1928 {
1929   switch (type)
1930     {
1931     case DT_IA_64_PLT_RESERVE:         return "IA_64_PLT_RESERVE";
1932     case DT_IA_64_VMS_SUBTYPE:         return "VMS_SUBTYPE";
1933     case DT_IA_64_VMS_IMGIOCNT:        return "VMS_IMGIOCNT";
1934     case DT_IA_64_VMS_LNKFLAGS:        return "VMS_LNKFLAGS";
1935     case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1936     case DT_IA_64_VMS_IDENT:           return "VMS_IDENT";
1937     case DT_IA_64_VMS_NEEDED_IDENT:    return "VMS_NEEDED_IDENT";
1938     case DT_IA_64_VMS_IMG_RELA_CNT:    return "VMS_IMG_RELA_CNT";
1939     case DT_IA_64_VMS_SEG_RELA_CNT:    return "VMS_SEG_RELA_CNT";
1940     case DT_IA_64_VMS_FIXUP_RELA_CNT:  return "VMS_FIXUP_RELA_CNT";
1941     case DT_IA_64_VMS_FIXUP_NEEDED:    return "VMS_FIXUP_NEEDED";
1942     case DT_IA_64_VMS_SYMVEC_CNT:      return "VMS_SYMVEC_CNT";
1943     case DT_IA_64_VMS_XLATED:          return "VMS_XLATED";
1944     case DT_IA_64_VMS_STACKSIZE:       return "VMS_STACKSIZE";
1945     case DT_IA_64_VMS_UNWINDSZ:        return "VMS_UNWINDSZ";
1946     case DT_IA_64_VMS_UNWIND_CODSEG:   return "VMS_UNWIND_CODSEG";
1947     case DT_IA_64_VMS_UNWIND_INFOSEG:  return "VMS_UNWIND_INFOSEG";
1948     case DT_IA_64_VMS_LINKTIME:        return "VMS_LINKTIME";
1949     case DT_IA_64_VMS_SEG_NO:          return "VMS_SEG_NO";
1950     case DT_IA_64_VMS_SYMVEC_OFFSET:   return "VMS_SYMVEC_OFFSET";
1951     case DT_IA_64_VMS_SYMVEC_SEG:      return "VMS_SYMVEC_SEG";
1952     case DT_IA_64_VMS_UNWIND_OFFSET:   return "VMS_UNWIND_OFFSET";
1953     case DT_IA_64_VMS_UNWIND_SEG:      return "VMS_UNWIND_SEG";
1954     case DT_IA_64_VMS_STRTAB_OFFSET:   return "VMS_STRTAB_OFFSET";
1955     case DT_IA_64_VMS_SYSVER_OFFSET:   return "VMS_SYSVER_OFFSET";
1956     case DT_IA_64_VMS_IMG_RELA_OFF:    return "VMS_IMG_RELA_OFF";
1957     case DT_IA_64_VMS_SEG_RELA_OFF:    return "VMS_SEG_RELA_OFF";
1958     case DT_IA_64_VMS_FIXUP_RELA_OFF:  return "VMS_FIXUP_RELA_OFF";
1959     case DT_IA_64_VMS_PLTGOT_OFFSET:   return "VMS_PLTGOT_OFFSET";
1960     case DT_IA_64_VMS_PLTGOT_SEG:      return "VMS_PLTGOT_SEG";
1961     case DT_IA_64_VMS_FPMODE:          return "VMS_FPMODE";
1962     default:
1963       return NULL;
1964     }
1965 }
1966
1967 static const char *
1968 get_solaris_section_type (unsigned long type)
1969 {
1970   switch (type)
1971     {
1972     case 0x6fffffee: return "SUNW_ancillary";
1973     case 0x6fffffef: return "SUNW_capchain";
1974     case 0x6ffffff0: return "SUNW_capinfo";
1975     case 0x6ffffff1: return "SUNW_symsort";
1976     case 0x6ffffff2: return "SUNW_tlssort";
1977     case 0x6ffffff3: return "SUNW_LDYNSYM";
1978     case 0x6ffffff4: return "SUNW_dof";
1979     case 0x6ffffff5: return "SUNW_cap";
1980     case 0x6ffffff6: return "SUNW_SIGNATURE";
1981     case 0x6ffffff7: return "SUNW_ANNOTATE";
1982     case 0x6ffffff8: return "SUNW_DEBUGSTR";
1983     case 0x6ffffff9: return "SUNW_DEBUG";
1984     case 0x6ffffffa: return "SUNW_move";
1985     case 0x6ffffffb: return "SUNW_COMDAT";
1986     case 0x6ffffffc: return "SUNW_syminfo";
1987     case 0x6ffffffd: return "SUNW_verdef";
1988     case 0x6ffffffe: return "SUNW_verneed";
1989     case 0x6fffffff: return "SUNW_versym";
1990     case 0x70000000: return "SPARC_GOTDATA";
1991     default: return NULL;
1992     }
1993 }
1994
1995 static const char *
1996 get_alpha_dynamic_type (unsigned long type)
1997 {
1998   switch (type)
1999     {
2000     case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
2001     default: return NULL;
2002     }
2003 }
2004
2005 static const char *
2006 get_score_dynamic_type (unsigned long type)
2007 {
2008   switch (type)
2009     {
2010     case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
2011     case DT_SCORE_LOCAL_GOTNO:  return "SCORE_LOCAL_GOTNO";
2012     case DT_SCORE_SYMTABNO:     return "SCORE_SYMTABNO";
2013     case DT_SCORE_GOTSYM:       return "SCORE_GOTSYM";
2014     case DT_SCORE_UNREFEXTNO:   return "SCORE_UNREFEXTNO";
2015     case DT_SCORE_HIPAGENO:     return "SCORE_HIPAGENO";
2016     default:                    return NULL;
2017     }
2018 }
2019
2020 static const char *
2021 get_tic6x_dynamic_type (unsigned long type)
2022 {
2023   switch (type)
2024     {
2025     case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
2026     case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
2027     case DT_C6000_DSBT_BASE:   return "C6000_DSBT_BASE";
2028     case DT_C6000_DSBT_SIZE:   return "C6000_DSBT_SIZE";
2029     case DT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
2030     case DT_C6000_DSBT_INDEX:  return "C6000_DSBT_INDEX";
2031     default:                   return NULL;
2032     }
2033 }
2034
2035 static const char *
2036 get_nios2_dynamic_type (unsigned long type)
2037 {
2038   switch (type)
2039     {
2040     case DT_NIOS2_GP: return "NIOS2_GP";
2041     default:          return NULL;
2042     }
2043 }
2044
2045 static const char *
2046 get_solaris_dynamic_type (unsigned long type)
2047 {
2048   switch (type)
2049     {
2050     case 0x6000000d: return "SUNW_AUXILIARY";
2051     case 0x6000000e: return "SUNW_RTLDINF";
2052     case 0x6000000f: return "SUNW_FILTER";
2053     case 0x60000010: return "SUNW_CAP";
2054     case 0x60000011: return "SUNW_SYMTAB";
2055     case 0x60000012: return "SUNW_SYMSZ";
2056     case 0x60000013: return "SUNW_SORTENT";
2057     case 0x60000014: return "SUNW_SYMSORT";
2058     case 0x60000015: return "SUNW_SYMSORTSZ";
2059     case 0x60000016: return "SUNW_TLSSORT";
2060     case 0x60000017: return "SUNW_TLSSORTSZ";
2061     case 0x60000018: return "SUNW_CAPINFO";
2062     case 0x60000019: return "SUNW_STRPAD";
2063     case 0x6000001a: return "SUNW_CAPCHAIN";
2064     case 0x6000001b: return "SUNW_LDMACH";
2065     case 0x6000001d: return "SUNW_CAPCHAINENT";
2066     case 0x6000001f: return "SUNW_CAPCHAINSZ";
2067     case 0x60000021: return "SUNW_PARENT";
2068     case 0x60000023: return "SUNW_ASLR";
2069     case 0x60000025: return "SUNW_RELAX";
2070     case 0x60000029: return "SUNW_NXHEAP";
2071     case 0x6000002b: return "SUNW_NXSTACK";
2072
2073     case 0x70000001: return "SPARC_REGISTER";
2074     case 0x7ffffffd: return "AUXILIARY";
2075     case 0x7ffffffe: return "USED";
2076     case 0x7fffffff: return "FILTER";
2077
2078     default: return NULL;
2079     }
2080 }
2081
2082 static const char *
2083 get_dynamic_type (Filedata * filedata, unsigned long type)
2084 {
2085   static char buff[64];
2086
2087   switch (type)
2088     {
2089     case DT_NULL:       return "NULL";
2090     case DT_NEEDED:     return "NEEDED";
2091     case DT_PLTRELSZ:   return "PLTRELSZ";
2092     case DT_PLTGOT:     return "PLTGOT";
2093     case DT_HASH:       return "HASH";
2094     case DT_STRTAB:     return "STRTAB";
2095     case DT_SYMTAB:     return "SYMTAB";
2096     case DT_RELA:       return "RELA";
2097     case DT_RELASZ:     return "RELASZ";
2098     case DT_RELAENT:    return "RELAENT";
2099     case DT_STRSZ:      return "STRSZ";
2100     case DT_SYMENT:     return "SYMENT";
2101     case DT_INIT:       return "INIT";
2102     case DT_FINI:       return "FINI";
2103     case DT_SONAME:     return "SONAME";
2104     case DT_RPATH:      return "RPATH";
2105     case DT_SYMBOLIC:   return "SYMBOLIC";
2106     case DT_REL:        return "REL";
2107     case DT_RELSZ:      return "RELSZ";
2108     case DT_RELENT:     return "RELENT";
2109     case DT_PLTREL:     return "PLTREL";
2110     case DT_DEBUG:      return "DEBUG";
2111     case DT_TEXTREL:    return "TEXTREL";
2112     case DT_JMPREL:     return "JMPREL";
2113     case DT_BIND_NOW:   return "BIND_NOW";
2114     case DT_INIT_ARRAY: return "INIT_ARRAY";
2115     case DT_FINI_ARRAY: return "FINI_ARRAY";
2116     case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2117     case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
2118     case DT_RUNPATH:    return "RUNPATH";
2119     case DT_FLAGS:      return "FLAGS";
2120
2121     case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2122     case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
2123     case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX";
2124
2125     case DT_CHECKSUM:   return "CHECKSUM";
2126     case DT_PLTPADSZ:   return "PLTPADSZ";
2127     case DT_MOVEENT:    return "MOVEENT";
2128     case DT_MOVESZ:     return "MOVESZ";
2129     case DT_FEATURE:    return "FEATURE";
2130     case DT_POSFLAG_1:  return "POSFLAG_1";
2131     case DT_SYMINSZ:    return "SYMINSZ";
2132     case DT_SYMINENT:   return "SYMINENT"; /* aka VALRNGHI */
2133
2134     case DT_ADDRRNGLO:  return "ADDRRNGLO";
2135     case DT_CONFIG:     return "CONFIG";
2136     case DT_DEPAUDIT:   return "DEPAUDIT";
2137     case DT_AUDIT:      return "AUDIT";
2138     case DT_PLTPAD:     return "PLTPAD";
2139     case DT_MOVETAB:    return "MOVETAB";
2140     case DT_SYMINFO:    return "SYMINFO"; /* aka ADDRRNGHI */
2141
2142     case DT_VERSYM:     return "VERSYM";
2143
2144     case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2145     case DT_TLSDESC_PLT: return "TLSDESC_PLT";
2146     case DT_RELACOUNT:  return "RELACOUNT";
2147     case DT_RELCOUNT:   return "RELCOUNT";
2148     case DT_FLAGS_1:    return "FLAGS_1";
2149     case DT_VERDEF:     return "VERDEF";
2150     case DT_VERDEFNUM:  return "VERDEFNUM";
2151     case DT_VERNEED:    return "VERNEED";
2152     case DT_VERNEEDNUM: return "VERNEEDNUM";
2153
2154     case DT_AUXILIARY:  return "AUXILIARY";
2155     case DT_USED:       return "USED";
2156     case DT_FILTER:     return "FILTER";
2157
2158     case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2159     case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2160     case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2161     case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2162     case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
2163     case DT_GNU_HASH:   return "GNU_HASH";
2164
2165     default:
2166       if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2167         {
2168           const char * result;
2169
2170           switch (filedata->file_header.e_machine)
2171             {
2172             case EM_MIPS:
2173             case EM_MIPS_RS3_LE:
2174               result = get_mips_dynamic_type (type);
2175               break;
2176             case EM_SPARCV9:
2177               result = get_sparc64_dynamic_type (type);
2178               break;
2179             case EM_PPC:
2180               result = get_ppc_dynamic_type (type);
2181               break;
2182             case EM_PPC64:
2183               result = get_ppc64_dynamic_type (type);
2184               break;
2185             case EM_IA_64:
2186               result = get_ia64_dynamic_type (type);
2187               break;
2188             case EM_ALPHA:
2189               result = get_alpha_dynamic_type (type);
2190               break;
2191             case EM_SCORE:
2192               result = get_score_dynamic_type (type);
2193               break;
2194             case EM_TI_C6000:
2195               result = get_tic6x_dynamic_type (type);
2196               break;
2197             case EM_ALTERA_NIOS2:
2198               result = get_nios2_dynamic_type (type);
2199               break;
2200             default:
2201               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2202                 result = get_solaris_dynamic_type (type);
2203               else
2204                 result = NULL;
2205               break;
2206             }
2207
2208           if (result != NULL)
2209             return result;
2210
2211           snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2212         }
2213       else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2214                || (filedata->file_header.e_machine == EM_PARISC
2215                    && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2216         {
2217           const char * result;
2218
2219           switch (filedata->file_header.e_machine)
2220             {
2221             case EM_PARISC:
2222               result = get_parisc_dynamic_type (type);
2223               break;
2224             case EM_IA_64:
2225               result = get_ia64_dynamic_type (type);
2226               break;
2227             default:
2228               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2229                 result = get_solaris_dynamic_type (type);
2230               else
2231                 result = NULL;
2232               break;
2233             }
2234
2235           if (result != NULL)
2236             return result;
2237
2238           snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2239                     type);
2240         }
2241       else
2242         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2243
2244       return buff;
2245     }
2246 }
2247
2248 static char *
2249 get_file_type (unsigned e_type)
2250 {
2251   static char buff[32];
2252
2253   switch (e_type)
2254     {
2255     case ET_NONE: return _("NONE (None)");
2256     case ET_REL:  return _("REL (Relocatable file)");
2257     case ET_EXEC: return _("EXEC (Executable file)");
2258     case ET_DYN:  return _("DYN (Shared object file)");
2259     case ET_CORE: return _("CORE (Core file)");
2260
2261     default:
2262       if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2263         snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2264       else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2265         snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2266       else
2267         snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2268       return buff;
2269     }
2270 }
2271
2272 static char *
2273 get_machine_name (unsigned e_machine)
2274 {
2275   static char buff[64]; /* XXX */
2276
2277   switch (e_machine)
2278     {
2279       /* Please keep this switch table sorted by increasing EM_ value.  */
2280       /* 0 */
2281     case EM_NONE:               return _("None");
2282     case EM_M32:                return "WE32100";
2283     case EM_SPARC:              return "Sparc";
2284     case EM_386:                return "Intel 80386";
2285     case EM_68K:                return "MC68000";
2286     case EM_88K:                return "MC88000";
2287     case EM_IAMCU:              return "Intel MCU";
2288     case EM_860:                return "Intel 80860";
2289     case EM_MIPS:               return "MIPS R3000";
2290     case EM_S370:               return "IBM System/370";
2291       /* 10 */
2292     case EM_MIPS_RS3_LE:        return "MIPS R4000 big-endian";
2293     case EM_OLD_SPARCV9:        return "Sparc v9 (old)";
2294     case EM_PARISC:             return "HPPA";
2295     case EM_VPP550:             return "Fujitsu VPP500";
2296     case EM_SPARC32PLUS:        return "Sparc v8+" ;
2297     case EM_960:                return "Intel 80960";
2298     case EM_PPC:                return "PowerPC";
2299       /* 20 */
2300     case EM_PPC64:              return "PowerPC64";
2301     case EM_S390_OLD:
2302     case EM_S390:               return "IBM S/390";
2303     case EM_SPU:                return "SPU";
2304       /* 30 */
2305     case EM_V800:               return "Renesas V850 (using RH850 ABI)";
2306     case EM_FR20:               return "Fujitsu FR20";
2307     case EM_RH32:               return "TRW RH32";
2308     case EM_MCORE:              return "MCORE";
2309       /* 40 */
2310     case EM_ARM:                return "ARM";
2311     case EM_OLD_ALPHA:          return "Digital Alpha (old)";
2312     case EM_SH:                 return "Renesas / SuperH SH";
2313     case EM_SPARCV9:            return "Sparc v9";
2314     case EM_TRICORE:            return "Siemens Tricore";
2315     case EM_ARC:                return "ARC";
2316     case EM_H8_300:             return "Renesas H8/300";
2317     case EM_H8_300H:            return "Renesas H8/300H";
2318     case EM_H8S:                return "Renesas H8S";
2319     case EM_H8_500:             return "Renesas H8/500";
2320       /* 50 */
2321     case EM_IA_64:              return "Intel IA-64";
2322     case EM_MIPS_X:             return "Stanford MIPS-X";
2323     case EM_COLDFIRE:           return "Motorola Coldfire";
2324     case EM_68HC12:             return "Motorola MC68HC12 Microcontroller";
2325     case EM_MMA:                return "Fujitsu Multimedia Accelerator";
2326     case EM_PCP:                return "Siemens PCP";
2327     case EM_NCPU:               return "Sony nCPU embedded RISC processor";
2328     case EM_NDR1:               return "Denso NDR1 microprocesspr";
2329     case EM_STARCORE:           return "Motorola Star*Core processor";
2330     case EM_ME16:               return "Toyota ME16 processor";
2331       /* 60 */
2332     case EM_ST100:              return "STMicroelectronics ST100 processor";
2333     case EM_TINYJ:              return "Advanced Logic Corp. TinyJ embedded processor";
2334     case EM_X86_64:             return "Advanced Micro Devices X86-64";
2335     case EM_PDSP:               return "Sony DSP processor";
2336     case EM_PDP10:              return "Digital Equipment Corp. PDP-10";
2337     case EM_PDP11:              return "Digital Equipment Corp. PDP-11";
2338     case EM_FX66:               return "Siemens FX66 microcontroller";
2339     case EM_ST9PLUS:            return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2340     case EM_ST7:                return "STMicroelectronics ST7 8-bit microcontroller";
2341     case EM_68HC16:             return "Motorola MC68HC16 Microcontroller";
2342       /* 70 */
2343     case EM_68HC11:             return "Motorola MC68HC11 Microcontroller";
2344     case EM_68HC08:             return "Motorola MC68HC08 Microcontroller";
2345     case EM_68HC05:             return "Motorola MC68HC05 Microcontroller";
2346     case EM_SVX:                return "Silicon Graphics SVx";
2347     case EM_ST19:               return "STMicroelectronics ST19 8-bit microcontroller";
2348     case EM_VAX:                return "Digital VAX";
2349     case EM_CRIS:               return "Axis Communications 32-bit embedded processor";
2350     case EM_JAVELIN:            return "Infineon Technologies 32-bit embedded cpu";
2351     case EM_FIREPATH:           return "Element 14 64-bit DSP processor";
2352     case EM_ZSP:                return "LSI Logic's 16-bit DSP processor";
2353       /* 80 */
2354     case EM_MMIX:               return "Donald Knuth's educational 64-bit processor";
2355     case EM_HUANY:              return "Harvard Universitys's machine-independent object format";
2356     case EM_PRISM:              return "Vitesse Prism";
2357     case EM_AVR_OLD:
2358     case EM_AVR:                return "Atmel AVR 8-bit microcontroller";
2359     case EM_CYGNUS_FR30:
2360     case EM_FR30:               return "Fujitsu FR30";
2361     case EM_CYGNUS_D10V:
2362     case EM_D10V:               return "d10v";
2363     case EM_CYGNUS_D30V:
2364     case EM_D30V:               return "d30v";
2365     case EM_CYGNUS_V850:
2366     case EM_V850:               return "Renesas V850";
2367     case EM_CYGNUS_M32R:
2368     case EM_M32R:               return "Renesas M32R (formerly Mitsubishi M32r)";
2369     case EM_CYGNUS_MN10300:
2370     case EM_MN10300:            return "mn10300";
2371       /* 90 */
2372     case EM_CYGNUS_MN10200:
2373     case EM_MN10200:            return "mn10200";
2374     case EM_PJ:                 return "picoJava";
2375     case EM_OR1K:               return "OpenRISC 1000";
2376     case EM_ARC_COMPACT:        return "ARCompact";
2377     case EM_XTENSA_OLD:
2378     case EM_XTENSA:             return "Tensilica Xtensa Processor";
2379     case EM_VIDEOCORE:          return "Alphamosaic VideoCore processor";
2380     case EM_TMM_GPP:            return "Thompson Multimedia General Purpose Processor";
2381     case EM_NS32K:              return "National Semiconductor 32000 series";
2382     case EM_TPC:                return "Tenor Network TPC processor";
2383     case EM_SNP1K:              return "Trebia SNP 1000 processor";
2384       /* 100 */
2385     case EM_ST200:              return "STMicroelectronics ST200 microcontroller";  
2386     case EM_IP2K_OLD:
2387     case EM_IP2K:               return "Ubicom IP2xxx 8-bit microcontrollers";
2388     case EM_MAX:                return "MAX Processor";
2389     case EM_CR:                 return "National Semiconductor CompactRISC";
2390     case EM_F2MC16:             return "Fujitsu F2MC16";
2391     case EM_MSP430:             return "Texas Instruments msp430 microcontroller";
2392     case EM_BLACKFIN:           return "Analog Devices Blackfin";
2393     case EM_SE_C33:             return "S1C33 Family of Seiko Epson processors";
2394     case EM_SEP:                return "Sharp embedded microprocessor";
2395     case EM_ARCA:               return "Arca RISC microprocessor";
2396       /* 110 */
2397     case EM_UNICORE:            return "Unicore";
2398     case EM_EXCESS:             return "eXcess 16/32/64-bit configurable embedded CPU";
2399     case EM_DXP:                return "Icera Semiconductor Inc. Deep Execution Processor";
2400     case EM_ALTERA_NIOS2:       return "Altera Nios II";
2401     case EM_CRX:                return "National Semiconductor CRX microprocessor";
2402     case EM_XGATE:              return "Motorola XGATE embedded processor";
2403     case EM_C166:
2404     case EM_XC16X:              return "Infineon Technologies xc16x";
2405     case EM_M16C:               return "Renesas M16C series microprocessors";
2406     case EM_DSPIC30F:           return "Microchip Technology dsPIC30F Digital Signal Controller";
2407     case EM_CE:                 return "Freescale Communication Engine RISC core";
2408       /* 120 */
2409     case EM_M32C:               return "Renesas M32c";
2410       /* 130 */
2411     case EM_TSK3000:            return "Altium TSK3000 core";
2412     case EM_RS08:               return "Freescale RS08 embedded processor";
2413     case EM_ECOG2:              return "Cyan Technology eCOG2 microprocessor";
2414     case EM_SCORE:              return "SUNPLUS S+Core";
2415     case EM_DSP24:              return "New Japan Radio (NJR) 24-bit DSP Processor";
2416     case EM_VIDEOCORE3:         return "Broadcom VideoCore III processor";
2417     case EM_LATTICEMICO32:      return "Lattice Mico32";
2418     case EM_SE_C17:             return "Seiko Epson C17 family";
2419       /* 140 */
2420     case EM_TI_C6000:           return "Texas Instruments TMS320C6000 DSP family";
2421     case EM_TI_C2000:           return "Texas Instruments TMS320C2000 DSP family";
2422     case EM_TI_C5500:           return "Texas Instruments TMS320C55x DSP family";
2423     case EM_TI_PRU:             return "TI PRU I/O processor";
2424       /* 160 */
2425     case EM_MMDSP_PLUS:         return "STMicroelectronics 64bit VLIW Data Signal Processor";
2426     case EM_CYPRESS_M8C:        return "Cypress M8C microprocessor";
2427     case EM_R32C:               return "Renesas R32C series microprocessors";
2428     case EM_TRIMEDIA:           return "NXP Semiconductors TriMedia architecture family";
2429     case EM_QDSP6:              return "QUALCOMM DSP6 Processor";
2430     case EM_8051:               return "Intel 8051 and variants";
2431     case EM_STXP7X:             return "STMicroelectronics STxP7x family";
2432     case EM_NDS32:              return "Andes Technology compact code size embedded RISC processor family";
2433     case EM_ECOG1X:             return "Cyan Technology eCOG1X family";
2434     case EM_MAXQ30:             return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2435       /* 170 */
2436     case EM_XIMO16:             return "New Japan Radio (NJR) 16-bit DSP Processor";
2437     case EM_MANIK:              return "M2000 Reconfigurable RISC Microprocessor";
2438     case EM_CRAYNV2:            return "Cray Inc. NV2 vector architecture";
2439     case EM_RX:                 return "Renesas RX";
2440     case EM_METAG:              return "Imagination Technologies Meta processor architecture";
2441     case EM_MCST_ELBRUS:        return "MCST Elbrus general purpose hardware architecture";
2442     case EM_ECOG16:             return "Cyan Technology eCOG16 family";
2443     case EM_CR16:
2444     case EM_MICROBLAZE:
2445     case EM_MICROBLAZE_OLD:     return "Xilinx MicroBlaze";
2446     case EM_ETPU:               return "Freescale Extended Time Processing Unit";
2447     case EM_SLE9X:              return "Infineon Technologies SLE9X core";
2448       /* 180 */
2449     case EM_L1OM:               return "Intel L1OM";
2450     case EM_K1OM:               return "Intel K1OM";
2451     case EM_INTEL182:           return "Intel (reserved)";
2452     case EM_AARCH64:            return "AArch64";
2453     case EM_ARM184:             return "ARM (reserved)";
2454     case EM_AVR32:              return "Atmel Corporation 32-bit microprocessor";
2455     case EM_STM8:               return "STMicroeletronics STM8 8-bit microcontroller";
2456     case EM_TILE64:             return "Tilera TILE64 multicore architecture family";
2457     case EM_TILEPRO:            return "Tilera TILEPro multicore architecture family";
2458       /* 190 */
2459     case EM_CUDA:               return "NVIDIA CUDA architecture";
2460     case EM_TILEGX:             return "Tilera TILE-Gx multicore architecture family";
2461     case EM_CLOUDSHIELD:        return "CloudShield architecture family";
2462     case EM_COREA_1ST:          return "KIPO-KAIST Core-A 1st generation processor family";
2463     case EM_COREA_2ND:          return "KIPO-KAIST Core-A 2nd generation processor family";
2464     case EM_ARC_COMPACT2:       return "ARCv2";
2465     case EM_OPEN8:              return "Open8 8-bit RISC soft processor core";
2466     case EM_RL78:               return "Renesas RL78";
2467     case EM_VIDEOCORE5:         return "Broadcom VideoCore V processor";
2468     case EM_78K0R:              return "Renesas 78K0R";
2469       /* 200 */
2470     case EM_56800EX:            return "Freescale 56800EX Digital Signal Controller (DSC)";
2471     case EM_BA1:                return "Beyond BA1 CPU architecture";
2472     case EM_BA2:                return "Beyond BA2 CPU architecture";
2473     case EM_XCORE:              return "XMOS xCORE processor family";
2474     case EM_MCHP_PIC:           return "Microchip 8-bit PIC(r) family";
2475       /* 210 */
2476     case EM_KM32:               return "KM211 KM32 32-bit processor";
2477     case EM_KMX32:              return "KM211 KMX32 32-bit processor";
2478     case EM_KMX16:              return "KM211 KMX16 16-bit processor";
2479     case EM_KMX8:               return "KM211 KMX8 8-bit processor";
2480     case EM_KVARC:              return "KM211 KVARC processor";
2481     case EM_CDP:                return "Paneve CDP architecture family";
2482     case EM_COGE:               return "Cognitive Smart Memory Processor";
2483     case EM_COOL:               return "Bluechip Systems CoolEngine";
2484     case EM_NORC:               return "Nanoradio Optimized RISC";
2485     case EM_CSR_KALIMBA:        return "CSR Kalimba architecture family";
2486       /* 220 */
2487     case EM_Z80:                return "Zilog Z80";
2488     case EM_VISIUM:             return "CDS VISIUMcore processor";
2489     case EM_FT32:               return "FTDI Chip FT32";
2490     case EM_MOXIE:              return "Moxie";
2491     case EM_AMDGPU:             return "AMD GPU";
2492     case EM_RISCV:              return "RISC-V";
2493     case EM_LANAI:              return "Lanai 32-bit processor";
2494     case EM_BPF:                return "Linux BPF";
2495     case EM_NFP:                return "Netronome Flow Processor";
2496
2497       /* Large numbers...  */
2498     case EM_MT:                 return "Morpho Techologies MT processor";
2499     case EM_ALPHA:              return "Alpha";
2500     case EM_WEBASSEMBLY:        return "Web Assembly";
2501     case EM_DLX:                return "OpenDLX";  
2502     case EM_XSTORMY16:          return "Sanyo XStormy16 CPU core";
2503     case EM_IQ2000:             return "Vitesse IQ2000";
2504     case EM_M32C_OLD:
2505     case EM_NIOS32:             return "Altera Nios";
2506     case EM_CYGNUS_MEP:         return "Toshiba MeP Media Engine";
2507     case EM_ADAPTEVA_EPIPHANY:  return "Adapteva EPIPHANY";
2508     case EM_CYGNUS_FRV:         return "Fujitsu FR-V";
2509     case EM_S12Z:               return "Freescale S12Z";
2510     case EM_CSKY:               return "C-SKY";
2511
2512     default:
2513       snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2514       return buff;
2515     }
2516 }
2517
2518 static void
2519 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2520 {
2521   /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2.  Some
2522      other compilers don't a specific architecture type in the e_flags, and
2523      instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2524      architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2525      architectures.
2526
2527      Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2528      but also sets a specific architecture type in the e_flags field.
2529
2530      However, when decoding the flags we don't worry if we see an
2531      unexpected pairing, for example EM_ARC_COMPACT machine type, with
2532      ARCEM architecture type.  */
2533
2534   switch (e_flags & EF_ARC_MACH_MSK)
2535     {
2536       /* We only expect these to occur for EM_ARC_COMPACT2.  */
2537     case EF_ARC_CPU_ARCV2EM:
2538       strcat (buf, ", ARC EM");
2539       break;
2540     case EF_ARC_CPU_ARCV2HS:
2541       strcat (buf, ", ARC HS");
2542       break;
2543
2544       /* We only expect these to occur for EM_ARC_COMPACT.  */
2545     case E_ARC_MACH_ARC600:
2546       strcat (buf, ", ARC600");
2547       break;
2548     case E_ARC_MACH_ARC601:
2549       strcat (buf, ", ARC601");
2550       break;
2551     case E_ARC_MACH_ARC700:
2552       strcat (buf, ", ARC700");
2553       break;
2554
2555       /* The only times we should end up here are (a) A corrupt ELF, (b) A
2556          new ELF with new architecture being read by an old version of
2557          readelf, or (c) An ELF built with non-GNU compiler that does not
2558          set the architecture in the e_flags.  */
2559     default:
2560       if (e_machine == EM_ARC_COMPACT)
2561         strcat (buf, ", Unknown ARCompact");
2562       else
2563         strcat (buf, ", Unknown ARC");
2564       break;
2565     }
2566
2567   switch (e_flags & EF_ARC_OSABI_MSK)
2568     {
2569     case E_ARC_OSABI_ORIG:
2570       strcat (buf, ", (ABI:legacy)");
2571       break;
2572     case E_ARC_OSABI_V2:
2573       strcat (buf, ", (ABI:v2)");
2574       break;
2575       /* Only upstream 3.9+ kernels will support ARCv2 ISA.  */
2576     case E_ARC_OSABI_V3:
2577       strcat (buf, ", v3 no-legacy-syscalls ABI");
2578       break;
2579     case E_ARC_OSABI_V4:
2580       strcat (buf, ", v4 ABI");
2581       break;
2582     default:
2583       strcat (buf, ", unrecognised ARC OSABI flag");
2584       break;
2585     }
2586 }
2587
2588 static void
2589 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2590 {
2591   unsigned eabi;
2592   bfd_boolean unknown = FALSE;
2593
2594   eabi = EF_ARM_EABI_VERSION (e_flags);
2595   e_flags &= ~ EF_ARM_EABIMASK;
2596
2597   /* Handle "generic" ARM flags.  */
2598   if (e_flags & EF_ARM_RELEXEC)
2599     {
2600       strcat (buf, ", relocatable executable");
2601       e_flags &= ~ EF_ARM_RELEXEC;
2602     }
2603
2604   if (e_flags & EF_ARM_PIC)
2605     {
2606       strcat (buf, ", position independent");
2607       e_flags &= ~ EF_ARM_PIC;
2608     }
2609
2610   /* Now handle EABI specific flags.  */
2611   switch (eabi)
2612     {
2613     default:
2614       strcat (buf, ", <unrecognized EABI>");
2615       if (e_flags)
2616         unknown = TRUE;
2617       break;
2618
2619     case EF_ARM_EABI_VER1:
2620       strcat (buf, ", Version1 EABI");
2621       while (e_flags)
2622         {
2623           unsigned flag;
2624
2625           /* Process flags one bit at a time.  */
2626           flag = e_flags & - e_flags;
2627           e_flags &= ~ flag;
2628
2629           switch (flag)
2630             {
2631             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2632               strcat (buf, ", sorted symbol tables");
2633               break;
2634
2635             default:
2636               unknown = TRUE;
2637               break;
2638             }
2639         }
2640       break;
2641
2642     case EF_ARM_EABI_VER2:
2643       strcat (buf, ", Version2 EABI");
2644       while (e_flags)
2645         {
2646           unsigned flag;
2647
2648           /* Process flags one bit at a time.  */
2649           flag = e_flags & - e_flags;
2650           e_flags &= ~ flag;
2651
2652           switch (flag)
2653             {
2654             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2655               strcat (buf, ", sorted symbol tables");
2656               break;
2657
2658             case EF_ARM_DYNSYMSUSESEGIDX:
2659               strcat (buf, ", dynamic symbols use segment index");
2660               break;
2661
2662             case EF_ARM_MAPSYMSFIRST:
2663               strcat (buf, ", mapping symbols precede others");
2664               break;
2665
2666             default:
2667               unknown = TRUE;
2668               break;
2669             }
2670         }
2671       break;
2672
2673     case EF_ARM_EABI_VER3:
2674       strcat (buf, ", Version3 EABI");
2675       break;
2676
2677     case EF_ARM_EABI_VER4:
2678       strcat (buf, ", Version4 EABI");
2679       while (e_flags)
2680         {
2681           unsigned flag;
2682
2683           /* Process flags one bit at a time.  */
2684           flag = e_flags & - e_flags;
2685           e_flags &= ~ flag;
2686
2687           switch (flag)
2688             {
2689             case EF_ARM_BE8:
2690               strcat (buf, ", BE8");
2691               break;
2692
2693             case EF_ARM_LE8:
2694               strcat (buf, ", LE8");
2695               break;
2696
2697             default:
2698               unknown = TRUE;
2699               break;
2700             }
2701         }
2702       break;
2703
2704     case EF_ARM_EABI_VER5:
2705       strcat (buf, ", Version5 EABI");
2706       while (e_flags)
2707         {
2708           unsigned flag;
2709
2710           /* Process flags one bit at a time.  */
2711           flag = e_flags & - e_flags;
2712           e_flags &= ~ flag;
2713
2714           switch (flag)
2715             {
2716             case EF_ARM_BE8:
2717               strcat (buf, ", BE8");
2718               break;
2719
2720             case EF_ARM_LE8:
2721               strcat (buf, ", LE8");
2722               break;
2723
2724             case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT.  */
2725               strcat (buf, ", soft-float ABI");
2726               break;
2727
2728             case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT.  */
2729               strcat (buf, ", hard-float ABI");
2730               break;
2731
2732             default:
2733               unknown = TRUE;
2734               break;
2735             }
2736         }
2737       break;
2738
2739     case EF_ARM_EABI_UNKNOWN:
2740       strcat (buf, ", GNU EABI");
2741       while (e_flags)
2742         {
2743           unsigned flag;
2744
2745           /* Process flags one bit at a time.  */
2746           flag = e_flags & - e_flags;
2747           e_flags &= ~ flag;
2748
2749           switch (flag)
2750             {
2751             case EF_ARM_INTERWORK:
2752               strcat (buf, ", interworking enabled");
2753               break;
2754
2755             case EF_ARM_APCS_26:
2756               strcat (buf, ", uses APCS/26");
2757               break;
2758
2759             case EF_ARM_APCS_FLOAT:
2760               strcat (buf, ", uses APCS/float");
2761               break;
2762
2763             case EF_ARM_PIC:
2764               strcat (buf, ", position independent");
2765               break;
2766
2767             case EF_ARM_ALIGN8:
2768               strcat (buf, ", 8 bit structure alignment");
2769               break;
2770
2771             case EF_ARM_NEW_ABI:
2772               strcat (buf, ", uses new ABI");
2773               break;
2774
2775             case EF_ARM_OLD_ABI:
2776               strcat (buf, ", uses old ABI");
2777               break;
2778
2779             case EF_ARM_SOFT_FLOAT:
2780               strcat (buf, ", software FP");
2781               break;
2782
2783             case EF_ARM_VFP_FLOAT:
2784               strcat (buf, ", VFP");
2785               break;
2786
2787             case EF_ARM_MAVERICK_FLOAT:
2788               strcat (buf, ", Maverick FP");
2789               break;
2790
2791             default:
2792               unknown = TRUE;
2793               break;
2794             }
2795         }
2796     }
2797
2798   if (unknown)
2799     strcat (buf,_(", <unknown>"));
2800 }
2801
2802 static void
2803 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2804 {
2805   --size; /* Leave space for null terminator.  */
2806
2807   switch (e_flags & EF_AVR_MACH)
2808     {
2809     case E_AVR_MACH_AVR1:
2810       strncat (buf, ", avr:1", size);
2811       break;
2812     case E_AVR_MACH_AVR2:
2813       strncat (buf, ", avr:2", size);
2814       break;
2815     case E_AVR_MACH_AVR25:
2816       strncat (buf, ", avr:25", size);
2817       break;
2818     case E_AVR_MACH_AVR3:
2819       strncat (buf, ", avr:3", size);
2820       break;
2821     case E_AVR_MACH_AVR31:
2822       strncat (buf, ", avr:31", size);
2823       break;
2824     case E_AVR_MACH_AVR35:
2825       strncat (buf, ", avr:35", size);
2826       break;
2827     case E_AVR_MACH_AVR4:
2828       strncat (buf, ", avr:4", size);
2829       break;
2830     case E_AVR_MACH_AVR5:
2831       strncat (buf, ", avr:5", size);
2832       break;
2833     case E_AVR_MACH_AVR51:
2834       strncat (buf, ", avr:51", size);
2835       break;
2836     case E_AVR_MACH_AVR6:
2837       strncat (buf, ", avr:6", size);
2838       break;
2839     case E_AVR_MACH_AVRTINY:
2840       strncat (buf, ", avr:100", size);
2841       break;
2842     case E_AVR_MACH_XMEGA1:
2843       strncat (buf, ", avr:101", size);
2844       break;
2845     case E_AVR_MACH_XMEGA2:
2846       strncat (buf, ", avr:102", size);
2847       break;
2848     case E_AVR_MACH_XMEGA3:
2849       strncat (buf, ", avr:103", size);
2850       break;
2851     case E_AVR_MACH_XMEGA4:
2852       strncat (buf, ", avr:104", size);
2853       break;
2854     case E_AVR_MACH_XMEGA5:
2855       strncat (buf, ", avr:105", size);
2856       break;
2857     case E_AVR_MACH_XMEGA6:
2858       strncat (buf, ", avr:106", size);
2859       break;
2860     case E_AVR_MACH_XMEGA7:
2861       strncat (buf, ", avr:107", size);
2862       break;
2863     default:
2864       strncat (buf, ", avr:<unknown>", size);
2865       break;
2866     }
2867
2868   size -= strlen (buf);
2869   if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2870     strncat (buf, ", link-relax", size);
2871 }
2872
2873 static void
2874 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2875 {
2876   unsigned abi;
2877   unsigned arch;
2878   unsigned config;
2879   unsigned version;
2880   bfd_boolean has_fpu = FALSE;
2881   unsigned int r = 0;
2882
2883   static const char *ABI_STRINGS[] =
2884   {
2885     "ABI v0", /* use r5 as return register; only used in N1213HC */
2886     "ABI v1", /* use r0 as return register */
2887     "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2888     "ABI v2fp", /* for FPU */
2889     "AABI",
2890     "ABI2 FP+"
2891   };
2892   static const char *VER_STRINGS[] =
2893   {
2894     "Andes ELF V1.3 or older",
2895     "Andes ELF V1.3.1",
2896     "Andes ELF V1.4"
2897   };
2898   static const char *ARCH_STRINGS[] =
2899   {
2900     "",
2901     "Andes Star v1.0",
2902     "Andes Star v2.0",
2903     "Andes Star v3.0",
2904     "Andes Star v3.0m"
2905   };
2906
2907   abi = EF_NDS_ABI & e_flags;
2908   arch = EF_NDS_ARCH & e_flags;
2909   config = EF_NDS_INST & e_flags;
2910   version = EF_NDS32_ELF_VERSION & e_flags;
2911
2912   memset (buf, 0, size);
2913
2914   switch (abi)
2915     {
2916     case E_NDS_ABI_V0:
2917     case E_NDS_ABI_V1:
2918     case E_NDS_ABI_V2:
2919     case E_NDS_ABI_V2FP:
2920     case E_NDS_ABI_AABI:
2921     case E_NDS_ABI_V2FP_PLUS:
2922       /* In case there are holes in the array.  */
2923       r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2924       break;
2925
2926     default:
2927       r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2928       break;
2929     }
2930
2931   switch (version)
2932     {
2933     case E_NDS32_ELF_VER_1_2:
2934     case E_NDS32_ELF_VER_1_3:
2935     case E_NDS32_ELF_VER_1_4:
2936       r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2937       break;
2938
2939     default:
2940       r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2941       break;
2942     }
2943
2944   if (E_NDS_ABI_V0 == abi)
2945     {
2946       /* OLD ABI; only used in N1213HC, has performance extension 1.  */
2947       r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2948       if (arch == E_NDS_ARCH_STAR_V1_0)
2949         r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2950       return;
2951     }
2952
2953   switch (arch)
2954     {
2955     case E_NDS_ARCH_STAR_V1_0:
2956     case E_NDS_ARCH_STAR_V2_0:
2957     case E_NDS_ARCH_STAR_V3_0:
2958     case E_NDS_ARCH_STAR_V3_M:
2959       r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2960       break;
2961
2962     default:
2963       r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2964       /* ARCH version determines how the e_flags are interpreted.
2965          If it is unknown, we cannot proceed.  */
2966       return;
2967     }
2968
2969   /* Newer ABI; Now handle architecture specific flags.  */
2970   if (arch == E_NDS_ARCH_STAR_V1_0)
2971     {
2972       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2973         r += snprintf (buf + r, size -r, ", MFUSR_PC");
2974
2975       if (!(config & E_NDS32_HAS_NO_MAC_INST))
2976         r += snprintf (buf + r, size -r, ", MAC");
2977
2978       if (config & E_NDS32_HAS_DIV_INST)
2979         r += snprintf (buf + r, size -r, ", DIV");
2980
2981       if (config & E_NDS32_HAS_16BIT_INST)
2982         r += snprintf (buf + r, size -r, ", 16b");
2983     }
2984   else
2985     {
2986       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2987         {
2988           if (version <= E_NDS32_ELF_VER_1_3)
2989             r += snprintf (buf + r, size -r, ", [B8]");
2990           else
2991             r += snprintf (buf + r, size -r, ", EX9");
2992         }
2993
2994       if (config & E_NDS32_HAS_MAC_DX_INST)
2995         r += snprintf (buf + r, size -r, ", MAC_DX");
2996
2997       if (config & E_NDS32_HAS_DIV_DX_INST)
2998         r += snprintf (buf + r, size -r, ", DIV_DX");
2999
3000       if (config & E_NDS32_HAS_16BIT_INST)
3001         {
3002           if (version <= E_NDS32_ELF_VER_1_3)
3003             r += snprintf (buf + r, size -r, ", 16b");
3004           else
3005             r += snprintf (buf + r, size -r, ", IFC");
3006         }
3007     }
3008
3009   if (config & E_NDS32_HAS_EXT_INST)
3010     r += snprintf (buf + r, size -r, ", PERF1");
3011
3012   if (config & E_NDS32_HAS_EXT2_INST)
3013     r += snprintf (buf + r, size -r, ", PERF2");
3014
3015   if (config & E_NDS32_HAS_FPU_INST)
3016     {
3017       has_fpu = TRUE;
3018       r += snprintf (buf + r, size -r, ", FPU_SP");
3019     }
3020
3021   if (config & E_NDS32_HAS_FPU_DP_INST)
3022     {
3023       has_fpu = TRUE;
3024       r += snprintf (buf + r, size -r, ", FPU_DP");
3025     }
3026
3027   if (config & E_NDS32_HAS_FPU_MAC_INST)
3028     {
3029       has_fpu = TRUE;
3030       r += snprintf (buf + r, size -r, ", FPU_MAC");
3031     }
3032
3033   if (has_fpu)
3034     {
3035       switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
3036         {
3037         case E_NDS32_FPU_REG_8SP_4DP:
3038           r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
3039           break;
3040         case E_NDS32_FPU_REG_16SP_8DP:
3041           r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
3042           break;
3043         case E_NDS32_FPU_REG_32SP_16DP:
3044           r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
3045           break;
3046         case E_NDS32_FPU_REG_32SP_32DP:
3047           r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
3048           break;
3049         }
3050     }
3051
3052   if (config & E_NDS32_HAS_AUDIO_INST)
3053     r += snprintf (buf + r, size -r, ", AUDIO");
3054
3055   if (config & E_NDS32_HAS_STRING_INST)
3056     r += snprintf (buf + r, size -r, ", STR");
3057
3058   if (config & E_NDS32_HAS_REDUCED_REGS)
3059     r += snprintf (buf + r, size -r, ", 16REG");
3060
3061   if (config & E_NDS32_HAS_VIDEO_INST)
3062     {
3063       if (version <= E_NDS32_ELF_VER_1_3)
3064         r += snprintf (buf + r, size -r, ", VIDEO");
3065       else
3066         r += snprintf (buf + r, size -r, ", SATURATION");
3067     }
3068
3069   if (config & E_NDS32_HAS_ENCRIPT_INST)
3070     r += snprintf (buf + r, size -r, ", ENCRP");
3071
3072   if (config & E_NDS32_HAS_L2C_INST)
3073     r += snprintf (buf + r, size -r, ", L2C");
3074 }
3075
3076 static char *
3077 get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine)
3078 {
3079   static char buf[1024];
3080
3081   buf[0] = '\0';
3082
3083   if (e_flags)
3084     {
3085       switch (e_machine)
3086         {
3087         default:
3088           break;
3089
3090         case EM_ARC_COMPACT2:
3091         case EM_ARC_COMPACT:
3092           decode_ARC_machine_flags (e_flags, e_machine, buf);
3093           break;
3094
3095         case EM_ARM:
3096           decode_ARM_machine_flags (e_flags, buf);
3097           break;
3098
3099         case EM_AVR:
3100           decode_AVR_machine_flags (e_flags, buf, sizeof buf);
3101           break;
3102
3103         case EM_BLACKFIN:
3104           if (e_flags & EF_BFIN_PIC)
3105             strcat (buf, ", PIC");
3106
3107           if (e_flags & EF_BFIN_FDPIC)
3108             strcat (buf, ", FDPIC");
3109
3110           if (e_flags & EF_BFIN_CODE_IN_L1)
3111             strcat (buf, ", code in L1");
3112
3113           if (e_flags & EF_BFIN_DATA_IN_L1)
3114             strcat (buf, ", data in L1");
3115
3116           break;
3117
3118         case EM_CYGNUS_FRV:
3119           switch (e_flags & EF_FRV_CPU_MASK)
3120             {
3121             case EF_FRV_CPU_GENERIC:
3122               break;
3123
3124             default:
3125               strcat (buf, ", fr???");
3126               break;
3127
3128             case EF_FRV_CPU_FR300:
3129               strcat (buf, ", fr300");
3130               break;
3131
3132             case EF_FRV_CPU_FR400:
3133               strcat (buf, ", fr400");
3134               break;
3135             case EF_FRV_CPU_FR405:
3136               strcat (buf, ", fr405");
3137               break;
3138
3139             case EF_FRV_CPU_FR450:
3140               strcat (buf, ", fr450");
3141               break;
3142
3143             case EF_FRV_CPU_FR500:
3144               strcat (buf, ", fr500");
3145               break;
3146             case EF_FRV_CPU_FR550:
3147               strcat (buf, ", fr550");
3148               break;
3149
3150             case EF_FRV_CPU_SIMPLE:
3151               strcat (buf, ", simple");
3152               break;
3153             case EF_FRV_CPU_TOMCAT:
3154               strcat (buf, ", tomcat");
3155               break;
3156             }
3157           break;
3158
3159         case EM_68K:
3160           if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
3161             strcat (buf, ", m68000");
3162           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
3163             strcat (buf, ", cpu32");
3164           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
3165             strcat (buf, ", fido_a");
3166           else
3167             {
3168               char const * isa = _("unknown");
3169               char const * mac = _("unknown mac");
3170               char const * additional = NULL;
3171
3172               switch (e_flags & EF_M68K_CF_ISA_MASK)
3173                 {
3174                 case EF_M68K_CF_ISA_A_NODIV:
3175                   isa = "A";
3176                   additional = ", nodiv";
3177                   break;
3178                 case EF_M68K_CF_ISA_A:
3179                   isa = "A";
3180                   break;
3181                 case EF_M68K_CF_ISA_A_PLUS:
3182                   isa = "A+";
3183                   break;
3184                 case EF_M68K_CF_ISA_B_NOUSP:
3185                   isa = "B";
3186                   additional = ", nousp";
3187                   break;
3188                 case EF_M68K_CF_ISA_B:
3189                   isa = "B";
3190                   break;
3191                 case EF_M68K_CF_ISA_C:
3192                   isa = "C";
3193                   break;
3194                 case EF_M68K_CF_ISA_C_NODIV:
3195                   isa = "C";
3196                   additional = ", nodiv";
3197                   break;
3198                 }
3199               strcat (buf, ", cf, isa ");
3200               strcat (buf, isa);
3201               if (additional)
3202                 strcat (buf, additional);
3203               if (e_flags & EF_M68K_CF_FLOAT)
3204                 strcat (buf, ", float");
3205               switch (e_flags & EF_M68K_CF_MAC_MASK)
3206                 {
3207                 case 0:
3208                   mac = NULL;
3209                   break;
3210                 case EF_M68K_CF_MAC:
3211                   mac = "mac";
3212                   break;
3213                 case EF_M68K_CF_EMAC:
3214                   mac = "emac";
3215                   break;
3216                 case EF_M68K_CF_EMAC_B:
3217                   mac = "emac_b";
3218                   break;
3219                 }
3220               if (mac)
3221                 {
3222                   strcat (buf, ", ");
3223                   strcat (buf, mac);
3224                 }
3225             }
3226           break;
3227
3228         case EM_CYGNUS_MEP:
3229           switch (e_flags & EF_MEP_CPU_MASK)
3230             {
3231             case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3232             case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3233             case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3234             case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3235             case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3236             case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3237             default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3238             }
3239
3240           switch (e_flags & EF_MEP_COP_MASK)
3241             {
3242             case EF_MEP_COP_NONE: break;
3243             case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3244             case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3245             case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3246             case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3247             default: strcat (buf, _("<unknown MeP copro type>")); break;
3248             }
3249
3250           if (e_flags & EF_MEP_LIBRARY)
3251             strcat (buf, ", Built for Library");
3252
3253           if (e_flags & EF_MEP_INDEX_MASK)
3254             sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3255                      e_flags & EF_MEP_INDEX_MASK);
3256
3257           if (e_flags & ~ EF_MEP_ALL_FLAGS)
3258             sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3259                      e_flags & ~ EF_MEP_ALL_FLAGS);
3260           break;
3261
3262         case EM_PPC:
3263           if (e_flags & EF_PPC_EMB)
3264             strcat (buf, ", emb");
3265
3266           if (e_flags & EF_PPC_RELOCATABLE)
3267             strcat (buf, _(", relocatable"));
3268
3269           if (e_flags & EF_PPC_RELOCATABLE_LIB)
3270             strcat (buf, _(", relocatable-lib"));
3271           break;
3272
3273         case EM_PPC64:
3274           if (e_flags & EF_PPC64_ABI)
3275             {
3276               char abi[] = ", abiv0";
3277
3278               abi[6] += e_flags & EF_PPC64_ABI;
3279               strcat (buf, abi);
3280             }
3281           break;
3282
3283         case EM_V800:
3284           if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3285             strcat (buf, ", RH850 ABI");
3286
3287           if (e_flags & EF_V800_850E3)
3288             strcat (buf, ", V3 architecture");
3289
3290           if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3291             strcat (buf, ", FPU not used");
3292
3293           if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3294             strcat (buf, ", regmode: COMMON");
3295
3296           if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3297             strcat (buf, ", r4 not used");
3298
3299           if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3300             strcat (buf, ", r30 not used");
3301
3302           if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3303             strcat (buf, ", r5 not used");
3304
3305           if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3306             strcat (buf, ", r2 not used");
3307
3308           for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3309             {
3310               switch (e_flags & - e_flags)
3311                 {
3312                 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3313                 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3314                 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3315                 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3316                 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3317                 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3318                 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3319                 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3320                 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3321                 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3322                 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3323                 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3324                 default: break;
3325                 }
3326             }
3327           break;
3328
3329         case EM_V850:
3330         case EM_CYGNUS_V850:
3331           switch (e_flags & EF_V850_ARCH)
3332             {
3333             case E_V850E3V5_ARCH:
3334               strcat (buf, ", v850e3v5");
3335               break;
3336             case E_V850E2V3_ARCH:
3337               strcat (buf, ", v850e2v3");
3338               break;
3339             case E_V850E2_ARCH:
3340               strcat (buf, ", v850e2");
3341               break;
3342             case E_V850E1_ARCH:
3343               strcat (buf, ", v850e1");
3344               break;
3345             case E_V850E_ARCH:
3346               strcat (buf, ", v850e");
3347               break;
3348             case E_V850_ARCH:
3349               strcat (buf, ", v850");
3350               break;
3351             default:
3352               strcat (buf, _(", unknown v850 architecture variant"));
3353               break;
3354             }
3355           break;
3356
3357         case EM_M32R:
3358         case EM_CYGNUS_M32R:
3359           if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3360             strcat (buf, ", m32r");
3361           break;
3362
3363         case EM_MIPS:
3364         case EM_MIPS_RS3_LE:
3365           if (e_flags & EF_MIPS_NOREORDER)
3366             strcat (buf, ", noreorder");
3367
3368           if (e_flags & EF_MIPS_PIC)
3369             strcat (buf, ", pic");
3370
3371           if (e_flags & EF_MIPS_CPIC)
3372             strcat (buf, ", cpic");
3373
3374           if (e_flags & EF_MIPS_UCODE)
3375             strcat (buf, ", ugen_reserved");
3376
3377           if (e_flags & EF_MIPS_ABI2)
3378             strcat (buf, ", abi2");
3379
3380           if (e_flags & EF_MIPS_OPTIONS_FIRST)
3381             strcat (buf, ", odk first");
3382
3383           if (e_flags & EF_MIPS_32BITMODE)
3384             strcat (buf, ", 32bitmode");
3385
3386           if (e_flags & EF_MIPS_NAN2008)
3387             strcat (buf, ", nan2008");
3388
3389           if (e_flags & EF_MIPS_FP64)
3390             strcat (buf, ", fp64");
3391
3392           switch ((e_flags & EF_MIPS_MACH))
3393             {
3394             case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3395             case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3396             case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3397             case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3398             case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3399             case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3400             case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3401             case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3402             case E_MIPS_MACH_5900: strcat (buf, ", 5900"); break;
3403             case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
3404             case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3405             case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3406             case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3407             case E_MIPS_MACH_GS464: strcat (buf, ", gs464"); break;
3408             case E_MIPS_MACH_GS464E: strcat (buf, ", gs464e"); break;
3409             case E_MIPS_MACH_GS264E: strcat (buf, ", gs264e"); break;
3410             case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3411             case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3412             case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3413             case E_MIPS_MACH_XLR:  strcat (buf, ", xlr"); break;
3414             case E_MIPS_MACH_IAMR2:  strcat (buf, ", interaptiv-mr2"); break;
3415             case 0:
3416             /* We simply ignore the field in this case to avoid confusion:
3417                MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3418                extension.  */
3419               break;
3420             default: strcat (buf, _(", unknown CPU")); break;
3421             }
3422
3423           switch ((e_flags & EF_MIPS_ABI))
3424             {
3425             case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3426             case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3427             case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3428             case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3429             case 0:
3430             /* We simply ignore the field in this case to avoid confusion:
3431                MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3432                This means it is likely to be an o32 file, but not for
3433                sure.  */
3434               break;
3435             default: strcat (buf, _(", unknown ABI")); break;
3436             }
3437
3438           if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3439             strcat (buf, ", mdmx");
3440
3441           if (e_flags & EF_MIPS_ARCH_ASE_M16)
3442             strcat (buf, ", mips16");
3443
3444           if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3445             strcat (buf, ", micromips");
3446
3447           switch ((e_flags & EF_MIPS_ARCH))
3448             {
3449             case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3450             case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3451             case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3452             case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3453             case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3454             case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3455             case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3456             case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3457             case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3458             case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3459             case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3460             default: strcat (buf, _(", unknown ISA")); break;
3461             }
3462           break;
3463
3464         case EM_NDS32:
3465           decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3466           break;
3467
3468         case EM_NFP:
3469           switch (EF_NFP_MACH (e_flags))
3470             {
3471             case E_NFP_MACH_3200:
3472               strcat (buf, ", NFP-32xx");
3473               break;
3474             case E_NFP_MACH_6000:
3475               strcat (buf, ", NFP-6xxx");
3476               break;
3477             }
3478           break;
3479
3480         case EM_RISCV:
3481           if (e_flags & EF_RISCV_RVC)
3482             strcat (buf, ", RVC");
3483
3484           if (e_flags & EF_RISCV_RVE)
3485             strcat (buf, ", RVE");
3486
3487           switch (e_flags & EF_RISCV_FLOAT_ABI)
3488             {
3489             case EF_RISCV_FLOAT_ABI_SOFT:
3490               strcat (buf, ", soft-float ABI");
3491               break;
3492
3493             case EF_RISCV_FLOAT_ABI_SINGLE:
3494               strcat (buf, ", single-float ABI");
3495               break;
3496
3497             case EF_RISCV_FLOAT_ABI_DOUBLE:
3498               strcat (buf, ", double-float ABI");
3499               break;
3500
3501             case EF_RISCV_FLOAT_ABI_QUAD:
3502               strcat (buf, ", quad-float ABI");
3503               break;
3504             }
3505           break;
3506
3507         case EM_SH:
3508           switch ((e_flags & EF_SH_MACH_MASK))
3509             {
3510             case EF_SH1: strcat (buf, ", sh1"); break;
3511             case EF_SH2: strcat (buf, ", sh2"); break;
3512             case EF_SH3: strcat (buf, ", sh3"); break;
3513             case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3514             case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3515             case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3516             case EF_SH3E: strcat (buf, ", sh3e"); break;
3517             case EF_SH4: strcat (buf, ", sh4"); break;
3518             case EF_SH5: strcat (buf, ", sh5"); break;
3519             case EF_SH2E: strcat (buf, ", sh2e"); break;
3520             case EF_SH4A: strcat (buf, ", sh4a"); break;
3521             case EF_SH2A: strcat (buf, ", sh2a"); break;
3522             case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3523             case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3524             case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3525             case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3526             case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3527             case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3528             case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3529             case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3530             case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3531             default: strcat (buf, _(", unknown ISA")); break;
3532             }
3533
3534           if (e_flags & EF_SH_PIC)
3535             strcat (buf, ", pic");
3536
3537           if (e_flags & EF_SH_FDPIC)
3538             strcat (buf, ", fdpic");
3539           break;
3540
3541         case EM_OR1K:
3542           if (e_flags & EF_OR1K_NODELAY)
3543             strcat (buf, ", no delay");
3544           break;
3545
3546         case EM_SPARCV9:
3547           if (e_flags & EF_SPARC_32PLUS)
3548             strcat (buf, ", v8+");
3549
3550           if (e_flags & EF_SPARC_SUN_US1)
3551             strcat (buf, ", ultrasparcI");
3552
3553           if (e_flags & EF_SPARC_SUN_US3)
3554             strcat (buf, ", ultrasparcIII");
3555
3556           if (e_flags & EF_SPARC_HAL_R1)
3557             strcat (buf, ", halr1");
3558
3559           if (e_flags & EF_SPARC_LEDATA)
3560             strcat (buf, ", ledata");
3561
3562           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3563             strcat (buf, ", tso");
3564
3565           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3566             strcat (buf, ", pso");
3567
3568           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3569             strcat (buf, ", rmo");
3570           break;
3571
3572         case EM_PARISC:
3573           switch (e_flags & EF_PARISC_ARCH)
3574             {
3575             case EFA_PARISC_1_0:
3576               strcpy (buf, ", PA-RISC 1.0");
3577               break;
3578             case EFA_PARISC_1_1:
3579               strcpy (buf, ", PA-RISC 1.1");
3580               break;
3581             case EFA_PARISC_2_0:
3582               strcpy (buf, ", PA-RISC 2.0");
3583               break;
3584             default:
3585               break;
3586             }
3587           if (e_flags & EF_PARISC_TRAPNIL)
3588             strcat (buf, ", trapnil");
3589           if (e_flags & EF_PARISC_EXT)
3590             strcat (buf, ", ext");
3591           if (e_flags & EF_PARISC_LSB)
3592             strcat (buf, ", lsb");
3593           if (e_flags & EF_PARISC_WIDE)
3594             strcat (buf, ", wide");
3595           if (e_flags & EF_PARISC_NO_KABP)
3596             strcat (buf, ", no kabp");
3597           if (e_flags & EF_PARISC_LAZYSWAP)
3598             strcat (buf, ", lazyswap");
3599           break;
3600
3601         case EM_PJ:
3602         case EM_PJ_OLD:
3603           if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3604             strcat (buf, ", new calling convention");
3605
3606           if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3607             strcat (buf, ", gnu calling convention");
3608           break;
3609
3610         case EM_IA_64:
3611           if ((e_flags & EF_IA_64_ABI64))
3612             strcat (buf, ", 64-bit");
3613           else
3614             strcat (buf, ", 32-bit");
3615           if ((e_flags & EF_IA_64_REDUCEDFP))
3616             strcat (buf, ", reduced fp model");
3617           if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3618             strcat (buf, ", no function descriptors, constant gp");
3619           else if ((e_flags & EF_IA_64_CONS_GP))
3620             strcat (buf, ", constant gp");
3621           if ((e_flags & EF_IA_64_ABSOLUTE))
3622             strcat (buf, ", absolute");
3623           if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3624             {
3625               if ((e_flags & EF_IA_64_VMS_LINKAGES))
3626                 strcat (buf, ", vms_linkages");
3627               switch ((e_flags & EF_IA_64_VMS_COMCOD))
3628                 {
3629                 case EF_IA_64_VMS_COMCOD_SUCCESS:
3630                   break;
3631                 case EF_IA_64_VMS_COMCOD_WARNING:
3632                   strcat (buf, ", warning");
3633                   break;
3634                 case EF_IA_64_VMS_COMCOD_ERROR:
3635                   strcat (buf, ", error");
3636                   break;
3637                 case EF_IA_64_VMS_COMCOD_ABORT:
3638                   strcat (buf, ", abort");
3639                   break;
3640                 default:
3641                   warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3642                         e_flags & EF_IA_64_VMS_COMCOD);
3643                   strcat (buf, ", <unknown>");
3644                 }
3645             }
3646           break;
3647
3648         case EM_VAX:
3649           if ((e_flags & EF_VAX_NONPIC))
3650             strcat (buf, ", non-PIC");
3651           if ((e_flags & EF_VAX_DFLOAT))
3652             strcat (buf, ", D-Float");
3653           if ((e_flags & EF_VAX_GFLOAT))
3654             strcat (buf, ", G-Float");
3655           break;
3656
3657         case EM_VISIUM:
3658           if (e_flags & EF_VISIUM_ARCH_MCM)
3659             strcat (buf, ", mcm");
3660           else if (e_flags & EF_VISIUM_ARCH_MCM24)
3661             strcat (buf, ", mcm24");
3662           if (e_flags & EF_VISIUM_ARCH_GR6)
3663             strcat (buf, ", gr6");
3664           break;
3665
3666         case EM_RL78:
3667           switch (e_flags & E_FLAG_RL78_CPU_MASK)
3668             {
3669             case E_FLAG_RL78_ANY_CPU: break;
3670             case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3671             case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3672             case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3673             }
3674           if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3675             strcat (buf, ", 64-bit doubles");
3676           break;
3677
3678         case EM_RX:
3679           if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3680             strcat (buf, ", 64-bit doubles");
3681           if (e_flags & E_FLAG_RX_DSP)
3682             strcat (buf, ", dsp");
3683           if (e_flags & E_FLAG_RX_PID)
3684             strcat (buf, ", pid");
3685           if (e_flags & E_FLAG_RX_ABI)
3686             strcat (buf, ", RX ABI");
3687           if (e_flags & E_FLAG_RX_SINSNS_SET)
3688             strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3689                     ? ", uses String instructions" : ", bans String instructions");
3690           if (e_flags & E_FLAG_RX_V2)
3691             strcat (buf, ", V2");
3692           if (e_flags & E_FLAG_RX_V3)
3693             strcat (buf, ", V3");
3694           break;
3695
3696         case EM_S390:
3697           if (e_flags & EF_S390_HIGH_GPRS)
3698             strcat (buf, ", highgprs");
3699           break;
3700
3701         case EM_TI_C6000:
3702           if ((e_flags & EF_C6000_REL))
3703             strcat (buf, ", relocatable module");
3704           break;
3705
3706         case EM_MSP430:
3707           strcat (buf, _(": architecture variant: "));
3708           switch (e_flags & EF_MSP430_MACH)
3709             {
3710             case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3711             case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3712             case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3713             case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3714             case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3715             case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3716             case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3717             case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3718             case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3719             case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3720             case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3721             case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3722             case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3723             case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3724             case E_MSP430_MACH_MSP430X  : strcat (buf, "MSP430X"); break;
3725             default:
3726               strcat (buf, _(": unknown")); break;
3727             }
3728
3729           if (e_flags & ~ EF_MSP430_MACH)
3730             strcat (buf, _(": unknown extra flag bits also present"));
3731         }
3732     }
3733
3734   return buf;
3735 }
3736
3737 static const char *
3738 get_osabi_name (Filedata * filedata, unsigned int osabi)
3739 {
3740   static char buff[32];
3741
3742   switch (osabi)
3743     {
3744     case ELFOSABI_NONE:         return "UNIX - System V";
3745     case ELFOSABI_HPUX:         return "UNIX - HP-UX";
3746     case ELFOSABI_NETBSD:       return "UNIX - NetBSD";
3747     case ELFOSABI_GNU:          return "UNIX - GNU";
3748     case ELFOSABI_SOLARIS:      return "UNIX - Solaris";
3749     case ELFOSABI_AIX:          return "UNIX - AIX";
3750     case ELFOSABI_IRIX:         return "UNIX - IRIX";
3751     case ELFOSABI_FREEBSD:      return "UNIX - FreeBSD";
3752     case ELFOSABI_TRU64:        return "UNIX - TRU64";
3753     case ELFOSABI_MODESTO:      return "Novell - Modesto";
3754     case ELFOSABI_OPENBSD:      return "UNIX - OpenBSD";
3755     case ELFOSABI_OPENVMS:      return "VMS - OpenVMS";
3756     case ELFOSABI_NSK:          return "HP - Non-Stop Kernel";
3757     case ELFOSABI_AROS:         return "AROS";
3758     case ELFOSABI_FENIXOS:      return "FenixOS";
3759     case ELFOSABI_CLOUDABI:     return "Nuxi CloudABI";
3760     case ELFOSABI_OPENVOS:      return "Stratus Technologies OpenVOS";
3761     default:
3762       if (osabi >= 64)
3763         switch (filedata->file_header.e_machine)
3764           {
3765           case EM_ARM:
3766             switch (osabi)
3767               {
3768               case ELFOSABI_ARM:        return "ARM";
3769               case ELFOSABI_ARM_FDPIC:  return "ARM FDPIC";
3770               default:
3771                 break;
3772               }
3773             break;
3774
3775           case EM_MSP430:
3776           case EM_MSP430_OLD:
3777           case EM_VISIUM:
3778             switch (osabi)
3779               {
3780               case ELFOSABI_STANDALONE: return _("Standalone App");
3781               default:
3782                 break;
3783               }
3784             break;
3785
3786           case EM_TI_C6000:
3787             switch (osabi)
3788               {
3789               case ELFOSABI_C6000_ELFABI:       return _("Bare-metal C6000");
3790               case ELFOSABI_C6000_LINUX:        return "Linux C6000";
3791               default:
3792                 break;
3793               }
3794             break;
3795
3796           default:
3797             break;
3798           }
3799       snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3800       return buff;
3801     }
3802 }
3803
3804 static const char *
3805 get_aarch64_segment_type (unsigned long type)
3806 {
3807   switch (type)
3808     {
3809     case PT_AARCH64_ARCHEXT:  return "AARCH64_ARCHEXT";
3810     default:                  return NULL;
3811     }
3812 }
3813
3814 static const char *
3815 get_arm_segment_type (unsigned long type)
3816 {
3817   switch (type)
3818     {
3819     case PT_ARM_EXIDX: return "EXIDX";
3820     default:           return NULL;
3821     }
3822 }
3823
3824 static const char *
3825 get_s390_segment_type (unsigned long type)
3826 {
3827   switch (type)
3828     {
3829     case PT_S390_PGSTE: return "S390_PGSTE";
3830     default:            return NULL;
3831     }
3832 }
3833
3834 static const char *
3835 get_mips_segment_type (unsigned long type)
3836 {
3837   switch (type)
3838     {
3839     case PT_MIPS_REGINFO:   return "REGINFO";
3840     case PT_MIPS_RTPROC:    return "RTPROC";
3841     case PT_MIPS_OPTIONS:   return "OPTIONS";
3842     case PT_MIPS_ABIFLAGS:  return "ABIFLAGS";
3843     default:                return NULL;
3844     }
3845 }
3846
3847 static const char *
3848 get_parisc_segment_type (unsigned long type)
3849 {
3850   switch (type)
3851     {
3852     case PT_HP_TLS:             return "HP_TLS";
3853     case PT_HP_CORE_NONE:       return "HP_CORE_NONE";
3854     case PT_HP_CORE_VERSION:    return "HP_CORE_VERSION";
3855     case PT_HP_CORE_KERNEL:     return "HP_CORE_KERNEL";
3856     case PT_HP_CORE_COMM:       return "HP_CORE_COMM";
3857     case PT_HP_CORE_PROC:       return "HP_CORE_PROC";
3858     case PT_HP_CORE_LOADABLE:   return "HP_CORE_LOADABLE";
3859     case PT_HP_CORE_STACK:      return "HP_CORE_STACK";
3860     case PT_HP_CORE_SHM:        return "HP_CORE_SHM";
3861     case PT_HP_CORE_MMF:        return "HP_CORE_MMF";
3862     case PT_HP_PARALLEL:        return "HP_PARALLEL";
3863     case PT_HP_FASTBIND:        return "HP_FASTBIND";
3864     case PT_HP_OPT_ANNOT:       return "HP_OPT_ANNOT";
3865     case PT_HP_HSL_ANNOT:       return "HP_HSL_ANNOT";
3866     case PT_HP_STACK:           return "HP_STACK";
3867     case PT_HP_CORE_UTSNAME:    return "HP_CORE_UTSNAME";
3868     case PT_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
3869     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
3870     case PT_PARISC_WEAKORDER:   return "PARISC_WEAKORDER";
3871     default:                    return NULL;
3872     }
3873 }
3874
3875 static const char *
3876 get_ia64_segment_type (unsigned long type)
3877 {
3878   switch (type)
3879     {
3880     case PT_IA_64_ARCHEXT:      return "IA_64_ARCHEXT";
3881     case PT_IA_64_UNWIND:       return "IA_64_UNWIND";
3882     case PT_HP_TLS:             return "HP_TLS";
3883     case PT_IA_64_HP_OPT_ANOT:  return "HP_OPT_ANNOT";
3884     case PT_IA_64_HP_HSL_ANOT:  return "HP_HSL_ANNOT";
3885     case PT_IA_64_HP_STACK:     return "HP_STACK";
3886     default:                    return NULL;
3887     }
3888 }
3889
3890 static const char *
3891 get_tic6x_segment_type (unsigned long type)
3892 {
3893   switch (type)
3894     {
3895     case PT_C6000_PHATTR:  return "C6000_PHATTR";
3896     default:               return NULL;
3897     }
3898 }
3899
3900 static const char *
3901 get_solaris_segment_type (unsigned long type)
3902 {
3903   switch (type)
3904     {
3905     case 0x6464e550: return "PT_SUNW_UNWIND";
3906     case 0x6474e550: return "PT_SUNW_EH_FRAME";
3907     case 0x6ffffff7: return "PT_LOSUNW";
3908     case 0x6ffffffa: return "PT_SUNWBSS";
3909     case 0x6ffffffb: return "PT_SUNWSTACK";
3910     case 0x6ffffffc: return "PT_SUNWDTRACE";
3911     case 0x6ffffffd: return "PT_SUNWCAP";
3912     case 0x6fffffff: return "PT_HISUNW";
3913     default:         return NULL;
3914     }
3915 }
3916
3917 static const char *
3918 get_segment_type (Filedata * filedata, unsigned long p_type)
3919 {
3920   static char buff[32];
3921
3922   switch (p_type)
3923     {
3924     case PT_NULL:       return "NULL";
3925     case PT_LOAD:       return "LOAD";
3926     case PT_DYNAMIC:    return "DYNAMIC";
3927     case PT_INTERP:     return "INTERP";
3928     case PT_NOTE:       return "NOTE";
3929     case PT_SHLIB:      return "SHLIB";
3930     case PT_PHDR:       return "PHDR";
3931     case PT_TLS:        return "TLS";
3932     case PT_GNU_EH_FRAME: return "GNU_EH_FRAME";
3933     case PT_GNU_STACK:  return "GNU_STACK";
3934     case PT_GNU_RELRO:  return "GNU_RELRO";
3935     case PT_GNU_PROPERTY: return "GNU_PROPERTY";
3936
3937     default:
3938       if (p_type >= PT_GNU_MBIND_LO && p_type <= PT_GNU_MBIND_HI)
3939         {
3940           sprintf (buff, "GNU_MBIND+%#lx",
3941                    p_type - PT_GNU_MBIND_LO);
3942         }
3943       else if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3944         {
3945           const char * result;
3946
3947           switch (filedata->file_header.e_machine)
3948             {
3949             case EM_AARCH64:
3950               result = get_aarch64_segment_type (p_type);
3951               break;
3952             case EM_ARM:
3953               result = get_arm_segment_type (p_type);
3954               break;
3955             case EM_MIPS:
3956             case EM_MIPS_RS3_LE:
3957               result = get_mips_segment_type (p_type);
3958               break;
3959             case EM_PARISC:
3960               result = get_parisc_segment_type (p_type);
3961               break;
3962             case EM_IA_64:
3963               result = get_ia64_segment_type (p_type);
3964               break;
3965             case EM_TI_C6000:
3966               result = get_tic6x_segment_type (p_type);
3967               break;
3968             case EM_S390:
3969             case EM_S390_OLD:
3970               result = get_s390_segment_type (p_type);
3971               break;
3972             default:
3973               result = NULL;
3974               break;
3975             }
3976
3977           if (result != NULL)
3978             return result;
3979
3980           sprintf (buff, "LOPROC+%#lx", p_type - PT_LOPROC);
3981         }
3982       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3983         {
3984           const char * result;
3985
3986           switch (filedata->file_header.e_machine)
3987             {
3988             case EM_PARISC:
3989               result = get_parisc_segment_type (p_type);
3990               break;
3991             case EM_IA_64:
3992               result = get_ia64_segment_type (p_type);
3993               break;
3994             default:
3995               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
3996                 result = get_solaris_segment_type (p_type);
3997               else
3998                 result = NULL;
3999               break;
4000             }
4001
4002           if (result != NULL)
4003             return result;
4004
4005           sprintf (buff, "LOOS+%#lx", p_type - PT_LOOS);
4006         }
4007       else
4008         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
4009
4010       return buff;
4011     }
4012 }
4013
4014 static const char *
4015 get_arc_section_type_name (unsigned int sh_type)
4016 {
4017   switch (sh_type)
4018     {
4019     case SHT_ARC_ATTRIBUTES:      return "ARC_ATTRIBUTES";
4020     default:
4021       break;
4022     }
4023   return NULL;
4024 }
4025
4026 static const char *
4027 get_mips_section_type_name (unsigned int sh_type)
4028 {
4029   switch (sh_type)
4030     {
4031     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
4032     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
4033     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
4034     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
4035     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
4036     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
4037     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
4038     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
4039     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
4040     case SHT_MIPS_RELD:          return "MIPS_RELD";
4041     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
4042     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
4043     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
4044     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
4045     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
4046     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
4047     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
4048     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
4049     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
4050     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
4051     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
4052     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
4053     case SHT_MIPS_LINE:          return "MIPS_LINE";
4054     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
4055     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
4056     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
4057     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
4058     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
4059     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
4060     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
4061     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
4062     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
4063     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
4064     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
4065     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
4066     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
4067     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
4068     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
4069     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
4070     case SHT_MIPS_ABIFLAGS:      return "MIPS_ABIFLAGS";
4071     default:
4072       break;
4073     }
4074   return NULL;
4075 }
4076
4077 static const char *
4078 get_parisc_section_type_name (unsigned int sh_type)
4079 {
4080   switch (sh_type)
4081     {
4082     case SHT_PARISC_EXT:        return "PARISC_EXT";
4083     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
4084     case SHT_PARISC_DOC:        return "PARISC_DOC";
4085     case SHT_PARISC_ANNOT:      return "PARISC_ANNOT";
4086     case SHT_PARISC_SYMEXTN:    return "PARISC_SYMEXTN";
4087     case SHT_PARISC_STUBS:      return "PARISC_STUBS";
4088     case SHT_PARISC_DLKM:       return "PARISC_DLKM";
4089     default:                    return NULL;
4090     }
4091 }
4092
4093 static const char *
4094 get_ia64_section_type_name (Filedata * filedata, unsigned int sh_type)
4095 {
4096   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
4097   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
4098     return get_osabi_name (filedata, (sh_type & 0x00FF0000) >> 16);
4099
4100   switch (sh_type)
4101     {
4102     case SHT_IA_64_EXT:                return "IA_64_EXT";
4103     case SHT_IA_64_UNWIND:             return "IA_64_UNWIND";
4104     case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
4105     case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
4106     case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
4107     case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
4108     case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
4109     case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
4110     case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
4111     case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
4112     default:
4113       break;
4114     }
4115   return NULL;
4116 }
4117
4118 static const char *
4119 get_x86_64_section_type_name (unsigned int sh_type)
4120 {
4121   switch (sh_type)
4122     {
4123     case SHT_X86_64_UNWIND:     return "X86_64_UNWIND";
4124     default:                    return NULL;
4125     }
4126 }
4127
4128 static const char *
4129 get_aarch64_section_type_name (unsigned int sh_type)
4130 {
4131   switch (sh_type)
4132     {
4133     case SHT_AARCH64_ATTRIBUTES: return "AARCH64_ATTRIBUTES";
4134     default:                     return NULL;
4135     }
4136 }
4137
4138 static const char *
4139 get_arm_section_type_name (unsigned int sh_type)
4140 {
4141   switch (sh_type)
4142     {
4143     case SHT_ARM_EXIDX:           return "ARM_EXIDX";
4144     case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
4145     case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
4146     case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
4147     case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
4148     default:                      return NULL;
4149     }
4150 }
4151
4152 static const char *
4153 get_tic6x_section_type_name (unsigned int sh_type)
4154 {
4155   switch (sh_type)
4156     {
4157     case SHT_C6000_UNWIND:      return "C6000_UNWIND";
4158     case SHT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
4159     case SHT_C6000_ATTRIBUTES:  return "C6000_ATTRIBUTES";
4160     case SHT_TI_ICODE:          return "TI_ICODE";
4161     case SHT_TI_XREF:           return "TI_XREF";
4162     case SHT_TI_HANDLER:        return "TI_HANDLER";
4163     case SHT_TI_INITINFO:       return "TI_INITINFO";
4164     case SHT_TI_PHATTRS:        return "TI_PHATTRS";
4165     default:                    return NULL;
4166     }
4167 }
4168
4169 static const char *
4170 get_msp430x_section_type_name (unsigned int sh_type)
4171 {
4172   switch (sh_type)
4173     {
4174     case SHT_MSP430_SEC_FLAGS:    return "MSP430_SEC_FLAGS";
4175     case SHT_MSP430_SYM_ALIASES:  return "MSP430_SYM_ALIASES";
4176     case SHT_MSP430_ATTRIBUTES:   return "MSP430_ATTRIBUTES";
4177     default:                      return NULL;
4178     }
4179 }
4180
4181 static const char *
4182 get_nfp_section_type_name (unsigned int sh_type)
4183 {
4184   switch (sh_type)
4185     {
4186     case SHT_NFP_MECONFIG:      return "NFP_MECONFIG";
4187     case SHT_NFP_INITREG:       return "NFP_INITREG";
4188     case SHT_NFP_UDEBUG:        return "NFP_UDEBUG";
4189     default:                    return NULL;
4190     }
4191 }
4192
4193 static const char *
4194 get_v850_section_type_name (unsigned int sh_type)
4195 {
4196   switch (sh_type)
4197     {
4198     case SHT_V850_SCOMMON:  return "V850 Small Common";
4199     case SHT_V850_TCOMMON:  return "V850 Tiny Common";
4200     case SHT_V850_ZCOMMON:  return "V850 Zero Common";
4201     case SHT_RENESAS_IOP:   return "RENESAS IOP";
4202     case SHT_RENESAS_INFO:  return "RENESAS INFO";
4203     default:                return NULL;
4204     }
4205 }
4206
4207 static const char *
4208 get_riscv_section_type_name (unsigned int sh_type)
4209 {
4210   switch (sh_type)
4211     {
4212     case SHT_RISCV_ATTRIBUTES:  return "RISCV_ATTRIBUTES";
4213     default: return NULL;
4214     }
4215 }
4216
4217 static const char *
4218 get_section_type_name (Filedata * filedata, unsigned int sh_type)
4219 {
4220   static char buff[32];
4221   const char * result;
4222
4223   switch (sh_type)
4224     {
4225     case SHT_NULL:              return "NULL";
4226     case SHT_PROGBITS:          return "PROGBITS";
4227     case SHT_SYMTAB:            return "SYMTAB";
4228     case SHT_STRTAB:            return "STRTAB";
4229     case SHT_RELA:              return "RELA";
4230     case SHT_HASH:              return "HASH";
4231     case SHT_DYNAMIC:           return "DYNAMIC";
4232     case SHT_NOTE:              return "NOTE";
4233     case SHT_NOBITS:            return "NOBITS";
4234     case SHT_REL:               return "REL";
4235     case SHT_SHLIB:             return "SHLIB";
4236     case SHT_DYNSYM:            return "DYNSYM";
4237     case SHT_INIT_ARRAY:        return "INIT_ARRAY";
4238     case SHT_FINI_ARRAY:        return "FINI_ARRAY";
4239     case SHT_PREINIT_ARRAY:     return "PREINIT_ARRAY";
4240     case SHT_GNU_HASH:          return "GNU_HASH";
4241     case SHT_GROUP:             return "GROUP";
4242     case SHT_SYMTAB_SHNDX:      return "SYMTAB SECTION INDICES";
4243     case SHT_GNU_verdef:        return "VERDEF";
4244     case SHT_GNU_verneed:       return "VERNEED";
4245     case SHT_GNU_versym:        return "VERSYM";
4246     case 0x6ffffff0:            return "VERSYM";
4247     case 0x6ffffffc:            return "VERDEF";
4248     case 0x7ffffffd:            return "AUXILIARY";
4249     case 0x7fffffff:            return "FILTER";
4250     case SHT_GNU_LIBLIST:       return "GNU_LIBLIST";
4251
4252     default:
4253       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4254         {
4255           switch (filedata->file_header.e_machine)
4256             {
4257             case EM_ARC:
4258             case EM_ARC_COMPACT:
4259             case EM_ARC_COMPACT2:
4260               result = get_arc_section_type_name (sh_type);
4261               break;
4262             case EM_MIPS:
4263             case EM_MIPS_RS3_LE:
4264               result = get_mips_section_type_name (sh_type);
4265               break;
4266             case EM_PARISC:
4267               result = get_parisc_section_type_name (sh_type);
4268               break;
4269             case EM_IA_64:
4270               result = get_ia64_section_type_name (filedata, sh_type);
4271               break;
4272             case EM_X86_64:
4273             case EM_L1OM:
4274             case EM_K1OM:
4275               result = get_x86_64_section_type_name (sh_type);
4276               break;
4277             case EM_AARCH64:
4278               result = get_aarch64_section_type_name (sh_type);
4279               break;
4280             case EM_ARM:
4281               result = get_arm_section_type_name (sh_type);
4282               break;
4283             case EM_TI_C6000:
4284               result = get_tic6x_section_type_name (sh_type);
4285               break;
4286             case EM_MSP430:
4287               result = get_msp430x_section_type_name (sh_type);
4288               break;
4289             case EM_NFP:
4290               result = get_nfp_section_type_name (sh_type);
4291               break;
4292             case EM_V800:
4293             case EM_V850:
4294             case EM_CYGNUS_V850:
4295               result = get_v850_section_type_name (sh_type);
4296               break;
4297             case EM_RISCV:
4298               result = get_riscv_section_type_name (sh_type);
4299               break;
4300             default:
4301               result = NULL;
4302               break;
4303             }
4304
4305           if (result != NULL)
4306             return result;
4307
4308           sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4309         }
4310       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4311         {
4312           switch (filedata->file_header.e_machine)
4313             {
4314             case EM_IA_64:
4315               result = get_ia64_section_type_name (filedata, sh_type);
4316               break;
4317             default:
4318               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4319                 result = get_solaris_section_type (sh_type);
4320               else
4321                 {
4322                   switch (sh_type)
4323                     {
4324                     case SHT_GNU_INCREMENTAL_INPUTS: result = "GNU_INCREMENTAL_INPUTS"; break;
4325                     case SHT_GNU_ATTRIBUTES: result = "GNU_ATTRIBUTES"; break;
4326                     case SHT_GNU_HASH: result = "GNU_HASH"; break;
4327                     case SHT_GNU_LIBLIST: result = "GNU_LIBLIST"; break;
4328                     default:
4329                       result = NULL;
4330                       break;
4331                     }
4332                 }
4333               break;
4334             }
4335
4336           if (result != NULL)
4337             return result;
4338
4339           sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4340         }
4341       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4342         {
4343           switch (filedata->file_header.e_machine)
4344             {
4345             case EM_V800:
4346             case EM_V850:
4347             case EM_CYGNUS_V850:
4348               result = get_v850_section_type_name (sh_type);
4349               break;
4350             default:
4351               result = NULL;
4352               break;
4353             }
4354
4355           if (result != NULL)
4356             return result;
4357
4358           sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4359         }
4360       else
4361         /* This message is probably going to be displayed in a 15
4362            character wide field, so put the hex value first.  */
4363         snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4364
4365       return buff;
4366     }
4367 }
4368
4369 #define OPTION_DEBUG_DUMP       512
4370 #define OPTION_DYN_SYMS         513
4371 #define OPTION_DWARF_DEPTH      514
4372 #define OPTION_DWARF_START      515
4373 #define OPTION_DWARF_CHECK      516
4374
4375 static struct option options[] =
4376 {
4377   {"all",              no_argument, 0, 'a'},
4378   {"file-header",      no_argument, 0, 'h'},
4379   {"program-headers",  no_argument, 0, 'l'},
4380   {"headers",          no_argument, 0, 'e'},
4381   {"histogram",        no_argument, 0, 'I'},
4382   {"segments",         no_argument, 0, 'l'},
4383   {"sections",         no_argument, 0, 'S'},
4384   {"section-headers",  no_argument, 0, 'S'},
4385   {"section-groups",   no_argument, 0, 'g'},
4386   {"section-details",  no_argument, 0, 't'},
4387   {"full-section-name",no_argument, 0, 'N'},
4388   {"symbols",          no_argument, 0, 's'},
4389   {"syms",             no_argument, 0, 's'},
4390   {"dyn-syms",         no_argument, 0, OPTION_DYN_SYMS},
4391   {"relocs",           no_argument, 0, 'r'},
4392   {"notes",            no_argument, 0, 'n'},
4393   {"dynamic",          no_argument, 0, 'd'},
4394   {"arch-specific",    no_argument, 0, 'A'},
4395   {"version-info",     no_argument, 0, 'V'},
4396   {"use-dynamic",      no_argument, 0, 'D'},
4397   {"unwind",           no_argument, 0, 'u'},
4398   {"archive-index",    no_argument, 0, 'c'},
4399   {"hex-dump",         required_argument, 0, 'x'},
4400   {"relocated-dump",   required_argument, 0, 'R'},
4401   {"string-dump",      required_argument, 0, 'p'},
4402   {"decompress",       no_argument, 0, 'z'},
4403 #ifdef SUPPORT_DISASSEMBLY
4404   {"instruction-dump", required_argument, 0, 'i'},
4405 #endif
4406   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
4407
4408   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
4409   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
4410   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
4411
4412   {"version",          no_argument, 0, 'v'},
4413   {"wide",             no_argument, 0, 'W'},
4414   {"help",             no_argument, 0, 'H'},
4415   {0,                  no_argument, 0, 0}
4416 };
4417
4418 static void
4419 usage (FILE * stream)
4420 {
4421   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4422   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4423   fprintf (stream, _(" Options are:\n\
4424   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4425   -h --file-header       Display the ELF file header\n\
4426   -l --program-headers   Display the program headers\n\
4427      --segments          An alias for --program-headers\n\
4428   -S --section-headers   Display the sections' header\n\
4429      --sections          An alias for --section-headers\n\
4430   -g --section-groups    Display the section groups\n\
4431   -t --section-details   Display the section details\n\
4432   -e --headers           Equivalent to: -h -l -S\n\
4433   -s --syms              Display the symbol table\n\
4434      --symbols           An alias for --syms\n\
4435   --dyn-syms             Display the dynamic symbol table\n\
4436   -n --notes             Display the core notes (if present)\n\
4437   -r --relocs            Display the relocations (if present)\n\
4438   -u --unwind            Display the unwind info (if present)\n\
4439   -d --dynamic           Display the dynamic section (if present)\n\
4440   -V --version-info      Display the version sections (if present)\n\
4441   -A --arch-specific     Display architecture specific information (if any)\n\
4442   -c --archive-index     Display the symbol/file index in an archive\n\
4443   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
4444   -x --hex-dump=<number|name>\n\
4445                          Dump the contents of section <number|name> as bytes\n\
4446   -p --string-dump=<number|name>\n\
4447                          Dump the contents of section <number|name> as strings\n\
4448   -R --relocated-dump=<number|name>\n\
4449                          Dump the contents of section <number|name> as relocated bytes\n\
4450   -z --decompress        Decompress section before dumping it\n\
4451   -w[lLiaprmfFsoRtUuTgAckK] or\n\
4452   --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4453                =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4454                =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4455                =addr,=cu_index,=links,=follow-links]\n\
4456                          Display the contents of DWARF debug sections\n"));
4457   fprintf (stream, _("\
4458   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
4459   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
4460                          or deeper\n"));
4461 #ifdef SUPPORT_DISASSEMBLY
4462   fprintf (stream, _("\
4463   -i --instruction-dump=<number|name>\n\
4464                          Disassemble the contents of section <number|name>\n"));
4465 #endif
4466   fprintf (stream, _("\
4467   -I --histogram         Display histogram of bucket list lengths\n\
4468   -W --wide              Allow output width to exceed 80 characters\n\
4469   @<file>                Read options from <file>\n\
4470   -H --help              Display this information\n\
4471   -v --version           Display the version number of readelf\n"));
4472
4473   if (REPORT_BUGS_TO[0] && stream == stdout)
4474     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4475
4476   exit (stream == stdout ? 0 : 1);
4477 }
4478
4479 /* Record the fact that the user wants the contents of section number
4480    SECTION to be displayed using the method(s) encoded as flags bits
4481    in TYPE.  Note, TYPE can be zero if we are creating the array for
4482    the first time.  */
4483
4484 static void
4485 request_dump_bynumber (Filedata * filedata, unsigned int section, dump_type type)
4486 {
4487   if (section >= filedata->num_dump_sects)
4488     {
4489       dump_type * new_dump_sects;
4490
4491       new_dump_sects = (dump_type *) calloc (section + 1,
4492                                              sizeof (* new_dump_sects));
4493
4494       if (new_dump_sects == NULL)
4495         error (_("Out of memory allocating dump request table.\n"));
4496       else
4497         {
4498           if (filedata->dump_sects)
4499             {
4500               /* Copy current flag settings.  */
4501               memcpy (new_dump_sects, filedata->dump_sects,
4502                       filedata->num_dump_sects * sizeof (* new_dump_sects));
4503
4504               free (filedata->dump_sects);
4505             }
4506
4507           filedata->dump_sects = new_dump_sects;
4508           filedata->num_dump_sects = section + 1;
4509         }
4510     }
4511
4512   if (filedata->dump_sects)
4513     filedata->dump_sects[section] |= type;
4514 }
4515
4516 /* Request a dump by section name.  */
4517
4518 static void
4519 request_dump_byname (const char * section, dump_type type)
4520 {
4521   struct dump_list_entry * new_request;
4522
4523   new_request = (struct dump_list_entry *)
4524       malloc (sizeof (struct dump_list_entry));
4525   if (!new_request)
4526     error (_("Out of memory allocating dump request table.\n"));
4527
4528   new_request->name = strdup (section);
4529   if (!new_request->name)
4530     error (_("Out of memory allocating dump request table.\n"));
4531
4532   new_request->type = type;
4533
4534   new_request->next = dump_sects_byname;
4535   dump_sects_byname = new_request;
4536 }
4537
4538 static inline void
4539 request_dump (Filedata * filedata, dump_type type)
4540 {
4541   int section;
4542   char * cp;
4543
4544   do_dump++;
4545   section = strtoul (optarg, & cp, 0);
4546
4547   if (! *cp && section >= 0)
4548     request_dump_bynumber (filedata, section, type);
4549   else
4550     request_dump_byname (optarg, type);
4551 }
4552
4553 static void
4554 parse_args (Filedata * filedata, int argc, char ** argv)
4555 {
4556   int c;
4557
4558   if (argc < 2)
4559     usage (stderr);
4560
4561   while ((c = getopt_long
4562           (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4563     {
4564       switch (c)
4565         {
4566         case 0:
4567           /* Long options.  */
4568           break;
4569         case 'H':
4570           usage (stdout);
4571           break;
4572
4573         case 'a':
4574           do_syms = TRUE;
4575           do_reloc = TRUE;
4576           do_unwind = TRUE;
4577           do_dynamic = TRUE;
4578           do_header = TRUE;
4579           do_sections = TRUE;
4580           do_section_groups = TRUE;
4581           do_segments = TRUE;
4582           do_version = TRUE;
4583           do_histogram = TRUE;
4584           do_arch = TRUE;
4585           do_notes = TRUE;
4586           break;
4587         case 'g':
4588           do_section_groups = TRUE;
4589           break;
4590         case 't':
4591         case 'N':
4592           do_sections = TRUE;
4593           do_section_details = TRUE;
4594           break;
4595         case 'e':
4596           do_header = TRUE;
4597           do_sections = TRUE;
4598           do_segments = TRUE;
4599           break;
4600         case 'A':
4601           do_arch = TRUE;
4602           break;
4603         case 'D':
4604           do_using_dynamic = TRUE;
4605           break;
4606         case 'r':
4607           do_reloc = TRUE;
4608           break;
4609         case 'u':
4610           do_unwind = TRUE;
4611           break;
4612         case 'h':
4613           do_header = TRUE;
4614           break;
4615         case 'l':
4616           do_segments = TRUE;
4617           break;
4618         case 's':
4619           do_syms = TRUE;
4620           break;
4621         case 'S':
4622           do_sections = TRUE;
4623           break;
4624         case 'd':
4625           do_dynamic = TRUE;
4626           break;
4627         case 'I':
4628           do_histogram = TRUE;
4629           break;
4630         case 'n':
4631           do_notes = TRUE;
4632           break;
4633         case 'c':
4634           do_archive_index = TRUE;
4635           break;
4636         case 'x':
4637           request_dump (filedata, HEX_DUMP);
4638           break;
4639         case 'p':
4640           request_dump (filedata, STRING_DUMP);
4641           break;
4642         case 'R':
4643           request_dump (filedata, RELOC_DUMP);
4644           break;
4645         case 'z':
4646           decompress_dumps = TRUE;
4647           break;
4648         case 'w':
4649           do_dump = TRUE;
4650           if (optarg == 0)
4651             {
4652               do_debugging = TRUE;
4653               dwarf_select_sections_all ();
4654             }
4655           else
4656             {
4657               do_debugging = FALSE;
4658               dwarf_select_sections_by_letters (optarg);
4659             }
4660           break;
4661         case OPTION_DEBUG_DUMP:
4662           do_dump = TRUE;
4663           if (optarg == 0)
4664             do_debugging = TRUE;
4665           else
4666             {
4667               do_debugging = FALSE;
4668               dwarf_select_sections_by_names (optarg);
4669             }
4670           break;
4671         case OPTION_DWARF_DEPTH:
4672           {
4673             char *cp;
4674
4675             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4676           }
4677           break;
4678         case OPTION_DWARF_START:
4679           {
4680             char *cp;
4681
4682             dwarf_start_die = strtoul (optarg, & cp, 0);
4683           }
4684           break;
4685         case OPTION_DWARF_CHECK:
4686           dwarf_check = TRUE;
4687           break;
4688         case OPTION_DYN_SYMS:
4689           do_dyn_syms = TRUE;
4690           break;
4691 #ifdef SUPPORT_DISASSEMBLY
4692         case 'i':
4693           request_dump (filedata, DISASS_DUMP);
4694           break;
4695 #endif
4696         case 'v':
4697           print_version (program_name);
4698           break;
4699         case 'V':
4700           do_version = TRUE;
4701           break;
4702         case 'W':
4703           do_wide = TRUE;
4704           break;
4705         default:
4706           /* xgettext:c-format */
4707           error (_("Invalid option '-%c'\n"), c);
4708           /* Fall through.  */
4709         case '?':
4710           usage (stderr);
4711         }
4712     }
4713
4714   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4715       && !do_segments && !do_header && !do_dump && !do_version
4716       && !do_histogram && !do_debugging && !do_arch && !do_notes
4717       && !do_section_groups && !do_archive_index
4718       && !do_dyn_syms)
4719     usage (stderr);
4720 }
4721
4722 static const char *
4723 get_elf_class (unsigned int elf_class)
4724 {
4725   static char buff[32];
4726
4727   switch (elf_class)
4728     {
4729     case ELFCLASSNONE: return _("none");
4730     case ELFCLASS32:   return "ELF32";
4731     case ELFCLASS64:   return "ELF64";
4732     default:
4733       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4734       return buff;
4735     }
4736 }
4737
4738 static const char *
4739 get_data_encoding (unsigned int encoding)
4740 {
4741   static char buff[32];
4742
4743   switch (encoding)
4744     {
4745     case ELFDATANONE: return _("none");
4746     case ELFDATA2LSB: return _("2's complement, little endian");
4747     case ELFDATA2MSB: return _("2's complement, big endian");
4748     default:
4749       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4750       return buff;
4751     }
4752 }
4753
4754 /* Decode the data held in 'filedata->file_header'.  */
4755
4756 static bfd_boolean
4757 process_file_header (Filedata * filedata)
4758 {
4759   Elf_Internal_Ehdr * header = & filedata->file_header;
4760
4761   if (   header->e_ident[EI_MAG0] != ELFMAG0
4762       || header->e_ident[EI_MAG1] != ELFMAG1
4763       || header->e_ident[EI_MAG2] != ELFMAG2
4764       || header->e_ident[EI_MAG3] != ELFMAG3)
4765     {
4766       error
4767         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4768       return FALSE;
4769     }
4770
4771   init_dwarf_regnames (header->e_machine);
4772
4773   if (do_header)
4774     {
4775       unsigned i;
4776
4777       printf (_("ELF Header:\n"));
4778       printf (_("  Magic:   "));
4779       for (i = 0; i < EI_NIDENT; i++)
4780         printf ("%2.2x ", header->e_ident[i]);
4781       printf ("\n");
4782       printf (_("  Class:                             %s\n"),
4783               get_elf_class (header->e_ident[EI_CLASS]));
4784       printf (_("  Data:                              %s\n"),
4785               get_data_encoding (header->e_ident[EI_DATA]));
4786       printf (_("  Version:                           %d%s\n"),
4787               header->e_ident[EI_VERSION],
4788               (header->e_ident[EI_VERSION] == EV_CURRENT
4789                ? _(" (current)")
4790                : (header->e_ident[EI_VERSION] != EV_NONE
4791                   ? _(" <unknown>")
4792                   : "")));
4793       printf (_("  OS/ABI:                            %s\n"),
4794               get_osabi_name (filedata, header->e_ident[EI_OSABI]));
4795       printf (_("  ABI Version:                       %d\n"),
4796               header->e_ident[EI_ABIVERSION]);
4797       printf (_("  Type:                              %s\n"),
4798               get_file_type (header->e_type));
4799       printf (_("  Machine:                           %s\n"),
4800               get_machine_name (header->e_machine));
4801       printf (_("  Version:                           0x%lx\n"),
4802               header->e_version);
4803
4804       printf (_("  Entry point address:               "));
4805       print_vma (header->e_entry, PREFIX_HEX);
4806       printf (_("\n  Start of program headers:          "));
4807       print_vma (header->e_phoff, DEC);
4808       printf (_(" (bytes into file)\n  Start of section headers:          "));
4809       print_vma (header->e_shoff, DEC);
4810       printf (_(" (bytes into file)\n"));
4811
4812       printf (_("  Flags:                             0x%lx%s\n"),
4813               header->e_flags,
4814               get_machine_flags (filedata, header->e_flags, header->e_machine));
4815       printf (_("  Size of this header:               %u (bytes)\n"),
4816               header->e_ehsize);
4817       printf (_("  Size of program headers:           %u (bytes)\n"),
4818               header->e_phentsize);
4819       printf (_("  Number of program headers:         %u"),
4820               header->e_phnum);
4821       if (filedata->section_headers != NULL
4822           && header->e_phnum == PN_XNUM
4823           && filedata->section_headers[0].sh_info != 0)
4824         {
4825           header->e_phnum = filedata->section_headers[0].sh_info;
4826           printf (" (%u)", header->e_phnum);
4827         }
4828       putc ('\n', stdout);
4829       printf (_("  Size of section headers:           %u (bytes)\n"),
4830               header->e_shentsize);
4831       printf (_("  Number of section headers:         %u"),
4832               header->e_shnum);
4833       if (filedata->section_headers != NULL && header->e_shnum == SHN_UNDEF)
4834         {
4835           header->e_shnum = filedata->section_headers[0].sh_size;
4836           printf (" (%u)", header->e_shnum);
4837         }
4838       putc ('\n', stdout);
4839       printf (_("  Section header string table index: %u"),
4840               header->e_shstrndx);
4841       if (filedata->section_headers != NULL
4842           && header->e_shstrndx == (SHN_XINDEX & 0xffff))
4843         {
4844           header->e_shstrndx = filedata->section_headers[0].sh_link;
4845           printf (" (%u)", header->e_shstrndx);
4846         }
4847       if (header->e_shstrndx != SHN_UNDEF
4848           && header->e_shstrndx >= header->e_shnum)
4849         {
4850           header->e_shstrndx = SHN_UNDEF;
4851           printf (_(" <corrupt: out of range>"));
4852         }
4853       putc ('\n', stdout);
4854     }
4855
4856   if (filedata->section_headers != NULL)
4857     {
4858       if (header->e_phnum == PN_XNUM
4859           && filedata->section_headers[0].sh_info != 0)
4860         header->e_phnum = filedata->section_headers[0].sh_info;
4861       if (header->e_shnum == SHN_UNDEF)
4862         header->e_shnum = filedata->section_headers[0].sh_size;
4863       if (header->e_shstrndx == (SHN_XINDEX & 0xffff))
4864         header->e_shstrndx = filedata->section_headers[0].sh_link;
4865       if (header->e_shstrndx >= header->e_shnum)
4866         header->e_shstrndx = SHN_UNDEF;
4867       free (filedata->section_headers);
4868       filedata->section_headers = NULL;
4869     }
4870
4871   return TRUE;
4872 }
4873
4874 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4875    Returns TRUE upon success, FALSE otherwise.  Loads 32-bit headers.  */
4876
4877 static bfd_boolean
4878 get_32bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4879 {
4880   Elf32_External_Phdr * phdrs;
4881   Elf32_External_Phdr * external;
4882   Elf_Internal_Phdr *   internal;
4883   unsigned int i;
4884   unsigned int size = filedata->file_header.e_phentsize;
4885   unsigned int num  = filedata->file_header.e_phnum;
4886
4887   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4888   if (size == 0 || num == 0)
4889     return FALSE;
4890   if (size < sizeof * phdrs)
4891     {
4892       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4893       return FALSE;
4894     }
4895   if (size > sizeof * phdrs)
4896     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4897
4898   phdrs = (Elf32_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4899                                             size, num, _("program headers"));
4900   if (phdrs == NULL)
4901     return FALSE;
4902
4903   for (i = 0, internal = pheaders, external = phdrs;
4904        i < filedata->file_header.e_phnum;
4905        i++, internal++, external++)
4906     {
4907       internal->p_type   = BYTE_GET (external->p_type);
4908       internal->p_offset = BYTE_GET (external->p_offset);
4909       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4910       internal->p_paddr  = BYTE_GET (external->p_paddr);
4911       internal->p_filesz = BYTE_GET (external->p_filesz);
4912       internal->p_memsz  = BYTE_GET (external->p_memsz);
4913       internal->p_flags  = BYTE_GET (external->p_flags);
4914       internal->p_align  = BYTE_GET (external->p_align);
4915     }
4916
4917   free (phdrs);
4918   return TRUE;
4919 }
4920
4921 /* Read in the program headers from FILEDATA and store them in PHEADERS.
4922    Returns TRUE upon success, FALSE otherwise.  Loads 64-bit headers.  */
4923
4924 static bfd_boolean
4925 get_64bit_program_headers (Filedata * filedata, Elf_Internal_Phdr * pheaders)
4926 {
4927   Elf64_External_Phdr * phdrs;
4928   Elf64_External_Phdr * external;
4929   Elf_Internal_Phdr *   internal;
4930   unsigned int i;
4931   unsigned int size = filedata->file_header.e_phentsize;
4932   unsigned int num  = filedata->file_header.e_phnum;
4933
4934   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4935   if (size == 0 || num == 0)
4936     return FALSE;
4937   if (size < sizeof * phdrs)
4938     {
4939       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4940       return FALSE;
4941     }
4942   if (size > sizeof * phdrs)
4943     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4944
4945   phdrs = (Elf64_External_Phdr *) get_data (NULL, filedata, filedata->file_header.e_phoff,
4946                                             size, num, _("program headers"));
4947   if (!phdrs)
4948     return FALSE;
4949
4950   for (i = 0, internal = pheaders, external = phdrs;
4951        i < filedata->file_header.e_phnum;
4952        i++, internal++, external++)
4953     {
4954       internal->p_type   = BYTE_GET (external->p_type);
4955       internal->p_flags  = BYTE_GET (external->p_flags);
4956       internal->p_offset = BYTE_GET (external->p_offset);
4957       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4958       internal->p_paddr  = BYTE_GET (external->p_paddr);
4959       internal->p_filesz = BYTE_GET (external->p_filesz);
4960       internal->p_memsz  = BYTE_GET (external->p_memsz);
4961       internal->p_align  = BYTE_GET (external->p_align);
4962     }
4963
4964   free (phdrs);
4965   return TRUE;
4966 }
4967
4968 /* Returns TRUE if the program headers were read into `program_headers'.  */
4969
4970 static bfd_boolean
4971 get_program_headers (Filedata * filedata)
4972 {
4973   Elf_Internal_Phdr * phdrs;
4974
4975   /* Check cache of prior read.  */
4976   if (filedata->program_headers != NULL)
4977     return TRUE;
4978
4979   /* Be kind to memory checkers by looking for
4980      e_phnum values which we know must be invalid.  */
4981   if (filedata->file_header.e_phnum
4982       * (is_32bit_elf ? sizeof (Elf32_External_Phdr) : sizeof (Elf64_External_Phdr))
4983       >= filedata->file_size)
4984     {
4985       error (_("Too many program headers - %#x - the file is not that big\n"),
4986              filedata->file_header.e_phnum);
4987       return FALSE;
4988     }
4989
4990   phdrs = (Elf_Internal_Phdr *) cmalloc (filedata->file_header.e_phnum,
4991                                          sizeof (Elf_Internal_Phdr));
4992   if (phdrs == NULL)
4993     {
4994       error (_("Out of memory reading %u program headers\n"),
4995              filedata->file_header.e_phnum);
4996       return FALSE;
4997     }
4998
4999   if (is_32bit_elf
5000       ? get_32bit_program_headers (filedata, phdrs)
5001       : get_64bit_program_headers (filedata, phdrs))
5002     {
5003       filedata->program_headers = phdrs;
5004       return TRUE;
5005     }
5006
5007   free (phdrs);
5008   return FALSE;
5009 }
5010
5011 /* Returns TRUE if the program headers were loaded.  */
5012
5013 static bfd_boolean
5014 process_program_headers (Filedata * filedata)
5015 {
5016   Elf_Internal_Phdr * segment;
5017   unsigned int i;
5018   Elf_Internal_Phdr * previous_load = NULL;
5019
5020   if (filedata->file_header.e_phnum == 0)
5021     {
5022       /* PR binutils/12467.  */
5023       if (filedata->file_header.e_phoff != 0)
5024         {
5025           warn (_("possibly corrupt ELF header - it has a non-zero program"
5026                   " header offset, but no program headers\n"));
5027           return FALSE;
5028         }
5029       else if (do_segments)
5030         printf (_("\nThere are no program headers in this file.\n"));
5031       return TRUE;
5032     }
5033
5034   if (do_segments && !do_header)
5035     {
5036       printf (_("\nElf file type is %s\n"), get_file_type (filedata->file_header.e_type));
5037       printf (_("Entry point 0x%s\n"), bfd_vmatoa ("x", filedata->file_header.e_entry));
5038       printf (ngettext ("There is %d program header, starting at offset %s\n",
5039                         "There are %d program headers, starting at offset %s\n",
5040                         filedata->file_header.e_phnum),
5041               filedata->file_header.e_phnum,
5042               bfd_vmatoa ("u", filedata->file_header.e_phoff));
5043     }
5044
5045   if (! get_program_headers (filedata))
5046     return TRUE;
5047
5048   if (do_segments)
5049     {
5050       if (filedata->file_header.e_phnum > 1)
5051         printf (_("\nProgram Headers:\n"));
5052       else
5053         printf (_("\nProgram Headers:\n"));
5054
5055       if (is_32bit_elf)
5056         printf
5057           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
5058       else if (do_wide)
5059         printf
5060           (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
5061       else
5062         {
5063           printf
5064             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
5065           printf
5066             (_("                 FileSiz            MemSiz              Flags  Align\n"));
5067         }
5068     }
5069
5070   dynamic_addr = 0;
5071   dynamic_size = 0;
5072
5073   for (i = 0, segment = filedata->program_headers;
5074        i < filedata->file_header.e_phnum;
5075        i++, segment++)
5076     {
5077       if (do_segments)
5078         {
5079           printf ("  %-14.14s ", get_segment_type (filedata, segment->p_type));
5080
5081           if (is_32bit_elf)
5082             {
5083               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5084               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
5085               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
5086               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
5087               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
5088               printf ("%c%c%c ",
5089                       (segment->p_flags & PF_R ? 'R' : ' '),
5090                       (segment->p_flags & PF_W ? 'W' : ' '),
5091                       (segment->p_flags & PF_X ? 'E' : ' '));
5092               printf ("%#lx", (unsigned long) segment->p_align);
5093             }
5094           else if (do_wide)
5095             {
5096               if ((unsigned long) segment->p_offset == segment->p_offset)
5097                 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
5098               else
5099                 {
5100                   print_vma (segment->p_offset, FULL_HEX);
5101                   putchar (' ');
5102                 }
5103
5104               print_vma (segment->p_vaddr, FULL_HEX);
5105               putchar (' ');
5106               print_vma (segment->p_paddr, FULL_HEX);
5107               putchar (' ');
5108
5109               if ((unsigned long) segment->p_filesz == segment->p_filesz)
5110                 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
5111               else
5112                 {
5113                   print_vma (segment->p_filesz, FULL_HEX);
5114                   putchar (' ');
5115                 }
5116
5117               if ((unsigned long) segment->p_memsz == segment->p_memsz)
5118                 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
5119               else
5120                 {
5121                   print_vma (segment->p_memsz, FULL_HEX);
5122                 }
5123
5124               printf (" %c%c%c ",
5125                       (segment->p_flags & PF_R ? 'R' : ' '),
5126                       (segment->p_flags & PF_W ? 'W' : ' '),
5127                       (segment->p_flags & PF_X ? 'E' : ' '));
5128
5129               if ((unsigned long) segment->p_align == segment->p_align)
5130                 printf ("%#lx", (unsigned long) segment->p_align);
5131               else
5132                 {
5133                   print_vma (segment->p_align, PREFIX_HEX);
5134                 }
5135             }
5136           else
5137             {
5138               print_vma (segment->p_offset, FULL_HEX);
5139               putchar (' ');
5140               print_vma (segment->p_vaddr, FULL_HEX);
5141               putchar (' ');
5142               print_vma (segment->p_paddr, FULL_HEX);
5143               printf ("\n                 ");
5144               print_vma (segment->p_filesz, FULL_HEX);
5145               putchar (' ');
5146               print_vma (segment->p_memsz, FULL_HEX);
5147               printf ("  %c%c%c    ",
5148                       (segment->p_flags & PF_R ? 'R' : ' '),
5149                       (segment->p_flags & PF_W ? 'W' : ' '),
5150                       (segment->p_flags & PF_X ? 'E' : ' '));
5151               print_vma (segment->p_align, PREFIX_HEX);
5152             }
5153
5154           putc ('\n', stdout);
5155         }
5156
5157       switch (segment->p_type)
5158         {
5159         case PT_LOAD:
5160 #if 0 /* Do not warn about out of order PT_LOAD segments.  Although officially
5161          required by the ELF standard, several programs, including the Linux
5162          kernel, make use of non-ordered segments.  */
5163           if (previous_load
5164               && previous_load->p_vaddr > segment->p_vaddr)
5165             error (_("LOAD segments must be sorted in order of increasing VirtAddr\n"));
5166 #endif
5167           if (segment->p_memsz < segment->p_filesz)
5168             error (_("the segment's file size is larger than its memory size\n"));
5169           previous_load = segment;
5170           break;
5171
5172         case PT_PHDR:
5173           /* PR 20815 - Verify that the program header is loaded into memory.  */
5174           if (i > 0 && previous_load != NULL)
5175             error (_("the PHDR segment must occur before any LOAD segment\n"));
5176           if (filedata->file_header.e_machine != EM_PARISC)
5177             {
5178               unsigned int j;
5179
5180               for (j = 1; j < filedata->file_header.e_phnum; j++)
5181                 if (filedata->program_headers[j].p_vaddr <= segment->p_vaddr
5182                     && (filedata->program_headers[j].p_vaddr
5183                         + filedata->program_headers[j].p_memsz)
5184                     >= (segment->p_vaddr + segment->p_filesz))
5185                   break;
5186               if (j == filedata->file_header.e_phnum)
5187                 error (_("the PHDR segment is not covered by a LOAD segment\n"));
5188             }
5189           break;
5190
5191         case PT_DYNAMIC:
5192           if (dynamic_addr)
5193             error (_("more than one dynamic segment\n"));
5194
5195           /* By default, assume that the .dynamic section is the first
5196              section in the DYNAMIC segment.  */
5197           dynamic_addr = segment->p_offset;
5198           dynamic_size = segment->p_filesz;
5199
5200           /* Try to locate the .dynamic section. If there is
5201              a section header table, we can easily locate it.  */
5202           if (filedata->section_headers != NULL)
5203             {
5204               Elf_Internal_Shdr * sec;
5205
5206               sec = find_section (filedata, ".dynamic");
5207               if (sec == NULL || sec->sh_size == 0)
5208                 {
5209                   /* A corresponding .dynamic section is expected, but on
5210                      IA-64/OpenVMS it is OK for it to be missing.  */
5211                   if (!is_ia64_vms (filedata))
5212                     error (_("no .dynamic section in the dynamic segment\n"));
5213                   break;
5214                 }
5215
5216               if (sec->sh_type == SHT_NOBITS)
5217                 {
5218                   dynamic_size = 0;
5219                   break;
5220                 }
5221
5222               dynamic_addr = sec->sh_offset;
5223               dynamic_size = sec->sh_size;
5224
5225               if (dynamic_addr < segment->p_offset
5226                   || dynamic_addr > segment->p_offset + segment->p_filesz)
5227                 warn (_("the .dynamic section is not contained"
5228                         " within the dynamic segment\n"));
5229               else if (dynamic_addr > segment->p_offset)
5230                 warn (_("the .dynamic section is not the first section"
5231                         " in the dynamic segment.\n"));
5232             }
5233
5234           /* PR binutils/17512: Avoid corrupt dynamic section info in the
5235              segment.  Check this after matching against the section headers
5236              so we don't warn on debuginfo file (which have NOBITS .dynamic
5237              sections).  */
5238           if (dynamic_addr + dynamic_size >= filedata->file_size)
5239             {
5240               error (_("the dynamic segment offset + size exceeds the size of the file\n"));
5241               dynamic_addr = dynamic_size = 0;
5242             }
5243           break;
5244
5245         case PT_INTERP:
5246           if (fseek (filedata->handle, archive_file_offset + (long) segment->p_offset,
5247                      SEEK_SET))
5248             error (_("Unable to find program interpreter name\n"));
5249           else
5250             {
5251               char fmt [32];
5252               int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
5253
5254               if (ret >= (int) sizeof (fmt) || ret < 0)
5255                 error (_("Internal error: failed to create format string to display program interpreter\n"));
5256
5257               program_interpreter[0] = 0;
5258               if (fscanf (filedata->handle, fmt, program_interpreter) <= 0)
5259                 error (_("Unable to read program interpreter name\n"));
5260
5261               if (do_segments)
5262                 printf (_("      [Requesting program interpreter: %s]\n"),
5263                     program_interpreter);
5264             }
5265           break;
5266         }
5267     }
5268
5269   if (do_segments
5270       && filedata->section_headers != NULL
5271       && filedata->string_table != NULL)
5272     {
5273       printf (_("\n Section to Segment mapping:\n"));
5274       printf (_("  Segment Sections...\n"));
5275
5276       for (i = 0; i < filedata->file_header.e_phnum; i++)
5277         {
5278           unsigned int j;
5279           Elf_Internal_Shdr * section;
5280
5281           segment = filedata->program_headers + i;
5282           section = filedata->section_headers + 1;
5283
5284           printf ("   %2.2d     ", i);
5285
5286           for (j = 1; j < filedata->file_header.e_shnum; j++, section++)
5287             {
5288               if (!ELF_TBSS_SPECIAL (section, segment)
5289                   && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
5290                 printf ("%s ", printable_section_name (filedata, section));
5291             }
5292
5293           putc ('\n',stdout);
5294         }
5295     }
5296
5297   return TRUE;
5298 }
5299
5300
5301 /* Find the file offset corresponding to VMA by using the program headers.  */
5302
5303 static long
5304 offset_from_vma (Filedata * filedata, bfd_vma vma, bfd_size_type size)
5305 {
5306   Elf_Internal_Phdr * seg;
5307
5308   if (! get_program_headers (filedata))
5309     {
5310       warn (_("Cannot interpret virtual addresses without program headers.\n"));
5311       return (long) vma;
5312     }
5313
5314   for (seg = filedata->program_headers;
5315        seg < filedata->program_headers + filedata->file_header.e_phnum;
5316        ++seg)
5317     {
5318       if (seg->p_type != PT_LOAD)
5319         continue;
5320
5321       if (vma >= (seg->p_vaddr & -seg->p_align)
5322           && vma + size <= seg->p_vaddr + seg->p_filesz)
5323         return vma - seg->p_vaddr + seg->p_offset;
5324     }
5325
5326   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
5327         (unsigned long) vma);
5328   return (long) vma;
5329 }
5330
5331
5332 /* Allocate memory and load the sections headers into FILEDATA->filedata->section_headers.
5333    If PROBE is true, this is just a probe and we do not generate any error
5334    messages if the load fails.  */
5335
5336 static bfd_boolean
5337 get_32bit_section_headers (Filedata * filedata, bfd_boolean probe)
5338 {
5339   Elf32_External_Shdr * shdrs;
5340   Elf_Internal_Shdr *   internal;
5341   unsigned int          i;
5342   unsigned int          size = filedata->file_header.e_shentsize;
5343   unsigned int          num = probe ? 1 : filedata->file_header.e_shnum;
5344
5345   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5346   if (size == 0 || num == 0)
5347     return FALSE;
5348   if (size < sizeof * shdrs)
5349     {
5350       if (! probe)
5351         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5352       return FALSE;
5353     }
5354   if (!probe && size > sizeof * shdrs)
5355     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5356
5357   shdrs = (Elf32_External_Shdr *) get_data (NULL, filedata, filedata->file_header.e_shoff,
5358                                             size, num,
5359                                             probe ? NULL : _("section headers"));
5360   if (shdrs == NULL)
5361     return FALSE;
5362
5363   free (filedata->section_headers);
5364   filedata->section_headers = (Elf_Internal_Shdr *)
5365     cmalloc (num, sizeof (Elf_Internal_Shdr));
5366   if (filedata->section_headers == NULL)
5367     {
5368       if (!probe)
5369         error (_("Out of memory reading %u section headers\n"), num);
5370       free (shdrs);
5371       return FALSE;
5372     }
5373
5374   for (i = 0, internal = filedata->section_headers;
5375        i < num;
5376        i++, internal++)
5377     {
5378       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5379       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5380       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5381       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5382       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5383       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5384       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5385       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5386       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5387       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5388       if (!probe && internal->sh_link > num)
5389         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5390       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5391         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5392     }
5393
5394   free (shdrs);
5395   return TRUE;
5396 }
5397
5398 /* Like get_32bit_section_headers, except that it fetches 64-bit headers.  */
5399
5400 static bfd_boolean
5401 get_64bit_section_headers (Filedata * filedata, bfd_boolean probe)
5402 {
5403   Elf64_External_Shdr *  shdrs;
5404   Elf_Internal_Shdr *    internal;
5405   unsigned int           i;
5406   unsigned int           size = filedata->file_header.e_shentsize;
5407   unsigned int           num = probe ? 1 : filedata->file_header.e_shnum;
5408
5409   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5410   if (size == 0 || num == 0)
5411     return FALSE;
5412
5413   if (size < sizeof * shdrs)
5414     {
5415       if (! probe)
5416         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5417       return FALSE;
5418     }
5419
5420   if (! probe && size > sizeof * shdrs)
5421     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5422
5423   shdrs = (Elf64_External_Shdr *) get_data (NULL, filedata,
5424                                             filedata->file_header.e_shoff,
5425                                             size, num,
5426                                             probe ? NULL : _("section headers"));
5427   if (shdrs == NULL)
5428     return FALSE;
5429
5430   free (filedata->section_headers);
5431   filedata->section_headers = (Elf_Internal_Shdr *)
5432     cmalloc (num, sizeof (Elf_Internal_Shdr));
5433   if (filedata->section_headers == NULL)
5434     {
5435       if (! probe)
5436         error (_("Out of memory reading %u section headers\n"), num);
5437       free (shdrs);
5438       return FALSE;
5439     }
5440
5441   for (i = 0, internal = filedata->section_headers;
5442        i < num;
5443        i++, internal++)
5444     {
5445       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5446       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5447       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5448       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5449       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5450       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5451       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5452       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5453       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5454       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5455       if (!probe && internal->sh_link > num)
5456         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5457       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5458         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5459     }
5460
5461   free (shdrs);
5462   return TRUE;
5463 }
5464
5465 static Elf_Internal_Sym *
5466 get_32bit_elf_symbols (Filedata *           filedata,
5467                        Elf_Internal_Shdr *  section,
5468                        unsigned long *      num_syms_return)
5469 {
5470   unsigned long number = 0;
5471   Elf32_External_Sym * esyms = NULL;
5472   Elf_External_Sym_Shndx * shndx = NULL;
5473   Elf_Internal_Sym * isyms = NULL;
5474   Elf_Internal_Sym * psym;
5475   unsigned int j;
5476   elf_section_list * entry;
5477
5478   if (section->sh_size == 0)
5479     {
5480       if (num_syms_return != NULL)
5481         * num_syms_return = 0;
5482       return NULL;
5483     }
5484
5485   /* Run some sanity checks first.  */
5486   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5487     {
5488       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5489              printable_section_name (filedata, section),
5490              (unsigned long) section->sh_entsize);
5491       goto exit_point;
5492     }
5493
5494   if (section->sh_size > filedata->file_size)
5495     {
5496       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5497              printable_section_name (filedata, section),
5498              (unsigned long) section->sh_size);
5499       goto exit_point;
5500     }
5501
5502   number = section->sh_size / section->sh_entsize;
5503
5504   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5505     {
5506       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5507              (unsigned long) section->sh_size,
5508              printable_section_name (filedata, section),
5509              (unsigned long) section->sh_entsize);
5510       goto exit_point;
5511     }
5512
5513   esyms = (Elf32_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5514                                            section->sh_size, _("symbols"));
5515   if (esyms == NULL)
5516     goto exit_point;
5517
5518   shndx = NULL;
5519   for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5520     {
5521       if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5522         continue;
5523
5524       if (shndx != NULL)
5525         {
5526           error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5527           free (shndx);
5528         }
5529
5530       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5531                                                    entry->hdr->sh_offset,
5532                                                    1, entry->hdr->sh_size,
5533                                                    _("symbol table section indices"));
5534       if (shndx == NULL)
5535         goto exit_point;
5536
5537       /* PR17531: file: heap-buffer-overflow */
5538       if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5539         {
5540           error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5541                  printable_section_name (filedata, entry->hdr),
5542                  (unsigned long) entry->hdr->sh_size,
5543                  (unsigned long) section->sh_size);
5544           goto exit_point;
5545         }
5546     }
5547
5548   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5549
5550   if (isyms == NULL)
5551     {
5552       error (_("Out of memory reading %lu symbols\n"),
5553              (unsigned long) number);
5554       goto exit_point;
5555     }
5556
5557   for (j = 0, psym = isyms; j < number; j++, psym++)
5558     {
5559       psym->st_name  = BYTE_GET (esyms[j].st_name);
5560       psym->st_value = BYTE_GET (esyms[j].st_value);
5561       psym->st_size  = BYTE_GET (esyms[j].st_size);
5562       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5563       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5564         psym->st_shndx
5565           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5566       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5567         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5568       psym->st_info  = BYTE_GET (esyms[j].st_info);
5569       psym->st_other = BYTE_GET (esyms[j].st_other);
5570     }
5571
5572  exit_point:
5573   free (shndx);
5574   free (esyms);
5575
5576   if (num_syms_return != NULL)
5577     * num_syms_return = isyms == NULL ? 0 : number;
5578
5579   return isyms;
5580 }
5581
5582 static Elf_Internal_Sym *
5583 get_64bit_elf_symbols (Filedata *           filedata,
5584                        Elf_Internal_Shdr *  section,
5585                        unsigned long *      num_syms_return)
5586 {
5587   unsigned long number = 0;
5588   Elf64_External_Sym * esyms = NULL;
5589   Elf_External_Sym_Shndx * shndx = NULL;
5590   Elf_Internal_Sym * isyms = NULL;
5591   Elf_Internal_Sym * psym;
5592   unsigned int j;
5593   elf_section_list * entry;
5594
5595   if (section->sh_size == 0)
5596     {
5597       if (num_syms_return != NULL)
5598         * num_syms_return = 0;
5599       return NULL;
5600     }
5601
5602   /* Run some sanity checks first.  */
5603   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5604     {
5605       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5606              printable_section_name (filedata, section),
5607              (unsigned long) section->sh_entsize);
5608       goto exit_point;
5609     }
5610
5611   if (section->sh_size > filedata->file_size)
5612     {
5613       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5614              printable_section_name (filedata, section),
5615              (unsigned long) section->sh_size);
5616       goto exit_point;
5617     }
5618
5619   number = section->sh_size / section->sh_entsize;
5620
5621   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5622     {
5623       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5624              (unsigned long) section->sh_size,
5625              printable_section_name (filedata, section),
5626              (unsigned long) section->sh_entsize);
5627       goto exit_point;
5628     }
5629
5630   esyms = (Elf64_External_Sym *) get_data (NULL, filedata, section->sh_offset, 1,
5631                                            section->sh_size, _("symbols"));
5632   if (!esyms)
5633     goto exit_point;
5634
5635   shndx = NULL;
5636   for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5637     {
5638       if (entry->hdr->sh_link != (unsigned long) (section - filedata->section_headers))
5639         continue;
5640
5641       if (shndx != NULL)
5642         {
5643           error (_("Multiple symbol table index sections associated with the same symbol section\n"));
5644           free (shndx);
5645         }
5646
5647       shndx = (Elf_External_Sym_Shndx *) get_data (NULL, filedata,
5648                                                    entry->hdr->sh_offset,
5649                                                    1, entry->hdr->sh_size,
5650                                                    _("symbol table section indices"));
5651       if (shndx == NULL)
5652         goto exit_point;
5653
5654       /* PR17531: file: heap-buffer-overflow */
5655       if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5656         {
5657           error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5658                  printable_section_name (filedata, entry->hdr),
5659                  (unsigned long) entry->hdr->sh_size,
5660                  (unsigned long) section->sh_size);
5661           goto exit_point;
5662         }
5663     }
5664
5665   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5666
5667   if (isyms == NULL)
5668     {
5669       error (_("Out of memory reading %lu symbols\n"),
5670              (unsigned long) number);
5671       goto exit_point;
5672     }
5673
5674   for (j = 0, psym = isyms; j < number; j++, psym++)
5675     {
5676       psym->st_name  = BYTE_GET (esyms[j].st_name);
5677       psym->st_info  = BYTE_GET (esyms[j].st_info);
5678       psym->st_other = BYTE_GET (esyms[j].st_other);
5679       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5680
5681       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5682         psym->st_shndx
5683           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5684       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5685         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5686
5687       psym->st_value = BYTE_GET (esyms[j].st_value);
5688       psym->st_size  = BYTE_GET (esyms[j].st_size);
5689     }
5690
5691  exit_point:
5692   free (shndx);
5693   free (esyms);
5694
5695   if (num_syms_return != NULL)
5696     * num_syms_return = isyms == NULL ? 0 : number;
5697
5698   return isyms;
5699 }
5700
5701 static const char *
5702 get_elf_section_flags (Filedata * filedata, bfd_vma sh_flags)
5703 {
5704   static char buff[1024];
5705   char * p = buff;
5706   unsigned int field_size = is_32bit_elf ? 8 : 16;
5707   signed int sindex;
5708   unsigned int size = sizeof (buff) - (field_size + 4 + 1);
5709   bfd_vma os_flags = 0;
5710   bfd_vma proc_flags = 0;
5711   bfd_vma unknown_flags = 0;
5712   static const struct
5713     {
5714       const char * str;
5715       unsigned int len;
5716     }
5717   flags [] =
5718     {
5719       /*  0 */ { STRING_COMMA_LEN ("WRITE") },
5720       /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
5721       /*  2 */ { STRING_COMMA_LEN ("EXEC") },
5722       /*  3 */ { STRING_COMMA_LEN ("MERGE") },
5723       /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
5724       /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
5725       /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5726       /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5727       /*  8 */ { STRING_COMMA_LEN ("GROUP") },
5728       /*  9 */ { STRING_COMMA_LEN ("TLS") },
5729       /* IA-64 specific.  */
5730       /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5731       /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5732       /* IA-64 OpenVMS specific.  */
5733       /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5734       /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5735       /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5736       /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5737       /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5738       /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5739       /* Generic.  */
5740       /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5741       /* SPARC specific.  */
5742       /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5743       /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5744       /* ARM specific.  */
5745       /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5746       /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5747       /* 23 */ { STRING_COMMA_LEN ("COMDEF") },
5748       /* GNU specific.  */
5749       /* 24 */ { STRING_COMMA_LEN ("GNU_MBIND") },
5750       /* VLE specific.  */
5751       /* 25 */ { STRING_COMMA_LEN ("VLE") },
5752     };
5753
5754   if (do_section_details)
5755     {
5756       sprintf (buff, "[%*.*lx]: ",
5757                field_size, field_size, (unsigned long) sh_flags);
5758       p += field_size + 4;
5759     }
5760
5761   while (sh_flags)
5762     {
5763       bfd_vma flag;
5764
5765       flag = sh_flags & - sh_flags;
5766       sh_flags &= ~ flag;
5767
5768       if (do_section_details)
5769         {
5770           switch (flag)
5771             {
5772             case SHF_WRITE:             sindex = 0; break;
5773             case SHF_ALLOC:             sindex = 1; break;
5774             case SHF_EXECINSTR:         sindex = 2; break;
5775             case SHF_MERGE:             sindex = 3; break;
5776             case SHF_STRINGS:           sindex = 4; break;
5777             case SHF_INFO_LINK:         sindex = 5; break;
5778             case SHF_LINK_ORDER:        sindex = 6; break;
5779             case SHF_OS_NONCONFORMING:  sindex = 7; break;
5780             case SHF_GROUP:             sindex = 8; break;
5781             case SHF_TLS:               sindex = 9; break;
5782             case SHF_EXCLUDE:           sindex = 18; break;
5783             case SHF_COMPRESSED:        sindex = 20; break;
5784             case SHF_GNU_MBIND:         sindex = 24; break;
5785
5786             default:
5787               sindex = -1;
5788               switch (filedata->file_header.e_machine)
5789                 {
5790                 case EM_IA_64:
5791                   if (flag == SHF_IA_64_SHORT)
5792                     sindex = 10;
5793                   else if (flag == SHF_IA_64_NORECOV)
5794                     sindex = 11;
5795 #ifdef BFD64
5796                   else if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5797                     switch (flag)
5798                       {
5799                       case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
5800                       case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
5801                       case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
5802                       case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
5803                       case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5804                       case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
5805                       default:                        break;
5806                       }
5807 #endif
5808                   break;
5809
5810                 case EM_386:
5811                 case EM_IAMCU:
5812                 case EM_X86_64:
5813                 case EM_L1OM:
5814                 case EM_K1OM:
5815                 case EM_OLD_SPARCV9:
5816                 case EM_SPARC32PLUS:
5817                 case EM_SPARCV9:
5818                 case EM_SPARC:
5819                   if (flag == SHF_ORDERED)
5820                     sindex = 19;
5821                   break;
5822
5823                 case EM_ARM:
5824                   switch (flag)
5825                     {
5826                     case SHF_ENTRYSECT: sindex = 21; break;
5827                     case SHF_ARM_PURECODE: sindex = 22; break;
5828                     case SHF_COMDEF: sindex = 23; break;
5829                     default: break;
5830                     }
5831                   break;
5832                 case EM_PPC:
5833                   if (flag == SHF_PPC_VLE)
5834                     sindex = 25;
5835                   break;
5836
5837                 default:
5838                   break;
5839                 }
5840             }
5841
5842           if (sindex != -1)
5843             {
5844               if (p != buff + field_size + 4)
5845                 {
5846                   if (size < (10 + 2))
5847                     {
5848                       warn (_("Internal error: not enough buffer room for section flag info"));
5849                       return _("<unknown>");
5850                     }
5851                   size -= 2;
5852                   *p++ = ',';
5853                   *p++ = ' ';
5854                 }
5855
5856               size -= flags [sindex].len;
5857               p = stpcpy (p, flags [sindex].str);
5858             }
5859           else if (flag & SHF_MASKOS)
5860             os_flags |= flag;
5861           else if (flag & SHF_MASKPROC)
5862             proc_flags |= flag;
5863           else
5864             unknown_flags |= flag;
5865         }
5866       else
5867         {
5868           switch (flag)
5869             {
5870             case SHF_WRITE:             *p = 'W'; break;
5871             case SHF_ALLOC:             *p = 'A'; break;
5872             case SHF_EXECINSTR:         *p = 'X'; break;
5873             case SHF_MERGE:             *p = 'M'; break;
5874             case SHF_STRINGS:           *p = 'S'; break;
5875             case SHF_INFO_LINK:         *p = 'I'; break;
5876             case SHF_LINK_ORDER:        *p = 'L'; break;
5877             case SHF_OS_NONCONFORMING:  *p = 'O'; break;
5878             case SHF_GROUP:             *p = 'G'; break;
5879             case SHF_TLS:               *p = 'T'; break;
5880             case SHF_EXCLUDE:           *p = 'E'; break;
5881             case SHF_COMPRESSED:        *p = 'C'; break;
5882             case SHF_GNU_MBIND:         *p = 'D'; break;
5883
5884             default:
5885               if ((filedata->file_header.e_machine == EM_X86_64
5886                    || filedata->file_header.e_machine == EM_L1OM
5887                    || filedata->file_header.e_machine == EM_K1OM)
5888                   && flag == SHF_X86_64_LARGE)
5889                 *p = 'l';
5890               else if (filedata->file_header.e_machine == EM_ARM
5891                        && flag == SHF_ARM_PURECODE)
5892                   *p = 'y';
5893               else if (filedata->file_header.e_machine == EM_PPC
5894                        && flag == SHF_PPC_VLE)
5895                   *p = 'v';
5896               else if (flag & SHF_MASKOS)
5897                 {
5898                   *p = 'o';
5899                   sh_flags &= ~ SHF_MASKOS;
5900                 }
5901               else if (flag & SHF_MASKPROC)
5902                 {
5903                   *p = 'p';
5904                   sh_flags &= ~ SHF_MASKPROC;
5905                 }
5906               else
5907                 *p = 'x';
5908               break;
5909             }
5910           p++;
5911         }
5912     }
5913
5914   if (do_section_details)
5915     {
5916       if (os_flags)
5917         {
5918           size -= 5 + field_size;
5919           if (p != buff + field_size + 4)
5920             {
5921               if (size < (2 + 1))
5922                 {
5923                   warn (_("Internal error: not enough buffer room for section flag info"));
5924                   return _("<unknown>");
5925                 }
5926               size -= 2;
5927               *p++ = ',';
5928               *p++ = ' ';
5929             }
5930           sprintf (p, "OS (%*.*lx)", field_size, field_size,
5931                    (unsigned long) os_flags);
5932           p += 5 + field_size;
5933         }
5934       if (proc_flags)
5935         {
5936           size -= 7 + field_size;
5937           if (p != buff + field_size + 4)
5938             {
5939               if (size < (2 + 1))
5940                 {
5941                   warn (_("Internal error: not enough buffer room for section flag info"));
5942                   return _("<unknown>");
5943                 }
5944               size -= 2;
5945               *p++ = ',';
5946               *p++ = ' ';
5947             }
5948           sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5949                    (unsigned long) proc_flags);
5950           p += 7 + field_size;
5951         }
5952       if (unknown_flags)
5953         {
5954           size -= 10 + field_size;
5955           if (p != buff + field_size + 4)
5956             {
5957               if (size < (2 + 1))
5958                 {
5959                   warn (_("Internal error: not enough buffer room for section flag info"));
5960                   return _("<unknown>");
5961                 }
5962               size -= 2;
5963               *p++ = ',';
5964               *p++ = ' ';
5965             }
5966           sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5967                    (unsigned long) unknown_flags);
5968           p += 10 + field_size;
5969         }
5970     }
5971
5972   *p = '\0';
5973   return buff;
5974 }
5975
5976 static unsigned int
5977 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf, bfd_size_type size)
5978 {
5979   if (is_32bit_elf)
5980     {
5981       Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5982
5983       if (size < sizeof (* echdr))
5984         {
5985           error (_("Compressed section is too small even for a compression header\n"));
5986           return 0;
5987         }
5988
5989       chdr->ch_type = BYTE_GET (echdr->ch_type);
5990       chdr->ch_size = BYTE_GET (echdr->ch_size);
5991       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5992       return sizeof (*echdr);
5993     }
5994   else
5995     {
5996       Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
5997
5998       if (size < sizeof (* echdr))
5999         {
6000           error (_("Compressed section is too small even for a compression header\n"));
6001           return 0;
6002         }
6003
6004       chdr->ch_type = BYTE_GET (echdr->ch_type);
6005       chdr->ch_size = BYTE_GET (echdr->ch_size);
6006       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
6007       return sizeof (*echdr);
6008     }
6009 }
6010
6011 static bfd_boolean
6012 process_section_headers (Filedata * filedata)
6013 {
6014   Elf_Internal_Shdr * section;
6015   unsigned int i;
6016
6017   filedata->section_headers = NULL;
6018
6019   if (filedata->file_header.e_shnum == 0)
6020     {
6021       /* PR binutils/12467.  */
6022       if (filedata->file_header.e_shoff != 0)
6023         {
6024           warn (_("possibly corrupt ELF file header - it has a non-zero"
6025                   " section header offset, but no section headers\n"));
6026           return FALSE;
6027         }
6028       else if (do_sections)
6029         printf (_("\nThere are no sections in this file.\n"));
6030
6031       return TRUE;
6032     }
6033
6034   if (do_sections && !do_header)
6035     printf (ngettext ("There is %d section header, "
6036                       "starting at offset 0x%lx:\n",
6037                       "There are %d section headers, "
6038                       "starting at offset 0x%lx:\n",
6039                       filedata->file_header.e_shnum),
6040             filedata->file_header.e_shnum,
6041             (unsigned long) filedata->file_header.e_shoff);
6042
6043   if (is_32bit_elf)
6044     {
6045       if (! get_32bit_section_headers (filedata, FALSE))
6046         return FALSE;
6047     }
6048   else
6049     {
6050       if (! get_64bit_section_headers (filedata, FALSE))
6051         return FALSE;
6052     }
6053
6054   /* Read in the string table, so that we have names to display.  */
6055   if (filedata->file_header.e_shstrndx != SHN_UNDEF
6056        && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
6057     {
6058       section = filedata->section_headers + filedata->file_header.e_shstrndx;
6059
6060       if (section->sh_size != 0)
6061         {
6062           filedata->string_table = (char *) get_data (NULL, filedata, section->sh_offset,
6063                                                       1, section->sh_size,
6064                                                       _("string table"));
6065
6066           filedata->string_table_length = filedata->string_table != NULL ? section->sh_size : 0;
6067         }
6068     }
6069
6070   /* Scan the sections for the dynamic symbol table
6071      and dynamic string table and debug sections.  */
6072   dynamic_symbols = NULL;
6073   dynamic_strings = NULL;
6074   dynamic_syminfo = NULL;
6075   symtab_shndx_list = NULL;
6076
6077   eh_addr_size = is_32bit_elf ? 4 : 8;
6078   switch (filedata->file_header.e_machine)
6079     {
6080     case EM_MIPS:
6081     case EM_MIPS_RS3_LE:
6082       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
6083          FDE addresses.  However, the ABI also has a semi-official ILP32
6084          variant for which the normal FDE address size rules apply.
6085
6086          GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
6087          section, where XX is the size of longs in bits.  Unfortunately,
6088          earlier compilers provided no way of distinguishing ILP32 objects
6089          from LP64 objects, so if there's any doubt, we should assume that
6090          the official LP64 form is being used.  */
6091       if ((filedata->file_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
6092           && find_section (filedata, ".gcc_compiled_long32") == NULL)
6093         eh_addr_size = 8;
6094       break;
6095
6096     case EM_H8_300:
6097     case EM_H8_300H:
6098       switch (filedata->file_header.e_flags & EF_H8_MACH)
6099         {
6100         case E_H8_MACH_H8300:
6101         case E_H8_MACH_H8300HN:
6102         case E_H8_MACH_H8300SN:
6103         case E_H8_MACH_H8300SXN:
6104           eh_addr_size = 2;
6105           break;
6106         case E_H8_MACH_H8300H:
6107         case E_H8_MACH_H8300S:
6108         case E_H8_MACH_H8300SX:
6109           eh_addr_size = 4;
6110           break;
6111         }
6112       break;
6113
6114     case EM_M32C_OLD:
6115     case EM_M32C:
6116       switch (filedata->file_header.e_flags & EF_M32C_CPU_MASK)
6117         {
6118         case EF_M32C_CPU_M16C:
6119           eh_addr_size = 2;
6120           break;
6121         }
6122       break;
6123     }
6124
6125 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64)                \
6126   do                                                                    \
6127     {                                                                   \
6128       bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64;  \
6129       if (section->sh_entsize != expected_entsize)                      \
6130         {                                                               \
6131           char buf[40];                                                 \
6132           sprintf_vma (buf, section->sh_entsize);                       \
6133           /* Note: coded this way so that there is a single string for  \
6134              translation.  */ \
6135           error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
6136           error (_("(Using the expected size of %u for the rest of this dump)\n"), \
6137                    (unsigned) expected_entsize);                        \
6138           section->sh_entsize = expected_entsize;                       \
6139         }                                                               \
6140     }                                                                   \
6141   while (0)
6142
6143 #define CHECK_ENTSIZE(section, i, type)                                 \
6144   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),         \
6145                         sizeof (Elf64_External_##type))
6146
6147   for (i = 0, section = filedata->section_headers;
6148        i < filedata->file_header.e_shnum;
6149        i++, section++)
6150     {
6151       char * name = SECTION_NAME (section);
6152
6153       if (section->sh_type == SHT_DYNSYM)
6154         {
6155           if (dynamic_symbols != NULL)
6156             {
6157               error (_("File contains multiple dynamic symbol tables\n"));
6158               continue;
6159             }
6160
6161           CHECK_ENTSIZE (section, i, Sym);
6162           dynamic_symbols = GET_ELF_SYMBOLS (filedata, section, & num_dynamic_syms);
6163         }
6164       else if (section->sh_type == SHT_STRTAB
6165                && streq (name, ".dynstr"))
6166         {
6167           if (dynamic_strings != NULL)
6168             {
6169               error (_("File contains multiple dynamic string tables\n"));
6170               continue;
6171             }
6172
6173           dynamic_strings = (char *) get_data (NULL, filedata, section->sh_offset,
6174                                                1, section->sh_size,
6175                                                _("dynamic strings"));
6176           dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
6177         }
6178       else if (section->sh_type == SHT_SYMTAB_SHNDX)
6179         {
6180           elf_section_list * entry = xmalloc (sizeof * entry);
6181
6182           entry->hdr = section;
6183           entry->next = symtab_shndx_list;
6184           symtab_shndx_list = entry;
6185         }
6186       else if (section->sh_type == SHT_SYMTAB)
6187         CHECK_ENTSIZE (section, i, Sym);
6188       else if (section->sh_type == SHT_GROUP)
6189         CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
6190       else if (section->sh_type == SHT_REL)
6191         CHECK_ENTSIZE (section, i, Rel);
6192       else if (section->sh_type == SHT_RELA)
6193         CHECK_ENTSIZE (section, i, Rela);
6194       else if ((do_debugging || do_debug_info || do_debug_abbrevs
6195                 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
6196                 || do_debug_aranges || do_debug_frames || do_debug_macinfo
6197                 || do_debug_str || do_debug_loc || do_debug_ranges
6198                 || do_debug_addr || do_debug_cu_index || do_debug_links)
6199                && (const_strneq (name, ".debug_")
6200                    || const_strneq (name, ".zdebug_")))
6201         {
6202           if (name[1] == 'z')
6203             name += sizeof (".zdebug_") - 1;
6204           else
6205             name += sizeof (".debug_") - 1;
6206
6207           if (do_debugging
6208               || (do_debug_info     && const_strneq (name, "info"))
6209               || (do_debug_info     && const_strneq (name, "types"))
6210               || (do_debug_abbrevs  && const_strneq (name, "abbrev"))
6211               || (do_debug_lines    && strcmp (name, "line") == 0)
6212               || (do_debug_lines    && const_strneq (name, "line."))
6213               || (do_debug_pubnames && const_strneq (name, "pubnames"))
6214               || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
6215               || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
6216               || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
6217               || (do_debug_aranges  && const_strneq (name, "aranges"))
6218               || (do_debug_ranges   && const_strneq (name, "ranges"))
6219               || (do_debug_ranges   && const_strneq (name, "rnglists"))
6220               || (do_debug_frames   && const_strneq (name, "frame"))
6221               || (do_debug_macinfo  && const_strneq (name, "macinfo"))
6222               || (do_debug_macinfo  && const_strneq (name, "macro"))
6223               || (do_debug_str      && const_strneq (name, "str"))
6224               || (do_debug_loc      && const_strneq (name, "loc"))
6225               || (do_debug_loc      && const_strneq (name, "loclists"))
6226               || (do_debug_addr     && const_strneq (name, "addr"))
6227               || (do_debug_cu_index && const_strneq (name, "cu_index"))
6228               || (do_debug_cu_index && const_strneq (name, "tu_index"))
6229               )
6230             request_dump_bynumber (filedata, i, DEBUG_DUMP);
6231         }
6232       /* Linkonce section to be combined with .debug_info at link time.  */
6233       else if ((do_debugging || do_debug_info)
6234                && const_strneq (name, ".gnu.linkonce.wi."))
6235         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6236       else if (do_debug_frames && streq (name, ".eh_frame"))
6237         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6238       else if (do_gdb_index && (streq (name, ".gdb_index")
6239                                 || streq (name, ".debug_names")))
6240         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6241       /* Trace sections for Itanium VMS.  */
6242       else if ((do_debugging || do_trace_info || do_trace_abbrevs
6243                 || do_trace_aranges)
6244                && const_strneq (name, ".trace_"))
6245         {
6246           name += sizeof (".trace_") - 1;
6247
6248           if (do_debugging
6249               || (do_trace_info     && streq (name, "info"))
6250               || (do_trace_abbrevs  && streq (name, "abbrev"))
6251               || (do_trace_aranges  && streq (name, "aranges"))
6252               )
6253             request_dump_bynumber (filedata, i, DEBUG_DUMP);
6254         }
6255       else if ((do_debugging || do_debug_links)
6256                && (const_strneq (name, ".gnu_debuglink")
6257                    || const_strneq (name, ".gnu_debugaltlink")))
6258         request_dump_bynumber (filedata, i, DEBUG_DUMP);
6259     }
6260
6261   if (! do_sections)
6262     return TRUE;
6263
6264   if (filedata->file_header.e_shnum > 1)
6265     printf (_("\nSection Headers:\n"));
6266   else
6267     printf (_("\nSection Header:\n"));
6268
6269   if (is_32bit_elf)
6270     {
6271       if (do_section_details)
6272         {
6273           printf (_("  [Nr] Name\n"));
6274           printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
6275         }
6276       else
6277         printf
6278           (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
6279     }
6280   else if (do_wide)
6281     {
6282       if (do_section_details)
6283         {
6284           printf (_("  [Nr] Name\n"));
6285           printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
6286         }
6287       else
6288         printf
6289           (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
6290     }
6291   else
6292     {
6293       if (do_section_details)
6294         {
6295           printf (_("  [Nr] Name\n"));
6296           printf (_("       Type              Address          Offset            Link\n"));
6297           printf (_("       Size              EntSize          Info              Align\n"));
6298         }
6299       else
6300         {
6301           printf (_("  [Nr] Name              Type             Address           Offset\n"));
6302           printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
6303         }
6304     }
6305
6306   if (do_section_details)
6307     printf (_("       Flags\n"));
6308
6309   for (i = 0, section = filedata->section_headers;
6310        i < filedata->file_header.e_shnum;
6311        i++, section++)
6312     {
6313       /* Run some sanity checks on the section header.  */
6314
6315       /* Check the sh_link field.  */
6316       switch (section->sh_type)
6317         {
6318         case SHT_REL:
6319         case SHT_RELA:
6320           if (section->sh_link == 0
6321               && (filedata->file_header.e_type == ET_EXEC
6322                   || filedata->file_header.e_type == ET_DYN))
6323             /* A dynamic relocation section where all entries use a
6324                zero symbol index need not specify a symtab section.  */
6325             break;
6326           /* Fall through.  */
6327         case SHT_SYMTAB_SHNDX:
6328         case SHT_GROUP:
6329         case SHT_HASH:
6330         case SHT_GNU_HASH:
6331         case SHT_GNU_versym:
6332           if (section->sh_link == 0
6333               || section->sh_link >= filedata->file_header.e_shnum
6334               || (filedata->section_headers[section->sh_link].sh_type != SHT_SYMTAB
6335                   && filedata->section_headers[section->sh_link].sh_type != SHT_DYNSYM))
6336             warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
6337                   i, section->sh_link);
6338           break;
6339
6340         case SHT_DYNAMIC:
6341         case SHT_SYMTAB:
6342         case SHT_DYNSYM:
6343         case SHT_GNU_verneed:
6344         case SHT_GNU_verdef:
6345         case SHT_GNU_LIBLIST:
6346           if (section->sh_link == 0
6347               || section->sh_link >= filedata->file_header.e_shnum
6348               || filedata->section_headers[section->sh_link].sh_type != SHT_STRTAB)
6349             warn (_("[%2u]: Link field (%u) should index a string section.\n"),
6350                   i, section->sh_link);
6351           break;
6352
6353         case SHT_INIT_ARRAY:
6354         case SHT_FINI_ARRAY:
6355         case SHT_PREINIT_ARRAY:
6356           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6357             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6358                   i, section->sh_link);
6359           break;
6360
6361         default:
6362           /* FIXME: Add support for target specific section types.  */
6363 #if 0     /* Currently we do not check other section types as there are too
6364              many special cases.  Stab sections for example have a type
6365              of SHT_PROGBITS but an sh_link field that links to the .stabstr
6366              section.  */
6367           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
6368             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
6369                   i, section->sh_link);
6370 #endif
6371           break;
6372         }
6373
6374       /* Check the sh_info field.  */
6375       switch (section->sh_type)
6376         {
6377         case SHT_REL:
6378         case SHT_RELA:
6379           if (section->sh_info == 0
6380               && (filedata->file_header.e_type == ET_EXEC
6381                   || filedata->file_header.e_type == ET_DYN))
6382             /* Dynamic relocations apply to segments, so they do not
6383                need to specify the section they relocate.  */
6384             break;
6385           if (section->sh_info == 0
6386               || section->sh_info >= filedata->file_header.e_shnum
6387               || (filedata->section_headers[section->sh_info].sh_type != SHT_PROGBITS
6388                   && filedata->section_headers[section->sh_info].sh_type != SHT_NOBITS
6389                   && filedata->section_headers[section->sh_info].sh_type != SHT_NOTE
6390                   && filedata->section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
6391                   && filedata->section_headers[section->sh_info].sh_type != SHT_FINI_ARRAY
6392                   && filedata->section_headers[section->sh_info].sh_type != SHT_PREINIT_ARRAY
6393                   /* FIXME: Are other section types valid ?  */
6394                   && filedata->section_headers[section->sh_info].sh_type < SHT_LOOS))
6395             warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6396                   i, section->sh_info);
6397           break;
6398
6399         case SHT_DYNAMIC:
6400         case SHT_HASH:
6401         case SHT_SYMTAB_SHNDX:
6402         case SHT_INIT_ARRAY:
6403         case SHT_FINI_ARRAY:
6404         case SHT_PREINIT_ARRAY:
6405           if (section->sh_info != 0)
6406             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6407                   i, section->sh_info);
6408           break;
6409
6410         case SHT_GROUP:
6411         case SHT_SYMTAB:
6412         case SHT_DYNSYM:
6413           /* A symbol index - we assume that it is valid.  */
6414           break;
6415
6416         default:
6417           /* FIXME: Add support for target specific section types.  */
6418           if (section->sh_type == SHT_NOBITS)
6419             /* NOBITS section headers with non-zero sh_info fields can be
6420                created when a binary is stripped of everything but its debug
6421                information.  The stripped sections have their headers
6422                preserved but their types set to SHT_NOBITS.  So do not check
6423                this type of section.  */
6424             ;
6425           else if (section->sh_flags & SHF_INFO_LINK)
6426             {
6427               if (section->sh_info < 1 || section->sh_info >= filedata->file_header.e_shnum)
6428                 warn (_("[%2u]: Expected link to another section in info field"), i);
6429             }
6430           else if (section->sh_type < SHT_LOOS
6431                    && (section->sh_flags & SHF_GNU_MBIND) == 0
6432                    && section->sh_info != 0)
6433             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6434                   i, section->sh_info);
6435           break;
6436         }
6437
6438       /* Check the sh_size field.  */
6439       if (section->sh_size > filedata->file_size
6440           && section->sh_type != SHT_NOBITS
6441           && section->sh_type != SHT_NULL
6442           && section->sh_type < SHT_LOOS)
6443         warn (_("Size of section %u is larger than the entire file!\n"), i);
6444
6445       printf ("  [%2u] ", i);
6446       if (do_section_details)
6447         printf ("%s\n      ", printable_section_name (filedata, section));
6448       else
6449         print_symbol (-17, SECTION_NAME (section));
6450
6451       printf (do_wide ? " %-15s " : " %-15.15s ",
6452               get_section_type_name (filedata, section->sh_type));
6453
6454       if (is_32bit_elf)
6455         {
6456           const char * link_too_big = NULL;
6457
6458           print_vma (section->sh_addr, LONG_HEX);
6459
6460           printf ( " %6.6lx %6.6lx %2.2lx",
6461                    (unsigned long) section->sh_offset,
6462                    (unsigned long) section->sh_size,
6463                    (unsigned long) section->sh_entsize);
6464
6465           if (do_section_details)
6466             fputs ("  ", stdout);
6467           else
6468             printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6469
6470           if (section->sh_link >= filedata->file_header.e_shnum)
6471             {
6472               link_too_big = "";
6473               /* The sh_link value is out of range.  Normally this indicates
6474                  an error but it can have special values in Solaris binaries.  */
6475               switch (filedata->file_header.e_machine)
6476                 {
6477                 case EM_386:
6478                 case EM_IAMCU:
6479                 case EM_X86_64:
6480                 case EM_L1OM:
6481                 case EM_K1OM:
6482                 case EM_OLD_SPARCV9:
6483                 case EM_SPARC32PLUS:
6484                 case EM_SPARCV9:
6485                 case EM_SPARC:
6486                   if (section->sh_link == (SHN_BEFORE & 0xffff))
6487                     link_too_big = "BEFORE";
6488                   else if (section->sh_link == (SHN_AFTER & 0xffff))
6489                     link_too_big = "AFTER";
6490                   break;
6491                 default:
6492                   break;
6493                 }
6494             }
6495
6496           if (do_section_details)
6497             {
6498               if (link_too_big != NULL && * link_too_big)
6499                 printf ("<%s> ", link_too_big);
6500               else
6501                 printf ("%2u ", section->sh_link);
6502               printf ("%3u %2lu\n", section->sh_info,
6503                       (unsigned long) section->sh_addralign);
6504             }
6505           else
6506             printf ("%2u %3u %2lu\n",
6507                     section->sh_link,
6508                     section->sh_info,
6509                     (unsigned long) section->sh_addralign);
6510
6511           if (link_too_big && ! * link_too_big)
6512             warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6513                   i, section->sh_link);
6514         }
6515       else if (do_wide)
6516         {
6517           print_vma (section->sh_addr, LONG_HEX);
6518
6519           if ((long) section->sh_offset == section->sh_offset)
6520             printf (" %6.6lx", (unsigned long) section->sh_offset);
6521           else
6522             {
6523               putchar (' ');
6524               print_vma (section->sh_offset, LONG_HEX);
6525             }
6526
6527           if ((unsigned long) section->sh_size == section->sh_size)
6528             printf (" %6.6lx", (unsigned long) section->sh_size);
6529           else
6530             {
6531               putchar (' ');
6532               print_vma (section->sh_size, LONG_HEX);
6533             }
6534
6535           if ((unsigned long) section->sh_entsize == section->sh_entsize)
6536             printf (" %2.2lx", (unsigned long) section->sh_entsize);
6537           else
6538             {
6539               putchar (' ');
6540               print_vma (section->sh_entsize, LONG_HEX);
6541             }
6542
6543           if (do_section_details)
6544             fputs ("  ", stdout);
6545           else
6546             printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6547
6548           printf ("%2u %3u ", section->sh_link, section->sh_info);
6549
6550           if ((unsigned long) section->sh_addralign == section->sh_addralign)
6551             printf ("%2lu\n", (unsigned long) section->sh_addralign);
6552           else
6553             {
6554               print_vma (section->sh_addralign, DEC);
6555               putchar ('\n');
6556             }
6557         }
6558       else if (do_section_details)
6559         {
6560           putchar (' ');
6561           print_vma (section->sh_addr, LONG_HEX);
6562           if ((long) section->sh_offset == section->sh_offset)
6563             printf ("  %16.16lx", (unsigned long) section->sh_offset);
6564           else
6565             {
6566               printf ("  ");
6567               print_vma (section->sh_offset, LONG_HEX);
6568             }
6569           printf ("  %u\n       ", section->sh_link);
6570           print_vma (section->sh_size, LONG_HEX);
6571           putchar (' ');
6572           print_vma (section->sh_entsize, LONG_HEX);
6573
6574           printf ("  %-16u  %lu\n",
6575                   section->sh_info,
6576                   (unsigned long) section->sh_addralign);
6577         }
6578       else
6579         {
6580           putchar (' ');
6581           print_vma (section->sh_addr, LONG_HEX);
6582           if ((long) section->sh_offset == section->sh_offset)
6583             printf ("  %8.8lx", (unsigned long) section->sh_offset);
6584           else
6585             {
6586               printf ("  ");
6587               print_vma (section->sh_offset, LONG_HEX);
6588             }
6589           printf ("\n       ");
6590           print_vma (section->sh_size, LONG_HEX);
6591           printf ("  ");
6592           print_vma (section->sh_entsize, LONG_HEX);
6593
6594           printf (" %3s ", get_elf_section_flags (filedata, section->sh_flags));
6595
6596           printf ("     %2u   %3u     %lu\n",
6597                   section->sh_link,
6598                   section->sh_info,
6599                   (unsigned long) section->sh_addralign);
6600         }
6601
6602       if (do_section_details)
6603         {
6604           printf ("       %s\n", get_elf_section_flags (filedata, section->sh_flags));
6605           if ((section->sh_flags & SHF_COMPRESSED) != 0)
6606             {
6607               /* Minimum section size is 12 bytes for 32-bit compression
6608                  header + 12 bytes for compressed data header.  */
6609               unsigned char buf[24];
6610
6611               assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6612               if (get_data (&buf, filedata, section->sh_offset, 1,
6613                             sizeof (buf), _("compression header")))
6614                 {
6615                   Elf_Internal_Chdr chdr;
6616
6617                   (void) get_compression_header (&chdr, buf, sizeof (buf));
6618
6619                   if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6620                     printf ("       ZLIB, ");
6621                   else
6622                     printf (_("       [<unknown>: 0x%x], "),
6623                             chdr.ch_type);
6624                   print_vma (chdr.ch_size, LONG_HEX);
6625                   printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6626                 }
6627             }
6628         }
6629     }
6630
6631   if (!do_section_details)
6632     {
6633       /* The ordering of the letters shown here matches the ordering of the
6634          corresponding SHF_xxx values, and hence the order in which these
6635          letters will be displayed to the user.  */
6636       printf (_("Key to Flags:\n\
6637   W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6638   L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6639   C (compressed), x (unknown), o (OS specific), E (exclude),\n  "));
6640       if (filedata->file_header.e_machine == EM_X86_64
6641           || filedata->file_header.e_machine == EM_L1OM
6642           || filedata->file_header.e_machine == EM_K1OM)
6643         printf (_("l (large), "));
6644       else if (filedata->file_header.e_machine == EM_ARM)
6645         printf (_("y (purecode), "));
6646       else if (filedata->file_header.e_machine == EM_PPC)
6647         printf (_("v (VLE), "));
6648       printf ("p (processor specific)\n");
6649     }
6650
6651   return TRUE;
6652 }
6653
6654 static const char *
6655 get_group_flags (unsigned int flags)
6656 {
6657   static char buff[128];
6658
6659   if (flags == 0)
6660     return "";
6661   else if (flags == GRP_COMDAT)
6662     return "COMDAT ";
6663
6664   snprintf (buff, 14, _("[0x%x: "), flags);
6665
6666   flags &= ~ GRP_COMDAT;
6667   if (flags & GRP_MASKOS)
6668     {
6669       strcat (buff, "<OS specific>");
6670       flags &= ~ GRP_MASKOS;
6671     }
6672
6673   if (flags & GRP_MASKPROC)
6674     {
6675       strcat (buff, "<PROC specific>");
6676       flags &= ~ GRP_MASKPROC;
6677     }
6678
6679   if (flags)
6680     strcat (buff, "<unknown>");
6681
6682   strcat (buff, "]");
6683   return buff;
6684 }
6685
6686 static bfd_boolean
6687 process_section_groups (Filedata * filedata)
6688 {
6689   Elf_Internal_Shdr * section;
6690   unsigned int i;
6691   struct group * group;
6692   Elf_Internal_Shdr * symtab_sec;
6693   Elf_Internal_Shdr * strtab_sec;
6694   Elf_Internal_Sym * symtab;
6695   unsigned long num_syms;
6696   char * strtab;
6697   size_t strtab_size;
6698
6699   /* Don't process section groups unless needed.  */
6700   if (!do_unwind && !do_section_groups)
6701     return TRUE;
6702
6703   if (filedata->file_header.e_shnum == 0)
6704     {
6705       if (do_section_groups)
6706         printf (_("\nThere are no sections to group in this file.\n"));
6707
6708       return TRUE;
6709     }
6710
6711   if (filedata->section_headers == NULL)
6712     {
6713       error (_("Section headers are not available!\n"));
6714       /* PR 13622: This can happen with a corrupt ELF header.  */
6715       return FALSE;
6716     }
6717
6718   section_headers_groups = (struct group **) calloc (filedata->file_header.e_shnum,
6719                                                      sizeof (struct group *));
6720
6721   if (section_headers_groups == NULL)
6722     {
6723       error (_("Out of memory reading %u section group headers\n"),
6724              filedata->file_header.e_shnum);
6725       return FALSE;
6726     }
6727
6728   /* Scan the sections for the group section.  */
6729   group_count = 0;
6730   for (i = 0, section = filedata->section_headers;
6731        i < filedata->file_header.e_shnum;
6732        i++, section++)
6733     if (section->sh_type == SHT_GROUP)
6734       group_count++;
6735
6736   if (group_count == 0)
6737     {
6738       if (do_section_groups)
6739         printf (_("\nThere are no section groups in this file.\n"));
6740
6741       return TRUE;
6742     }
6743
6744   section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6745
6746   if (section_groups == NULL)
6747     {
6748       error (_("Out of memory reading %lu groups\n"),
6749              (unsigned long) group_count);
6750       return FALSE;
6751     }
6752
6753   symtab_sec = NULL;
6754   strtab_sec = NULL;
6755   symtab = NULL;
6756   num_syms = 0;
6757   strtab = NULL;
6758   strtab_size = 0;
6759   for (i = 0, section = filedata->section_headers, group = section_groups;
6760        i < filedata->file_header.e_shnum;
6761        i++, section++)
6762     {
6763       if (section->sh_type == SHT_GROUP)
6764         {
6765           const char * name = printable_section_name (filedata, section);
6766           const char * group_name;
6767           unsigned char * start;
6768           unsigned char * indices;
6769           unsigned int entry, j, size;
6770           Elf_Internal_Shdr * sec;
6771           Elf_Internal_Sym * sym;
6772
6773           /* Get the symbol table.  */
6774           if (section->sh_link >= filedata->file_header.e_shnum
6775               || ((sec = filedata->section_headers + section->sh_link)->sh_type
6776                   != SHT_SYMTAB))
6777             {
6778               error (_("Bad sh_link in group section `%s'\n"), name);
6779               continue;
6780             }
6781
6782           if (symtab_sec != sec)
6783             {
6784               symtab_sec = sec;
6785               if (symtab)
6786                 free (symtab);
6787               symtab = GET_ELF_SYMBOLS (filedata, symtab_sec, & num_syms);
6788             }
6789
6790           if (symtab == NULL)
6791             {
6792               error (_("Corrupt header in group section `%s'\n"), name);
6793               continue;
6794             }
6795
6796           if (section->sh_info >= num_syms)
6797             {
6798               error (_("Bad sh_info in group section `%s'\n"), name);
6799               continue;
6800             }
6801
6802           sym = symtab + section->sh_info;
6803
6804           if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6805             {
6806               if (sym->st_shndx == 0
6807                   || sym->st_shndx >= filedata->file_header.e_shnum)
6808                 {
6809                   error (_("Bad sh_info in group section `%s'\n"), name);
6810                   continue;
6811                 }
6812
6813               group_name = SECTION_NAME (filedata->section_headers + sym->st_shndx);
6814               strtab_sec = NULL;
6815               if (strtab)
6816                 free (strtab);
6817               strtab = NULL;
6818               strtab_size = 0;
6819             }
6820           else
6821             {
6822               /* Get the string table.  */
6823               if (symtab_sec->sh_link >= filedata->file_header.e_shnum)
6824                 {
6825                   strtab_sec = NULL;
6826                   if (strtab)
6827                     free (strtab);
6828                   strtab = NULL;
6829                   strtab_size = 0;
6830                 }
6831               else if (strtab_sec
6832                        != (sec = filedata->section_headers + symtab_sec->sh_link))
6833                 {
6834                   strtab_sec = sec;
6835                   if (strtab)
6836                     free (strtab);
6837
6838                   strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
6839                                               1, strtab_sec->sh_size,
6840                                               _("string table"));
6841                   strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6842                 }
6843               group_name = sym->st_name < strtab_size
6844                 ? strtab + sym->st_name : _("<corrupt>");
6845             }
6846
6847           /* PR 17531: file: loop.  */
6848           if (section->sh_entsize > section->sh_size)
6849             {
6850               error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6851                      printable_section_name (filedata, section),
6852                      (unsigned long) section->sh_entsize,
6853                      (unsigned long) section->sh_size);
6854               break;
6855             }
6856
6857           start = (unsigned char *) get_data (NULL, filedata, section->sh_offset,
6858                                               1, section->sh_size,
6859                                               _("section data"));
6860           if (start == NULL)
6861             continue;
6862
6863           indices = start;
6864           size = (section->sh_size / section->sh_entsize) - 1;
6865           entry = byte_get (indices, 4);
6866           indices += 4;
6867
6868           if (do_section_groups)
6869             {
6870               printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6871                       get_group_flags (entry), i, name, group_name, size);
6872
6873               printf (_("   [Index]    Name\n"));
6874             }
6875
6876           group->group_index = i;
6877
6878           for (j = 0; j < size; j++)
6879             {
6880               struct group_list * g;
6881
6882               entry = byte_get (indices, 4);
6883               indices += 4;
6884
6885               if (entry >= filedata->file_header.e_shnum)
6886                 {
6887                   static unsigned num_group_errors = 0;
6888
6889                   if (num_group_errors ++ < 10)
6890                     {
6891                       error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6892                              entry, i, filedata->file_header.e_shnum - 1);
6893                       if (num_group_errors == 10)
6894                         warn (_("Further error messages about overlarge group section indices suppressed\n"));
6895                     }
6896                   continue;
6897                 }
6898
6899               if (section_headers_groups [entry] != NULL)
6900                 {
6901                   if (entry)
6902                     {
6903                       static unsigned num_errs = 0;
6904
6905                       if (num_errs ++ < 10)
6906                         {
6907                           error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6908                                  entry, i,
6909                                  section_headers_groups [entry]->group_index);
6910                           if (num_errs == 10)
6911                             warn (_("Further error messages about already contained group sections suppressed\n"));
6912                         }
6913                       continue;
6914                     }
6915                   else
6916                     {
6917                       /* Intel C/C++ compiler may put section 0 in a
6918                          section group.  We just warn it the first time
6919                          and ignore it afterwards.  */
6920                       static bfd_boolean warned = FALSE;
6921                       if (!warned)
6922                         {
6923                           error (_("section 0 in group section [%5u]\n"),
6924                                  section_headers_groups [entry]->group_index);
6925                           warned = TRUE;
6926                         }
6927                     }
6928                 }
6929
6930               section_headers_groups [entry] = group;
6931
6932               if (do_section_groups)
6933                 {
6934                   sec = filedata->section_headers + entry;
6935                   printf ("   [%5u]   %s\n", entry, printable_section_name (filedata, sec));
6936                 }
6937
6938               g = (struct group_list *) xmalloc (sizeof (struct group_list));
6939               g->section_index = entry;
6940               g->next = group->root;
6941               group->root = g;
6942             }
6943
6944           if (start)
6945             free (start);
6946
6947           group++;
6948         }
6949     }
6950
6951   if (symtab)
6952     free (symtab);
6953   if (strtab)
6954     free (strtab);
6955   return TRUE;
6956 }
6957
6958 /* Data used to display dynamic fixups.  */
6959
6960 struct ia64_vms_dynfixup
6961 {
6962   bfd_vma needed_ident;         /* Library ident number.  */
6963   bfd_vma needed;               /* Index in the dstrtab of the library name.  */
6964   bfd_vma fixup_needed;         /* Index of the library.  */
6965   bfd_vma fixup_rela_cnt;       /* Number of fixups.  */
6966   bfd_vma fixup_rela_off;       /* Fixups offset in the dynamic segment.  */
6967 };
6968
6969 /* Data used to display dynamic relocations.  */
6970
6971 struct ia64_vms_dynimgrela
6972 {
6973   bfd_vma img_rela_cnt;         /* Number of relocations.  */
6974   bfd_vma img_rela_off;         /* Reloc offset in the dynamic segment.  */
6975 };
6976
6977 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6978    library).  */
6979
6980 static bfd_boolean
6981 dump_ia64_vms_dynamic_fixups (Filedata *                  filedata,
6982                               struct ia64_vms_dynfixup *  fixup,
6983                               const char *                strtab,
6984                               unsigned int                strtab_sz)
6985 {
6986   Elf64_External_VMS_IMAGE_FIXUP * imfs;
6987   long i;
6988   const char * lib_name;
6989
6990   imfs = get_data (NULL, filedata, dynamic_addr + fixup->fixup_rela_off,
6991                    1, fixup->fixup_rela_cnt * sizeof (*imfs),
6992                    _("dynamic section image fixups"));
6993   if (!imfs)
6994     return FALSE;
6995
6996   if (fixup->needed < strtab_sz)
6997     lib_name = strtab + fixup->needed;
6998   else
6999     {
7000       warn (_("corrupt library name index of 0x%lx found in dynamic entry"),
7001             (unsigned long) fixup->needed);
7002       lib_name = "???";
7003     }
7004   printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
7005           (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
7006   printf
7007     (_("Seg Offset           Type                             SymVec DataType\n"));
7008
7009   for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
7010     {
7011       unsigned int type;
7012       const char *rtype;
7013
7014       printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
7015       printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
7016       type = BYTE_GET (imfs [i].type);
7017       rtype = elf_ia64_reloc_type (type);
7018       if (rtype == NULL)
7019         printf (" 0x%08x                       ", type);
7020       else
7021         printf (" %-32s ", rtype);
7022       printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
7023       printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
7024     }
7025
7026   free (imfs);
7027   return TRUE;
7028 }
7029
7030 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
7031
7032 static bfd_boolean
7033 dump_ia64_vms_dynamic_relocs (Filedata * filedata, struct ia64_vms_dynimgrela *imgrela)
7034 {
7035   Elf64_External_VMS_IMAGE_RELA *imrs;
7036   long i;
7037
7038   imrs = get_data (NULL, filedata, dynamic_addr + imgrela->img_rela_off,
7039                    1, imgrela->img_rela_cnt * sizeof (*imrs),
7040                    _("dynamic section image relocations"));
7041   if (!imrs)
7042     return FALSE;
7043
7044   printf (_("\nImage relocs\n"));
7045   printf
7046     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
7047
7048   for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
7049     {
7050       unsigned int type;
7051       const char *rtype;
7052
7053       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
7054       printf ("%08" BFD_VMA_FMT "x ",
7055               (bfd_vma) BYTE_GET (imrs [i].rela_offset));
7056       type = BYTE_GET (imrs [i].type);
7057       rtype = elf_ia64_reloc_type (type);
7058       if (rtype == NULL)
7059         printf ("0x%08x                      ", type);
7060       else
7061         printf ("%-31s ", rtype);
7062       print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
7063       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
7064       printf ("%08" BFD_VMA_FMT "x\n",
7065               (bfd_vma) BYTE_GET (imrs [i].sym_offset));
7066     }
7067
7068   free (imrs);
7069   return TRUE;
7070 }
7071
7072 /* Display IA-64 OpenVMS dynamic relocations and fixups.  */
7073
7074 static bfd_boolean
7075 process_ia64_vms_dynamic_relocs (Filedata * filedata)
7076 {
7077   struct ia64_vms_dynfixup fixup;
7078   struct ia64_vms_dynimgrela imgrela;
7079   Elf_Internal_Dyn *entry;
7080   bfd_vma strtab_off = 0;
7081   bfd_vma strtab_sz = 0;
7082   char *strtab = NULL;
7083   bfd_boolean res = TRUE;
7084
7085   memset (&fixup, 0, sizeof (fixup));
7086   memset (&imgrela, 0, sizeof (imgrela));
7087
7088   /* Note: the order of the entries is specified by the OpenVMS specs.  */
7089   for (entry = dynamic_section;
7090        entry < dynamic_section + dynamic_nent;
7091        entry++)
7092     {
7093       switch (entry->d_tag)
7094         {
7095         case DT_IA_64_VMS_STRTAB_OFFSET:
7096           strtab_off = entry->d_un.d_val;
7097           break;
7098         case DT_STRSZ:
7099           strtab_sz = entry->d_un.d_val;
7100           if (strtab == NULL)
7101             strtab = get_data (NULL, filedata, dynamic_addr + strtab_off,
7102                                1, strtab_sz, _("dynamic string section"));
7103           break;
7104
7105         case DT_IA_64_VMS_NEEDED_IDENT:
7106           fixup.needed_ident = entry->d_un.d_val;
7107           break;
7108         case DT_NEEDED:
7109           fixup.needed = entry->d_un.d_val;
7110           break;
7111         case DT_IA_64_VMS_FIXUP_NEEDED:
7112           fixup.fixup_needed = entry->d_un.d_val;
7113           break;
7114         case DT_IA_64_VMS_FIXUP_RELA_CNT:
7115           fixup.fixup_rela_cnt = entry->d_un.d_val;
7116           break;
7117         case DT_IA_64_VMS_FIXUP_RELA_OFF:
7118           fixup.fixup_rela_off = entry->d_un.d_val;
7119           if (! dump_ia64_vms_dynamic_fixups (filedata, &fixup, strtab, strtab_sz))
7120             res = FALSE;
7121           break;
7122         case DT_IA_64_VMS_IMG_RELA_CNT:
7123           imgrela.img_rela_cnt = entry->d_un.d_val;
7124           break;
7125         case DT_IA_64_VMS_IMG_RELA_OFF:
7126           imgrela.img_rela_off = entry->d_un.d_val;
7127           if (! dump_ia64_vms_dynamic_relocs (filedata, &imgrela))
7128             res = FALSE;
7129           break;
7130
7131         default:
7132           break;
7133         }
7134     }
7135
7136   if (strtab != NULL)
7137     free (strtab);
7138
7139   return res;
7140 }
7141
7142 static struct
7143 {
7144   const char * name;
7145   int reloc;
7146   int size;
7147   int rela;
7148 }
7149   dynamic_relocations [] =
7150 {
7151   { "REL", DT_REL, DT_RELSZ, FALSE },
7152   { "RELA", DT_RELA, DT_RELASZ, TRUE },
7153   { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
7154 };
7155
7156 /* Process the reloc section.  */
7157
7158 static bfd_boolean
7159 process_relocs (Filedata * filedata)
7160 {
7161   unsigned long rel_size;
7162   unsigned long rel_offset;
7163
7164   if (!do_reloc)
7165     return TRUE;
7166
7167   if (do_using_dynamic)
7168     {
7169       int          is_rela;
7170       const char * name;
7171       bfd_boolean  has_dynamic_reloc;
7172       unsigned int i;
7173
7174       has_dynamic_reloc = FALSE;
7175
7176       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7177         {
7178           is_rela = dynamic_relocations [i].rela;
7179           name = dynamic_relocations [i].name;
7180           rel_size = dynamic_info [dynamic_relocations [i].size];
7181           rel_offset = dynamic_info [dynamic_relocations [i].reloc];
7182
7183           if (rel_size)
7184             has_dynamic_reloc = TRUE;
7185
7186           if (is_rela == UNKNOWN)
7187             {
7188               if (dynamic_relocations [i].reloc == DT_JMPREL)
7189                 switch (dynamic_info[DT_PLTREL])
7190                   {
7191                   case DT_REL:
7192                     is_rela = FALSE;
7193                     break;
7194                   case DT_RELA:
7195                     is_rela = TRUE;
7196                     break;
7197                   }
7198             }
7199
7200           if (rel_size)
7201             {
7202               printf
7203                 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
7204                  name, rel_offset, rel_size);
7205
7206               dump_relocations (filedata,
7207                                 offset_from_vma (filedata, rel_offset, rel_size),
7208                                 rel_size,
7209                                 dynamic_symbols, num_dynamic_syms,
7210                                 dynamic_strings, dynamic_strings_length,
7211                                 is_rela, TRUE /* is_dynamic */);
7212             }
7213         }
7214
7215       if (is_ia64_vms (filedata))
7216         if (process_ia64_vms_dynamic_relocs (filedata))
7217           has_dynamic_reloc = TRUE;
7218
7219       if (! has_dynamic_reloc)
7220         printf (_("\nThere are no dynamic relocations in this file.\n"));
7221     }
7222   else
7223     {
7224       Elf_Internal_Shdr * section;
7225       unsigned long i;
7226       bfd_boolean found = FALSE;
7227
7228       for (i = 0, section = filedata->section_headers;
7229            i < filedata->file_header.e_shnum;
7230            i++, section++)
7231         {
7232           if (   section->sh_type != SHT_RELA
7233               && section->sh_type != SHT_REL)
7234             continue;
7235
7236           rel_offset = section->sh_offset;
7237           rel_size   = section->sh_size;
7238
7239           if (rel_size)
7240             {
7241               Elf_Internal_Shdr * strsec;
7242               int is_rela;
7243               unsigned long num_rela;
7244
7245               printf (_("\nRelocation section "));
7246
7247               if (filedata->string_table == NULL)
7248                 printf ("%d", section->sh_name);
7249               else
7250                 printf ("'%s'", printable_section_name (filedata, section));
7251
7252               num_rela = rel_size / section->sh_entsize;
7253               printf (ngettext (" at offset 0x%lx contains %lu entry:\n",
7254                                 " at offset 0x%lx contains %lu entries:\n",
7255                                 num_rela),
7256                       rel_offset, num_rela);
7257
7258               is_rela = section->sh_type == SHT_RELA;
7259
7260               if (section->sh_link != 0
7261                   && section->sh_link < filedata->file_header.e_shnum)
7262                 {
7263                   Elf_Internal_Shdr * symsec;
7264                   Elf_Internal_Sym *  symtab;
7265                   unsigned long nsyms;
7266                   unsigned long strtablen = 0;
7267                   char * strtab = NULL;
7268
7269                   symsec = filedata->section_headers + section->sh_link;
7270                   if (symsec->sh_type != SHT_SYMTAB
7271                       && symsec->sh_type != SHT_DYNSYM)
7272                     continue;
7273
7274                   symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
7275
7276                   if (symtab == NULL)
7277                     continue;
7278
7279                   if (symsec->sh_link != 0
7280                       && symsec->sh_link < filedata->file_header.e_shnum)
7281                     {
7282                       strsec = filedata->section_headers + symsec->sh_link;
7283
7284                       strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7285                                                   1, strsec->sh_size,
7286                                                   _("string table"));
7287                       strtablen = strtab == NULL ? 0 : strsec->sh_size;
7288                     }
7289
7290                   dump_relocations (filedata, rel_offset, rel_size,
7291                                     symtab, nsyms, strtab, strtablen,
7292                                     is_rela,
7293                                     symsec->sh_type == SHT_DYNSYM);
7294                   if (strtab)
7295                     free (strtab);
7296                   free (symtab);
7297                 }
7298               else
7299                 dump_relocations (filedata, rel_offset, rel_size,
7300                                   NULL, 0, NULL, 0, is_rela,
7301                                   FALSE /* is_dynamic */);
7302
7303               found = TRUE;
7304             }
7305         }
7306
7307       if (! found)
7308         {
7309           /* Users sometimes forget the -D option, so try to be helpful.  */
7310           for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
7311             {
7312               if (dynamic_info [dynamic_relocations [i].size])
7313                 {
7314                   printf (_("\nThere are no static relocations in this file."));
7315                   printf (_("\nTo see the dynamic relocations add --use-dynamic to the command line.\n"));
7316
7317                   break;
7318                 }
7319             }
7320           if (i == ARRAY_SIZE (dynamic_relocations))
7321             printf (_("\nThere are no relocations in this file.\n"));
7322         }
7323     }
7324
7325   return TRUE;
7326 }
7327
7328 /* An absolute address consists of a section and an offset.  If the
7329    section is NULL, the offset itself is the address, otherwise, the
7330    address equals to LOAD_ADDRESS(section) + offset.  */
7331
7332 struct absaddr
7333 {
7334   unsigned short section;
7335   bfd_vma offset;
7336 };
7337
7338 #define ABSADDR(a) \
7339   ((a).section \
7340    ? filedata->section_headers [(a).section].sh_addr + (a).offset \
7341    : (a).offset)
7342
7343 /* Find the nearest symbol at or below ADDR.  Returns the symbol
7344    name, if found, and the offset from the symbol to ADDR.  */
7345
7346 static void
7347 find_symbol_for_address (Filedata *          filedata,
7348                          Elf_Internal_Sym *  symtab,
7349                          unsigned long       nsyms,
7350                          const char *        strtab,
7351                          unsigned long       strtab_size,
7352                          struct absaddr      addr,
7353                          const char **       symname,
7354                          bfd_vma *           offset)
7355 {
7356   bfd_vma dist = 0x100000;
7357   Elf_Internal_Sym * sym;
7358   Elf_Internal_Sym * beg;
7359   Elf_Internal_Sym * end;
7360   Elf_Internal_Sym * best = NULL;
7361
7362   REMOVE_ARCH_BITS (addr.offset);
7363   beg = symtab;
7364   end = symtab + nsyms;
7365
7366   while (beg < end)
7367     {
7368       bfd_vma value;
7369
7370       sym = beg + (end - beg) / 2;
7371
7372       value = sym->st_value;
7373       REMOVE_ARCH_BITS (value);
7374
7375       if (sym->st_name != 0
7376           && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
7377           && addr.offset >= value
7378           && addr.offset - value < dist)
7379         {
7380           best = sym;
7381           dist = addr.offset - value;
7382           if (!dist)
7383             break;
7384         }
7385
7386       if (addr.offset < value)
7387         end = sym;
7388       else
7389         beg = sym + 1;
7390     }
7391
7392   if (best)
7393     {
7394       *symname = (best->st_name >= strtab_size
7395                   ? _("<corrupt>") : strtab + best->st_name);
7396       *offset = dist;
7397       return;
7398     }
7399
7400   *symname = NULL;
7401   *offset = addr.offset;
7402 }
7403
7404 static /* signed */ int
7405 symcmp (const void *p, const void *q)
7406 {
7407   Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
7408   Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
7409
7410   return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
7411 }
7412
7413 /* Process the unwind section.  */
7414
7415 #include "unwind-ia64.h"
7416
7417 struct ia64_unw_table_entry
7418 {
7419   struct absaddr start;
7420   struct absaddr end;
7421   struct absaddr info;
7422 };
7423
7424 struct ia64_unw_aux_info
7425 {
7426   struct ia64_unw_table_entry * table;          /* Unwind table.  */
7427   unsigned long                 table_len;      /* Length of unwind table.  */
7428   unsigned char *               info;           /* Unwind info.  */
7429   unsigned long                 info_size;      /* Size of unwind info.  */
7430   bfd_vma                       info_addr;      /* Starting address of unwind info.  */
7431   bfd_vma                       seg_base;       /* Starting address of segment.  */
7432   Elf_Internal_Sym *            symtab;         /* The symbol table.  */
7433   unsigned long                 nsyms;          /* Number of symbols.  */
7434   Elf_Internal_Sym *            funtab;         /* Sorted table of STT_FUNC symbols.  */
7435   unsigned long                 nfuns;          /* Number of entries in funtab.  */
7436   char *                        strtab;         /* The string table.  */
7437   unsigned long                 strtab_size;    /* Size of string table.  */
7438 };
7439
7440 static bfd_boolean
7441 dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
7442 {
7443   struct ia64_unw_table_entry * tp;
7444   unsigned long j, nfuns;
7445   int in_body;
7446   bfd_boolean res = TRUE;
7447
7448   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7449   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7450     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7451       aux->funtab[nfuns++] = aux->symtab[j];
7452   aux->nfuns = nfuns;
7453   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7454
7455   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7456     {
7457       bfd_vma stamp;
7458       bfd_vma offset;
7459       const unsigned char * dp;
7460       const unsigned char * head;
7461       const unsigned char * end;
7462       const char * procname;
7463
7464       find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7465                                aux->strtab_size, tp->start, &procname, &offset);
7466
7467       fputs ("\n<", stdout);
7468
7469       if (procname)
7470         {
7471           fputs (procname, stdout);
7472
7473           if (offset)
7474             printf ("+%lx", (unsigned long) offset);
7475         }
7476
7477       fputs (">: [", stdout);
7478       print_vma (tp->start.offset, PREFIX_HEX);
7479       fputc ('-', stdout);
7480       print_vma (tp->end.offset, PREFIX_HEX);
7481       printf ("], info at +0x%lx\n",
7482               (unsigned long) (tp->info.offset - aux->seg_base));
7483
7484       /* PR 17531: file: 86232b32.  */
7485       if (aux->info == NULL)
7486         continue;
7487
7488       /* PR 17531: file: 0997b4d1.  */
7489       if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7490         {
7491           warn (_("Invalid offset %lx in table entry %ld\n"),
7492                 (long) tp->info.offset, (long) (tp - aux->table));
7493           res = FALSE;
7494           continue;
7495         }
7496
7497       head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
7498       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7499
7500       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7501               (unsigned) UNW_VER (stamp),
7502               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7503               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7504               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7505               (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7506
7507       if (UNW_VER (stamp) != 1)
7508         {
7509           printf (_("\tUnknown version.\n"));
7510           continue;
7511         }
7512
7513       in_body = 0;
7514       end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7515       /* PR 17531: file: 16ceda89.  */
7516       if (end > aux->info + aux->info_size)
7517         end = aux->info + aux->info_size;
7518       for (dp = head + 8; dp < end;)
7519         dp = unw_decode (dp, in_body, & in_body, end);
7520     }
7521
7522   free (aux->funtab);
7523
7524   return res;
7525 }
7526
7527 static bfd_boolean
7528 slurp_ia64_unwind_table (Filedata *                  filedata,
7529                          struct ia64_unw_aux_info *  aux,
7530                          Elf_Internal_Shdr *         sec)
7531 {
7532   unsigned long size, nrelas, i;
7533   Elf_Internal_Phdr * seg;
7534   struct ia64_unw_table_entry * tep;
7535   Elf_Internal_Shdr * relsec;
7536   Elf_Internal_Rela * rela;
7537   Elf_Internal_Rela * rp;
7538   unsigned char * table;
7539   unsigned char * tp;
7540   Elf_Internal_Sym * sym;
7541   const char * relname;
7542
7543   aux->table_len = 0;
7544
7545   /* First, find the starting address of the segment that includes
7546      this section: */
7547
7548   if (filedata->file_header.e_phnum)
7549     {
7550       if (! get_program_headers (filedata))
7551           return FALSE;
7552
7553       for (seg = filedata->program_headers;
7554            seg < filedata->program_headers + filedata->file_header.e_phnum;
7555            ++seg)
7556         {
7557           if (seg->p_type != PT_LOAD)
7558             continue;
7559
7560           if (sec->sh_addr >= seg->p_vaddr
7561               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7562             {
7563               aux->seg_base = seg->p_vaddr;
7564               break;
7565             }
7566         }
7567     }
7568
7569   /* Second, build the unwind table from the contents of the unwind section:  */
7570   size = sec->sh_size;
7571   table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
7572                                       _("unwind table"));
7573   if (!table)
7574     return FALSE;
7575
7576   aux->table_len = size / (3 * eh_addr_size);
7577   aux->table = (struct ia64_unw_table_entry *)
7578     xcmalloc (aux->table_len, sizeof (aux->table[0]));
7579   tep = aux->table;
7580
7581   for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7582     {
7583       tep->start.section = SHN_UNDEF;
7584       tep->end.section   = SHN_UNDEF;
7585       tep->info.section  = SHN_UNDEF;
7586       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7587       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7588       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7589       tep->start.offset += aux->seg_base;
7590       tep->end.offset   += aux->seg_base;
7591       tep->info.offset  += aux->seg_base;
7592     }
7593   free (table);
7594
7595   /* Third, apply any relocations to the unwind table:  */
7596   for (relsec = filedata->section_headers;
7597        relsec < filedata->section_headers + filedata->file_header.e_shnum;
7598        ++relsec)
7599     {
7600       if (relsec->sh_type != SHT_RELA
7601           || relsec->sh_info >= filedata->file_header.e_shnum
7602           || filedata->section_headers + relsec->sh_info != sec)
7603         continue;
7604
7605       if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
7606                               & rela, & nrelas))
7607         {
7608           free (aux->table);
7609           aux->table = NULL;
7610           aux->table_len = 0;
7611           return FALSE;
7612         }
7613
7614       for (rp = rela; rp < rela + nrelas; ++rp)
7615         {
7616           unsigned int sym_ndx;
7617           unsigned int r_type = get_reloc_type (filedata, rp->r_info);
7618           relname = elf_ia64_reloc_type (r_type);
7619
7620           /* PR 17531: file: 9fa67536.  */
7621           if (relname == NULL)
7622             {
7623               warn (_("Skipping unknown relocation type: %u\n"), r_type);
7624               continue;
7625             }
7626
7627           if (! const_strneq (relname, "R_IA64_SEGREL"))
7628             {
7629               warn (_("Skipping unexpected relocation type: %s\n"), relname);
7630               continue;
7631             }
7632
7633           i = rp->r_offset / (3 * eh_addr_size);
7634
7635           /* PR 17531: file: 5bc8d9bf.  */
7636           if (i >= aux->table_len)
7637             {
7638               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7639               continue;
7640             }
7641
7642           sym_ndx = get_reloc_symindex (rp->r_info);
7643           if (sym_ndx >= aux->nsyms)
7644             {
7645               warn (_("Skipping reloc with invalid symbol index: %u\n"),
7646                     sym_ndx);
7647               continue;
7648             }
7649           sym = aux->symtab + sym_ndx;
7650
7651           switch (rp->r_offset / eh_addr_size % 3)
7652             {
7653             case 0:
7654               aux->table[i].start.section = sym->st_shndx;
7655               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
7656               break;
7657             case 1:
7658               aux->table[i].end.section   = sym->st_shndx;
7659               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
7660               break;
7661             case 2:
7662               aux->table[i].info.section  = sym->st_shndx;
7663               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
7664               break;
7665             default:
7666               break;
7667             }
7668         }
7669
7670       free (rela);
7671     }
7672
7673   return TRUE;
7674 }
7675
7676 static bfd_boolean
7677 ia64_process_unwind (Filedata * filedata)
7678 {
7679   Elf_Internal_Shdr * sec;
7680   Elf_Internal_Shdr * unwsec = NULL;
7681   Elf_Internal_Shdr * strsec;
7682   unsigned long i, unwcount = 0, unwstart = 0;
7683   struct ia64_unw_aux_info aux;
7684   bfd_boolean res = TRUE;
7685
7686   memset (& aux, 0, sizeof (aux));
7687
7688   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
7689     {
7690       if (sec->sh_type == SHT_SYMTAB
7691           && sec->sh_link < filedata->file_header.e_shnum)
7692         {
7693           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
7694
7695           strsec = filedata->section_headers + sec->sh_link;
7696           if (aux.strtab != NULL)
7697             {
7698               error (_("Multiple auxillary string tables encountered\n"));
7699               free (aux.strtab);
7700               res = FALSE;
7701             }
7702           aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
7703                                           1, strsec->sh_size,
7704                                           _("string table"));
7705           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7706         }
7707       else if (sec->sh_type == SHT_IA_64_UNWIND)
7708         unwcount++;
7709     }
7710
7711   if (!unwcount)
7712     printf (_("\nThere are no unwind sections in this file.\n"));
7713
7714   while (unwcount-- > 0)
7715     {
7716       char * suffix;
7717       size_t len, len2;
7718
7719       for (i = unwstart, sec = filedata->section_headers + unwstart, unwsec = NULL;
7720            i < filedata->file_header.e_shnum; ++i, ++sec)
7721         if (sec->sh_type == SHT_IA_64_UNWIND)
7722           {
7723             unwsec = sec;
7724             break;
7725           }
7726       /* We have already counted the number of SHT_IA64_UNWIND
7727          sections so the loop above should never fail.  */
7728       assert (unwsec != NULL);
7729
7730       unwstart = i + 1;
7731       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7732
7733       if ((unwsec->sh_flags & SHF_GROUP) != 0)
7734         {
7735           /* We need to find which section group it is in.  */
7736           struct group_list * g;
7737
7738           if (section_headers_groups == NULL
7739               || section_headers_groups [i] == NULL)
7740             i = filedata->file_header.e_shnum;
7741           else
7742             {
7743               g = section_headers_groups [i]->root;
7744
7745               for (; g != NULL; g = g->next)
7746                 {
7747                   sec = filedata->section_headers + g->section_index;
7748
7749                   if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7750                     break;
7751                 }
7752
7753               if (g == NULL)
7754                 i = filedata->file_header.e_shnum;
7755             }
7756         }
7757       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7758         {
7759           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
7760           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7761           suffix = SECTION_NAME (unwsec) + len;
7762           for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7763                ++i, ++sec)
7764             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7765                 && streq (SECTION_NAME (sec) + len2, suffix))
7766               break;
7767         }
7768       else
7769         {
7770           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7771              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
7772           len = sizeof (ELF_STRING_ia64_unwind) - 1;
7773           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7774           suffix = "";
7775           if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7776             suffix = SECTION_NAME (unwsec) + len;
7777           for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum;
7778                ++i, ++sec)
7779             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7780                 && streq (SECTION_NAME (sec) + len2, suffix))
7781               break;
7782         }
7783
7784       if (i == filedata->file_header.e_shnum)
7785         {
7786           printf (_("\nCould not find unwind info section for "));
7787
7788           if (filedata->string_table == NULL)
7789             printf ("%d", unwsec->sh_name);
7790           else
7791             printf ("'%s'", printable_section_name (filedata, unwsec));
7792         }
7793       else
7794         {
7795           aux.info_addr = sec->sh_addr;
7796           aux.info = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1,
7797                                                  sec->sh_size,
7798                                                  _("unwind info"));
7799           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7800
7801           printf (_("\nUnwind section "));
7802
7803           if (filedata->string_table == NULL)
7804             printf ("%d", unwsec->sh_name);
7805           else
7806             printf ("'%s'", printable_section_name (filedata, unwsec));
7807
7808           printf (_(" at offset 0x%lx contains %lu entries:\n"),
7809                   (unsigned long) unwsec->sh_offset,
7810                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7811
7812           if (slurp_ia64_unwind_table (filedata, & aux, unwsec)
7813               && aux.table_len > 0)
7814             dump_ia64_unwind (filedata, & aux);
7815
7816           if (aux.table)
7817             free ((char *) aux.table);
7818           if (aux.info)
7819             free ((char *) aux.info);
7820           aux.table = NULL;
7821           aux.info = NULL;
7822         }
7823     }
7824
7825   if (aux.symtab)
7826     free (aux.symtab);
7827   if (aux.strtab)
7828     free ((char *) aux.strtab);
7829
7830   return res;
7831 }
7832
7833 struct hppa_unw_table_entry
7834 {
7835   struct absaddr start;
7836   struct absaddr end;
7837   unsigned int Cannot_unwind:1;                 /* 0 */
7838   unsigned int Millicode:1;                     /* 1 */
7839   unsigned int Millicode_save_sr0:1;            /* 2 */
7840   unsigned int Region_description:2;            /* 3..4 */
7841   unsigned int reserved1:1;                     /* 5 */
7842   unsigned int Entry_SR:1;                      /* 6 */
7843   unsigned int Entry_FR:4;     /* Number saved     7..10 */
7844   unsigned int Entry_GR:5;     /* Number saved     11..15 */
7845   unsigned int Args_stored:1;                   /* 16 */
7846   unsigned int Variable_Frame:1;                /* 17 */
7847   unsigned int Separate_Package_Body:1;         /* 18 */
7848   unsigned int Frame_Extension_Millicode:1;     /* 19 */
7849   unsigned int Stack_Overflow_Check:1;          /* 20 */
7850   unsigned int Two_Instruction_SP_Increment:1;  /* 21 */
7851   unsigned int Ada_Region:1;                    /* 22 */
7852   unsigned int cxx_info:1;                      /* 23 */
7853   unsigned int cxx_try_catch:1;                 /* 24 */
7854   unsigned int sched_entry_seq:1;               /* 25 */
7855   unsigned int reserved2:1;                     /* 26 */
7856   unsigned int Save_SP:1;                       /* 27 */
7857   unsigned int Save_RP:1;                       /* 28 */
7858   unsigned int Save_MRP_in_frame:1;             /* 29 */
7859   unsigned int extn_ptr_defined:1;              /* 30 */
7860   unsigned int Cleanup_defined:1;               /* 31 */
7861
7862   unsigned int MPE_XL_interrupt_marker:1;       /* 0 */
7863   unsigned int HP_UX_interrupt_marker:1;        /* 1 */
7864   unsigned int Large_frame:1;                   /* 2 */
7865   unsigned int Pseudo_SP_Set:1;                 /* 3 */
7866   unsigned int reserved4:1;                     /* 4 */
7867   unsigned int Total_frame_size:27;             /* 5..31 */
7868 };
7869
7870 struct hppa_unw_aux_info
7871 {
7872   struct hppa_unw_table_entry *  table;         /* Unwind table.  */
7873   unsigned long                  table_len;     /* Length of unwind table.  */
7874   bfd_vma                        seg_base;      /* Starting address of segment.  */
7875   Elf_Internal_Sym *             symtab;        /* The symbol table.  */
7876   unsigned long                  nsyms;         /* Number of symbols.  */
7877   Elf_Internal_Sym *             funtab;        /* Sorted table of STT_FUNC symbols.  */
7878   unsigned long                  nfuns;         /* Number of entries in funtab.  */
7879   char *                         strtab;        /* The string table.  */
7880   unsigned long                  strtab_size;   /* Size of string table.  */
7881 };
7882
7883 static bfd_boolean
7884 dump_hppa_unwind (Filedata * filedata, struct hppa_unw_aux_info * aux)
7885 {
7886   struct hppa_unw_table_entry * tp;
7887   unsigned long j, nfuns;
7888   bfd_boolean res = TRUE;
7889
7890   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7891   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7892     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7893       aux->funtab[nfuns++] = aux->symtab[j];
7894   aux->nfuns = nfuns;
7895   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7896
7897   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7898     {
7899       bfd_vma offset;
7900       const char * procname;
7901
7902       find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
7903                                aux->strtab_size, tp->start, &procname,
7904                                &offset);
7905
7906       fputs ("\n<", stdout);
7907
7908       if (procname)
7909         {
7910           fputs (procname, stdout);
7911
7912           if (offset)
7913             printf ("+%lx", (unsigned long) offset);
7914         }
7915
7916       fputs (">: [", stdout);
7917       print_vma (tp->start.offset, PREFIX_HEX);
7918       fputc ('-', stdout);
7919       print_vma (tp->end.offset, PREFIX_HEX);
7920       printf ("]\n\t");
7921
7922 #define PF(_m) if (tp->_m) printf (#_m " ");
7923 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7924       PF(Cannot_unwind);
7925       PF(Millicode);
7926       PF(Millicode_save_sr0);
7927       /* PV(Region_description);  */
7928       PF(Entry_SR);
7929       PV(Entry_FR);
7930       PV(Entry_GR);
7931       PF(Args_stored);
7932       PF(Variable_Frame);
7933       PF(Separate_Package_Body);
7934       PF(Frame_Extension_Millicode);
7935       PF(Stack_Overflow_Check);
7936       PF(Two_Instruction_SP_Increment);
7937       PF(Ada_Region);
7938       PF(cxx_info);
7939       PF(cxx_try_catch);
7940       PF(sched_entry_seq);
7941       PF(Save_SP);
7942       PF(Save_RP);
7943       PF(Save_MRP_in_frame);
7944       PF(extn_ptr_defined);
7945       PF(Cleanup_defined);
7946       PF(MPE_XL_interrupt_marker);
7947       PF(HP_UX_interrupt_marker);
7948       PF(Large_frame);
7949       PF(Pseudo_SP_Set);
7950       PV(Total_frame_size);
7951 #undef PF
7952 #undef PV
7953     }
7954
7955   printf ("\n");
7956
7957   free (aux->funtab);
7958
7959   return res;
7960 }
7961
7962 static bfd_boolean
7963 slurp_hppa_unwind_table (Filedata *                  filedata,
7964                          struct hppa_unw_aux_info *  aux,
7965                          Elf_Internal_Shdr *         sec)
7966 {
7967   unsigned long size, unw_ent_size, nentries, nrelas, i;
7968   Elf_Internal_Phdr * seg;
7969   struct hppa_unw_table_entry * tep;
7970   Elf_Internal_Shdr * relsec;
7971   Elf_Internal_Rela * rela;
7972   Elf_Internal_Rela * rp;
7973   unsigned char * table;
7974   unsigned char * tp;
7975   Elf_Internal_Sym * sym;
7976   const char * relname;
7977
7978   /* First, find the starting address of the segment that includes
7979      this section.  */
7980   if (filedata->file_header.e_phnum)
7981     {
7982       if (! get_program_headers (filedata))
7983         return FALSE;
7984
7985       for (seg = filedata->program_headers;
7986            seg < filedata->program_headers + filedata->file_header.e_phnum;
7987            ++seg)
7988         {
7989           if (seg->p_type != PT_LOAD)
7990             continue;
7991
7992           if (sec->sh_addr >= seg->p_vaddr
7993               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7994             {
7995               aux->seg_base = seg->p_vaddr;
7996               break;
7997             }
7998         }
7999     }
8000
8001   /* Second, build the unwind table from the contents of the unwind
8002      section.  */
8003   size = sec->sh_size;
8004   table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
8005                                       _("unwind table"));
8006   if (!table)
8007     return FALSE;
8008
8009   unw_ent_size = 16;
8010   nentries = size / unw_ent_size;
8011   size = unw_ent_size * nentries;
8012
8013   tep = aux->table = (struct hppa_unw_table_entry *)
8014       xcmalloc (nentries, sizeof (aux->table[0]));
8015
8016   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
8017     {
8018       unsigned int tmp1, tmp2;
8019
8020       tep->start.section = SHN_UNDEF;
8021       tep->end.section   = SHN_UNDEF;
8022
8023       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
8024       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
8025       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
8026       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
8027
8028       tep->start.offset += aux->seg_base;
8029       tep->end.offset   += aux->seg_base;
8030
8031       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
8032       tep->Millicode = (tmp1 >> 30) & 0x1;
8033       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
8034       tep->Region_description = (tmp1 >> 27) & 0x3;
8035       tep->reserved1 = (tmp1 >> 26) & 0x1;
8036       tep->Entry_SR = (tmp1 >> 25) & 0x1;
8037       tep->Entry_FR = (tmp1 >> 21) & 0xf;
8038       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
8039       tep->Args_stored = (tmp1 >> 15) & 0x1;
8040       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
8041       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
8042       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
8043       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
8044       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
8045       tep->Ada_Region = (tmp1 >> 9) & 0x1;
8046       tep->cxx_info = (tmp1 >> 8) & 0x1;
8047       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
8048       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
8049       tep->reserved2 = (tmp1 >> 5) & 0x1;
8050       tep->Save_SP = (tmp1 >> 4) & 0x1;
8051       tep->Save_RP = (tmp1 >> 3) & 0x1;
8052       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
8053       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
8054       tep->Cleanup_defined = tmp1 & 0x1;
8055
8056       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
8057       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
8058       tep->Large_frame = (tmp2 >> 29) & 0x1;
8059       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
8060       tep->reserved4 = (tmp2 >> 27) & 0x1;
8061       tep->Total_frame_size = tmp2 & 0x7ffffff;
8062     }
8063   free (table);
8064
8065   /* Third, apply any relocations to the unwind table.  */
8066   for (relsec = filedata->section_headers;
8067        relsec < filedata->section_headers + filedata->file_header.e_shnum;
8068        ++relsec)
8069     {
8070       if (relsec->sh_type != SHT_RELA
8071           || relsec->sh_info >= filedata->file_header.e_shnum
8072           || filedata->section_headers + relsec->sh_info != sec)
8073         continue;
8074
8075       if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
8076                               & rela, & nrelas))
8077         return FALSE;
8078
8079       for (rp = rela; rp < rela + nrelas; ++rp)
8080         {
8081           unsigned int sym_ndx;
8082           unsigned int r_type = get_reloc_type (filedata, rp->r_info);
8083           relname = elf_hppa_reloc_type (r_type);
8084
8085           if (relname == NULL)
8086             {
8087               warn (_("Skipping unknown relocation type: %u\n"), r_type);
8088               continue;
8089             }
8090
8091           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
8092           if (! const_strneq (relname, "R_PARISC_SEGREL"))
8093             {
8094               warn (_("Skipping unexpected relocation type: %s\n"), relname);
8095               continue;
8096             }
8097
8098           i = rp->r_offset / unw_ent_size;
8099           if (i >= aux->table_len)
8100             {
8101               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
8102               continue;
8103             }
8104
8105           sym_ndx = get_reloc_symindex (rp->r_info);
8106           if (sym_ndx >= aux->nsyms)
8107             {
8108               warn (_("Skipping reloc with invalid symbol index: %u\n"),
8109                     sym_ndx);
8110               continue;
8111             }
8112           sym = aux->symtab + sym_ndx;
8113
8114           switch ((rp->r_offset % unw_ent_size) / 4)
8115             {
8116             case 0:
8117               aux->table[i].start.section = sym->st_shndx;
8118               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
8119               break;
8120             case 1:
8121               aux->table[i].end.section   = sym->st_shndx;
8122               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
8123               break;
8124             default:
8125               break;
8126             }
8127         }
8128
8129       free (rela);
8130     }
8131
8132   aux->table_len = nentries;
8133
8134   return TRUE;
8135 }
8136
8137 static bfd_boolean
8138 hppa_process_unwind (Filedata * filedata)
8139 {
8140   struct hppa_unw_aux_info aux;
8141   Elf_Internal_Shdr * unwsec = NULL;
8142   Elf_Internal_Shdr * strsec;
8143   Elf_Internal_Shdr * sec;
8144   unsigned long i;
8145   bfd_boolean res = TRUE;
8146
8147   if (filedata->string_table == NULL)
8148     return FALSE;
8149
8150   memset (& aux, 0, sizeof (aux));
8151
8152   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8153     {
8154       if (sec->sh_type == SHT_SYMTAB
8155           && sec->sh_link < filedata->file_header.e_shnum)
8156         {
8157           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
8158
8159           strsec = filedata->section_headers + sec->sh_link;
8160           if (aux.strtab != NULL)
8161             {
8162               error (_("Multiple auxillary string tables encountered\n"));
8163               free (aux.strtab);
8164               res = FALSE;
8165             }
8166           aux.strtab = (char *) get_data (NULL, filedata, strsec->sh_offset,
8167                                           1, strsec->sh_size,
8168                                           _("string table"));
8169           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8170         }
8171       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8172         unwsec = sec;
8173     }
8174
8175   if (!unwsec)
8176     printf (_("\nThere are no unwind sections in this file.\n"));
8177
8178   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
8179     {
8180       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
8181         {
8182           unsigned long num_unwind = sec->sh_size / 16;
8183
8184           printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
8185                             "contains %lu entry:\n",
8186                             "\nUnwind section '%s' at offset 0x%lx "
8187                             "contains %lu entries:\n",
8188                             num_unwind),
8189                   printable_section_name (filedata, sec),
8190                   (unsigned long) sec->sh_offset,
8191                   num_unwind);
8192
8193           if (! slurp_hppa_unwind_table (filedata, &aux, sec))
8194             res = FALSE;
8195
8196           if (res && aux.table_len > 0)
8197             {
8198               if (! dump_hppa_unwind (filedata, &aux))
8199                 res = FALSE;
8200             }
8201
8202           if (aux.table)
8203             free ((char *) aux.table);
8204           aux.table = NULL;
8205         }
8206     }
8207
8208   if (aux.symtab)
8209     free (aux.symtab);
8210   if (aux.strtab)
8211     free ((char *) aux.strtab);
8212
8213   return res;
8214 }
8215
8216 struct arm_section
8217 {
8218   unsigned char *      data;            /* The unwind data.  */
8219   Elf_Internal_Shdr *  sec;             /* The cached unwind section header.  */
8220   Elf_Internal_Rela *  rela;            /* The cached relocations for this section.  */
8221   unsigned long        nrelas;          /* The number of relocations.  */
8222   unsigned int         rel_type;        /* REL or RELA ?  */
8223   Elf_Internal_Rela *  next_rela;       /* Cyclic pointer to the next reloc to process.  */
8224 };
8225
8226 struct arm_unw_aux_info
8227 {
8228   Filedata *          filedata;         /* The file containing the unwind sections.  */
8229   Elf_Internal_Sym *  symtab;           /* The file's symbol table.  */
8230   unsigned long       nsyms;            /* Number of symbols.  */
8231   Elf_Internal_Sym *  funtab;           /* Sorted table of STT_FUNC symbols.  */
8232   unsigned long       nfuns;            /* Number of these symbols.  */
8233   char *              strtab;           /* The file's string table.  */
8234   unsigned long       strtab_size;      /* Size of string table.  */
8235 };
8236
8237 static const char *
8238 arm_print_vma_and_name (Filedata *                 filedata,
8239                         struct arm_unw_aux_info *  aux,
8240                         bfd_vma                    fn,
8241                         struct absaddr             addr)
8242 {
8243   const char *procname;
8244   bfd_vma sym_offset;
8245
8246   if (addr.section == SHN_UNDEF)
8247     addr.offset = fn;
8248
8249   find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
8250                            aux->strtab_size, addr, &procname,
8251                            &sym_offset);
8252
8253   print_vma (fn, PREFIX_HEX);
8254
8255   if (procname)
8256     {
8257       fputs (" <", stdout);
8258       fputs (procname, stdout);
8259
8260       if (sym_offset)
8261         printf ("+0x%lx", (unsigned long) sym_offset);
8262       fputc ('>', stdout);
8263     }
8264
8265   return procname;
8266 }
8267
8268 static void
8269 arm_free_section (struct arm_section *arm_sec)
8270 {
8271   if (arm_sec->data != NULL)
8272     free (arm_sec->data);
8273
8274   if (arm_sec->rela != NULL)
8275     free (arm_sec->rela);
8276 }
8277
8278 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
8279       cached section and install SEC instead.
8280    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
8281       and return its valued in * WORDP, relocating if necessary.
8282    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
8283       relocation's offset in ADDR.
8284    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
8285       into the string table of the symbol associated with the reloc.  If no
8286       reloc was applied store -1 there.
8287    5) Return TRUE upon success, FALSE otherwise.  */
8288
8289 static bfd_boolean
8290 get_unwind_section_word (Filedata *                 filedata,
8291                          struct arm_unw_aux_info *  aux,
8292                          struct arm_section *       arm_sec,
8293                          Elf_Internal_Shdr *        sec,
8294                          bfd_vma                    word_offset,
8295                          unsigned int *             wordp,
8296                          struct absaddr *           addr,
8297                          bfd_vma *                  sym_name)
8298 {
8299   Elf_Internal_Rela *rp;
8300   Elf_Internal_Sym *sym;
8301   const char * relname;
8302   unsigned int word;
8303   bfd_boolean wrapped;
8304
8305   if (sec == NULL || arm_sec == NULL)
8306     return FALSE;
8307
8308   addr->section = SHN_UNDEF;
8309   addr->offset = 0;
8310
8311   if (sym_name != NULL)
8312     *sym_name = (bfd_vma) -1;
8313
8314   /* If necessary, update the section cache.  */
8315   if (sec != arm_sec->sec)
8316     {
8317       Elf_Internal_Shdr *relsec;
8318
8319       arm_free_section (arm_sec);
8320
8321       arm_sec->sec = sec;
8322       arm_sec->data = get_data (NULL, aux->filedata, sec->sh_offset, 1,
8323                                 sec->sh_size, _("unwind data"));
8324       arm_sec->rela = NULL;
8325       arm_sec->nrelas = 0;
8326
8327       for (relsec = filedata->section_headers;
8328            relsec < filedata->section_headers + filedata->file_header.e_shnum;
8329            ++relsec)
8330         {
8331           if (relsec->sh_info >= filedata->file_header.e_shnum
8332               || filedata->section_headers + relsec->sh_info != sec
8333               /* PR 15745: Check the section type as well.  */
8334               || (relsec->sh_type != SHT_REL
8335                   && relsec->sh_type != SHT_RELA))
8336             continue;
8337
8338           arm_sec->rel_type = relsec->sh_type;
8339           if (relsec->sh_type == SHT_REL)
8340             {
8341               if (!slurp_rel_relocs (aux->filedata, relsec->sh_offset,
8342                                      relsec->sh_size,
8343                                      & arm_sec->rela, & arm_sec->nrelas))
8344                 return FALSE;
8345             }
8346           else /* relsec->sh_type == SHT_RELA */
8347             {
8348               if (!slurp_rela_relocs (aux->filedata, relsec->sh_offset,
8349                                       relsec->sh_size,
8350                                       & arm_sec->rela, & arm_sec->nrelas))
8351                 return FALSE;
8352             }
8353           break;
8354         }
8355
8356       arm_sec->next_rela = arm_sec->rela;
8357     }
8358
8359   /* If there is no unwind data we can do nothing.  */
8360   if (arm_sec->data == NULL)
8361     return FALSE;
8362
8363   /* If the offset is invalid then fail.  */
8364   if (/* PR 21343 *//* PR 18879 */
8365       sec->sh_size < 4
8366       || word_offset > (sec->sh_size - 4)
8367       || ((bfd_signed_vma) word_offset) < 0)
8368     return FALSE;
8369
8370   /* Get the word at the required offset.  */
8371   word = byte_get (arm_sec->data + word_offset, 4);
8372
8373   /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128.  */
8374   if (arm_sec->rela == NULL)
8375     {
8376       * wordp = word;
8377       return TRUE;
8378     }
8379
8380   /* Look through the relocs to find the one that applies to the provided offset.  */
8381   wrapped = FALSE;
8382   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
8383     {
8384       bfd_vma prelval, offset;
8385
8386       if (rp->r_offset > word_offset && !wrapped)
8387         {
8388           rp = arm_sec->rela;
8389           wrapped = TRUE;
8390         }
8391       if (rp->r_offset > word_offset)
8392         break;
8393
8394       if (rp->r_offset & 3)
8395         {
8396           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
8397                 (unsigned long) rp->r_offset);
8398           continue;
8399         }
8400
8401       if (rp->r_offset < word_offset)
8402         continue;
8403
8404       /* PR 17531: file: 027-161405-0.004  */
8405       if (aux->symtab == NULL)
8406         continue;
8407
8408       if (arm_sec->rel_type == SHT_REL)
8409         {
8410           offset = word & 0x7fffffff;
8411           if (offset & 0x40000000)
8412             offset |= ~ (bfd_vma) 0x7fffffff;
8413         }
8414       else if (arm_sec->rel_type == SHT_RELA)
8415         offset = rp->r_addend;
8416       else
8417         {
8418           error (_("Unknown section relocation type %d encountered\n"),
8419                  arm_sec->rel_type);
8420           break;
8421         }
8422
8423       /* PR 17531 file: 027-1241568-0.004.  */
8424       if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
8425         {
8426           error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
8427                  (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
8428           break;
8429         }
8430
8431       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
8432       offset += sym->st_value;
8433       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
8434
8435       /* Check that we are processing the expected reloc type.  */
8436       if (filedata->file_header.e_machine == EM_ARM)
8437         {
8438           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
8439           if (relname == NULL)
8440             {
8441               warn (_("Skipping unknown ARM relocation type: %d\n"),
8442                     (int) ELF32_R_TYPE (rp->r_info));
8443               continue;
8444             }
8445
8446           if (streq (relname, "R_ARM_NONE"))
8447               continue;
8448
8449           if (! streq (relname, "R_ARM_PREL31"))
8450             {
8451               warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
8452               continue;
8453             }
8454         }
8455       else if (filedata->file_header.e_machine == EM_TI_C6000)
8456         {
8457           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
8458           if (relname == NULL)
8459             {
8460               warn (_("Skipping unknown C6000 relocation type: %d\n"),
8461                     (int) ELF32_R_TYPE (rp->r_info));
8462               continue;
8463             }
8464
8465           if (streq (relname, "R_C6000_NONE"))
8466             continue;
8467
8468           if (! streq (relname, "R_C6000_PREL31"))
8469             {
8470               warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
8471               continue;
8472             }
8473
8474           prelval >>= 1;
8475         }
8476       else
8477         {
8478           /* This function currently only supports ARM and TI unwinders.  */
8479           warn (_("Only TI and ARM unwinders are currently supported\n"));
8480           break;
8481         }
8482
8483       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
8484       addr->section = sym->st_shndx;
8485       addr->offset = offset;
8486
8487       if (sym_name)
8488         * sym_name = sym->st_name;
8489       break;
8490     }
8491
8492   *wordp = word;
8493   arm_sec->next_rela = rp;
8494
8495   return TRUE;
8496 }
8497
8498 static const char *tic6x_unwind_regnames[16] =
8499 {
8500   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
8501   "A14", "A13", "A12", "A11", "A10",
8502   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8503 };
8504
8505 static void
8506 decode_tic6x_unwind_regmask (unsigned int mask)
8507 {
8508   int i;
8509
8510   for (i = 12; mask; mask >>= 1, i--)
8511     {
8512       if (mask & 1)
8513         {
8514           fputs (tic6x_unwind_regnames[i], stdout);
8515           if (mask > 1)
8516             fputs (", ", stdout);
8517         }
8518     }
8519 }
8520
8521 #define ADVANCE                                                 \
8522   if (remaining == 0 && more_words)                             \
8523     {                                                           \
8524       data_offset += 4;                                         \
8525       if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec,     \
8526                                      data_offset, & word, & addr, NULL))        \
8527         return FALSE;                                           \
8528       remaining = 4;                                            \
8529       more_words--;                                             \
8530     }                                                           \
8531
8532 #define GET_OP(OP)                      \
8533   ADVANCE;                              \
8534   if (remaining)                        \
8535     {                                   \
8536       remaining--;                      \
8537       (OP) = word >> 24;                \
8538       word <<= 8;                       \
8539     }                                   \
8540   else                                  \
8541     {                                   \
8542       printf (_("[Truncated opcode]\n"));       \
8543       return FALSE;                     \
8544     }                                   \
8545   printf ("0x%02x ", OP)
8546
8547 static bfd_boolean
8548 decode_arm_unwind_bytecode (Filedata *                 filedata,
8549                             struct arm_unw_aux_info *  aux,
8550                             unsigned int               word,
8551                             unsigned int               remaining,
8552                             unsigned int               more_words,
8553                             bfd_vma                    data_offset,
8554                             Elf_Internal_Shdr *        data_sec,
8555                             struct arm_section *       data_arm_sec)
8556 {
8557   struct absaddr addr;
8558   bfd_boolean res = TRUE;
8559
8560   /* Decode the unwinding instructions.  */
8561   while (1)
8562     {
8563       unsigned int op, op2;
8564
8565       ADVANCE;
8566       if (remaining == 0)
8567         break;
8568       remaining--;
8569       op = word >> 24;
8570       word <<= 8;
8571
8572       printf ("  0x%02x ", op);
8573
8574       if ((op & 0xc0) == 0x00)
8575         {
8576           int offset = ((op & 0x3f) << 2) + 4;
8577
8578           printf ("     vsp = vsp + %d", offset);
8579         }
8580       else if ((op & 0xc0) == 0x40)
8581         {
8582           int offset = ((op & 0x3f) << 2) + 4;
8583
8584           printf ("     vsp = vsp - %d", offset);
8585         }
8586       else if ((op & 0xf0) == 0x80)
8587         {
8588           GET_OP (op2);
8589           if (op == 0x80 && op2 == 0)
8590             printf (_("Refuse to unwind"));
8591           else
8592             {
8593               unsigned int mask = ((op & 0x0f) << 8) | op2;
8594               bfd_boolean first = TRUE;
8595               int i;
8596
8597               printf ("pop {");
8598               for (i = 0; i < 12; i++)
8599                 if (mask & (1 << i))
8600                   {
8601                     if (first)
8602                       first = FALSE;
8603                     else
8604                       printf (", ");
8605                     printf ("r%d", 4 + i);
8606                   }
8607               printf ("}");
8608             }
8609         }
8610       else if ((op & 0xf0) == 0x90)
8611         {
8612           if (op == 0x9d || op == 0x9f)
8613             printf (_("     [Reserved]"));
8614           else
8615             printf ("     vsp = r%d", op & 0x0f);
8616         }
8617       else if ((op & 0xf0) == 0xa0)
8618         {
8619           int end = 4 + (op & 0x07);
8620           bfd_boolean first = TRUE;
8621           int i;
8622
8623           printf ("     pop {");
8624           for (i = 4; i <= end; i++)
8625             {
8626               if (first)
8627                 first = FALSE;
8628               else
8629                 printf (", ");
8630               printf ("r%d", i);
8631             }
8632           if (op & 0x08)
8633             {
8634               if (!first)
8635                 printf (", ");
8636               printf ("r14");
8637             }
8638           printf ("}");
8639         }
8640       else if (op == 0xb0)
8641         printf (_("     finish"));
8642       else if (op == 0xb1)
8643         {
8644           GET_OP (op2);
8645           if (op2 == 0 || (op2 & 0xf0) != 0)
8646             printf (_("[Spare]"));
8647           else
8648             {
8649               unsigned int mask = op2 & 0x0f;
8650               bfd_boolean first = TRUE;
8651               int i;
8652
8653               printf ("pop {");
8654               for (i = 0; i < 12; i++)
8655                 if (mask & (1 << i))
8656                   {
8657                     if (first)
8658                       first = FALSE;
8659                     else
8660                       printf (", ");
8661                     printf ("r%d", i);
8662                   }
8663               printf ("}");
8664             }
8665         }
8666       else if (op == 0xb2)
8667         {
8668           unsigned char buf[9];
8669           unsigned int i, len;
8670           unsigned long offset;
8671
8672           for (i = 0; i < sizeof (buf); i++)
8673             {
8674               GET_OP (buf[i]);
8675               if ((buf[i] & 0x80) == 0)
8676                 break;
8677             }
8678           if (i == sizeof (buf))
8679             {
8680               error (_("corrupt change to vsp"));
8681               res = FALSE;
8682             }
8683           else
8684             {
8685               offset = read_uleb128 (buf, &len, buf + i + 1);
8686               assert (len == i + 1);
8687               offset = offset * 4 + 0x204;
8688               printf ("vsp = vsp + %ld", offset);
8689             }
8690         }
8691       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8692         {
8693           unsigned int first, last;
8694
8695           GET_OP (op2);
8696           first = op2 >> 4;
8697           last = op2 & 0x0f;
8698           if (op == 0xc8)
8699             first = first + 16;
8700           printf ("pop {D%d", first);
8701           if (last)
8702             printf ("-D%d", first + last);
8703           printf ("}");
8704         }
8705       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8706         {
8707           unsigned int count = op & 0x07;
8708
8709           printf ("pop {D8");
8710           if (count)
8711             printf ("-D%d", 8 + count);
8712           printf ("}");
8713         }
8714       else if (op >= 0xc0 && op <= 0xc5)
8715         {
8716           unsigned int count = op & 0x07;
8717
8718           printf ("     pop {wR10");
8719           if (count)
8720             printf ("-wR%d", 10 + count);
8721           printf ("}");
8722         }
8723       else if (op == 0xc6)
8724         {
8725           unsigned int first, last;
8726
8727           GET_OP (op2);
8728           first = op2 >> 4;
8729           last = op2 & 0x0f;
8730           printf ("pop {wR%d", first);
8731           if (last)
8732             printf ("-wR%d", first + last);
8733           printf ("}");
8734         }
8735       else if (op == 0xc7)
8736         {
8737           GET_OP (op2);
8738           if (op2 == 0 || (op2 & 0xf0) != 0)
8739             printf (_("[Spare]"));
8740           else
8741             {
8742               unsigned int mask = op2 & 0x0f;
8743               bfd_boolean first = TRUE;
8744               int i;
8745
8746               printf ("pop {");
8747               for (i = 0; i < 4; i++)
8748                 if (mask & (1 << i))
8749                   {
8750                     if (first)
8751                       first = FALSE;
8752                     else
8753                       printf (", ");
8754                     printf ("wCGR%d", i);
8755                   }
8756               printf ("}");
8757             }
8758         }
8759       else
8760         {
8761           printf (_("     [unsupported opcode]"));
8762           res = FALSE;
8763         }
8764
8765       printf ("\n");
8766     }
8767
8768   return res;
8769 }
8770
8771 static bfd_boolean
8772 decode_tic6x_unwind_bytecode (Filedata *                 filedata,
8773                               struct arm_unw_aux_info *  aux,
8774                               unsigned int               word,
8775                               unsigned int               remaining,
8776                               unsigned int               more_words,
8777                               bfd_vma                    data_offset,
8778                               Elf_Internal_Shdr *        data_sec,
8779                               struct arm_section *       data_arm_sec)
8780 {
8781   struct absaddr addr;
8782
8783   /* Decode the unwinding instructions.  */
8784   while (1)
8785     {
8786       unsigned int op, op2;
8787
8788       ADVANCE;
8789       if (remaining == 0)
8790         break;
8791       remaining--;
8792       op = word >> 24;
8793       word <<= 8;
8794
8795       printf ("  0x%02x ", op);
8796
8797       if ((op & 0xc0) == 0x00)
8798         {
8799           int offset = ((op & 0x3f) << 3) + 8;
8800           printf ("     sp = sp + %d", offset);
8801         }
8802       else if ((op & 0xc0) == 0x80)
8803         {
8804           GET_OP (op2);
8805           if (op == 0x80 && op2 == 0)
8806             printf (_("Refuse to unwind"));
8807           else
8808             {
8809               unsigned int mask = ((op & 0x1f) << 8) | op2;
8810               if (op & 0x20)
8811                 printf ("pop compact {");
8812               else
8813                 printf ("pop {");
8814
8815               decode_tic6x_unwind_regmask (mask);
8816               printf("}");
8817             }
8818         }
8819       else if ((op & 0xf0) == 0xc0)
8820         {
8821           unsigned int reg;
8822           unsigned int nregs;
8823           unsigned int i;
8824           const char *name;
8825           struct
8826           {
8827             unsigned int offset;
8828             unsigned int reg;
8829           } regpos[16];
8830
8831           /* Scan entire instruction first so that GET_OP output is not
8832              interleaved with disassembly.  */
8833           nregs = 0;
8834           for (i = 0; nregs < (op & 0xf); i++)
8835             {
8836               GET_OP (op2);
8837               reg = op2 >> 4;
8838               if (reg != 0xf)
8839                 {
8840                   regpos[nregs].offset = i * 2;
8841                   regpos[nregs].reg = reg;
8842                   nregs++;
8843                 }
8844
8845               reg = op2 & 0xf;
8846               if (reg != 0xf)
8847                 {
8848                   regpos[nregs].offset = i * 2 + 1;
8849                   regpos[nregs].reg = reg;
8850                   nregs++;
8851                 }
8852             }
8853
8854           printf (_("pop frame {"));
8855           if (nregs == 0)
8856             {
8857               printf (_("*corrupt* - no registers specified"));
8858             }
8859           else
8860             {
8861               reg = nregs - 1;
8862               for (i = i * 2; i > 0; i--)
8863                 {
8864                   if (regpos[reg].offset == i - 1)
8865                     {
8866                       name = tic6x_unwind_regnames[regpos[reg].reg];
8867                       if (reg > 0)
8868                         reg--;
8869                     }
8870                   else
8871                     name = _("[pad]");
8872
8873                   fputs (name, stdout);
8874                   if (i > 1)
8875                     printf (", ");
8876                 }
8877             }
8878
8879           printf ("}");
8880         }
8881       else if (op == 0xd0)
8882         printf ("     MOV FP, SP");
8883       else if (op == 0xd1)
8884         printf ("     __c6xabi_pop_rts");
8885       else if (op == 0xd2)
8886         {
8887           unsigned char buf[9];
8888           unsigned int i, len;
8889           unsigned long offset;
8890
8891           for (i = 0; i < sizeof (buf); i++)
8892             {
8893               GET_OP (buf[i]);
8894               if ((buf[i] & 0x80) == 0)
8895                 break;
8896             }
8897           /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2.  */
8898           if (i == sizeof (buf))
8899             {
8900               warn (_("Corrupt stack pointer adjustment detected\n"));
8901               return FALSE;
8902             }
8903
8904           offset = read_uleb128 (buf, &len, buf + i + 1);
8905           assert (len == i + 1);
8906           offset = offset * 8 + 0x408;
8907           printf (_("sp = sp + %ld"), offset);
8908         }
8909       else if ((op & 0xf0) == 0xe0)
8910         {
8911           if ((op & 0x0f) == 7)
8912             printf ("     RETURN");
8913           else
8914             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8915         }
8916       else
8917         {
8918           printf (_("     [unsupported opcode]"));
8919         }
8920       putchar ('\n');
8921     }
8922
8923   return TRUE;
8924 }
8925
8926 static bfd_vma
8927 arm_expand_prel31 (Filedata * filedata, bfd_vma word, bfd_vma where)
8928 {
8929   bfd_vma offset;
8930
8931   offset = word & 0x7fffffff;
8932   if (offset & 0x40000000)
8933     offset |= ~ (bfd_vma) 0x7fffffff;
8934
8935   if (filedata->file_header.e_machine == EM_TI_C6000)
8936     offset <<= 1;
8937
8938   return offset + where;
8939 }
8940
8941 static bfd_boolean
8942 decode_arm_unwind (Filedata *                 filedata,
8943                    struct arm_unw_aux_info *  aux,
8944                    unsigned int               word,
8945                    unsigned int               remaining,
8946                    bfd_vma                    data_offset,
8947                    Elf_Internal_Shdr *        data_sec,
8948                    struct arm_section *       data_arm_sec)
8949 {
8950   int per_index;
8951   unsigned int more_words = 0;
8952   struct absaddr addr;
8953   bfd_vma sym_name = (bfd_vma) -1;
8954   bfd_boolean res = TRUE;
8955
8956   if (remaining == 0)
8957     {
8958       /* Fetch the first word.
8959          Note - when decoding an object file the address extracted
8960          here will always be 0.  So we also pass in the sym_name
8961          parameter so that we can find the symbol associated with
8962          the personality routine.  */
8963       if (! get_unwind_section_word (filedata, aux, data_arm_sec, data_sec, data_offset,
8964                                      & word, & addr, & sym_name))
8965         return FALSE;
8966
8967       remaining = 4;
8968     }
8969
8970   if ((word & 0x80000000) == 0)
8971     {
8972       /* Expand prel31 for personality routine.  */
8973       bfd_vma fn;
8974       const char *procname;
8975
8976       fn = arm_expand_prel31 (filedata, word, data_sec->sh_addr + data_offset);
8977       printf (_("  Personality routine: "));
8978       if (fn == 0
8979           && addr.section == SHN_UNDEF && addr.offset == 0
8980           && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8981         {
8982           procname = aux->strtab + sym_name;
8983           print_vma (fn, PREFIX_HEX);
8984           if (procname)
8985             {
8986               fputs (" <", stdout);
8987               fputs (procname, stdout);
8988               fputc ('>', stdout);
8989             }
8990         }
8991       else
8992         procname = arm_print_vma_and_name (filedata, aux, fn, addr);
8993       fputc ('\n', stdout);
8994
8995       /* The GCC personality routines use the standard compact
8996          encoding, starting with one byte giving the number of
8997          words.  */
8998       if (procname != NULL
8999           && (const_strneq (procname, "__gcc_personality_v0")
9000               || const_strneq (procname, "__gxx_personality_v0")
9001               || const_strneq (procname, "__gcj_personality_v0")
9002               || const_strneq (procname, "__gnu_objc_personality_v0")))
9003         {
9004           remaining = 0;
9005           more_words = 1;
9006           ADVANCE;
9007           if (!remaining)
9008             {
9009               printf (_("  [Truncated data]\n"));
9010               return FALSE;
9011             }
9012           more_words = word >> 24;
9013           word <<= 8;
9014           remaining--;
9015           per_index = -1;
9016         }
9017       else
9018         return TRUE;
9019     }
9020   else
9021     {
9022       /* ARM EHABI Section 6.3:
9023
9024          An exception-handling table entry for the compact model looks like:
9025
9026            31 30-28 27-24 23-0
9027            -- ----- ----- ----
9028             1   0   index Data for personalityRoutine[index]    */
9029
9030       if (filedata->file_header.e_machine == EM_ARM
9031           && (word & 0x70000000))
9032         {
9033           warn (_("Corrupt ARM compact model table entry: %x \n"), word);
9034           res = FALSE;
9035         }
9036
9037       per_index = (word >> 24) & 0x7f;
9038       printf (_("  Compact model index: %d\n"), per_index);
9039       if (per_index == 0)
9040         {
9041           more_words = 0;
9042           word <<= 8;
9043           remaining--;
9044         }
9045       else if (per_index < 3)
9046         {
9047           more_words = (word >> 16) & 0xff;
9048           word <<= 16;
9049           remaining -= 2;
9050         }
9051     }
9052
9053   switch (filedata->file_header.e_machine)
9054     {
9055     case EM_ARM:
9056       if (per_index < 3)
9057         {
9058           if (! decode_arm_unwind_bytecode (filedata, aux, word, remaining, more_words,
9059                                             data_offset, data_sec, data_arm_sec))
9060             res = FALSE;
9061         }
9062       else
9063         {
9064           warn (_("Unknown ARM compact model index encountered\n"));
9065           printf (_("  [reserved]\n"));
9066           res = FALSE;
9067         }
9068       break;
9069
9070     case EM_TI_C6000:
9071       if (per_index < 3)
9072         {
9073           if (! decode_tic6x_unwind_bytecode (filedata, aux, word, remaining, more_words,
9074                                               data_offset, data_sec, data_arm_sec))
9075             res = FALSE;
9076         }
9077       else if (per_index < 5)
9078         {
9079           if (((word >> 17) & 0x7f) == 0x7f)
9080             printf (_("  Restore stack from frame pointer\n"));
9081           else
9082             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
9083           printf (_("  Registers restored: "));
9084           if (per_index == 4)
9085             printf (" (compact) ");
9086           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
9087           putchar ('\n');
9088           printf (_("  Return register: %s\n"),
9089                   tic6x_unwind_regnames[word & 0xf]);
9090         }
9091       else
9092         printf (_("  [reserved (%d)]\n"), per_index);
9093       break;
9094
9095     default:
9096       error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
9097              filedata->file_header.e_machine);
9098       res = FALSE;
9099     }
9100
9101   /* Decode the descriptors.  Not implemented.  */
9102
9103   return res;
9104 }
9105
9106 static bfd_boolean
9107 dump_arm_unwind (Filedata *                 filedata,
9108                  struct arm_unw_aux_info *  aux,
9109                  Elf_Internal_Shdr *        exidx_sec)
9110 {
9111   struct arm_section exidx_arm_sec, extab_arm_sec;
9112   unsigned int i, exidx_len;
9113   unsigned long j, nfuns;
9114   bfd_boolean res = TRUE;
9115
9116   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
9117   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
9118   exidx_len = exidx_sec->sh_size / 8;
9119
9120   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
9121   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
9122     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
9123       aux->funtab[nfuns++] = aux->symtab[j];
9124   aux->nfuns = nfuns;
9125   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
9126
9127   for (i = 0; i < exidx_len; i++)
9128     {
9129       unsigned int exidx_fn, exidx_entry;
9130       struct absaddr fn_addr, entry_addr;
9131       bfd_vma fn;
9132
9133       fputc ('\n', stdout);
9134
9135       if (! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9136                                      8 * i, & exidx_fn, & fn_addr, NULL)
9137           || ! get_unwind_section_word (filedata, aux, & exidx_arm_sec, exidx_sec,
9138                                         8 * i + 4, & exidx_entry, & entry_addr, NULL))
9139         {
9140           free (aux->funtab);
9141           arm_free_section (& exidx_arm_sec);
9142           arm_free_section (& extab_arm_sec);
9143           return FALSE;
9144         }
9145
9146       /* ARM EHABI, Section 5:
9147          An index table entry consists of 2 words.
9148          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
9149       if (exidx_fn & 0x80000000)
9150         {
9151           warn (_("corrupt index table entry: %x\n"), exidx_fn);
9152           res = FALSE;
9153         }
9154
9155       fn = arm_expand_prel31 (filedata, exidx_fn, exidx_sec->sh_addr + 8 * i);
9156
9157       arm_print_vma_and_name (filedata, aux, fn, fn_addr);
9158       fputs (": ", stdout);
9159
9160       if (exidx_entry == 1)
9161         {
9162           print_vma (exidx_entry, PREFIX_HEX);
9163           fputs (" [cantunwind]\n", stdout);
9164         }
9165       else if (exidx_entry & 0x80000000)
9166         {
9167           print_vma (exidx_entry, PREFIX_HEX);
9168           fputc ('\n', stdout);
9169           decode_arm_unwind (filedata, aux, exidx_entry, 4, 0, NULL, NULL);
9170         }
9171       else
9172         {
9173           bfd_vma table, table_offset = 0;
9174           Elf_Internal_Shdr *table_sec;
9175
9176           fputs ("@", stdout);
9177           table = arm_expand_prel31 (filedata, exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
9178           print_vma (table, PREFIX_HEX);
9179           printf ("\n");
9180
9181           /* Locate the matching .ARM.extab.  */
9182           if (entry_addr.section != SHN_UNDEF
9183               && entry_addr.section < filedata->file_header.e_shnum)
9184             {
9185               table_sec = filedata->section_headers + entry_addr.section;
9186               table_offset = entry_addr.offset;
9187               /* PR 18879 */
9188               if (table_offset > table_sec->sh_size
9189                   || ((bfd_signed_vma) table_offset) < 0)
9190                 {
9191                   warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
9192                         (unsigned long) table_offset,
9193                         printable_section_name (filedata, table_sec));
9194                   res = FALSE;
9195                   continue;
9196                 }
9197             }
9198           else
9199             {
9200               table_sec = find_section_by_address (filedata, table);
9201               if (table_sec != NULL)
9202                 table_offset = table - table_sec->sh_addr;
9203             }
9204
9205           if (table_sec == NULL)
9206             {
9207               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
9208                     (unsigned long) table);
9209               res = FALSE;
9210               continue;
9211             }
9212
9213           if (! decode_arm_unwind (filedata, aux, 0, 0, table_offset, table_sec,
9214                                    &extab_arm_sec))
9215             res = FALSE;
9216         }
9217     }
9218
9219   printf ("\n");
9220
9221   free (aux->funtab);
9222   arm_free_section (&exidx_arm_sec);
9223   arm_free_section (&extab_arm_sec);
9224
9225   return res;
9226 }
9227
9228 /* Used for both ARM and C6X unwinding tables.  */
9229
9230 static bfd_boolean
9231 arm_process_unwind (Filedata * filedata)
9232 {
9233   struct arm_unw_aux_info aux;
9234   Elf_Internal_Shdr *unwsec = NULL;
9235   Elf_Internal_Shdr *strsec;
9236   Elf_Internal_Shdr *sec;
9237   unsigned long i;
9238   unsigned int sec_type;
9239   bfd_boolean res = TRUE;
9240
9241   switch (filedata->file_header.e_machine)
9242     {
9243     case EM_ARM:
9244       sec_type = SHT_ARM_EXIDX;
9245       break;
9246
9247     case EM_TI_C6000:
9248       sec_type = SHT_C6000_UNWIND;
9249       break;
9250
9251     default:
9252       error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
9253              filedata->file_header.e_machine);
9254       return FALSE;
9255     }
9256
9257   if (filedata->string_table == NULL)
9258     return FALSE;
9259
9260   memset (& aux, 0, sizeof (aux));
9261   aux.filedata = filedata;
9262
9263   for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9264     {
9265       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < filedata->file_header.e_shnum)
9266         {
9267           aux.symtab = GET_ELF_SYMBOLS (filedata, sec, & aux.nsyms);
9268
9269           strsec = filedata->section_headers + sec->sh_link;
9270
9271           /* PR binutils/17531 file: 011-12666-0.004.  */
9272           if (aux.strtab != NULL)
9273             {
9274               error (_("Multiple string tables found in file.\n"));
9275               free (aux.strtab);
9276               res = FALSE;
9277             }
9278           aux.strtab = get_data (NULL, filedata, strsec->sh_offset,
9279                                  1, strsec->sh_size, _("string table"));
9280           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
9281         }
9282       else if (sec->sh_type == sec_type)
9283         unwsec = sec;
9284     }
9285
9286   if (unwsec == NULL)
9287     printf (_("\nThere are no unwind sections in this file.\n"));
9288   else
9289     for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
9290       {
9291         if (sec->sh_type == sec_type)
9292           {
9293             unsigned long num_unwind = sec->sh_size / (2 * eh_addr_size);
9294             printf (ngettext ("\nUnwind section '%s' at offset 0x%lx "
9295                               "contains %lu entry:\n",
9296                               "\nUnwind section '%s' at offset 0x%lx "
9297                               "contains %lu entries:\n",
9298                               num_unwind),
9299                     printable_section_name (filedata, sec),
9300                     (unsigned long) sec->sh_offset,
9301                     num_unwind);
9302
9303             if (! dump_arm_unwind (filedata, &aux, sec))
9304               res = FALSE;
9305           }
9306       }
9307
9308   if (aux.symtab)
9309     free (aux.symtab);
9310   if (aux.strtab)
9311     free ((char *) aux.strtab);
9312
9313   return res;
9314 }
9315
9316 static bfd_boolean
9317 process_unwind (Filedata * filedata)
9318 {
9319   struct unwind_handler
9320   {
9321     unsigned int machtype;
9322     bfd_boolean (* handler)(Filedata *);
9323   } handlers[] =
9324   {
9325     { EM_ARM, arm_process_unwind },
9326     { EM_IA_64, ia64_process_unwind },
9327     { EM_PARISC, hppa_process_unwind },
9328     { EM_TI_C6000, arm_process_unwind },
9329     { 0, NULL }
9330   };
9331   int i;
9332
9333   if (!do_unwind)
9334     return TRUE;
9335
9336   for (i = 0; handlers[i].handler != NULL; i++)
9337     if (filedata->file_header.e_machine == handlers[i].machtype)
9338       return handlers[i].handler (filedata);
9339
9340   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
9341           get_machine_name (filedata->file_header.e_machine));
9342   return TRUE;
9343 }
9344
9345 static void
9346 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
9347 {
9348   switch (entry->d_tag)
9349     {
9350     case DT_MIPS_FLAGS:
9351       if (entry->d_un.d_val == 0)
9352         printf (_("NONE"));
9353       else
9354         {
9355           static const char * opts[] =
9356           {
9357             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
9358             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
9359             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
9360             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
9361             "RLD_ORDER_SAFE"
9362           };
9363           unsigned int cnt;
9364           bfd_boolean first = TRUE;
9365
9366           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
9367             if (entry->d_un.d_val & (1 << cnt))
9368               {
9369                 printf ("%s%s", first ? "" : " ", opts[cnt]);
9370                 first = FALSE;
9371               }
9372         }
9373       break;
9374
9375     case DT_MIPS_IVERSION:
9376       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9377         printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
9378       else
9379         {
9380           char buf[40];
9381           sprintf_vma (buf, entry->d_un.d_ptr);
9382           /* Note: coded this way so that there is a single string for translation.  */
9383           printf (_("<corrupt: %s>"), buf);
9384         }
9385       break;
9386
9387     case DT_MIPS_TIME_STAMP:
9388       {
9389         char timebuf[128];
9390         struct tm * tmp;
9391         time_t atime = entry->d_un.d_val;
9392
9393         tmp = gmtime (&atime);
9394         /* PR 17531: file: 6accc532.  */
9395         if (tmp == NULL)
9396           snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
9397         else
9398           snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
9399                     tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9400                     tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9401         printf (_("Time Stamp: %s"), timebuf);
9402       }
9403       break;
9404
9405     case DT_MIPS_RLD_VERSION:
9406     case DT_MIPS_LOCAL_GOTNO:
9407     case DT_MIPS_CONFLICTNO:
9408     case DT_MIPS_LIBLISTNO:
9409     case DT_MIPS_SYMTABNO:
9410     case DT_MIPS_UNREFEXTNO:
9411     case DT_MIPS_HIPAGENO:
9412     case DT_MIPS_DELTA_CLASS_NO:
9413     case DT_MIPS_DELTA_INSTANCE_NO:
9414     case DT_MIPS_DELTA_RELOC_NO:
9415     case DT_MIPS_DELTA_SYM_NO:
9416     case DT_MIPS_DELTA_CLASSSYM_NO:
9417     case DT_MIPS_COMPACT_SIZE:
9418       print_vma (entry->d_un.d_val, DEC);
9419       break;
9420
9421     default:
9422       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9423     }
9424     putchar ('\n');
9425 }
9426
9427 static void
9428 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
9429 {
9430   switch (entry->d_tag)
9431     {
9432     case DT_HP_DLD_FLAGS:
9433       {
9434         static struct
9435         {
9436           long int bit;
9437           const char * str;
9438         }
9439         flags[] =
9440         {
9441           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
9442           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
9443           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
9444           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
9445           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
9446           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
9447           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
9448           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
9449           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
9450           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
9451           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
9452           { DT_HP_GST, "HP_GST" },
9453           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
9454           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
9455           { DT_HP_NODELETE, "HP_NODELETE" },
9456           { DT_HP_GROUP, "HP_GROUP" },
9457           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
9458         };
9459         bfd_boolean first = TRUE;
9460         size_t cnt;
9461         bfd_vma val = entry->d_un.d_val;
9462
9463         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
9464           if (val & flags[cnt].bit)
9465             {
9466               if (! first)
9467                 putchar (' ');
9468               fputs (flags[cnt].str, stdout);
9469               first = FALSE;
9470               val ^= flags[cnt].bit;
9471             }
9472
9473         if (val != 0 || first)
9474           {
9475             if (! first)
9476               putchar (' ');
9477             print_vma (val, HEX);
9478           }
9479       }
9480       break;
9481
9482     default:
9483       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9484       break;
9485     }
9486   putchar ('\n');
9487 }
9488
9489 #ifdef BFD64
9490
9491 /* VMS vs Unix time offset and factor.  */
9492
9493 #define VMS_EPOCH_OFFSET 35067168000000000LL
9494 #define VMS_GRANULARITY_FACTOR 10000000
9495
9496 /* Display a VMS time in a human readable format.  */
9497
9498 static void
9499 print_vms_time (bfd_int64_t vmstime)
9500 {
9501   struct tm *tm;
9502   time_t unxtime;
9503
9504   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
9505   tm = gmtime (&unxtime);
9506   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
9507           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
9508           tm->tm_hour, tm->tm_min, tm->tm_sec);
9509 }
9510 #endif /* BFD64 */
9511
9512 static void
9513 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
9514 {
9515   switch (entry->d_tag)
9516     {
9517     case DT_IA_64_PLT_RESERVE:
9518       /* First 3 slots reserved.  */
9519       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9520       printf (" -- ");
9521       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
9522       break;
9523
9524     case DT_IA_64_VMS_LINKTIME:
9525 #ifdef BFD64
9526       print_vms_time (entry->d_un.d_val);
9527 #endif
9528       break;
9529
9530     case DT_IA_64_VMS_LNKFLAGS:
9531       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9532       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
9533         printf (" CALL_DEBUG");
9534       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
9535         printf (" NOP0BUFS");
9536       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
9537         printf (" P0IMAGE");
9538       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
9539         printf (" MKTHREADS");
9540       if (entry->d_un.d_val & VMS_LF_UPCALLS)
9541         printf (" UPCALLS");
9542       if (entry->d_un.d_val & VMS_LF_IMGSTA)
9543         printf (" IMGSTA");
9544       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
9545         printf (" INITIALIZE");
9546       if (entry->d_un.d_val & VMS_LF_MAIN)
9547         printf (" MAIN");
9548       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
9549         printf (" EXE_INIT");
9550       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
9551         printf (" TBK_IN_IMG");
9552       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
9553         printf (" DBG_IN_IMG");
9554       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9555         printf (" TBK_IN_DSF");
9556       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9557         printf (" DBG_IN_DSF");
9558       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9559         printf (" SIGNATURES");
9560       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9561         printf (" REL_SEG_OFF");
9562       break;
9563
9564     default:
9565       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9566       break;
9567     }
9568   putchar ('\n');
9569 }
9570
9571 static bfd_boolean
9572 get_32bit_dynamic_section (Filedata * filedata)
9573 {
9574   Elf32_External_Dyn * edyn;
9575   Elf32_External_Dyn * ext;
9576   Elf_Internal_Dyn * entry;
9577
9578   edyn = (Elf32_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9579                                           dynamic_size, _("dynamic section"));
9580   if (!edyn)
9581     return FALSE;
9582
9583   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9584      might not have the luxury of section headers.  Look for the DT_NULL
9585      terminator to determine the number of entries.  */
9586   for (ext = edyn, dynamic_nent = 0;
9587        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9588        ext++)
9589     {
9590       dynamic_nent++;
9591       if (BYTE_GET (ext->d_tag) == DT_NULL)
9592         break;
9593     }
9594
9595   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9596                                                   sizeof (* entry));
9597   if (dynamic_section == NULL)
9598     {
9599       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9600              (unsigned long) dynamic_nent);
9601       free (edyn);
9602       return FALSE;
9603     }
9604
9605   for (ext = edyn, entry = dynamic_section;
9606        entry < dynamic_section + dynamic_nent;
9607        ext++, entry++)
9608     {
9609       entry->d_tag      = BYTE_GET (ext->d_tag);
9610       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9611     }
9612
9613   free (edyn);
9614
9615   return TRUE;
9616 }
9617
9618 static bfd_boolean
9619 get_64bit_dynamic_section (Filedata * filedata)
9620 {
9621   Elf64_External_Dyn * edyn;
9622   Elf64_External_Dyn * ext;
9623   Elf_Internal_Dyn * entry;
9624
9625   /* Read in the data.  */
9626   edyn = (Elf64_External_Dyn *) get_data (NULL, filedata, dynamic_addr, 1,
9627                                           dynamic_size, _("dynamic section"));
9628   if (!edyn)
9629     return FALSE;
9630
9631   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9632      might not have the luxury of section headers.  Look for the DT_NULL
9633      terminator to determine the number of entries.  */
9634   for (ext = edyn, dynamic_nent = 0;
9635        /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer.  */
9636        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9637        ext++)
9638     {
9639       dynamic_nent++;
9640       if (BYTE_GET (ext->d_tag) == DT_NULL)
9641         break;
9642     }
9643
9644   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9645                                                   sizeof (* entry));
9646   if (dynamic_section == NULL)
9647     {
9648       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9649              (unsigned long) dynamic_nent);
9650       free (edyn);
9651       return FALSE;
9652     }
9653
9654   /* Convert from external to internal formats.  */
9655   for (ext = edyn, entry = dynamic_section;
9656        entry < dynamic_section + dynamic_nent;
9657        ext++, entry++)
9658     {
9659       entry->d_tag      = BYTE_GET (ext->d_tag);
9660       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9661     }
9662
9663   free (edyn);
9664
9665   return TRUE;
9666 }
9667
9668 static void
9669 print_dynamic_flags (bfd_vma flags)
9670 {
9671   bfd_boolean first = TRUE;
9672
9673   while (flags)
9674     {
9675       bfd_vma flag;
9676
9677       flag = flags & - flags;
9678       flags &= ~ flag;
9679
9680       if (first)
9681         first = FALSE;
9682       else
9683         putc (' ', stdout);
9684
9685       switch (flag)
9686         {
9687         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
9688         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
9689         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
9690         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
9691         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
9692         default:                fputs (_("unknown"), stdout); break;
9693         }
9694     }
9695   puts ("");
9696 }
9697
9698 /* Parse and display the contents of the dynamic section.  */
9699
9700 static bfd_boolean
9701 process_dynamic_section (Filedata * filedata)
9702 {
9703   Elf_Internal_Dyn * entry;
9704
9705   if (dynamic_size == 0)
9706     {
9707       if (do_dynamic)
9708         printf (_("\nThere is no dynamic section in this file.\n"));
9709
9710       return TRUE;
9711     }
9712
9713   if (is_32bit_elf)
9714     {
9715       if (! get_32bit_dynamic_section (filedata))
9716         return FALSE;
9717     }
9718   else
9719     {
9720       if (! get_64bit_dynamic_section (filedata))
9721         return FALSE;
9722     }
9723
9724   /* Find the appropriate symbol table.  */
9725   if (dynamic_symbols == NULL)
9726     {
9727       for (entry = dynamic_section;
9728            entry < dynamic_section + dynamic_nent;
9729            ++entry)
9730         {
9731           Elf_Internal_Shdr section;
9732
9733           if (entry->d_tag != DT_SYMTAB)
9734             continue;
9735
9736           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9737
9738           /* Since we do not know how big the symbol table is,
9739              we default to reading in the entire file (!) and
9740              processing that.  This is overkill, I know, but it
9741              should work.  */
9742           section.sh_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9743           if ((bfd_size_type) section.sh_offset > filedata->file_size)
9744             {
9745               /* See PR 21379 for a reproducer.  */
9746               error (_("Invalid DT_SYMTAB entry: %lx"), (long) section.sh_offset);
9747               return FALSE;
9748             }
9749
9750           if (archive_file_offset != 0)
9751             section.sh_size = archive_file_size - section.sh_offset;
9752           else
9753             section.sh_size = filedata->file_size - section.sh_offset;
9754
9755           if (is_32bit_elf)
9756             section.sh_entsize = sizeof (Elf32_External_Sym);
9757           else
9758             section.sh_entsize = sizeof (Elf64_External_Sym);
9759           section.sh_name = filedata->string_table_length;
9760
9761           if (dynamic_symbols != NULL)
9762             {
9763               error (_("Multiple dynamic symbol table sections found\n"));
9764               free (dynamic_symbols);
9765             }
9766           dynamic_symbols = GET_ELF_SYMBOLS (filedata, &section, & num_dynamic_syms);
9767           if (num_dynamic_syms < 1)
9768             {
9769               error (_("Unable to determine the number of symbols to load\n"));
9770               continue;
9771             }
9772         }
9773     }
9774
9775   /* Similarly find a string table.  */
9776   if (dynamic_strings == NULL)
9777     {
9778       for (entry = dynamic_section;
9779            entry < dynamic_section + dynamic_nent;
9780            ++entry)
9781         {
9782           unsigned long offset;
9783           long str_tab_len;
9784
9785           if (entry->d_tag != DT_STRTAB)
9786             continue;
9787
9788           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9789
9790           /* Since we do not know how big the string table is,
9791              we default to reading in the entire file (!) and
9792              processing that.  This is overkill, I know, but it
9793              should work.  */
9794
9795           offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
9796
9797           if (archive_file_offset != 0)
9798             str_tab_len = archive_file_size - offset;
9799           else
9800             str_tab_len = filedata->file_size - offset;
9801
9802           if (str_tab_len < 1)
9803             {
9804               error
9805                 (_("Unable to determine the length of the dynamic string table\n"));
9806               continue;
9807             }
9808
9809           if (dynamic_strings != NULL)
9810             {
9811               error (_("Multiple dynamic string tables found\n"));
9812               free (dynamic_strings);
9813             }
9814
9815           dynamic_strings = (char *) get_data (NULL, filedata, offset, 1,
9816                                                str_tab_len,
9817                                                _("dynamic string table"));
9818           dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9819         }
9820     }
9821
9822   /* And find the syminfo section if available.  */
9823   if (dynamic_syminfo == NULL)
9824     {
9825       unsigned long syminsz = 0;
9826
9827       for (entry = dynamic_section;
9828            entry < dynamic_section + dynamic_nent;
9829            ++entry)
9830         {
9831           if (entry->d_tag == DT_SYMINENT)
9832             {
9833               /* Note: these braces are necessary to avoid a syntax
9834                  error from the SunOS4 C compiler.  */
9835               /* PR binutils/17531: A corrupt file can trigger this test.
9836                  So do not use an assert, instead generate an error message.  */
9837               if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9838                 error (_("Bad value (%d) for SYMINENT entry\n"),
9839                        (int) entry->d_un.d_val);
9840             }
9841           else if (entry->d_tag == DT_SYMINSZ)
9842             syminsz = entry->d_un.d_val;
9843           else if (entry->d_tag == DT_SYMINFO)
9844             dynamic_syminfo_offset = offset_from_vma (filedata, entry->d_un.d_val,
9845                                                       syminsz);
9846         }
9847
9848       if (dynamic_syminfo_offset != 0 && syminsz != 0)
9849         {
9850           Elf_External_Syminfo * extsyminfo;
9851           Elf_External_Syminfo * extsym;
9852           Elf_Internal_Syminfo * syminfo;
9853
9854           /* There is a syminfo section.  Read the data.  */
9855           extsyminfo = (Elf_External_Syminfo *)
9856               get_data (NULL, filedata, dynamic_syminfo_offset, 1, syminsz,
9857                         _("symbol information"));
9858           if (!extsyminfo)
9859             return FALSE;
9860
9861           if (dynamic_syminfo != NULL)
9862             {
9863               error (_("Multiple dynamic symbol information sections found\n"));
9864               free (dynamic_syminfo);
9865             }
9866           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9867           if (dynamic_syminfo == NULL)
9868             {
9869               error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9870                      (unsigned long) syminsz);
9871               return FALSE;
9872             }
9873
9874           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9875           for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9876                syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9877                ++syminfo, ++extsym)
9878             {
9879               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9880               syminfo->si_flags = BYTE_GET (extsym->si_flags);
9881             }
9882
9883           free (extsyminfo);
9884         }
9885     }
9886
9887   if (do_dynamic && dynamic_addr)
9888     printf (ngettext ("\nDynamic section at offset 0x%lx "
9889                       "contains %lu entry:\n",
9890                       "\nDynamic section at offset 0x%lx "
9891                       "contains %lu entries:\n",
9892                       dynamic_nent),
9893             dynamic_addr, (unsigned long) dynamic_nent);
9894   if (do_dynamic)
9895     printf (_("  Tag        Type                         Name/Value\n"));
9896
9897   for (entry = dynamic_section;
9898        entry < dynamic_section + dynamic_nent;
9899        entry++)
9900     {
9901       if (do_dynamic)
9902         {
9903           const char * dtype;
9904
9905           putchar (' ');
9906           print_vma (entry->d_tag, FULL_HEX);
9907           dtype = get_dynamic_type (filedata, entry->d_tag);
9908           printf (" (%s)%*s", dtype,
9909                   ((is_32bit_elf ? 27 : 19) - (int) strlen (dtype)), " ");
9910         }
9911
9912       switch (entry->d_tag)
9913         {
9914         case DT_FLAGS:
9915           if (do_dynamic)
9916             print_dynamic_flags (entry->d_un.d_val);
9917           break;
9918
9919         case DT_AUXILIARY:
9920         case DT_FILTER:
9921         case DT_CONFIG:
9922         case DT_DEPAUDIT:
9923         case DT_AUDIT:
9924           if (do_dynamic)
9925             {
9926               switch (entry->d_tag)
9927                 {
9928                 case DT_AUXILIARY:
9929                   printf (_("Auxiliary library"));
9930                   break;
9931
9932                 case DT_FILTER:
9933                   printf (_("Filter library"));
9934                   break;
9935
9936                 case DT_CONFIG:
9937                   printf (_("Configuration file"));
9938                   break;
9939
9940                 case DT_DEPAUDIT:
9941                   printf (_("Dependency audit library"));
9942                   break;
9943
9944                 case DT_AUDIT:
9945                   printf (_("Audit library"));
9946                   break;
9947                 }
9948
9949               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9950                 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9951               else
9952                 {
9953                   printf (": ");
9954                   print_vma (entry->d_un.d_val, PREFIX_HEX);
9955                   putchar ('\n');
9956                 }
9957             }
9958           break;
9959
9960         case DT_FEATURE:
9961           if (do_dynamic)
9962             {
9963               printf (_("Flags:"));
9964
9965               if (entry->d_un.d_val == 0)
9966                 printf (_(" None\n"));
9967               else
9968                 {
9969                   unsigned long int val = entry->d_un.d_val;
9970
9971                   if (val & DTF_1_PARINIT)
9972                     {
9973                       printf (" PARINIT");
9974                       val ^= DTF_1_PARINIT;
9975                     }
9976                   if (val & DTF_1_CONFEXP)
9977                     {
9978                       printf (" CONFEXP");
9979                       val ^= DTF_1_CONFEXP;
9980                     }
9981                   if (val != 0)
9982                     printf (" %lx", val);
9983                   puts ("");
9984                 }
9985             }
9986           break;
9987
9988         case DT_POSFLAG_1:
9989           if (do_dynamic)
9990             {
9991               printf (_("Flags:"));
9992
9993               if (entry->d_un.d_val == 0)
9994                 printf (_(" None\n"));
9995               else
9996                 {
9997                   unsigned long int val = entry->d_un.d_val;
9998
9999                   if (val & DF_P1_LAZYLOAD)
10000                     {
10001                       printf (" LAZYLOAD");
10002                       val ^= DF_P1_LAZYLOAD;
10003                     }
10004                   if (val & DF_P1_GROUPPERM)
10005                     {
10006                       printf (" GROUPPERM");
10007                       val ^= DF_P1_GROUPPERM;
10008                     }
10009                   if (val != 0)
10010                     printf (" %lx", val);
10011                   puts ("");
10012                 }
10013             }
10014           break;
10015
10016         case DT_FLAGS_1:
10017           if (do_dynamic)
10018             {
10019               printf (_("Flags:"));
10020               if (entry->d_un.d_val == 0)
10021                 printf (_(" None\n"));
10022               else
10023                 {
10024                   unsigned long int val = entry->d_un.d_val;
10025
10026                   if (val & DF_1_NOW)
10027                     {
10028                       printf (" NOW");
10029                       val ^= DF_1_NOW;
10030                     }
10031                   if (val & DF_1_GLOBAL)
10032                     {
10033                       printf (" GLOBAL");
10034                       val ^= DF_1_GLOBAL;
10035                     }
10036                   if (val & DF_1_GROUP)
10037                     {
10038                       printf (" GROUP");
10039                       val ^= DF_1_GROUP;
10040                     }
10041                   if (val & DF_1_NODELETE)
10042                     {
10043                       printf (" NODELETE");
10044                       val ^= DF_1_NODELETE;
10045                     }
10046                   if (val & DF_1_LOADFLTR)
10047                     {
10048                       printf (" LOADFLTR");
10049                       val ^= DF_1_LOADFLTR;
10050                     }
10051                   if (val & DF_1_INITFIRST)
10052                     {
10053                       printf (" INITFIRST");
10054                       val ^= DF_1_INITFIRST;
10055                     }
10056                   if (val & DF_1_NOOPEN)
10057                     {
10058                       printf (" NOOPEN");
10059                       val ^= DF_1_NOOPEN;
10060                     }
10061                   if (val & DF_1_ORIGIN)
10062                     {
10063                       printf (" ORIGIN");
10064                       val ^= DF_1_ORIGIN;
10065                     }
10066                   if (val & DF_1_DIRECT)
10067                     {
10068                       printf (" DIRECT");
10069                       val ^= DF_1_DIRECT;
10070                     }
10071                   if (val & DF_1_TRANS)
10072                     {
10073                       printf (" TRANS");
10074                       val ^= DF_1_TRANS;
10075                     }
10076                   if (val & DF_1_INTERPOSE)
10077                     {
10078                       printf (" INTERPOSE");
10079                       val ^= DF_1_INTERPOSE;
10080                     }
10081                   if (val & DF_1_NODEFLIB)
10082                     {
10083                       printf (" NODEFLIB");
10084                       val ^= DF_1_NODEFLIB;
10085                     }
10086                   if (val & DF_1_NODUMP)
10087                     {
10088                       printf (" NODUMP");
10089                       val ^= DF_1_NODUMP;
10090                     }
10091                   if (val & DF_1_CONFALT)
10092                     {
10093                       printf (" CONFALT");
10094                       val ^= DF_1_CONFALT;
10095                     }
10096                   if (val & DF_1_ENDFILTEE)
10097                     {
10098                       printf (" ENDFILTEE");
10099                       val ^= DF_1_ENDFILTEE;
10100                     }
10101                   if (val & DF_1_DISPRELDNE)
10102                     {
10103                       printf (" DISPRELDNE");
10104                       val ^= DF_1_DISPRELDNE;
10105                     }
10106                   if (val & DF_1_DISPRELPND)
10107                     {
10108                       printf (" DISPRELPND");
10109                       val ^= DF_1_DISPRELPND;
10110                     }
10111                   if (val & DF_1_NODIRECT)
10112                     {
10113                       printf (" NODIRECT");
10114                       val ^= DF_1_NODIRECT;
10115                     }
10116                   if (val & DF_1_IGNMULDEF)
10117                     {
10118                       printf (" IGNMULDEF");
10119                       val ^= DF_1_IGNMULDEF;
10120                     }
10121                   if (val & DF_1_NOKSYMS)
10122                     {
10123                       printf (" NOKSYMS");
10124                       val ^= DF_1_NOKSYMS;
10125                     }
10126                   if (val & DF_1_NOHDR)
10127                     {
10128                       printf (" NOHDR");
10129                       val ^= DF_1_NOHDR;
10130                     }
10131                   if (val & DF_1_EDITED)
10132                     {
10133                       printf (" EDITED");
10134                       val ^= DF_1_EDITED;
10135                     }
10136                   if (val & DF_1_NORELOC)
10137                     {
10138                       printf (" NORELOC");
10139                       val ^= DF_1_NORELOC;
10140                     }
10141                   if (val & DF_1_SYMINTPOSE)
10142                     {
10143                       printf (" SYMINTPOSE");
10144                       val ^= DF_1_SYMINTPOSE;
10145                     }
10146                   if (val & DF_1_GLOBAUDIT)
10147                     {
10148                       printf (" GLOBAUDIT");
10149                       val ^= DF_1_GLOBAUDIT;
10150                     }
10151                   if (val & DF_1_SINGLETON)
10152                     {
10153                       printf (" SINGLETON");
10154                       val ^= DF_1_SINGLETON;
10155                     }
10156                   if (val & DF_1_STUB)
10157                     {
10158                       printf (" STUB");
10159                       val ^= DF_1_STUB;
10160                     }
10161                   if (val & DF_1_PIE)
10162                     {
10163                       printf (" PIE");
10164                       val ^= DF_1_PIE;
10165                     }
10166                   if (val & DF_1_KMOD)
10167                     {
10168                       printf (" KMOD");
10169                       val ^= DF_1_KMOD;
10170                     }
10171                   if (val & DF_1_WEAKFILTER)
10172                     {
10173                       printf (" WEAKFILTER");
10174                       val ^= DF_1_WEAKFILTER;
10175                     }
10176                   if (val & DF_1_NOCOMMON)
10177                     {
10178                       printf (" NOCOMMON");
10179                       val ^= DF_1_NOCOMMON;
10180                     }
10181                   if (val != 0)
10182                     printf (" %lx", val);
10183                   puts ("");
10184                 }
10185             }
10186           break;
10187
10188         case DT_PLTREL:
10189           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10190           if (do_dynamic)
10191             puts (get_dynamic_type (filedata, entry->d_un.d_val));
10192           break;
10193
10194         case DT_NULL    :
10195         case DT_NEEDED  :
10196         case DT_PLTGOT  :
10197         case DT_HASH    :
10198         case DT_STRTAB  :
10199         case DT_SYMTAB  :
10200         case DT_RELA    :
10201         case DT_INIT    :
10202         case DT_FINI    :
10203         case DT_SONAME  :
10204         case DT_RPATH   :
10205         case DT_SYMBOLIC:
10206         case DT_REL     :
10207         case DT_DEBUG   :
10208         case DT_TEXTREL :
10209         case DT_JMPREL  :
10210         case DT_RUNPATH :
10211           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10212
10213           if (do_dynamic)
10214             {
10215               char * name;
10216
10217               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
10218                 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10219               else
10220                 name = NULL;
10221
10222               if (name)
10223                 {
10224                   switch (entry->d_tag)
10225                     {
10226                     case DT_NEEDED:
10227                       printf (_("Shared library: [%s]"), name);
10228
10229                       if (streq (name, program_interpreter))
10230                         printf (_(" program interpreter"));
10231                       break;
10232
10233                     case DT_SONAME:
10234                       printf (_("Library soname: [%s]"), name);
10235                       break;
10236
10237                     case DT_RPATH:
10238                       printf (_("Library rpath: [%s]"), name);
10239                       break;
10240
10241                     case DT_RUNPATH:
10242                       printf (_("Library runpath: [%s]"), name);
10243                       break;
10244
10245                     default:
10246                       print_vma (entry->d_un.d_val, PREFIX_HEX);
10247                       break;
10248                     }
10249                 }
10250               else
10251                 print_vma (entry->d_un.d_val, PREFIX_HEX);
10252
10253               putchar ('\n');
10254             }
10255           break;
10256
10257         case DT_PLTRELSZ:
10258         case DT_RELASZ  :
10259         case DT_STRSZ   :
10260         case DT_RELSZ   :
10261         case DT_RELAENT :
10262         case DT_SYMENT  :
10263         case DT_RELENT  :
10264           dynamic_info[entry->d_tag] = entry->d_un.d_val;
10265           /* Fall through.  */
10266         case DT_PLTPADSZ:
10267         case DT_MOVEENT :
10268         case DT_MOVESZ  :
10269         case DT_INIT_ARRAYSZ:
10270         case DT_FINI_ARRAYSZ:
10271         case DT_GNU_CONFLICTSZ:
10272         case DT_GNU_LIBLISTSZ:
10273           if (do_dynamic)
10274             {
10275               print_vma (entry->d_un.d_val, UNSIGNED);
10276               printf (_(" (bytes)\n"));
10277             }
10278           break;
10279
10280         case DT_VERDEFNUM:
10281         case DT_VERNEEDNUM:
10282         case DT_RELACOUNT:
10283         case DT_RELCOUNT:
10284           if (do_dynamic)
10285             {
10286               print_vma (entry->d_un.d_val, UNSIGNED);
10287               putchar ('\n');
10288             }
10289           break;
10290
10291         case DT_SYMINSZ:
10292         case DT_SYMINENT:
10293         case DT_SYMINFO:
10294         case DT_USED:
10295         case DT_INIT_ARRAY:
10296         case DT_FINI_ARRAY:
10297           if (do_dynamic)
10298             {
10299               if (entry->d_tag == DT_USED
10300                   && VALID_DYNAMIC_NAME (entry->d_un.d_val))
10301                 {
10302                   char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
10303
10304                   if (*name)
10305                     {
10306                       printf (_("Not needed object: [%s]\n"), name);
10307                       break;
10308                     }
10309                 }
10310
10311               print_vma (entry->d_un.d_val, PREFIX_HEX);
10312               putchar ('\n');
10313             }
10314           break;
10315
10316         case DT_BIND_NOW:
10317           /* The value of this entry is ignored.  */
10318           if (do_dynamic)
10319             putchar ('\n');
10320           break;
10321
10322         case DT_GNU_PRELINKED:
10323           if (do_dynamic)
10324             {
10325               struct tm * tmp;
10326               time_t atime = entry->d_un.d_val;
10327
10328               tmp = gmtime (&atime);
10329               /* PR 17533 file: 041-1244816-0.004.  */
10330               if (tmp == NULL)
10331                 printf (_("<corrupt time val: %lx"),
10332                         (unsigned long) atime);
10333               else
10334                 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
10335                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
10336                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
10337
10338             }
10339           break;
10340
10341         case DT_GNU_HASH:
10342           dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
10343           if (do_dynamic)
10344             {
10345               print_vma (entry->d_un.d_val, PREFIX_HEX);
10346               putchar ('\n');
10347             }
10348           break;
10349
10350         default:
10351           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
10352             version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
10353               entry->d_un.d_val;
10354
10355           if (do_dynamic)
10356             {
10357               switch (filedata->file_header.e_machine)
10358                 {
10359                 case EM_MIPS:
10360                 case EM_MIPS_RS3_LE:
10361                   dynamic_section_mips_val (entry);
10362                   break;
10363                 case EM_PARISC:
10364                   dynamic_section_parisc_val (entry);
10365                   break;
10366                 case EM_IA_64:
10367                   dynamic_section_ia64_val (entry);
10368                   break;
10369                 default:
10370                   print_vma (entry->d_un.d_val, PREFIX_HEX);
10371                   putchar ('\n');
10372                 }
10373             }
10374           break;
10375         }
10376     }
10377
10378   return TRUE;
10379 }
10380
10381 static char *
10382 get_ver_flags (unsigned int flags)
10383 {
10384   static char buff[128];
10385
10386   buff[0] = 0;
10387
10388   if (flags == 0)
10389     return _("none");
10390
10391   if (flags & VER_FLG_BASE)
10392     strcat (buff, "BASE");
10393
10394   if (flags & VER_FLG_WEAK)
10395     {
10396       if (flags & VER_FLG_BASE)
10397         strcat (buff, " | ");
10398
10399       strcat (buff, "WEAK");
10400     }
10401
10402   if (flags & VER_FLG_INFO)
10403     {
10404       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
10405         strcat (buff, " | ");
10406
10407       strcat (buff, "INFO");
10408     }
10409
10410   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10411     {
10412       if (flags & (VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
10413         strcat (buff, " | ");
10414
10415       strcat (buff, _("<unknown>"));
10416     }
10417
10418   return buff;
10419 }
10420
10421 /* Display the contents of the version sections.  */
10422
10423 static bfd_boolean
10424 process_version_sections (Filedata * filedata)
10425 {
10426   Elf_Internal_Shdr * section;
10427   unsigned i;
10428   bfd_boolean found = FALSE;
10429
10430   if (! do_version)
10431     return TRUE;
10432
10433   for (i = 0, section = filedata->section_headers;
10434        i < filedata->file_header.e_shnum;
10435        i++, section++)
10436     {
10437       switch (section->sh_type)
10438         {
10439         case SHT_GNU_verdef:
10440           {
10441             Elf_External_Verdef * edefs;
10442             unsigned long idx;
10443             unsigned long cnt;
10444             char * endbuf;
10445
10446             found = TRUE;
10447
10448             printf (ngettext ("\nVersion definition section '%s' "
10449                               "contains %u entry:\n",
10450                               "\nVersion definition section '%s' "
10451                               "contains %u entries:\n",
10452                               section->sh_info),
10453                     printable_section_name (filedata, section),
10454                     section->sh_info);
10455
10456             printf (_("  Addr: 0x"));
10457             printf_vma (section->sh_addr);
10458             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10459                     (unsigned long) section->sh_offset, section->sh_link,
10460                     printable_section_name_from_index (filedata, section->sh_link));
10461
10462             edefs = (Elf_External_Verdef *)
10463                 get_data (NULL, filedata, section->sh_offset, 1,section->sh_size,
10464                           _("version definition section"));
10465             if (!edefs)
10466               break;
10467             endbuf = (char *) edefs + section->sh_size;
10468
10469             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10470               {
10471                 char * vstart;
10472                 Elf_External_Verdef * edef;
10473                 Elf_Internal_Verdef ent;
10474                 Elf_External_Verdaux * eaux;
10475                 Elf_Internal_Verdaux aux;
10476                 unsigned long isum;
10477                 int j;
10478
10479                 vstart = ((char *) edefs) + idx;
10480                 if (vstart + sizeof (*edef) > endbuf)
10481                   break;
10482
10483                 edef = (Elf_External_Verdef *) vstart;
10484
10485                 ent.vd_version = BYTE_GET (edef->vd_version);
10486                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
10487                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
10488                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
10489                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
10490                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
10491                 ent.vd_next    = BYTE_GET (edef->vd_next);
10492
10493                 printf (_("  %#06lx: Rev: %d  Flags: %s"),
10494                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
10495
10496                 printf (_("  Index: %d  Cnt: %d  "),
10497                         ent.vd_ndx, ent.vd_cnt);
10498
10499                 /* Check for overflow.  */
10500                 if (ent.vd_aux > (size_t) (endbuf - vstart))
10501                   break;
10502
10503                 vstart += ent.vd_aux;
10504
10505                 if (vstart + sizeof (*eaux) > endbuf)
10506                   break;
10507                 eaux = (Elf_External_Verdaux *) vstart;
10508
10509                 aux.vda_name = BYTE_GET (eaux->vda_name);
10510                 aux.vda_next = BYTE_GET (eaux->vda_next);
10511
10512                 if (VALID_DYNAMIC_NAME (aux.vda_name))
10513                   printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
10514                 else
10515                   printf (_("Name index: %ld\n"), aux.vda_name);
10516
10517                 isum = idx + ent.vd_aux;
10518
10519                 for (j = 1; j < ent.vd_cnt; j++)
10520                   {
10521                     if (aux.vda_next < sizeof (*eaux)
10522                         && !(j == ent.vd_cnt - 1 && aux.vda_next == 0))
10523                       {
10524                         warn (_("Invalid vda_next field of %lx\n"),
10525                               aux.vda_next);
10526                         j = ent.vd_cnt;
10527                         break;
10528                       }
10529                     /* Check for overflow.  */
10530                     if (aux.vda_next > (size_t) (endbuf - vstart))
10531                       break;
10532
10533                     isum   += aux.vda_next;
10534                     vstart += aux.vda_next;
10535
10536                     if (vstart + sizeof (*eaux) > endbuf)
10537                       break;
10538                     eaux = (Elf_External_Verdaux *) vstart;
10539
10540                     aux.vda_name = BYTE_GET (eaux->vda_name);
10541                     aux.vda_next = BYTE_GET (eaux->vda_next);
10542
10543                     if (VALID_DYNAMIC_NAME (aux.vda_name))
10544                       printf (_("  %#06lx: Parent %d: %s\n"),
10545                               isum, j, GET_DYNAMIC_NAME (aux.vda_name));
10546                     else
10547                       printf (_("  %#06lx: Parent %d, name index: %ld\n"),
10548                               isum, j, aux.vda_name);
10549                   }
10550
10551                 if (j < ent.vd_cnt)
10552                   printf (_("  Version def aux past end of section\n"));
10553
10554                 /* PR 17531:
10555                    file: id:000001,src:000172+005151,op:splice,rep:2.  */
10556                 if (ent.vd_next < sizeof (*edef)
10557                     && !(cnt == section->sh_info - 1 && ent.vd_next == 0))
10558                   {
10559                     warn (_("Invalid vd_next field of %lx\n"), ent.vd_next);
10560                     cnt = section->sh_info;
10561                     break;
10562                   }
10563                 if (ent.vd_next > (size_t) (endbuf - ((char *) edefs + idx)))
10564                   break;
10565
10566                 idx += ent.vd_next;
10567               }
10568
10569             if (cnt < section->sh_info)
10570               printf (_("  Version definition past end of section\n"));
10571
10572             free (edefs);
10573           }
10574           break;
10575
10576         case SHT_GNU_verneed:
10577           {
10578             Elf_External_Verneed * eneed;
10579             unsigned long idx;
10580             unsigned long cnt;
10581             char * endbuf;
10582
10583             found = TRUE;
10584
10585             printf (ngettext ("\nVersion needs section '%s' "
10586                               "contains %u entry:\n",
10587                               "\nVersion needs section '%s' "
10588                               "contains %u entries:\n",
10589                               section->sh_info),
10590                     printable_section_name (filedata, section), section->sh_info);
10591
10592             printf (_(" Addr: 0x"));
10593             printf_vma (section->sh_addr);
10594             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10595                     (unsigned long) section->sh_offset, section->sh_link,
10596                     printable_section_name_from_index (filedata, section->sh_link));
10597
10598             eneed = (Elf_External_Verneed *) get_data (NULL, filedata,
10599                                                        section->sh_offset, 1,
10600                                                        section->sh_size,
10601                                                        _("Version Needs section"));
10602             if (!eneed)
10603               break;
10604             endbuf = (char *) eneed + section->sh_size;
10605
10606             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
10607               {
10608                 Elf_External_Verneed * entry;
10609                 Elf_Internal_Verneed ent;
10610                 unsigned long isum;
10611                 int j;
10612                 char * vstart;
10613
10614                 vstart = ((char *) eneed) + idx;
10615                 if (vstart + sizeof (*entry) > endbuf)
10616                   break;
10617
10618                 entry = (Elf_External_Verneed *) vstart;
10619
10620                 ent.vn_version = BYTE_GET (entry->vn_version);
10621                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
10622                 ent.vn_file    = BYTE_GET (entry->vn_file);
10623                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
10624                 ent.vn_next    = BYTE_GET (entry->vn_next);
10625
10626                 printf (_("  %#06lx: Version: %d"), idx, ent.vn_version);
10627
10628                 if (VALID_DYNAMIC_NAME (ent.vn_file))
10629                   printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
10630                 else
10631                   printf (_("  File: %lx"), ent.vn_file);
10632
10633                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
10634
10635                 /* Check for overflow.  */
10636                 if (ent.vn_aux > (size_t) (endbuf - vstart))
10637                   break;
10638                 vstart += ent.vn_aux;
10639
10640                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10641                   {
10642                     Elf_External_Vernaux * eaux;
10643                     Elf_Internal_Vernaux aux;
10644
10645                     if (vstart + sizeof (*eaux) > endbuf)
10646                       break;
10647                     eaux = (Elf_External_Vernaux *) vstart;
10648
10649                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
10650                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
10651                     aux.vna_other = BYTE_GET (eaux->vna_other);
10652                     aux.vna_name  = BYTE_GET (eaux->vna_name);
10653                     aux.vna_next  = BYTE_GET (eaux->vna_next);
10654
10655                     if (VALID_DYNAMIC_NAME (aux.vna_name))
10656                       printf (_("  %#06lx:   Name: %s"),
10657                               isum, GET_DYNAMIC_NAME (aux.vna_name));
10658                     else
10659                       printf (_("  %#06lx:   Name index: %lx"),
10660                               isum, aux.vna_name);
10661
10662                     printf (_("  Flags: %s  Version: %d\n"),
10663                             get_ver_flags (aux.vna_flags), aux.vna_other);
10664
10665                     if (aux.vna_next < sizeof (*eaux)
10666                         && !(j == ent.vn_cnt - 1 && aux.vna_next == 0))
10667                       {
10668                         warn (_("Invalid vna_next field of %lx\n"),
10669                               aux.vna_next);
10670                         j = ent.vn_cnt;
10671                         break;
10672                       }
10673                     /* Check for overflow.  */
10674                     if (aux.vna_next > (size_t) (endbuf - vstart))
10675                       break;
10676                     isum   += aux.vna_next;
10677                     vstart += aux.vna_next;
10678                   }
10679
10680                 if (j < ent.vn_cnt)
10681                   warn (_("Missing Version Needs auxillary information\n"));
10682
10683                 if (ent.vn_next < sizeof (*entry)
10684                     && !(cnt == section->sh_info - 1 && ent.vn_next == 0))
10685                   {
10686                     warn (_("Invalid vn_next field of %lx\n"), ent.vn_next);
10687                     cnt = section->sh_info;
10688                     break;
10689                   }
10690                 if (ent.vn_next > (size_t) (endbuf - ((char *) eneed + idx)))
10691                   break;
10692                 idx += ent.vn_next;
10693               }
10694
10695             if (cnt < section->sh_info)
10696               warn (_("Missing Version Needs information\n"));
10697
10698             free (eneed);
10699           }
10700           break;
10701
10702         case SHT_GNU_versym:
10703           {
10704             Elf_Internal_Shdr * link_section;
10705             size_t total;
10706             unsigned int cnt;
10707             unsigned char * edata;
10708             unsigned short * data;
10709             char * strtab;
10710             Elf_Internal_Sym * symbols;
10711             Elf_Internal_Shdr * string_sec;
10712             unsigned long num_syms;
10713             long off;
10714
10715             if (section->sh_link >= filedata->file_header.e_shnum)
10716               break;
10717
10718             link_section = filedata->section_headers + section->sh_link;
10719             total = section->sh_size / sizeof (Elf_External_Versym);
10720
10721             if (link_section->sh_link >= filedata->file_header.e_shnum)
10722               break;
10723
10724             found = TRUE;
10725
10726             symbols = GET_ELF_SYMBOLS (filedata, link_section, & num_syms);
10727             if (symbols == NULL)
10728               break;
10729
10730             string_sec = filedata->section_headers + link_section->sh_link;
10731
10732             strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
10733                                         string_sec->sh_size,
10734                                         _("version string table"));
10735             if (!strtab)
10736               {
10737                 free (symbols);
10738                 break;
10739               }
10740
10741             printf (ngettext ("\nVersion symbols section '%s' "
10742                               "contains %lu entry:\n",
10743                               "\nVersion symbols section '%s' "
10744                               "contains %lu entries:\n",
10745                               total),
10746                     printable_section_name (filedata, section), (unsigned long) total);
10747
10748             printf (_(" Addr: "));
10749             printf_vma (section->sh_addr);
10750             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10751                     (unsigned long) section->sh_offset, section->sh_link,
10752                     printable_section_name (filedata, link_section));
10753
10754             off = offset_from_vma (filedata,
10755                                    version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10756                                    total * sizeof (short));
10757             edata = (unsigned char *) get_data (NULL, filedata, off, total,
10758                                                 sizeof (short),
10759                                                 _("version symbol data"));
10760             if (!edata)
10761               {
10762                 free (strtab);
10763                 free (symbols);
10764                 break;
10765               }
10766
10767             data = (short unsigned int *) cmalloc (total, sizeof (short));
10768
10769             for (cnt = total; cnt --;)
10770               data[cnt] = byte_get (edata + cnt * sizeof (short),
10771                                     sizeof (short));
10772
10773             free (edata);
10774
10775             for (cnt = 0; cnt < total; cnt += 4)
10776               {
10777                 int j, nn;
10778                 char *name;
10779                 char *invalid = _("*invalid*");
10780
10781                 printf ("  %03x:", cnt);
10782
10783                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10784                   switch (data[cnt + j])
10785                     {
10786                     case 0:
10787                       fputs (_("   0 (*local*)    "), stdout);
10788                       break;
10789
10790                     case 1:
10791                       fputs (_("   1 (*global*)   "), stdout);
10792                       break;
10793
10794                     default:
10795                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10796                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10797
10798                       /* If this index value is greater than the size of the symbols
10799                          array, break to avoid an out-of-bounds read.  */
10800                       if ((unsigned long)(cnt + j) >= num_syms)
10801                         {
10802                           warn (_("invalid index into symbol array\n"));
10803                           break;
10804                         }
10805
10806                       name = NULL;
10807                       if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10808                         {
10809                           Elf_Internal_Verneed ivn;
10810                           unsigned long offset;
10811
10812                           offset = offset_from_vma
10813                             (filedata, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10814                              sizeof (Elf_External_Verneed));
10815
10816                           do
10817                             {
10818                               Elf_Internal_Vernaux ivna;
10819                               Elf_External_Verneed evn;
10820                               Elf_External_Vernaux evna;
10821                               unsigned long a_off;
10822
10823                               if (get_data (&evn, filedata, offset, sizeof (evn), 1,
10824                                             _("version need")) == NULL)
10825                                 break;
10826
10827                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10828                               ivn.vn_next = BYTE_GET (evn.vn_next);
10829
10830                               a_off = offset + ivn.vn_aux;
10831
10832                               do
10833                                 {
10834                                   if (get_data (&evna, filedata, a_off, sizeof (evna),
10835                                                 1, _("version need aux (2)")) == NULL)
10836                                     {
10837                                       ivna.vna_next  = 0;
10838                                       ivna.vna_other = 0;
10839                                     }
10840                                   else
10841                                     {
10842                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
10843                                       ivna.vna_other = BYTE_GET (evna.vna_other);
10844                                     }
10845
10846                                   a_off += ivna.vna_next;
10847                                 }
10848                               while (ivna.vna_other != data[cnt + j]
10849                                      && ivna.vna_next != 0);
10850
10851                               if (ivna.vna_other == data[cnt + j])
10852                                 {
10853                                   ivna.vna_name = BYTE_GET (evna.vna_name);
10854
10855                                   if (ivna.vna_name >= string_sec->sh_size)
10856                                     name = invalid;
10857                                   else
10858                                     name = strtab + ivna.vna_name;
10859                                   break;
10860                                 }
10861
10862                               offset += ivn.vn_next;
10863                             }
10864                           while (ivn.vn_next);
10865                         }
10866
10867                       if (data[cnt + j] != 0x8001
10868                           && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10869                         {
10870                           Elf_Internal_Verdef ivd;
10871                           Elf_External_Verdef evd;
10872                           unsigned long offset;
10873
10874                           offset = offset_from_vma
10875                             (filedata, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10876                              sizeof evd);
10877
10878                           do
10879                             {
10880                               if (get_data (&evd, filedata, offset, sizeof (evd), 1,
10881                                             _("version def")) == NULL)
10882                                 {
10883                                   ivd.vd_next = 0;
10884                                   /* PR 17531: file: 046-1082287-0.004.  */
10885                                   ivd.vd_ndx  = (data[cnt + j] & VERSYM_VERSION) + 1;
10886                                   break;
10887                                 }
10888                               else
10889                                 {
10890                                   ivd.vd_next = BYTE_GET (evd.vd_next);
10891                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
10892                                 }
10893
10894                               offset += ivd.vd_next;
10895                             }
10896                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10897                                  && ivd.vd_next != 0);
10898
10899                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10900                             {
10901                               Elf_External_Verdaux evda;
10902                               Elf_Internal_Verdaux ivda;
10903
10904                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
10905
10906                               if (get_data (&evda, filedata,
10907                                             offset - ivd.vd_next + ivd.vd_aux,
10908                                             sizeof (evda), 1,
10909                                             _("version def aux")) == NULL)
10910                                 break;
10911
10912                               ivda.vda_name = BYTE_GET (evda.vda_name);
10913
10914                               if (ivda.vda_name >= string_sec->sh_size)
10915                                 name = invalid;
10916                               else if (name != NULL && name != invalid)
10917                                 name = _("*both*");
10918                               else
10919                                 name = strtab + ivda.vda_name;
10920                             }
10921                         }
10922                       if (name != NULL)
10923                         nn += printf ("(%s%-*s",
10924                                       name,
10925                                       12 - (int) strlen (name),
10926                                       ")");
10927
10928                       if (nn < 18)
10929                         printf ("%*c", 18 - nn, ' ');
10930                     }
10931
10932                 putchar ('\n');
10933               }
10934
10935             free (data);
10936             free (strtab);
10937             free (symbols);
10938           }
10939           break;
10940
10941         default:
10942           break;
10943         }
10944     }
10945
10946   if (! found)
10947     printf (_("\nNo version information found in this file.\n"));
10948
10949   return TRUE;
10950 }
10951
10952 static const char *
10953 get_symbol_binding (Filedata * filedata, unsigned int binding)
10954 {
10955   static char buff[32];
10956
10957   switch (binding)
10958     {
10959     case STB_LOCAL:     return "LOCAL";
10960     case STB_GLOBAL:    return "GLOBAL";
10961     case STB_WEAK:      return "WEAK";
10962     default:
10963       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10964         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10965                   binding);
10966       else if (binding >= STB_LOOS && binding <= STB_HIOS)
10967         {
10968           if (binding == STB_GNU_UNIQUE
10969               && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10970                   /* GNU is still using the default value 0.  */
10971                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10972             return "UNIQUE";
10973           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10974         }
10975       else
10976         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
10977       return buff;
10978     }
10979 }
10980
10981 static const char *
10982 get_symbol_type (Filedata * filedata, unsigned int type)
10983 {
10984   static char buff[32];
10985
10986   switch (type)
10987     {
10988     case STT_NOTYPE:    return "NOTYPE";
10989     case STT_OBJECT:    return "OBJECT";
10990     case STT_FUNC:      return "FUNC";
10991     case STT_SECTION:   return "SECTION";
10992     case STT_FILE:      return "FILE";
10993     case STT_COMMON:    return "COMMON";
10994     case STT_TLS:       return "TLS";
10995     case STT_RELC:      return "RELC";
10996     case STT_SRELC:     return "SRELC";
10997     default:
10998       if (type >= STT_LOPROC && type <= STT_HIPROC)
10999         {
11000           if (filedata->file_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
11001             return "THUMB_FUNC";
11002
11003           if (filedata->file_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
11004             return "REGISTER";
11005
11006           if (filedata->file_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
11007             return "PARISC_MILLI";
11008
11009           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
11010         }
11011       else if (type >= STT_LOOS && type <= STT_HIOS)
11012         {
11013           if (filedata->file_header.e_machine == EM_PARISC)
11014             {
11015               if (type == STT_HP_OPAQUE)
11016                 return "HP_OPAQUE";
11017               if (type == STT_HP_STUB)
11018                 return "HP_STUB";
11019             }
11020
11021           if (type == STT_GNU_IFUNC
11022               && (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_GNU
11023                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
11024                   /* GNU is still using the default value 0.  */
11025                   || filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
11026             return "IFUNC";
11027
11028           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
11029         }
11030       else
11031         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
11032       return buff;
11033     }
11034 }
11035
11036 static const char *
11037 get_symbol_visibility (unsigned int visibility)
11038 {
11039   switch (visibility)
11040     {
11041     case STV_DEFAULT:   return "DEFAULT";
11042     case STV_INTERNAL:  return "INTERNAL";
11043     case STV_HIDDEN:    return "HIDDEN";
11044     case STV_PROTECTED: return "PROTECTED";
11045     default:
11046       error (_("Unrecognized visibility value: %u"), visibility);
11047       return _("<unknown>");
11048     }
11049 }
11050
11051 static const char *
11052 get_solaris_symbol_visibility (unsigned int visibility)
11053 {
11054   switch (visibility)
11055     {
11056     case 4: return "EXPORTED";
11057     case 5: return "SINGLETON";
11058     case 6: return "ELIMINATE";
11059     default: return get_symbol_visibility (visibility);
11060     }
11061 }
11062
11063 static const char *
11064 get_mips_symbol_other (unsigned int other)
11065 {
11066   switch (other)
11067     {
11068     case STO_OPTIONAL:      return "OPTIONAL";
11069     case STO_MIPS_PLT:      return "MIPS PLT";
11070     case STO_MIPS_PIC:      return "MIPS PIC";
11071     case STO_MICROMIPS:     return "MICROMIPS";
11072     case STO_MICROMIPS | STO_MIPS_PIC:      return "MICROMIPS, MIPS PIC";
11073     case STO_MIPS16:        return "MIPS16";
11074     default:                return NULL;
11075     }
11076 }
11077
11078 static const char *
11079 get_ia64_symbol_other (Filedata * filedata, unsigned int other)
11080 {
11081   if (is_ia64_vms (filedata))
11082     {
11083       static char res[32];
11084
11085       res[0] = 0;
11086
11087       /* Function types is for images and .STB files only.  */
11088       switch (filedata->file_header.e_type)
11089         {
11090         case ET_DYN:
11091         case ET_EXEC:
11092           switch (VMS_ST_FUNC_TYPE (other))
11093             {
11094             case VMS_SFT_CODE_ADDR:
11095               strcat (res, " CA");
11096               break;
11097             case VMS_SFT_SYMV_IDX:
11098               strcat (res, " VEC");
11099               break;
11100             case VMS_SFT_FD:
11101               strcat (res, " FD");
11102               break;
11103             case VMS_SFT_RESERVE:
11104               strcat (res, " RSV");
11105               break;
11106             default:
11107               warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
11108                     VMS_ST_FUNC_TYPE (other));
11109               strcat (res, " <unknown>");
11110               break;
11111             }
11112           break;
11113         default:
11114           break;
11115         }
11116       switch (VMS_ST_LINKAGE (other))
11117         {
11118         case VMS_STL_IGNORE:
11119           strcat (res, " IGN");
11120           break;
11121         case VMS_STL_RESERVE:
11122           strcat (res, " RSV");
11123           break;
11124         case VMS_STL_STD:
11125           strcat (res, " STD");
11126           break;
11127         case VMS_STL_LNK:
11128           strcat (res, " LNK");
11129           break;
11130         default:
11131           warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
11132                 VMS_ST_LINKAGE (other));
11133           strcat (res, " <unknown>");
11134           break;
11135         }
11136
11137       if (res[0] != 0)
11138         return res + 1;
11139       else
11140         return res;
11141     }
11142   return NULL;
11143 }
11144
11145 static const char *
11146 get_ppc64_symbol_other (unsigned int other)
11147 {
11148   if ((other & ~STO_PPC64_LOCAL_MASK) != 0)
11149     return NULL;
11150
11151   other >>= STO_PPC64_LOCAL_BIT;
11152   if (other <= 6)
11153     {
11154       static char buf[32];
11155       if (other >= 2)
11156         other = ppc64_decode_local_entry (other);
11157       snprintf (buf, sizeof buf, _("<localentry>: %d"), other);
11158       return buf;
11159     }
11160   return NULL;
11161 }
11162
11163 static const char *
11164 get_symbol_other (Filedata * filedata, unsigned int other)
11165 {
11166   const char * result = NULL;
11167   static char buff [32];
11168
11169   if (other == 0)
11170     return "";
11171
11172   switch (filedata->file_header.e_machine)
11173     {
11174     case EM_MIPS:
11175       result = get_mips_symbol_other (other);
11176       break;
11177     case EM_IA_64:
11178       result = get_ia64_symbol_other (filedata, other);
11179       break;
11180     case EM_PPC64:
11181       result = get_ppc64_symbol_other (other);
11182       break;
11183     default:
11184       result = NULL;
11185       break;
11186     }
11187
11188   if (result)
11189     return result;
11190
11191   snprintf (buff, sizeof buff, _("<other>: %x"), other);
11192   return buff;
11193 }
11194
11195 static const char *
11196 get_symbol_index_type (Filedata * filedata, unsigned int type)
11197 {
11198   static char buff[32];
11199
11200   switch (type)
11201     {
11202     case SHN_UNDEF:     return "UND";
11203     case SHN_ABS:       return "ABS";
11204     case SHN_COMMON:    return "COM";
11205     default:
11206       if (type == SHN_IA_64_ANSI_COMMON
11207           && filedata->file_header.e_machine == EM_IA_64
11208           && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
11209         return "ANSI_COM";
11210       else if ((filedata->file_header.e_machine == EM_X86_64
11211                 || filedata->file_header.e_machine == EM_L1OM
11212                 || filedata->file_header.e_machine == EM_K1OM)
11213                && type == SHN_X86_64_LCOMMON)
11214         return "LARGE_COM";
11215       else if ((type == SHN_MIPS_SCOMMON
11216                 && filedata->file_header.e_machine == EM_MIPS)
11217                || (type == SHN_TIC6X_SCOMMON
11218                    && filedata->file_header.e_machine == EM_TI_C6000))
11219         return "SCOM";
11220       else if (type == SHN_MIPS_SUNDEFINED
11221                && filedata->file_header.e_machine == EM_MIPS)
11222         return "SUND";
11223       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
11224         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
11225       else if (type >= SHN_LOOS && type <= SHN_HIOS)
11226         sprintf (buff, "OS [0x%04x]", type & 0xffff);
11227       else if (type >= SHN_LORESERVE)
11228         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
11229       else if (type >= filedata->file_header.e_shnum)
11230         sprintf (buff, _("bad section index[%3d]"), type);
11231       else
11232         sprintf (buff, "%3d", type);
11233       break;
11234     }
11235
11236   return buff;
11237 }
11238
11239 static bfd_vma *
11240 get_dynamic_data (Filedata * filedata, bfd_size_type number, unsigned int ent_size)
11241 {
11242   unsigned char * e_data;
11243   bfd_vma * i_data;
11244
11245   /* If the size_t type is smaller than the bfd_size_type, eg because
11246      you are building a 32-bit tool on a 64-bit host, then make sure
11247      that when (number) is cast to (size_t) no information is lost.  */
11248   if (sizeof (size_t) < sizeof (bfd_size_type)
11249       && (bfd_size_type) ((size_t) number) != number)
11250     {
11251       error (_("Size truncation prevents reading %s elements of size %u\n"),
11252              bfd_vmatoa ("u", number), ent_size);
11253       return NULL;
11254     }
11255
11256   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
11257      attempting to allocate memory when the read is bound to fail.  */
11258   if (ent_size * number > filedata->file_size)
11259     {
11260       error (_("Invalid number of dynamic entries: %s\n"),
11261              bfd_vmatoa ("u", number));
11262       return NULL;
11263     }
11264
11265   e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
11266   if (e_data == NULL)
11267     {
11268       error (_("Out of memory reading %s dynamic entries\n"),
11269              bfd_vmatoa ("u", number));
11270       return NULL;
11271     }
11272
11273   if (fread (e_data, ent_size, (size_t) number, filedata->handle) != number)
11274     {
11275       error (_("Unable to read in %s bytes of dynamic data\n"),
11276              bfd_vmatoa ("u", number * ent_size));
11277       free (e_data);
11278       return NULL;
11279     }
11280
11281   i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
11282   if (i_data == NULL)
11283     {
11284       error (_("Out of memory allocating space for %s dynamic entries\n"),
11285              bfd_vmatoa ("u", number));
11286       free (e_data);
11287       return NULL;
11288     }
11289
11290   while (number--)
11291     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
11292
11293   free (e_data);
11294
11295   return i_data;
11296 }
11297
11298 static void
11299 print_dynamic_symbol (Filedata * filedata, bfd_vma si, unsigned long hn)
11300 {
11301   Elf_Internal_Sym * psym;
11302   int n;
11303
11304   n = print_vma (si, DEC_5);
11305   if (n < 5)
11306     fputs (&"     "[n], stdout);
11307   printf (" %3lu: ", hn);
11308
11309   if (dynamic_symbols == NULL || si >= num_dynamic_syms)
11310     {
11311       printf (_("<No info available for dynamic symbol number %lu>\n"),
11312               (unsigned long) si);
11313       return;
11314     }
11315
11316   psym = dynamic_symbols + si;
11317   print_vma (psym->st_value, LONG_HEX);
11318   putchar (' ');
11319   print_vma (psym->st_size, DEC_5);
11320
11321   printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11322   printf (" %-6s",  get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11323
11324   if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11325     printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11326   else
11327     {
11328       unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11329
11330       printf (" %-7s",  get_symbol_visibility (vis));
11331       /* Check to see if any other bits in the st_other field are set.
11332          Note - displaying this information disrupts the layout of the
11333          table being generated, but for the moment this case is very
11334          rare.  */
11335       if (psym->st_other ^ vis)
11336         printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11337     }
11338
11339   printf (" %3.3s ", get_symbol_index_type (filedata, psym->st_shndx));
11340   if (VALID_DYNAMIC_NAME (psym->st_name))
11341     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
11342   else
11343     printf (_(" <corrupt: %14ld>"), psym->st_name);
11344   putchar ('\n');
11345 }
11346
11347 static const char *
11348 get_symbol_version_string (Filedata *                   filedata,
11349                            bfd_boolean                  is_dynsym,
11350                            const char *                 strtab,
11351                            unsigned long int            strtab_size,
11352                            unsigned int                 si,
11353                            Elf_Internal_Sym *           psym,
11354                            enum versioned_symbol_info * sym_info,
11355                            unsigned short *             vna_other)
11356 {
11357   unsigned char data[2];
11358   unsigned short vers_data;
11359   unsigned long offset;
11360   unsigned short max_vd_ndx;
11361
11362   if (!is_dynsym
11363       || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
11364     return NULL;
11365
11366   offset = offset_from_vma (filedata, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
11367                             sizeof data + si * sizeof (vers_data));
11368
11369   if (get_data (&data, filedata, offset + si * sizeof (vers_data),
11370                 sizeof (data), 1, _("version data")) == NULL)
11371     return NULL;
11372
11373   vers_data = byte_get (data, 2);
11374
11375   if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data == 0)
11376     return NULL;
11377
11378   max_vd_ndx = 0;
11379
11380   /* Usually we'd only see verdef for defined symbols, and verneed for
11381      undefined symbols.  However, symbols defined by the linker in
11382      .dynbss for variables copied from a shared library in order to
11383      avoid text relocations are defined yet have verneed.  We could
11384      use a heuristic to detect the special case, for example, check
11385      for verneed first on symbols defined in SHT_NOBITS sections, but
11386      it is simpler and more reliable to just look for both verdef and
11387      verneed.  .dynbss might not be mapped to a SHT_NOBITS section.  */
11388
11389   if (psym->st_shndx != SHN_UNDEF
11390       && vers_data != 0x8001
11391       && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
11392     {
11393       Elf_Internal_Verdef ivd;
11394       Elf_Internal_Verdaux ivda;
11395       Elf_External_Verdaux evda;
11396       unsigned long off;
11397
11398       off = offset_from_vma (filedata,
11399                              version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
11400                              sizeof (Elf_External_Verdef));
11401
11402       do
11403         {
11404           Elf_External_Verdef evd;
11405
11406           if (get_data (&evd, filedata, off, sizeof (evd), 1,
11407                         _("version def")) == NULL)
11408             {
11409               ivd.vd_ndx = 0;
11410               ivd.vd_aux = 0;
11411               ivd.vd_next = 0;
11412               ivd.vd_flags = 0;
11413             }
11414           else
11415             {
11416               ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
11417               ivd.vd_aux = BYTE_GET (evd.vd_aux);
11418               ivd.vd_next = BYTE_GET (evd.vd_next);
11419               ivd.vd_flags = BYTE_GET (evd.vd_flags);
11420             }
11421
11422           if ((ivd.vd_ndx & VERSYM_VERSION) > max_vd_ndx)
11423             max_vd_ndx = ivd.vd_ndx & VERSYM_VERSION;
11424
11425           off += ivd.vd_next;
11426         }
11427       while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
11428
11429       if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
11430         {
11431           if (ivd.vd_ndx == 1 && ivd.vd_flags == VER_FLG_BASE) 
11432             return NULL;
11433
11434           off -= ivd.vd_next;
11435           off += ivd.vd_aux;
11436
11437           if (get_data (&evda, filedata, off, sizeof (evda), 1,
11438                         _("version def aux")) != NULL)
11439             {
11440               ivda.vda_name = BYTE_GET (evda.vda_name);
11441
11442               if (psym->st_name != ivda.vda_name)
11443                 {
11444                   *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
11445                                ? symbol_hidden : symbol_public);
11446                   return (ivda.vda_name < strtab_size
11447                           ? strtab + ivda.vda_name : _("<corrupt>"));
11448                 }
11449             }
11450         }
11451     }
11452
11453   if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
11454     {
11455       Elf_External_Verneed evn;
11456       Elf_Internal_Verneed ivn;
11457       Elf_Internal_Vernaux ivna;
11458
11459       offset = offset_from_vma (filedata,
11460                                 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
11461                                 sizeof evn);
11462       do
11463         {
11464           unsigned long vna_off;
11465
11466           if (get_data (&evn, filedata, offset, sizeof (evn), 1,
11467                         _("version need")) == NULL)
11468             {
11469               ivna.vna_next = 0;
11470               ivna.vna_other = 0;
11471               ivna.vna_name = 0;
11472               break;
11473             }
11474
11475           ivn.vn_aux  = BYTE_GET (evn.vn_aux);
11476           ivn.vn_next = BYTE_GET (evn.vn_next);
11477
11478           vna_off = offset + ivn.vn_aux;
11479
11480           do
11481             {
11482               Elf_External_Vernaux evna;
11483
11484               if (get_data (&evna, filedata, vna_off, sizeof (evna), 1,
11485                             _("version need aux (3)")) == NULL)
11486                 {
11487                   ivna.vna_next = 0;
11488                   ivna.vna_other = 0;
11489                   ivna.vna_name = 0;
11490                 }
11491               else
11492                 {
11493                   ivna.vna_other = BYTE_GET (evna.vna_other);
11494                   ivna.vna_next  = BYTE_GET (evna.vna_next);
11495                   ivna.vna_name  = BYTE_GET (evna.vna_name);
11496                 }
11497
11498               vna_off += ivna.vna_next;
11499             }
11500           while (ivna.vna_other != vers_data && ivna.vna_next != 0);
11501
11502           if (ivna.vna_other == vers_data)
11503             break;
11504
11505           offset += ivn.vn_next;
11506         }
11507       while (ivn.vn_next != 0);
11508
11509       if (ivna.vna_other == vers_data)
11510         {
11511           *sym_info = symbol_undefined;
11512           *vna_other = ivna.vna_other;
11513           return (ivna.vna_name < strtab_size
11514                   ? strtab + ivna.vna_name : _("<corrupt>"));
11515         }
11516       else if ((max_vd_ndx || (vers_data & VERSYM_VERSION) != 1)
11517                && (vers_data & VERSYM_VERSION) > max_vd_ndx)
11518         return _("<corrupt>");
11519     }
11520   return NULL;
11521 }
11522
11523 /* Dump the symbol table.  */
11524 static bfd_boolean
11525 process_symbol_table (Filedata * filedata)
11526 {
11527   Elf_Internal_Shdr * section;
11528   bfd_size_type nbuckets = 0;
11529   bfd_size_type nchains = 0;
11530   bfd_vma * buckets = NULL;
11531   bfd_vma * chains = NULL;
11532   bfd_vma ngnubuckets = 0;
11533   bfd_vma * gnubuckets = NULL;
11534   bfd_vma * gnuchains = NULL;
11535   bfd_vma gnusymidx = 0;
11536   bfd_size_type ngnuchains = 0;
11537
11538   if (!do_syms && !do_dyn_syms && !do_histogram)
11539     return TRUE;
11540
11541   if (dynamic_info[DT_HASH]
11542       && (do_histogram
11543           || (do_using_dynamic
11544               && !do_dyn_syms
11545               && dynamic_strings != NULL)))
11546     {
11547       unsigned char nb[8];
11548       unsigned char nc[8];
11549       unsigned int hash_ent_size = 4;
11550
11551       if ((filedata->file_header.e_machine == EM_ALPHA
11552            || filedata->file_header.e_machine == EM_S390
11553            || filedata->file_header.e_machine == EM_S390_OLD)
11554           && filedata->file_header.e_ident[EI_CLASS] == ELFCLASS64)
11555         hash_ent_size = 8;
11556
11557       if (fseek (filedata->handle,
11558                  (archive_file_offset
11559                   + offset_from_vma (filedata, dynamic_info[DT_HASH],
11560                                      sizeof nb + sizeof nc)),
11561                  SEEK_SET))
11562         {
11563           error (_("Unable to seek to start of dynamic information\n"));
11564           goto no_hash;
11565         }
11566
11567       if (fread (nb, hash_ent_size, 1, filedata->handle) != 1)
11568         {
11569           error (_("Failed to read in number of buckets\n"));
11570           goto no_hash;
11571         }
11572
11573       if (fread (nc, hash_ent_size, 1, filedata->handle) != 1)
11574         {
11575           error (_("Failed to read in number of chains\n"));
11576           goto no_hash;
11577         }
11578
11579       nbuckets = byte_get (nb, hash_ent_size);
11580       nchains  = byte_get (nc, hash_ent_size);
11581
11582       buckets = get_dynamic_data (filedata, nbuckets, hash_ent_size);
11583       chains  = get_dynamic_data (filedata, nchains, hash_ent_size);
11584
11585     no_hash:
11586       if (buckets == NULL || chains == NULL)
11587         {
11588           if (do_using_dynamic)
11589             return FALSE;
11590           free (buckets);
11591           free (chains);
11592           buckets = NULL;
11593           chains = NULL;
11594           nbuckets = 0;
11595           nchains = 0;
11596         }
11597     }
11598
11599   if (dynamic_info_DT_GNU_HASH
11600       && (do_histogram
11601           || (do_using_dynamic
11602               && !do_dyn_syms
11603               && dynamic_strings != NULL)))
11604     {
11605       unsigned char nb[16];
11606       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
11607       bfd_vma buckets_vma;
11608
11609       if (fseek (filedata->handle,
11610                  (archive_file_offset
11611                   + offset_from_vma (filedata, dynamic_info_DT_GNU_HASH,
11612                                      sizeof nb)),
11613                  SEEK_SET))
11614         {
11615           error (_("Unable to seek to start of dynamic information\n"));
11616           goto no_gnu_hash;
11617         }
11618
11619       if (fread (nb, 16, 1, filedata->handle) != 1)
11620         {
11621           error (_("Failed to read in number of buckets\n"));
11622           goto no_gnu_hash;
11623         }
11624
11625       ngnubuckets = byte_get (nb, 4);
11626       gnusymidx = byte_get (nb + 4, 4);
11627       bitmaskwords = byte_get (nb + 8, 4);
11628       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
11629       if (is_32bit_elf)
11630         buckets_vma += bitmaskwords * 4;
11631       else
11632         buckets_vma += bitmaskwords * 8;
11633
11634       if (fseek (filedata->handle,
11635                  (archive_file_offset
11636                   + offset_from_vma (filedata, buckets_vma, 4)),
11637                  SEEK_SET))
11638         {
11639           error (_("Unable to seek to start of dynamic information\n"));
11640           goto no_gnu_hash;
11641         }
11642
11643       gnubuckets = get_dynamic_data (filedata, ngnubuckets, 4);
11644
11645       if (gnubuckets == NULL)
11646         goto no_gnu_hash;
11647
11648       for (i = 0; i < ngnubuckets; i++)
11649         if (gnubuckets[i] != 0)
11650           {
11651             if (gnubuckets[i] < gnusymidx)
11652               return FALSE;
11653
11654             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11655               maxchain = gnubuckets[i];
11656           }
11657
11658       if (maxchain == 0xffffffff)
11659         goto no_gnu_hash;
11660
11661       maxchain -= gnusymidx;
11662
11663       if (fseek (filedata->handle,
11664                  (archive_file_offset
11665                   + offset_from_vma (filedata, buckets_vma
11666                                            + 4 * (ngnubuckets + maxchain), 4)),
11667                  SEEK_SET))
11668         {
11669           error (_("Unable to seek to start of dynamic information\n"));
11670           goto no_gnu_hash;
11671         }
11672
11673       do
11674         {
11675           if (fread (nb, 4, 1, filedata->handle) != 1)
11676             {
11677               error (_("Failed to determine last chain length\n"));
11678               goto no_gnu_hash;
11679             }
11680
11681           if (maxchain + 1 == 0)
11682             goto no_gnu_hash;
11683
11684           ++maxchain;
11685         }
11686       while ((byte_get (nb, 4) & 1) == 0);
11687
11688       if (fseek (filedata->handle,
11689                  (archive_file_offset
11690                   + offset_from_vma (filedata, buckets_vma + 4 * ngnubuckets, 4)),
11691                  SEEK_SET))
11692         {
11693           error (_("Unable to seek to start of dynamic information\n"));
11694           goto no_gnu_hash;
11695         }
11696
11697       gnuchains = get_dynamic_data (filedata, maxchain, 4);
11698       ngnuchains = maxchain;
11699
11700     no_gnu_hash:
11701       if (gnuchains == NULL)
11702         {
11703           free (gnubuckets);
11704           gnubuckets = NULL;
11705           ngnubuckets = 0;
11706           if (do_using_dynamic)
11707             return FALSE;
11708         }
11709     }
11710
11711   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11712       && do_syms
11713       && do_using_dynamic
11714       && dynamic_strings != NULL
11715       && dynamic_symbols != NULL)
11716     {
11717       unsigned long hn;
11718
11719       if (dynamic_info[DT_HASH])
11720         {
11721           bfd_vma si;
11722           char *visited;
11723
11724           printf (_("\nSymbol table for image:\n"));
11725           if (is_32bit_elf)
11726             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11727           else
11728             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11729
11730           visited = xcmalloc (nchains, 1);
11731           memset (visited, 0, nchains);
11732           for (hn = 0; hn < nbuckets; hn++)
11733             {
11734               for (si = buckets[hn]; si > 0; si = chains[si])
11735                 {
11736                   print_dynamic_symbol (filedata, si, hn);
11737                   if (si >= nchains || visited[si])
11738                     {
11739                       error (_("histogram chain is corrupt\n"));
11740                       break;
11741                     }
11742                   visited[si] = 1;
11743                 }
11744             }
11745           free (visited);
11746         }
11747
11748       if (dynamic_info_DT_GNU_HASH)
11749         {
11750           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11751           if (is_32bit_elf)
11752             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11753           else
11754             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11755
11756           for (hn = 0; hn < ngnubuckets; ++hn)
11757             if (gnubuckets[hn] != 0)
11758               {
11759                 bfd_vma si = gnubuckets[hn];
11760                 bfd_vma off = si - gnusymidx;
11761
11762                 do
11763                   {
11764                     print_dynamic_symbol (filedata, si, hn);
11765                     si++;
11766                   }
11767                 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11768               }
11769         }
11770     }
11771   else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11772            && filedata->section_headers != NULL)
11773     {
11774       unsigned int i;
11775
11776       for (i = 0, section = filedata->section_headers;
11777            i < filedata->file_header.e_shnum;
11778            i++, section++)
11779         {
11780           unsigned int si;
11781           char * strtab = NULL;
11782           unsigned long int strtab_size = 0;
11783           Elf_Internal_Sym * symtab;
11784           Elf_Internal_Sym * psym;
11785           unsigned long num_syms;
11786
11787           if ((section->sh_type != SHT_SYMTAB
11788                && section->sh_type != SHT_DYNSYM)
11789               || (!do_syms
11790                   && section->sh_type == SHT_SYMTAB))
11791             continue;
11792
11793           if (section->sh_entsize == 0)
11794             {
11795               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11796                       printable_section_name (filedata, section));
11797               continue;
11798             }
11799
11800           num_syms = section->sh_size / section->sh_entsize;
11801           printf (ngettext ("\nSymbol table '%s' contains %lu entry:\n",
11802                             "\nSymbol table '%s' contains %lu entries:\n",
11803                             num_syms),
11804                   printable_section_name (filedata, section),
11805                   num_syms);
11806
11807           if (is_32bit_elf)
11808             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
11809           else
11810             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
11811
11812           symtab = GET_ELF_SYMBOLS (filedata, section, & num_syms);
11813           if (symtab == NULL)
11814             continue;
11815
11816           if (section->sh_link == filedata->file_header.e_shstrndx)
11817             {
11818               strtab = filedata->string_table;
11819               strtab_size = filedata->string_table_length;
11820             }
11821           else if (section->sh_link < filedata->file_header.e_shnum)
11822             {
11823               Elf_Internal_Shdr * string_sec;
11824
11825               string_sec = filedata->section_headers + section->sh_link;
11826
11827               strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset,
11828                                           1, string_sec->sh_size,
11829                                           _("string table"));
11830               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11831             }
11832
11833           for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11834             {
11835               const char *version_string;
11836               enum versioned_symbol_info sym_info;
11837               unsigned short vna_other;
11838
11839               printf ("%6d: ", si);
11840               print_vma (psym->st_value, LONG_HEX);
11841               putchar (' ');
11842               print_vma (psym->st_size, DEC_5);
11843               printf (" %-7s", get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)));
11844               printf (" %-6s", get_symbol_binding (filedata, ELF_ST_BIND (psym->st_info)));
11845               if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11846                 printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11847               else
11848                 {
11849                   unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11850
11851                   printf (" %-7s", get_symbol_visibility (vis));
11852                   /* Check to see if any other bits in the st_other field are set.
11853                      Note - displaying this information disrupts the layout of the
11854                      table being generated, but for the moment this case is very rare.  */
11855                   if (psym->st_other ^ vis)
11856                     printf (" [%s] ", get_symbol_other (filedata, psym->st_other ^ vis));
11857                 }
11858               printf (" %4s ", get_symbol_index_type (filedata, psym->st_shndx));
11859               print_symbol (25, psym->st_name < strtab_size
11860                             ? strtab + psym->st_name : _("<corrupt>"));
11861
11862               version_string
11863                 = get_symbol_version_string (filedata,
11864                                              section->sh_type == SHT_DYNSYM,
11865                                              strtab, strtab_size, si,
11866                                              psym, &sym_info, &vna_other);
11867               if (version_string)
11868                 {
11869                   if (sym_info == symbol_undefined)
11870                     printf ("@%s (%d)", version_string, vna_other);
11871                   else
11872                     printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11873                             version_string);
11874                 }
11875
11876               putchar ('\n');
11877
11878               if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
11879                   && si >= section->sh_info
11880                   /* Irix 5 and 6 MIPS binaries are known to ignore this requirement.  */
11881                   && filedata->file_header.e_machine != EM_MIPS
11882                   /* Solaris binaries have been found to violate this requirement as
11883                      well.  Not sure if this is a bug or an ABI requirement.  */
11884                   && filedata->file_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
11885                 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11886                       si, printable_section_name (filedata, section), section->sh_info);
11887             }
11888
11889           free (symtab);
11890           if (strtab != filedata->string_table)
11891             free (strtab);
11892         }
11893     }
11894   else if (do_syms)
11895     printf
11896       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11897
11898   if (do_histogram && buckets != NULL)
11899     {
11900       unsigned long * lengths;
11901       unsigned long * counts;
11902       unsigned long hn;
11903       bfd_vma si;
11904       unsigned long maxlength = 0;
11905       unsigned long nzero_counts = 0;
11906       unsigned long nsyms = 0;
11907       char *visited;
11908
11909       printf (ngettext ("\nHistogram for bucket list length "
11910                         "(total of %lu bucket):\n",
11911                         "\nHistogram for bucket list length "
11912                         "(total of %lu buckets):\n",
11913                         (unsigned long) nbuckets),
11914               (unsigned long) nbuckets);
11915
11916       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11917       if (lengths == NULL)
11918         {
11919           error (_("Out of memory allocating space for histogram buckets\n"));
11920           return FALSE;
11921         }
11922       visited = xcmalloc (nchains, 1);
11923       memset (visited, 0, nchains);
11924
11925       printf (_(" Length  Number     %% of total  Coverage\n"));
11926       for (hn = 0; hn < nbuckets; ++hn)
11927         {
11928           for (si = buckets[hn]; si > 0; si = chains[si])
11929             {
11930               ++nsyms;
11931               if (maxlength < ++lengths[hn])
11932                 ++maxlength;
11933               if (si >= nchains || visited[si])
11934                 {
11935                   error (_("histogram chain is corrupt\n"));
11936                   break;
11937                 }
11938               visited[si] = 1;
11939             }
11940         }
11941       free (visited);
11942
11943       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11944       if (counts == NULL)
11945         {
11946           free (lengths);
11947           error (_("Out of memory allocating space for histogram counts\n"));
11948           return FALSE;
11949         }
11950
11951       for (hn = 0; hn < nbuckets; ++hn)
11952         ++counts[lengths[hn]];
11953
11954       if (nbuckets > 0)
11955         {
11956           unsigned long i;
11957           printf ("      0  %-10lu (%5.1f%%)\n",
11958                   counts[0], (counts[0] * 100.0) / nbuckets);
11959           for (i = 1; i <= maxlength; ++i)
11960             {
11961               nzero_counts += counts[i] * i;
11962               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
11963                       i, counts[i], (counts[i] * 100.0) / nbuckets,
11964                       (nzero_counts * 100.0) / nsyms);
11965             }
11966         }
11967
11968       free (counts);
11969       free (lengths);
11970     }
11971
11972   if (buckets != NULL)
11973     {
11974       free (buckets);
11975       free (chains);
11976     }
11977
11978   if (do_histogram && gnubuckets != NULL)
11979     {
11980       unsigned long * lengths;
11981       unsigned long * counts;
11982       unsigned long hn;
11983       unsigned long maxlength = 0;
11984       unsigned long nzero_counts = 0;
11985       unsigned long nsyms = 0;
11986
11987       printf (ngettext ("\nHistogram for `.gnu.hash' bucket list length "
11988                         "(total of %lu bucket):\n",
11989                         "\nHistogram for `.gnu.hash' bucket list length "
11990                         "(total of %lu buckets):\n",
11991                         (unsigned long) ngnubuckets),
11992               (unsigned long) ngnubuckets);
11993
11994       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
11995       if (lengths == NULL)
11996         {
11997           error (_("Out of memory allocating space for gnu histogram buckets\n"));
11998           return FALSE;
11999         }
12000
12001       printf (_(" Length  Number     %% of total  Coverage\n"));
12002
12003       for (hn = 0; hn < ngnubuckets; ++hn)
12004         if (gnubuckets[hn] != 0)
12005           {
12006             bfd_vma off, length = 1;
12007
12008             for (off = gnubuckets[hn] - gnusymidx;
12009                  /* PR 17531 file: 010-77222-0.004.  */
12010                  off < ngnuchains && (gnuchains[off] & 1) == 0;
12011                  ++off)
12012               ++length;
12013             lengths[hn] = length;
12014             if (length > maxlength)
12015               maxlength = length;
12016             nsyms += length;
12017           }
12018
12019       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
12020       if (counts == NULL)
12021         {
12022           free (lengths);
12023           error (_("Out of memory allocating space for gnu histogram counts\n"));
12024           return FALSE;
12025         }
12026
12027       for (hn = 0; hn < ngnubuckets; ++hn)
12028         ++counts[lengths[hn]];
12029
12030       if (ngnubuckets > 0)
12031         {
12032           unsigned long j;
12033           printf ("      0  %-10lu (%5.1f%%)\n",
12034                   counts[0], (counts[0] * 100.0) / ngnubuckets);
12035           for (j = 1; j <= maxlength; ++j)
12036             {
12037               nzero_counts += counts[j] * j;
12038               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
12039                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
12040                       (nzero_counts * 100.0) / nsyms);
12041             }
12042         }
12043
12044       free (counts);
12045       free (lengths);
12046       free (gnubuckets);
12047       free (gnuchains);
12048     }
12049
12050   return TRUE;
12051 }
12052
12053 static bfd_boolean
12054 process_syminfo (Filedata * filedata ATTRIBUTE_UNUSED)
12055 {
12056   unsigned int i;
12057
12058   if (dynamic_syminfo == NULL
12059       || !do_dynamic)
12060     /* No syminfo, this is ok.  */
12061     return TRUE;
12062
12063   /* There better should be a dynamic symbol section.  */
12064   if (dynamic_symbols == NULL || dynamic_strings == NULL)
12065     return FALSE;
12066
12067   if (dynamic_addr)
12068     printf (ngettext ("\nDynamic info segment at offset 0x%lx "
12069                       "contains %d entry:\n",
12070                       "\nDynamic info segment at offset 0x%lx "
12071                       "contains %d entries:\n",
12072                       dynamic_syminfo_nent),
12073             dynamic_syminfo_offset, dynamic_syminfo_nent);
12074
12075   printf (_(" Num: Name                           BoundTo     Flags\n"));
12076   for (i = 0; i < dynamic_syminfo_nent; ++i)
12077     {
12078       unsigned short int flags = dynamic_syminfo[i].si_flags;
12079
12080       printf ("%4d: ", i);
12081       if (i >= num_dynamic_syms)
12082         printf (_("<corrupt index>"));
12083       else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
12084         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
12085       else
12086         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
12087       putchar (' ');
12088
12089       switch (dynamic_syminfo[i].si_boundto)
12090         {
12091         case SYMINFO_BT_SELF:
12092           fputs ("SELF       ", stdout);
12093           break;
12094         case SYMINFO_BT_PARENT:
12095           fputs ("PARENT     ", stdout);
12096           break;
12097         default:
12098           if (dynamic_syminfo[i].si_boundto > 0
12099               && dynamic_syminfo[i].si_boundto < dynamic_nent
12100               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
12101             {
12102               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
12103               putchar (' ' );
12104             }
12105           else
12106             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
12107           break;
12108         }
12109
12110       if (flags & SYMINFO_FLG_DIRECT)
12111         printf (" DIRECT");
12112       if (flags & SYMINFO_FLG_PASSTHRU)
12113         printf (" PASSTHRU");
12114       if (flags & SYMINFO_FLG_COPY)
12115         printf (" COPY");
12116       if (flags & SYMINFO_FLG_LAZYLOAD)
12117         printf (" LAZYLOAD");
12118
12119       puts ("");
12120     }
12121
12122   return TRUE;
12123 }
12124
12125 #define IN_RANGE(START,END,ADDR,OFF)            \
12126   (((ADDR) >= (START)) && ((ADDR) + (OFF) < (END)))
12127
12128 /* Check to see if the given reloc needs to be handled in a target specific
12129    manner.  If so then process the reloc and return TRUE otherwise return
12130    FALSE.
12131
12132    If called with reloc == NULL, then this is a signal that reloc processing
12133    for the current section has finished, and any saved state should be
12134    discarded.  */
12135
12136 static bfd_boolean
12137 target_specific_reloc_handling (Filedata *           filedata,
12138                                 Elf_Internal_Rela *  reloc,
12139                                 unsigned char *      start,
12140                                 unsigned char *      end,
12141                                 Elf_Internal_Sym *   symtab,
12142                                 unsigned long        num_syms)
12143 {
12144   unsigned int reloc_type = 0;
12145   unsigned long sym_index = 0;
12146
12147   if (reloc)
12148     {
12149       reloc_type = get_reloc_type (filedata, reloc->r_info);
12150       sym_index = get_reloc_symindex (reloc->r_info);
12151     }
12152
12153   switch (filedata->file_header.e_machine)
12154     {
12155     case EM_MSP430:
12156     case EM_MSP430_OLD:
12157       {
12158         static Elf_Internal_Sym * saved_sym = NULL;
12159
12160         if (reloc == NULL)
12161           {
12162             saved_sym = NULL;
12163             return TRUE;
12164           }
12165
12166         switch (reloc_type)
12167           {
12168           case 10: /* R_MSP430_SYM_DIFF */
12169             if (uses_msp430x_relocs (filedata))
12170               break;
12171             /* Fall through.  */
12172           case 21: /* R_MSP430X_SYM_DIFF */
12173             /* PR 21139.  */
12174             if (sym_index >= num_syms)
12175               error (_("MSP430 SYM_DIFF reloc contains invalid symbol index %lu\n"),
12176                      sym_index);
12177             else
12178               saved_sym = symtab + sym_index;
12179             return TRUE;
12180
12181           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
12182           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
12183             goto handle_sym_diff;
12184
12185           case 5: /* R_MSP430_16_BYTE */
12186           case 9: /* R_MSP430_8 */
12187             if (uses_msp430x_relocs (filedata))
12188               break;
12189             goto handle_sym_diff;
12190
12191           case 2: /* R_MSP430_ABS16 */
12192           case 15: /* R_MSP430X_ABS16 */
12193             if (! uses_msp430x_relocs (filedata))
12194               break;
12195             goto handle_sym_diff;
12196
12197           handle_sym_diff:
12198             if (saved_sym != NULL)
12199               {
12200                 int reloc_size = reloc_type == 1 ? 4 : 2;
12201                 bfd_vma value;
12202
12203                 if (sym_index >= num_syms)
12204                   error (_("MSP430 reloc contains invalid symbol index %lu\n"),
12205                          sym_index);
12206                 else
12207                   {
12208                     value = reloc->r_addend + (symtab[sym_index].st_value
12209                                                - saved_sym->st_value);
12210
12211                     if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12212                       byte_put (start + reloc->r_offset, value, reloc_size);
12213                     else
12214                       /* PR 21137 */
12215                       error (_("MSP430 sym diff reloc contains invalid offset: 0x%lx\n"),
12216                              (long) reloc->r_offset);
12217                   }
12218
12219                 saved_sym = NULL;
12220                 return TRUE;
12221               }
12222             break;
12223
12224           default:
12225             if (saved_sym != NULL)
12226               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
12227             break;
12228           }
12229         break;
12230       }
12231
12232     case EM_MN10300:
12233     case EM_CYGNUS_MN10300:
12234       {
12235         static Elf_Internal_Sym * saved_sym = NULL;
12236
12237         if (reloc == NULL)
12238           {
12239             saved_sym = NULL;
12240             return TRUE;
12241           }
12242
12243         switch (reloc_type)
12244           {
12245           case 34: /* R_MN10300_ALIGN */
12246             return TRUE;
12247           case 33: /* R_MN10300_SYM_DIFF */
12248             if (sym_index >= num_syms)
12249               error (_("MN10300_SYM_DIFF reloc contains invalid symbol index %lu\n"),
12250                      sym_index);
12251             else
12252               saved_sym = symtab + sym_index;
12253             return TRUE;
12254
12255           case 1: /* R_MN10300_32 */
12256           case 2: /* R_MN10300_16 */
12257             if (saved_sym != NULL)
12258               {
12259                 int reloc_size = reloc_type == 1 ? 4 : 2;
12260                 bfd_vma value;
12261
12262                 if (sym_index >= num_syms)
12263                   error (_("MN10300 reloc contains invalid symbol index %lu\n"),
12264                          sym_index);
12265                 else
12266                   {
12267                     value = reloc->r_addend + (symtab[sym_index].st_value
12268                                                - saved_sym->st_value);
12269
12270                     if (IN_RANGE (start, end, start + reloc->r_offset, reloc_size))
12271                       byte_put (start + reloc->r_offset, value, reloc_size);
12272                     else
12273                       error (_("MN10300 sym diff reloc contains invalid offset: 0x%lx\n"),
12274                              (long) reloc->r_offset);
12275                   }
12276
12277                 saved_sym = NULL;
12278                 return TRUE;
12279               }
12280             break;
12281           default:
12282             if (saved_sym != NULL)
12283               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
12284             break;
12285           }
12286         break;
12287       }
12288
12289     case EM_RL78:
12290       {
12291         static bfd_vma saved_sym1 = 0;
12292         static bfd_vma saved_sym2 = 0;
12293         static bfd_vma value;
12294
12295         if (reloc == NULL)
12296           {
12297             saved_sym1 = saved_sym2 = 0;
12298             return TRUE;
12299           }
12300
12301         switch (reloc_type)
12302           {
12303           case 0x80: /* R_RL78_SYM.  */
12304             saved_sym1 = saved_sym2;
12305             if (sym_index >= num_syms)
12306               error (_("RL78_SYM reloc contains invalid symbol index %lu\n"),
12307                      sym_index);
12308             else
12309               {
12310                 saved_sym2 = symtab[sym_index].st_value;
12311                 saved_sym2 += reloc->r_addend;
12312               }
12313             return TRUE;
12314
12315           case 0x83: /* R_RL78_OPsub.  */
12316             value = saved_sym1 - saved_sym2;
12317             saved_sym2 = saved_sym1 = 0;
12318             return TRUE;
12319             break;
12320
12321           case 0x41: /* R_RL78_ABS32.  */
12322             if (IN_RANGE (start, end, start + reloc->r_offset, 4))
12323               byte_put (start + reloc->r_offset, value, 4);
12324             else
12325               error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12326                      (long) reloc->r_offset);
12327             value = 0;
12328             return TRUE;
12329
12330           case 0x43: /* R_RL78_ABS16.  */
12331             if (IN_RANGE (start, end, start + reloc->r_offset, 2))
12332               byte_put (start + reloc->r_offset, value, 2);
12333             else
12334               error (_("RL78 sym diff reloc contains invalid offset: 0x%lx\n"),
12335                      (long) reloc->r_offset);
12336             value = 0;
12337             return TRUE;
12338
12339           default:
12340             break;
12341           }
12342         break;
12343       }
12344     }
12345
12346   return FALSE;
12347 }
12348
12349 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
12350    DWARF debug sections.  This is a target specific test.  Note - we do not
12351    go through the whole including-target-headers-multiple-times route, (as
12352    we have already done with <elf/h8.h>) because this would become very
12353    messy and even then this function would have to contain target specific
12354    information (the names of the relocs instead of their numeric values).
12355    FIXME: This is not the correct way to solve this problem.  The proper way
12356    is to have target specific reloc sizing and typing functions created by
12357    the reloc-macros.h header, in the same way that it already creates the
12358    reloc naming functions.  */
12359
12360 static bfd_boolean
12361 is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12362 {
12363   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12364   switch (filedata->file_header.e_machine)
12365     {
12366     case EM_386:
12367     case EM_IAMCU:
12368       return reloc_type == 1; /* R_386_32.  */
12369     case EM_68K:
12370       return reloc_type == 1; /* R_68K_32.  */
12371     case EM_860:
12372       return reloc_type == 1; /* R_860_32.  */
12373     case EM_960:
12374       return reloc_type == 2; /* R_960_32.  */
12375     case EM_AARCH64:
12376       return (reloc_type == 258
12377               || reloc_type == 1); /* R_AARCH64_ABS32 || R_AARCH64_P32_ABS32 */
12378     case EM_ADAPTEVA_EPIPHANY:
12379       return reloc_type == 3;
12380     case EM_ALPHA:
12381       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
12382     case EM_ARC:
12383       return reloc_type == 1; /* R_ARC_32.  */
12384     case EM_ARC_COMPACT:
12385     case EM_ARC_COMPACT2:
12386       return reloc_type == 4; /* R_ARC_32.  */
12387     case EM_ARM:
12388       return reloc_type == 2; /* R_ARM_ABS32 */
12389     case EM_AVR_OLD:
12390     case EM_AVR:
12391       return reloc_type == 1;
12392     case EM_BLACKFIN:
12393       return reloc_type == 0x12; /* R_byte4_data.  */
12394     case EM_CRIS:
12395       return reloc_type == 3; /* R_CRIS_32.  */
12396     case EM_CR16:
12397       return reloc_type == 3; /* R_CR16_NUM32.  */
12398     case EM_CRX:
12399       return reloc_type == 15; /* R_CRX_NUM32.  */
12400     case EM_CSKY:
12401       return reloc_type == 1; /* R_CKCORE_ADDR32.  */
12402     case EM_CYGNUS_FRV:
12403       return reloc_type == 1;
12404     case EM_CYGNUS_D10V:
12405     case EM_D10V:
12406       return reloc_type == 6; /* R_D10V_32.  */
12407     case EM_CYGNUS_D30V:
12408     case EM_D30V:
12409       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
12410     case EM_DLX:
12411       return reloc_type == 3; /* R_DLX_RELOC_32.  */
12412     case EM_CYGNUS_FR30:
12413     case EM_FR30:
12414       return reloc_type == 3; /* R_FR30_32.  */
12415     case EM_FT32:
12416       return reloc_type == 1; /* R_FT32_32.  */
12417     case EM_H8S:
12418     case EM_H8_300:
12419     case EM_H8_300H:
12420       return reloc_type == 1; /* R_H8_DIR32.  */
12421     case EM_IA_64:
12422       return (reloc_type == 0x64    /* R_IA64_SECREL32MSB.  */
12423               || reloc_type == 0x65 /* R_IA64_SECREL32LSB.  */
12424               || reloc_type == 0x24 /* R_IA64_DIR32MSB.  */
12425               || reloc_type == 0x25 /* R_IA64_DIR32LSB.  */);
12426     case EM_IP2K_OLD:
12427     case EM_IP2K:
12428       return reloc_type == 2; /* R_IP2K_32.  */
12429     case EM_IQ2000:
12430       return reloc_type == 2; /* R_IQ2000_32.  */
12431     case EM_LATTICEMICO32:
12432       return reloc_type == 3; /* R_LM32_32.  */
12433     case EM_M32C_OLD:
12434     case EM_M32C:
12435       return reloc_type == 3; /* R_M32C_32.  */
12436     case EM_M32R:
12437       return reloc_type == 34; /* R_M32R_32_RELA.  */
12438     case EM_68HC11:
12439     case EM_68HC12:
12440       return reloc_type == 6; /* R_M68HC11_32.  */
12441     case EM_S12Z:
12442       return reloc_type == 7 || /* R_S12Z_EXT32 */
12443         reloc_type == 6;        /* R_S12Z_CW32.  */
12444     case EM_MCORE:
12445       return reloc_type == 1; /* R_MCORE_ADDR32.  */
12446     case EM_CYGNUS_MEP:
12447       return reloc_type == 4; /* R_MEP_32.  */
12448     case EM_METAG:
12449       return reloc_type == 2; /* R_METAG_ADDR32.  */
12450     case EM_MICROBLAZE:
12451       return reloc_type == 1; /* R_MICROBLAZE_32.  */
12452     case EM_MIPS:
12453       return reloc_type == 2; /* R_MIPS_32.  */
12454     case EM_MMIX:
12455       return reloc_type == 4; /* R_MMIX_32.  */
12456     case EM_CYGNUS_MN10200:
12457     case EM_MN10200:
12458       return reloc_type == 1; /* R_MN10200_32.  */
12459     case EM_CYGNUS_MN10300:
12460     case EM_MN10300:
12461       return reloc_type == 1; /* R_MN10300_32.  */
12462     case EM_MOXIE:
12463       return reloc_type == 1; /* R_MOXIE_32.  */
12464     case EM_MSP430_OLD:
12465     case EM_MSP430:
12466       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
12467     case EM_MT:
12468       return reloc_type == 2; /* R_MT_32.  */
12469     case EM_NDS32:
12470       return reloc_type == 20; /* R_NDS32_RELA.  */
12471     case EM_ALTERA_NIOS2:
12472       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
12473     case EM_NIOS32:
12474       return reloc_type == 1; /* R_NIOS_32.  */
12475     case EM_OR1K:
12476       return reloc_type == 1; /* R_OR1K_32.  */
12477     case EM_PARISC:
12478       return (reloc_type == 1 /* R_PARISC_DIR32.  */          
12479               || reloc_type == 2 /* R_PARISC_DIR21L.  */
12480               || reloc_type == 41); /* R_PARISC_SECREL32.  */
12481     case EM_PJ:
12482     case EM_PJ_OLD:
12483       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
12484     case EM_PPC64:
12485       return reloc_type == 1; /* R_PPC64_ADDR32.  */
12486     case EM_PPC:
12487       return reloc_type == 1; /* R_PPC_ADDR32.  */
12488     case EM_TI_PRU:
12489       return reloc_type == 11; /* R_PRU_BFD_RELOC_32.  */
12490     case EM_RISCV:
12491       return reloc_type == 1; /* R_RISCV_32.  */
12492     case EM_RL78:
12493       return reloc_type == 1; /* R_RL78_DIR32.  */
12494     case EM_RX:
12495       return reloc_type == 1; /* R_RX_DIR32.  */
12496     case EM_S370:
12497       return reloc_type == 1; /* R_I370_ADDR31.  */
12498     case EM_S390_OLD:
12499     case EM_S390:
12500       return reloc_type == 4; /* R_S390_32.  */
12501     case EM_SCORE:
12502       return reloc_type == 8; /* R_SCORE_ABS32.  */
12503     case EM_SH:
12504       return reloc_type == 1; /* R_SH_DIR32.  */
12505     case EM_SPARC32PLUS:
12506     case EM_SPARCV9:
12507     case EM_SPARC:
12508       return reloc_type == 3 /* R_SPARC_32.  */
12509         || reloc_type == 23; /* R_SPARC_UA32.  */
12510     case EM_SPU:
12511       return reloc_type == 6; /* R_SPU_ADDR32 */
12512     case EM_TI_C6000:
12513       return reloc_type == 1; /* R_C6000_ABS32.  */
12514     case EM_TILEGX:
12515       return reloc_type == 2; /* R_TILEGX_32.  */
12516     case EM_TILEPRO:
12517       return reloc_type == 1; /* R_TILEPRO_32.  */
12518     case EM_CYGNUS_V850:
12519     case EM_V850:
12520       return reloc_type == 6; /* R_V850_ABS32.  */
12521     case EM_V800:
12522       return reloc_type == 0x33; /* R_V810_WORD.  */
12523     case EM_VAX:
12524       return reloc_type == 1; /* R_VAX_32.  */
12525     case EM_VISIUM:
12526       return reloc_type == 3;  /* R_VISIUM_32. */
12527     case EM_WEBASSEMBLY:
12528       return reloc_type == 1;  /* R_WASM32_32.  */
12529     case EM_X86_64:
12530     case EM_L1OM:
12531     case EM_K1OM:
12532       return reloc_type == 10; /* R_X86_64_32.  */
12533     case EM_XC16X:
12534     case EM_C166:
12535       return reloc_type == 3; /* R_XC16C_ABS_32.  */
12536     case EM_XGATE:
12537       return reloc_type == 4; /* R_XGATE_32.  */
12538     case EM_XSTORMY16:
12539       return reloc_type == 1; /* R_XSTROMY16_32.  */
12540     case EM_XTENSA_OLD:
12541     case EM_XTENSA:
12542       return reloc_type == 1; /* R_XTENSA_32.  */
12543     default:
12544       {
12545         static unsigned int prev_warn = 0;
12546
12547         /* Avoid repeating the same warning multiple times.  */
12548         if (prev_warn != filedata->file_header.e_machine)
12549           error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
12550                  filedata->file_header.e_machine);
12551         prev_warn = filedata->file_header.e_machine;
12552         return FALSE;
12553       }
12554     }
12555 }
12556
12557 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12558    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
12559
12560 static bfd_boolean
12561 is_32bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12562 {
12563   switch (filedata->file_header.e_machine)
12564   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12565     {
12566     case EM_386:
12567     case EM_IAMCU:
12568       return reloc_type == 2;  /* R_386_PC32.  */
12569     case EM_68K:
12570       return reloc_type == 4;  /* R_68K_PC32.  */
12571     case EM_AARCH64:
12572       return reloc_type == 261; /* R_AARCH64_PREL32 */
12573     case EM_ADAPTEVA_EPIPHANY:
12574       return reloc_type == 6;
12575     case EM_ALPHA:
12576       return reloc_type == 10; /* R_ALPHA_SREL32.  */
12577     case EM_ARC_COMPACT:
12578     case EM_ARC_COMPACT2:
12579       return reloc_type == 49; /* R_ARC_32_PCREL.  */
12580     case EM_ARM:
12581       return reloc_type == 3;  /* R_ARM_REL32 */
12582     case EM_AVR_OLD:
12583     case EM_AVR:
12584       return reloc_type == 36; /* R_AVR_32_PCREL.  */
12585     case EM_MICROBLAZE:
12586       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
12587     case EM_OR1K:
12588       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
12589     case EM_PARISC:
12590       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
12591     case EM_PPC:
12592       return reloc_type == 26; /* R_PPC_REL32.  */
12593     case EM_PPC64:
12594       return reloc_type == 26; /* R_PPC64_REL32.  */
12595     case EM_RISCV:
12596       return reloc_type == 57;  /* R_RISCV_32_PCREL.  */
12597     case EM_S390_OLD:
12598     case EM_S390:
12599       return reloc_type == 5;  /* R_390_PC32.  */
12600     case EM_SH:
12601       return reloc_type == 2;  /* R_SH_REL32.  */
12602     case EM_SPARC32PLUS:
12603     case EM_SPARCV9:
12604     case EM_SPARC:
12605       return reloc_type == 6;  /* R_SPARC_DISP32.  */
12606     case EM_SPU:
12607       return reloc_type == 13; /* R_SPU_REL32.  */
12608     case EM_TILEGX:
12609       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
12610     case EM_TILEPRO:
12611       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
12612     case EM_VISIUM:
12613       return reloc_type == 6;  /* R_VISIUM_32_PCREL */
12614     case EM_X86_64:
12615     case EM_L1OM:
12616     case EM_K1OM:
12617       return reloc_type == 2;  /* R_X86_64_PC32.  */
12618     case EM_XTENSA_OLD:
12619     case EM_XTENSA:
12620       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
12621     default:
12622       /* Do not abort or issue an error message here.  Not all targets use
12623          pc-relative 32-bit relocs in their DWARF debug information and we
12624          have already tested for target coverage in is_32bit_abs_reloc.  A
12625          more helpful warning message will be generated by apply_relocations
12626          anyway, so just return.  */
12627       return FALSE;
12628     }
12629 }
12630
12631 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12632    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
12633
12634 static bfd_boolean
12635 is_64bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12636 {
12637   switch (filedata->file_header.e_machine)
12638     {
12639     case EM_AARCH64:
12640       return reloc_type == 257; /* R_AARCH64_ABS64.  */
12641     case EM_ALPHA:
12642       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
12643     case EM_IA_64:
12644       return (reloc_type == 0x26    /* R_IA64_DIR64MSB.  */
12645               || reloc_type == 0x27 /* R_IA64_DIR64LSB.  */);
12646     case EM_PARISC:
12647       return reloc_type == 80; /* R_PARISC_DIR64.  */
12648     case EM_PPC64:
12649       return reloc_type == 38; /* R_PPC64_ADDR64.  */
12650     case EM_RISCV:
12651       return reloc_type == 2; /* R_RISCV_64.  */
12652     case EM_SPARC32PLUS:
12653     case EM_SPARCV9:
12654     case EM_SPARC:
12655       return reloc_type == 32 /* R_SPARC_64.  */
12656         || reloc_type == 54; /* R_SPARC_UA64.  */
12657     case EM_X86_64:
12658     case EM_L1OM:
12659     case EM_K1OM:
12660       return reloc_type == 1; /* R_X86_64_64.  */
12661     case EM_S390_OLD:
12662     case EM_S390:
12663       return reloc_type == 22;  /* R_S390_64.  */
12664     case EM_TILEGX:
12665       return reloc_type == 1; /* R_TILEGX_64.  */
12666     case EM_MIPS:
12667       return reloc_type == 18;  /* R_MIPS_64.  */
12668     default:
12669       return FALSE;
12670     }
12671 }
12672
12673 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
12674    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
12675
12676 static bfd_boolean
12677 is_64bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
12678 {
12679   switch (filedata->file_header.e_machine)
12680     {
12681     case EM_AARCH64:
12682       return reloc_type == 260; /* R_AARCH64_PREL64.  */
12683     case EM_ALPHA:
12684       return reloc_type == 11; /* R_ALPHA_SREL64.  */
12685     case EM_IA_64:
12686       return (reloc_type == 0x4e    /* R_IA64_PCREL64MSB.  */
12687               || reloc_type == 0x4f /* R_IA64_PCREL64LSB.  */);
12688     case EM_PARISC:
12689       return reloc_type == 72; /* R_PARISC_PCREL64.  */
12690     case EM_PPC64:
12691       return reloc_type == 44; /* R_PPC64_REL64.  */
12692     case EM_SPARC32PLUS:
12693     case EM_SPARCV9:
12694     case EM_SPARC:
12695       return reloc_type == 46; /* R_SPARC_DISP64.  */
12696     case EM_X86_64:
12697     case EM_L1OM:
12698     case EM_K1OM:
12699       return reloc_type == 24; /* R_X86_64_PC64.  */
12700     case EM_S390_OLD:
12701     case EM_S390:
12702       return reloc_type == 23;  /* R_S390_PC64.  */
12703     case EM_TILEGX:
12704       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
12705     default:
12706       return FALSE;
12707     }
12708 }
12709
12710 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12711    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
12712
12713 static bfd_boolean
12714 is_24bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12715 {
12716   switch (filedata->file_header.e_machine)
12717     {
12718     case EM_CYGNUS_MN10200:
12719     case EM_MN10200:
12720       return reloc_type == 4; /* R_MN10200_24.  */
12721     case EM_FT32:
12722       return reloc_type == 5; /* R_FT32_20.  */
12723     default:
12724       return FALSE;
12725     }
12726 }
12727
12728 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12729    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
12730
12731 static bfd_boolean
12732 is_16bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12733 {
12734   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12735   switch (filedata->file_header.e_machine)
12736     {
12737     case EM_ARC:
12738     case EM_ARC_COMPACT:
12739     case EM_ARC_COMPACT2:
12740       return reloc_type == 2; /* R_ARC_16.  */
12741     case EM_ADAPTEVA_EPIPHANY:
12742       return reloc_type == 5;
12743     case EM_AVR_OLD:
12744     case EM_AVR:
12745       return reloc_type == 4; /* R_AVR_16.  */
12746     case EM_CYGNUS_D10V:
12747     case EM_D10V:
12748       return reloc_type == 3; /* R_D10V_16.  */
12749     case EM_FT32:
12750       return reloc_type == 2; /* R_FT32_16.  */
12751     case EM_H8S:
12752     case EM_H8_300:
12753     case EM_H8_300H:
12754       return reloc_type == R_H8_DIR16;
12755     case EM_IP2K_OLD:
12756     case EM_IP2K:
12757       return reloc_type == 1; /* R_IP2K_16.  */
12758     case EM_M32C_OLD:
12759     case EM_M32C:
12760       return reloc_type == 1; /* R_M32C_16 */
12761     case EM_CYGNUS_MN10200:
12762     case EM_MN10200:
12763       return reloc_type == 2; /* R_MN10200_16.  */
12764     case EM_CYGNUS_MN10300:
12765     case EM_MN10300:
12766       return reloc_type == 2; /* R_MN10300_16.  */
12767     case EM_MSP430:
12768       if (uses_msp430x_relocs (filedata))
12769         return reloc_type == 2; /* R_MSP430_ABS16.  */
12770       /* Fall through.  */
12771     case EM_MSP430_OLD:
12772       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
12773     case EM_NDS32:
12774       return reloc_type == 19; /* R_NDS32_RELA.  */
12775     case EM_ALTERA_NIOS2:
12776       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
12777     case EM_NIOS32:
12778       return reloc_type == 9; /* R_NIOS_16.  */
12779     case EM_OR1K:
12780       return reloc_type == 2; /* R_OR1K_16.  */
12781     case EM_RISCV:
12782       return reloc_type == 55; /* R_RISCV_SET16.  */
12783     case EM_TI_PRU:
12784       return reloc_type == 8; /* R_PRU_BFD_RELOC_16.  */
12785     case EM_TI_C6000:
12786       return reloc_type == 2; /* R_C6000_ABS16.  */
12787     case EM_VISIUM:
12788       return reloc_type == 2; /* R_VISIUM_16. */
12789     case EM_XC16X:
12790     case EM_C166:
12791       return reloc_type == 2; /* R_XC16C_ABS_16.  */
12792     case EM_XGATE:
12793       return reloc_type == 3; /* R_XGATE_16.  */
12794     default:
12795       return FALSE;
12796     }
12797 }
12798
12799 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12800    a 8-bit absolute RELA relocation used in DWARF debug sections.  */
12801
12802 static bfd_boolean
12803 is_8bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12804 {
12805   switch (filedata->file_header.e_machine)
12806     {
12807     case EM_RISCV:
12808       return reloc_type == 54; /* R_RISCV_SET8.  */
12809     default:
12810       return FALSE;
12811     }
12812 }
12813
12814 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12815    a 6-bit absolute RELA relocation used in DWARF debug sections.  */
12816
12817 static bfd_boolean
12818 is_6bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
12819 {
12820   switch (filedata->file_header.e_machine)
12821     {
12822     case EM_RISCV:
12823       return reloc_type == 53; /* R_RISCV_SET6.  */
12824     default:
12825       return FALSE;
12826     }
12827 }
12828
12829 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12830    a 32-bit inplace add RELA relocation used in DWARF debug sections.  */
12831
12832 static bfd_boolean
12833 is_32bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12834 {
12835   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12836   switch (filedata->file_header.e_machine)
12837     {
12838     case EM_RISCV:
12839       return reloc_type == 35; /* R_RISCV_ADD32.  */
12840     default:
12841       return FALSE;
12842     }
12843 }
12844
12845 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12846    a 32-bit inplace sub RELA relocation used in DWARF debug sections.  */
12847
12848 static bfd_boolean
12849 is_32bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12850 {
12851   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12852   switch (filedata->file_header.e_machine)
12853     {
12854     case EM_RISCV:
12855       return reloc_type == 39; /* R_RISCV_SUB32.  */
12856     default:
12857       return FALSE;
12858     }
12859 }
12860
12861 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12862    a 64-bit inplace add RELA relocation used in DWARF debug sections.  */
12863
12864 static bfd_boolean
12865 is_64bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12866 {
12867   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12868   switch (filedata->file_header.e_machine)
12869     {
12870     case EM_RISCV:
12871       return reloc_type == 36; /* R_RISCV_ADD64.  */
12872     default:
12873       return FALSE;
12874     }
12875 }
12876
12877 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12878    a 64-bit inplace sub RELA relocation used in DWARF debug sections.  */
12879
12880 static bfd_boolean
12881 is_64bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12882 {
12883   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12884   switch (filedata->file_header.e_machine)
12885     {
12886     case EM_RISCV:
12887       return reloc_type == 40; /* R_RISCV_SUB64.  */
12888     default:
12889       return FALSE;
12890     }
12891 }
12892
12893 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12894    a 16-bit inplace add RELA relocation used in DWARF debug sections.  */
12895
12896 static bfd_boolean
12897 is_16bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12898 {
12899   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12900   switch (filedata->file_header.e_machine)
12901     {
12902     case EM_RISCV:
12903       return reloc_type == 34; /* R_RISCV_ADD16.  */
12904     default:
12905       return FALSE;
12906     }
12907 }
12908
12909 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12910    a 16-bit inplace sub RELA relocation used in DWARF debug sections.  */
12911
12912 static bfd_boolean
12913 is_16bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12914 {
12915   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12916   switch (filedata->file_header.e_machine)
12917     {
12918     case EM_RISCV:
12919       return reloc_type == 38; /* R_RISCV_SUB16.  */
12920     default:
12921       return FALSE;
12922     }
12923 }
12924
12925 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12926    a 8-bit inplace add RELA relocation used in DWARF debug sections.  */
12927
12928 static bfd_boolean
12929 is_8bit_inplace_add_reloc (Filedata * filedata, unsigned int reloc_type)
12930 {
12931   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12932   switch (filedata->file_header.e_machine)
12933     {
12934     case EM_RISCV:
12935       return reloc_type == 33; /* R_RISCV_ADD8.  */
12936     default:
12937       return FALSE;
12938     }
12939 }
12940
12941 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12942    a 8-bit inplace sub RELA relocation used in DWARF debug sections.  */
12943
12944 static bfd_boolean
12945 is_8bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12946 {
12947   /* Please keep this table alpha-sorted for ease of visual lookup.  */
12948   switch (filedata->file_header.e_machine)
12949     {
12950     case EM_RISCV:
12951       return reloc_type == 37; /* R_RISCV_SUB8.  */
12952     default:
12953       return FALSE;
12954     }
12955 }
12956
12957 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
12958    a 6-bit inplace sub RELA relocation used in DWARF debug sections.  */
12959
12960 static bfd_boolean
12961 is_6bit_inplace_sub_reloc (Filedata * filedata, unsigned int reloc_type)
12962 {
12963   switch (filedata->file_header.e_machine)
12964     {
12965     case EM_RISCV:
12966       return reloc_type == 52; /* R_RISCV_SUB6.  */
12967     default:
12968       return FALSE;
12969     }
12970 }
12971
12972 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12973    relocation entries (possibly formerly used for SHT_GROUP sections).  */
12974
12975 static bfd_boolean
12976 is_none_reloc (Filedata * filedata, unsigned int reloc_type)
12977 {
12978   switch (filedata->file_header.e_machine)
12979     {
12980     case EM_386:     /* R_386_NONE.  */
12981     case EM_68K:     /* R_68K_NONE.  */
12982     case EM_ADAPTEVA_EPIPHANY:
12983     case EM_ALPHA:   /* R_ALPHA_NONE.  */
12984     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
12985     case EM_ARC:     /* R_ARC_NONE.  */
12986     case EM_ARC_COMPACT2: /* R_ARC_NONE.  */
12987     case EM_ARC_COMPACT: /* R_ARC_NONE.  */
12988     case EM_ARM:     /* R_ARM_NONE.  */
12989     case EM_C166:    /* R_XC16X_NONE.  */
12990     case EM_CRIS:    /* R_CRIS_NONE.  */
12991     case EM_FT32:    /* R_FT32_NONE.  */
12992     case EM_IA_64:   /* R_IA64_NONE.  */
12993     case EM_K1OM:    /* R_X86_64_NONE.  */
12994     case EM_L1OM:    /* R_X86_64_NONE.  */
12995     case EM_M32R:    /* R_M32R_NONE.  */
12996     case EM_MIPS:    /* R_MIPS_NONE.  */
12997     case EM_MN10300: /* R_MN10300_NONE.  */
12998     case EM_MOXIE:   /* R_MOXIE_NONE.  */
12999     case EM_NIOS32:  /* R_NIOS_NONE.  */
13000     case EM_OR1K:    /* R_OR1K_NONE. */
13001     case EM_PARISC:  /* R_PARISC_NONE.  */
13002     case EM_PPC64:   /* R_PPC64_NONE.  */
13003     case EM_PPC:     /* R_PPC_NONE.  */
13004     case EM_RISCV:   /* R_RISCV_NONE.  */
13005     case EM_S390:    /* R_390_NONE.  */
13006     case EM_S390_OLD:
13007     case EM_SH:      /* R_SH_NONE.  */
13008     case EM_SPARC32PLUS:
13009     case EM_SPARC:   /* R_SPARC_NONE.  */
13010     case EM_SPARCV9:
13011     case EM_TILEGX:  /* R_TILEGX_NONE.  */
13012     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
13013     case EM_TI_C6000:/* R_C6000_NONE.  */
13014     case EM_X86_64:  /* R_X86_64_NONE.  */
13015     case EM_XC16X:
13016     case EM_WEBASSEMBLY: /* R_WASM32_NONE.  */
13017       return reloc_type == 0;
13018
13019     case EM_AARCH64:
13020       return reloc_type == 0 || reloc_type == 256;
13021     case EM_AVR_OLD:
13022     case EM_AVR:
13023       return (reloc_type == 0 /* R_AVR_NONE.  */
13024               || reloc_type == 30 /* R_AVR_DIFF8.  */
13025               || reloc_type == 31 /* R_AVR_DIFF16.  */
13026               || reloc_type == 32 /* R_AVR_DIFF32.  */);
13027     case EM_METAG:
13028       return reloc_type == 3; /* R_METAG_NONE.  */
13029     case EM_NDS32:
13030       return (reloc_type == 0       /* R_XTENSA_NONE.  */
13031               || reloc_type == 204  /* R_NDS32_DIFF8.  */
13032               || reloc_type == 205  /* R_NDS32_DIFF16.  */
13033               || reloc_type == 206  /* R_NDS32_DIFF32.  */
13034               || reloc_type == 207  /* R_NDS32_ULEB128.  */);
13035     case EM_TI_PRU:
13036       return (reloc_type == 0       /* R_PRU_NONE.  */
13037               || reloc_type == 65   /* R_PRU_DIFF8.  */
13038               || reloc_type == 66   /* R_PRU_DIFF16.  */
13039               || reloc_type == 67   /* R_PRU_DIFF32.  */);
13040     case EM_XTENSA_OLD:
13041     case EM_XTENSA:
13042       return (reloc_type == 0      /* R_XTENSA_NONE.  */
13043               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
13044               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
13045               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
13046     }
13047   return FALSE;
13048 }
13049
13050 /* Returns TRUE if there is a relocation against
13051    section NAME at OFFSET bytes.  */
13052
13053 bfd_boolean
13054 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
13055 {
13056   Elf_Internal_Rela * relocs;
13057   Elf_Internal_Rela * rp;
13058
13059   if (dsec == NULL || dsec->reloc_info == NULL)
13060     return FALSE;
13061
13062   relocs = (Elf_Internal_Rela *) dsec->reloc_info;
13063
13064   for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
13065     if (rp->r_offset == offset)
13066       return TRUE;
13067
13068    return FALSE;
13069 }
13070
13071 /* Apply relocations to a section.
13072    Returns TRUE upon success, FALSE otherwise.
13073    If RELOCS_RETURN is non-NULL then it is set to point to the loaded relocs.
13074    It is then the caller's responsibility to free them.  NUM_RELOCS_RETURN
13075    will be set to the number of relocs loaded.
13076
13077    Note: So far support has been added only for those relocations
13078    which can be found in debug sections. FIXME: Add support for
13079    more relocations ?  */
13080
13081 static bfd_boolean
13082 apply_relocations (Filedata *                 filedata,
13083                    const Elf_Internal_Shdr *  section,
13084                    unsigned char *            start,
13085                    bfd_size_type              size,
13086                    void **                    relocs_return,
13087                    unsigned long *            num_relocs_return)
13088 {
13089   Elf_Internal_Shdr * relsec;
13090   unsigned char * end = start + size;
13091
13092   if (relocs_return != NULL)
13093     {
13094       * (Elf_Internal_Rela **) relocs_return = NULL;
13095       * num_relocs_return = 0;
13096     }
13097
13098   if (filedata->file_header.e_type != ET_REL)
13099     /* No relocs to apply.  */
13100     return TRUE;
13101
13102   /* Find the reloc section associated with the section.  */
13103   for (relsec = filedata->section_headers;
13104        relsec < filedata->section_headers + filedata->file_header.e_shnum;
13105        ++relsec)
13106     {
13107       bfd_boolean is_rela;
13108       unsigned long num_relocs;
13109       Elf_Internal_Rela * relocs;
13110       Elf_Internal_Rela * rp;
13111       Elf_Internal_Shdr * symsec;
13112       Elf_Internal_Sym * symtab;
13113       unsigned long num_syms;
13114       Elf_Internal_Sym * sym;
13115
13116       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13117           || relsec->sh_info >= filedata->file_header.e_shnum
13118           || filedata->section_headers + relsec->sh_info != section
13119           || relsec->sh_size == 0
13120           || relsec->sh_link >= filedata->file_header.e_shnum)
13121         continue;
13122
13123       is_rela = relsec->sh_type == SHT_RELA;
13124
13125       if (is_rela)
13126         {
13127           if (!slurp_rela_relocs (filedata, relsec->sh_offset,
13128                                   relsec->sh_size, & relocs, & num_relocs))
13129             return FALSE;
13130         }
13131       else
13132         {
13133           if (!slurp_rel_relocs (filedata, relsec->sh_offset,
13134                                  relsec->sh_size, & relocs, & num_relocs))
13135             return FALSE;
13136         }
13137
13138       /* SH uses RELA but uses in place value instead of the addend field.  */
13139       if (filedata->file_header.e_machine == EM_SH)
13140         is_rela = FALSE;
13141
13142       symsec = filedata->section_headers + relsec->sh_link;
13143       if (symsec->sh_type != SHT_SYMTAB
13144           && symsec->sh_type != SHT_DYNSYM)
13145         return FALSE;
13146       symtab = GET_ELF_SYMBOLS (filedata, symsec, & num_syms);
13147
13148       for (rp = relocs; rp < relocs + num_relocs; ++rp)
13149         {
13150           bfd_vma         addend;
13151           unsigned int    reloc_type;
13152           unsigned int    reloc_size;
13153           bfd_boolean     reloc_inplace = FALSE;
13154           bfd_boolean     reloc_subtract = FALSE;
13155           unsigned char * rloc;
13156           unsigned long   sym_index;
13157
13158           reloc_type = get_reloc_type (filedata, rp->r_info);
13159
13160           if (target_specific_reloc_handling (filedata, rp, start, end, symtab, num_syms))
13161             continue;
13162           else if (is_none_reloc (filedata, reloc_type))
13163             continue;
13164           else if (is_32bit_abs_reloc (filedata, reloc_type)
13165                    || is_32bit_pcrel_reloc (filedata, reloc_type))
13166             reloc_size = 4;
13167           else if (is_64bit_abs_reloc (filedata, reloc_type)
13168                    || is_64bit_pcrel_reloc (filedata, reloc_type))
13169             reloc_size = 8;
13170           else if (is_24bit_abs_reloc (filedata, reloc_type))
13171             reloc_size = 3;
13172           else if (is_16bit_abs_reloc (filedata, reloc_type))
13173             reloc_size = 2;
13174           else if (is_8bit_abs_reloc (filedata, reloc_type)
13175                    || is_6bit_abs_reloc (filedata, reloc_type))
13176             reloc_size = 1;
13177           else if ((reloc_subtract = is_32bit_inplace_sub_reloc (filedata,
13178                                                                  reloc_type))
13179                    || is_32bit_inplace_add_reloc (filedata, reloc_type))
13180             {
13181               reloc_size = 4;
13182               reloc_inplace = TRUE;
13183             }
13184           else if ((reloc_subtract = is_64bit_inplace_sub_reloc (filedata,
13185                                                                  reloc_type))
13186                    || is_64bit_inplace_add_reloc (filedata, reloc_type))
13187             {
13188               reloc_size = 8;
13189               reloc_inplace = TRUE;
13190             }
13191           else if ((reloc_subtract = is_16bit_inplace_sub_reloc (filedata,
13192                                                                  reloc_type))
13193                    || is_16bit_inplace_add_reloc (filedata, reloc_type))
13194             {
13195               reloc_size = 2;
13196               reloc_inplace = TRUE;
13197             }
13198           else if ((reloc_subtract = is_8bit_inplace_sub_reloc (filedata,
13199                                                                 reloc_type))
13200                    || is_8bit_inplace_add_reloc (filedata, reloc_type))
13201             {
13202               reloc_size = 1;
13203               reloc_inplace = TRUE;
13204             }
13205           else if ((reloc_subtract = is_6bit_inplace_sub_reloc (filedata,
13206                                                                 reloc_type)))
13207             {
13208               reloc_size = 1;
13209               reloc_inplace = TRUE;
13210             }
13211           else
13212             {
13213               static unsigned int prev_reloc = 0;
13214
13215               if (reloc_type != prev_reloc)
13216                 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
13217                       reloc_type, printable_section_name (filedata, section));
13218               prev_reloc = reloc_type;
13219               continue;
13220             }
13221
13222           rloc = start + rp->r_offset;
13223           if ((rloc + reloc_size) > end || (rloc < start))
13224             {
13225               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
13226                     (unsigned long) rp->r_offset,
13227                     printable_section_name (filedata, section));
13228               continue;
13229             }
13230
13231           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
13232           if (sym_index >= num_syms)
13233             {
13234               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
13235                     sym_index, printable_section_name (filedata, section));
13236               continue;
13237             }
13238           sym = symtab + sym_index;
13239
13240           /* If the reloc has a symbol associated with it,
13241              make sure that it is of an appropriate type.
13242
13243              Relocations against symbols without type can happen.
13244              Gcc -feliminate-dwarf2-dups may generate symbols
13245              without type for debug info.
13246
13247              Icc generates relocations against function symbols
13248              instead of local labels.
13249
13250              Relocations against object symbols can happen, eg when
13251              referencing a global array.  For an example of this see
13252              the _clz.o binary in libgcc.a.  */
13253           if (sym != symtab
13254               && ELF_ST_TYPE (sym->st_info) != STT_COMMON
13255               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
13256             {
13257               warn (_("skipping unexpected symbol type %s in section %s relocation %ld\n"),
13258                     get_symbol_type (filedata, ELF_ST_TYPE (sym->st_info)),
13259                     printable_section_name (filedata, relsec),
13260                     (long int)(rp - relocs));
13261               continue;
13262             }
13263
13264           addend = 0;
13265           if (is_rela)
13266             addend += rp->r_addend;
13267           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
13268              partial_inplace.  */
13269           if (!is_rela
13270               || (filedata->file_header.e_machine == EM_XTENSA
13271                   && reloc_type == 1)
13272               || ((filedata->file_header.e_machine == EM_PJ
13273                    || filedata->file_header.e_machine == EM_PJ_OLD)
13274                   && reloc_type == 1)
13275               || ((filedata->file_header.e_machine == EM_D30V
13276                    || filedata->file_header.e_machine == EM_CYGNUS_D30V)
13277                   && reloc_type == 12)
13278               || reloc_inplace)
13279             {
13280               if (is_6bit_inplace_sub_reloc (filedata, reloc_type))
13281                 addend += byte_get (rloc, reloc_size) & 0x3f;
13282               else
13283                 addend += byte_get (rloc, reloc_size);
13284             }
13285
13286           if (is_32bit_pcrel_reloc (filedata, reloc_type)
13287               || is_64bit_pcrel_reloc (filedata, reloc_type))
13288             {
13289               /* On HPPA, all pc-relative relocations are biased by 8.  */
13290               if (filedata->file_header.e_machine == EM_PARISC)
13291                 addend -= 8;
13292               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
13293                         reloc_size);
13294             }
13295           else if (is_6bit_abs_reloc (filedata, reloc_type)
13296                    || is_6bit_inplace_sub_reloc (filedata, reloc_type))
13297             {
13298               if (reloc_subtract)
13299                 addend -= sym->st_value;
13300               else
13301                 addend += sym->st_value;
13302               addend = (addend & 0x3f) | (byte_get (rloc, reloc_size) & 0xc0);
13303               byte_put (rloc, addend, reloc_size);
13304             }
13305           else if (reloc_subtract)
13306             byte_put (rloc, addend - sym->st_value, reloc_size);
13307           else
13308             byte_put (rloc, addend + sym->st_value, reloc_size);
13309         }
13310
13311       free (symtab);
13312       /* Let the target specific reloc processing code know that
13313          we have finished with these relocs.  */
13314       target_specific_reloc_handling (filedata, NULL, NULL, NULL, NULL, 0);
13315
13316       if (relocs_return)
13317         {
13318           * (Elf_Internal_Rela **) relocs_return = relocs;
13319           * num_relocs_return = num_relocs;
13320         }
13321       else
13322         free (relocs);
13323
13324       break;
13325     }
13326
13327   return TRUE;
13328 }
13329
13330 #ifdef SUPPORT_DISASSEMBLY
13331 static bfd_boolean
13332 disassemble_section (Elf_Internal_Shdr * section, Filedata * filedata)
13333 {
13334   printf (_("\nAssembly dump of section %s\n"), printable_section_name (filedata, section));
13335
13336   /* FIXME: XXX -- to be done --- XXX */
13337
13338   return TRUE;
13339 }
13340 #endif
13341
13342 /* Reads in the contents of SECTION from FILE, returning a pointer
13343    to a malloc'ed buffer or NULL if something went wrong.  */
13344
13345 static char *
13346 get_section_contents (Elf_Internal_Shdr * section, Filedata * filedata)
13347 {
13348   bfd_size_type num_bytes = section->sh_size;
13349
13350   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
13351     {
13352       printf (_("Section '%s' has no data to dump.\n"),
13353               printable_section_name (filedata, section));
13354       return NULL;
13355     }
13356
13357   return  (char *) get_data (NULL, filedata, section->sh_offset, 1, num_bytes,
13358                              _("section contents"));
13359 }
13360
13361 /* Uncompresses a section that was compressed using zlib, in place.  */
13362
13363 static bfd_boolean
13364 uncompress_section_contents (unsigned char **   buffer,
13365                              dwarf_size_type    uncompressed_size,
13366                              dwarf_size_type *  size)
13367 {
13368   dwarf_size_type compressed_size = *size;
13369   unsigned char * compressed_buffer = *buffer;
13370   unsigned char * uncompressed_buffer;
13371   z_stream strm;
13372   int rc;
13373
13374   /* It is possible the section consists of several compressed
13375      buffers concatenated together, so we uncompress in a loop.  */
13376   /* PR 18313: The state field in the z_stream structure is supposed
13377      to be invisible to the user (ie us), but some compilers will
13378      still complain about it being used without initialisation.  So
13379      we first zero the entire z_stream structure and then set the fields
13380      that we need.  */
13381   memset (& strm, 0, sizeof strm);
13382   strm.avail_in = compressed_size;
13383   strm.next_in = (Bytef *) compressed_buffer;
13384   strm.avail_out = uncompressed_size;
13385   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
13386
13387   rc = inflateInit (& strm);
13388   while (strm.avail_in > 0)
13389     {
13390       if (rc != Z_OK)
13391         goto fail;
13392       strm.next_out = ((Bytef *) uncompressed_buffer
13393                        + (uncompressed_size - strm.avail_out));
13394       rc = inflate (&strm, Z_FINISH);
13395       if (rc != Z_STREAM_END)
13396         goto fail;
13397       rc = inflateReset (& strm);
13398     }
13399   rc = inflateEnd (& strm);
13400   if (rc != Z_OK
13401       || strm.avail_out != 0)
13402     goto fail;
13403
13404   *buffer = uncompressed_buffer;
13405   *size = uncompressed_size;
13406   return TRUE;
13407
13408  fail:
13409   free (uncompressed_buffer);
13410   /* Indicate decompression failure.  */
13411   *buffer = NULL;
13412   return FALSE;
13413 }
13414
13415 static bfd_boolean
13416 dump_section_as_strings (Elf_Internal_Shdr * section, Filedata * filedata)
13417 {
13418   Elf_Internal_Shdr *  relsec;
13419   bfd_size_type        num_bytes;
13420   unsigned char *      data;
13421   unsigned char *      end;
13422   unsigned char *      real_start;
13423   unsigned char *      start;
13424   bfd_boolean          some_strings_shown;
13425
13426   real_start = start = (unsigned char *) get_section_contents (section, filedata);
13427   if (start == NULL)
13428     /* PR 21820: Do not fail if the section was empty.  */
13429     return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13430
13431   num_bytes = section->sh_size;
13432
13433   printf (_("\nString dump of section '%s':\n"), printable_section_name (filedata, section));
13434
13435   if (decompress_dumps)
13436     {
13437       dwarf_size_type new_size = num_bytes;
13438       dwarf_size_type uncompressed_size = 0;
13439
13440       if ((section->sh_flags & SHF_COMPRESSED) != 0)
13441         {
13442           Elf_Internal_Chdr chdr;
13443           unsigned int compression_header_size
13444             = get_compression_header (& chdr, (unsigned char *) start,
13445                                       num_bytes);
13446
13447           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13448             {
13449               warn (_("section '%s' has unsupported compress type: %d\n"),
13450                     printable_section_name (filedata, section), chdr.ch_type);
13451               return FALSE;
13452             }
13453           uncompressed_size = chdr.ch_size;
13454           start += compression_header_size;
13455           new_size -= compression_header_size;
13456         }
13457       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13458         {
13459           /* Read the zlib header.  In this case, it should be "ZLIB"
13460              followed by the uncompressed section size, 8 bytes in
13461              big-endian order.  */
13462           uncompressed_size = start[4]; uncompressed_size <<= 8;
13463           uncompressed_size += start[5]; uncompressed_size <<= 8;
13464           uncompressed_size += start[6]; uncompressed_size <<= 8;
13465           uncompressed_size += start[7]; uncompressed_size <<= 8;
13466           uncompressed_size += start[8]; uncompressed_size <<= 8;
13467           uncompressed_size += start[9]; uncompressed_size <<= 8;
13468           uncompressed_size += start[10]; uncompressed_size <<= 8;
13469           uncompressed_size += start[11];
13470           start += 12;
13471           new_size -= 12;
13472         }
13473
13474       if (uncompressed_size)
13475         {
13476           if (uncompress_section_contents (& start,
13477                                            uncompressed_size, & new_size))
13478             num_bytes = new_size;
13479           else
13480             {
13481               error (_("Unable to decompress section %s\n"),
13482                      printable_section_name (filedata, section));
13483               return FALSE;
13484             }
13485         }
13486       else
13487         start = real_start;
13488     }
13489
13490   /* If the section being dumped has relocations against it the user might
13491      be expecting these relocations to have been applied.  Check for this
13492      case and issue a warning message in order to avoid confusion.
13493      FIXME: Maybe we ought to have an option that dumps a section with
13494      relocs applied ?  */
13495   for (relsec = filedata->section_headers;
13496        relsec < filedata->section_headers + filedata->file_header.e_shnum;
13497        ++relsec)
13498     {
13499       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13500           || relsec->sh_info >= filedata->file_header.e_shnum
13501           || filedata->section_headers + relsec->sh_info != section
13502           || relsec->sh_size == 0
13503           || relsec->sh_link >= filedata->file_header.e_shnum)
13504         continue;
13505
13506       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13507       break;
13508     }
13509
13510   data = start;
13511   end  = start + num_bytes;
13512   some_strings_shown = FALSE;
13513
13514   while (data < end)
13515     {
13516       while (!ISPRINT (* data))
13517         if (++ data >= end)
13518           break;
13519
13520       if (data < end)
13521         {
13522           size_t maxlen = end - data;
13523
13524 #ifndef __MSVCRT__
13525           /* PR 11128: Use two separate invocations in order to work
13526              around bugs in the Solaris 8 implementation of printf.  */
13527           printf ("  [%6tx]  ", data - start);
13528 #else
13529           printf ("  [%6Ix]  ", (size_t) (data - start));
13530 #endif
13531           if (maxlen > 0)
13532             {
13533               print_symbol ((int) maxlen, (const char *) data);
13534               putchar ('\n');
13535               data += strnlen ((const char *) data, maxlen);
13536             }
13537           else
13538             {
13539               printf (_("<corrupt>\n"));
13540               data = end;
13541             }
13542           some_strings_shown = TRUE;
13543         }
13544     }
13545
13546   if (! some_strings_shown)
13547     printf (_("  No strings found in this section."));
13548
13549   free (real_start);
13550
13551   putchar ('\n');
13552   return TRUE;
13553 }
13554
13555 static bfd_boolean
13556 dump_section_as_bytes (Elf_Internal_Shdr *  section,
13557                        Filedata *           filedata,
13558                        bfd_boolean          relocate)
13559 {
13560   Elf_Internal_Shdr * relsec;
13561   bfd_size_type       bytes;
13562   bfd_size_type       section_size;
13563   bfd_vma             addr;
13564   unsigned char *     data;
13565   unsigned char *     real_start;
13566   unsigned char *     start;
13567
13568   real_start = start = (unsigned char *) get_section_contents (section, filedata);
13569   if (start == NULL)
13570     /* PR 21820: Do not fail if the section was empty.  */
13571     return (section->sh_size == 0 || section->sh_type == SHT_NOBITS) ? TRUE : FALSE;
13572
13573   section_size = section->sh_size;
13574
13575   printf (_("\nHex dump of section '%s':\n"), printable_section_name (filedata, section));
13576
13577   if (decompress_dumps)
13578     {
13579       dwarf_size_type new_size = section_size;
13580       dwarf_size_type uncompressed_size = 0;
13581
13582       if ((section->sh_flags & SHF_COMPRESSED) != 0)
13583         {
13584           Elf_Internal_Chdr chdr;
13585           unsigned int compression_header_size
13586             = get_compression_header (& chdr, start, section_size);
13587
13588           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13589             {
13590               warn (_("section '%s' has unsupported compress type: %d\n"),
13591                     printable_section_name (filedata, section), chdr.ch_type);
13592               return FALSE;
13593             }
13594           uncompressed_size = chdr.ch_size;
13595           start += compression_header_size;
13596           new_size -= compression_header_size;
13597         }
13598       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
13599         {
13600           /* Read the zlib header.  In this case, it should be "ZLIB"
13601              followed by the uncompressed section size, 8 bytes in
13602              big-endian order.  */
13603           uncompressed_size = start[4]; uncompressed_size <<= 8;
13604           uncompressed_size += start[5]; uncompressed_size <<= 8;
13605           uncompressed_size += start[6]; uncompressed_size <<= 8;
13606           uncompressed_size += start[7]; uncompressed_size <<= 8;
13607           uncompressed_size += start[8]; uncompressed_size <<= 8;
13608           uncompressed_size += start[9]; uncompressed_size <<= 8;
13609           uncompressed_size += start[10]; uncompressed_size <<= 8;
13610           uncompressed_size += start[11];
13611           start += 12;
13612           new_size -= 12;
13613         }
13614
13615       if (uncompressed_size)
13616         {
13617           if (uncompress_section_contents (& start, uncompressed_size,
13618                                            & new_size))
13619             {
13620               section_size = new_size;
13621             }
13622           else
13623             {
13624               error (_("Unable to decompress section %s\n"),
13625                      printable_section_name (filedata, section));
13626               /* FIXME: Print the section anyway ?  */
13627               return FALSE;
13628             }
13629         }
13630       else
13631         start = real_start;
13632     }
13633
13634   if (relocate)
13635     {
13636       if (! apply_relocations (filedata, section, start, section_size, NULL, NULL))
13637         return FALSE;
13638     }
13639   else
13640     {
13641       /* If the section being dumped has relocations against it the user might
13642          be expecting these relocations to have been applied.  Check for this
13643          case and issue a warning message in order to avoid confusion.
13644          FIXME: Maybe we ought to have an option that dumps a section with
13645          relocs applied ?  */
13646       for (relsec = filedata->section_headers;
13647            relsec < filedata->section_headers + filedata->file_header.e_shnum;
13648            ++relsec)
13649         {
13650           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
13651               || relsec->sh_info >= filedata->file_header.e_shnum
13652               || filedata->section_headers + relsec->sh_info != section
13653               || relsec->sh_size == 0
13654               || relsec->sh_link >= filedata->file_header.e_shnum)
13655             continue;
13656
13657           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
13658           break;
13659         }
13660     }
13661
13662   addr = section->sh_addr;
13663   bytes = section_size;
13664   data = start;
13665
13666   while (bytes)
13667     {
13668       int j;
13669       int k;
13670       int lbytes;
13671
13672       lbytes = (bytes > 16 ? 16 : bytes);
13673
13674       printf ("  0x%8.8lx ", (unsigned long) addr);
13675
13676       for (j = 0; j < 16; j++)
13677         {
13678           if (j < lbytes)
13679             printf ("%2.2x", data[j]);
13680           else
13681             printf ("  ");
13682
13683           if ((j & 3) == 3)
13684             printf (" ");
13685         }
13686
13687       for (j = 0; j < lbytes; j++)
13688         {
13689           k = data[j];
13690           if (k >= ' ' && k < 0x7f)
13691             printf ("%c", k);
13692           else
13693             printf (".");
13694         }
13695
13696       putchar ('\n');
13697
13698       data  += lbytes;
13699       addr  += lbytes;
13700       bytes -= lbytes;
13701     }
13702
13703   free (real_start);
13704
13705   putchar ('\n');
13706   return TRUE;
13707 }
13708
13709 static bfd_boolean
13710 load_specific_debug_section (enum dwarf_section_display_enum  debug,
13711                              const Elf_Internal_Shdr *        sec,
13712                              void *                           data)
13713 {
13714   struct dwarf_section * section = &debug_displays [debug].section;
13715   char buf [64];
13716   Filedata * filedata = (Filedata *) data;
13717   
13718   if (section->start != NULL)
13719     {
13720       /* If it is already loaded, do nothing.  */
13721       if (streq (section->filename, filedata->file_name))
13722         return TRUE;
13723       free (section->start);
13724     }
13725
13726   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
13727   section->address = sec->sh_addr;
13728   section->user_data = NULL;
13729   section->filename = filedata->file_name;
13730   section->start = (unsigned char *) get_data (NULL, filedata,
13731                                                sec->sh_offset, 1,
13732                                                sec->sh_size, buf);
13733   if (section->start == NULL)
13734     section->size = 0;
13735   else
13736     {
13737       unsigned char *start = section->start;
13738       dwarf_size_type size = sec->sh_size;
13739       dwarf_size_type uncompressed_size = 0;
13740
13741       if ((sec->sh_flags & SHF_COMPRESSED) != 0)
13742         {
13743           Elf_Internal_Chdr chdr;
13744           unsigned int compression_header_size;
13745
13746           if (size < (is_32bit_elf
13747                       ? sizeof (Elf32_External_Chdr)
13748                       : sizeof (Elf64_External_Chdr)))
13749             {
13750               warn (_("compressed section %s is too small to contain a compression header"),
13751                     section->name);
13752               return FALSE;
13753             }
13754
13755           compression_header_size = get_compression_header (&chdr, start, size);
13756
13757           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
13758             {
13759               warn (_("section '%s' has unsupported compress type: %d\n"),
13760                     section->name, chdr.ch_type);
13761               return FALSE;
13762             }
13763           uncompressed_size = chdr.ch_size;
13764           start += compression_header_size;
13765           size -= compression_header_size;
13766         }
13767       else if (size > 12 && streq ((char *) start, "ZLIB"))
13768         {
13769           /* Read the zlib header.  In this case, it should be "ZLIB"
13770              followed by the uncompressed section size, 8 bytes in
13771              big-endian order.  */
13772           uncompressed_size = start[4]; uncompressed_size <<= 8;
13773           uncompressed_size += start[5]; uncompressed_size <<= 8;
13774           uncompressed_size += start[6]; uncompressed_size <<= 8;
13775           uncompressed_size += start[7]; uncompressed_size <<= 8;
13776           uncompressed_size += start[8]; uncompressed_size <<= 8;
13777           uncompressed_size += start[9]; uncompressed_size <<= 8;
13778           uncompressed_size += start[10]; uncompressed_size <<= 8;
13779           uncompressed_size += start[11];
13780           start += 12;
13781           size -= 12;
13782         }
13783
13784       if (uncompressed_size)
13785         {
13786           if (uncompress_section_contents (&start, uncompressed_size,
13787                                            &size))
13788             {
13789               /* Free the compressed buffer, update the section buffer
13790                  and the section size if uncompress is successful.  */
13791               free (section->start);
13792               section->start = start;
13793             }
13794           else
13795             {
13796               error (_("Unable to decompress section %s\n"),
13797                      printable_section_name (filedata, sec));
13798               return FALSE;
13799             }
13800         }
13801
13802       section->size = size;
13803     }
13804
13805   if (section->start == NULL)
13806     return FALSE;
13807
13808   if (debug_displays [debug].relocate)
13809     {
13810       if (! apply_relocations (filedata, sec, section->start, section->size,
13811                                & section->reloc_info, & section->num_relocs))
13812         return FALSE;
13813     }
13814   else
13815     {
13816       section->reloc_info = NULL;
13817       section->num_relocs = 0;
13818     }
13819
13820   return TRUE;
13821 }
13822
13823 /* If this is not NULL, load_debug_section will only look for sections
13824    within the list of sections given here.  */
13825 static unsigned int * section_subset = NULL;
13826
13827 bfd_boolean
13828 load_debug_section (enum dwarf_section_display_enum debug, void * data)
13829 {
13830   struct dwarf_section * section = &debug_displays [debug].section;
13831   Elf_Internal_Shdr * sec;
13832   Filedata * filedata = (Filedata *) data;
13833
13834   /* Without section headers we cannot find any sections.  */
13835   if (filedata->section_headers == NULL)
13836     return FALSE;
13837
13838   if (filedata->string_table == NULL
13839       && filedata->file_header.e_shstrndx != SHN_UNDEF
13840       && filedata->file_header.e_shstrndx < filedata->file_header.e_shnum)
13841     {
13842       Elf_Internal_Shdr * strs;
13843
13844       /* Read in the string table, so that we have section names to scan.  */
13845       strs = filedata->section_headers + filedata->file_header.e_shstrndx;
13846
13847       if (strs != NULL && strs->sh_size != 0)
13848         {
13849           filedata->string_table
13850             = (char *) get_data (NULL, filedata, strs->sh_offset,
13851                                  1, strs->sh_size, _("string table"));
13852
13853           filedata->string_table_length
13854             = filedata->string_table != NULL ? strs->sh_size : 0;
13855         }
13856     }
13857
13858   /* Locate the debug section.  */
13859   sec = find_section_in_set (filedata, section->uncompressed_name, section_subset);
13860   if (sec != NULL)
13861     section->name = section->uncompressed_name;
13862   else
13863     {
13864       sec = find_section_in_set (filedata, section->compressed_name, section_subset);
13865       if (sec != NULL)
13866         section->name = section->compressed_name;
13867     }
13868   if (sec == NULL)
13869     return FALSE;
13870
13871   /* If we're loading from a subset of sections, and we've loaded
13872      a section matching this name before, it's likely that it's a
13873      different one.  */
13874   if (section_subset != NULL)
13875     free_debug_section (debug);
13876
13877   return load_specific_debug_section (debug, sec, data);
13878 }
13879
13880 void
13881 free_debug_section (enum dwarf_section_display_enum debug)
13882 {
13883   struct dwarf_section * section = &debug_displays [debug].section;
13884
13885   if (section->start == NULL)
13886     return;
13887
13888   free ((char *) section->start);
13889   section->start = NULL;
13890   section->address = 0;
13891   section->size = 0;
13892 }
13893
13894 static bfd_boolean
13895 display_debug_section (int shndx, Elf_Internal_Shdr * section, Filedata * filedata)
13896 {
13897   char * name = SECTION_NAME (section);
13898   const char * print_name = printable_section_name (filedata, section);
13899   bfd_size_type length;
13900   bfd_boolean result = TRUE;
13901   int i;
13902
13903   length = section->sh_size;
13904   if (length == 0)
13905     {
13906       printf (_("\nSection '%s' has no debugging data.\n"), print_name);
13907       return TRUE;
13908     }
13909   if (section->sh_type == SHT_NOBITS)
13910     {
13911       /* There is no point in dumping the contents of a debugging section
13912          which has the NOBITS type - the bits in the file will be random.
13913          This can happen when a file containing a .eh_frame section is
13914          stripped with the --only-keep-debug command line option.  */
13915       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
13916               print_name);
13917       return FALSE;
13918     }
13919
13920   if (const_strneq (name, ".gnu.linkonce.wi."))
13921     name = ".debug_info";
13922
13923   /* See if we know how to display the contents of this section.  */
13924   for (i = 0; i < max; i++)
13925     {
13926       enum dwarf_section_display_enum  id = (enum dwarf_section_display_enum) i;
13927       struct dwarf_section_display *   display = debug_displays + i;
13928       struct dwarf_section *           sec = & display->section;
13929
13930       if (streq (sec->uncompressed_name, name)
13931           || (id == line && const_strneq (name, ".debug_line."))
13932           || streq (sec->compressed_name, name))
13933         {
13934           bfd_boolean secondary = (section != find_section (filedata, name));
13935
13936           if (secondary)
13937             free_debug_section (id);
13938
13939           if (i == line && const_strneq (name, ".debug_line."))
13940             sec->name = name;
13941           else if (streq (sec->uncompressed_name, name))
13942             sec->name = sec->uncompressed_name;
13943           else
13944             sec->name = sec->compressed_name;
13945
13946           if (load_specific_debug_section (id, section, filedata))
13947             {
13948               /* If this debug section is part of a CU/TU set in a .dwp file,
13949                  restrict load_debug_section to the sections in that set.  */
13950               section_subset = find_cu_tu_set (filedata, shndx);
13951
13952               result &= display->display (sec, filedata);
13953
13954               section_subset = NULL;
13955
13956               if (secondary || (id != info && id != abbrev))
13957                 free_debug_section (id);
13958             }
13959           break;
13960         }
13961     }
13962
13963   if (i == max)
13964     {
13965       printf (_("Unrecognized debug section: %s\n"), print_name);
13966       result = FALSE;
13967     }
13968
13969   return result;
13970 }
13971
13972 /* Set DUMP_SECTS for all sections where dumps were requested
13973    based on section name.  */
13974
13975 static void
13976 initialise_dumps_byname (Filedata * filedata)
13977 {
13978   struct dump_list_entry * cur;
13979
13980   for (cur = dump_sects_byname; cur; cur = cur->next)
13981     {
13982       unsigned int i;
13983       bfd_boolean any = FALSE;
13984
13985       for (i = 0; i < filedata->file_header.e_shnum; i++)
13986         if (streq (SECTION_NAME (filedata->section_headers + i), cur->name))
13987           {
13988             request_dump_bynumber (filedata, i, cur->type);
13989             any = TRUE;
13990           }
13991
13992       if (!any)
13993         warn (_("Section '%s' was not dumped because it does not exist!\n"),
13994               cur->name);
13995     }
13996 }
13997
13998 static bfd_boolean
13999 process_section_contents (Filedata * filedata)
14000 {
14001   Elf_Internal_Shdr * section;
14002   unsigned int i;
14003   bfd_boolean res = TRUE;
14004
14005   if (! do_dump)
14006     return TRUE;
14007
14008   initialise_dumps_byname (filedata);
14009
14010   for (i = 0, section = filedata->section_headers;
14011        i < filedata->file_header.e_shnum && i < filedata->num_dump_sects;
14012        i++, section++)
14013     {
14014       dump_type dump = filedata->dump_sects[i];
14015
14016 #ifdef SUPPORT_DISASSEMBLY
14017       if (dump & DISASS_DUMP)
14018         {
14019           if (! disassemble_section (section, filedata))
14020             res = FALSE;
14021         }
14022 #endif
14023       if (dump & HEX_DUMP)
14024         {
14025           if (! dump_section_as_bytes (section, filedata, FALSE))
14026             res = FALSE;
14027         }
14028
14029       if (dump & RELOC_DUMP)
14030         {
14031           if (! dump_section_as_bytes (section, filedata, TRUE))
14032             res = FALSE;
14033         }
14034
14035       if (dump & STRING_DUMP)
14036         {
14037           if (! dump_section_as_strings (section, filedata))
14038             res = FALSE;
14039         }
14040
14041       if (dump & DEBUG_DUMP)
14042         {
14043           if (! display_debug_section (i, section, filedata))
14044             res = FALSE;
14045         }
14046     }
14047
14048   /* Check to see if the user requested a
14049      dump of a section that does not exist.  */
14050   while (i < filedata->num_dump_sects)
14051     {
14052       if (filedata->dump_sects[i])
14053         {
14054           warn (_("Section %d was not dumped because it does not exist!\n"), i);
14055           res = FALSE;
14056         }
14057       i++;
14058     }
14059
14060   return res;
14061 }
14062
14063 static void
14064 process_mips_fpe_exception (int mask)
14065 {
14066   if (mask)
14067     {
14068       bfd_boolean first = TRUE;
14069
14070       if (mask & OEX_FPU_INEX)
14071         fputs ("INEX", stdout), first = FALSE;
14072       if (mask & OEX_FPU_UFLO)
14073         printf ("%sUFLO", first ? "" : "|"), first = FALSE;
14074       if (mask & OEX_FPU_OFLO)
14075         printf ("%sOFLO", first ? "" : "|"), first = FALSE;
14076       if (mask & OEX_FPU_DIV0)
14077         printf ("%sDIV0", first ? "" : "|"), first = FALSE;
14078       if (mask & OEX_FPU_INVAL)
14079         printf ("%sINVAL", first ? "" : "|");
14080     }
14081   else
14082     fputs ("0", stdout);
14083 }
14084
14085 /* Display's the value of TAG at location P.  If TAG is
14086    greater than 0 it is assumed to be an unknown tag, and
14087    a message is printed to this effect.  Otherwise it is
14088    assumed that a message has already been printed.
14089
14090    If the bottom bit of TAG is set it assumed to have a
14091    string value, otherwise it is assumed to have an integer
14092    value.
14093
14094    Returns an updated P pointing to the first unread byte
14095    beyond the end of TAG's value.
14096
14097    Reads at or beyond END will not be made.  */
14098
14099 static unsigned char *
14100 display_tag_value (signed int tag,
14101                    unsigned char * p,
14102                    const unsigned char * const end)
14103 {
14104   unsigned long val;
14105
14106   if (tag > 0)
14107     printf ("  Tag_unknown_%d: ", tag);
14108
14109   if (p >= end)
14110     {
14111       warn (_("<corrupt tag>\n"));
14112     }
14113   else if (tag & 1)
14114     {
14115       /* PR 17531 file: 027-19978-0.004.  */
14116       size_t maxlen = (end - p) - 1;
14117
14118       putchar ('"');
14119       if (maxlen > 0)
14120         {
14121           print_symbol ((int) maxlen, (const char *) p);
14122           p += strnlen ((char *) p, maxlen) + 1;
14123         }
14124       else
14125         {
14126           printf (_("<corrupt string tag>"));
14127           p = (unsigned char *) end;
14128         }
14129       printf ("\"\n");
14130     }
14131   else
14132     {
14133       unsigned int len;
14134
14135       val = read_uleb128 (p, &len, end);
14136       p += len;
14137       printf ("%ld (0x%lx)\n", val, val);
14138     }
14139
14140   assert (p <= end);
14141   return p;
14142 }
14143
14144 /* ARC ABI attributes section.  */
14145
14146 static unsigned char *
14147 display_arc_attribute (unsigned char * p,
14148                        const unsigned char * const end)
14149 {
14150   unsigned int tag;
14151   unsigned int len;
14152   unsigned int val;
14153
14154   tag = read_uleb128 (p, &len, end);
14155   p += len;
14156
14157   switch (tag)
14158     {
14159     case Tag_ARC_PCS_config:
14160       val = read_uleb128 (p, &len, end);
14161       p += len;
14162       printf ("  Tag_ARC_PCS_config: ");
14163       switch (val)
14164         {
14165         case 0:
14166           printf (_("Absent/Non standard\n"));
14167           break;
14168         case 1:
14169           printf (_("Bare metal/mwdt\n"));
14170           break;
14171         case 2:
14172           printf (_("Bare metal/newlib\n"));
14173           break;
14174         case 3:
14175           printf (_("Linux/uclibc\n"));
14176           break;
14177         case 4:
14178           printf (_("Linux/glibc\n"));
14179           break;
14180         default:
14181           printf (_("Unknown\n"));
14182           break;
14183         }
14184       break;
14185
14186     case Tag_ARC_CPU_base:
14187       val = read_uleb128 (p, &len, end);
14188       p += len;
14189       printf ("  Tag_ARC_CPU_base: ");
14190       switch (val)
14191         {
14192         default:
14193         case TAG_CPU_NONE:
14194           printf (_("Absent\n"));
14195           break;
14196         case TAG_CPU_ARC6xx:
14197           printf ("ARC6xx\n");
14198           break;
14199         case TAG_CPU_ARC7xx:
14200           printf ("ARC7xx\n");
14201           break;
14202         case TAG_CPU_ARCEM:
14203           printf ("ARCEM\n");
14204           break;
14205         case TAG_CPU_ARCHS:
14206           printf ("ARCHS\n");
14207           break;
14208         }
14209       break;
14210
14211     case Tag_ARC_CPU_variation:
14212       val = read_uleb128 (p, &len, end);
14213       p += len;
14214       printf ("  Tag_ARC_CPU_variation: ");
14215       switch (val)
14216         {
14217         default:
14218           if (val > 0 && val < 16)
14219               printf ("Core%d\n", val);
14220           else
14221               printf ("Unknown\n");
14222           break;
14223
14224         case 0:
14225           printf (_("Absent\n"));
14226           break;
14227         }
14228       break;
14229
14230     case Tag_ARC_CPU_name:
14231       printf ("  Tag_ARC_CPU_name: ");
14232       p = display_tag_value (-1, p, end);
14233       break;
14234
14235     case Tag_ARC_ABI_rf16:
14236       val = read_uleb128 (p, &len, end);
14237       p += len;
14238       printf ("  Tag_ARC_ABI_rf16: %s\n", val ? _("yes") : _("no"));
14239       break;
14240
14241     case Tag_ARC_ABI_osver:
14242       val = read_uleb128 (p, &len, end);
14243       p += len;
14244       printf ("  Tag_ARC_ABI_osver: v%d\n", val);
14245       break;
14246
14247     case Tag_ARC_ABI_pic:
14248     case Tag_ARC_ABI_sda:
14249       val = read_uleb128 (p, &len, end);
14250       p += len;
14251       printf (tag == Tag_ARC_ABI_sda ? "  Tag_ARC_ABI_sda: "
14252               : "  Tag_ARC_ABI_pic: ");
14253       switch (val)
14254         {
14255         case 0:
14256           printf (_("Absent\n"));
14257           break;
14258         case 1:
14259           printf ("MWDT\n");
14260           break;
14261         case 2:
14262           printf ("GNU\n");
14263           break;
14264         default:
14265           printf (_("Unknown\n"));
14266           break;
14267         }
14268       break;
14269
14270     case Tag_ARC_ABI_tls:
14271       val = read_uleb128 (p, &len, end);
14272       p += len;
14273       printf ("  Tag_ARC_ABI_tls: %s\n", val ? "r25": "none");
14274       break;
14275
14276     case Tag_ARC_ABI_enumsize:
14277       val = read_uleb128 (p, &len, end);
14278       p += len;
14279       printf ("  Tag_ARC_ABI_enumsize: %s\n", val ? _("default") :
14280               _("smallest"));
14281       break;
14282
14283     case Tag_ARC_ABI_exceptions:
14284       val = read_uleb128 (p, &len, end);
14285       p += len;
14286       printf ("  Tag_ARC_ABI_exceptions: %s\n", val ? _("OPTFP")
14287               : _("default"));
14288       break;
14289
14290     case Tag_ARC_ABI_double_size:
14291       val = read_uleb128 (p, &len, end);
14292       p += len;
14293       printf ("  Tag_ARC_ABI_double_size: %d\n", val);
14294       break;
14295
14296     case Tag_ARC_ISA_config:
14297       printf ("  Tag_ARC_ISA_config: ");
14298       p = display_tag_value (-1, p, end);
14299       break;
14300
14301     case Tag_ARC_ISA_apex:
14302       printf ("  Tag_ARC_ISA_apex: ");
14303       p = display_tag_value (-1, p, end);
14304       break;
14305
14306     case Tag_ARC_ISA_mpy_option:
14307       val = read_uleb128 (p, &len, end);
14308       p += len;
14309       printf ("  Tag_ARC_ISA_mpy_option: %d\n", val);
14310       break;
14311
14312     case Tag_ARC_ATR_version:
14313       val = read_uleb128 (p, &len, end);
14314       p += len;
14315       printf ("  Tag_ARC_ATR_version: %d\n", val);
14316       break;
14317
14318     default:
14319       return display_tag_value (tag & 1, p, end);
14320     }
14321
14322   return p;
14323 }
14324
14325 /* ARM EABI attributes section.  */
14326 typedef struct
14327 {
14328   unsigned int tag;
14329   const char * name;
14330   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
14331   unsigned int type;
14332   const char ** table;
14333 } arm_attr_public_tag;
14334
14335 static const char * arm_attr_tag_CPU_arch[] =
14336   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
14337    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "v8-R", "v8-M.baseline",
14338    "v8-M.mainline"};
14339 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
14340 static const char * arm_attr_tag_THUMB_ISA_use[] =
14341   {"No", "Thumb-1", "Thumb-2", "Yes"};
14342 static const char * arm_attr_tag_FP_arch[] =
14343   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
14344    "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
14345 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
14346 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
14347   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
14348    "NEON for ARMv8.1"};
14349 static const char * arm_attr_tag_PCS_config[] =
14350   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
14351    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
14352 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
14353   {"V6", "SB", "TLS", "Unused"};
14354 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
14355   {"Absolute", "PC-relative", "SB-relative", "None"};
14356 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
14357   {"Absolute", "PC-relative", "None"};
14358 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
14359   {"None", "direct", "GOT-indirect"};
14360 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
14361   {"None", "??? 1", "2", "??? 3", "4"};
14362 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
14363 static const char * arm_attr_tag_ABI_FP_denormal[] =
14364   {"Unused", "Needed", "Sign only"};
14365 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
14366 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
14367 static const char * arm_attr_tag_ABI_FP_number_model[] =
14368   {"Unused", "Finite", "RTABI", "IEEE 754"};
14369 static const char * arm_attr_tag_ABI_enum_size[] =
14370   {"Unused", "small", "int", "forced to int"};
14371 static const char * arm_attr_tag_ABI_HardFP_use[] =
14372   {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
14373 static const char * arm_attr_tag_ABI_VFP_args[] =
14374   {"AAPCS", "VFP registers", "custom", "compatible"};
14375 static const char * arm_attr_tag_ABI_WMMX_args[] =
14376   {"AAPCS", "WMMX registers", "custom"};
14377 static const char * arm_attr_tag_ABI_optimization_goals[] =
14378   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14379     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
14380 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
14381   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
14382     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
14383 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
14384 static const char * arm_attr_tag_FP_HP_extension[] =
14385   {"Not Allowed", "Allowed"};
14386 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
14387   {"None", "IEEE 754", "Alternative Format"};
14388 static const char * arm_attr_tag_DSP_extension[] =
14389   {"Follow architecture", "Allowed"};
14390 static const char * arm_attr_tag_MPextension_use[] =
14391   {"Not Allowed", "Allowed"};
14392 static const char * arm_attr_tag_DIV_use[] =
14393   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
14394     "Allowed in v7-A with integer division extension"};
14395 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
14396 static const char * arm_attr_tag_Virtualization_use[] =
14397   {"Not Allowed", "TrustZone", "Virtualization Extensions",
14398     "TrustZone and Virtualization Extensions"};
14399 static const char * arm_attr_tag_MPextension_use_legacy[] =
14400   {"Not Allowed", "Allowed"};
14401
14402 #define LOOKUP(id, name) \
14403   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
14404 static arm_attr_public_tag arm_attr_public_tags[] =
14405 {
14406   {4, "CPU_raw_name", 1, NULL},
14407   {5, "CPU_name", 1, NULL},
14408   LOOKUP(6, CPU_arch),
14409   {7, "CPU_arch_profile", 0, NULL},
14410   LOOKUP(8, ARM_ISA_use),
14411   LOOKUP(9, THUMB_ISA_use),
14412   LOOKUP(10, FP_arch),
14413   LOOKUP(11, WMMX_arch),
14414   LOOKUP(12, Advanced_SIMD_arch),
14415   LOOKUP(13, PCS_config),
14416   LOOKUP(14, ABI_PCS_R9_use),
14417   LOOKUP(15, ABI_PCS_RW_data),
14418   LOOKUP(16, ABI_PCS_RO_data),
14419   LOOKUP(17, ABI_PCS_GOT_use),
14420   LOOKUP(18, ABI_PCS_wchar_t),
14421   LOOKUP(19, ABI_FP_rounding),
14422   LOOKUP(20, ABI_FP_denormal),
14423   LOOKUP(21, ABI_FP_exceptions),
14424   LOOKUP(22, ABI_FP_user_exceptions),
14425   LOOKUP(23, ABI_FP_number_model),
14426   {24, "ABI_align_needed", 0, NULL},
14427   {25, "ABI_align_preserved", 0, NULL},
14428   LOOKUP(26, ABI_enum_size),
14429   LOOKUP(27, ABI_HardFP_use),
14430   LOOKUP(28, ABI_VFP_args),
14431   LOOKUP(29, ABI_WMMX_args),
14432   LOOKUP(30, ABI_optimization_goals),
14433   LOOKUP(31, ABI_FP_optimization_goals),
14434   {32, "compatibility", 0, NULL},
14435   LOOKUP(34, CPU_unaligned_access),
14436   LOOKUP(36, FP_HP_extension),
14437   LOOKUP(38, ABI_FP_16bit_format),
14438   LOOKUP(42, MPextension_use),
14439   LOOKUP(44, DIV_use),
14440   LOOKUP(46, DSP_extension),
14441   {64, "nodefaults", 0, NULL},
14442   {65, "also_compatible_with", 0, NULL},
14443   LOOKUP(66, T2EE_use),
14444   {67, "conformance", 1, NULL},
14445   LOOKUP(68, Virtualization_use),
14446   LOOKUP(70, MPextension_use_legacy)
14447 };
14448 #undef LOOKUP
14449
14450 static unsigned char *
14451 display_arm_attribute (unsigned char * p,
14452                        const unsigned char * const end)
14453 {
14454   unsigned int tag;
14455   unsigned int len;
14456   unsigned int val;
14457   arm_attr_public_tag * attr;
14458   unsigned i;
14459   unsigned int type;
14460
14461   tag = read_uleb128 (p, &len, end);
14462   p += len;
14463   attr = NULL;
14464   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
14465     {
14466       if (arm_attr_public_tags[i].tag == tag)
14467         {
14468           attr = &arm_attr_public_tags[i];
14469           break;
14470         }
14471     }
14472
14473   if (attr)
14474     {
14475       printf ("  Tag_%s: ", attr->name);
14476       switch (attr->type)
14477         {
14478         case 0:
14479           switch (tag)
14480             {
14481             case 7: /* Tag_CPU_arch_profile.  */
14482               val = read_uleb128 (p, &len, end);
14483               p += len;
14484               switch (val)
14485                 {
14486                 case 0: printf (_("None\n")); break;
14487                 case 'A': printf (_("Application\n")); break;
14488                 case 'R': printf (_("Realtime\n")); break;
14489                 case 'M': printf (_("Microcontroller\n")); break;
14490                 case 'S': printf (_("Application or Realtime\n")); break;
14491                 default: printf ("??? (%d)\n", val); break;
14492                 }
14493               break;
14494
14495             case 24: /* Tag_align_needed.  */
14496               val = read_uleb128 (p, &len, end);
14497               p += len;
14498               switch (val)
14499                 {
14500                 case 0: printf (_("None\n")); break;
14501                 case 1: printf (_("8-byte\n")); break;
14502                 case 2: printf (_("4-byte\n")); break;
14503                 case 3: printf ("??? 3\n"); break;
14504                 default:
14505                   if (val <= 12)
14506                     printf (_("8-byte and up to %d-byte extended\n"),
14507                             1 << val);
14508                   else
14509                     printf ("??? (%d)\n", val);
14510                   break;
14511                 }
14512               break;
14513
14514             case 25: /* Tag_align_preserved.  */
14515               val = read_uleb128 (p, &len, end);
14516               p += len;
14517               switch (val)
14518                 {
14519                 case 0: printf (_("None\n")); break;
14520                 case 1: printf (_("8-byte, except leaf SP\n")); break;
14521                 case 2: printf (_("8-byte\n")); break;
14522                 case 3: printf ("??? 3\n"); break;
14523                 default:
14524                   if (val <= 12)
14525                     printf (_("8-byte and up to %d-byte extended\n"),
14526                             1 << val);
14527                   else
14528                     printf ("??? (%d)\n", val);
14529                   break;
14530                 }
14531               break;
14532
14533             case 32: /* Tag_compatibility.  */
14534               {
14535                 val = read_uleb128 (p, &len, end);
14536                 p += len;
14537                 printf (_("flag = %d, vendor = "), val);
14538                 if (p < end - 1)
14539                   {
14540                     size_t maxlen = (end - p) - 1;
14541
14542                     print_symbol ((int) maxlen, (const char *) p);
14543                     p += strnlen ((char *) p, maxlen) + 1;
14544                   }
14545                 else
14546                   {
14547                     printf (_("<corrupt>"));
14548                     p = (unsigned char *) end;
14549                   }
14550                 putchar ('\n');
14551               }
14552               break;
14553
14554             case 64: /* Tag_nodefaults.  */
14555               /* PR 17531: file: 001-505008-0.01.  */
14556               if (p < end)
14557                 p++;
14558               printf (_("True\n"));
14559               break;
14560
14561             case 65: /* Tag_also_compatible_with.  */
14562               val = read_uleb128 (p, &len, end);
14563               p += len;
14564               if (val == 6 /* Tag_CPU_arch.  */)
14565                 {
14566                   val = read_uleb128 (p, &len, end);
14567                   p += len;
14568                   if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
14569                     printf ("??? (%d)\n", val);
14570                   else
14571                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
14572                 }
14573               else
14574                 printf ("???\n");
14575               while (p < end && *(p++) != '\0' /* NUL terminator.  */)
14576                 ;
14577               break;
14578
14579             default:
14580               printf (_("<unknown: %d>\n"), tag);
14581               break;
14582             }
14583           return p;
14584
14585         case 1:
14586           return display_tag_value (-1, p, end);
14587         case 2:
14588           return display_tag_value (0, p, end);
14589
14590         default:
14591           assert (attr->type & 0x80);
14592           val = read_uleb128 (p, &len, end);
14593           p += len;
14594           type = attr->type & 0x7f;
14595           if (val >= type)
14596             printf ("??? (%d)\n", val);
14597           else
14598             printf ("%s\n", attr->table[val]);
14599           return p;
14600         }
14601     }
14602
14603   return display_tag_value (tag, p, end);
14604 }
14605
14606 static unsigned char *
14607 display_gnu_attribute (unsigned char * p,
14608                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const),
14609                        const unsigned char * const end)
14610 {
14611   int tag;
14612   unsigned int len;
14613   unsigned int val;
14614
14615   tag = read_uleb128 (p, &len, end);
14616   p += len;
14617
14618   /* Tag_compatibility is the only generic GNU attribute defined at
14619      present.  */
14620   if (tag == 32)
14621     {
14622       val = read_uleb128 (p, &len, end);
14623       p += len;
14624
14625       printf (_("flag = %d, vendor = "), val);
14626       if (p == end)
14627         {
14628           printf (_("<corrupt>\n"));
14629           warn (_("corrupt vendor attribute\n"));
14630         }
14631       else
14632         {
14633           if (p < end - 1)
14634             {
14635               size_t maxlen = (end - p) - 1;
14636
14637               print_symbol ((int) maxlen, (const char *) p);
14638               p += strnlen ((char *) p, maxlen) + 1;
14639             }
14640           else
14641             {
14642               printf (_("<corrupt>"));
14643               p = (unsigned char *) end;
14644             }
14645           putchar ('\n');
14646         }
14647       return p;
14648     }
14649
14650   if ((tag & 2) == 0 && display_proc_gnu_attribute)
14651     return display_proc_gnu_attribute (p, tag, end);
14652
14653   return display_tag_value (tag, p, end);
14654 }
14655
14656 static unsigned char *
14657 display_power_gnu_attribute (unsigned char * p,
14658                              unsigned int tag,
14659                              const unsigned char * const end)
14660 {
14661   unsigned int len;
14662   unsigned int val;
14663
14664   if (tag == Tag_GNU_Power_ABI_FP)
14665     {
14666       val = read_uleb128 (p, &len, end);
14667       p += len;
14668       printf ("  Tag_GNU_Power_ABI_FP: ");
14669       if (len == 0)
14670         {
14671           printf (_("<corrupt>\n"));
14672           return p;
14673         }
14674
14675       if (val > 15)
14676         printf ("(%#x), ", val);
14677
14678       switch (val & 3)
14679         {
14680         case 0:
14681           printf (_("unspecified hard/soft float, "));
14682           break;
14683         case 1:
14684           printf (_("hard float, "));
14685           break;
14686         case 2:
14687           printf (_("soft float, "));
14688           break;
14689         case 3:
14690           printf (_("single-precision hard float, "));
14691           break;
14692         }
14693
14694       switch (val & 0xC)
14695         {
14696         case 0:
14697           printf (_("unspecified long double\n"));
14698           break;
14699         case 4:
14700           printf (_("128-bit IBM long double\n"));
14701           break;
14702         case 8:
14703           printf (_("64-bit long double\n"));
14704           break;
14705         case 12:
14706           printf (_("128-bit IEEE long double\n"));
14707           break;
14708         }
14709       return p;
14710     }
14711
14712   if (tag == Tag_GNU_Power_ABI_Vector)
14713     {
14714       val = read_uleb128 (p, &len, end);
14715       p += len;
14716       printf ("  Tag_GNU_Power_ABI_Vector: ");
14717       if (len == 0)
14718         {
14719           printf (_("<corrupt>\n"));
14720           return p;
14721         }
14722
14723       if (val > 3)
14724         printf ("(%#x), ", val);
14725
14726       switch (val & 3)
14727         {
14728         case 0:
14729           printf (_("unspecified\n"));
14730           break;
14731         case 1:
14732           printf (_("generic\n"));
14733           break;
14734         case 2:
14735           printf ("AltiVec\n");
14736           break;
14737         case 3:
14738           printf ("SPE\n");
14739           break;
14740         }
14741       return p;
14742     }
14743
14744   if (tag == Tag_GNU_Power_ABI_Struct_Return)
14745     {
14746       val = read_uleb128 (p, &len, end);
14747       p += len;
14748       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
14749       if (len == 0)
14750         {
14751           printf (_("<corrupt>\n"));
14752           return p;
14753         }
14754
14755       if (val > 2)
14756         printf ("(%#x), ", val);
14757
14758       switch (val & 3)
14759         {
14760         case 0:
14761           printf (_("unspecified\n"));
14762           break;
14763         case 1:
14764           printf ("r3/r4\n");
14765           break;
14766         case 2:
14767           printf (_("memory\n"));
14768           break;
14769         case 3:
14770           printf ("???\n");
14771           break;
14772         }
14773       return p;
14774     }
14775
14776   return display_tag_value (tag & 1, p, end);
14777 }
14778
14779 static unsigned char *
14780 display_s390_gnu_attribute (unsigned char * p,
14781                             unsigned int tag,
14782                             const unsigned char * const end)
14783 {
14784   unsigned int len;
14785   int val;
14786
14787   if (tag == Tag_GNU_S390_ABI_Vector)
14788     {
14789       val = read_uleb128 (p, &len, end);
14790       p += len;
14791       printf ("  Tag_GNU_S390_ABI_Vector: ");
14792
14793       switch (val)
14794         {
14795         case 0:
14796           printf (_("any\n"));
14797           break;
14798         case 1:
14799           printf (_("software\n"));
14800           break;
14801         case 2:
14802           printf (_("hardware\n"));
14803           break;
14804         default:
14805           printf ("??? (%d)\n", val);
14806           break;
14807         }
14808       return p;
14809    }
14810
14811   return display_tag_value (tag & 1, p, end);
14812 }
14813
14814 static void
14815 display_sparc_hwcaps (unsigned int mask)
14816 {
14817   if (mask)
14818     {
14819       bfd_boolean first = TRUE;
14820
14821       if (mask & ELF_SPARC_HWCAP_MUL32)
14822         fputs ("mul32", stdout), first = FALSE;
14823       if (mask & ELF_SPARC_HWCAP_DIV32)
14824         printf ("%sdiv32", first ? "" : "|"), first = FALSE;
14825       if (mask & ELF_SPARC_HWCAP_FSMULD)
14826         printf ("%sfsmuld", first ? "" : "|"), first = FALSE;
14827       if (mask & ELF_SPARC_HWCAP_V8PLUS)
14828         printf ("%sv8plus", first ? "" : "|"), first = FALSE;
14829       if (mask & ELF_SPARC_HWCAP_POPC)
14830         printf ("%spopc", first ? "" : "|"), first = FALSE;
14831       if (mask & ELF_SPARC_HWCAP_VIS)
14832         printf ("%svis", first ? "" : "|"), first = FALSE;
14833       if (mask & ELF_SPARC_HWCAP_VIS2)
14834         printf ("%svis2", first ? "" : "|"), first = FALSE;
14835       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
14836         printf ("%sASIBlkInit", first ? "" : "|"), first = FALSE;
14837       if (mask & ELF_SPARC_HWCAP_FMAF)
14838         printf ("%sfmaf", first ? "" : "|"), first = FALSE;
14839       if (mask & ELF_SPARC_HWCAP_VIS3)
14840         printf ("%svis3", first ? "" : "|"), first = FALSE;
14841       if (mask & ELF_SPARC_HWCAP_HPC)
14842         printf ("%shpc", first ? "" : "|"), first = FALSE;
14843       if (mask & ELF_SPARC_HWCAP_RANDOM)
14844         printf ("%srandom", first ? "" : "|"), first = FALSE;
14845       if (mask & ELF_SPARC_HWCAP_TRANS)
14846         printf ("%strans", first ? "" : "|"), first = FALSE;
14847       if (mask & ELF_SPARC_HWCAP_FJFMAU)
14848         printf ("%sfjfmau", first ? "" : "|"), first = FALSE;
14849       if (mask & ELF_SPARC_HWCAP_IMA)
14850         printf ("%sima", first ? "" : "|"), first = FALSE;
14851       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
14852         printf ("%scspare", first ? "" : "|"), first = FALSE;
14853     }
14854   else
14855     fputc ('0', stdout);
14856   fputc ('\n', stdout);
14857 }
14858
14859 static void
14860 display_sparc_hwcaps2 (unsigned int mask)
14861 {
14862   if (mask)
14863     {
14864       bfd_boolean first = TRUE;
14865
14866       if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
14867         fputs ("fjathplus", stdout), first = FALSE;
14868       if (mask & ELF_SPARC_HWCAP2_VIS3B)
14869         printf ("%svis3b", first ? "" : "|"), first = FALSE;
14870       if (mask & ELF_SPARC_HWCAP2_ADP)
14871         printf ("%sadp", first ? "" : "|"), first = FALSE;
14872       if (mask & ELF_SPARC_HWCAP2_SPARC5)
14873         printf ("%ssparc5", first ? "" : "|"), first = FALSE;
14874       if (mask & ELF_SPARC_HWCAP2_MWAIT)
14875         printf ("%smwait", first ? "" : "|"), first = FALSE;
14876       if (mask & ELF_SPARC_HWCAP2_XMPMUL)
14877         printf ("%sxmpmul", first ? "" : "|"), first = FALSE;
14878       if (mask & ELF_SPARC_HWCAP2_XMONT)
14879         printf ("%sxmont2", first ? "" : "|"), first = FALSE;
14880       if (mask & ELF_SPARC_HWCAP2_NSEC)
14881         printf ("%snsec", first ? "" : "|"), first = FALSE;
14882       if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
14883         printf ("%sfjathhpc", first ? "" : "|"), first = FALSE;
14884       if (mask & ELF_SPARC_HWCAP2_FJDES)
14885         printf ("%sfjdes", first ? "" : "|"), first = FALSE;
14886       if (mask & ELF_SPARC_HWCAP2_FJAES)
14887         printf ("%sfjaes", first ? "" : "|"), first = FALSE;
14888     }
14889   else
14890     fputc ('0', stdout);
14891   fputc ('\n', stdout);
14892 }
14893
14894 static unsigned char *
14895 display_sparc_gnu_attribute (unsigned char * p,
14896                              unsigned int tag,
14897                              const unsigned char * const end)
14898 {
14899   unsigned int len;
14900   int val;
14901
14902   if (tag == Tag_GNU_Sparc_HWCAPS)
14903     {
14904       val = read_uleb128 (p, &len, end);
14905       p += len;
14906       printf ("  Tag_GNU_Sparc_HWCAPS: ");
14907       display_sparc_hwcaps (val);
14908       return p;
14909     }
14910   if (tag == Tag_GNU_Sparc_HWCAPS2)
14911     {
14912       val = read_uleb128 (p, &len, end);
14913       p += len;
14914       printf ("  Tag_GNU_Sparc_HWCAPS2: ");
14915       display_sparc_hwcaps2 (val);
14916       return p;
14917     }
14918
14919   return display_tag_value (tag, p, end);
14920 }
14921
14922 static void
14923 print_mips_fp_abi_value (unsigned int val)
14924 {
14925   switch (val)
14926     {
14927     case Val_GNU_MIPS_ABI_FP_ANY:
14928       printf (_("Hard or soft float\n"));
14929       break;
14930     case Val_GNU_MIPS_ABI_FP_DOUBLE:
14931       printf (_("Hard float (double precision)\n"));
14932       break;
14933     case Val_GNU_MIPS_ABI_FP_SINGLE:
14934       printf (_("Hard float (single precision)\n"));
14935       break;
14936     case Val_GNU_MIPS_ABI_FP_SOFT:
14937       printf (_("Soft float\n"));
14938       break;
14939     case Val_GNU_MIPS_ABI_FP_OLD_64:
14940       printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
14941       break;
14942     case Val_GNU_MIPS_ABI_FP_XX:
14943       printf (_("Hard float (32-bit CPU, Any FPU)\n"));
14944       break;
14945     case Val_GNU_MIPS_ABI_FP_64:
14946       printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
14947       break;
14948     case Val_GNU_MIPS_ABI_FP_64A:
14949       printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
14950       break;
14951     case Val_GNU_MIPS_ABI_FP_NAN2008:
14952       printf (_("NaN 2008 compatibility\n"));
14953       break;
14954     default:
14955       printf ("??? (%d)\n", val);
14956       break;
14957     }
14958 }
14959
14960 static unsigned char *
14961 display_mips_gnu_attribute (unsigned char * p,
14962                             unsigned int tag,
14963                             const unsigned char * const end)
14964 {
14965   if (tag == Tag_GNU_MIPS_ABI_FP)
14966     {
14967       unsigned int len;
14968       unsigned int val;
14969
14970       val = read_uleb128 (p, &len, end);
14971       p += len;
14972       printf ("  Tag_GNU_MIPS_ABI_FP: ");
14973
14974       print_mips_fp_abi_value (val);
14975
14976       return p;
14977    }
14978
14979   if (tag == Tag_GNU_MIPS_ABI_MSA)
14980     {
14981       unsigned int len;
14982       unsigned int val;
14983
14984       val = read_uleb128 (p, &len, end);
14985       p += len;
14986       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
14987
14988       switch (val)
14989         {
14990         case Val_GNU_MIPS_ABI_MSA_ANY:
14991           printf (_("Any MSA or not\n"));
14992           break;
14993         case Val_GNU_MIPS_ABI_MSA_128:
14994           printf (_("128-bit MSA\n"));
14995           break;
14996         default:
14997           printf ("??? (%d)\n", val);
14998           break;
14999         }
15000       return p;
15001     }
15002
15003   return display_tag_value (tag & 1, p, end);
15004 }
15005
15006 static unsigned char *
15007 display_tic6x_attribute (unsigned char * p,
15008                          const unsigned char * const end)
15009 {
15010   unsigned int tag;
15011   unsigned int len;
15012   int val;
15013
15014   tag = read_uleb128 (p, &len, end);
15015   p += len;
15016
15017   switch (tag)
15018     {
15019     case Tag_ISA:
15020       val = read_uleb128 (p, &len, end);
15021       p += len;
15022       printf ("  Tag_ISA: ");
15023
15024       switch (val)
15025         {
15026         case C6XABI_Tag_ISA_none:
15027           printf (_("None\n"));
15028           break;
15029         case C6XABI_Tag_ISA_C62X:
15030           printf ("C62x\n");
15031           break;
15032         case C6XABI_Tag_ISA_C67X:
15033           printf ("C67x\n");
15034           break;
15035         case C6XABI_Tag_ISA_C67XP:
15036           printf ("C67x+\n");
15037           break;
15038         case C6XABI_Tag_ISA_C64X:
15039           printf ("C64x\n");
15040           break;
15041         case C6XABI_Tag_ISA_C64XP:
15042           printf ("C64x+\n");
15043           break;
15044         case C6XABI_Tag_ISA_C674X:
15045           printf ("C674x\n");
15046           break;
15047         default:
15048           printf ("??? (%d)\n", val);
15049           break;
15050         }
15051       return p;
15052
15053     case Tag_ABI_wchar_t:
15054       val = read_uleb128 (p, &len, end);
15055       p += len;
15056       printf ("  Tag_ABI_wchar_t: ");
15057       switch (val)
15058         {
15059         case 0:
15060           printf (_("Not used\n"));
15061           break;
15062         case 1:
15063           printf (_("2 bytes\n"));
15064           break;
15065         case 2:
15066           printf (_("4 bytes\n"));
15067           break;
15068         default:
15069           printf ("??? (%d)\n", val);
15070           break;
15071         }
15072       return p;
15073
15074     case Tag_ABI_stack_align_needed:
15075       val = read_uleb128 (p, &len, end);
15076       p += len;
15077       printf ("  Tag_ABI_stack_align_needed: ");
15078       switch (val)
15079         {
15080         case 0:
15081           printf (_("8-byte\n"));
15082           break;
15083         case 1:
15084           printf (_("16-byte\n"));
15085           break;
15086         default:
15087           printf ("??? (%d)\n", val);
15088           break;
15089         }
15090       return p;
15091
15092     case Tag_ABI_stack_align_preserved:
15093       val = read_uleb128 (p, &len, end);
15094       p += len;
15095       printf ("  Tag_ABI_stack_align_preserved: ");
15096       switch (val)
15097         {
15098         case 0:
15099           printf (_("8-byte\n"));
15100           break;
15101         case 1:
15102           printf (_("16-byte\n"));
15103           break;
15104         default:
15105           printf ("??? (%d)\n", val);
15106           break;
15107         }
15108       return p;
15109
15110     case Tag_ABI_DSBT:
15111       val = read_uleb128 (p, &len, end);
15112       p += len;
15113       printf ("  Tag_ABI_DSBT: ");
15114       switch (val)
15115         {
15116         case 0:
15117           printf (_("DSBT addressing not used\n"));
15118           break;
15119         case 1:
15120           printf (_("DSBT addressing used\n"));
15121           break;
15122         default:
15123           printf ("??? (%d)\n", val);
15124           break;
15125         }
15126       return p;
15127
15128     case Tag_ABI_PID:
15129       val = read_uleb128 (p, &len, end);
15130       p += len;
15131       printf ("  Tag_ABI_PID: ");
15132       switch (val)
15133         {
15134         case 0:
15135           printf (_("Data addressing position-dependent\n"));
15136           break;
15137         case 1:
15138           printf (_("Data addressing position-independent, GOT near DP\n"));
15139           break;
15140         case 2:
15141           printf (_("Data addressing position-independent, GOT far from DP\n"));
15142           break;
15143         default:
15144           printf ("??? (%d)\n", val);
15145           break;
15146         }
15147       return p;
15148
15149     case Tag_ABI_PIC:
15150       val = read_uleb128 (p, &len, end);
15151       p += len;
15152       printf ("  Tag_ABI_PIC: ");
15153       switch (val)
15154         {
15155         case 0:
15156           printf (_("Code addressing position-dependent\n"));
15157           break;
15158         case 1:
15159           printf (_("Code addressing position-independent\n"));
15160           break;
15161         default:
15162           printf ("??? (%d)\n", val);
15163           break;
15164         }
15165       return p;
15166
15167     case Tag_ABI_array_object_alignment:
15168       val = read_uleb128 (p, &len, end);
15169       p += len;
15170       printf ("  Tag_ABI_array_object_alignment: ");
15171       switch (val)
15172         {
15173         case 0:
15174           printf (_("8-byte\n"));
15175           break;
15176         case 1:
15177           printf (_("4-byte\n"));
15178           break;
15179         case 2:
15180           printf (_("16-byte\n"));
15181           break;
15182         default:
15183           printf ("??? (%d)\n", val);
15184           break;
15185         }
15186       return p;
15187
15188     case Tag_ABI_array_object_align_expected:
15189       val = read_uleb128 (p, &len, end);
15190       p += len;
15191       printf ("  Tag_ABI_array_object_align_expected: ");
15192       switch (val)
15193         {
15194         case 0:
15195           printf (_("8-byte\n"));
15196           break;
15197         case 1:
15198           printf (_("4-byte\n"));
15199           break;
15200         case 2:
15201           printf (_("16-byte\n"));
15202           break;
15203         default:
15204           printf ("??? (%d)\n", val);
15205           break;
15206         }
15207       return p;
15208
15209     case Tag_ABI_compatibility:
15210       {
15211         val = read_uleb128 (p, &len, end);
15212         p += len;
15213         printf ("  Tag_ABI_compatibility: ");
15214         printf (_("flag = %d, vendor = "), val);
15215         if (p < end - 1)
15216           {
15217             size_t maxlen = (end - p) - 1;
15218
15219             print_symbol ((int) maxlen, (const char *) p);
15220             p += strnlen ((char *) p, maxlen) + 1;
15221           }
15222         else
15223           {
15224             printf (_("<corrupt>"));
15225             p = (unsigned char *) end;
15226           }
15227         putchar ('\n');
15228         return p;
15229       }
15230
15231     case Tag_ABI_conformance:
15232       {
15233         printf ("  Tag_ABI_conformance: \"");
15234         if (p < end - 1)
15235           {
15236             size_t maxlen = (end - p) - 1;
15237
15238             print_symbol ((int) maxlen, (const char *) p);
15239             p += strnlen ((char *) p, maxlen) + 1;
15240           }
15241         else
15242           {
15243             printf (_("<corrupt>"));
15244             p = (unsigned char *) end;
15245           }
15246         printf ("\"\n");
15247         return p;
15248       }
15249     }
15250
15251   return display_tag_value (tag, p, end);
15252 }
15253
15254 static void
15255 display_raw_attribute (unsigned char * p, unsigned char const * const end)
15256 {
15257   unsigned long addr = 0;
15258   size_t bytes = end - p;
15259
15260   assert (end >= p);
15261   while (bytes)
15262     {
15263       int j;
15264       int k;
15265       int lbytes = (bytes > 16 ? 16 : bytes);
15266
15267       printf ("  0x%8.8lx ", addr);
15268
15269       for (j = 0; j < 16; j++)
15270         {
15271           if (j < lbytes)
15272             printf ("%2.2x", p[j]);
15273           else
15274             printf ("  ");
15275
15276           if ((j & 3) == 3)
15277             printf (" ");
15278         }
15279
15280       for (j = 0; j < lbytes; j++)
15281         {
15282           k = p[j];
15283           if (k >= ' ' && k < 0x7f)
15284             printf ("%c", k);
15285           else
15286             printf (".");
15287         }
15288
15289       putchar ('\n');
15290
15291       p  += lbytes;
15292       bytes -= lbytes;
15293       addr += lbytes;
15294     }
15295
15296   putchar ('\n');
15297 }
15298
15299 static unsigned char *
15300 display_msp430x_attribute (unsigned char * p,
15301                            const unsigned char * const end)
15302 {
15303   unsigned int len;
15304   unsigned int val;
15305   unsigned int tag;
15306
15307   tag = read_uleb128 (p, & len, end);
15308   p += len;
15309
15310   switch (tag)
15311     {
15312     case OFBA_MSPABI_Tag_ISA:
15313       val = read_uleb128 (p, &len, end);
15314       p += len;
15315       printf ("  Tag_ISA: ");
15316       switch (val)
15317         {
15318         case 0: printf (_("None\n")); break;
15319         case 1: printf (_("MSP430\n")); break;
15320         case 2: printf (_("MSP430X\n")); break;
15321         default: printf ("??? (%d)\n", val); break;
15322         }
15323       break;
15324
15325     case OFBA_MSPABI_Tag_Code_Model:
15326       val = read_uleb128 (p, &len, end);
15327       p += len;
15328       printf ("  Tag_Code_Model: ");
15329       switch (val)
15330         {
15331         case 0: printf (_("None\n")); break;
15332         case 1: printf (_("Small\n")); break;
15333         case 2: printf (_("Large\n")); break;
15334         default: printf ("??? (%d)\n", val); break;
15335         }
15336       break;
15337
15338     case OFBA_MSPABI_Tag_Data_Model:
15339       val = read_uleb128 (p, &len, end);
15340       p += len;
15341       printf ("  Tag_Data_Model: ");
15342       switch (val)
15343         {
15344         case 0: printf (_("None\n")); break;
15345         case 1: printf (_("Small\n")); break;
15346         case 2: printf (_("Large\n")); break;
15347         case 3: printf (_("Restricted Large\n")); break;
15348         default: printf ("??? (%d)\n", val); break;
15349         }
15350       break;
15351
15352     default:
15353       printf (_("  <unknown tag %d>: "), tag);
15354
15355       if (tag & 1)
15356         {
15357           putchar ('"');
15358           if (p < end - 1)
15359             {
15360               size_t maxlen = (end - p) - 1;
15361
15362               print_symbol ((int) maxlen, (const char *) p);
15363               p += strnlen ((char *) p, maxlen) + 1;
15364             }
15365           else
15366             {
15367               printf (_("<corrupt>"));
15368               p = (unsigned char *) end;
15369             }
15370           printf ("\"\n");
15371         }
15372       else
15373         {
15374           val = read_uleb128 (p, &len, end);
15375           p += len;
15376           printf ("%d (0x%x)\n", val, val);
15377         }
15378       break;
15379    }
15380
15381   assert (p <= end);
15382   return p;
15383 }
15384
15385 struct riscv_attr_tag_t {
15386   const char *name;
15387   int tag;
15388 };
15389
15390 static struct riscv_attr_tag_t riscv_attr_tag[] =
15391 {
15392 #define T(tag) {"Tag_RISCV_" #tag, Tag_RISCV_##tag}
15393   T(arch),
15394   T(priv_spec),
15395   T(priv_spec_minor),
15396   T(priv_spec_revision),
15397   T(unaligned_access),
15398   T(stack_align),
15399 #undef T
15400 };
15401
15402 static unsigned char *
15403 display_riscv_attribute (unsigned char *p,
15404                          const unsigned char * const end)
15405 {
15406   unsigned int len;
15407   int val;
15408   int tag;
15409   struct riscv_attr_tag_t *attr = NULL;
15410   unsigned i;
15411
15412   tag = read_uleb128 (p, &len, end);
15413   p += len;
15414
15415   /* Find the name of attribute. */
15416   for (i = 0; i < ARRAY_SIZE (riscv_attr_tag); i++)
15417     {
15418       if (riscv_attr_tag[i].tag == tag)
15419         {
15420           attr = &riscv_attr_tag[i];
15421           break;
15422         }
15423     }
15424
15425   if (attr)
15426     printf ("  %s: ", attr->name);
15427   else
15428     return display_tag_value (tag, p, end);
15429
15430   switch (tag)
15431     {
15432     case Tag_RISCV_priv_spec:
15433     case Tag_RISCV_priv_spec_minor:
15434     case Tag_RISCV_priv_spec_revision:
15435       val = read_uleb128 (p, &len, end);
15436       p += len;
15437       printf (_("%d\n"), val);
15438       break;
15439     case Tag_RISCV_unaligned_access:
15440       val = read_uleb128 (p, &len, end);
15441       p += len;
15442       switch (val)
15443         {
15444         case 0:
15445           printf (_("No unaligned access\n"));
15446           break;
15447         case 1:
15448           printf (_("Unaligned access\n"));
15449           break;
15450         }
15451       break;
15452     case Tag_RISCV_stack_align:
15453       val = read_uleb128 (p, &len, end);
15454       p += len;
15455       printf (_("%d-bytes\n"), val);
15456       break;
15457     case Tag_RISCV_arch:
15458       p = display_tag_value (-1, p, end);
15459       break;
15460     default:
15461       return display_tag_value (tag, p, end);
15462     }
15463
15464   return p;
15465 }
15466
15467 static bfd_boolean
15468 process_attributes (Filedata * filedata,
15469                     const char * public_name,
15470                     unsigned int proc_type,
15471                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
15472                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, unsigned int, const unsigned char * const))
15473 {
15474   Elf_Internal_Shdr * sect;
15475   unsigned i;
15476   bfd_boolean res = TRUE;
15477
15478   /* Find the section header so that we get the size.  */
15479   for (i = 0, sect = filedata->section_headers;
15480        i < filedata->file_header.e_shnum;
15481        i++, sect++)
15482     {
15483       unsigned char * contents;
15484       unsigned char * p;
15485
15486       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
15487         continue;
15488
15489       contents = (unsigned char *) get_data (NULL, filedata, sect->sh_offset, 1,
15490                                              sect->sh_size, _("attributes"));
15491       if (contents == NULL)
15492         {
15493           res = FALSE;
15494           continue;
15495         }
15496
15497       p = contents;
15498       /* The first character is the version of the attributes.
15499          Currently only version 1, (aka 'A') is recognised here.  */
15500       if (*p != 'A')
15501         {
15502           printf (_("Unknown attributes version '%c'(%d) - expecting 'A'\n"), *p, *p);
15503           res = FALSE;
15504         }
15505       else
15506         {
15507           bfd_vma section_len;
15508
15509           section_len = sect->sh_size - 1;
15510           p++;
15511
15512           while (section_len > 0)
15513             {
15514               bfd_vma attr_len;
15515               unsigned int namelen;
15516               bfd_boolean public_section;
15517               bfd_boolean gnu_section;
15518
15519               if (section_len <= 4)
15520                 {
15521                   error (_("Tag section ends prematurely\n"));
15522                   res = FALSE;
15523                   break;
15524                 }
15525               attr_len = byte_get (p, 4);
15526               p += 4;
15527
15528               if (attr_len > section_len)
15529                 {
15530                   error (_("Bad attribute length (%u > %u)\n"),
15531                           (unsigned) attr_len, (unsigned) section_len);
15532                   attr_len = section_len;
15533                   res = FALSE;
15534                 }
15535               /* PR 17531: file: 001-101425-0.004  */
15536               else if (attr_len < 5)
15537                 {
15538                   error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
15539                   res = FALSE;
15540                   break;
15541                 }
15542
15543               section_len -= attr_len;
15544               attr_len -= 4;
15545
15546               namelen = strnlen ((char *) p, attr_len) + 1;
15547               if (namelen == 0 || namelen >= attr_len)
15548                 {
15549                   error (_("Corrupt attribute section name\n"));
15550                   res = FALSE;
15551                   break;
15552                 }
15553
15554               printf (_("Attribute Section: "));
15555               print_symbol (INT_MAX, (const char *) p);
15556               putchar ('\n');
15557
15558               if (public_name && streq ((char *) p, public_name))
15559                 public_section = TRUE;
15560               else
15561                 public_section = FALSE;
15562
15563               if (streq ((char *) p, "gnu"))
15564                 gnu_section = TRUE;
15565               else
15566                 gnu_section = FALSE;
15567
15568               p += namelen;
15569               attr_len -= namelen;
15570
15571               while (attr_len > 0 && p < contents + sect->sh_size)
15572                 {
15573                   int tag;
15574                   int val;
15575                   bfd_vma size;
15576                   unsigned char * end;
15577
15578                   /* PR binutils/17531: Safe handling of corrupt files.  */
15579                   if (attr_len < 6)
15580                     {
15581                       error (_("Unused bytes at end of section\n"));
15582                       res = FALSE;
15583                       section_len = 0;
15584                       break;
15585                     }
15586
15587                   tag = *(p++);
15588                   size = byte_get (p, 4);
15589                   if (size > attr_len)
15590                     {
15591                       error (_("Bad subsection length (%u > %u)\n"),
15592                               (unsigned) size, (unsigned) attr_len);
15593                       res = FALSE;
15594                       size = attr_len;
15595                     }
15596                   /* PR binutils/17531: Safe handling of corrupt files.  */
15597                   if (size < 6)
15598                     {
15599                       error (_("Bad subsection length (%u < 6)\n"),
15600                               (unsigned) size);
15601                       res = FALSE;
15602                       section_len = 0;
15603                       break;
15604                     }
15605
15606                   attr_len -= size;
15607                   end = p + size - 1;
15608                   assert (end <= contents + sect->sh_size);
15609                   p += 4;
15610
15611                   switch (tag)
15612                     {
15613                     case 1:
15614                       printf (_("File Attributes\n"));
15615                       break;
15616                     case 2:
15617                       printf (_("Section Attributes:"));
15618                       goto do_numlist;
15619                     case 3:
15620                       printf (_("Symbol Attributes:"));
15621                       /* Fall through.  */
15622                     do_numlist:
15623                       for (;;)
15624                         {
15625                           unsigned int j;
15626
15627                           val = read_uleb128 (p, &j, end);
15628                           p += j;
15629                           if (val == 0)
15630                             break;
15631                           printf (" %d", val);
15632                         }
15633                       printf ("\n");
15634                       break;
15635                     default:
15636                       printf (_("Unknown tag: %d\n"), tag);
15637                       public_section = FALSE;
15638                       break;
15639                     }
15640
15641                   if (public_section && display_pub_attribute != NULL)
15642                     {
15643                       while (p < end)
15644                         p = display_pub_attribute (p, end);
15645                       assert (p == end);
15646                     }
15647                   else if (gnu_section && display_proc_gnu_attribute != NULL)
15648                     {
15649                       while (p < end)
15650                         p = display_gnu_attribute (p,
15651                                                    display_proc_gnu_attribute,
15652                                                    end);
15653                       assert (p == end);
15654                     }
15655                   else if (p < end)
15656                     {
15657                       printf (_("  Unknown attribute:\n"));
15658                       display_raw_attribute (p, end);
15659                       p = end;
15660                     }
15661                   else
15662                     attr_len = 0;
15663                 }
15664             }
15665         }
15666
15667       free (contents);
15668     }
15669
15670   return res;
15671 }
15672
15673 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
15674    Print the Address, Access and Initial fields of an entry at VMA ADDR
15675    and return the VMA of the next entry, or -1 if there was a problem.
15676    Does not read from DATA_END or beyond.  */
15677
15678 static bfd_vma
15679 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
15680                       unsigned char * data_end)
15681 {
15682   printf ("  ");
15683   print_vma (addr, LONG_HEX);
15684   printf (" ");
15685   if (addr < pltgot + 0xfff0)
15686     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
15687   else
15688     printf ("%10s", "");
15689   printf (" ");
15690   if (data == NULL)
15691     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15692   else
15693     {
15694       bfd_vma entry;
15695       unsigned char * from = data + addr - pltgot;
15696
15697       if (from + (is_32bit_elf ? 4 : 8) > data_end)
15698         {
15699           warn (_("MIPS GOT entry extends beyond the end of available data\n"));
15700           printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
15701           return (bfd_vma) -1;
15702         }
15703       else
15704         {
15705           entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15706           print_vma (entry, LONG_HEX);
15707         }
15708     }
15709   return addr + (is_32bit_elf ? 4 : 8);
15710 }
15711
15712 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
15713    PLTGOT.  Print the Address and Initial fields of an entry at VMA
15714    ADDR and return the VMA of the next entry.  */
15715
15716 static bfd_vma
15717 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
15718 {
15719   printf ("  ");
15720   print_vma (addr, LONG_HEX);
15721   printf (" ");
15722   if (data == NULL)
15723     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
15724   else
15725     {
15726       bfd_vma entry;
15727
15728       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
15729       print_vma (entry, LONG_HEX);
15730     }
15731   return addr + (is_32bit_elf ? 4 : 8);
15732 }
15733
15734 static void
15735 print_mips_ases (unsigned int mask)
15736 {
15737   if (mask & AFL_ASE_DSP)
15738     fputs ("\n\tDSP ASE", stdout);
15739   if (mask & AFL_ASE_DSPR2)
15740     fputs ("\n\tDSP R2 ASE", stdout);
15741   if (mask & AFL_ASE_DSPR3)
15742     fputs ("\n\tDSP R3 ASE", stdout);
15743   if (mask & AFL_ASE_EVA)
15744     fputs ("\n\tEnhanced VA Scheme", stdout);
15745   if (mask & AFL_ASE_MCU)
15746     fputs ("\n\tMCU (MicroController) ASE", stdout);
15747   if (mask & AFL_ASE_MDMX)
15748     fputs ("\n\tMDMX ASE", stdout);
15749   if (mask & AFL_ASE_MIPS3D)
15750     fputs ("\n\tMIPS-3D ASE", stdout);
15751   if (mask & AFL_ASE_MT)
15752     fputs ("\n\tMT ASE", stdout);
15753   if (mask & AFL_ASE_SMARTMIPS)
15754     fputs ("\n\tSmartMIPS ASE", stdout);
15755   if (mask & AFL_ASE_VIRT)
15756     fputs ("\n\tVZ ASE", stdout);
15757   if (mask & AFL_ASE_MSA)
15758     fputs ("\n\tMSA ASE", stdout);
15759   if (mask & AFL_ASE_MIPS16)
15760     fputs ("\n\tMIPS16 ASE", stdout);
15761   if (mask & AFL_ASE_MICROMIPS)
15762     fputs ("\n\tMICROMIPS ASE", stdout);
15763   if (mask & AFL_ASE_XPA)
15764     fputs ("\n\tXPA ASE", stdout);
15765   if (mask & AFL_ASE_MIPS16E2)
15766     fputs ("\n\tMIPS16e2 ASE", stdout);
15767   if (mask & AFL_ASE_CRC)
15768     fputs ("\n\tCRC ASE", stdout);
15769   if (mask & AFL_ASE_GINV)
15770     fputs ("\n\tGINV ASE", stdout);
15771   if (mask & AFL_ASE_LOONGSON_MMI)
15772     fputs ("\n\tLoongson MMI ASE", stdout);
15773   if (mask & AFL_ASE_LOONGSON_CAM)
15774     fputs ("\n\tLoongson CAM ASE", stdout);
15775   if (mask & AFL_ASE_LOONGSON_EXT)
15776     fputs ("\n\tLoongson EXT ASE", stdout);
15777   if (mask & AFL_ASE_LOONGSON_EXT2)
15778     fputs ("\n\tLoongson EXT2 ASE", stdout);
15779   if (mask == 0)
15780     fprintf (stdout, "\n\t%s", _("None"));
15781   else if ((mask & ~AFL_ASE_MASK) != 0)
15782     fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
15783 }
15784
15785 static void
15786 print_mips_isa_ext (unsigned int isa_ext)
15787 {
15788   switch (isa_ext)
15789     {
15790     case 0:
15791       fputs (_("None"), stdout);
15792       break;
15793     case AFL_EXT_XLR:
15794       fputs ("RMI XLR", stdout);
15795       break;
15796     case AFL_EXT_OCTEON3:
15797       fputs ("Cavium Networks Octeon3", stdout);
15798       break;
15799     case AFL_EXT_OCTEON2:
15800       fputs ("Cavium Networks Octeon2", stdout);
15801       break;
15802     case AFL_EXT_OCTEONP:
15803       fputs ("Cavium Networks OcteonP", stdout);
15804       break;
15805     case AFL_EXT_OCTEON:
15806       fputs ("Cavium Networks Octeon", stdout);
15807       break;
15808     case AFL_EXT_5900:
15809       fputs ("Toshiba R5900", stdout);
15810       break;
15811     case AFL_EXT_4650:
15812       fputs ("MIPS R4650", stdout);
15813       break;
15814     case AFL_EXT_4010:
15815       fputs ("LSI R4010", stdout);
15816       break;
15817     case AFL_EXT_4100:
15818       fputs ("NEC VR4100", stdout);
15819       break;
15820     case AFL_EXT_3900:
15821       fputs ("Toshiba R3900", stdout);
15822       break;
15823     case AFL_EXT_10000:
15824       fputs ("MIPS R10000", stdout);
15825       break;
15826     case AFL_EXT_SB1:
15827       fputs ("Broadcom SB-1", stdout);
15828       break;
15829     case AFL_EXT_4111:
15830       fputs ("NEC VR4111/VR4181", stdout);
15831       break;
15832     case AFL_EXT_4120:
15833       fputs ("NEC VR4120", stdout);
15834       break;
15835     case AFL_EXT_5400:
15836       fputs ("NEC VR5400", stdout);
15837       break;
15838     case AFL_EXT_5500:
15839       fputs ("NEC VR5500", stdout);
15840       break;
15841     case AFL_EXT_LOONGSON_2E:
15842       fputs ("ST Microelectronics Loongson 2E", stdout);
15843       break;
15844     case AFL_EXT_LOONGSON_2F:
15845       fputs ("ST Microelectronics Loongson 2F", stdout);
15846       break;
15847     case AFL_EXT_INTERAPTIV_MR2:
15848       fputs ("Imagination interAptiv MR2", stdout);
15849       break;
15850     default:
15851       fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
15852     }
15853 }
15854
15855 static signed int
15856 get_mips_reg_size (int reg_size)
15857 {
15858   return (reg_size == AFL_REG_NONE) ? 0
15859          : (reg_size == AFL_REG_32) ? 32
15860          : (reg_size == AFL_REG_64) ? 64
15861          : (reg_size == AFL_REG_128) ? 128
15862          : -1;
15863 }
15864
15865 static bfd_boolean
15866 process_mips_specific (Filedata * filedata)
15867 {
15868   Elf_Internal_Dyn * entry;
15869   Elf_Internal_Shdr *sect = NULL;
15870   size_t liblist_offset = 0;
15871   size_t liblistno = 0;
15872   size_t conflictsno = 0;
15873   size_t options_offset = 0;
15874   size_t conflicts_offset = 0;
15875   size_t pltrelsz = 0;
15876   size_t pltrel = 0;
15877   bfd_vma pltgot = 0;
15878   bfd_vma mips_pltgot = 0;
15879   bfd_vma jmprel = 0;
15880   bfd_vma local_gotno = 0;
15881   bfd_vma gotsym = 0;
15882   bfd_vma symtabno = 0;
15883   bfd_boolean res = TRUE;
15884
15885   if (! process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
15886                             display_mips_gnu_attribute))
15887     res = FALSE;
15888
15889   sect = find_section (filedata, ".MIPS.abiflags");
15890
15891   if (sect != NULL)
15892     {
15893       Elf_External_ABIFlags_v0 *abiflags_ext;
15894       Elf_Internal_ABIFlags_v0 abiflags_in;
15895
15896       if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
15897         {
15898           error (_("Corrupt MIPS ABI Flags section.\n"));
15899           res = FALSE;
15900         }
15901       else
15902         {
15903           abiflags_ext = get_data (NULL, filedata, sect->sh_offset, 1,
15904                                    sect->sh_size, _("MIPS ABI Flags section"));
15905           if (abiflags_ext)
15906             {
15907               abiflags_in.version = BYTE_GET (abiflags_ext->version);
15908               abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
15909               abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
15910               abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
15911               abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
15912               abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
15913               abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
15914               abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
15915               abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
15916               abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
15917               abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
15918
15919               printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
15920               printf ("\nISA: MIPS%d", abiflags_in.isa_level);
15921               if (abiflags_in.isa_rev > 1)
15922                 printf ("r%d", abiflags_in.isa_rev);
15923               printf ("\nGPR size: %d",
15924                       get_mips_reg_size (abiflags_in.gpr_size));
15925               printf ("\nCPR1 size: %d",
15926                       get_mips_reg_size (abiflags_in.cpr1_size));
15927               printf ("\nCPR2 size: %d",
15928                       get_mips_reg_size (abiflags_in.cpr2_size));
15929               fputs ("\nFP ABI: ", stdout);
15930               print_mips_fp_abi_value (abiflags_in.fp_abi);
15931               fputs ("ISA Extension: ", stdout);
15932               print_mips_isa_ext (abiflags_in.isa_ext);
15933               fputs ("\nASEs:", stdout);
15934               print_mips_ases (abiflags_in.ases);
15935               printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
15936               printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
15937               fputc ('\n', stdout);
15938               free (abiflags_ext);
15939             }
15940         }
15941     }
15942
15943   /* We have a lot of special sections.  Thanks SGI!  */
15944   if (dynamic_section == NULL)
15945     {
15946       /* No dynamic information available.  See if there is static GOT.  */
15947       sect = find_section (filedata, ".got");
15948       if (sect != NULL)
15949         {
15950           unsigned char *data_end;
15951           unsigned char *data;
15952           bfd_vma ent, end;
15953           int addr_size;
15954
15955           pltgot = sect->sh_addr;
15956
15957           ent = pltgot;
15958           addr_size = (is_32bit_elf ? 4 : 8);
15959           end = pltgot + sect->sh_size;
15960
15961           data = (unsigned char *) get_data (NULL, filedata, sect->sh_offset,
15962                                              end - pltgot, 1,
15963                                              _("Global Offset Table data"));
15964           /* PR 12855: Null data is handled gracefully throughout.  */
15965           data_end = data + (end - pltgot);
15966
15967           printf (_("\nStatic GOT:\n"));
15968           printf (_(" Canonical gp value: "));
15969           print_vma (ent + 0x7ff0, LONG_HEX);
15970           printf ("\n\n");
15971
15972           /* In a dynamic binary GOT[0] is reserved for the dynamic
15973              loader to store the lazy resolver pointer, however in
15974              a static binary it may well have been omitted and GOT
15975              reduced to a table of addresses.
15976              PR 21344: Check for the entry being fully available
15977              before fetching it.  */
15978           if (data
15979               && data + ent - pltgot + addr_size <= data_end
15980               && byte_get (data + ent - pltgot, addr_size) == 0)
15981             {
15982               printf (_(" Reserved entries:\n"));
15983               printf (_("  %*s %10s %*s\n"),
15984                       addr_size * 2, _("Address"), _("Access"),
15985                       addr_size * 2, _("Value"));
15986               ent = print_mips_got_entry (data, pltgot, ent, data_end);
15987               printf ("\n");
15988               if (ent == (bfd_vma) -1)
15989                 goto sgot_print_fail;
15990
15991               /* Check for the MSB of GOT[1] being set, identifying a
15992                  GNU object.  This entry will be used by some runtime
15993                  loaders, to store the module pointer.  Otherwise this
15994                  is an ordinary local entry.
15995                  PR 21344: Check for the entry being fully available
15996                  before fetching it.  */
15997               if (data
15998                   && data + ent - pltgot + addr_size <= data_end
15999                   && (byte_get (data + ent - pltgot, addr_size)
16000                       >> (addr_size * 8 - 1)) != 0)
16001                 {
16002                   ent = print_mips_got_entry (data, pltgot, ent, data_end);
16003                   printf ("\n");
16004                   if (ent == (bfd_vma) -1)
16005                     goto sgot_print_fail;
16006                 }
16007               printf ("\n");
16008             }
16009
16010           if (data != NULL && ent < end)
16011             {
16012               printf (_(" Local entries:\n"));
16013               printf ("  %*s %10s %*s\n",
16014                       addr_size * 2, _("Address"), _("Access"),
16015                       addr_size * 2, _("Value"));
16016               while (ent < end)
16017                 {
16018                   ent = print_mips_got_entry (data, pltgot, ent, data_end);
16019                   printf ("\n");
16020                   if (ent == (bfd_vma) -1)
16021                     goto sgot_print_fail;
16022                 }
16023               printf ("\n");
16024             }
16025
16026         sgot_print_fail:
16027           if (data)
16028             free (data);
16029         }
16030       return res;
16031     }
16032
16033   for (entry = dynamic_section;
16034        /* PR 17531 file: 012-50589-0.004.  */
16035        entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
16036        ++entry)
16037     switch (entry->d_tag)
16038       {
16039       case DT_MIPS_LIBLIST:
16040         liblist_offset
16041           = offset_from_vma (filedata, entry->d_un.d_val,
16042                              liblistno * sizeof (Elf32_External_Lib));
16043         break;
16044       case DT_MIPS_LIBLISTNO:
16045         liblistno = entry->d_un.d_val;
16046         break;
16047       case DT_MIPS_OPTIONS:
16048         options_offset = offset_from_vma (filedata, entry->d_un.d_val, 0);
16049         break;
16050       case DT_MIPS_CONFLICT:
16051         conflicts_offset
16052           = offset_from_vma (filedata, entry->d_un.d_val,
16053                              conflictsno * sizeof (Elf32_External_Conflict));
16054         break;
16055       case DT_MIPS_CONFLICTNO:
16056         conflictsno = entry->d_un.d_val;
16057         break;
16058       case DT_PLTGOT:
16059         pltgot = entry->d_un.d_ptr;
16060         break;
16061       case DT_MIPS_LOCAL_GOTNO:
16062         local_gotno = entry->d_un.d_val;
16063         break;
16064       case DT_MIPS_GOTSYM:
16065         gotsym = entry->d_un.d_val;
16066         break;
16067       case DT_MIPS_SYMTABNO:
16068         symtabno = entry->d_un.d_val;
16069         break;
16070       case DT_MIPS_PLTGOT:
16071         mips_pltgot = entry->d_un.d_ptr;
16072         break;
16073       case DT_PLTREL:
16074         pltrel = entry->d_un.d_val;
16075         break;
16076       case DT_PLTRELSZ:
16077         pltrelsz = entry->d_un.d_val;
16078         break;
16079       case DT_JMPREL:
16080         jmprel = entry->d_un.d_ptr;
16081         break;
16082       default:
16083         break;
16084       }
16085
16086   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
16087     {
16088       Elf32_External_Lib * elib;
16089       size_t cnt;
16090
16091       elib = (Elf32_External_Lib *) get_data (NULL, filedata, liblist_offset,
16092                                               liblistno,
16093                                               sizeof (Elf32_External_Lib),
16094                                               _("liblist section data"));
16095       if (elib)
16096         {
16097           printf (ngettext ("\nSection '.liblist' contains %lu entry:\n",
16098                             "\nSection '.liblist' contains %lu entries:\n",
16099                             (unsigned long) liblistno),
16100                   (unsigned long) liblistno);
16101           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
16102                  stdout);
16103
16104           for (cnt = 0; cnt < liblistno; ++cnt)
16105             {
16106               Elf32_Lib liblist;
16107               time_t atime;
16108               char timebuf[128];
16109               struct tm * tmp;
16110
16111               liblist.l_name = BYTE_GET (elib[cnt].l_name);
16112               atime = BYTE_GET (elib[cnt].l_time_stamp);
16113               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16114               liblist.l_version = BYTE_GET (elib[cnt].l_version);
16115               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16116
16117               tmp = gmtime (&atime);
16118               snprintf (timebuf, sizeof (timebuf),
16119                         "%04u-%02u-%02uT%02u:%02u:%02u",
16120                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16121                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16122
16123               printf ("%3lu: ", (unsigned long) cnt);
16124               if (VALID_DYNAMIC_NAME (liblist.l_name))
16125                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
16126               else
16127                 printf (_("<corrupt: %9ld>"), liblist.l_name);
16128               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
16129                       liblist.l_version);
16130
16131               if (liblist.l_flags == 0)
16132                 puts (_(" NONE"));
16133               else
16134                 {
16135                   static const struct
16136                   {
16137                     const char * name;
16138                     int bit;
16139                   }
16140                   l_flags_vals[] =
16141                   {
16142                     { " EXACT_MATCH", LL_EXACT_MATCH },
16143                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
16144                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
16145                     { " EXPORTS", LL_EXPORTS },
16146                     { " DELAY_LOAD", LL_DELAY_LOAD },
16147                     { " DELTA", LL_DELTA }
16148                   };
16149                   int flags = liblist.l_flags;
16150                   size_t fcnt;
16151
16152                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
16153                     if ((flags & l_flags_vals[fcnt].bit) != 0)
16154                       {
16155                         fputs (l_flags_vals[fcnt].name, stdout);
16156                         flags ^= l_flags_vals[fcnt].bit;
16157                       }
16158                   if (flags != 0)
16159                     printf (" %#x", (unsigned int) flags);
16160
16161                   puts ("");
16162                 }
16163             }
16164
16165           free (elib);
16166         }
16167       else
16168         res = FALSE;
16169     }
16170
16171   if (options_offset != 0)
16172     {
16173       Elf_External_Options * eopt;
16174       Elf_Internal_Options * iopt;
16175       Elf_Internal_Options * option;
16176       size_t offset;
16177       int cnt;
16178       sect = filedata->section_headers;
16179
16180       /* Find the section header so that we get the size.  */
16181       sect = find_section_by_type (filedata, SHT_MIPS_OPTIONS);
16182       /* PR 17533 file: 012-277276-0.004.  */
16183       if (sect == NULL)
16184         {
16185           error (_("No MIPS_OPTIONS header found\n"));
16186           return FALSE;
16187         }
16188
16189       eopt = (Elf_External_Options *) get_data (NULL, filedata, options_offset, 1,
16190                                                 sect->sh_size, _("options"));
16191       if (eopt)
16192         {
16193           iopt = (Elf_Internal_Options *)
16194               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
16195           if (iopt == NULL)
16196             {
16197               error (_("Out of memory allocating space for MIPS options\n"));
16198               return FALSE;
16199             }
16200
16201           offset = cnt = 0;
16202           option = iopt;
16203
16204           while (offset <= sect->sh_size - sizeof (* eopt))
16205             {
16206               Elf_External_Options * eoption;
16207
16208               eoption = (Elf_External_Options *) ((char *) eopt + offset);
16209
16210               option->kind = BYTE_GET (eoption->kind);
16211               option->size = BYTE_GET (eoption->size);
16212               option->section = BYTE_GET (eoption->section);
16213               option->info = BYTE_GET (eoption->info);
16214
16215               /* PR 17531: file: ffa0fa3b.  */
16216               if (option->size < sizeof (* eopt)
16217                   || offset + option->size > sect->sh_size)
16218                 {
16219                   error (_("Invalid size (%u) for MIPS option\n"), option->size);
16220                   return FALSE;
16221                 }
16222               offset += option->size;
16223
16224               ++option;
16225               ++cnt;
16226             }
16227
16228           printf (ngettext ("\nSection '%s' contains %d entry:\n",
16229                             "\nSection '%s' contains %d entries:\n",
16230                             cnt),
16231                   printable_section_name (filedata, sect), cnt);
16232
16233           option = iopt;
16234           offset = 0;
16235
16236           while (cnt-- > 0)
16237             {
16238               size_t len;
16239
16240               switch (option->kind)
16241                 {
16242                 case ODK_NULL:
16243                   /* This shouldn't happen.  */
16244                   printf (" NULL       %d %lx", option->section, option->info);
16245                   break;
16246                 case ODK_REGINFO:
16247                   printf (" REGINFO    ");
16248                   if (filedata->file_header.e_machine == EM_MIPS)
16249                     {
16250                       /* 32bit form.  */
16251                       Elf32_External_RegInfo * ereg;
16252                       Elf32_RegInfo reginfo;
16253
16254                       ereg = (Elf32_External_RegInfo *) (option + 1);
16255                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
16256                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16257                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16258                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16259                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16260                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
16261
16262                       printf ("GPR %08lx  GP 0x%lx\n",
16263                               reginfo.ri_gprmask,
16264                               (unsigned long) reginfo.ri_gp_value);
16265                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
16266                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16267                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16268                     }
16269                   else
16270                     {
16271                       /* 64 bit form.  */
16272                       Elf64_External_RegInfo * ereg;
16273                       Elf64_Internal_RegInfo reginfo;
16274
16275                       ereg = (Elf64_External_RegInfo *) (option + 1);
16276                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
16277                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
16278                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
16279                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
16280                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
16281                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
16282
16283                       printf ("GPR %08lx  GP 0x",
16284                               reginfo.ri_gprmask);
16285                       printf_vma (reginfo.ri_gp_value);
16286                       printf ("\n");
16287
16288                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
16289                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
16290                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
16291                     }
16292                   ++option;
16293                   continue;
16294                 case ODK_EXCEPTIONS:
16295                   fputs (" EXCEPTIONS fpe_min(", stdout);
16296                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
16297                   fputs (") fpe_max(", stdout);
16298                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
16299                   fputs (")", stdout);
16300
16301                   if (option->info & OEX_PAGE0)
16302                     fputs (" PAGE0", stdout);
16303                   if (option->info & OEX_SMM)
16304                     fputs (" SMM", stdout);
16305                   if (option->info & OEX_FPDBUG)
16306                     fputs (" FPDBUG", stdout);
16307                   if (option->info & OEX_DISMISS)
16308                     fputs (" DISMISS", stdout);
16309                   break;
16310                 case ODK_PAD:
16311                   fputs (" PAD       ", stdout);
16312                   if (option->info & OPAD_PREFIX)
16313                     fputs (" PREFIX", stdout);
16314                   if (option->info & OPAD_POSTFIX)
16315                     fputs (" POSTFIX", stdout);
16316                   if (option->info & OPAD_SYMBOL)
16317                     fputs (" SYMBOL", stdout);
16318                   break;
16319                 case ODK_HWPATCH:
16320                   fputs (" HWPATCH   ", stdout);
16321                   if (option->info & OHW_R4KEOP)
16322                     fputs (" R4KEOP", stdout);
16323                   if (option->info & OHW_R8KPFETCH)
16324                     fputs (" R8KPFETCH", stdout);
16325                   if (option->info & OHW_R5KEOP)
16326                     fputs (" R5KEOP", stdout);
16327                   if (option->info & OHW_R5KCVTL)
16328                     fputs (" R5KCVTL", stdout);
16329                   break;
16330                 case ODK_FILL:
16331                   fputs (" FILL       ", stdout);
16332                   /* XXX Print content of info word?  */
16333                   break;
16334                 case ODK_TAGS:
16335                   fputs (" TAGS       ", stdout);
16336                   /* XXX Print content of info word?  */
16337                   break;
16338                 case ODK_HWAND:
16339                   fputs (" HWAND     ", stdout);
16340                   if (option->info & OHWA0_R4KEOP_CHECKED)
16341                     fputs (" R4KEOP_CHECKED", stdout);
16342                   if (option->info & OHWA0_R4KEOP_CLEAN)
16343                     fputs (" R4KEOP_CLEAN", stdout);
16344                   break;
16345                 case ODK_HWOR:
16346                   fputs (" HWOR      ", stdout);
16347                   if (option->info & OHWA0_R4KEOP_CHECKED)
16348                     fputs (" R4KEOP_CHECKED", stdout);
16349                   if (option->info & OHWA0_R4KEOP_CLEAN)
16350                     fputs (" R4KEOP_CLEAN", stdout);
16351                   break;
16352                 case ODK_GP_GROUP:
16353                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
16354                           option->info & OGP_GROUP,
16355                           (option->info & OGP_SELF) >> 16);
16356                   break;
16357                 case ODK_IDENT:
16358                   printf (" IDENT     %#06lx  self-contained %#06lx",
16359                           option->info & OGP_GROUP,
16360                           (option->info & OGP_SELF) >> 16);
16361                   break;
16362                 default:
16363                   /* This shouldn't happen.  */
16364                   printf (" %3d ???     %d %lx",
16365                           option->kind, option->section, option->info);
16366                   break;
16367                 }
16368
16369               len = sizeof (* eopt);
16370               while (len < option->size)
16371                 {
16372                   unsigned char datum = * ((unsigned char *) eopt + offset + len);
16373
16374                   if (ISPRINT (datum))
16375                     printf ("%c", datum);
16376                   else
16377                     printf ("\\%03o", datum);
16378                   len ++;
16379                 }
16380               fputs ("\n", stdout);
16381
16382               offset += option->size;
16383               ++option;
16384             }
16385
16386           free (eopt);
16387         }
16388       else
16389         res = FALSE;
16390     }
16391
16392   if (conflicts_offset != 0 && conflictsno != 0)
16393     {
16394       Elf32_Conflict * iconf;
16395       size_t cnt;
16396
16397       if (dynamic_symbols == NULL)
16398         {
16399           error (_("conflict list found without a dynamic symbol table\n"));
16400           return FALSE;
16401         }
16402
16403       /* PR 21345 - print a slightly more helpful error message
16404          if we are sure that the cmalloc will fail.  */
16405       if (conflictsno * sizeof (* iconf) > filedata->file_size)
16406         {
16407           error (_("Overlarge number of conflicts detected: %lx\n"),
16408                  (long) conflictsno);
16409           return FALSE;
16410         }
16411
16412       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
16413       if (iconf == NULL)
16414         {
16415           error (_("Out of memory allocating space for dynamic conflicts\n"));
16416           return FALSE;
16417         }
16418
16419       if (is_32bit_elf)
16420         {
16421           Elf32_External_Conflict * econf32;
16422
16423           econf32 = (Elf32_External_Conflict *)
16424               get_data (NULL, filedata, conflicts_offset, conflictsno,
16425                         sizeof (* econf32), _("conflict"));
16426           if (!econf32)
16427             return FALSE;
16428
16429           for (cnt = 0; cnt < conflictsno; ++cnt)
16430             iconf[cnt] = BYTE_GET (econf32[cnt]);
16431
16432           free (econf32);
16433         }
16434       else
16435         {
16436           Elf64_External_Conflict * econf64;
16437
16438           econf64 = (Elf64_External_Conflict *)
16439               get_data (NULL, filedata, conflicts_offset, conflictsno,
16440                         sizeof (* econf64), _("conflict"));
16441           if (!econf64)
16442             return FALSE;
16443
16444           for (cnt = 0; cnt < conflictsno; ++cnt)
16445             iconf[cnt] = BYTE_GET (econf64[cnt]);
16446
16447           free (econf64);
16448         }
16449
16450       printf (ngettext ("\nSection '.conflict' contains %lu entry:\n",
16451                         "\nSection '.conflict' contains %lu entries:\n",
16452                         (unsigned long) conflictsno),
16453               (unsigned long) conflictsno);
16454       puts (_("  Num:    Index       Value  Name"));
16455
16456       for (cnt = 0; cnt < conflictsno; ++cnt)
16457         {
16458           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
16459
16460           if (iconf[cnt] >= num_dynamic_syms)
16461             printf (_("<corrupt symbol index>"));
16462           else
16463             {
16464               Elf_Internal_Sym * psym;
16465
16466               psym = & dynamic_symbols[iconf[cnt]];
16467               print_vma (psym->st_value, FULL_HEX);
16468               putchar (' ');
16469               if (VALID_DYNAMIC_NAME (psym->st_name))
16470                 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
16471               else
16472                 printf (_("<corrupt: %14ld>"), psym->st_name);
16473             }
16474           putchar ('\n');
16475         }
16476
16477       free (iconf);
16478     }
16479
16480   if (pltgot != 0 && local_gotno != 0)
16481     {
16482       bfd_vma ent, local_end, global_end;
16483       size_t i, offset;
16484       unsigned char * data;
16485       unsigned char * data_end;
16486       int addr_size;
16487
16488       ent = pltgot;
16489       addr_size = (is_32bit_elf ? 4 : 8);
16490       local_end = pltgot + local_gotno * addr_size;
16491
16492       /* PR binutils/17533 file: 012-111227-0.004  */
16493       if (symtabno < gotsym)
16494         {
16495           error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
16496                  (unsigned long) gotsym, (unsigned long) symtabno);
16497           return FALSE;
16498         }
16499
16500       global_end = local_end + (symtabno - gotsym) * addr_size;
16501       /* PR 17531: file: 54c91a34.  */
16502       if (global_end < local_end)
16503         {
16504           error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
16505           return FALSE;
16506         }
16507
16508       offset = offset_from_vma (filedata, pltgot, global_end - pltgot);
16509       data = (unsigned char *) get_data (NULL, filedata, offset,
16510                                          global_end - pltgot, 1,
16511                                          _("Global Offset Table data"));
16512       /* PR 12855: Null data is handled gracefully throughout.  */
16513       data_end = data + (global_end - pltgot);
16514
16515       printf (_("\nPrimary GOT:\n"));
16516       printf (_(" Canonical gp value: "));
16517       print_vma (pltgot + 0x7ff0, LONG_HEX);
16518       printf ("\n\n");
16519
16520       printf (_(" Reserved entries:\n"));
16521       printf (_("  %*s %10s %*s Purpose\n"),
16522               addr_size * 2, _("Address"), _("Access"),
16523               addr_size * 2, _("Initial"));
16524       ent = print_mips_got_entry (data, pltgot, ent, data_end);
16525       printf (_(" Lazy resolver\n"));
16526       if (ent == (bfd_vma) -1)
16527         goto got_print_fail;
16528
16529       /* Check for the MSB of GOT[1] being set, denoting a GNU object.
16530          This entry will be used by some runtime loaders, to store the
16531          module pointer.  Otherwise this is an ordinary local entry.
16532          PR 21344: Check for the entry being fully available before
16533          fetching it.  */
16534       if (data
16535           && data + ent - pltgot + addr_size <= data_end
16536           && (byte_get (data + ent - pltgot, addr_size)
16537               >> (addr_size * 8 - 1)) != 0)
16538         {
16539           ent = print_mips_got_entry (data, pltgot, ent, data_end);
16540           printf (_(" Module pointer (GNU extension)\n"));
16541           if (ent == (bfd_vma) -1)
16542             goto got_print_fail;
16543         }
16544       printf ("\n");
16545
16546       if (data != NULL && ent < local_end)
16547         {
16548           printf (_(" Local entries:\n"));
16549           printf ("  %*s %10s %*s\n",
16550                   addr_size * 2, _("Address"), _("Access"),
16551                   addr_size * 2, _("Initial"));
16552           while (ent < local_end)
16553             {
16554               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16555               printf ("\n");
16556               if (ent == (bfd_vma) -1)
16557                 goto got_print_fail;
16558             }
16559           printf ("\n");
16560         }
16561
16562       if (data != NULL && gotsym < symtabno)
16563         {
16564           int sym_width;
16565
16566           printf (_(" Global entries:\n"));
16567           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
16568                   addr_size * 2, _("Address"),
16569                   _("Access"),
16570                   addr_size * 2, _("Initial"),
16571                   addr_size * 2, _("Sym.Val."),
16572                   _("Type"),
16573                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
16574                   _("Ndx"), _("Name"));
16575
16576           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
16577
16578           for (i = gotsym; i < symtabno; i++)
16579             {
16580               ent = print_mips_got_entry (data, pltgot, ent, data_end);
16581               printf (" ");
16582
16583               if (dynamic_symbols == NULL)
16584                 printf (_("<no dynamic symbols>"));
16585               else if (i < num_dynamic_syms)
16586                 {
16587                   Elf_Internal_Sym * psym = dynamic_symbols + i;
16588
16589                   print_vma (psym->st_value, LONG_HEX);
16590                   printf (" %-7s %3s ",
16591                           get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16592                           get_symbol_index_type (filedata, psym->st_shndx));
16593
16594                   if (VALID_DYNAMIC_NAME (psym->st_name))
16595                     print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16596                   else
16597                     printf (_("<corrupt: %14ld>"), psym->st_name);
16598                 }
16599               else
16600                 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
16601                         (unsigned long) i);
16602
16603               printf ("\n");
16604               if (ent == (bfd_vma) -1)
16605                 break;
16606             }
16607           printf ("\n");
16608         }
16609
16610     got_print_fail:
16611       if (data)
16612         free (data);
16613     }
16614
16615   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
16616     {
16617       bfd_vma ent, end;
16618       size_t offset, rel_offset;
16619       unsigned long count, i;
16620       unsigned char * data;
16621       int addr_size, sym_width;
16622       Elf_Internal_Rela * rels;
16623
16624       rel_offset = offset_from_vma (filedata, jmprel, pltrelsz);
16625       if (pltrel == DT_RELA)
16626         {
16627           if (!slurp_rela_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16628             return FALSE;
16629         }
16630       else
16631         {
16632           if (!slurp_rel_relocs (filedata, rel_offset, pltrelsz, &rels, &count))
16633             return FALSE;
16634         }
16635
16636       ent = mips_pltgot;
16637       addr_size = (is_32bit_elf ? 4 : 8);
16638       end = mips_pltgot + (2 + count) * addr_size;
16639
16640       offset = offset_from_vma (filedata, mips_pltgot, end - mips_pltgot);
16641       data = (unsigned char *) get_data (NULL, filedata, offset, end - mips_pltgot,
16642                                          1, _("Procedure Linkage Table data"));
16643       if (data == NULL)
16644         return FALSE;
16645
16646       printf ("\nPLT GOT:\n\n");
16647       printf (_(" Reserved entries:\n"));
16648       printf (_("  %*s %*s Purpose\n"),
16649               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
16650       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16651       printf (_(" PLT lazy resolver\n"));
16652       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16653       printf (_(" Module pointer\n"));
16654       printf ("\n");
16655
16656       printf (_(" Entries:\n"));
16657       printf ("  %*s %*s %*s %-7s %3s %s\n",
16658               addr_size * 2, _("Address"),
16659               addr_size * 2, _("Initial"),
16660               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
16661       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
16662       for (i = 0; i < count; i++)
16663         {
16664           unsigned long idx = get_reloc_symindex (rels[i].r_info);
16665
16666           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
16667           printf (" ");
16668
16669           if (idx >= num_dynamic_syms)
16670             printf (_("<corrupt symbol index: %lu>"), idx);
16671           else
16672             {
16673               Elf_Internal_Sym * psym = dynamic_symbols + idx;
16674
16675               print_vma (psym->st_value, LONG_HEX);
16676               printf (" %-7s %3s ",
16677                       get_symbol_type (filedata, ELF_ST_TYPE (psym->st_info)),
16678                       get_symbol_index_type (filedata, psym->st_shndx));
16679               if (VALID_DYNAMIC_NAME (psym->st_name))
16680                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
16681               else
16682                 printf (_("<corrupt: %14ld>"), psym->st_name);
16683             }
16684           printf ("\n");
16685         }
16686       printf ("\n");
16687
16688       if (data)
16689         free (data);
16690       free (rels);
16691     }
16692
16693   return res;
16694 }
16695
16696 static bfd_boolean
16697 process_nds32_specific (Filedata * filedata)
16698 {
16699   Elf_Internal_Shdr *sect = NULL;
16700
16701   sect = find_section (filedata, ".nds32_e_flags");
16702   if (sect != NULL)
16703     {
16704       unsigned int *flag;
16705
16706       printf ("\nNDS32 elf flags section:\n");
16707       flag = get_data (NULL, filedata, sect->sh_offset, 1,
16708                        sect->sh_size, _("NDS32 elf flags section"));
16709
16710       if (! flag)
16711         return FALSE;
16712
16713       switch ((*flag) & 0x3)
16714         {
16715         case 0:
16716           printf ("(VEC_SIZE):\tNo entry.\n");
16717           break;
16718         case 1:
16719           printf ("(VEC_SIZE):\t4 bytes\n");
16720           break;
16721         case 2:
16722           printf ("(VEC_SIZE):\t16 bytes\n");
16723           break;
16724         case 3:
16725           printf ("(VEC_SIZE):\treserved\n");
16726           break;
16727         }
16728     }
16729
16730   return TRUE;
16731 }
16732
16733 static bfd_boolean
16734 process_gnu_liblist (Filedata * filedata)
16735 {
16736   Elf_Internal_Shdr * section;
16737   Elf_Internal_Shdr * string_sec;
16738   Elf32_External_Lib * elib;
16739   char * strtab;
16740   size_t strtab_size;
16741   size_t cnt;
16742   unsigned long num_liblist;
16743   unsigned i;
16744   bfd_boolean res = TRUE;
16745
16746   if (! do_arch)
16747     return TRUE;
16748
16749   for (i = 0, section = filedata->section_headers;
16750        i < filedata->file_header.e_shnum;
16751        i++, section++)
16752     {
16753       switch (section->sh_type)
16754         {
16755         case SHT_GNU_LIBLIST:
16756           if (section->sh_link >= filedata->file_header.e_shnum)
16757             break;
16758
16759           elib = (Elf32_External_Lib *)
16760               get_data (NULL, filedata, section->sh_offset, 1, section->sh_size,
16761                         _("liblist section data"));
16762
16763           if (elib == NULL)
16764             {
16765               res = FALSE;
16766               break;
16767             }
16768
16769           string_sec = filedata->section_headers + section->sh_link;
16770           strtab = (char *) get_data (NULL, filedata, string_sec->sh_offset, 1,
16771                                       string_sec->sh_size,
16772                                       _("liblist string table"));
16773           if (strtab == NULL
16774               || section->sh_entsize != sizeof (Elf32_External_Lib))
16775             {
16776               free (elib);
16777               free (strtab);
16778               res = FALSE;
16779               break;
16780             }
16781           strtab_size = string_sec->sh_size;
16782
16783           num_liblist = section->sh_size / sizeof (Elf32_External_Lib);
16784           printf (ngettext ("\nLibrary list section '%s' contains %lu entries:\n",
16785                             "\nLibrary list section '%s' contains %lu entries:\n",
16786                             num_liblist),
16787                   printable_section_name (filedata, section),
16788                   num_liblist);
16789
16790           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
16791
16792           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
16793                ++cnt)
16794             {
16795               Elf32_Lib liblist;
16796               time_t atime;
16797               char timebuf[128];
16798               struct tm * tmp;
16799
16800               liblist.l_name = BYTE_GET (elib[cnt].l_name);
16801               atime = BYTE_GET (elib[cnt].l_time_stamp);
16802               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
16803               liblist.l_version = BYTE_GET (elib[cnt].l_version);
16804               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
16805
16806               tmp = gmtime (&atime);
16807               snprintf (timebuf, sizeof (timebuf),
16808                         "%04u-%02u-%02uT%02u:%02u:%02u",
16809                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
16810                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
16811
16812               printf ("%3lu: ", (unsigned long) cnt);
16813               if (do_wide)
16814                 printf ("%-20s", liblist.l_name < strtab_size
16815                         ? strtab + liblist.l_name : _("<corrupt>"));
16816               else
16817                 printf ("%-20.20s", liblist.l_name < strtab_size
16818                         ? strtab + liblist.l_name : _("<corrupt>"));
16819               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
16820                       liblist.l_version, liblist.l_flags);
16821             }
16822
16823           free (elib);
16824           free (strtab);
16825         }
16826     }
16827
16828   return res;
16829 }
16830
16831 static const char *
16832 get_note_type (Filedata * filedata, unsigned e_type)
16833 {
16834   static char buff[64];
16835
16836   if (filedata->file_header.e_type == ET_CORE)
16837     switch (e_type)
16838       {
16839       case NT_AUXV:
16840         return _("NT_AUXV (auxiliary vector)");
16841       case NT_PRSTATUS:
16842         return _("NT_PRSTATUS (prstatus structure)");
16843       case NT_FPREGSET:
16844         return _("NT_FPREGSET (floating point registers)");
16845       case NT_PRPSINFO:
16846         return _("NT_PRPSINFO (prpsinfo structure)");
16847       case NT_TASKSTRUCT:
16848         return _("NT_TASKSTRUCT (task structure)");
16849       case NT_PRXFPREG:
16850         return _("NT_PRXFPREG (user_xfpregs structure)");
16851       case NT_PPC_VMX:
16852         return _("NT_PPC_VMX (ppc Altivec registers)");
16853       case NT_PPC_VSX:
16854         return _("NT_PPC_VSX (ppc VSX registers)");
16855       case NT_PPC_TAR:
16856         return _("NT_PPC_TAR (ppc TAR register)");
16857       case NT_PPC_PPR:
16858         return _("NT_PPC_PPR (ppc PPR register)");
16859       case NT_PPC_DSCR:
16860         return _("NT_PPC_DSCR (ppc DSCR register)");
16861       case NT_PPC_EBB:
16862         return _("NT_PPC_EBB (ppc EBB registers)");
16863       case NT_PPC_PMU:
16864         return _("NT_PPC_PMU (ppc PMU registers)");
16865       case NT_PPC_TM_CGPR:
16866         return _("NT_PPC_TM_CGPR (ppc checkpointed GPR registers)");
16867       case NT_PPC_TM_CFPR:
16868         return _("NT_PPC_TM_CFPR (ppc checkpointed floating point registers)");
16869       case NT_PPC_TM_CVMX:
16870         return _("NT_PPC_TM_CVMX (ppc checkpointed Altivec registers)");
16871       case NT_PPC_TM_CVSX:
16872         return _("NT_PPC_TM_CVSX (ppc checkpointed VSX registers)");
16873       case NT_PPC_TM_SPR:
16874         return _("NT_PPC_TM_SPR (ppc TM special purpose registers)");
16875       case NT_PPC_TM_CTAR:
16876         return _("NT_PPC_TM_CTAR (ppc checkpointed TAR register)");
16877       case NT_PPC_TM_CPPR:
16878         return _("NT_PPC_TM_CPPR (ppc checkpointed PPR register)");
16879       case NT_PPC_TM_CDSCR:
16880         return _("NT_PPC_TM_CDSCR (ppc checkpointed DSCR register)");
16881       case NT_386_TLS:
16882         return _("NT_386_TLS (x86 TLS information)");
16883       case NT_386_IOPERM:
16884         return _("NT_386_IOPERM (x86 I/O permissions)");
16885       case NT_X86_XSTATE:
16886         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
16887       case NT_S390_HIGH_GPRS:
16888         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
16889       case NT_S390_TIMER:
16890         return _("NT_S390_TIMER (s390 timer register)");
16891       case NT_S390_TODCMP:
16892         return _("NT_S390_TODCMP (s390 TOD comparator register)");
16893       case NT_S390_TODPREG:
16894         return _("NT_S390_TODPREG (s390 TOD programmable register)");
16895       case NT_S390_CTRS:
16896         return _("NT_S390_CTRS (s390 control registers)");
16897       case NT_S390_PREFIX:
16898         return _("NT_S390_PREFIX (s390 prefix register)");
16899       case NT_S390_LAST_BREAK:
16900         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
16901       case NT_S390_SYSTEM_CALL:
16902         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
16903       case NT_S390_TDB:
16904         return _("NT_S390_TDB (s390 transaction diagnostic block)");
16905       case NT_S390_VXRS_LOW:
16906         return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
16907       case NT_S390_VXRS_HIGH:
16908         return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
16909       case NT_S390_GS_CB:
16910         return _("NT_S390_GS_CB (s390 guarded-storage registers)");
16911       case NT_S390_GS_BC:
16912         return _("NT_S390_GS_BC (s390 guarded-storage broadcast control)");
16913       case NT_ARM_VFP:
16914         return _("NT_ARM_VFP (arm VFP registers)");
16915       case NT_ARM_TLS:
16916         return _("NT_ARM_TLS (AArch TLS registers)");
16917       case NT_ARM_HW_BREAK:
16918         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
16919       case NT_ARM_HW_WATCH:
16920         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
16921       case NT_PSTATUS:
16922         return _("NT_PSTATUS (pstatus structure)");
16923       case NT_FPREGS:
16924         return _("NT_FPREGS (floating point registers)");
16925       case NT_PSINFO:
16926         return _("NT_PSINFO (psinfo structure)");
16927       case NT_LWPSTATUS:
16928         return _("NT_LWPSTATUS (lwpstatus_t structure)");
16929       case NT_LWPSINFO:
16930         return _("NT_LWPSINFO (lwpsinfo_t structure)");
16931       case NT_WIN32PSTATUS:
16932         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
16933       case NT_SIGINFO:
16934         return _("NT_SIGINFO (siginfo_t data)");
16935       case NT_FILE:
16936         return _("NT_FILE (mapped files)");
16937       default:
16938         break;
16939       }
16940   else
16941     switch (e_type)
16942       {
16943       case NT_VERSION:
16944         return _("NT_VERSION (version)");
16945       case NT_ARCH:
16946         return _("NT_ARCH (architecture)");
16947       case NT_GNU_BUILD_ATTRIBUTE_OPEN:
16948         return _("OPEN");
16949       case NT_GNU_BUILD_ATTRIBUTE_FUNC:
16950         return _("func");
16951       default:
16952         break;
16953       }
16954
16955   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
16956   return buff;
16957 }
16958
16959 static bfd_boolean
16960 print_core_note (Elf_Internal_Note *pnote)
16961 {
16962   unsigned int addr_size = is_32bit_elf ? 4 : 8;
16963   bfd_vma count, page_size;
16964   unsigned char *descdata, *filenames, *descend;
16965
16966   if (pnote->type != NT_FILE)
16967     {
16968       if (do_wide)
16969         printf ("\n");
16970       return TRUE;
16971     }
16972
16973 #ifndef BFD64
16974   if (!is_32bit_elf)
16975     {
16976       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
16977       /* Still "successful".  */
16978       return TRUE;
16979     }
16980 #endif
16981
16982   if (pnote->descsz < 2 * addr_size)
16983     {
16984       error (_("    Malformed note - too short for header\n"));
16985       return FALSE;
16986     }
16987
16988   descdata = (unsigned char *) pnote->descdata;
16989   descend = descdata + pnote->descsz;
16990
16991   if (descdata[pnote->descsz - 1] != '\0')
16992     {
16993       error (_("    Malformed note - does not end with \\0\n"));
16994       return FALSE;
16995     }
16996
16997   count = byte_get (descdata, addr_size);
16998   descdata += addr_size;
16999
17000   page_size = byte_get (descdata, addr_size);
17001   descdata += addr_size;
17002
17003   if (count > ((bfd_vma) -1 - 2 * addr_size) / (3 * addr_size)
17004       || pnote->descsz < 2 * addr_size + count * 3 * addr_size)
17005     {
17006       error (_("    Malformed note - too short for supplied file count\n"));
17007       return FALSE;
17008     }
17009
17010   printf (_("    Page size: "));
17011   print_vma (page_size, DEC);
17012   printf ("\n");
17013
17014   printf (_("    %*s%*s%*s\n"),
17015           (int) (2 + 2 * addr_size), _("Start"),
17016           (int) (4 + 2 * addr_size), _("End"),
17017           (int) (4 + 2 * addr_size), _("Page Offset"));
17018   filenames = descdata + count * 3 * addr_size;
17019   while (count-- > 0)
17020     {
17021       bfd_vma start, end, file_ofs;
17022
17023       if (filenames == descend)
17024         {
17025           error (_("    Malformed note - filenames end too early\n"));
17026           return FALSE;
17027         }
17028
17029       start = byte_get (descdata, addr_size);
17030       descdata += addr_size;
17031       end = byte_get (descdata, addr_size);
17032       descdata += addr_size;
17033       file_ofs = byte_get (descdata, addr_size);
17034       descdata += addr_size;
17035
17036       printf ("    ");
17037       print_vma (start, FULL_HEX);
17038       printf ("  ");
17039       print_vma (end, FULL_HEX);
17040       printf ("  ");
17041       print_vma (file_ofs, FULL_HEX);
17042       printf ("\n        %s\n", filenames);
17043
17044       filenames += 1 + strlen ((char *) filenames);
17045     }
17046
17047   return TRUE;
17048 }
17049
17050 static const char *
17051 get_gnu_elf_note_type (unsigned e_type)
17052 {
17053   /* NB/ Keep this switch statement in sync with print_gnu_note ().  */
17054   switch (e_type)
17055     {
17056     case NT_GNU_ABI_TAG:
17057       return _("NT_GNU_ABI_TAG (ABI version tag)");
17058     case NT_GNU_HWCAP:
17059       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
17060     case NT_GNU_BUILD_ID:
17061       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
17062     case NT_GNU_GOLD_VERSION:
17063       return _("NT_GNU_GOLD_VERSION (gold version)");
17064     case NT_GNU_PROPERTY_TYPE_0:
17065       return _("NT_GNU_PROPERTY_TYPE_0");
17066     case NT_GNU_BUILD_ATTRIBUTE_OPEN:
17067       return _("NT_GNU_BUILD_ATTRIBUTE_OPEN");
17068     case NT_GNU_BUILD_ATTRIBUTE_FUNC:
17069       return _("NT_GNU_BUILD_ATTRIBUTE_FUNC");
17070     default:
17071       {
17072         static char buff[64];
17073
17074         snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17075         return buff;
17076       }
17077     }
17078 }
17079
17080 static void
17081 decode_x86_compat_isa (unsigned int bitmask)
17082 {
17083   while (bitmask)
17084     {
17085       unsigned int bit = bitmask & (- bitmask);
17086
17087       bitmask &= ~ bit;
17088       switch (bit)
17089         {
17090         case GNU_PROPERTY_X86_COMPAT_ISA_1_486:
17091           printf ("i486");
17092           break;
17093         case GNU_PROPERTY_X86_COMPAT_ISA_1_586:
17094           printf ("586");
17095           break;
17096         case GNU_PROPERTY_X86_COMPAT_ISA_1_686:
17097           printf ("686");
17098           break;
17099         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE:
17100           printf ("SSE");
17101           break;
17102         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE2:
17103           printf ("SSE2");
17104           break;
17105         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE3:
17106           printf ("SSE3");
17107           break;
17108         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSSE3:
17109           printf ("SSSE3");
17110           break;
17111         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_1:
17112           printf ("SSE4_1");
17113           break;
17114         case GNU_PROPERTY_X86_COMPAT_ISA_1_SSE4_2:
17115           printf ("SSE4_2");
17116           break;
17117         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX:
17118           printf ("AVX");
17119           break;
17120         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX2:
17121           printf ("AVX2");
17122           break;
17123         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512F:
17124           printf ("AVX512F");
17125           break;
17126         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512CD:
17127           printf ("AVX512CD");
17128           break;
17129         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512ER:
17130           printf ("AVX512ER");
17131           break;
17132         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512PF:
17133           printf ("AVX512PF");
17134           break;
17135         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512VL:
17136           printf ("AVX512VL");
17137           break;
17138         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512DQ:
17139           printf ("AVX512DQ");
17140           break;
17141         case GNU_PROPERTY_X86_COMPAT_ISA_1_AVX512BW:
17142           printf ("AVX512BW");
17143           break;
17144         default:
17145           printf (_("<unknown: %x>"), bit);
17146           break;
17147         }
17148       if (bitmask)
17149         printf (", ");
17150     }
17151 }
17152
17153 static void
17154 decode_x86_isa (unsigned int bitmask)
17155 {
17156   if (!bitmask)
17157     {
17158       printf (_("<None>"));
17159       return;
17160     }
17161
17162   while (bitmask)
17163     {
17164       unsigned int bit = bitmask & (- bitmask);
17165
17166       bitmask &= ~ bit;
17167       switch (bit)
17168         {
17169         case GNU_PROPERTY_X86_ISA_1_CMOV:
17170           printf ("CMOV");
17171           break;
17172         case GNU_PROPERTY_X86_ISA_1_SSE:
17173           printf ("SSE");
17174           break;
17175         case GNU_PROPERTY_X86_ISA_1_SSE2:
17176           printf ("SSE2");
17177           break;
17178         case GNU_PROPERTY_X86_ISA_1_SSE3:
17179           printf ("SSE3");
17180           break;
17181         case GNU_PROPERTY_X86_ISA_1_SSSE3:
17182           printf ("SSSE3");
17183           break;
17184         case GNU_PROPERTY_X86_ISA_1_SSE4_1:
17185           printf ("SSE4_1");
17186           break;
17187         case GNU_PROPERTY_X86_ISA_1_SSE4_2:
17188           printf ("SSE4_2");
17189           break;
17190         case GNU_PROPERTY_X86_ISA_1_AVX:
17191           printf ("AVX");
17192           break;
17193         case GNU_PROPERTY_X86_ISA_1_AVX2:
17194           printf ("AVX2");
17195           break;
17196         case GNU_PROPERTY_X86_ISA_1_FMA:
17197           printf ("FMA");
17198           break;
17199         case GNU_PROPERTY_X86_ISA_1_AVX512F:
17200           printf ("AVX512F");
17201           break;
17202         case GNU_PROPERTY_X86_ISA_1_AVX512CD:
17203           printf ("AVX512CD");
17204           break;
17205         case GNU_PROPERTY_X86_ISA_1_AVX512ER:
17206           printf ("AVX512ER");
17207           break;
17208         case GNU_PROPERTY_X86_ISA_1_AVX512PF:
17209           printf ("AVX512PF");
17210           break;
17211         case GNU_PROPERTY_X86_ISA_1_AVX512VL:
17212           printf ("AVX512VL");
17213           break;
17214         case GNU_PROPERTY_X86_ISA_1_AVX512DQ:
17215           printf ("AVX512DQ");
17216           break;
17217         case GNU_PROPERTY_X86_ISA_1_AVX512BW:
17218           printf ("AVX512BW");
17219           break;
17220         case GNU_PROPERTY_X86_ISA_1_AVX512_4FMAPS:
17221           printf ("AVX512_4FMAPS");
17222           break;
17223         case GNU_PROPERTY_X86_ISA_1_AVX512_4VNNIW:
17224           printf ("AVX512_4VNNIW");
17225           break;
17226         case GNU_PROPERTY_X86_ISA_1_AVX512_BITALG:
17227           printf ("AVX512_BITALG");
17228           break;
17229         case GNU_PROPERTY_X86_ISA_1_AVX512_IFMA:
17230           printf ("AVX512_IFMA");
17231           break;
17232         case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI:
17233           printf ("AVX512_VBMI");
17234           break;
17235         case GNU_PROPERTY_X86_ISA_1_AVX512_VBMI2:
17236           printf ("AVX512_VBMI2");
17237           break;
17238         case GNU_PROPERTY_X86_ISA_1_AVX512_VNNI:
17239           printf ("AVX512_VNNI");
17240           break;
17241         default:
17242           printf (_("<unknown: %x>"), bit);
17243           break;
17244         }
17245       if (bitmask)
17246         printf (", ");
17247     }
17248 }
17249
17250 static void
17251 decode_x86_feature_1 (unsigned int bitmask)
17252 {
17253   if (!bitmask)
17254     {
17255       printf (_("<None>"));
17256       return;
17257     }
17258
17259   while (bitmask)
17260     {
17261       unsigned int bit = bitmask & (- bitmask);
17262
17263       bitmask &= ~ bit;
17264       switch (bit)
17265         {
17266         case GNU_PROPERTY_X86_FEATURE_1_IBT:
17267           printf ("IBT");
17268           break;
17269         case GNU_PROPERTY_X86_FEATURE_1_SHSTK:
17270           printf ("SHSTK");
17271           break;
17272         default:
17273           printf (_("<unknown: %x>"), bit);
17274           break;
17275         }
17276       if (bitmask)
17277         printf (", ");
17278     }
17279 }
17280
17281 static void
17282 decode_x86_feature_2 (unsigned int bitmask)
17283 {
17284   if (!bitmask)
17285     {
17286       printf (_("<None>"));
17287       return;
17288     }
17289
17290   while (bitmask)
17291     {
17292       unsigned int bit = bitmask & (- bitmask);
17293
17294       bitmask &= ~ bit;
17295       switch (bit)
17296         {
17297         case GNU_PROPERTY_X86_FEATURE_2_X86:
17298           printf ("x86");
17299           break;
17300         case GNU_PROPERTY_X86_FEATURE_2_X87:
17301           printf ("x87");
17302           break;
17303         case GNU_PROPERTY_X86_FEATURE_2_MMX:
17304           printf ("MMX");
17305           break;
17306         case GNU_PROPERTY_X86_FEATURE_2_XMM:
17307           printf ("XMM");
17308           break;
17309         case GNU_PROPERTY_X86_FEATURE_2_YMM:
17310           printf ("YMM");
17311           break;
17312         case GNU_PROPERTY_X86_FEATURE_2_ZMM:
17313           printf ("ZMM");
17314           break;
17315         case GNU_PROPERTY_X86_FEATURE_2_FXSR:
17316           printf ("FXSR");
17317           break;
17318         case GNU_PROPERTY_X86_FEATURE_2_XSAVE:
17319           printf ("XSAVE");
17320           break;
17321         case GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT:
17322           printf ("XSAVEOPT");
17323           break;
17324         case GNU_PROPERTY_X86_FEATURE_2_XSAVEC:
17325           printf ("XSAVEC");
17326           break;
17327         default:
17328           printf (_("<unknown: %x>"), bit);
17329           break;
17330         }
17331       if (bitmask)
17332         printf (", ");
17333     }
17334 }
17335
17336 static void
17337 print_gnu_property_note (Filedata * filedata, Elf_Internal_Note * pnote)
17338 {
17339   unsigned char * ptr = (unsigned char *) pnote->descdata;
17340   unsigned char * ptr_end = ptr + pnote->descsz;
17341   unsigned int    size = is_32bit_elf ? 4 : 8;
17342
17343   printf (_("      Properties: "));
17344
17345   if (pnote->descsz < 8 || (pnote->descsz % size) != 0)
17346     {
17347       printf (_("<corrupt GNU_PROPERTY_TYPE, size = %#lx>\n"), pnote->descsz);
17348       return;
17349     }
17350
17351   while (ptr < ptr_end)
17352     {
17353       unsigned int j;
17354       unsigned int type;
17355       unsigned int datasz;
17356
17357       if ((size_t) (ptr_end - ptr) < 8)
17358         {
17359           printf (_("<corrupt descsz: %#lx>\n"), pnote->descsz);
17360           break;
17361         }
17362
17363       type = byte_get (ptr, 4);
17364       datasz = byte_get (ptr + 4, 4);
17365
17366       ptr += 8;
17367
17368       if (datasz > (size_t) (ptr_end - ptr))
17369         {
17370           printf (_("<corrupt type (%#x) datasz: %#x>\n"),
17371                   type, datasz);
17372           break;
17373         }
17374
17375       if (type >= GNU_PROPERTY_LOPROC && type <= GNU_PROPERTY_HIPROC)
17376         {
17377           if (filedata->file_header.e_machine == EM_X86_64
17378               || filedata->file_header.e_machine == EM_IAMCU
17379               || filedata->file_header.e_machine == EM_386)
17380             {
17381               unsigned int bitmask;
17382
17383               if (datasz == 4)
17384                 bitmask = byte_get (ptr, 4);
17385               else
17386                 bitmask = 0;
17387
17388               switch (type)
17389                 {
17390                 case GNU_PROPERTY_X86_ISA_1_USED:
17391                   if (datasz != 4)
17392                     printf (_("x86 ISA used: <corrupt length: %#x> "),
17393                             datasz);
17394                   else
17395                     {
17396                       printf ("x86 ISA used: ");
17397                       decode_x86_isa (bitmask);
17398                     }
17399                   goto next;
17400
17401                 case GNU_PROPERTY_X86_ISA_1_NEEDED:
17402                   if (datasz != 4)
17403                     printf (_("x86 ISA needed: <corrupt length: %#x> "),
17404                             datasz);
17405                   else
17406                     {
17407                       printf ("x86 ISA needed: ");
17408                       decode_x86_isa (bitmask);
17409                     }
17410                   goto next;
17411
17412                 case GNU_PROPERTY_X86_FEATURE_1_AND:
17413                   if (datasz != 4)
17414                     printf (_("x86 feature: <corrupt length: %#x> "),
17415                             datasz);
17416                   else
17417                     {
17418                       printf ("x86 feature: ");
17419                       decode_x86_feature_1 (bitmask);
17420                     }
17421                   goto next;
17422
17423                 case GNU_PROPERTY_X86_FEATURE_2_USED:
17424                   if (datasz != 4)
17425                     printf (_("x86 feature used: <corrupt length: %#x> "),
17426                             datasz);
17427                   else
17428                     {
17429                       printf ("x86 feature used: ");
17430                       decode_x86_feature_2 (bitmask);
17431                     }
17432                   goto next;
17433
17434                 case GNU_PROPERTY_X86_FEATURE_2_NEEDED:
17435                   if (datasz != 4)
17436                     printf (_("x86 feature needed: <corrupt length: %#x> "), datasz);
17437                   else
17438                     {
17439                       printf ("x86 feature needed: ");
17440                       decode_x86_feature_2 (bitmask);
17441                     }
17442                   goto next;
17443
17444                 case GNU_PROPERTY_X86_COMPAT_ISA_1_USED:
17445                   if (datasz != 4)
17446                     printf (_("x86 ISA used: <corrupt length: %#x> "),
17447                             datasz);
17448                   else
17449                     {
17450                       printf ("x86 ISA used: ");
17451                       decode_x86_compat_isa (bitmask);
17452                     }
17453                   goto next;
17454
17455                 case GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED:
17456                   if (datasz != 4)
17457                     printf (_("x86 ISA needed: <corrupt length: %#x> "),
17458                             datasz);
17459                   else
17460                     {
17461                       printf ("x86 ISA needed: ");
17462                       decode_x86_compat_isa (bitmask);
17463                     }
17464                   goto next;
17465
17466                 default:
17467                   break;
17468                 }
17469             }
17470         }
17471       else
17472         {
17473           switch (type)
17474             {
17475             case GNU_PROPERTY_STACK_SIZE:
17476               printf (_("stack size: "));
17477               if (datasz != size)
17478                 printf (_("<corrupt length: %#x> "), datasz);
17479               else
17480                 printf ("%#lx", (unsigned long) byte_get (ptr, size));
17481               goto next;
17482
17483             case GNU_PROPERTY_NO_COPY_ON_PROTECTED:
17484               printf ("no copy on protected ");
17485               if (datasz)
17486                 printf (_("<corrupt length: %#x> "), datasz);
17487               goto next;
17488
17489             default:
17490               break;
17491             }
17492         }
17493
17494       if (type < GNU_PROPERTY_LOPROC)
17495         printf (_("<unknown type %#x data: "), type);
17496       else if (type < GNU_PROPERTY_LOUSER)
17497         printf (_("<procesor-specific type %#x data: "), type);
17498       else
17499         printf (_("<application-specific type %#x data: "), type);
17500       for (j = 0; j < datasz; ++j)
17501         printf ("%02x ", ptr[j] & 0xff);
17502       printf (">");
17503
17504 next:
17505       ptr += ((datasz + (size - 1)) & ~ (size - 1));
17506       if (ptr == ptr_end)
17507         break;
17508
17509       if (do_wide)
17510         printf (", ");
17511       else
17512         printf ("\n\t");
17513     }
17514
17515   printf ("\n");
17516 }
17517
17518 static bfd_boolean
17519 print_gnu_note (Filedata * filedata, Elf_Internal_Note *pnote)
17520 {
17521   /* NB/ Keep this switch statement in sync with get_gnu_elf_note_type ().  */
17522   switch (pnote->type)
17523     {
17524     case NT_GNU_BUILD_ID:
17525       {
17526         unsigned long i;
17527
17528         printf (_("    Build ID: "));
17529         for (i = 0; i < pnote->descsz; ++i)
17530           printf ("%02x", pnote->descdata[i] & 0xff);
17531         printf ("\n");
17532       }
17533       break;
17534
17535     case NT_GNU_ABI_TAG:
17536       {
17537         unsigned long os, major, minor, subminor;
17538         const char *osname;
17539
17540         /* PR 17531: file: 030-599401-0.004.  */
17541         if (pnote->descsz < 16)
17542           {
17543             printf (_("    <corrupt GNU_ABI_TAG>\n"));
17544             break;
17545           }
17546
17547         os = byte_get ((unsigned char *) pnote->descdata, 4);
17548         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17549         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
17550         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
17551
17552         switch (os)
17553           {
17554           case GNU_ABI_TAG_LINUX:
17555             osname = "Linux";
17556             break;
17557           case GNU_ABI_TAG_HURD:
17558             osname = "Hurd";
17559             break;
17560           case GNU_ABI_TAG_SOLARIS:
17561             osname = "Solaris";
17562             break;
17563           case GNU_ABI_TAG_FREEBSD:
17564             osname = "FreeBSD";
17565             break;
17566           case GNU_ABI_TAG_NETBSD:
17567             osname = "NetBSD";
17568             break;
17569           case GNU_ABI_TAG_SYLLABLE:
17570             osname = "Syllable";
17571             break;
17572           case GNU_ABI_TAG_NACL:
17573             osname = "NaCl";
17574             break;
17575           default:
17576             osname = "Unknown";
17577             break;
17578           }
17579
17580         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
17581                 major, minor, subminor);
17582       }
17583       break;
17584
17585     case NT_GNU_GOLD_VERSION:
17586       {
17587         unsigned long i;
17588
17589         printf (_("    Version: "));
17590         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
17591           printf ("%c", pnote->descdata[i]);
17592         printf ("\n");
17593       }
17594       break;
17595
17596     case NT_GNU_HWCAP:
17597       {
17598         unsigned long num_entries, mask;
17599
17600         /* Hardware capabilities information.  Word 0 is the number of entries.
17601            Word 1 is a bitmask of enabled entries.  The rest of the descriptor
17602            is a series of entries, where each entry is a single byte followed
17603            by a nul terminated string.  The byte gives the bit number to test
17604            if enabled in the bitmask.  */
17605         printf (_("      Hardware Capabilities: "));
17606         if (pnote->descsz < 8)
17607           {
17608             error (_("<corrupt GNU_HWCAP>\n"));
17609             return FALSE;
17610           }
17611         num_entries = byte_get ((unsigned char *) pnote->descdata, 4);
17612         mask = byte_get ((unsigned char *) pnote->descdata + 4, 4);
17613         printf (_("num entries: %ld, enabled mask: %lx\n"), num_entries, mask);
17614         /* FIXME: Add code to display the entries... */
17615       }
17616       break;
17617
17618     case NT_GNU_PROPERTY_TYPE_0:
17619       print_gnu_property_note (filedata, pnote);
17620       break;
17621       
17622     default:
17623       /* Handle unrecognised types.  An error message should have already been
17624          created by get_gnu_elf_note_type(), so all that we need to do is to
17625          display the data.  */
17626       {
17627         unsigned long i;
17628
17629         printf (_("    Description data: "));
17630         for (i = 0; i < pnote->descsz; ++i)
17631           printf ("%02x ", pnote->descdata[i] & 0xff);
17632         printf ("\n");
17633       }
17634       break;
17635     }
17636
17637   return TRUE;
17638 }
17639
17640 static const char *
17641 get_v850_elf_note_type (enum v850_notes n_type)
17642 {
17643   static char buff[64];
17644
17645   switch (n_type)
17646     {
17647     case V850_NOTE_ALIGNMENT:  return _("Alignment of 8-byte objects");
17648     case V850_NOTE_DATA_SIZE:  return _("Sizeof double and long double");
17649     case V850_NOTE_FPU_INFO:   return _("Type of FPU support needed");
17650     case V850_NOTE_SIMD_INFO:  return _("Use of SIMD instructions");
17651     case V850_NOTE_CACHE_INFO: return _("Use of cache");
17652     case V850_NOTE_MMU_INFO:   return _("Use of MMU");
17653     default:
17654       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
17655       return buff;
17656     }
17657 }
17658
17659 static bfd_boolean
17660 print_v850_note (Elf_Internal_Note * pnote)
17661 {
17662   unsigned int val;
17663
17664   if (pnote->descsz != 4)
17665     return FALSE;
17666
17667   val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
17668
17669   if (val == 0)
17670     {
17671       printf (_("not set\n"));
17672       return TRUE;
17673     }
17674
17675   switch (pnote->type)
17676     {
17677     case V850_NOTE_ALIGNMENT:
17678       switch (val)
17679         {
17680         case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return TRUE;
17681         case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return TRUE;
17682         }
17683       break;
17684
17685     case V850_NOTE_DATA_SIZE:
17686       switch (val)
17687         {
17688         case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return TRUE;
17689         case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return TRUE;
17690         }
17691       break;
17692
17693     case V850_NOTE_FPU_INFO:
17694       switch (val)
17695         {
17696         case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return TRUE;
17697         case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return TRUE;
17698         }
17699       break;
17700
17701     case V850_NOTE_MMU_INFO:
17702     case V850_NOTE_CACHE_INFO:
17703     case V850_NOTE_SIMD_INFO:
17704       if (val == EF_RH850_SIMD)
17705         {
17706           printf (_("yes\n"));
17707           return TRUE;
17708         }
17709       break;
17710
17711     default:
17712       /* An 'unknown note type' message will already have been displayed.  */
17713       break;
17714     }
17715
17716   printf (_("unknown value: %x\n"), val);
17717   return FALSE;
17718 }
17719
17720 static bfd_boolean
17721 process_netbsd_elf_note (Elf_Internal_Note * pnote)
17722 {
17723   unsigned int version;
17724
17725   switch (pnote->type)
17726     {
17727     case NT_NETBSD_IDENT:
17728       version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
17729       if ((version / 10000) % 100)
17730         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
17731                 version, version / 100000000, (version / 1000000) % 100,
17732                 (version / 10000) % 100 > 26 ? "Z" : "",
17733                 'A' + (version / 10000) % 26);
17734       else
17735         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
17736                 version, version / 100000000, (version / 1000000) % 100,
17737                 (version / 100) % 100);
17738       return TRUE;
17739
17740     case NT_NETBSD_MARCH:
17741       printf ("  NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
17742               pnote->descdata);
17743       return TRUE;
17744
17745     default:
17746       printf ("  NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
17747               pnote->type);
17748       return FALSE;
17749     }
17750 }
17751
17752 static const char *
17753 get_freebsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17754 {
17755   switch (e_type)
17756     {
17757     case NT_FREEBSD_THRMISC:
17758       return _("NT_THRMISC (thrmisc structure)");
17759     case NT_FREEBSD_PROCSTAT_PROC:
17760       return _("NT_PROCSTAT_PROC (proc data)");
17761     case NT_FREEBSD_PROCSTAT_FILES:
17762       return _("NT_PROCSTAT_FILES (files data)");
17763     case NT_FREEBSD_PROCSTAT_VMMAP:
17764       return _("NT_PROCSTAT_VMMAP (vmmap data)");
17765     case NT_FREEBSD_PROCSTAT_GROUPS:
17766       return _("NT_PROCSTAT_GROUPS (groups data)");
17767     case NT_FREEBSD_PROCSTAT_UMASK:
17768       return _("NT_PROCSTAT_UMASK (umask data)");
17769     case NT_FREEBSD_PROCSTAT_RLIMIT:
17770       return _("NT_PROCSTAT_RLIMIT (rlimit data)");
17771     case NT_FREEBSD_PROCSTAT_OSREL:
17772       return _("NT_PROCSTAT_OSREL (osreldate data)");
17773     case NT_FREEBSD_PROCSTAT_PSSTRINGS:
17774       return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
17775     case NT_FREEBSD_PROCSTAT_AUXV:
17776       return _("NT_PROCSTAT_AUXV (auxv data)");
17777     case NT_FREEBSD_PTLWPINFO:
17778       return _("NT_PTLWPINFO (ptrace_lwpinfo structure)");
17779     }
17780   return get_note_type (filedata, e_type);
17781 }
17782
17783 static const char *
17784 get_netbsd_elfcore_note_type (Filedata * filedata, unsigned e_type)
17785 {
17786   static char buff[64];
17787
17788   if (e_type == NT_NETBSDCORE_PROCINFO)
17789     return _("NetBSD procinfo structure");
17790
17791   /* As of Jan 2002 there are no other machine-independent notes
17792      defined for NetBSD core files.  If the note type is less
17793      than the start of the machine-dependent note types, we don't
17794      understand it.  */
17795
17796   if (e_type < NT_NETBSDCORE_FIRSTMACH)
17797     {
17798       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17799       return buff;
17800     }
17801
17802   switch (filedata->file_header.e_machine)
17803     {
17804     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
17805        and PT_GETFPREGS == mach+2.  */
17806
17807     case EM_OLD_ALPHA:
17808     case EM_ALPHA:
17809     case EM_SPARC:
17810     case EM_SPARC32PLUS:
17811     case EM_SPARCV9:
17812       switch (e_type)
17813         {
17814         case NT_NETBSDCORE_FIRSTMACH + 0:
17815           return _("PT_GETREGS (reg structure)");
17816         case NT_NETBSDCORE_FIRSTMACH + 2:
17817           return _("PT_GETFPREGS (fpreg structure)");
17818         default:
17819           break;
17820         }
17821       break;
17822
17823     /* On all other arch's, PT_GETREGS == mach+1 and
17824        PT_GETFPREGS == mach+3.  */
17825     default:
17826       switch (e_type)
17827         {
17828         case NT_NETBSDCORE_FIRSTMACH + 1:
17829           return _("PT_GETREGS (reg structure)");
17830         case NT_NETBSDCORE_FIRSTMACH + 3:
17831           return _("PT_GETFPREGS (fpreg structure)");
17832         default:
17833           break;
17834         }
17835     }
17836
17837   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
17838             e_type - NT_NETBSDCORE_FIRSTMACH);
17839   return buff;
17840 }
17841
17842 static const char *
17843 get_stapsdt_note_type (unsigned e_type)
17844 {
17845   static char buff[64];
17846
17847   switch (e_type)
17848     {
17849     case NT_STAPSDT:
17850       return _("NT_STAPSDT (SystemTap probe descriptors)");
17851
17852     default:
17853       break;
17854     }
17855
17856   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17857   return buff;
17858 }
17859
17860 static bfd_boolean
17861 print_stapsdt_note (Elf_Internal_Note *pnote)
17862 {
17863   int addr_size = is_32bit_elf ? 4 : 8;
17864   char *data = pnote->descdata;
17865   char *data_end = pnote->descdata + pnote->descsz;
17866   bfd_vma pc, base_addr, semaphore;
17867   char *provider, *probe, *arg_fmt;
17868
17869   pc = byte_get ((unsigned char *) data, addr_size);
17870   data += addr_size;
17871   base_addr = byte_get ((unsigned char *) data, addr_size);
17872   data += addr_size;
17873   semaphore = byte_get ((unsigned char *) data, addr_size);
17874   data += addr_size;
17875
17876   provider = data;
17877   data += strlen (data) + 1;
17878   probe = data;
17879   data += strlen (data) + 1;
17880   arg_fmt = data;
17881   data += strlen (data) + 1;
17882
17883   printf (_("    Provider: %s\n"), provider);
17884   printf (_("    Name: %s\n"), probe);
17885   printf (_("    Location: "));
17886   print_vma (pc, FULL_HEX);
17887   printf (_(", Base: "));
17888   print_vma (base_addr, FULL_HEX);
17889   printf (_(", Semaphore: "));
17890   print_vma (semaphore, FULL_HEX);
17891   printf ("\n");
17892   printf (_("    Arguments: %s\n"), arg_fmt);
17893
17894   return data == data_end;
17895 }
17896
17897 static const char *
17898 get_ia64_vms_note_type (unsigned e_type)
17899 {
17900   static char buff[64];
17901
17902   switch (e_type)
17903     {
17904     case NT_VMS_MHD:
17905       return _("NT_VMS_MHD (module header)");
17906     case NT_VMS_LNM:
17907       return _("NT_VMS_LNM (language name)");
17908     case NT_VMS_SRC:
17909       return _("NT_VMS_SRC (source files)");
17910     case NT_VMS_TITLE:
17911       return "NT_VMS_TITLE";
17912     case NT_VMS_EIDC:
17913       return _("NT_VMS_EIDC (consistency check)");
17914     case NT_VMS_FPMODE:
17915       return _("NT_VMS_FPMODE (FP mode)");
17916     case NT_VMS_LINKTIME:
17917       return "NT_VMS_LINKTIME";
17918     case NT_VMS_IMGNAM:
17919       return _("NT_VMS_IMGNAM (image name)");
17920     case NT_VMS_IMGID:
17921       return _("NT_VMS_IMGID (image id)");
17922     case NT_VMS_LINKID:
17923       return _("NT_VMS_LINKID (link id)");
17924     case NT_VMS_IMGBID:
17925       return _("NT_VMS_IMGBID (build id)");
17926     case NT_VMS_GSTNAM:
17927       return _("NT_VMS_GSTNAM (sym table name)");
17928     case NT_VMS_ORIG_DYN:
17929       return "NT_VMS_ORIG_DYN";
17930     case NT_VMS_PATCHTIME:
17931       return "NT_VMS_PATCHTIME";
17932     default:
17933       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
17934       return buff;
17935     }
17936 }
17937
17938 static bfd_boolean
17939 print_ia64_vms_note (Elf_Internal_Note * pnote)
17940 {
17941   switch (pnote->type)
17942     {
17943     case NT_VMS_MHD:
17944       if (pnote->descsz > 36)
17945         {
17946           size_t l = strlen (pnote->descdata + 34);
17947           printf (_("    Creation date  : %.17s\n"), pnote->descdata);
17948           printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
17949           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
17950           printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
17951         }
17952       else
17953         printf (_("    Invalid size\n"));
17954       break;
17955     case NT_VMS_LNM:
17956       printf (_("   Language: %s\n"), pnote->descdata);
17957       break;
17958 #ifdef BFD64
17959     case NT_VMS_FPMODE:
17960       printf (_("   Floating Point mode: "));
17961       printf ("0x%016" BFD_VMA_FMT "x\n",
17962               (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
17963       break;
17964     case NT_VMS_LINKTIME:
17965       printf (_("   Link time: "));
17966       print_vms_time
17967         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
17968       printf ("\n");
17969       break;
17970     case NT_VMS_PATCHTIME:
17971       printf (_("   Patch time: "));
17972       print_vms_time
17973         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
17974       printf ("\n");
17975       break;
17976     case NT_VMS_ORIG_DYN:
17977       printf (_("   Major id: %u,  minor id: %u\n"),
17978               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
17979               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
17980       printf (_("   Last modified  : "));
17981       print_vms_time
17982         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
17983       printf (_("\n   Link flags  : "));
17984       printf ("0x%016" BFD_VMA_FMT "x\n",
17985               (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
17986       printf (_("   Header flags: 0x%08x\n"),
17987               (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
17988       printf (_("   Image id    : %s\n"), pnote->descdata + 32);
17989       break;
17990 #endif
17991     case NT_VMS_IMGNAM:
17992       printf (_("    Image name: %s\n"), pnote->descdata);
17993       break;
17994     case NT_VMS_GSTNAM:
17995       printf (_("    Global symbol table name: %s\n"), pnote->descdata);
17996       break;
17997     case NT_VMS_IMGID:
17998       printf (_("    Image id: %s\n"), pnote->descdata);
17999       break;
18000     case NT_VMS_LINKID:
18001       printf (_("    Linker id: %s\n"), pnote->descdata);
18002       break;
18003     default:
18004       return FALSE;
18005     }
18006   return TRUE;
18007 }
18008
18009 /* Find the symbol associated with a build attribute that is attached
18010    to address OFFSET.  If PNAME is non-NULL then store the name of
18011    the symbol (if found) in the provided pointer,  Returns NULL if a
18012    symbol could not be found.  */
18013
18014 static Elf_Internal_Sym *
18015 get_symbol_for_build_attribute (Filedata *       filedata,
18016                                 unsigned long    offset,
18017                                 bfd_boolean      is_open_attr,
18018                                 const char **    pname)
18019 {
18020   static Filedata *         saved_filedata = NULL;
18021   static char *             strtab;
18022   static unsigned long      strtablen;
18023   static Elf_Internal_Sym * symtab;
18024   static unsigned long      nsyms;
18025   Elf_Internal_Sym *        saved_sym = NULL;
18026   Elf_Internal_Sym *        sym;
18027
18028   if (filedata->section_headers != NULL
18029       && (saved_filedata == NULL || filedata != saved_filedata))
18030     {
18031       Elf_Internal_Shdr * symsec;
18032
18033       /* Load the symbol and string sections.  */
18034       for (symsec = filedata->section_headers;
18035            symsec < filedata->section_headers + filedata->file_header.e_shnum;
18036            symsec ++)
18037         {
18038           if (symsec->sh_type == SHT_SYMTAB)
18039             {
18040               symtab = GET_ELF_SYMBOLS (filedata, symsec, & nsyms);
18041
18042               if (symsec->sh_link < filedata->file_header.e_shnum)
18043                 {
18044                   Elf_Internal_Shdr * strtab_sec = filedata->section_headers + symsec->sh_link;
18045
18046                   strtab = (char *) get_data (NULL, filedata, strtab_sec->sh_offset,
18047                                               1, strtab_sec->sh_size,
18048                                               _("string table"));
18049                   strtablen = strtab != NULL ? strtab_sec->sh_size : 0;
18050                 }
18051             }
18052         }
18053       saved_filedata = filedata;
18054     }
18055
18056   if (symtab == NULL || strtab == NULL)
18057     return NULL;
18058
18059   /* Find a symbol whose value matches offset.  */
18060   for (sym = symtab; sym < symtab + nsyms; sym ++)
18061     if (sym->st_value == offset)
18062       {
18063         if (sym->st_name >= strtablen)
18064           /* Huh ?  This should not happen.  */
18065           continue;
18066
18067         if (strtab[sym->st_name] == 0)
18068           continue;
18069
18070         /* The AArch64 and ARM architectures define mapping symbols
18071            (eg $d, $x, $t) which we want to ignore.  */
18072         if (strtab[sym->st_name] == '$'
18073             && strtab[sym->st_name + 1] != 0
18074             && strtab[sym->st_name + 2] == 0)
18075           continue;
18076
18077         if (is_open_attr)
18078           {
18079             /* For OPEN attributes we prefer GLOBAL over LOCAL symbols
18080                and FILE or OBJECT symbols over NOTYPE symbols.  We skip
18081                FUNC symbols entirely.  */
18082             switch (ELF_ST_TYPE (sym->st_info))
18083               {
18084               case STT_OBJECT:
18085               case STT_FILE:
18086                 saved_sym = sym;
18087                 if (sym->st_size)
18088                   {
18089                     /* If the symbol has a size associated
18090                        with it then we can stop searching.  */
18091                     sym = symtab + nsyms;
18092                   }
18093                 continue;
18094
18095               case STT_FUNC:
18096                 /* Ignore function symbols.  */
18097                 continue;
18098
18099               default:
18100                 break;
18101               }
18102
18103             switch (ELF_ST_BIND (sym->st_info))
18104               {
18105               case STB_GLOBAL:
18106                 if (saved_sym == NULL
18107                     || ELF_ST_TYPE (saved_sym->st_info) != STT_OBJECT)
18108                   saved_sym = sym;
18109                 break;
18110
18111               case STB_LOCAL:
18112                 if (saved_sym == NULL)
18113                   saved_sym = sym;
18114                 break;
18115
18116               default:
18117                 break;
18118               }
18119           }
18120         else
18121           {
18122             if (ELF_ST_TYPE (sym->st_info) != STT_FUNC)
18123               continue;
18124
18125             saved_sym = sym;
18126             break;
18127           }
18128       }
18129
18130   if (saved_sym && pname)
18131     * pname = strtab + saved_sym->st_name;
18132
18133   return saved_sym;
18134 }
18135
18136 /* Returns true iff addr1 and addr2 are in the same section.  */
18137
18138 static bfd_boolean
18139 same_section (Filedata * filedata, unsigned long addr1, unsigned long addr2)
18140 {
18141   Elf_Internal_Shdr * a1;
18142   Elf_Internal_Shdr * a2;
18143
18144   a1 = find_section_by_address (filedata, addr1);
18145   a2 = find_section_by_address (filedata, addr2);
18146   
18147   return a1 == a2 && a1 != NULL;
18148 }
18149
18150 static bfd_boolean
18151 print_gnu_build_attribute_description (Elf_Internal_Note *  pnote,
18152                                        Filedata *           filedata)
18153 {
18154   static unsigned long  global_offset = 0;
18155   static unsigned long  global_end = 0;
18156   static unsigned long  func_offset = 0;
18157   static unsigned long  func_end = 0;
18158
18159   Elf_Internal_Sym *    sym;
18160   const char *          name;
18161   unsigned long         start;
18162   unsigned long         end;
18163   bfd_boolean           is_open_attr = pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN;
18164
18165   switch (pnote->descsz)
18166     {
18167     case 0:
18168       /* A zero-length description means that the range of
18169          the previous note of the same type should be used.  */
18170       if (is_open_attr)
18171         {
18172           if (global_end > global_offset)
18173             printf (_("    Applies to region from %#lx to %#lx\n"),
18174                     global_offset, global_end);
18175           else
18176             printf (_("    Applies to region from %#lx\n"), global_offset);
18177         }
18178       else
18179         {
18180           if (func_end > func_offset)
18181             printf (_("    Applies to region from %#lx to %#lx\n"), func_offset, func_end);
18182           else
18183             printf (_("    Applies to region from %#lx\n"), func_offset);
18184         }
18185       return TRUE;
18186
18187     case 4:
18188       start = byte_get ((unsigned char *) pnote->descdata, 4);
18189       end = 0;
18190       break;
18191
18192     case 8:
18193       if (is_32bit_elf)
18194         {
18195           /* FIXME: We should check that version 3+ notes are being used here...  */
18196           start = byte_get ((unsigned char *) pnote->descdata, 4);
18197           end = byte_get ((unsigned char *) pnote->descdata + 4, 4);
18198         }
18199       else
18200         {
18201           start = byte_get ((unsigned char *) pnote->descdata, 8);
18202           end = 0;
18203         }
18204       break;
18205
18206     case 16:
18207       start = byte_get ((unsigned char *) pnote->descdata, 8);
18208       end = byte_get ((unsigned char *) pnote->descdata + 8, 8);
18209       break;
18210       
18211     default:
18212       error (_("    <invalid description size: %lx>\n"), pnote->descsz);
18213       printf (_("    <invalid descsz>"));
18214       return FALSE;
18215     }
18216
18217   name = NULL;
18218   sym = get_symbol_for_build_attribute (filedata, start, is_open_attr, & name);
18219   /* As of version 5 of the annobin plugin, filename symbols are biased by 2
18220      in order to avoid them being confused with the start address of the
18221      first function in the file...  */
18222   if (sym == NULL && is_open_attr)
18223     sym = get_symbol_for_build_attribute (filedata, start + 2, is_open_attr,
18224                                           & name);
18225
18226   if (end == 0 && sym != NULL && sym->st_size > 0)
18227     end = start + sym->st_size;
18228
18229   if (is_open_attr)
18230     {
18231       /* FIXME: Need to properly allow for section alignment.
18232          16 is just the alignment used on x86_64.  */
18233       if (global_end > 0
18234           && start > BFD_ALIGN (global_end, 16)
18235           /* Build notes are not guaranteed to be organised in order of
18236              increasing address, but we should find the all of the notes
18237              for one section in the same place.  */
18238           && same_section (filedata, start, global_end))
18239         warn (_("Gap in build notes detected from %#lx to %#lx\n"),
18240               global_end + 1, start - 1);
18241
18242       printf (_("    Applies to region from %#lx"), start);
18243       global_offset = start;
18244
18245       if (end)
18246         {
18247           printf (_(" to %#lx"), end);
18248           global_end = end;
18249         }
18250     }
18251   else
18252     {
18253       printf (_("    Applies to region from %#lx"), start);
18254       func_offset = start;
18255
18256       if (end)
18257         {
18258           printf (_(" to %#lx"), end);
18259           func_end = end;
18260         }
18261     }
18262
18263   if (sym && name)
18264     printf (_(" (%s)"), name);
18265
18266   printf ("\n");
18267   return TRUE;
18268 }
18269
18270 static bfd_boolean
18271 print_gnu_build_attribute_name (Elf_Internal_Note * pnote)
18272 {
18273   static const char string_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_STRING, 0 };
18274   static const char number_expected [2] = { GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC, 0 };
18275   static const char bool_expected [3] = { GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE, GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE, 0 };
18276   char         name_type;
18277   char         name_attribute;
18278   const char * expected_types;
18279   const char * name = pnote->namedata;
18280   const char * text;
18281   signed int   left;
18282
18283   if (name == NULL || pnote->namesz < 2)
18284     {
18285       error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
18286       print_symbol (-20, _("  <corrupt name>"));
18287       return FALSE;
18288     }
18289
18290   if (do_wide)
18291     left = 28;
18292   else
18293     left = 20;
18294
18295   /* Version 2 of the spec adds a "GA" prefix to the name field.  */
18296   if (name[0] == 'G' && name[1] == 'A')
18297     {
18298       if (pnote->namesz < 4)
18299         {
18300           error (_("corrupt name field in GNU build attribute note: size = %ld\n"), pnote->namesz);
18301           print_symbol (-20, _("  <corrupt name>"));
18302           return FALSE;
18303         }
18304
18305       printf ("GA");
18306       name += 2;
18307       left -= 2;
18308     }
18309
18310   switch ((name_type = * name))
18311     {
18312     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18313     case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
18314     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
18315     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
18316       printf ("%c", * name);
18317       left --;
18318       break;
18319     default:
18320       error (_("unrecognised attribute type in name field: %d\n"), name_type);
18321       print_symbol (-20, _("<unknown name type>"));
18322       return FALSE;
18323     }
18324
18325   ++ name;
18326   text = NULL;
18327
18328   switch ((name_attribute = * name))
18329     {
18330     case GNU_BUILD_ATTRIBUTE_VERSION:
18331       text = _("<version>");
18332       expected_types = string_expected;
18333       ++ name;
18334       break;
18335     case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18336       text = _("<stack prot>");
18337       expected_types = "!+*";
18338       ++ name;
18339       break;
18340     case GNU_BUILD_ATTRIBUTE_RELRO:
18341       text = _("<relro>");
18342       expected_types = bool_expected;
18343       ++ name;
18344       break;
18345     case GNU_BUILD_ATTRIBUTE_STACK_SIZE:
18346       text = _("<stack size>");
18347       expected_types = number_expected;
18348       ++ name;
18349       break;
18350     case GNU_BUILD_ATTRIBUTE_TOOL:
18351       text = _("<tool>");
18352       expected_types = string_expected;
18353       ++ name;
18354       break;
18355     case GNU_BUILD_ATTRIBUTE_ABI:
18356       text = _("<ABI>");
18357       expected_types = "$*";
18358       ++ name;
18359       break;
18360     case GNU_BUILD_ATTRIBUTE_PIC:
18361       text = _("<PIC>");
18362       expected_types = number_expected;
18363       ++ name;
18364       break;
18365     case GNU_BUILD_ATTRIBUTE_SHORT_ENUM:
18366       text = _("<short enum>");
18367       expected_types = bool_expected;
18368       ++ name;
18369       break;
18370     default:
18371       if (ISPRINT (* name))
18372         {
18373           int len = strnlen (name, pnote->namesz - (name - pnote->namedata)) + 1;
18374
18375           if (len > left && ! do_wide)
18376             len = left;
18377           printf ("%.*s:", len, name);
18378           left -= len;
18379           name += len;
18380         }
18381       else
18382         {
18383           static char tmpbuf [128];
18384
18385           error (_("unrecognised byte in name field: %d\n"), * name);
18386           sprintf (tmpbuf, _("<unknown:_%d>"), * name);
18387           text = tmpbuf;
18388           name ++;
18389         }
18390       expected_types = "*$!+";
18391       break;
18392     }
18393
18394   if (text)
18395     left -= printf ("%s", text);
18396
18397   if (strchr (expected_types, name_type) == NULL)
18398     warn (_("attribute does not have an expected type (%c)\n"), name_type);
18399
18400   if ((unsigned long)(name - pnote->namedata) > pnote->namesz)
18401     {
18402       error (_("corrupt name field: namesz: %lu but parsing gets to %ld\n"),
18403              (unsigned long) pnote->namesz,
18404              (long) (name - pnote->namedata));
18405       return FALSE;
18406     }
18407
18408   if (left < 1 && ! do_wide)
18409     return TRUE;
18410
18411   switch (name_type)
18412     {
18413     case GNU_BUILD_ATTRIBUTE_TYPE_NUMERIC:
18414       {
18415         unsigned int        bytes;
18416         unsigned long long  val = 0;
18417         unsigned int        shift = 0;
18418         char *              decoded = NULL;
18419
18420         bytes = pnote->namesz - (name - pnote->namedata);
18421         if (bytes > 0)
18422           /* The -1 is because the name field is always 0 terminated, and we
18423              want to be able to ensure that the shift in the while loop below
18424              will not overflow.  */
18425           -- bytes;
18426
18427         if (bytes > sizeof (val))
18428           {
18429             error (_("corrupt numeric name field: too many bytes in the value: %x\n"),
18430                    bytes);
18431             bytes = sizeof (val);
18432           }
18433         /* We do not bother to warn if bytes == 0 as this can
18434            happen with some early versions of the gcc plugin.  */
18435
18436         while (bytes --)
18437           {
18438             unsigned long byte = (* name ++) & 0xff;
18439
18440             val |= byte << shift;
18441             shift += 8;
18442           }
18443
18444         switch (name_attribute)
18445           {
18446           case GNU_BUILD_ATTRIBUTE_PIC:
18447             switch (val)
18448               {
18449               case 0: decoded = "static"; break;
18450               case 1: decoded = "pic"; break;
18451               case 2: decoded = "PIC"; break;
18452               case 3: decoded = "pie"; break;
18453               case 4: decoded = "PIE"; break;
18454               default: break;
18455               }
18456             break;
18457           case GNU_BUILD_ATTRIBUTE_STACK_PROT:
18458             switch (val)
18459               {
18460                 /* Based upon the SPCT_FLAG_xxx enum values in gcc/cfgexpand.c.  */
18461               case 0: decoded = "off"; break;
18462               case 1: decoded = "on"; break;
18463               case 2: decoded = "all"; break;
18464               case 3: decoded = "strong"; break;
18465               case 4: decoded = "explicit"; break;
18466               default: break;
18467               }
18468             break;
18469           default:
18470             break;
18471           }
18472
18473         if (decoded != NULL)
18474           {
18475             print_symbol (-left, decoded);
18476             left = 0;
18477           }
18478         else if (val == 0)
18479           {
18480             printf ("0x0");
18481             left -= 3;
18482           }
18483         else
18484           {
18485             if (do_wide)
18486               left -= printf ("0x%llx", val);
18487             else
18488               left -= printf ("0x%-.*llx", left, val);
18489           }
18490       }
18491       break;
18492     case GNU_BUILD_ATTRIBUTE_TYPE_STRING:
18493       left -= print_symbol (- left, name);
18494       break;
18495     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_TRUE:
18496       left -= print_symbol (- left, "true");
18497       break;
18498     case GNU_BUILD_ATTRIBUTE_TYPE_BOOL_FALSE:
18499       left -= print_symbol (- left, "false");
18500       break;
18501     }
18502
18503   if (do_wide && left > 0)
18504     printf ("%-*s", left, " ");
18505     
18506   return TRUE;
18507 }
18508
18509 /* Note that by the ELF standard, the name field is already null byte
18510    terminated, and namesz includes the terminating null byte.
18511    I.E. the value of namesz for the name "FSF" is 4.
18512
18513    If the value of namesz is zero, there is no name present.  */
18514
18515 static bfd_boolean
18516 process_note (Elf_Internal_Note *  pnote,
18517               Filedata *           filedata)
18518 {
18519   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
18520   const char * nt;
18521
18522   if (pnote->namesz == 0)
18523     /* If there is no note name, then use the default set of
18524        note type strings.  */
18525     nt = get_note_type (filedata, pnote->type);
18526
18527   else if (const_strneq (pnote->namedata, "GNU"))
18528     /* GNU-specific object file notes.  */
18529     nt = get_gnu_elf_note_type (pnote->type);
18530
18531   else if (const_strneq (pnote->namedata, "FreeBSD"))
18532     /* FreeBSD-specific core file notes.  */
18533     nt = get_freebsd_elfcore_note_type (filedata, pnote->type);
18534
18535   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
18536     /* NetBSD-specific core file notes.  */
18537     nt = get_netbsd_elfcore_note_type (filedata, pnote->type);
18538
18539   else if (const_strneq (pnote->namedata, "NetBSD"))
18540     /* NetBSD-specific core file notes.  */
18541     return process_netbsd_elf_note (pnote);
18542
18543   else if (strneq (pnote->namedata, "SPU/", 4))
18544     {
18545       /* SPU-specific core file notes.  */
18546       nt = pnote->namedata + 4;
18547       name = "SPU";
18548     }
18549
18550   else if (const_strneq (pnote->namedata, "IPF/VMS"))
18551     /* VMS/ia64-specific file notes.  */
18552     nt = get_ia64_vms_note_type (pnote->type);
18553
18554   else if (const_strneq (pnote->namedata, "stapsdt"))
18555     nt = get_stapsdt_note_type (pnote->type);
18556
18557   else
18558     /* Don't recognize this note name; just use the default set of
18559        note type strings.  */
18560     nt = get_note_type (filedata, pnote->type);
18561
18562   printf ("  ");
18563
18564   if (((const_strneq (pnote->namedata, "GA")
18565         && strchr ("*$!+", pnote->namedata[2]) != NULL)
18566        || strchr ("*$!+", pnote->namedata[0]) != NULL)
18567       && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18568           || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
18569     print_gnu_build_attribute_name (pnote);
18570   else
18571     print_symbol (-20, name);
18572
18573   if (do_wide)
18574     printf (" 0x%08lx\t%s\t", pnote->descsz, nt);
18575   else
18576     printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
18577
18578   if (const_strneq (pnote->namedata, "IPF/VMS"))
18579     return print_ia64_vms_note (pnote);
18580   else if (const_strneq (pnote->namedata, "GNU"))
18581     return print_gnu_note (filedata, pnote);
18582   else if (const_strneq (pnote->namedata, "stapsdt"))
18583     return print_stapsdt_note (pnote);
18584   else if (const_strneq (pnote->namedata, "CORE"))
18585     return print_core_note (pnote);
18586   else if (((const_strneq (pnote->namedata, "GA")
18587              && strchr ("*$!+", pnote->namedata[2]) != NULL)
18588             || strchr ("*$!+", pnote->namedata[0]) != NULL)
18589            && (pnote->type == NT_GNU_BUILD_ATTRIBUTE_OPEN
18590                || pnote->type == NT_GNU_BUILD_ATTRIBUTE_FUNC))
18591     return print_gnu_build_attribute_description (pnote, filedata);
18592
18593   if (pnote->descsz)
18594     {
18595       unsigned long i;
18596
18597       printf (_("   description data: "));
18598       for (i = 0; i < pnote->descsz; i++)
18599         printf ("%02x ", pnote->descdata[i]);
18600       if (!do_wide)
18601         printf ("\n");
18602     }
18603
18604   if (do_wide)
18605     printf ("\n");
18606
18607   return TRUE;
18608 }
18609
18610 static bfd_boolean
18611 process_notes_at (Filedata *           filedata,
18612                   Elf_Internal_Shdr *  section,
18613                   bfd_vma              offset,
18614                   bfd_vma              length,
18615                   bfd_vma              align)
18616 {
18617   Elf_External_Note * pnotes;
18618   Elf_External_Note * external;
18619   char *              end;
18620   bfd_boolean         res = TRUE;
18621
18622   if (length <= 0)
18623     return FALSE;
18624
18625   if (section)
18626     {
18627       pnotes = (Elf_External_Note *) get_section_contents (section, filedata);
18628       if (pnotes)
18629         {
18630           if (! apply_relocations (filedata, section, (unsigned char *) pnotes, length, NULL, NULL))
18631             return FALSE;
18632         }
18633     }
18634   else
18635     pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18636                                              _("notes"));
18637
18638   if (pnotes == NULL)
18639     return FALSE;
18640
18641   external = pnotes;
18642
18643   if (section)
18644     printf (_("\nDisplaying notes found in: %s\n"), printable_section_name (filedata, section));
18645   else
18646     printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
18647             (unsigned long) offset, (unsigned long) length);
18648
18649   /* NB: Some note sections may have alignment value of 0 or 1.  gABI
18650      specifies that notes should be aligned to 4 bytes in 32-bit
18651      objects and to 8 bytes in 64-bit objects.  As a Linux extension,
18652      we also support 4 byte alignment in 64-bit objects.  If section
18653      alignment is less than 4, we treate alignment as 4 bytes.   */
18654   if (align < 4)
18655     align = 4;
18656   else if (align != 4 && align != 8)
18657     {
18658       warn (_("Corrupt note: alignment %ld, expecting 4 or 8\n"),
18659             (long) align);
18660       return FALSE;
18661     }
18662
18663   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
18664
18665   end = (char *) pnotes + length;
18666   while ((char *) external < end)
18667     {
18668       Elf_Internal_Note inote;
18669       size_t min_notesz;
18670       char * next;
18671       char * temp = NULL;
18672       size_t data_remaining = end - (char *) external;
18673
18674       if (!is_ia64_vms (filedata))
18675         {
18676           /* PR binutils/15191
18677              Make sure that there is enough data to read.  */
18678           min_notesz = offsetof (Elf_External_Note, name);
18679           if (data_remaining < min_notesz)
18680             {
18681               warn (ngettext ("Corrupt note: only %ld byte remains, "
18682                               "not enough for a full note\n",
18683                               "Corrupt note: only %ld bytes remain, "
18684                               "not enough for a full note\n",
18685                               data_remaining),
18686                     (long) data_remaining);
18687               break;
18688             }
18689           data_remaining -= min_notesz;
18690
18691           inote.type     = BYTE_GET (external->type);
18692           inote.namesz   = BYTE_GET (external->namesz);
18693           inote.namedata = external->name;
18694           inote.descsz   = BYTE_GET (external->descsz);
18695           inote.descdata = ((char *) external
18696                             + ELF_NOTE_DESC_OFFSET (inote.namesz, align));
18697           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
18698           next = ((char *) external
18699                   + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
18700         }
18701       else
18702         {
18703           Elf64_External_VMS_Note *vms_external;
18704
18705           /* PR binutils/15191
18706              Make sure that there is enough data to read.  */
18707           min_notesz = offsetof (Elf64_External_VMS_Note, name);
18708           if (data_remaining < min_notesz)
18709             {
18710               warn (ngettext ("Corrupt note: only %ld byte remains, "
18711                               "not enough for a full note\n",
18712                               "Corrupt note: only %ld bytes remain, "
18713                               "not enough for a full note\n",
18714                               data_remaining),
18715                     (long) data_remaining);
18716               break;
18717             }
18718           data_remaining -= min_notesz;
18719
18720           vms_external = (Elf64_External_VMS_Note *) external;
18721           inote.type     = BYTE_GET (vms_external->type);
18722           inote.namesz   = BYTE_GET (vms_external->namesz);
18723           inote.namedata = vms_external->name;
18724           inote.descsz   = BYTE_GET (vms_external->descsz);
18725           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
18726           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
18727           next = inote.descdata + align_power (inote.descsz, 3);
18728         }
18729
18730       /* PR 17531: file: 3443835e.  */
18731       /* PR 17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4.  */
18732       if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
18733           || (size_t) (inote.descdata - inote.namedata) > data_remaining
18734           || (size_t) (next - inote.descdata) < inote.descsz
18735           || ((size_t) (next - inote.descdata)
18736               > data_remaining - (size_t) (inote.descdata - inote.namedata)))
18737         {
18738           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
18739                 (unsigned long) ((char *) external - (char *) pnotes));
18740           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx, alignment: %u\n"),
18741                 inote.type, inote.namesz, inote.descsz, (int) align);
18742           break;
18743         }
18744
18745       external = (Elf_External_Note *) next;
18746
18747       /* Verify that name is null terminated.  It appears that at least
18748          one version of Linux (RedHat 6.0) generates corefiles that don't
18749          comply with the ELF spec by failing to include the null byte in
18750          namesz.  */
18751       if (inote.namesz > 0 && inote.namedata[inote.namesz - 1] != '\0')
18752         {
18753           if ((size_t) (inote.descdata - inote.namedata) == inote.namesz)
18754             {
18755               temp = (char *) malloc (inote.namesz + 1);
18756               if (temp == NULL)
18757                 {
18758                   error (_("Out of memory allocating space for inote name\n"));
18759                   res = FALSE;
18760                   break;
18761                 }
18762
18763               memcpy (temp, inote.namedata, inote.namesz);
18764               inote.namedata = temp;
18765             }
18766           inote.namedata[inote.namesz] = 0;
18767         }
18768
18769       if (! process_note (& inote, filedata))
18770         res = FALSE;
18771
18772       if (temp != NULL)
18773         {
18774           free (temp);
18775           temp = NULL;
18776         }
18777     }
18778
18779   free (pnotes);
18780
18781   return res;
18782 }
18783
18784 static bfd_boolean
18785 process_corefile_note_segments (Filedata * filedata)
18786 {
18787   Elf_Internal_Phdr * segment;
18788   unsigned int i;
18789   bfd_boolean res = TRUE;
18790
18791   if (! get_program_headers (filedata))
18792     return TRUE;
18793
18794   for (i = 0, segment = filedata->program_headers;
18795        i < filedata->file_header.e_phnum;
18796        i++, segment++)
18797     {
18798       if (segment->p_type == PT_NOTE)
18799         if (! process_notes_at (filedata, NULL,
18800                                 (bfd_vma) segment->p_offset,
18801                                 (bfd_vma) segment->p_filesz,
18802                                 (bfd_vma) segment->p_align))
18803           res = FALSE;
18804     }
18805
18806   return res;
18807 }
18808
18809 static bfd_boolean
18810 process_v850_notes (Filedata * filedata, bfd_vma offset, bfd_vma length)
18811 {
18812   Elf_External_Note * pnotes;
18813   Elf_External_Note * external;
18814   char * end;
18815   bfd_boolean res = TRUE;
18816
18817   if (length <= 0)
18818     return FALSE;
18819
18820   pnotes = (Elf_External_Note *) get_data (NULL, filedata, offset, 1, length,
18821                                            _("v850 notes"));
18822   if (pnotes == NULL)
18823     return FALSE;
18824
18825   external = pnotes;
18826   end = (char*) pnotes + length;
18827
18828   printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
18829           (unsigned long) offset, (unsigned long) length);
18830
18831   while ((char *) external + sizeof (Elf_External_Note) < end)
18832     {
18833       Elf_External_Note * next;
18834       Elf_Internal_Note inote;
18835
18836       inote.type     = BYTE_GET (external->type);
18837       inote.namesz   = BYTE_GET (external->namesz);
18838       inote.namedata = external->name;
18839       inote.descsz   = BYTE_GET (external->descsz);
18840       inote.descdata = inote.namedata + align_power (inote.namesz, 2);
18841       inote.descpos  = offset + (inote.descdata - (char *) pnotes);
18842
18843       if (inote.descdata < (char *) pnotes || inote.descdata >= end)
18844         {
18845           warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
18846           inote.descdata = inote.namedata;
18847           inote.namesz   = 0;
18848         }
18849
18850       next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
18851
18852       if (   ((char *) next > end)
18853           || ((char *) next <  (char *) pnotes))
18854         {
18855           warn (_("corrupt descsz found in note at offset 0x%lx\n"),
18856                 (unsigned long) ((char *) external - (char *) pnotes));
18857           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
18858                 inote.type, inote.namesz, inote.descsz);
18859           break;
18860         }
18861
18862       external = next;
18863
18864       /* Prevent out-of-bounds indexing.  */
18865       if (   inote.namedata + inote.namesz > end
18866           || inote.namedata + inote.namesz < inote.namedata)
18867         {
18868           warn (_("corrupt namesz found in note at offset 0x%lx\n"),
18869                 (unsigned long) ((char *) external - (char *) pnotes));
18870           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
18871                 inote.type, inote.namesz, inote.descsz);
18872           break;
18873         }
18874
18875       printf ("  %s: ", get_v850_elf_note_type (inote.type));
18876
18877       if (! print_v850_note (& inote))
18878         {
18879           res = FALSE;
18880           printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
18881                   inote.namesz, inote.descsz);
18882         }
18883     }
18884
18885   free (pnotes);
18886
18887   return res;
18888 }
18889
18890 static bfd_boolean
18891 process_note_sections (Filedata * filedata)
18892 {
18893   Elf_Internal_Shdr * section;
18894   unsigned long i;
18895   unsigned int n = 0;
18896   bfd_boolean res = TRUE;
18897
18898   for (i = 0, section = filedata->section_headers;
18899        i < filedata->file_header.e_shnum && section != NULL;
18900        i++, section++)
18901     {
18902       if (section->sh_type == SHT_NOTE)
18903         {
18904           if (! process_notes_at (filedata, section,
18905                                   (bfd_vma) section->sh_offset,
18906                                   (bfd_vma) section->sh_size,
18907                                   (bfd_vma) section->sh_addralign))
18908             res = FALSE;
18909           n++;
18910         }
18911
18912       if ((   filedata->file_header.e_machine == EM_V800
18913            || filedata->file_header.e_machine == EM_V850
18914            || filedata->file_header.e_machine == EM_CYGNUS_V850)
18915           && section->sh_type == SHT_RENESAS_INFO)
18916         {
18917           if (! process_v850_notes (filedata,
18918                                     (bfd_vma) section->sh_offset,
18919                                     (bfd_vma) section->sh_size))
18920             res = FALSE;
18921           n++;
18922         }
18923     }
18924
18925   if (n == 0)
18926     /* Try processing NOTE segments instead.  */
18927     return process_corefile_note_segments (filedata);
18928
18929   return res;
18930 }
18931
18932 static bfd_boolean
18933 process_notes (Filedata * filedata)
18934 {
18935   /* If we have not been asked to display the notes then do nothing.  */
18936   if (! do_notes)
18937     return TRUE;
18938
18939   if (filedata->file_header.e_type != ET_CORE)
18940     return process_note_sections (filedata);
18941
18942   /* No program headers means no NOTE segment.  */
18943   if (filedata->file_header.e_phnum > 0)
18944     return process_corefile_note_segments (filedata);
18945
18946   printf (_("No note segments present in the core file.\n"));
18947   return TRUE;
18948 }
18949
18950 static unsigned char *
18951 display_public_gnu_attributes (unsigned char * start,
18952                                const unsigned char * const end)
18953 {
18954   printf (_("  Unknown GNU attribute: %s\n"), start);
18955
18956   start += strnlen ((char *) start, end - start);
18957   display_raw_attribute (start, end);
18958
18959   return (unsigned char *) end;
18960 }
18961
18962 static unsigned char *
18963 display_generic_attribute (unsigned char * start,
18964                            unsigned int tag,
18965                            const unsigned char * const end)
18966 {
18967   if (tag == 0)
18968     return (unsigned char *) end;
18969
18970   return display_tag_value (tag, start, end);
18971 }
18972
18973 static bfd_boolean
18974 process_arch_specific (Filedata * filedata)
18975 {
18976   if (! do_arch)
18977     return TRUE;
18978
18979   switch (filedata->file_header.e_machine)
18980     {
18981     case EM_ARC:
18982     case EM_ARC_COMPACT:
18983     case EM_ARC_COMPACT2:
18984       return process_attributes (filedata, "ARC", SHT_ARC_ATTRIBUTES,
18985                                  display_arc_attribute,
18986                                  display_generic_attribute);
18987     case EM_ARM:
18988       return process_attributes (filedata, "aeabi", SHT_ARM_ATTRIBUTES,
18989                                  display_arm_attribute,
18990                                  display_generic_attribute);
18991
18992     case EM_MIPS:
18993     case EM_MIPS_RS3_LE:
18994       return process_mips_specific (filedata);
18995
18996     case EM_MSP430:
18997      return process_attributes (filedata, "mspabi", SHT_MSP430_ATTRIBUTES,
18998                                 display_msp430x_attribute,
18999                                 display_generic_attribute);
19000
19001     case EM_RISCV:
19002      return process_attributes (filedata, "riscv", SHT_RISCV_ATTRIBUTES,
19003                                 display_riscv_attribute,
19004                                 display_generic_attribute);
19005
19006     case EM_NDS32:
19007       return process_nds32_specific (filedata);
19008
19009     case EM_PPC:
19010     case EM_PPC64:
19011       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19012                                  display_power_gnu_attribute);
19013
19014     case EM_S390:
19015     case EM_S390_OLD:
19016       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19017                                  display_s390_gnu_attribute);
19018
19019     case EM_SPARC:
19020     case EM_SPARC32PLUS:
19021     case EM_SPARCV9:
19022       return process_attributes (filedata, NULL, SHT_GNU_ATTRIBUTES, NULL,
19023                                  display_sparc_gnu_attribute);
19024
19025     case EM_TI_C6000:
19026       return process_attributes (filedata, "c6xabi", SHT_C6000_ATTRIBUTES,
19027                                  display_tic6x_attribute,
19028                                  display_generic_attribute);
19029
19030     default:
19031       return process_attributes (filedata, "gnu", SHT_GNU_ATTRIBUTES,
19032                                  display_public_gnu_attributes,
19033                                  display_generic_attribute);
19034     }
19035 }
19036
19037 static bfd_boolean
19038 get_file_header (Filedata * filedata)
19039 {
19040   /* Read in the identity array.  */
19041   if (fread (filedata->file_header.e_ident, EI_NIDENT, 1, filedata->handle) != 1)
19042     return FALSE;
19043
19044   /* Determine how to read the rest of the header.  */
19045   switch (filedata->file_header.e_ident[EI_DATA])
19046     {
19047     default:
19048     case ELFDATANONE:
19049     case ELFDATA2LSB:
19050       byte_get = byte_get_little_endian;
19051       byte_put = byte_put_little_endian;
19052       break;
19053     case ELFDATA2MSB:
19054       byte_get = byte_get_big_endian;
19055       byte_put = byte_put_big_endian;
19056       break;
19057     }
19058
19059   /* For now we only support 32 bit and 64 bit ELF files.  */
19060   is_32bit_elf = (filedata->file_header.e_ident[EI_CLASS] != ELFCLASS64);
19061
19062   /* Read in the rest of the header.  */
19063   if (is_32bit_elf)
19064     {
19065       Elf32_External_Ehdr ehdr32;
19066
19067       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, filedata->handle) != 1)
19068         return FALSE;
19069
19070       filedata->file_header.e_type      = BYTE_GET (ehdr32.e_type);
19071       filedata->file_header.e_machine   = BYTE_GET (ehdr32.e_machine);
19072       filedata->file_header.e_version   = BYTE_GET (ehdr32.e_version);
19073       filedata->file_header.e_entry     = BYTE_GET (ehdr32.e_entry);
19074       filedata->file_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
19075       filedata->file_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
19076       filedata->file_header.e_flags     = BYTE_GET (ehdr32.e_flags);
19077       filedata->file_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
19078       filedata->file_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
19079       filedata->file_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
19080       filedata->file_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
19081       filedata->file_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
19082       filedata->file_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
19083     }
19084   else
19085     {
19086       Elf64_External_Ehdr ehdr64;
19087
19088       /* If we have been compiled with sizeof (bfd_vma) == 4, then
19089          we will not be able to cope with the 64bit data found in
19090          64 ELF files.  Detect this now and abort before we start
19091          overwriting things.  */
19092       if (sizeof (bfd_vma) < 8)
19093         {
19094           error (_("This instance of readelf has been built without support for a\n\
19095 64 bit data type and so it cannot read 64 bit ELF files.\n"));
19096           return FALSE;
19097         }
19098
19099       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, filedata->handle) != 1)
19100         return FALSE;
19101
19102       filedata->file_header.e_type      = BYTE_GET (ehdr64.e_type);
19103       filedata->file_header.e_machine   = BYTE_GET (ehdr64.e_machine);
19104       filedata->file_header.e_version   = BYTE_GET (ehdr64.e_version);
19105       filedata->file_header.e_entry     = BYTE_GET (ehdr64.e_entry);
19106       filedata->file_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
19107       filedata->file_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
19108       filedata->file_header.e_flags     = BYTE_GET (ehdr64.e_flags);
19109       filedata->file_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
19110       filedata->file_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
19111       filedata->file_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
19112       filedata->file_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
19113       filedata->file_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
19114       filedata->file_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
19115     }
19116
19117   if (filedata->file_header.e_shoff)
19118     {
19119       /* There may be some extensions in the first section header.  Don't
19120          bomb if we can't read it.  */
19121       if (is_32bit_elf)
19122         get_32bit_section_headers (filedata, TRUE);
19123       else
19124         get_64bit_section_headers (filedata, TRUE);
19125     }
19126
19127   return TRUE;
19128 }
19129
19130 static void
19131 close_file (Filedata * filedata)
19132 {
19133   if (filedata)
19134     {
19135       if (filedata->handle)
19136         fclose (filedata->handle);
19137       free (filedata);
19138     }
19139 }
19140
19141 void
19142 close_debug_file (void * data)
19143 {
19144   close_file ((Filedata *) data);
19145 }
19146
19147 static Filedata *
19148 open_file (const char * pathname)
19149 {
19150   struct stat  statbuf;
19151   Filedata *   filedata = NULL;
19152
19153   if (stat (pathname, & statbuf) < 0
19154       || ! S_ISREG (statbuf.st_mode))
19155     goto fail;
19156
19157   filedata = calloc (1, sizeof * filedata);
19158   if (filedata == NULL)
19159     goto fail;
19160
19161   filedata->handle = fopen (pathname, "rb");
19162   if (filedata->handle == NULL)
19163     goto fail;
19164
19165   filedata->file_size = (bfd_size_type) statbuf.st_size;
19166   filedata->file_name = pathname;
19167
19168   if (! get_file_header (filedata))
19169     goto fail;
19170
19171   if (filedata->file_header.e_shoff)
19172     {
19173       bfd_boolean res;
19174
19175       /* Read the section headers again, this time for real.  */
19176       if (is_32bit_elf)
19177         res = get_32bit_section_headers (filedata, FALSE);
19178       else
19179         res = get_64bit_section_headers (filedata, FALSE);
19180
19181       if (!res)
19182         goto fail;
19183     }
19184
19185   return filedata;
19186
19187  fail:
19188   if (filedata)
19189     {
19190       if (filedata->handle)
19191         fclose (filedata->handle);
19192       free (filedata);
19193     }
19194   return NULL;
19195 }
19196
19197 void *
19198 open_debug_file (const char * pathname)
19199 {
19200   return open_file (pathname);
19201 }
19202
19203 /* Process one ELF object file according to the command line options.
19204    This file may actually be stored in an archive.  The file is
19205    positioned at the start of the ELF object.  Returns TRUE if no
19206    problems were encountered, FALSE otherwise.  */
19207
19208 static bfd_boolean
19209 process_object (Filedata * filedata)
19210 {
19211   Filedata * separates;
19212   unsigned int i;
19213   bfd_boolean res = TRUE;
19214
19215   if (! get_file_header (filedata))
19216     {
19217       error (_("%s: Failed to read file header\n"), filedata->file_name);
19218       return FALSE;
19219     }
19220
19221   /* Initialise per file variables.  */
19222   for (i = ARRAY_SIZE (version_info); i--;)
19223     version_info[i] = 0;
19224
19225   for (i = ARRAY_SIZE (dynamic_info); i--;)
19226     dynamic_info[i] = 0;
19227   dynamic_info_DT_GNU_HASH = 0;
19228
19229   /* Process the file.  */
19230   if (show_name)
19231     printf (_("\nFile: %s\n"), filedata->file_name);
19232
19233   /* Initialise the dump_sects array from the cmdline_dump_sects array.
19234      Note we do this even if cmdline_dump_sects is empty because we
19235      must make sure that the dump_sets array is zeroed out before each
19236      object file is processed.  */
19237   if (filedata->num_dump_sects > cmdline.num_dump_sects)
19238     memset (filedata->dump_sects, 0, filedata->num_dump_sects * sizeof (* filedata->dump_sects));
19239
19240   if (cmdline.num_dump_sects > 0)
19241     {
19242       if (filedata->num_dump_sects == 0)
19243         /* A sneaky way of allocating the dump_sects array.  */
19244         request_dump_bynumber (filedata, cmdline.num_dump_sects, 0);
19245
19246       assert (filedata->num_dump_sects >= cmdline.num_dump_sects);
19247       memcpy (filedata->dump_sects, cmdline.dump_sects,
19248               cmdline.num_dump_sects * sizeof (* filedata->dump_sects));
19249     }
19250
19251   if (! process_file_header (filedata))
19252     return FALSE;
19253
19254   if (! process_section_headers (filedata))
19255     {
19256       /* Without loaded section headers we cannot process lots of things.  */
19257       do_unwind = do_version = do_dump = do_arch = FALSE;
19258
19259       if (! do_using_dynamic)
19260         do_syms = do_dyn_syms = do_reloc = FALSE;
19261     }
19262
19263   if (! process_section_groups (filedata))
19264     /* Without loaded section groups we cannot process unwind.  */
19265     do_unwind = FALSE;
19266
19267   if (process_program_headers (filedata))
19268     process_dynamic_section (filedata);
19269   else
19270     res = FALSE;
19271
19272   if (! process_relocs (filedata))
19273     res = FALSE;
19274
19275   if (! process_unwind (filedata))
19276     res = FALSE;
19277
19278   if (! process_symbol_table (filedata))
19279     res = FALSE;
19280
19281   if (! process_syminfo (filedata))
19282     res = FALSE;
19283
19284   if (! process_version_sections (filedata))
19285     res = FALSE;
19286
19287   if (filedata->file_header.e_shstrndx != SHN_UNDEF)
19288     separates = load_separate_debug_file (filedata, filedata->file_name);
19289   else
19290     separates = NULL;
19291
19292   if (! process_section_contents (filedata))
19293     res = FALSE;
19294
19295   if (separates)
19296     {
19297       if (! process_section_headers (separates))
19298         res = FALSE;
19299       else if (! process_section_contents (separates))
19300         res = FALSE;
19301     }
19302
19303   if (! process_notes (filedata))
19304     res = FALSE;
19305
19306   if (! process_gnu_liblist (filedata))
19307     res = FALSE;
19308
19309   if (! process_arch_specific (filedata))
19310     res = FALSE;
19311
19312   free (filedata->program_headers);
19313   filedata->program_headers = NULL;
19314
19315   free (filedata->section_headers);
19316   filedata->section_headers = NULL;
19317
19318   free (filedata->string_table);
19319   filedata->string_table = NULL;
19320   filedata->string_table_length = 0;
19321
19322   if (dynamic_strings)
19323     {
19324       free (dynamic_strings);
19325       dynamic_strings = NULL;
19326       dynamic_strings_length = 0;
19327     }
19328
19329   if (dynamic_symbols)
19330     {
19331       free (dynamic_symbols);
19332       dynamic_symbols = NULL;
19333       num_dynamic_syms = 0;
19334     }
19335
19336   if (dynamic_syminfo)
19337     {
19338       free (dynamic_syminfo);
19339       dynamic_syminfo = NULL;
19340     }
19341
19342   if (dynamic_section)
19343     {
19344       free (dynamic_section);
19345       dynamic_section = NULL;
19346     }
19347
19348   if (section_headers_groups)
19349     {
19350       free (section_headers_groups);
19351       section_headers_groups = NULL;
19352     }
19353
19354   if (section_groups)
19355     {
19356       struct group_list * g;
19357       struct group_list * next;
19358
19359       for (i = 0; i < group_count; i++)
19360         {
19361           for (g = section_groups [i].root; g != NULL; g = next)
19362             {
19363               next = g->next;
19364               free (g);
19365             }
19366         }
19367
19368       free (section_groups);
19369       section_groups = NULL;
19370     }
19371
19372   free_debug_memory ();
19373
19374   return res;
19375 }
19376
19377 /* Process an ELF archive.
19378    On entry the file is positioned just after the ARMAG string.
19379    Returns TRUE upon success, FALSE otherwise.  */
19380
19381 static bfd_boolean
19382 process_archive (Filedata * filedata, bfd_boolean is_thin_archive)
19383 {
19384   struct archive_info arch;
19385   struct archive_info nested_arch;
19386   size_t got;
19387   bfd_boolean ret = TRUE;
19388
19389   show_name = TRUE;
19390
19391   /* The ARCH structure is used to hold information about this archive.  */
19392   arch.file_name = NULL;
19393   arch.file = NULL;
19394   arch.index_array = NULL;
19395   arch.sym_table = NULL;
19396   arch.longnames = NULL;
19397
19398   /* The NESTED_ARCH structure is used as a single-item cache of information
19399      about a nested archive (when members of a thin archive reside within
19400      another regular archive file).  */
19401   nested_arch.file_name = NULL;
19402   nested_arch.file = NULL;
19403   nested_arch.index_array = NULL;
19404   nested_arch.sym_table = NULL;
19405   nested_arch.longnames = NULL;
19406
19407   if (setup_archive (&arch, filedata->file_name, filedata->handle,
19408                      is_thin_archive, do_archive_index) != 0)
19409     {
19410       ret = FALSE;
19411       goto out;
19412     }
19413
19414   if (do_archive_index)
19415     {
19416       if (arch.sym_table == NULL)
19417         error (_("%s: unable to dump the index as none was found\n"), filedata->file_name);
19418       else
19419         {
19420           unsigned long i, l;
19421           unsigned long current_pos;
19422
19423           printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
19424                   filedata->file_name, (unsigned long) arch.index_num, arch.sym_size);
19425
19426           current_pos = ftell (filedata->handle);
19427
19428           for (i = l = 0; i < arch.index_num; i++)
19429             {
19430               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
19431                 {
19432                   char * member_name;
19433
19434                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
19435
19436                   if (member_name != NULL)
19437                     {
19438                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
19439
19440                       if (qualified_name != NULL)
19441                         {
19442                           printf (_("Contents of binary %s at offset "), qualified_name);
19443                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
19444                           putchar ('\n');
19445                           free (qualified_name);
19446                         }
19447                     }
19448                 }
19449
19450               if (l >= arch.sym_size)
19451                 {
19452                   error (_("%s: end of the symbol table reached before the end of the index\n"),
19453                          filedata->file_name);
19454                   ret = FALSE;
19455                   break;
19456                 }
19457               /* PR 17531: file: 0b6630b2.  */
19458               printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
19459               l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
19460             }
19461
19462           if (arch.uses_64bit_indices)
19463             l = (l + 7) & ~ 7;
19464           else
19465             l += l & 1;
19466
19467           if (l < arch.sym_size)
19468             {
19469               error (ngettext ("%s: %ld byte remains in the symbol table, "
19470                                "but without corresponding entries in "
19471                                "the index table\n",
19472                                "%s: %ld bytes remain in the symbol table, "
19473                                "but without corresponding entries in "
19474                                "the index table\n",
19475                                arch.sym_size - l),
19476                      filedata->file_name, arch.sym_size - l);
19477               ret = FALSE;
19478             }
19479
19480           if (fseek (filedata->handle, current_pos, SEEK_SET) != 0)
19481             {
19482               error (_("%s: failed to seek back to start of object files in the archive\n"),
19483                      filedata->file_name);
19484               ret = FALSE;
19485               goto out;
19486             }
19487         }
19488
19489       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
19490           && !do_segments && !do_header && !do_dump && !do_version
19491           && !do_histogram && !do_debugging && !do_arch && !do_notes
19492           && !do_section_groups && !do_dyn_syms)
19493         {
19494           ret = TRUE; /* Archive index only.  */
19495           goto out;
19496         }
19497     }
19498
19499   while (1)
19500     {
19501       char * name;
19502       size_t namelen;
19503       char * qualified_name;
19504
19505       /* Read the next archive header.  */
19506       if (fseek (filedata->handle, arch.next_arhdr_offset, SEEK_SET) != 0)
19507         {
19508           error (_("%s: failed to seek to next archive header\n"), arch.file_name);
19509           return FALSE;
19510         }
19511       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, filedata->handle);
19512       if (got != sizeof arch.arhdr)
19513         {
19514           if (got == 0)
19515             break;
19516           /* PR 24049 - we cannot use filedata->file_name as this will
19517              have already been freed.  */
19518           error (_("%s: failed to read archive header\n"), arch.file_name);
19519             
19520           ret = FALSE;
19521           break;
19522         }
19523       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
19524         {
19525           error (_("%s: did not find a valid archive header\n"), arch.file_name);
19526           ret = FALSE;
19527           break;
19528         }
19529
19530       arch.next_arhdr_offset += sizeof arch.arhdr;
19531
19532       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
19533       if (archive_file_size & 01)
19534         ++archive_file_size;
19535
19536       name = get_archive_member_name (&arch, &nested_arch);
19537       if (name == NULL)
19538         {
19539           error (_("%s: bad archive file name\n"), arch.file_name);
19540           ret = FALSE;
19541           break;
19542         }
19543       namelen = strlen (name);
19544
19545       qualified_name = make_qualified_name (&arch, &nested_arch, name);
19546       if (qualified_name == NULL)
19547         {
19548           error (_("%s: bad archive file name\n"), arch.file_name);
19549           ret = FALSE;
19550           break;
19551         }
19552
19553       if (is_thin_archive && arch.nested_member_origin == 0)
19554         {
19555           /* This is a proxy for an external member of a thin archive.  */
19556           Filedata * member_filedata;
19557           char * member_file_name = adjust_relative_path
19558             (filedata->file_name, name, namelen);
19559
19560           if (member_file_name == NULL)
19561             {
19562               ret = FALSE;
19563               break;
19564             }
19565
19566           member_filedata = open_file (member_file_name);
19567           if (member_filedata == NULL)
19568             {
19569               error (_("Input file '%s' is not readable.\n"), member_file_name);
19570               free (member_file_name);
19571               ret = FALSE;
19572               break;
19573             }
19574
19575           archive_file_offset = arch.nested_member_origin;
19576           member_filedata->file_name = qualified_name;
19577
19578           if (! process_object (member_filedata))
19579             ret = FALSE;
19580
19581           close_file (member_filedata);
19582           free (member_file_name);
19583         }
19584       else if (is_thin_archive)
19585         {
19586           Filedata thin_filedata;
19587
19588           memset (&thin_filedata, 0, sizeof (thin_filedata));
19589
19590           /* PR 15140: Allow for corrupt thin archives.  */
19591           if (nested_arch.file == NULL)
19592             {
19593               error (_("%s: contains corrupt thin archive: %s\n"),
19594                      qualified_name, name);
19595               ret = FALSE;
19596               break;
19597             }
19598
19599           /* This is a proxy for a member of a nested archive.  */
19600           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
19601
19602           /* The nested archive file will have been opened and setup by
19603              get_archive_member_name.  */
19604           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
19605             {
19606               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
19607               ret = FALSE;
19608               break;
19609             }
19610
19611           thin_filedata.handle = nested_arch.file;
19612           thin_filedata.file_name = qualified_name;
19613           
19614           if (! process_object (& thin_filedata))
19615             ret = FALSE;
19616         }
19617       else
19618         {
19619           archive_file_offset = arch.next_arhdr_offset;
19620           arch.next_arhdr_offset += archive_file_size;
19621
19622           filedata->file_name = qualified_name;
19623           if (! process_object (filedata))
19624             ret = FALSE;
19625         }
19626
19627       if (filedata->dump_sects != NULL)
19628         {
19629           free (filedata->dump_sects);
19630           filedata->dump_sects = NULL;
19631           filedata->num_dump_sects = 0;
19632         }
19633
19634       free (qualified_name);
19635     }
19636
19637  out:
19638   if (nested_arch.file != NULL)
19639     fclose (nested_arch.file);
19640   release_archive (&nested_arch);
19641   release_archive (&arch);
19642
19643   return ret;
19644 }
19645
19646 static bfd_boolean
19647 process_file (char * file_name)
19648 {
19649   Filedata * filedata = NULL;
19650   struct stat statbuf;
19651   char armag[SARMAG];
19652   bfd_boolean ret = TRUE;
19653
19654   if (stat (file_name, &statbuf) < 0)
19655     {
19656       if (errno == ENOENT)
19657         error (_("'%s': No such file\n"), file_name);
19658       else
19659         error (_("Could not locate '%s'.  System error message: %s\n"),
19660                file_name, strerror (errno));
19661       return FALSE;
19662     }
19663
19664   if (! S_ISREG (statbuf.st_mode))
19665     {
19666       error (_("'%s' is not an ordinary file\n"), file_name);
19667       return FALSE;
19668     }
19669
19670   filedata = calloc (1, sizeof * filedata);
19671   if (filedata == NULL)
19672     {
19673       error (_("Out of memory allocating file data structure\n"));
19674       return FALSE;
19675     }
19676
19677   filedata->file_name = file_name;
19678   filedata->handle = fopen (file_name, "rb");
19679   if (filedata->handle == NULL)
19680     {
19681       error (_("Input file '%s' is not readable.\n"), file_name);
19682       free (filedata);
19683       return FALSE;
19684     }
19685
19686   if (fread (armag, SARMAG, 1, filedata->handle) != 1)
19687     {
19688       error (_("%s: Failed to read file's magic number\n"), file_name);
19689       fclose (filedata->handle);
19690       free (filedata);
19691       return FALSE;
19692     }
19693
19694   filedata->file_size = (bfd_size_type) statbuf.st_size;
19695
19696   if (memcmp (armag, ARMAG, SARMAG) == 0)
19697     {
19698       if (! process_archive (filedata, FALSE))
19699         ret = FALSE;
19700     }
19701   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
19702     {
19703       if ( ! process_archive (filedata, TRUE))
19704         ret = FALSE;
19705     }
19706   else
19707     {
19708       if (do_archive_index)
19709         error (_("File %s is not an archive so its index cannot be displayed.\n"),
19710                file_name);
19711
19712       rewind (filedata->handle);
19713       archive_file_size = archive_file_offset = 0;
19714
19715       if (! process_object (filedata))
19716         ret = FALSE;
19717     }
19718
19719   fclose (filedata->handle);
19720   free (filedata);
19721
19722   return ret;
19723 }
19724
19725 #ifdef SUPPORT_DISASSEMBLY
19726 /* Needed by the i386 disassembler.  For extra credit, someone could
19727    fix this so that we insert symbolic addresses here, esp for GOT/PLT
19728    symbols.  */
19729
19730 void
19731 print_address (unsigned int addr, FILE * outfile)
19732 {
19733   fprintf (outfile,"0x%8.8x", addr);
19734 }
19735
19736 /* Needed by the i386 disassembler.  */
19737
19738 void
19739 db_task_printsym (unsigned int addr)
19740 {
19741   print_address (addr, stderr);
19742 }
19743 #endif
19744
19745 int
19746 main (int argc, char ** argv)
19747 {
19748   int err;
19749
19750 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
19751   setlocale (LC_MESSAGES, "");
19752 #endif
19753 #if defined (HAVE_SETLOCALE)
19754   setlocale (LC_CTYPE, "");
19755 #endif
19756   bindtextdomain (PACKAGE, LOCALEDIR);
19757   textdomain (PACKAGE);
19758
19759   expandargv (&argc, &argv);
19760
19761   cmdline.file_name = "<cmdline>";
19762   parse_args (& cmdline, argc, argv);
19763
19764   if (optind < (argc - 1))
19765     show_name = TRUE;
19766   else if (optind >= argc)
19767     {
19768       warn (_("Nothing to do.\n"));
19769       usage (stderr);
19770     }
19771
19772   err = FALSE;
19773   while (optind < argc)
19774     if (! process_file (argv[optind++]))
19775       err = TRUE;
19776
19777   if (cmdline.dump_sects != NULL)
19778     free (cmdline.dump_sects);
19779
19780   return err ? EXIT_FAILURE : EXIT_SUCCESS;
19781 }