Check the external compression header size
[external/binutils.git] / binutils / readelf.c
1 /* readelf.c -- display contents of an ELF format file
2    Copyright (C) 1998-2016 Free Software Foundation, Inc.
3
4    Originally developed by Eric Youngdale <eric@andante.jic.com>
5    Modifications by Nick Clifton <nickc@redhat.com>
6
7    This file is part of GNU Binutils.
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
22    02110-1301, USA.  */
23 \f
24 /* The difference between readelf and objdump:
25
26   Both programs are capable of displaying the contents of ELF format files,
27   so why does the binutils project have two file dumpers ?
28
29   The reason is that objdump sees an ELF file through a BFD filter of the
30   world; if BFD has a bug where, say, it disagrees about a machine constant
31   in e_flags, then the odds are good that it will remain internally
32   consistent.  The linker sees it the BFD way, objdump sees it the BFD way,
33   GAS sees it the BFD way.  There was need for a tool to go find out what
34   the file actually says.
35
36   This is why the readelf program does not link against the BFD library - it
37   exists as an independent program to help verify the correct working of BFD.
38
39   There is also the case that readelf can provide more information about an
40   ELF file than is provided by objdump.  In particular it can display DWARF
41   debugging information which (at the moment) objdump cannot.  */
42 \f
43 #include "sysdep.h"
44 #include <assert.h>
45 #include <time.h>
46 #include <zlib.h>
47 #ifdef HAVE_WCHAR_H
48 #include <wchar.h>
49 #endif
50
51 #if __GNUC__ >= 2
52 /* Define BFD64 here, even if our default architecture is 32 bit ELF
53    as this will allow us to read in and parse 64bit and 32bit ELF files.
54    Only do this if we believe that the compiler can support a 64 bit
55    data type.  For now we only rely on GCC being able to do this.  */
56 #define BFD64
57 #endif
58
59 #include "bfd.h"
60 #include "bucomm.h"
61 #include "elfcomm.h"
62 #include "dwarf.h"
63
64 #include "elf/common.h"
65 #include "elf/external.h"
66 #include "elf/internal.h"
67
68
69 /* Included here, before RELOC_MACROS_GEN_FUNC is defined, so that
70    we can obtain the H8 reloc numbers.  We need these for the
71    get_reloc_size() function.  We include h8.h again after defining
72    RELOC_MACROS_GEN_FUNC so that we get the naming function as well.  */
73
74 #include "elf/h8.h"
75 #undef _ELF_H8_H
76
77 /* Undo the effects of #including reloc-macros.h.  */
78
79 #undef START_RELOC_NUMBERS
80 #undef RELOC_NUMBER
81 #undef FAKE_RELOC
82 #undef EMPTY_RELOC
83 #undef END_RELOC_NUMBERS
84 #undef _RELOC_MACROS_H
85
86 /* The following headers use the elf/reloc-macros.h file to
87    automatically generate relocation recognition functions
88    such as elf_mips_reloc_type()  */
89
90 #define RELOC_MACROS_GEN_FUNC
91
92 #include "elf/aarch64.h"
93 #include "elf/alpha.h"
94 #include "elf/arc.h"
95 #include "elf/arm.h"
96 #include "elf/avr.h"
97 #include "elf/bfin.h"
98 #include "elf/cr16.h"
99 #include "elf/cris.h"
100 #include "elf/crx.h"
101 #include "elf/d10v.h"
102 #include "elf/d30v.h"
103 #include "elf/dlx.h"
104 #include "elf/epiphany.h"
105 #include "elf/fr30.h"
106 #include "elf/frv.h"
107 #include "elf/ft32.h"
108 #include "elf/h8.h"
109 #include "elf/hppa.h"
110 #include "elf/i386.h"
111 #include "elf/i370.h"
112 #include "elf/i860.h"
113 #include "elf/i960.h"
114 #include "elf/ia64.h"
115 #include "elf/ip2k.h"
116 #include "elf/lm32.h"
117 #include "elf/iq2000.h"
118 #include "elf/m32c.h"
119 #include "elf/m32r.h"
120 #include "elf/m68k.h"
121 #include "elf/m68hc11.h"
122 #include "elf/mcore.h"
123 #include "elf/mep.h"
124 #include "elf/metag.h"
125 #include "elf/microblaze.h"
126 #include "elf/mips.h"
127 #include "elf/mmix.h"
128 #include "elf/mn10200.h"
129 #include "elf/mn10300.h"
130 #include "elf/moxie.h"
131 #include "elf/mt.h"
132 #include "elf/msp430.h"
133 #include "elf/nds32.h"
134 #include "elf/nios2.h"
135 #include "elf/or1k.h"
136 #include "elf/pj.h"
137 #include "elf/ppc.h"
138 #include "elf/ppc64.h"
139 #include "elf/rl78.h"
140 #include "elf/rx.h"
141 #include "elf/s390.h"
142 #include "elf/score.h"
143 #include "elf/sh.h"
144 #include "elf/sparc.h"
145 #include "elf/spu.h"
146 #include "elf/tic6x.h"
147 #include "elf/tilegx.h"
148 #include "elf/tilepro.h"
149 #include "elf/v850.h"
150 #include "elf/vax.h"
151 #include "elf/visium.h"
152 #include "elf/x86-64.h"
153 #include "elf/xc16x.h"
154 #include "elf/xgate.h"
155 #include "elf/xstormy16.h"
156 #include "elf/xtensa.h"
157
158 #include "getopt.h"
159 #include "libiberty.h"
160 #include "safe-ctype.h"
161 #include "filenames.h"
162
163 #ifndef offsetof
164 #define offsetof(TYPE, MEMBER) ((size_t) &(((TYPE *) 0)->MEMBER))
165 #endif
166
167 typedef struct elf_section_list
168 {
169   Elf_Internal_Shdr * hdr;
170   struct elf_section_list * next;
171 } elf_section_list;
172
173 char * program_name = "readelf";
174 static unsigned long archive_file_offset;
175 static unsigned long archive_file_size;
176 static bfd_size_type current_file_size;
177 static unsigned long dynamic_addr;
178 static bfd_size_type dynamic_size;
179 static size_t dynamic_nent;
180 static char * dynamic_strings;
181 static unsigned long dynamic_strings_length;
182 static char * string_table;
183 static unsigned long string_table_length;
184 static unsigned long num_dynamic_syms;
185 static Elf_Internal_Sym * dynamic_symbols;
186 static Elf_Internal_Syminfo * dynamic_syminfo;
187 static unsigned long dynamic_syminfo_offset;
188 static unsigned int dynamic_syminfo_nent;
189 static char program_interpreter[PATH_MAX];
190 static bfd_vma dynamic_info[DT_ENCODING];
191 static bfd_vma dynamic_info_DT_GNU_HASH;
192 static bfd_vma version_info[16];
193 static Elf_Internal_Ehdr elf_header;
194 static Elf_Internal_Shdr * section_headers;
195 static Elf_Internal_Phdr * program_headers;
196 static Elf_Internal_Dyn *  dynamic_section;
197 static elf_section_list * symtab_shndx_list;
198 static int show_name;
199 static int do_dynamic;
200 static int do_syms;
201 static int do_dyn_syms;
202 static int do_reloc;
203 static int do_sections;
204 static int do_section_groups;
205 static int do_section_details;
206 static int do_segments;
207 static int do_unwind;
208 static int do_using_dynamic;
209 static int do_header;
210 static int do_dump;
211 static int do_version;
212 static int do_histogram;
213 static int do_debugging;
214 static int do_arch;
215 static int do_notes;
216 static int do_archive_index;
217 static int is_32bit_elf;
218 static int decompress_dumps;
219
220 struct group_list
221 {
222   struct group_list * next;
223   unsigned int section_index;
224 };
225
226 struct group
227 {
228   struct group_list * root;
229   unsigned int group_index;
230 };
231
232 static size_t group_count;
233 static struct group * section_groups;
234 static struct group ** section_headers_groups;
235
236
237 /* Flag bits indicating particular types of dump.  */
238 #define HEX_DUMP        (1 << 0)        /* The -x command line switch.  */
239 #define DISASS_DUMP     (1 << 1)        /* The -i command line switch.  */
240 #define DEBUG_DUMP      (1 << 2)        /* The -w command line switch.  */
241 #define STRING_DUMP     (1 << 3)        /* The -p command line switch.  */
242 #define RELOC_DUMP      (1 << 4)        /* The -R command line switch.  */
243
244 typedef unsigned char dump_type;
245
246 /* A linked list of the section names for which dumps were requested.  */
247 struct dump_list_entry
248 {
249   char * name;
250   dump_type type;
251   struct dump_list_entry * next;
252 };
253 static struct dump_list_entry * dump_sects_byname;
254
255 /* A dynamic array of flags indicating for which sections a dump
256    has been requested via command line switches.  */
257 static dump_type *   cmdline_dump_sects = NULL;
258 static unsigned int  num_cmdline_dump_sects = 0;
259
260 /* A dynamic array of flags indicating for which sections a dump of
261    some kind has been requested.  It is reset on a per-object file
262    basis and then initialised from the cmdline_dump_sects array,
263    the results of interpreting the -w switch, and the
264    dump_sects_byname list.  */
265 static dump_type *   dump_sects = NULL;
266 static unsigned int  num_dump_sects = 0;
267
268
269 /* How to print a vma value.  */
270 typedef enum print_mode
271 {
272   HEX,
273   DEC,
274   DEC_5,
275   UNSIGNED,
276   PREFIX_HEX,
277   FULL_HEX,
278   LONG_HEX
279 }
280 print_mode;
281
282 /* Versioned symbol info.  */
283 enum versioned_symbol_info
284 {
285   symbol_undefined,
286   symbol_hidden,
287   symbol_public
288 };
289
290 static const char *get_symbol_version_string
291   (FILE *file, int is_dynsym, const char *strtab,
292    unsigned long int strtab_size, unsigned int si,
293    Elf_Internal_Sym *psym, enum versioned_symbol_info *sym_info,
294    unsigned short *vna_other);
295
296 #define UNKNOWN -1
297
298 #define SECTION_NAME(X)                                         \
299   ((X) == NULL ? _("<none>")                                    \
300    : string_table == NULL ? _("<no-name>")                      \
301    : ((X)->sh_name >= string_table_length ? _("<corrupt>")      \
302   : string_table + (X)->sh_name))
303
304 #define DT_VERSIONTAGIDX(tag)   (DT_VERNEEDNUM - (tag)) /* Reverse order!  */
305
306 #define GET_ELF_SYMBOLS(file, section, sym_count)                       \
307   (is_32bit_elf ? get_32bit_elf_symbols (file, section, sym_count)      \
308    : get_64bit_elf_symbols (file, section, sym_count))
309
310 #define VALID_DYNAMIC_NAME(offset)      ((dynamic_strings != NULL) && (offset < dynamic_strings_length))
311 /* GET_DYNAMIC_NAME asssumes that VALID_DYNAMIC_NAME has
312    already been called and verified that the string exists.  */
313 #define GET_DYNAMIC_NAME(offset)        (dynamic_strings + offset)
314
315 #define REMOVE_ARCH_BITS(ADDR)                  \
316   do                                            \
317     {                                           \
318       if (elf_header.e_machine == EM_ARM)       \
319         (ADDR) &= ~1;                           \
320     }                                           \
321   while (0)
322 \f
323 /* Retrieve NMEMB structures, each SIZE bytes long from FILE starting at OFFSET +
324    the offset of the current archive member, if we are examining an archive.
325    Put the retrieved data into VAR, if it is not NULL.  Otherwise allocate a buffer
326    using malloc and fill that.  In either case return the pointer to the start of
327    the retrieved data or NULL if something went wrong.  If something does go wrong
328    and REASON is not NULL then emit an error message using REASON as part of the
329    context.  */
330
331 static void *
332 get_data (void * var, FILE * file, unsigned long offset, bfd_size_type size,
333           bfd_size_type nmemb, const char * reason)
334 {
335   void * mvar;
336   bfd_size_type amt = size * nmemb;
337
338   if (size == 0 || nmemb == 0)
339     return NULL;
340
341   /* If the size_t type is smaller than the bfd_size_type, eg because
342      you are building a 32-bit tool on a 64-bit host, then make sure
343      that when the sizes are cast to (size_t) no information is lost.  */
344   if (sizeof (size_t) < sizeof (bfd_size_type)
345       && (   (bfd_size_type) ((size_t) size) != size
346           || (bfd_size_type) ((size_t) nmemb) != nmemb))
347     {
348       if (reason)
349         error (_("Size truncation prevents reading 0x%" BFD_VMA_FMT "x"
350                  " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
351                nmemb, size, reason);
352       return NULL;
353     }
354
355   /* Check for size overflow.  */
356   if (amt < nmemb)
357     {
358       if (reason)
359         error (_("Size overflow prevents reading 0x%" BFD_VMA_FMT "x"
360                  " elements of size 0x%" BFD_VMA_FMT "x for %s\n"),
361                nmemb, size, reason);
362       return NULL;
363     }
364
365   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
366      attempting to allocate memory when the read is bound to fail.  */
367   if (amt > current_file_size
368       || offset + archive_file_offset + amt > current_file_size)
369     {
370       if (reason)
371         error (_("Reading 0x%" BFD_VMA_FMT "x"
372                  " bytes extends past end of file for %s\n"),
373                amt, reason);
374       return NULL;
375     }
376
377   if (fseek (file, archive_file_offset + offset, SEEK_SET))
378     {
379       if (reason)
380         error (_("Unable to seek to 0x%lx for %s\n"),
381                archive_file_offset + offset, reason);
382       return NULL;
383     }
384
385   mvar = var;
386   if (mvar == NULL)
387     {
388       /* Check for overflow.  */
389       if (nmemb < (~(bfd_size_type) 0 - 1) / size)
390         /* + 1 so that we can '\0' terminate invalid string table sections.  */
391         mvar = malloc ((size_t) amt + 1);
392
393       if (mvar == NULL)
394         {
395           if (reason)
396             error (_("Out of memory allocating 0x%" BFD_VMA_FMT "x"
397                      " bytes for %s\n"),
398                    amt, reason);
399           return NULL;
400         }
401
402       ((char *) mvar)[amt] = '\0';
403     }
404
405   if (fread (mvar, (size_t) size, (size_t) nmemb, file) != nmemb)
406     {
407       if (reason)
408         error (_("Unable to read in 0x%" BFD_VMA_FMT "x bytes of %s\n"),
409                amt, reason);
410       if (mvar != var)
411         free (mvar);
412       return NULL;
413     }
414
415   return mvar;
416 }
417
418 /* Print a VMA value.  */
419
420 static int
421 print_vma (bfd_vma vma, print_mode mode)
422 {
423   int nc = 0;
424
425   switch (mode)
426     {
427     case FULL_HEX:
428       nc = printf ("0x");
429       /* Drop through.  */
430
431     case LONG_HEX:
432 #ifdef BFD64
433       if (is_32bit_elf)
434         return nc + printf ("%8.8" BFD_VMA_FMT "x", vma);
435 #endif
436       printf_vma (vma);
437       return nc + 16;
438
439     case DEC_5:
440       if (vma <= 99999)
441         return printf ("%5" BFD_VMA_FMT "d", vma);
442       /* Drop through.  */
443
444     case PREFIX_HEX:
445       nc = printf ("0x");
446       /* Drop through.  */
447
448     case HEX:
449       return nc + printf ("%" BFD_VMA_FMT "x", vma);
450
451     case DEC:
452       return printf ("%" BFD_VMA_FMT "d", vma);
453
454     case UNSIGNED:
455       return printf ("%" BFD_VMA_FMT "u", vma);
456     }
457   return 0;
458 }
459
460 /* Display a symbol on stdout.  Handles the display of control characters and
461    multibye characters (assuming the host environment supports them).
462
463    Display at most abs(WIDTH) characters, truncating as necessary, unless do_wide is true.
464
465    If WIDTH is negative then ensure that the output is at least (- WIDTH) characters,
466    padding as necessary.
467
468    Returns the number of emitted characters.  */
469
470 static unsigned int
471 print_symbol (int width, const char *symbol)
472 {
473   bfd_boolean extra_padding = FALSE;
474   int num_printed = 0;
475 #ifdef HAVE_MBSTATE_T
476   mbstate_t state;
477 #endif
478   int width_remaining;
479
480   if (width < 0)
481     {
482       /* Keep the width positive.  This also helps.  */
483       width = - width;
484       extra_padding = TRUE;
485     }
486   assert (width != 0);
487
488   if (do_wide)
489     /* Set the remaining width to a very large value.
490        This simplifies the code below.  */
491     width_remaining = INT_MAX;
492   else
493     width_remaining = width;
494
495 #ifdef HAVE_MBSTATE_T
496   /* Initialise the multibyte conversion state.  */
497   memset (& state, 0, sizeof (state));
498 #endif
499
500   while (width_remaining)
501     {
502       size_t  n;
503       const char c = *symbol++;
504
505       if (c == 0)
506         break;
507
508       /* Do not print control characters directly as they can affect terminal
509          settings.  Such characters usually appear in the names generated
510          by the assembler for local labels.  */
511       if (ISCNTRL (c))
512         {
513           if (width_remaining < 2)
514             break;
515
516           printf ("^%c", c + 0x40);
517           width_remaining -= 2;
518           num_printed += 2;
519         }
520       else if (ISPRINT (c))
521         {
522           putchar (c);
523           width_remaining --;
524           num_printed ++;
525         }
526       else
527         {
528 #ifdef HAVE_MBSTATE_T
529           wchar_t w;
530 #endif
531           /* Let printf do the hard work of displaying multibyte characters.  */
532           printf ("%.1s", symbol - 1);
533           width_remaining --;
534           num_printed ++;
535
536 #ifdef HAVE_MBSTATE_T
537           /* Try to find out how many bytes made up the character that was
538              just printed.  Advance the symbol pointer past the bytes that
539              were displayed.  */
540           n = mbrtowc (& w, symbol - 1, MB_CUR_MAX, & state);
541 #else
542           n = 1;
543 #endif
544           if (n != (size_t) -1 && n != (size_t) -2 && n > 0)
545             symbol += (n - 1);
546         }
547     }
548
549   if (extra_padding && num_printed < width)
550     {
551       /* Fill in the remaining spaces.  */
552       printf ("%-*s", width - num_printed, " ");
553       num_printed = width;
554     }
555
556   return num_printed;
557 }
558
559 /* Returns a pointer to a static buffer containing a  printable version of
560    the given section's name.  Like print_symbol, except that it does not try
561    to print multibyte characters, it just interprets them as hex values.  */
562
563 static const char *
564 printable_section_name (const Elf_Internal_Shdr * sec)
565 {
566 #define MAX_PRINT_SEC_NAME_LEN 128
567   static char  sec_name_buf [MAX_PRINT_SEC_NAME_LEN + 1];
568   const char * name = SECTION_NAME (sec);
569   char *       buf = sec_name_buf;
570   char         c;
571   unsigned int remaining = MAX_PRINT_SEC_NAME_LEN;
572
573   while ((c = * name ++) != 0)
574     {
575       if (ISCNTRL (c))
576         {
577           if (remaining < 2)
578             break;
579
580           * buf ++ = '^';
581           * buf ++ = c + 0x40;
582           remaining -= 2;
583         }
584       else if (ISPRINT (c))
585         {
586           * buf ++ = c;
587           remaining -= 1;
588         }
589       else
590         {
591           static char hex[17] = "0123456789ABCDEF";
592
593           if (remaining < 4)
594             break;
595           * buf ++ = '<';
596           * buf ++ = hex[(c & 0xf0) >> 4];
597           * buf ++ = hex[c & 0x0f];
598           * buf ++ = '>';
599           remaining -= 4;
600         }
601
602       if (remaining == 0)
603         break;
604     }
605
606   * buf = 0;
607   return sec_name_buf;
608 }
609
610 static const char *
611 printable_section_name_from_index (unsigned long ndx)
612 {
613   if (ndx >= elf_header.e_shnum)
614     return _("<corrupt>");
615
616   return printable_section_name (section_headers + ndx);
617 }
618
619 /* Return a pointer to section NAME, or NULL if no such section exists.  */
620
621 static Elf_Internal_Shdr *
622 find_section (const char * name)
623 {
624   unsigned int i;
625
626   for (i = 0; i < elf_header.e_shnum; i++)
627     if (streq (SECTION_NAME (section_headers + i), name))
628       return section_headers + i;
629
630   return NULL;
631 }
632
633 /* Return a pointer to a section containing ADDR, or NULL if no such
634    section exists.  */
635
636 static Elf_Internal_Shdr *
637 find_section_by_address (bfd_vma addr)
638 {
639   unsigned int i;
640
641   for (i = 0; i < elf_header.e_shnum; i++)
642     {
643       Elf_Internal_Shdr *sec = section_headers + i;
644       if (addr >= sec->sh_addr && addr < sec->sh_addr + sec->sh_size)
645         return sec;
646     }
647
648   return NULL;
649 }
650
651 static Elf_Internal_Shdr *
652 find_section_by_type (unsigned int type)
653 {
654   unsigned int i;
655
656   for (i = 0; i < elf_header.e_shnum; i++)
657     {
658       Elf_Internal_Shdr *sec = section_headers + i;
659       if (sec->sh_type == type)
660         return sec;
661     }
662
663   return NULL;
664 }
665
666 /* Return a pointer to section NAME, or NULL if no such section exists,
667    restricted to the list of sections given in SET.  */
668
669 static Elf_Internal_Shdr *
670 find_section_in_set (const char * name, unsigned int * set)
671 {
672   unsigned int i;
673
674   if (set != NULL)
675     {
676       while ((i = *set++) > 0)
677         if (streq (SECTION_NAME (section_headers + i), name))
678           return section_headers + i;
679     }
680
681   return find_section (name);
682 }
683
684 /* Read an unsigned LEB128 encoded value from p.  Set *PLEN to the number of
685    bytes read.  */
686
687 static inline unsigned long
688 read_uleb128 (unsigned char *data,
689               unsigned int *length_return,
690               const unsigned char * const end)
691 {
692   return read_leb128 (data, length_return, FALSE, end);
693 }
694
695 /* Return true if the current file is for IA-64 machine and OpenVMS ABI.
696    This OS has so many departures from the ELF standard that we test it at
697    many places.  */
698
699 static inline int
700 is_ia64_vms (void)
701 {
702   return elf_header.e_machine == EM_IA_64
703     && elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
704 }
705
706 /* Guess the relocation size commonly used by the specific machines.  */
707
708 static int
709 guess_is_rela (unsigned int e_machine)
710 {
711   switch (e_machine)
712     {
713       /* Targets that use REL relocations.  */
714     case EM_386:
715     case EM_IAMCU:
716     case EM_960:
717     case EM_ARM:
718     case EM_D10V:
719     case EM_CYGNUS_D10V:
720     case EM_DLX:
721     case EM_MIPS:
722     case EM_MIPS_RS3_LE:
723     case EM_CYGNUS_M32R:
724     case EM_SCORE:
725     case EM_XGATE:
726       return FALSE;
727
728       /* Targets that use RELA relocations.  */
729     case EM_68K:
730     case EM_860:
731     case EM_AARCH64:
732     case EM_ADAPTEVA_EPIPHANY:
733     case EM_ALPHA:
734     case EM_ALTERA_NIOS2:
735     case EM_ARC:
736     case EM_ARC_COMPACT:
737     case EM_ARC_COMPACT2:
738     case EM_AVR:
739     case EM_AVR_OLD:
740     case EM_BLACKFIN:
741     case EM_CR16:
742     case EM_CRIS:
743     case EM_CRX:
744     case EM_D30V:
745     case EM_CYGNUS_D30V:
746     case EM_FR30:
747     case EM_FT32:
748     case EM_CYGNUS_FR30:
749     case EM_CYGNUS_FRV:
750     case EM_H8S:
751     case EM_H8_300:
752     case EM_H8_300H:
753     case EM_IA_64:
754     case EM_IP2K:
755     case EM_IP2K_OLD:
756     case EM_IQ2000:
757     case EM_LATTICEMICO32:
758     case EM_M32C_OLD:
759     case EM_M32C:
760     case EM_M32R:
761     case EM_MCORE:
762     case EM_CYGNUS_MEP:
763     case EM_METAG:
764     case EM_MMIX:
765     case EM_MN10200:
766     case EM_CYGNUS_MN10200:
767     case EM_MN10300:
768     case EM_CYGNUS_MN10300:
769     case EM_MOXIE:
770     case EM_MSP430:
771     case EM_MSP430_OLD:
772     case EM_MT:
773     case EM_NDS32:
774     case EM_NIOS32:
775     case EM_OR1K:
776     case EM_PPC64:
777     case EM_PPC:
778     case EM_RL78:
779     case EM_RX:
780     case EM_S390:
781     case EM_S390_OLD:
782     case EM_SH:
783     case EM_SPARC:
784     case EM_SPARC32PLUS:
785     case EM_SPARCV9:
786     case EM_SPU:
787     case EM_TI_C6000:
788     case EM_TILEGX:
789     case EM_TILEPRO:
790     case EM_V800:
791     case EM_V850:
792     case EM_CYGNUS_V850:
793     case EM_VAX:
794     case EM_VISIUM:
795     case EM_X86_64:
796     case EM_L1OM:
797     case EM_K1OM:
798     case EM_XSTORMY16:
799     case EM_XTENSA:
800     case EM_XTENSA_OLD:
801     case EM_MICROBLAZE:
802     case EM_MICROBLAZE_OLD:
803       return TRUE;
804
805     case EM_68HC05:
806     case EM_68HC08:
807     case EM_68HC11:
808     case EM_68HC16:
809     case EM_FX66:
810     case EM_ME16:
811     case EM_MMA:
812     case EM_NCPU:
813     case EM_NDR1:
814     case EM_PCP:
815     case EM_ST100:
816     case EM_ST19:
817     case EM_ST7:
818     case EM_ST9PLUS:
819     case EM_STARCORE:
820     case EM_SVX:
821     case EM_TINYJ:
822     default:
823       warn (_("Don't know about relocations on this machine architecture\n"));
824       return FALSE;
825     }
826 }
827
828 static int
829 slurp_rela_relocs (FILE * file,
830                    unsigned long rel_offset,
831                    unsigned long rel_size,
832                    Elf_Internal_Rela ** relasp,
833                    unsigned long * nrelasp)
834 {
835   Elf_Internal_Rela * relas;
836   size_t nrelas;
837   unsigned int i;
838
839   if (is_32bit_elf)
840     {
841       Elf32_External_Rela * erelas;
842
843       erelas = (Elf32_External_Rela *) get_data (NULL, file, rel_offset, 1,
844                                                  rel_size, _("32-bit relocation data"));
845       if (!erelas)
846         return 0;
847
848       nrelas = rel_size / sizeof (Elf32_External_Rela);
849
850       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
851                                              sizeof (Elf_Internal_Rela));
852
853       if (relas == NULL)
854         {
855           free (erelas);
856           error (_("out of memory parsing relocs\n"));
857           return 0;
858         }
859
860       for (i = 0; i < nrelas; i++)
861         {
862           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
863           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
864           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
865         }
866
867       free (erelas);
868     }
869   else
870     {
871       Elf64_External_Rela * erelas;
872
873       erelas = (Elf64_External_Rela *) get_data (NULL, file, rel_offset, 1,
874                                                  rel_size, _("64-bit relocation data"));
875       if (!erelas)
876         return 0;
877
878       nrelas = rel_size / sizeof (Elf64_External_Rela);
879
880       relas = (Elf_Internal_Rela *) cmalloc (nrelas,
881                                              sizeof (Elf_Internal_Rela));
882
883       if (relas == NULL)
884         {
885           free (erelas);
886           error (_("out of memory parsing relocs\n"));
887           return 0;
888         }
889
890       for (i = 0; i < nrelas; i++)
891         {
892           relas[i].r_offset = BYTE_GET (erelas[i].r_offset);
893           relas[i].r_info   = BYTE_GET (erelas[i].r_info);
894           relas[i].r_addend = BYTE_GET_SIGNED (erelas[i].r_addend);
895
896           /* The #ifdef BFD64 below is to prevent a compile time
897              warning.  We know that if we do not have a 64 bit data
898              type that we will never execute this code anyway.  */
899 #ifdef BFD64
900           if (elf_header.e_machine == EM_MIPS
901               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
902             {
903               /* In little-endian objects, r_info isn't really a
904                  64-bit little-endian value: it has a 32-bit
905                  little-endian symbol index followed by four
906                  individual byte fields.  Reorder INFO
907                  accordingly.  */
908               bfd_vma inf = relas[i].r_info;
909               inf = (((inf & 0xffffffff) << 32)
910                       | ((inf >> 56) & 0xff)
911                       | ((inf >> 40) & 0xff00)
912                       | ((inf >> 24) & 0xff0000)
913                       | ((inf >> 8) & 0xff000000));
914               relas[i].r_info = inf;
915             }
916 #endif /* BFD64 */
917         }
918
919       free (erelas);
920     }
921   *relasp = relas;
922   *nrelasp = nrelas;
923   return 1;
924 }
925
926 static int
927 slurp_rel_relocs (FILE * file,
928                   unsigned long rel_offset,
929                   unsigned long rel_size,
930                   Elf_Internal_Rela ** relsp,
931                   unsigned long * nrelsp)
932 {
933   Elf_Internal_Rela * rels;
934   size_t nrels;
935   unsigned int i;
936
937   if (is_32bit_elf)
938     {
939       Elf32_External_Rel * erels;
940
941       erels = (Elf32_External_Rel *) get_data (NULL, file, rel_offset, 1,
942                                                rel_size, _("32-bit relocation data"));
943       if (!erels)
944         return 0;
945
946       nrels = rel_size / sizeof (Elf32_External_Rel);
947
948       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
949
950       if (rels == NULL)
951         {
952           free (erels);
953           error (_("out of memory parsing relocs\n"));
954           return 0;
955         }
956
957       for (i = 0; i < nrels; i++)
958         {
959           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
960           rels[i].r_info   = BYTE_GET (erels[i].r_info);
961           rels[i].r_addend = 0;
962         }
963
964       free (erels);
965     }
966   else
967     {
968       Elf64_External_Rel * erels;
969
970       erels = (Elf64_External_Rel *) get_data (NULL, file, rel_offset, 1,
971                                                rel_size, _("64-bit relocation data"));
972       if (!erels)
973         return 0;
974
975       nrels = rel_size / sizeof (Elf64_External_Rel);
976
977       rels = (Elf_Internal_Rela *) cmalloc (nrels, sizeof (Elf_Internal_Rela));
978
979       if (rels == NULL)
980         {
981           free (erels);
982           error (_("out of memory parsing relocs\n"));
983           return 0;
984         }
985
986       for (i = 0; i < nrels; i++)
987         {
988           rels[i].r_offset = BYTE_GET (erels[i].r_offset);
989           rels[i].r_info   = BYTE_GET (erels[i].r_info);
990           rels[i].r_addend = 0;
991
992           /* The #ifdef BFD64 below is to prevent a compile time
993              warning.  We know that if we do not have a 64 bit data
994              type that we will never execute this code anyway.  */
995 #ifdef BFD64
996           if (elf_header.e_machine == EM_MIPS
997               && elf_header.e_ident[EI_DATA] != ELFDATA2MSB)
998             {
999               /* In little-endian objects, r_info isn't really a
1000                  64-bit little-endian value: it has a 32-bit
1001                  little-endian symbol index followed by four
1002                  individual byte fields.  Reorder INFO
1003                  accordingly.  */
1004               bfd_vma inf = rels[i].r_info;
1005               inf = (((inf & 0xffffffff) << 32)
1006                      | ((inf >> 56) & 0xff)
1007                      | ((inf >> 40) & 0xff00)
1008                      | ((inf >> 24) & 0xff0000)
1009                      | ((inf >> 8) & 0xff000000));
1010               rels[i].r_info = inf;
1011             }
1012 #endif /* BFD64 */
1013         }
1014
1015       free (erels);
1016     }
1017   *relsp = rels;
1018   *nrelsp = nrels;
1019   return 1;
1020 }
1021
1022 /* Returns the reloc type extracted from the reloc info field.  */
1023
1024 static unsigned int
1025 get_reloc_type (bfd_vma reloc_info)
1026 {
1027   if (is_32bit_elf)
1028     return ELF32_R_TYPE (reloc_info);
1029
1030   switch (elf_header.e_machine)
1031     {
1032     case EM_MIPS:
1033       /* Note: We assume that reloc_info has already been adjusted for us.  */
1034       return ELF64_MIPS_R_TYPE (reloc_info);
1035
1036     case EM_SPARCV9:
1037       return ELF64_R_TYPE_ID (reloc_info);
1038
1039     default:
1040       return ELF64_R_TYPE (reloc_info);
1041     }
1042 }
1043
1044 /* Return the symbol index extracted from the reloc info field.  */
1045
1046 static bfd_vma
1047 get_reloc_symindex (bfd_vma reloc_info)
1048 {
1049   return is_32bit_elf ? ELF32_R_SYM (reloc_info) : ELF64_R_SYM (reloc_info);
1050 }
1051
1052 static inline bfd_boolean
1053 uses_msp430x_relocs (void)
1054 {
1055   return
1056     elf_header.e_machine == EM_MSP430 /* Paranoia.  */
1057     /* GCC uses osabi == ELFOSBI_STANDALONE.  */
1058     && (((elf_header.e_flags & EF_MSP430_MACH) == E_MSP430_MACH_MSP430X)
1059         /* TI compiler uses ELFOSABI_NONE.  */
1060         || (elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE));
1061 }
1062
1063 /* Display the contents of the relocation data found at the specified
1064    offset.  */
1065
1066 static void
1067 dump_relocations (FILE * file,
1068                   unsigned long rel_offset,
1069                   unsigned long rel_size,
1070                   Elf_Internal_Sym * symtab,
1071                   unsigned long nsyms,
1072                   char * strtab,
1073                   unsigned long strtablen,
1074                   int is_rela,
1075                   int is_dynsym)
1076 {
1077   unsigned int i;
1078   Elf_Internal_Rela * rels;
1079
1080   if (is_rela == UNKNOWN)
1081     is_rela = guess_is_rela (elf_header.e_machine);
1082
1083   if (is_rela)
1084     {
1085       if (!slurp_rela_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1086         return;
1087     }
1088   else
1089     {
1090       if (!slurp_rel_relocs (file, rel_offset, rel_size, &rels, &rel_size))
1091         return;
1092     }
1093
1094   if (is_32bit_elf)
1095     {
1096       if (is_rela)
1097         {
1098           if (do_wide)
1099             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name + Addend\n"));
1100           else
1101             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name + Addend\n"));
1102         }
1103       else
1104         {
1105           if (do_wide)
1106             printf (_(" Offset     Info    Type                Sym. Value  Symbol's Name\n"));
1107           else
1108             printf (_(" Offset     Info    Type            Sym.Value  Sym. Name\n"));
1109         }
1110     }
1111   else
1112     {
1113       if (is_rela)
1114         {
1115           if (do_wide)
1116             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name + Addend\n"));
1117           else
1118             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name + Addend\n"));
1119         }
1120       else
1121         {
1122           if (do_wide)
1123             printf (_("    Offset             Info             Type               Symbol's Value  Symbol's Name\n"));
1124           else
1125             printf (_("  Offset          Info           Type           Sym. Value    Sym. Name\n"));
1126         }
1127     }
1128
1129   for (i = 0; i < rel_size; i++)
1130     {
1131       const char * rtype;
1132       bfd_vma offset;
1133       bfd_vma inf;
1134       bfd_vma symtab_index;
1135       bfd_vma type;
1136
1137       offset = rels[i].r_offset;
1138       inf    = rels[i].r_info;
1139
1140       type = get_reloc_type (inf);
1141       symtab_index = get_reloc_symindex  (inf);
1142
1143       if (is_32bit_elf)
1144         {
1145           printf ("%8.8lx  %8.8lx ",
1146                   (unsigned long) offset & 0xffffffff,
1147                   (unsigned long) inf & 0xffffffff);
1148         }
1149       else
1150         {
1151 #if BFD_HOST_64BIT_LONG
1152           printf (do_wide
1153                   ? "%16.16lx  %16.16lx "
1154                   : "%12.12lx  %12.12lx ",
1155                   offset, inf);
1156 #elif BFD_HOST_64BIT_LONG_LONG
1157 #ifndef __MSVCRT__
1158           printf (do_wide
1159                   ? "%16.16llx  %16.16llx "
1160                   : "%12.12llx  %12.12llx ",
1161                   offset, inf);
1162 #else
1163           printf (do_wide
1164                   ? "%16.16I64x  %16.16I64x "
1165                   : "%12.12I64x  %12.12I64x ",
1166                   offset, inf);
1167 #endif
1168 #else
1169           printf (do_wide
1170                   ? "%8.8lx%8.8lx  %8.8lx%8.8lx "
1171                   : "%4.4lx%8.8lx  %4.4lx%8.8lx ",
1172                   _bfd_int64_high (offset),
1173                   _bfd_int64_low (offset),
1174                   _bfd_int64_high (inf),
1175                   _bfd_int64_low (inf));
1176 #endif
1177         }
1178
1179       switch (elf_header.e_machine)
1180         {
1181         default:
1182           rtype = NULL;
1183           break;
1184
1185         case EM_AARCH64:
1186           rtype = elf_aarch64_reloc_type (type);
1187           break;
1188
1189         case EM_M32R:
1190         case EM_CYGNUS_M32R:
1191           rtype = elf_m32r_reloc_type (type);
1192           break;
1193
1194         case EM_386:
1195         case EM_IAMCU:
1196           rtype = elf_i386_reloc_type (type);
1197           break;
1198
1199         case EM_68HC11:
1200         case EM_68HC12:
1201           rtype = elf_m68hc11_reloc_type (type);
1202           break;
1203
1204         case EM_68K:
1205           rtype = elf_m68k_reloc_type (type);
1206           break;
1207
1208         case EM_960:
1209           rtype = elf_i960_reloc_type (type);
1210           break;
1211
1212         case EM_AVR:
1213         case EM_AVR_OLD:
1214           rtype = elf_avr_reloc_type (type);
1215           break;
1216
1217         case EM_OLD_SPARCV9:
1218         case EM_SPARC32PLUS:
1219         case EM_SPARCV9:
1220         case EM_SPARC:
1221           rtype = elf_sparc_reloc_type (type);
1222           break;
1223
1224         case EM_SPU:
1225           rtype = elf_spu_reloc_type (type);
1226           break;
1227
1228         case EM_V800:
1229           rtype = v800_reloc_type (type);
1230           break;
1231         case EM_V850:
1232         case EM_CYGNUS_V850:
1233           rtype = v850_reloc_type (type);
1234           break;
1235
1236         case EM_D10V:
1237         case EM_CYGNUS_D10V:
1238           rtype = elf_d10v_reloc_type (type);
1239           break;
1240
1241         case EM_D30V:
1242         case EM_CYGNUS_D30V:
1243           rtype = elf_d30v_reloc_type (type);
1244           break;
1245
1246         case EM_DLX:
1247           rtype = elf_dlx_reloc_type (type);
1248           break;
1249
1250         case EM_SH:
1251           rtype = elf_sh_reloc_type (type);
1252           break;
1253
1254         case EM_MN10300:
1255         case EM_CYGNUS_MN10300:
1256           rtype = elf_mn10300_reloc_type (type);
1257           break;
1258
1259         case EM_MN10200:
1260         case EM_CYGNUS_MN10200:
1261           rtype = elf_mn10200_reloc_type (type);
1262           break;
1263
1264         case EM_FR30:
1265         case EM_CYGNUS_FR30:
1266           rtype = elf_fr30_reloc_type (type);
1267           break;
1268
1269         case EM_CYGNUS_FRV:
1270           rtype = elf_frv_reloc_type (type);
1271           break;
1272
1273         case EM_FT32:
1274           rtype = elf_ft32_reloc_type (type);
1275           break;
1276
1277         case EM_MCORE:
1278           rtype = elf_mcore_reloc_type (type);
1279           break;
1280
1281         case EM_MMIX:
1282           rtype = elf_mmix_reloc_type (type);
1283           break;
1284
1285         case EM_MOXIE:
1286           rtype = elf_moxie_reloc_type (type);
1287           break;
1288
1289         case EM_MSP430:
1290           if (uses_msp430x_relocs ())
1291             {
1292               rtype = elf_msp430x_reloc_type (type);
1293               break;
1294             }
1295         case EM_MSP430_OLD:
1296           rtype = elf_msp430_reloc_type (type);
1297           break;
1298
1299         case EM_NDS32:
1300           rtype = elf_nds32_reloc_type (type);
1301           break;
1302
1303         case EM_PPC:
1304           rtype = elf_ppc_reloc_type (type);
1305           break;
1306
1307         case EM_PPC64:
1308           rtype = elf_ppc64_reloc_type (type);
1309           break;
1310
1311         case EM_MIPS:
1312         case EM_MIPS_RS3_LE:
1313           rtype = elf_mips_reloc_type (type);
1314           break;
1315
1316         case EM_ALPHA:
1317           rtype = elf_alpha_reloc_type (type);
1318           break;
1319
1320         case EM_ARM:
1321           rtype = elf_arm_reloc_type (type);
1322           break;
1323
1324         case EM_ARC:
1325         case EM_ARC_COMPACT:
1326         case EM_ARC_COMPACT2:
1327           rtype = elf_arc_reloc_type (type);
1328           break;
1329
1330         case EM_PARISC:
1331           rtype = elf_hppa_reloc_type (type);
1332           break;
1333
1334         case EM_H8_300:
1335         case EM_H8_300H:
1336         case EM_H8S:
1337           rtype = elf_h8_reloc_type (type);
1338           break;
1339
1340         case EM_OR1K:
1341           rtype = elf_or1k_reloc_type (type);
1342           break;
1343
1344         case EM_PJ:
1345         case EM_PJ_OLD:
1346           rtype = elf_pj_reloc_type (type);
1347           break;
1348         case EM_IA_64:
1349           rtype = elf_ia64_reloc_type (type);
1350           break;
1351
1352         case EM_CRIS:
1353           rtype = elf_cris_reloc_type (type);
1354           break;
1355
1356         case EM_860:
1357           rtype = elf_i860_reloc_type (type);
1358           break;
1359
1360         case EM_X86_64:
1361         case EM_L1OM:
1362         case EM_K1OM:
1363           rtype = elf_x86_64_reloc_type (type);
1364           break;
1365
1366         case EM_S370:
1367           rtype = i370_reloc_type (type);
1368           break;
1369
1370         case EM_S390_OLD:
1371         case EM_S390:
1372           rtype = elf_s390_reloc_type (type);
1373           break;
1374
1375         case EM_SCORE:
1376           rtype = elf_score_reloc_type (type);
1377           break;
1378
1379         case EM_XSTORMY16:
1380           rtype = elf_xstormy16_reloc_type (type);
1381           break;
1382
1383         case EM_CRX:
1384           rtype = elf_crx_reloc_type (type);
1385           break;
1386
1387         case EM_VAX:
1388           rtype = elf_vax_reloc_type (type);
1389           break;
1390
1391         case EM_VISIUM:
1392           rtype = elf_visium_reloc_type (type);
1393           break;
1394
1395         case EM_ADAPTEVA_EPIPHANY:
1396           rtype = elf_epiphany_reloc_type (type);
1397           break;
1398
1399         case EM_IP2K:
1400         case EM_IP2K_OLD:
1401           rtype = elf_ip2k_reloc_type (type);
1402           break;
1403
1404         case EM_IQ2000:
1405           rtype = elf_iq2000_reloc_type (type);
1406           break;
1407
1408         case EM_XTENSA_OLD:
1409         case EM_XTENSA:
1410           rtype = elf_xtensa_reloc_type (type);
1411           break;
1412
1413         case EM_LATTICEMICO32:
1414           rtype = elf_lm32_reloc_type (type);
1415           break;
1416
1417         case EM_M32C_OLD:
1418         case EM_M32C:
1419           rtype = elf_m32c_reloc_type (type);
1420           break;
1421
1422         case EM_MT:
1423           rtype = elf_mt_reloc_type (type);
1424           break;
1425
1426         case EM_BLACKFIN:
1427           rtype = elf_bfin_reloc_type (type);
1428           break;
1429
1430         case EM_CYGNUS_MEP:
1431           rtype = elf_mep_reloc_type (type);
1432           break;
1433
1434         case EM_CR16:
1435           rtype = elf_cr16_reloc_type (type);
1436           break;
1437
1438         case EM_MICROBLAZE:
1439         case EM_MICROBLAZE_OLD:
1440           rtype = elf_microblaze_reloc_type (type);
1441           break;
1442
1443         case EM_RL78:
1444           rtype = elf_rl78_reloc_type (type);
1445           break;
1446
1447         case EM_RX:
1448           rtype = elf_rx_reloc_type (type);
1449           break;
1450
1451         case EM_METAG:
1452           rtype = elf_metag_reloc_type (type);
1453           break;
1454
1455         case EM_XC16X:
1456         case EM_C166:
1457           rtype = elf_xc16x_reloc_type (type);
1458           break;
1459
1460         case EM_TI_C6000:
1461           rtype = elf_tic6x_reloc_type (type);
1462           break;
1463
1464         case EM_TILEGX:
1465           rtype = elf_tilegx_reloc_type (type);
1466           break;
1467
1468         case EM_TILEPRO:
1469           rtype = elf_tilepro_reloc_type (type);
1470           break;
1471
1472         case EM_XGATE:
1473           rtype = elf_xgate_reloc_type (type);
1474           break;
1475
1476         case EM_ALTERA_NIOS2:
1477           rtype = elf_nios2_reloc_type (type);
1478           break;
1479         }
1480
1481       if (rtype == NULL)
1482         printf (_("unrecognized: %-7lx"), (unsigned long) type & 0xffffffff);
1483       else
1484         printf (do_wide ? "%-22.22s" : "%-17.17s", rtype);
1485
1486       if (elf_header.e_machine == EM_ALPHA
1487           && rtype != NULL
1488           && streq (rtype, "R_ALPHA_LITUSE")
1489           && is_rela)
1490         {
1491           switch (rels[i].r_addend)
1492             {
1493             case LITUSE_ALPHA_ADDR:   rtype = "ADDR";   break;
1494             case LITUSE_ALPHA_BASE:   rtype = "BASE";   break;
1495             case LITUSE_ALPHA_BYTOFF: rtype = "BYTOFF"; break;
1496             case LITUSE_ALPHA_JSR:    rtype = "JSR";    break;
1497             case LITUSE_ALPHA_TLSGD:  rtype = "TLSGD";  break;
1498             case LITUSE_ALPHA_TLSLDM: rtype = "TLSLDM"; break;
1499             case LITUSE_ALPHA_JSRDIRECT: rtype = "JSRDIRECT"; break;
1500             default: rtype = NULL;
1501             }
1502           if (rtype)
1503             printf (" (%s)", rtype);
1504           else
1505             {
1506               putchar (' ');
1507               printf (_("<unknown addend: %lx>"),
1508                       (unsigned long) rels[i].r_addend);
1509             }
1510         }
1511       else if (symtab_index)
1512         {
1513           if (symtab == NULL || symtab_index >= nsyms)
1514             printf (_(" bad symbol index: %08lx"), (unsigned long) symtab_index);
1515           else
1516             {
1517               Elf_Internal_Sym * psym;
1518               const char * version_string;
1519               enum versioned_symbol_info sym_info;
1520               unsigned short vna_other;
1521
1522               psym = symtab + symtab_index;
1523
1524               version_string
1525                 = get_symbol_version_string (file, is_dynsym,
1526                                              strtab, strtablen,
1527                                              symtab_index,
1528                                              psym,
1529                                              &sym_info,
1530                                              &vna_other);
1531
1532               printf (" ");
1533
1534               if (ELF_ST_TYPE (psym->st_info) == STT_GNU_IFUNC)
1535                 {
1536                   const char * name;
1537                   unsigned int len;
1538                   unsigned int width = is_32bit_elf ? 8 : 14;
1539
1540                   /* Relocations against GNU_IFUNC symbols do not use the value
1541                      of the symbol as the address to relocate against.  Instead
1542                      they invoke the function named by the symbol and use its
1543                      result as the address for relocation.
1544
1545                      To indicate this to the user, do not display the value of
1546                      the symbol in the "Symbols's Value" field.  Instead show
1547                      its name followed by () as a hint that the symbol is
1548                      invoked.  */
1549
1550                   if (strtab == NULL
1551                       || psym->st_name == 0
1552                       || psym->st_name >= strtablen)
1553                     name = "??";
1554                   else
1555                     name = strtab + psym->st_name;
1556
1557                   len = print_symbol (width, name);
1558                   if (version_string)
1559                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1560                             version_string);
1561                   printf ("()%-*s", len <= width ? (width + 1) - len : 1, " ");
1562                 }
1563               else
1564                 {
1565                   print_vma (psym->st_value, LONG_HEX);
1566
1567                   printf (is_32bit_elf ? "   " : " ");
1568                 }
1569
1570               if (psym->st_name == 0)
1571                 {
1572                   const char * sec_name = "<null>";
1573                   char name_buf[40];
1574
1575                   if (ELF_ST_TYPE (psym->st_info) == STT_SECTION)
1576                     {
1577                       if (psym->st_shndx < elf_header.e_shnum)
1578                         sec_name = SECTION_NAME (section_headers + psym->st_shndx);
1579                       else if (psym->st_shndx == SHN_ABS)
1580                         sec_name = "ABS";
1581                       else if (psym->st_shndx == SHN_COMMON)
1582                         sec_name = "COMMON";
1583                       else if ((elf_header.e_machine == EM_MIPS
1584                                 && psym->st_shndx == SHN_MIPS_SCOMMON)
1585                                || (elf_header.e_machine == EM_TI_C6000
1586                                    && psym->st_shndx == SHN_TIC6X_SCOMMON))
1587                         sec_name = "SCOMMON";
1588                       else if (elf_header.e_machine == EM_MIPS
1589                                && psym->st_shndx == SHN_MIPS_SUNDEFINED)
1590                         sec_name = "SUNDEF";
1591                       else if ((elf_header.e_machine == EM_X86_64
1592                                 || elf_header.e_machine == EM_L1OM
1593                                 || elf_header.e_machine == EM_K1OM)
1594                                && psym->st_shndx == SHN_X86_64_LCOMMON)
1595                         sec_name = "LARGE_COMMON";
1596                       else if (elf_header.e_machine == EM_IA_64
1597                                && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
1598                                && psym->st_shndx == SHN_IA_64_ANSI_COMMON)
1599                         sec_name = "ANSI_COM";
1600                       else if (is_ia64_vms ()
1601                                && psym->st_shndx == SHN_IA_64_VMS_SYMVEC)
1602                         sec_name = "VMS_SYMVEC";
1603                       else
1604                         {
1605                           sprintf (name_buf, "<section 0x%x>",
1606                                    (unsigned int) psym->st_shndx);
1607                           sec_name = name_buf;
1608                         }
1609                     }
1610                   print_symbol (22, sec_name);
1611                 }
1612               else if (strtab == NULL)
1613                 printf (_("<string table index: %3ld>"), psym->st_name);
1614               else if (psym->st_name >= strtablen)
1615                 printf (_("<corrupt string table index: %3ld>"), psym->st_name);
1616               else
1617                 {
1618                   print_symbol (22, strtab + psym->st_name);
1619                   if (version_string)
1620                     printf (sym_info == symbol_public ? "@@%s" : "@%s",
1621                             version_string);
1622                 }
1623
1624               if (is_rela)
1625                 {
1626                   bfd_vma off = rels[i].r_addend;
1627
1628                   if ((bfd_signed_vma) off < 0)
1629                     printf (" - %" BFD_VMA_FMT "x", - off);
1630                   else
1631                     printf (" + %" BFD_VMA_FMT "x", off);
1632                 }
1633             }
1634         }
1635       else if (is_rela)
1636         {
1637           bfd_vma off = rels[i].r_addend;
1638
1639           printf ("%*c", is_32bit_elf ? 12 : 20, ' ');
1640           if ((bfd_signed_vma) off < 0)
1641             printf ("-%" BFD_VMA_FMT "x", - off);
1642           else
1643             printf ("%" BFD_VMA_FMT "x", off);
1644         }
1645
1646       if (elf_header.e_machine == EM_SPARCV9
1647           && rtype != NULL
1648           && streq (rtype, "R_SPARC_OLO10"))
1649         printf (" + %lx", (unsigned long) ELF64_R_TYPE_DATA (inf));
1650
1651       putchar ('\n');
1652
1653 #ifdef BFD64
1654       if (! is_32bit_elf && elf_header.e_machine == EM_MIPS)
1655         {
1656           bfd_vma type2 = ELF64_MIPS_R_TYPE2 (inf);
1657           bfd_vma type3 = ELF64_MIPS_R_TYPE3 (inf);
1658           const char * rtype2 = elf_mips_reloc_type (type2);
1659           const char * rtype3 = elf_mips_reloc_type (type3);
1660
1661           printf ("                    Type2: ");
1662
1663           if (rtype2 == NULL)
1664             printf (_("unrecognized: %-7lx"),
1665                     (unsigned long) type2 & 0xffffffff);
1666           else
1667             printf ("%-17.17s", rtype2);
1668
1669           printf ("\n                    Type3: ");
1670
1671           if (rtype3 == NULL)
1672             printf (_("unrecognized: %-7lx"),
1673                     (unsigned long) type3 & 0xffffffff);
1674           else
1675             printf ("%-17.17s", rtype3);
1676
1677           putchar ('\n');
1678         }
1679 #endif /* BFD64 */
1680     }
1681
1682   free (rels);
1683 }
1684
1685 static const char *
1686 get_mips_dynamic_type (unsigned long type)
1687 {
1688   switch (type)
1689     {
1690     case DT_MIPS_RLD_VERSION: return "MIPS_RLD_VERSION";
1691     case DT_MIPS_TIME_STAMP: return "MIPS_TIME_STAMP";
1692     case DT_MIPS_ICHECKSUM: return "MIPS_ICHECKSUM";
1693     case DT_MIPS_IVERSION: return "MIPS_IVERSION";
1694     case DT_MIPS_FLAGS: return "MIPS_FLAGS";
1695     case DT_MIPS_BASE_ADDRESS: return "MIPS_BASE_ADDRESS";
1696     case DT_MIPS_MSYM: return "MIPS_MSYM";
1697     case DT_MIPS_CONFLICT: return "MIPS_CONFLICT";
1698     case DT_MIPS_LIBLIST: return "MIPS_LIBLIST";
1699     case DT_MIPS_LOCAL_GOTNO: return "MIPS_LOCAL_GOTNO";
1700     case DT_MIPS_CONFLICTNO: return "MIPS_CONFLICTNO";
1701     case DT_MIPS_LIBLISTNO: return "MIPS_LIBLISTNO";
1702     case DT_MIPS_SYMTABNO: return "MIPS_SYMTABNO";
1703     case DT_MIPS_UNREFEXTNO: return "MIPS_UNREFEXTNO";
1704     case DT_MIPS_GOTSYM: return "MIPS_GOTSYM";
1705     case DT_MIPS_HIPAGENO: return "MIPS_HIPAGENO";
1706     case DT_MIPS_RLD_MAP: return "MIPS_RLD_MAP";
1707     case DT_MIPS_RLD_MAP_REL: return "MIPS_RLD_MAP_REL";
1708     case DT_MIPS_DELTA_CLASS: return "MIPS_DELTA_CLASS";
1709     case DT_MIPS_DELTA_CLASS_NO: return "MIPS_DELTA_CLASS_NO";
1710     case DT_MIPS_DELTA_INSTANCE: return "MIPS_DELTA_INSTANCE";
1711     case DT_MIPS_DELTA_INSTANCE_NO: return "MIPS_DELTA_INSTANCE_NO";
1712     case DT_MIPS_DELTA_RELOC: return "MIPS_DELTA_RELOC";
1713     case DT_MIPS_DELTA_RELOC_NO: return "MIPS_DELTA_RELOC_NO";
1714     case DT_MIPS_DELTA_SYM: return "MIPS_DELTA_SYM";
1715     case DT_MIPS_DELTA_SYM_NO: return "MIPS_DELTA_SYM_NO";
1716     case DT_MIPS_DELTA_CLASSSYM: return "MIPS_DELTA_CLASSSYM";
1717     case DT_MIPS_DELTA_CLASSSYM_NO: return "MIPS_DELTA_CLASSSYM_NO";
1718     case DT_MIPS_CXX_FLAGS: return "MIPS_CXX_FLAGS";
1719     case DT_MIPS_PIXIE_INIT: return "MIPS_PIXIE_INIT";
1720     case DT_MIPS_SYMBOL_LIB: return "MIPS_SYMBOL_LIB";
1721     case DT_MIPS_LOCALPAGE_GOTIDX: return "MIPS_LOCALPAGE_GOTIDX";
1722     case DT_MIPS_LOCAL_GOTIDX: return "MIPS_LOCAL_GOTIDX";
1723     case DT_MIPS_HIDDEN_GOTIDX: return "MIPS_HIDDEN_GOTIDX";
1724     case DT_MIPS_PROTECTED_GOTIDX: return "MIPS_PROTECTED_GOTIDX";
1725     case DT_MIPS_OPTIONS: return "MIPS_OPTIONS";
1726     case DT_MIPS_INTERFACE: return "MIPS_INTERFACE";
1727     case DT_MIPS_DYNSTR_ALIGN: return "MIPS_DYNSTR_ALIGN";
1728     case DT_MIPS_INTERFACE_SIZE: return "MIPS_INTERFACE_SIZE";
1729     case DT_MIPS_RLD_TEXT_RESOLVE_ADDR: return "MIPS_RLD_TEXT_RESOLVE_ADDR";
1730     case DT_MIPS_PERF_SUFFIX: return "MIPS_PERF_SUFFIX";
1731     case DT_MIPS_COMPACT_SIZE: return "MIPS_COMPACT_SIZE";
1732     case DT_MIPS_GP_VALUE: return "MIPS_GP_VALUE";
1733     case DT_MIPS_AUX_DYNAMIC: return "MIPS_AUX_DYNAMIC";
1734     case DT_MIPS_PLTGOT: return "MIPS_PLTGOT";
1735     case DT_MIPS_RWPLT: return "MIPS_RWPLT";
1736     default:
1737       return NULL;
1738     }
1739 }
1740
1741 static const char *
1742 get_sparc64_dynamic_type (unsigned long type)
1743 {
1744   switch (type)
1745     {
1746     case DT_SPARC_REGISTER: return "SPARC_REGISTER";
1747     default:
1748       return NULL;
1749     }
1750 }
1751
1752 static const char *
1753 get_ppc_dynamic_type (unsigned long type)
1754 {
1755   switch (type)
1756     {
1757     case DT_PPC_GOT:    return "PPC_GOT";
1758     case DT_PPC_OPT:    return "PPC_OPT";
1759     default:
1760       return NULL;
1761     }
1762 }
1763
1764 static const char *
1765 get_ppc64_dynamic_type (unsigned long type)
1766 {
1767   switch (type)
1768     {
1769     case DT_PPC64_GLINK:  return "PPC64_GLINK";
1770     case DT_PPC64_OPD:    return "PPC64_OPD";
1771     case DT_PPC64_OPDSZ:  return "PPC64_OPDSZ";
1772     case DT_PPC64_OPT:    return "PPC64_OPT";
1773     default:
1774       return NULL;
1775     }
1776 }
1777
1778 static const char *
1779 get_parisc_dynamic_type (unsigned long type)
1780 {
1781   switch (type)
1782     {
1783     case DT_HP_LOAD_MAP:        return "HP_LOAD_MAP";
1784     case DT_HP_DLD_FLAGS:       return "HP_DLD_FLAGS";
1785     case DT_HP_DLD_HOOK:        return "HP_DLD_HOOK";
1786     case DT_HP_UX10_INIT:       return "HP_UX10_INIT";
1787     case DT_HP_UX10_INITSZ:     return "HP_UX10_INITSZ";
1788     case DT_HP_PREINIT:         return "HP_PREINIT";
1789     case DT_HP_PREINITSZ:       return "HP_PREINITSZ";
1790     case DT_HP_NEEDED:          return "HP_NEEDED";
1791     case DT_HP_TIME_STAMP:      return "HP_TIME_STAMP";
1792     case DT_HP_CHECKSUM:        return "HP_CHECKSUM";
1793     case DT_HP_GST_SIZE:        return "HP_GST_SIZE";
1794     case DT_HP_GST_VERSION:     return "HP_GST_VERSION";
1795     case DT_HP_GST_HASHVAL:     return "HP_GST_HASHVAL";
1796     case DT_HP_EPLTREL:         return "HP_GST_EPLTREL";
1797     case DT_HP_EPLTRELSZ:       return "HP_GST_EPLTRELSZ";
1798     case DT_HP_FILTERED:        return "HP_FILTERED";
1799     case DT_HP_FILTER_TLS:      return "HP_FILTER_TLS";
1800     case DT_HP_COMPAT_FILTERED: return "HP_COMPAT_FILTERED";
1801     case DT_HP_LAZYLOAD:        return "HP_LAZYLOAD";
1802     case DT_HP_BIND_NOW_COUNT:  return "HP_BIND_NOW_COUNT";
1803     case DT_PLT:                return "PLT";
1804     case DT_PLT_SIZE:           return "PLT_SIZE";
1805     case DT_DLT:                return "DLT";
1806     case DT_DLT_SIZE:           return "DLT_SIZE";
1807     default:
1808       return NULL;
1809     }
1810 }
1811
1812 static const char *
1813 get_ia64_dynamic_type (unsigned long type)
1814 {
1815   switch (type)
1816     {
1817     case DT_IA_64_PLT_RESERVE:         return "IA_64_PLT_RESERVE";
1818     case DT_IA_64_VMS_SUBTYPE:         return "VMS_SUBTYPE";
1819     case DT_IA_64_VMS_IMGIOCNT:        return "VMS_IMGIOCNT";
1820     case DT_IA_64_VMS_LNKFLAGS:        return "VMS_LNKFLAGS";
1821     case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
1822     case DT_IA_64_VMS_IDENT:           return "VMS_IDENT";
1823     case DT_IA_64_VMS_NEEDED_IDENT:    return "VMS_NEEDED_IDENT";
1824     case DT_IA_64_VMS_IMG_RELA_CNT:    return "VMS_IMG_RELA_CNT";
1825     case DT_IA_64_VMS_SEG_RELA_CNT:    return "VMS_SEG_RELA_CNT";
1826     case DT_IA_64_VMS_FIXUP_RELA_CNT:  return "VMS_FIXUP_RELA_CNT";
1827     case DT_IA_64_VMS_FIXUP_NEEDED:    return "VMS_FIXUP_NEEDED";
1828     case DT_IA_64_VMS_SYMVEC_CNT:      return "VMS_SYMVEC_CNT";
1829     case DT_IA_64_VMS_XLATED:          return "VMS_XLATED";
1830     case DT_IA_64_VMS_STACKSIZE:       return "VMS_STACKSIZE";
1831     case DT_IA_64_VMS_UNWINDSZ:        return "VMS_UNWINDSZ";
1832     case DT_IA_64_VMS_UNWIND_CODSEG:   return "VMS_UNWIND_CODSEG";
1833     case DT_IA_64_VMS_UNWIND_INFOSEG:  return "VMS_UNWIND_INFOSEG";
1834     case DT_IA_64_VMS_LINKTIME:        return "VMS_LINKTIME";
1835     case DT_IA_64_VMS_SEG_NO:          return "VMS_SEG_NO";
1836     case DT_IA_64_VMS_SYMVEC_OFFSET:   return "VMS_SYMVEC_OFFSET";
1837     case DT_IA_64_VMS_SYMVEC_SEG:      return "VMS_SYMVEC_SEG";
1838     case DT_IA_64_VMS_UNWIND_OFFSET:   return "VMS_UNWIND_OFFSET";
1839     case DT_IA_64_VMS_UNWIND_SEG:      return "VMS_UNWIND_SEG";
1840     case DT_IA_64_VMS_STRTAB_OFFSET:   return "VMS_STRTAB_OFFSET";
1841     case DT_IA_64_VMS_SYSVER_OFFSET:   return "VMS_SYSVER_OFFSET";
1842     case DT_IA_64_VMS_IMG_RELA_OFF:    return "VMS_IMG_RELA_OFF";
1843     case DT_IA_64_VMS_SEG_RELA_OFF:    return "VMS_SEG_RELA_OFF";
1844     case DT_IA_64_VMS_FIXUP_RELA_OFF:  return "VMS_FIXUP_RELA_OFF";
1845     case DT_IA_64_VMS_PLTGOT_OFFSET:   return "VMS_PLTGOT_OFFSET";
1846     case DT_IA_64_VMS_PLTGOT_SEG:      return "VMS_PLTGOT_SEG";
1847     case DT_IA_64_VMS_FPMODE:          return "VMS_FPMODE";
1848     default:
1849       return NULL;
1850     }
1851 }
1852
1853 static const char *
1854 get_solaris_section_type (unsigned long type)
1855 {
1856   switch (type)
1857     {
1858     case 0x6fffffee: return "SUNW_ancillary";
1859     case 0x6fffffef: return "SUNW_capchain";
1860     case 0x6ffffff0: return "SUNW_capinfo";
1861     case 0x6ffffff1: return "SUNW_symsort";
1862     case 0x6ffffff2: return "SUNW_tlssort";
1863     case 0x6ffffff3: return "SUNW_LDYNSYM";
1864     case 0x6ffffff4: return "SUNW_dof";
1865     case 0x6ffffff5: return "SUNW_cap";
1866     case 0x6ffffff6: return "SUNW_SIGNATURE";
1867     case 0x6ffffff7: return "SUNW_ANNOTATE";
1868     case 0x6ffffff8: return "SUNW_DEBUGSTR";
1869     case 0x6ffffff9: return "SUNW_DEBUG";
1870     case 0x6ffffffa: return "SUNW_move";
1871     case 0x6ffffffb: return "SUNW_COMDAT";
1872     case 0x6ffffffc: return "SUNW_syminfo";
1873     case 0x6ffffffd: return "SUNW_verdef";
1874     case 0x6ffffffe: return "SUNW_verneed";
1875     case 0x6fffffff: return "SUNW_versym";
1876     case 0x70000000: return "SPARC_GOTDATA";
1877     default: return NULL;
1878     }
1879 }
1880
1881 static const char *
1882 get_alpha_dynamic_type (unsigned long type)
1883 {
1884   switch (type)
1885     {
1886     case DT_ALPHA_PLTRO: return "ALPHA_PLTRO";
1887     default:
1888       return NULL;
1889     }
1890 }
1891
1892 static const char *
1893 get_score_dynamic_type (unsigned long type)
1894 {
1895   switch (type)
1896     {
1897     case DT_SCORE_BASE_ADDRESS: return "SCORE_BASE_ADDRESS";
1898     case DT_SCORE_LOCAL_GOTNO:  return "SCORE_LOCAL_GOTNO";
1899     case DT_SCORE_SYMTABNO:     return "SCORE_SYMTABNO";
1900     case DT_SCORE_GOTSYM:       return "SCORE_GOTSYM";
1901     case DT_SCORE_UNREFEXTNO:   return "SCORE_UNREFEXTNO";
1902     case DT_SCORE_HIPAGENO:     return "SCORE_HIPAGENO";
1903     default:
1904       return NULL;
1905     }
1906 }
1907
1908 static const char *
1909 get_tic6x_dynamic_type (unsigned long type)
1910 {
1911   switch (type)
1912     {
1913     case DT_C6000_GSYM_OFFSET: return "C6000_GSYM_OFFSET";
1914     case DT_C6000_GSTR_OFFSET: return "C6000_GSTR_OFFSET";
1915     case DT_C6000_DSBT_BASE:   return "C6000_DSBT_BASE";
1916     case DT_C6000_DSBT_SIZE:   return "C6000_DSBT_SIZE";
1917     case DT_C6000_PREEMPTMAP:  return "C6000_PREEMPTMAP";
1918     case DT_C6000_DSBT_INDEX:  return "C6000_DSBT_INDEX";
1919     default:
1920       return NULL;
1921     }
1922 }
1923
1924 static const char *
1925 get_nios2_dynamic_type (unsigned long type)
1926 {
1927   switch (type)
1928     {
1929     case DT_NIOS2_GP: return "NIOS2_GP";
1930     default:
1931       return NULL;
1932     }
1933 }
1934
1935 static const char *
1936 get_solaris_dynamic_type (unsigned long type)
1937 {
1938   switch (type)
1939     {
1940     case 0x6000000d: return "SUNW_AUXILIARY";
1941     case 0x6000000e: return "SUNW_RTLDINF";
1942     case 0x6000000f: return "SUNW_FILTER";
1943     case 0x60000010: return "SUNW_CAP";
1944     case 0x60000011: return "SUNW_SYMTAB";
1945     case 0x60000012: return "SUNW_SYMSZ";
1946     case 0x60000013: return "SUNW_SORTENT";
1947     case 0x60000014: return "SUNW_SYMSORT";
1948     case 0x60000015: return "SUNW_SYMSORTSZ";
1949     case 0x60000016: return "SUNW_TLSSORT";
1950     case 0x60000017: return "SUNW_TLSSORTSZ";
1951     case 0x60000018: return "SUNW_CAPINFO";
1952     case 0x60000019: return "SUNW_STRPAD";
1953     case 0x6000001a: return "SUNW_CAPCHAIN";
1954     case 0x6000001b: return "SUNW_LDMACH";
1955     case 0x6000001d: return "SUNW_CAPCHAINENT";
1956     case 0x6000001f: return "SUNW_CAPCHAINSZ";
1957     case 0x60000021: return "SUNW_PARENT";
1958     case 0x60000023: return "SUNW_ASLR";
1959     case 0x60000025: return "SUNW_RELAX";
1960     case 0x60000029: return "SUNW_NXHEAP";
1961     case 0x6000002b: return "SUNW_NXSTACK";
1962
1963     case 0x70000001: return "SPARC_REGISTER";
1964     case 0x7ffffffd: return "AUXILIARY";
1965     case 0x7ffffffe: return "USED";
1966     case 0x7fffffff: return "FILTER";
1967
1968     default: return NULL;      
1969     }
1970 }
1971
1972 static const char *
1973 get_dynamic_type (unsigned long type)
1974 {
1975   static char buff[64];
1976
1977   switch (type)
1978     {
1979     case DT_NULL:       return "NULL";
1980     case DT_NEEDED:     return "NEEDED";
1981     case DT_PLTRELSZ:   return "PLTRELSZ";
1982     case DT_PLTGOT:     return "PLTGOT";
1983     case DT_HASH:       return "HASH";
1984     case DT_STRTAB:     return "STRTAB";
1985     case DT_SYMTAB:     return "SYMTAB";
1986     case DT_RELA:       return "RELA";
1987     case DT_RELASZ:     return "RELASZ";
1988     case DT_RELAENT:    return "RELAENT";
1989     case DT_STRSZ:      return "STRSZ";
1990     case DT_SYMENT:     return "SYMENT";
1991     case DT_INIT:       return "INIT";
1992     case DT_FINI:       return "FINI";
1993     case DT_SONAME:     return "SONAME";
1994     case DT_RPATH:      return "RPATH";
1995     case DT_SYMBOLIC:   return "SYMBOLIC";
1996     case DT_REL:        return "REL";
1997     case DT_RELSZ:      return "RELSZ";
1998     case DT_RELENT:     return "RELENT";
1999     case DT_PLTREL:     return "PLTREL";
2000     case DT_DEBUG:      return "DEBUG";
2001     case DT_TEXTREL:    return "TEXTREL";
2002     case DT_JMPREL:     return "JMPREL";
2003     case DT_BIND_NOW:   return "BIND_NOW";
2004     case DT_INIT_ARRAY: return "INIT_ARRAY";
2005     case DT_FINI_ARRAY: return "FINI_ARRAY";
2006     case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ";
2007     case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ";
2008     case DT_RUNPATH:    return "RUNPATH";
2009     case DT_FLAGS:      return "FLAGS";
2010
2011     case DT_PREINIT_ARRAY: return "PREINIT_ARRAY";
2012     case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ";
2013
2014     case DT_CHECKSUM:   return "CHECKSUM";
2015     case DT_PLTPADSZ:   return "PLTPADSZ";
2016     case DT_MOVEENT:    return "MOVEENT";
2017     case DT_MOVESZ:     return "MOVESZ";
2018     case DT_FEATURE:    return "FEATURE";
2019     case DT_POSFLAG_1:  return "POSFLAG_1";
2020     case DT_SYMINSZ:    return "SYMINSZ";
2021     case DT_SYMINENT:   return "SYMINENT"; /* aka VALRNGHI */
2022
2023     case DT_ADDRRNGLO:  return "ADDRRNGLO";
2024     case DT_CONFIG:     return "CONFIG";
2025     case DT_DEPAUDIT:   return "DEPAUDIT";
2026     case DT_AUDIT:      return "AUDIT";
2027     case DT_PLTPAD:     return "PLTPAD";
2028     case DT_MOVETAB:    return "MOVETAB";
2029     case DT_SYMINFO:    return "SYMINFO"; /* aka ADDRRNGHI */
2030
2031     case DT_VERSYM:     return "VERSYM";
2032
2033     case DT_TLSDESC_GOT: return "TLSDESC_GOT";
2034     case DT_TLSDESC_PLT: return "TLSDESC_PLT";
2035     case DT_RELACOUNT:  return "RELACOUNT";
2036     case DT_RELCOUNT:   return "RELCOUNT";
2037     case DT_FLAGS_1:    return "FLAGS_1";
2038     case DT_VERDEF:     return "VERDEF";
2039     case DT_VERDEFNUM:  return "VERDEFNUM";
2040     case DT_VERNEED:    return "VERNEED";
2041     case DT_VERNEEDNUM: return "VERNEEDNUM";
2042
2043     case DT_AUXILIARY:  return "AUXILIARY";
2044     case DT_USED:       return "USED";
2045     case DT_FILTER:     return "FILTER";
2046
2047     case DT_GNU_PRELINKED: return "GNU_PRELINKED";
2048     case DT_GNU_CONFLICT: return "GNU_CONFLICT";
2049     case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ";
2050     case DT_GNU_LIBLIST: return "GNU_LIBLIST";
2051     case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ";
2052     case DT_GNU_HASH:   return "GNU_HASH";
2053
2054     default:
2055       if ((type >= DT_LOPROC) && (type <= DT_HIPROC))
2056         {
2057           const char * result;
2058
2059           switch (elf_header.e_machine)
2060             {
2061             case EM_MIPS:
2062             case EM_MIPS_RS3_LE:
2063               result = get_mips_dynamic_type (type);
2064               break;
2065             case EM_SPARCV9:
2066               result = get_sparc64_dynamic_type (type);
2067               break;
2068             case EM_PPC:
2069               result = get_ppc_dynamic_type (type);
2070               break;
2071             case EM_PPC64:
2072               result = get_ppc64_dynamic_type (type);
2073               break;
2074             case EM_IA_64:
2075               result = get_ia64_dynamic_type (type);
2076               break;
2077             case EM_ALPHA:
2078               result = get_alpha_dynamic_type (type);
2079               break;
2080             case EM_SCORE:
2081               result = get_score_dynamic_type (type);
2082               break;
2083             case EM_TI_C6000:
2084               result = get_tic6x_dynamic_type (type);
2085               break;
2086             case EM_ALTERA_NIOS2:
2087               result = get_nios2_dynamic_type (type);
2088               break;
2089             default:
2090               if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2091                 result = get_solaris_dynamic_type (type);
2092               else
2093                 result = NULL;
2094               break;
2095             }
2096
2097           if (result != NULL)
2098             return result;
2099
2100           snprintf (buff, sizeof (buff), _("Processor Specific: %lx"), type);
2101         }
2102       else if (((type >= DT_LOOS) && (type <= DT_HIOS))
2103                || (elf_header.e_machine == EM_PARISC
2104                    && (type >= OLD_DT_LOOS) && (type <= OLD_DT_HIOS)))
2105         {
2106           const char * result;
2107
2108           switch (elf_header.e_machine)
2109             {
2110             case EM_PARISC:
2111               result = get_parisc_dynamic_type (type);
2112               break;
2113             case EM_IA_64:
2114               result = get_ia64_dynamic_type (type);
2115               break;
2116             default:
2117               if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
2118                 result = get_solaris_dynamic_type (type);
2119               else
2120                 result = NULL;
2121               break;
2122             }
2123
2124           if (result != NULL)
2125             return result;
2126
2127           snprintf (buff, sizeof (buff), _("Operating System specific: %lx"),
2128                     type);
2129         }
2130       else
2131         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), type);
2132
2133       return buff;
2134     }
2135 }
2136
2137 static char *
2138 get_file_type (unsigned e_type)
2139 {
2140   static char buff[32];
2141
2142   switch (e_type)
2143     {
2144     case ET_NONE:       return _("NONE (None)");
2145     case ET_REL:        return _("REL (Relocatable file)");
2146     case ET_EXEC:       return _("EXEC (Executable file)");
2147     case ET_DYN:        return _("DYN (Shared object file)");
2148     case ET_CORE:       return _("CORE (Core file)");
2149
2150     default:
2151       if ((e_type >= ET_LOPROC) && (e_type <= ET_HIPROC))
2152         snprintf (buff, sizeof (buff), _("Processor Specific: (%x)"), e_type);
2153       else if ((e_type >= ET_LOOS) && (e_type <= ET_HIOS))
2154         snprintf (buff, sizeof (buff), _("OS Specific: (%x)"), e_type);
2155       else
2156         snprintf (buff, sizeof (buff), _("<unknown>: %x"), e_type);
2157       return buff;
2158     }
2159 }
2160
2161 static char *
2162 get_machine_name (unsigned e_machine)
2163 {
2164   static char buff[64]; /* XXX */
2165
2166   switch (e_machine)
2167     {
2168     case EM_NONE:               return _("None");
2169     case EM_AARCH64:            return "AArch64";
2170     case EM_M32:                return "WE32100";
2171     case EM_SPARC:              return "Sparc";
2172     case EM_SPU:                return "SPU";
2173     case EM_386:                return "Intel 80386";
2174     case EM_68K:                return "MC68000";
2175     case EM_88K:                return "MC88000";
2176     case EM_IAMCU:              return "Intel MCU";
2177     case EM_860:                return "Intel 80860";
2178     case EM_MIPS:               return "MIPS R3000";
2179     case EM_S370:               return "IBM System/370";
2180     case EM_MIPS_RS3_LE:        return "MIPS R4000 big-endian";
2181     case EM_OLD_SPARCV9:        return "Sparc v9 (old)";
2182     case EM_PARISC:             return "HPPA";
2183     case EM_PPC_OLD:            return "Power PC (old)";
2184     case EM_SPARC32PLUS:        return "Sparc v8+" ;
2185     case EM_960:                return "Intel 90860";
2186     case EM_PPC:                return "PowerPC";
2187     case EM_PPC64:              return "PowerPC64";
2188     case EM_FR20:               return "Fujitsu FR20";
2189     case EM_FT32:               return "FTDI FT32";
2190     case EM_RH32:               return "TRW RH32";
2191     case EM_MCORE:              return "MCORE";
2192     case EM_ARM:                return "ARM";
2193     case EM_OLD_ALPHA:          return "Digital Alpha (old)";
2194     case EM_SH:                 return "Renesas / SuperH SH";
2195     case EM_SPARCV9:            return "Sparc v9";
2196     case EM_TRICORE:            return "Siemens Tricore";
2197     case EM_ARC:                return "ARC";
2198     case EM_ARC_COMPACT:        return "ARCompact";
2199     case EM_ARC_COMPACT2:       return "ARCv2";
2200     case EM_H8_300:             return "Renesas H8/300";
2201     case EM_H8_300H:            return "Renesas H8/300H";
2202     case EM_H8S:                return "Renesas H8S";
2203     case EM_H8_500:             return "Renesas H8/500";
2204     case EM_IA_64:              return "Intel IA-64";
2205     case EM_MIPS_X:             return "Stanford MIPS-X";
2206     case EM_COLDFIRE:           return "Motorola Coldfire";
2207     case EM_ALPHA:              return "Alpha";
2208     case EM_CYGNUS_D10V:
2209     case EM_D10V:               return "d10v";
2210     case EM_CYGNUS_D30V:
2211     case EM_D30V:               return "d30v";
2212     case EM_CYGNUS_M32R:
2213     case EM_M32R:               return "Renesas M32R (formerly Mitsubishi M32r)";
2214     case EM_CYGNUS_V850:
2215     case EM_V800:               return "Renesas V850 (using RH850 ABI)";
2216     case EM_V850:               return "Renesas V850";
2217     case EM_CYGNUS_MN10300:
2218     case EM_MN10300:            return "mn10300";
2219     case EM_CYGNUS_MN10200:
2220     case EM_MN10200:            return "mn10200";
2221     case EM_MOXIE:              return "Moxie";
2222     case EM_CYGNUS_FR30:
2223     case EM_FR30:               return "Fujitsu FR30";
2224     case EM_CYGNUS_FRV:         return "Fujitsu FR-V";
2225     case EM_PJ_OLD:
2226     case EM_PJ:                 return "picoJava";
2227     case EM_MMA:                return "Fujitsu Multimedia Accelerator";
2228     case EM_PCP:                return "Siemens PCP";
2229     case EM_NCPU:               return "Sony nCPU embedded RISC processor";
2230     case EM_NDR1:               return "Denso NDR1 microprocesspr";
2231     case EM_STARCORE:           return "Motorola Star*Core processor";
2232     case EM_ME16:               return "Toyota ME16 processor";
2233     case EM_ST100:              return "STMicroelectronics ST100 processor";
2234     case EM_TINYJ:              return "Advanced Logic Corp. TinyJ embedded processor";
2235     case EM_PDSP:               return "Sony DSP processor";
2236     case EM_PDP10:              return "Digital Equipment Corp. PDP-10";
2237     case EM_PDP11:              return "Digital Equipment Corp. PDP-11";
2238     case EM_FX66:               return "Siemens FX66 microcontroller";
2239     case EM_ST9PLUS:            return "STMicroelectronics ST9+ 8/16 bit microcontroller";
2240     case EM_ST7:                return "STMicroelectronics ST7 8-bit microcontroller";
2241     case EM_68HC16:             return "Motorola MC68HC16 Microcontroller";
2242     case EM_68HC12:             return "Motorola MC68HC12 Microcontroller";
2243     case EM_68HC11:             return "Motorola MC68HC11 Microcontroller";
2244     case EM_68HC08:             return "Motorola MC68HC08 Microcontroller";
2245     case EM_68HC05:             return "Motorola MC68HC05 Microcontroller";
2246     case EM_SVX:                return "Silicon Graphics SVx";
2247     case EM_ST19:               return "STMicroelectronics ST19 8-bit microcontroller";
2248     case EM_VAX:                return "Digital VAX";
2249     case EM_VISIUM:             return "CDS VISIUMcore processor";
2250     case EM_AVR_OLD:
2251     case EM_AVR:                return "Atmel AVR 8-bit microcontroller";
2252     case EM_CRIS:               return "Axis Communications 32-bit embedded processor";
2253     case EM_JAVELIN:            return "Infineon Technologies 32-bit embedded cpu";
2254     case EM_FIREPATH:           return "Element 14 64-bit DSP processor";
2255     case EM_ZSP:                return "LSI Logic's 16-bit DSP processor";
2256     case EM_MMIX:               return "Donald Knuth's educational 64-bit processor";
2257     case EM_HUANY:              return "Harvard Universitys's machine-independent object format";
2258     case EM_PRISM:              return "Vitesse Prism";
2259     case EM_X86_64:             return "Advanced Micro Devices X86-64";
2260     case EM_L1OM:               return "Intel L1OM";
2261     case EM_K1OM:               return "Intel K1OM";
2262     case EM_S390_OLD:
2263     case EM_S390:               return "IBM S/390";
2264     case EM_SCORE:              return "SUNPLUS S+Core";
2265     case EM_XSTORMY16:          return "Sanyo XStormy16 CPU core";
2266     case EM_OR1K:               return "OpenRISC 1000";
2267     case EM_CRX:                return "National Semiconductor CRX microprocessor";
2268     case EM_ADAPTEVA_EPIPHANY:  return "Adapteva EPIPHANY";
2269     case EM_DLX:                return "OpenDLX";
2270     case EM_IP2K_OLD:
2271     case EM_IP2K:               return "Ubicom IP2xxx 8-bit microcontrollers";
2272     case EM_IQ2000:             return "Vitesse IQ2000";
2273     case EM_XTENSA_OLD:
2274     case EM_XTENSA:             return "Tensilica Xtensa Processor";
2275     case EM_VIDEOCORE:          return "Alphamosaic VideoCore processor";
2276     case EM_TMM_GPP:            return "Thompson Multimedia General Purpose Processor";
2277     case EM_NS32K:              return "National Semiconductor 32000 series";
2278     case EM_TPC:                return "Tenor Network TPC processor";
2279     case EM_ST200:              return "STMicroelectronics ST200 microcontroller";
2280     case EM_MAX:                return "MAX Processor";
2281     case EM_CR:                 return "National Semiconductor CompactRISC";
2282     case EM_F2MC16:             return "Fujitsu F2MC16";
2283     case EM_MSP430:             return "Texas Instruments msp430 microcontroller";
2284     case EM_LATTICEMICO32:      return "Lattice Mico32";
2285     case EM_M32C_OLD:
2286     case EM_M32C:               return "Renesas M32c";
2287     case EM_MT:                 return "Morpho Techologies MT processor";
2288     case EM_BLACKFIN:           return "Analog Devices Blackfin";
2289     case EM_SE_C33:             return "S1C33 Family of Seiko Epson processors";
2290     case EM_SEP:                return "Sharp embedded microprocessor";
2291     case EM_ARCA:               return "Arca RISC microprocessor";
2292     case EM_UNICORE:            return "Unicore";
2293     case EM_EXCESS:             return "eXcess 16/32/64-bit configurable embedded CPU";
2294     case EM_DXP:                return "Icera Semiconductor Inc. Deep Execution Processor";
2295     case EM_NIOS32:             return "Altera Nios";
2296     case EM_ALTERA_NIOS2:       return "Altera Nios II";
2297     case EM_C166:
2298     case EM_XC16X:              return "Infineon Technologies xc16x";
2299     case EM_M16C:               return "Renesas M16C series microprocessors";
2300     case EM_DSPIC30F:           return "Microchip Technology dsPIC30F Digital Signal Controller";
2301     case EM_CE:                 return "Freescale Communication Engine RISC core";
2302     case EM_TSK3000:            return "Altium TSK3000 core";
2303     case EM_RS08:               return "Freescale RS08 embedded processor";
2304     case EM_ECOG2:              return "Cyan Technology eCOG2 microprocessor";
2305     case EM_DSP24:              return "New Japan Radio (NJR) 24-bit DSP Processor";
2306     case EM_VIDEOCORE3:         return "Broadcom VideoCore III processor";
2307     case EM_SE_C17:             return "Seiko Epson C17 family";
2308     case EM_TI_C6000:           return "Texas Instruments TMS320C6000 DSP family";
2309     case EM_TI_C2000:           return "Texas Instruments TMS320C2000 DSP family";
2310     case EM_TI_C5500:           return "Texas Instruments TMS320C55x DSP family";
2311     case EM_MMDSP_PLUS:         return "STMicroelectronics 64bit VLIW Data Signal Processor";
2312     case EM_CYPRESS_M8C:        return "Cypress M8C microprocessor";
2313     case EM_R32C:               return "Renesas R32C series microprocessors";
2314     case EM_TRIMEDIA:           return "NXP Semiconductors TriMedia architecture family";
2315     case EM_QDSP6:              return "QUALCOMM DSP6 Processor";
2316     case EM_8051:               return "Intel 8051 and variants";
2317     case EM_STXP7X:             return "STMicroelectronics STxP7x family";
2318     case EM_NDS32:              return "Andes Technology compact code size embedded RISC processor family";
2319     case EM_ECOG1X:             return "Cyan Technology eCOG1X family";
2320     case EM_MAXQ30:             return "Dallas Semiconductor MAXQ30 Core microcontrollers";
2321     case EM_XIMO16:             return "New Japan Radio (NJR) 16-bit DSP Processor";
2322     case EM_MANIK:              return "M2000 Reconfigurable RISC Microprocessor";
2323     case EM_CRAYNV2:            return "Cray Inc. NV2 vector architecture";
2324     case EM_CYGNUS_MEP:         return "Toshiba MeP Media Engine";
2325     case EM_CR16:
2326     case EM_MICROBLAZE:
2327     case EM_MICROBLAZE_OLD:     return "Xilinx MicroBlaze";
2328     case EM_RL78:               return "Renesas RL78";
2329     case EM_RX:                 return "Renesas RX";
2330     case EM_METAG:              return "Imagination Technologies Meta processor architecture";
2331     case EM_MCST_ELBRUS:        return "MCST Elbrus general purpose hardware architecture";
2332     case EM_ECOG16:             return "Cyan Technology eCOG16 family";
2333     case EM_ETPU:               return "Freescale Extended Time Processing Unit";
2334     case EM_SLE9X:              return "Infineon Technologies SLE9X core";
2335     case EM_AVR32:              return "Atmel Corporation 32-bit microprocessor family";
2336     case EM_STM8:               return "STMicroeletronics STM8 8-bit microcontroller";
2337     case EM_TILE64:             return "Tilera TILE64 multicore architecture family";
2338     case EM_TILEPRO:            return "Tilera TILEPro multicore architecture family";
2339     case EM_TILEGX:             return "Tilera TILE-Gx multicore architecture family";
2340     case EM_CUDA:               return "NVIDIA CUDA architecture";
2341     case EM_XGATE:              return "Motorola XGATE embedded processor";
2342     default:
2343       snprintf (buff, sizeof (buff), _("<unknown>: 0x%x"), e_machine);
2344       return buff;
2345     }
2346 }
2347
2348 static void
2349 decode_ARC_machine_flags (unsigned e_flags, unsigned e_machine, char buf[])
2350 {
2351   /* ARC has two machine types EM_ARC_COMPACT and EM_ARC_COMPACT2.  Some
2352      other compilers don't a specific architecture type in the e_flags, and
2353      instead use EM_ARC_COMPACT for old ARC600, ARC601, and ARC700
2354      architectures, and switch to EM_ARC_COMPACT2 for newer ARCEM and ARCHS
2355      architectures.
2356
2357      Th GNU tools follows this use of EM_ARC_COMPACT and EM_ARC_COMPACT2,
2358      but also sets a specific architecture type in the e_flags field.
2359
2360      However, when decoding the flags we don't worry if we see an
2361      unexpected pairing, for example EM_ARC_COMPACT machine type, with
2362      ARCEM architecture type.  */
2363
2364   switch (e_flags & EF_ARC_MACH_MSK)
2365     {
2366       /* We only expect these to occur for EM_ARC_COMPACT2.  */
2367     case EF_ARC_CPU_ARCV2EM:
2368       strcat (buf, ", ARC EM");
2369       break;
2370     case EF_ARC_CPU_ARCV2HS:
2371       strcat (buf, ", ARC HS");
2372       break;
2373
2374       /* We only expect these to occur for EM_ARC_COMPACT.  */
2375     case E_ARC_MACH_ARC600:
2376       strcat (buf, ", ARC600");
2377       break;
2378     case E_ARC_MACH_ARC601:
2379       strcat (buf, ", ARC601");
2380       break;
2381     case E_ARC_MACH_ARC700:
2382       strcat (buf, ", ARC700");
2383       break;
2384
2385       /* The only times we should end up here are (a) A corrupt ELF, (b) A
2386          new ELF with new architecture being read by an old version of
2387          readelf, or (c) An ELF built with non-GNU compiler that does not
2388          set the architecture in the e_flags.  */
2389     default:
2390       if (e_machine == EM_ARC_COMPACT)
2391         strcat (buf, ", Unknown ARCompact");
2392       else
2393         strcat (buf, ", Unknown ARC");
2394       break;
2395     }
2396
2397   switch (e_flags & EF_ARC_OSABI_MSK)
2398     {
2399     case E_ARC_OSABI_ORIG:
2400       strcat (buf, ", (ABI:legacy)");
2401       break;
2402     case E_ARC_OSABI_V2:
2403       strcat (buf, ", (ABI:v2)");
2404       break;
2405       /* Only upstream 3.9+ kernels will support ARCv2 ISA.  */
2406     case E_ARC_OSABI_V3:
2407       strcat (buf, ", v3 no-legacy-syscalls ABI");
2408       break;
2409     default:
2410       strcat (buf, ", unrecognised ARC OSABI flag");
2411       break;
2412     }
2413 }
2414
2415 static void
2416 decode_ARM_machine_flags (unsigned e_flags, char buf[])
2417 {
2418   unsigned eabi;
2419   int unknown = 0;
2420
2421   eabi = EF_ARM_EABI_VERSION (e_flags);
2422   e_flags &= ~ EF_ARM_EABIMASK;
2423
2424   /* Handle "generic" ARM flags.  */
2425   if (e_flags & EF_ARM_RELEXEC)
2426     {
2427       strcat (buf, ", relocatable executable");
2428       e_flags &= ~ EF_ARM_RELEXEC;
2429     }
2430
2431   /* Now handle EABI specific flags.  */
2432   switch (eabi)
2433     {
2434     default:
2435       strcat (buf, ", <unrecognized EABI>");
2436       if (e_flags)
2437         unknown = 1;
2438       break;
2439
2440     case EF_ARM_EABI_VER1:
2441       strcat (buf, ", Version1 EABI");
2442       while (e_flags)
2443         {
2444           unsigned flag;
2445
2446           /* Process flags one bit at a time.  */
2447           flag = e_flags & - e_flags;
2448           e_flags &= ~ flag;
2449
2450           switch (flag)
2451             {
2452             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2453               strcat (buf, ", sorted symbol tables");
2454               break;
2455
2456             default:
2457               unknown = 1;
2458               break;
2459             }
2460         }
2461       break;
2462
2463     case EF_ARM_EABI_VER2:
2464       strcat (buf, ", Version2 EABI");
2465       while (e_flags)
2466         {
2467           unsigned flag;
2468
2469           /* Process flags one bit at a time.  */
2470           flag = e_flags & - e_flags;
2471           e_flags &= ~ flag;
2472
2473           switch (flag)
2474             {
2475             case EF_ARM_SYMSARESORTED: /* Conflicts with EF_ARM_INTERWORK.  */
2476               strcat (buf, ", sorted symbol tables");
2477               break;
2478
2479             case EF_ARM_DYNSYMSUSESEGIDX:
2480               strcat (buf, ", dynamic symbols use segment index");
2481               break;
2482
2483             case EF_ARM_MAPSYMSFIRST:
2484               strcat (buf, ", mapping symbols precede others");
2485               break;
2486
2487             default:
2488               unknown = 1;
2489               break;
2490             }
2491         }
2492       break;
2493
2494     case EF_ARM_EABI_VER3:
2495       strcat (buf, ", Version3 EABI");
2496       break;
2497
2498     case EF_ARM_EABI_VER4:
2499       strcat (buf, ", Version4 EABI");
2500       while (e_flags)
2501         {
2502           unsigned flag;
2503
2504           /* Process flags one bit at a time.  */
2505           flag = e_flags & - e_flags;
2506           e_flags &= ~ flag;
2507
2508           switch (flag)
2509             {
2510             case EF_ARM_BE8:
2511               strcat (buf, ", BE8");
2512               break;
2513
2514             case EF_ARM_LE8:
2515               strcat (buf, ", LE8");
2516               break;
2517
2518             default:
2519               unknown = 1;
2520               break;
2521             }
2522       break;
2523         }
2524       break;
2525
2526     case EF_ARM_EABI_VER5:
2527       strcat (buf, ", Version5 EABI");
2528       while (e_flags)
2529         {
2530           unsigned flag;
2531
2532           /* Process flags one bit at a time.  */
2533           flag = e_flags & - e_flags;
2534           e_flags &= ~ flag;
2535
2536           switch (flag)
2537             {
2538             case EF_ARM_BE8:
2539               strcat (buf, ", BE8");
2540               break;
2541
2542             case EF_ARM_LE8:
2543               strcat (buf, ", LE8");
2544               break;
2545
2546             case EF_ARM_ABI_FLOAT_SOFT: /* Conflicts with EF_ARM_SOFT_FLOAT.  */
2547               strcat (buf, ", soft-float ABI");
2548               break;
2549
2550             case EF_ARM_ABI_FLOAT_HARD: /* Conflicts with EF_ARM_VFP_FLOAT.  */
2551               strcat (buf, ", hard-float ABI");
2552               break;
2553
2554             default:
2555               unknown = 1;
2556               break;
2557             }
2558         }
2559       break;
2560
2561     case EF_ARM_EABI_UNKNOWN:
2562       strcat (buf, ", GNU EABI");
2563       while (e_flags)
2564         {
2565           unsigned flag;
2566
2567           /* Process flags one bit at a time.  */
2568           flag = e_flags & - e_flags;
2569           e_flags &= ~ flag;
2570
2571           switch (flag)
2572             {
2573             case EF_ARM_INTERWORK:
2574               strcat (buf, ", interworking enabled");
2575               break;
2576
2577             case EF_ARM_APCS_26:
2578               strcat (buf, ", uses APCS/26");
2579               break;
2580
2581             case EF_ARM_APCS_FLOAT:
2582               strcat (buf, ", uses APCS/float");
2583               break;
2584
2585             case EF_ARM_PIC:
2586               strcat (buf, ", position independent");
2587               break;
2588
2589             case EF_ARM_ALIGN8:
2590               strcat (buf, ", 8 bit structure alignment");
2591               break;
2592
2593             case EF_ARM_NEW_ABI:
2594               strcat (buf, ", uses new ABI");
2595               break;
2596
2597             case EF_ARM_OLD_ABI:
2598               strcat (buf, ", uses old ABI");
2599               break;
2600
2601             case EF_ARM_SOFT_FLOAT:
2602               strcat (buf, ", software FP");
2603               break;
2604
2605             case EF_ARM_VFP_FLOAT:
2606               strcat (buf, ", VFP");
2607               break;
2608
2609             case EF_ARM_MAVERICK_FLOAT:
2610               strcat (buf, ", Maverick FP");
2611               break;
2612
2613             default:
2614               unknown = 1;
2615               break;
2616             }
2617         }
2618     }
2619
2620   if (unknown)
2621     strcat (buf,_(", <unknown>"));
2622 }
2623
2624 static void
2625 decode_AVR_machine_flags (unsigned e_flags, char buf[], size_t size)
2626 {
2627   --size; /* Leave space for null terminator.  */
2628
2629   switch (e_flags & EF_AVR_MACH)
2630     {
2631     case E_AVR_MACH_AVR1:
2632       strncat (buf, ", avr:1", size);
2633       break;
2634     case E_AVR_MACH_AVR2:
2635       strncat (buf, ", avr:2", size);
2636       break;
2637     case E_AVR_MACH_AVR25:
2638       strncat (buf, ", avr:25", size);
2639       break;
2640     case E_AVR_MACH_AVR3:
2641       strncat (buf, ", avr:3", size);
2642       break;
2643     case E_AVR_MACH_AVR31:
2644       strncat (buf, ", avr:31", size);
2645       break;
2646     case E_AVR_MACH_AVR35:
2647       strncat (buf, ", avr:35", size);
2648       break;
2649     case E_AVR_MACH_AVR4:
2650       strncat (buf, ", avr:4", size);
2651       break;
2652     case E_AVR_MACH_AVR5:
2653       strncat (buf, ", avr:5", size);
2654       break;
2655     case E_AVR_MACH_AVR51:
2656       strncat (buf, ", avr:51", size);
2657       break;
2658     case E_AVR_MACH_AVR6:
2659       strncat (buf, ", avr:6", size);
2660       break;
2661     case E_AVR_MACH_AVRTINY:
2662       strncat (buf, ", avr:100", size);
2663       break;
2664     case E_AVR_MACH_XMEGA1:
2665       strncat (buf, ", avr:101", size);
2666       break;
2667     case E_AVR_MACH_XMEGA2:
2668       strncat (buf, ", avr:102", size);
2669       break;
2670     case E_AVR_MACH_XMEGA3:
2671       strncat (buf, ", avr:103", size);
2672       break;
2673     case E_AVR_MACH_XMEGA4:
2674       strncat (buf, ", avr:104", size);
2675       break;
2676     case E_AVR_MACH_XMEGA5:
2677       strncat (buf, ", avr:105", size);
2678       break;
2679     case E_AVR_MACH_XMEGA6:
2680       strncat (buf, ", avr:106", size);
2681       break;
2682     case E_AVR_MACH_XMEGA7:
2683       strncat (buf, ", avr:107", size);
2684       break;
2685     default:
2686       strncat (buf, ", avr:<unknown>", size);
2687       break;
2688     }
2689
2690   size -= strlen (buf);
2691   if (e_flags & EF_AVR_LINKRELAX_PREPARED)
2692     strncat (buf, ", link-relax", size);
2693 }
2694
2695 static void
2696 decode_NDS32_machine_flags (unsigned e_flags, char buf[], size_t size)
2697 {
2698   unsigned abi;
2699   unsigned arch;
2700   unsigned config;
2701   unsigned version;
2702   int has_fpu = 0;
2703   int r = 0;
2704
2705   static const char *ABI_STRINGS[] =
2706   {
2707     "ABI v0", /* use r5 as return register; only used in N1213HC */
2708     "ABI v1", /* use r0 as return register */
2709     "ABI v2", /* use r0 as return register and don't reserve 24 bytes for arguments */
2710     "ABI v2fp", /* for FPU */
2711     "AABI",
2712     "ABI2 FP+"
2713   };
2714   static const char *VER_STRINGS[] =
2715   {
2716     "Andes ELF V1.3 or older",
2717     "Andes ELF V1.3.1",
2718     "Andes ELF V1.4"
2719   };
2720   static const char *ARCH_STRINGS[] =
2721   {
2722     "",
2723     "Andes Star v1.0",
2724     "Andes Star v2.0",
2725     "Andes Star v3.0",
2726     "Andes Star v3.0m"
2727   };
2728
2729   abi = EF_NDS_ABI & e_flags;
2730   arch = EF_NDS_ARCH & e_flags;
2731   config = EF_NDS_INST & e_flags;
2732   version = EF_NDS32_ELF_VERSION & e_flags;
2733
2734   memset (buf, 0, size);
2735
2736   switch (abi)
2737     {
2738     case E_NDS_ABI_V0:
2739     case E_NDS_ABI_V1:
2740     case E_NDS_ABI_V2:
2741     case E_NDS_ABI_V2FP:
2742     case E_NDS_ABI_AABI:
2743     case E_NDS_ABI_V2FP_PLUS:
2744       /* In case there are holes in the array.  */
2745       r += snprintf (buf + r, size - r, ", %s", ABI_STRINGS[abi >> EF_NDS_ABI_SHIFT]);
2746       break;
2747
2748     default:
2749       r += snprintf (buf + r, size - r, ", <unrecognized ABI>");
2750       break;
2751     }
2752
2753   switch (version)
2754     {
2755     case E_NDS32_ELF_VER_1_2:
2756     case E_NDS32_ELF_VER_1_3:
2757     case E_NDS32_ELF_VER_1_4:
2758       r += snprintf (buf + r, size - r, ", %s", VER_STRINGS[version >> EF_NDS32_ELF_VERSION_SHIFT]);
2759       break;
2760
2761     default:
2762       r += snprintf (buf + r, size - r, ", <unrecognized ELF version number>");
2763       break;
2764     }
2765
2766   if (E_NDS_ABI_V0 == abi)
2767     {
2768       /* OLD ABI; only used in N1213HC, has performance extension 1.  */
2769       r += snprintf (buf + r, size - r, ", Andes Star v1.0, N1213HC, MAC, PERF1");
2770       if (arch == E_NDS_ARCH_STAR_V1_0)
2771         r += snprintf (buf + r, size -r, ", 16b"); /* has 16-bit instructions */
2772       return;
2773     }
2774
2775   switch (arch)
2776     {
2777     case E_NDS_ARCH_STAR_V1_0:
2778     case E_NDS_ARCH_STAR_V2_0:
2779     case E_NDS_ARCH_STAR_V3_0:
2780     case E_NDS_ARCH_STAR_V3_M:
2781       r += snprintf (buf + r, size - r, ", %s", ARCH_STRINGS[arch >> EF_NDS_ARCH_SHIFT]);
2782       break;
2783
2784     default:
2785       r += snprintf (buf + r, size - r, ", <unrecognized architecture>");
2786       /* ARCH version determines how the e_flags are interpreted.
2787          If it is unknown, we cannot proceed.  */
2788       return;
2789     }
2790
2791   /* Newer ABI; Now handle architecture specific flags.  */
2792   if (arch == E_NDS_ARCH_STAR_V1_0)
2793     {
2794       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2795         r += snprintf (buf + r, size -r, ", MFUSR_PC");
2796
2797       if (!(config & E_NDS32_HAS_NO_MAC_INST))
2798         r += snprintf (buf + r, size -r, ", MAC");
2799
2800       if (config & E_NDS32_HAS_DIV_INST)
2801         r += snprintf (buf + r, size -r, ", DIV");
2802
2803       if (config & E_NDS32_HAS_16BIT_INST)
2804         r += snprintf (buf + r, size -r, ", 16b");
2805     }
2806   else
2807     {
2808       if (config & E_NDS32_HAS_MFUSR_PC_INST)
2809         {
2810           if (version <= E_NDS32_ELF_VER_1_3)
2811             r += snprintf (buf + r, size -r, ", [B8]");
2812           else
2813             r += snprintf (buf + r, size -r, ", EX9");
2814         }
2815
2816       if (config & E_NDS32_HAS_MAC_DX_INST)
2817         r += snprintf (buf + r, size -r, ", MAC_DX");
2818
2819       if (config & E_NDS32_HAS_DIV_DX_INST)
2820         r += snprintf (buf + r, size -r, ", DIV_DX");
2821
2822       if (config & E_NDS32_HAS_16BIT_INST)
2823         {
2824           if (version <= E_NDS32_ELF_VER_1_3)
2825             r += snprintf (buf + r, size -r, ", 16b");
2826           else
2827             r += snprintf (buf + r, size -r, ", IFC");
2828         }
2829     }
2830
2831   if (config & E_NDS32_HAS_EXT_INST)
2832     r += snprintf (buf + r, size -r, ", PERF1");
2833
2834   if (config & E_NDS32_HAS_EXT2_INST)
2835     r += snprintf (buf + r, size -r, ", PERF2");
2836
2837   if (config & E_NDS32_HAS_FPU_INST)
2838     {
2839       has_fpu = 1;
2840       r += snprintf (buf + r, size -r, ", FPU_SP");
2841     }
2842
2843   if (config & E_NDS32_HAS_FPU_DP_INST)
2844     {
2845       has_fpu = 1;
2846       r += snprintf (buf + r, size -r, ", FPU_DP");
2847     }
2848
2849   if (config & E_NDS32_HAS_FPU_MAC_INST)
2850     {
2851       has_fpu = 1;
2852       r += snprintf (buf + r, size -r, ", FPU_MAC");
2853     }
2854
2855   if (has_fpu)
2856     {
2857       switch ((config & E_NDS32_FPU_REG_CONF) >> E_NDS32_FPU_REG_CONF_SHIFT)
2858         {
2859         case E_NDS32_FPU_REG_8SP_4DP:
2860           r += snprintf (buf + r, size -r, ", FPU_REG:8/4");
2861           break;
2862         case E_NDS32_FPU_REG_16SP_8DP:
2863           r += snprintf (buf + r, size -r, ", FPU_REG:16/8");
2864           break;
2865         case E_NDS32_FPU_REG_32SP_16DP:
2866           r += snprintf (buf + r, size -r, ", FPU_REG:32/16");
2867           break;
2868         case E_NDS32_FPU_REG_32SP_32DP:
2869           r += snprintf (buf + r, size -r, ", FPU_REG:32/32");
2870           break;
2871         }
2872     }
2873
2874   if (config & E_NDS32_HAS_AUDIO_INST)
2875     r += snprintf (buf + r, size -r, ", AUDIO");
2876
2877   if (config & E_NDS32_HAS_STRING_INST)
2878     r += snprintf (buf + r, size -r, ", STR");
2879
2880   if (config & E_NDS32_HAS_REDUCED_REGS)
2881     r += snprintf (buf + r, size -r, ", 16REG");
2882
2883   if (config & E_NDS32_HAS_VIDEO_INST)
2884     {
2885       if (version <= E_NDS32_ELF_VER_1_3)
2886         r += snprintf (buf + r, size -r, ", VIDEO");
2887       else
2888         r += snprintf (buf + r, size -r, ", SATURATION");
2889     }
2890
2891   if (config & E_NDS32_HAS_ENCRIPT_INST)
2892     r += snprintf (buf + r, size -r, ", ENCRP");
2893
2894   if (config & E_NDS32_HAS_L2C_INST)
2895     r += snprintf (buf + r, size -r, ", L2C");
2896 }
2897
2898 static char *
2899 get_machine_flags (unsigned e_flags, unsigned e_machine)
2900 {
2901   static char buf[1024];
2902
2903   buf[0] = '\0';
2904
2905   if (e_flags)
2906     {
2907       switch (e_machine)
2908         {
2909         default:
2910           break;
2911
2912         case EM_ARC_COMPACT2:
2913         case EM_ARC_COMPACT:
2914           decode_ARC_machine_flags (e_flags, e_machine, buf);
2915           break;
2916
2917         case EM_ARM:
2918           decode_ARM_machine_flags (e_flags, buf);
2919           break;
2920
2921         case EM_AVR:
2922           decode_AVR_machine_flags (e_flags, buf, sizeof buf);
2923           break;
2924
2925         case EM_BLACKFIN:
2926           if (e_flags & EF_BFIN_PIC)
2927             strcat (buf, ", PIC");
2928
2929           if (e_flags & EF_BFIN_FDPIC)
2930             strcat (buf, ", FDPIC");
2931
2932           if (e_flags & EF_BFIN_CODE_IN_L1)
2933             strcat (buf, ", code in L1");
2934
2935           if (e_flags & EF_BFIN_DATA_IN_L1)
2936             strcat (buf, ", data in L1");
2937
2938           break;
2939
2940         case EM_CYGNUS_FRV:
2941           switch (e_flags & EF_FRV_CPU_MASK)
2942             {
2943             case EF_FRV_CPU_GENERIC:
2944               break;
2945
2946             default:
2947               strcat (buf, ", fr???");
2948               break;
2949
2950             case EF_FRV_CPU_FR300:
2951               strcat (buf, ", fr300");
2952               break;
2953
2954             case EF_FRV_CPU_FR400:
2955               strcat (buf, ", fr400");
2956               break;
2957             case EF_FRV_CPU_FR405:
2958               strcat (buf, ", fr405");
2959               break;
2960
2961             case EF_FRV_CPU_FR450:
2962               strcat (buf, ", fr450");
2963               break;
2964
2965             case EF_FRV_CPU_FR500:
2966               strcat (buf, ", fr500");
2967               break;
2968             case EF_FRV_CPU_FR550:
2969               strcat (buf, ", fr550");
2970               break;
2971
2972             case EF_FRV_CPU_SIMPLE:
2973               strcat (buf, ", simple");
2974               break;
2975             case EF_FRV_CPU_TOMCAT:
2976               strcat (buf, ", tomcat");
2977               break;
2978             }
2979           break;
2980
2981         case EM_68K:
2982           if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_M68000)
2983             strcat (buf, ", m68000");
2984           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_CPU32)
2985             strcat (buf, ", cpu32");
2986           else if ((e_flags & EF_M68K_ARCH_MASK) == EF_M68K_FIDO)
2987             strcat (buf, ", fido_a");
2988           else
2989             {
2990               char const * isa = _("unknown");
2991               char const * mac = _("unknown mac");
2992               char const * additional = NULL;
2993
2994               switch (e_flags & EF_M68K_CF_ISA_MASK)
2995                 {
2996                 case EF_M68K_CF_ISA_A_NODIV:
2997                   isa = "A";
2998                   additional = ", nodiv";
2999                   break;
3000                 case EF_M68K_CF_ISA_A:
3001                   isa = "A";
3002                   break;
3003                 case EF_M68K_CF_ISA_A_PLUS:
3004                   isa = "A+";
3005                   break;
3006                 case EF_M68K_CF_ISA_B_NOUSP:
3007                   isa = "B";
3008                   additional = ", nousp";
3009                   break;
3010                 case EF_M68K_CF_ISA_B:
3011                   isa = "B";
3012                   break;
3013                 case EF_M68K_CF_ISA_C:
3014                   isa = "C";
3015                   break;
3016                 case EF_M68K_CF_ISA_C_NODIV:
3017                   isa = "C";
3018                   additional = ", nodiv";
3019                   break;
3020                 }
3021               strcat (buf, ", cf, isa ");
3022               strcat (buf, isa);
3023               if (additional)
3024                 strcat (buf, additional);
3025               if (e_flags & EF_M68K_CF_FLOAT)
3026                 strcat (buf, ", float");
3027               switch (e_flags & EF_M68K_CF_MAC_MASK)
3028                 {
3029                 case 0:
3030                   mac = NULL;
3031                   break;
3032                 case EF_M68K_CF_MAC:
3033                   mac = "mac";
3034                   break;
3035                 case EF_M68K_CF_EMAC:
3036                   mac = "emac";
3037                   break;
3038                 case EF_M68K_CF_EMAC_B:
3039                   mac = "emac_b";
3040                   break;
3041                 }
3042               if (mac)
3043                 {
3044                   strcat (buf, ", ");
3045                   strcat (buf, mac);
3046                 }
3047             }
3048           break;
3049
3050         case EM_CYGNUS_MEP:
3051           switch (e_flags & EF_MEP_CPU_MASK)
3052             {
3053             case EF_MEP_CPU_MEP: strcat (buf, ", generic MeP"); break;
3054             case EF_MEP_CPU_C2: strcat (buf, ", MeP C2"); break;
3055             case EF_MEP_CPU_C3: strcat (buf, ", MeP C3"); break;
3056             case EF_MEP_CPU_C4: strcat (buf, ", MeP C4"); break;
3057             case EF_MEP_CPU_C5: strcat (buf, ", MeP C5"); break;
3058             case EF_MEP_CPU_H1: strcat (buf, ", MeP H1"); break;
3059             default: strcat (buf, _(", <unknown MeP cpu type>")); break;
3060             }
3061
3062           switch (e_flags & EF_MEP_COP_MASK)
3063             {
3064             case EF_MEP_COP_NONE: break;
3065             case EF_MEP_COP_AVC: strcat (buf, ", AVC coprocessor"); break;
3066             case EF_MEP_COP_AVC2: strcat (buf, ", AVC2 coprocessor"); break;
3067             case EF_MEP_COP_FMAX: strcat (buf, ", FMAX coprocessor"); break;
3068             case EF_MEP_COP_IVC2: strcat (buf, ", IVC2 coprocessor"); break;
3069             default: strcat (buf, _("<unknown MeP copro type>")); break;
3070             }
3071
3072           if (e_flags & EF_MEP_LIBRARY)
3073             strcat (buf, ", Built for Library");
3074
3075           if (e_flags & EF_MEP_INDEX_MASK)
3076             sprintf (buf + strlen (buf), ", Configuration Index: %#x",
3077                      e_flags & EF_MEP_INDEX_MASK);
3078
3079           if (e_flags & ~ EF_MEP_ALL_FLAGS)
3080             sprintf (buf + strlen (buf), _(", unknown flags bits: %#x"),
3081                      e_flags & ~ EF_MEP_ALL_FLAGS);
3082           break;
3083
3084         case EM_PPC:
3085           if (e_flags & EF_PPC_EMB)
3086             strcat (buf, ", emb");
3087
3088           if (e_flags & EF_PPC_RELOCATABLE)
3089             strcat (buf, _(", relocatable"));
3090
3091           if (e_flags & EF_PPC_RELOCATABLE_LIB)
3092             strcat (buf, _(", relocatable-lib"));
3093           break;
3094
3095         case EM_PPC64:
3096           if (e_flags & EF_PPC64_ABI)
3097             {
3098               char abi[] = ", abiv0";
3099
3100               abi[6] += e_flags & EF_PPC64_ABI;
3101               strcat (buf, abi);
3102             }
3103           break;
3104
3105         case EM_V800:
3106           if ((e_flags & EF_RH850_ABI) == EF_RH850_ABI)
3107             strcat (buf, ", RH850 ABI");
3108
3109           if (e_flags & EF_V800_850E3)
3110             strcat (buf, ", V3 architecture");
3111
3112           if ((e_flags & (EF_RH850_FPU_DOUBLE | EF_RH850_FPU_SINGLE)) == 0)
3113             strcat (buf, ", FPU not used");
3114
3115           if ((e_flags & (EF_RH850_REGMODE22 | EF_RH850_REGMODE32)) == 0)
3116             strcat (buf, ", regmode: COMMON");
3117
3118           if ((e_flags & (EF_RH850_GP_FIX | EF_RH850_GP_NOFIX)) == 0)
3119             strcat (buf, ", r4 not used");
3120
3121           if ((e_flags & (EF_RH850_EP_FIX | EF_RH850_EP_NOFIX)) == 0)
3122             strcat (buf, ", r30 not used");
3123
3124           if ((e_flags & (EF_RH850_TP_FIX | EF_RH850_TP_NOFIX)) == 0)
3125             strcat (buf, ", r5 not used");
3126
3127           if ((e_flags & (EF_RH850_REG2_RESERVE | EF_RH850_REG2_NORESERVE)) == 0)
3128             strcat (buf, ", r2 not used");
3129
3130           for (e_flags &= 0xFFFF; e_flags; e_flags &= ~ (e_flags & - e_flags))
3131             {
3132               switch (e_flags & - e_flags)
3133                 {
3134                 case EF_RH850_FPU_DOUBLE: strcat (buf, ", double precision FPU"); break;
3135                 case EF_RH850_FPU_SINGLE: strcat (buf, ", single precision FPU"); break;
3136                 case EF_RH850_REGMODE22: strcat (buf, ", regmode:22"); break;
3137                 case EF_RH850_REGMODE32: strcat (buf, ", regmode:23"); break;
3138                 case EF_RH850_GP_FIX: strcat (buf, ", r4 fixed"); break;
3139                 case EF_RH850_GP_NOFIX: strcat (buf, ", r4 free"); break;
3140                 case EF_RH850_EP_FIX: strcat (buf, ", r30 fixed"); break;
3141                 case EF_RH850_EP_NOFIX: strcat (buf, ", r30 free"); break;
3142                 case EF_RH850_TP_FIX: strcat (buf, ", r5 fixed"); break;
3143                 case EF_RH850_TP_NOFIX: strcat (buf, ", r5 free"); break;
3144                 case EF_RH850_REG2_RESERVE: strcat (buf, ", r2 fixed"); break;
3145                 case EF_RH850_REG2_NORESERVE: strcat (buf, ", r2 free"); break;
3146                 default: break;
3147                 }
3148             }
3149           break;
3150
3151         case EM_V850:
3152         case EM_CYGNUS_V850:
3153           switch (e_flags & EF_V850_ARCH)
3154             {
3155             case E_V850E3V5_ARCH:
3156               strcat (buf, ", v850e3v5");
3157               break;
3158             case E_V850E2V3_ARCH:
3159               strcat (buf, ", v850e2v3");
3160               break;
3161             case E_V850E2_ARCH:
3162               strcat (buf, ", v850e2");
3163               break;
3164             case E_V850E1_ARCH:
3165               strcat (buf, ", v850e1");
3166               break;
3167             case E_V850E_ARCH:
3168               strcat (buf, ", v850e");
3169               break;
3170             case E_V850_ARCH:
3171               strcat (buf, ", v850");
3172               break;
3173             default:
3174               strcat (buf, _(", unknown v850 architecture variant"));
3175               break;
3176             }
3177           break;
3178
3179         case EM_M32R:
3180         case EM_CYGNUS_M32R:
3181           if ((e_flags & EF_M32R_ARCH) == E_M32R_ARCH)
3182             strcat (buf, ", m32r");
3183           break;
3184
3185         case EM_MIPS:
3186         case EM_MIPS_RS3_LE:
3187           if (e_flags & EF_MIPS_NOREORDER)
3188             strcat (buf, ", noreorder");
3189
3190           if (e_flags & EF_MIPS_PIC)
3191             strcat (buf, ", pic");
3192
3193           if (e_flags & EF_MIPS_CPIC)
3194             strcat (buf, ", cpic");
3195
3196           if (e_flags & EF_MIPS_UCODE)
3197             strcat (buf, ", ugen_reserved");
3198
3199           if (e_flags & EF_MIPS_ABI2)
3200             strcat (buf, ", abi2");
3201
3202           if (e_flags & EF_MIPS_OPTIONS_FIRST)
3203             strcat (buf, ", odk first");
3204
3205           if (e_flags & EF_MIPS_32BITMODE)
3206             strcat (buf, ", 32bitmode");
3207
3208           if (e_flags & EF_MIPS_NAN2008)
3209             strcat (buf, ", nan2008");
3210
3211           if (e_flags & EF_MIPS_FP64)
3212             strcat (buf, ", fp64");
3213
3214           switch ((e_flags & EF_MIPS_MACH))
3215             {
3216             case E_MIPS_MACH_3900: strcat (buf, ", 3900"); break;
3217             case E_MIPS_MACH_4010: strcat (buf, ", 4010"); break;
3218             case E_MIPS_MACH_4100: strcat (buf, ", 4100"); break;
3219             case E_MIPS_MACH_4111: strcat (buf, ", 4111"); break;
3220             case E_MIPS_MACH_4120: strcat (buf, ", 4120"); break;
3221             case E_MIPS_MACH_4650: strcat (buf, ", 4650"); break;
3222             case E_MIPS_MACH_5400: strcat (buf, ", 5400"); break;
3223             case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break;
3224             case E_MIPS_MACH_SB1:  strcat (buf, ", sb1");  break;
3225             case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break;
3226             case E_MIPS_MACH_LS2E: strcat (buf, ", loongson-2e"); break;
3227             case E_MIPS_MACH_LS2F: strcat (buf, ", loongson-2f"); break;
3228             case E_MIPS_MACH_LS3A: strcat (buf, ", loongson-3a"); break;
3229             case E_MIPS_MACH_OCTEON: strcat (buf, ", octeon"); break;
3230             case E_MIPS_MACH_OCTEON2: strcat (buf, ", octeon2"); break;
3231             case E_MIPS_MACH_OCTEON3: strcat (buf, ", octeon3"); break;
3232             case E_MIPS_MACH_XLR:  strcat (buf, ", xlr"); break;
3233             case 0:
3234             /* We simply ignore the field in this case to avoid confusion:
3235                MIPS ELF does not specify EF_MIPS_MACH, it is a GNU
3236                extension.  */
3237               break;
3238             default: strcat (buf, _(", unknown CPU")); break;
3239             }
3240
3241           switch ((e_flags & EF_MIPS_ABI))
3242             {
3243             case E_MIPS_ABI_O32: strcat (buf, ", o32"); break;
3244             case E_MIPS_ABI_O64: strcat (buf, ", o64"); break;
3245             case E_MIPS_ABI_EABI32: strcat (buf, ", eabi32"); break;
3246             case E_MIPS_ABI_EABI64: strcat (buf, ", eabi64"); break;
3247             case 0:
3248             /* We simply ignore the field in this case to avoid confusion:
3249                MIPS ELF does not specify EF_MIPS_ABI, it is a GNU extension.
3250                This means it is likely to be an o32 file, but not for
3251                sure.  */
3252               break;
3253             default: strcat (buf, _(", unknown ABI")); break;
3254             }
3255
3256           if (e_flags & EF_MIPS_ARCH_ASE_MDMX)
3257             strcat (buf, ", mdmx");
3258
3259           if (e_flags & EF_MIPS_ARCH_ASE_M16)
3260             strcat (buf, ", mips16");
3261
3262           if (e_flags & EF_MIPS_ARCH_ASE_MICROMIPS)
3263             strcat (buf, ", micromips");
3264
3265           switch ((e_flags & EF_MIPS_ARCH))
3266             {
3267             case E_MIPS_ARCH_1: strcat (buf, ", mips1"); break;
3268             case E_MIPS_ARCH_2: strcat (buf, ", mips2"); break;
3269             case E_MIPS_ARCH_3: strcat (buf, ", mips3"); break;
3270             case E_MIPS_ARCH_4: strcat (buf, ", mips4"); break;
3271             case E_MIPS_ARCH_5: strcat (buf, ", mips5"); break;
3272             case E_MIPS_ARCH_32: strcat (buf, ", mips32"); break;
3273             case E_MIPS_ARCH_32R2: strcat (buf, ", mips32r2"); break;
3274             case E_MIPS_ARCH_32R6: strcat (buf, ", mips32r6"); break;
3275             case E_MIPS_ARCH_64: strcat (buf, ", mips64"); break;
3276             case E_MIPS_ARCH_64R2: strcat (buf, ", mips64r2"); break;
3277             case E_MIPS_ARCH_64R6: strcat (buf, ", mips64r6"); break;
3278             default: strcat (buf, _(", unknown ISA")); break;
3279             }
3280           break;
3281
3282         case EM_NDS32:
3283           decode_NDS32_machine_flags (e_flags, buf, sizeof buf);
3284           break;
3285
3286         case EM_SH:
3287           switch ((e_flags & EF_SH_MACH_MASK))
3288             {
3289             case EF_SH1: strcat (buf, ", sh1"); break;
3290             case EF_SH2: strcat (buf, ", sh2"); break;
3291             case EF_SH3: strcat (buf, ", sh3"); break;
3292             case EF_SH_DSP: strcat (buf, ", sh-dsp"); break;
3293             case EF_SH3_DSP: strcat (buf, ", sh3-dsp"); break;
3294             case EF_SH4AL_DSP: strcat (buf, ", sh4al-dsp"); break;
3295             case EF_SH3E: strcat (buf, ", sh3e"); break;
3296             case EF_SH4: strcat (buf, ", sh4"); break;
3297             case EF_SH5: strcat (buf, ", sh5"); break;
3298             case EF_SH2E: strcat (buf, ", sh2e"); break;
3299             case EF_SH4A: strcat (buf, ", sh4a"); break;
3300             case EF_SH2A: strcat (buf, ", sh2a"); break;
3301             case EF_SH4_NOFPU: strcat (buf, ", sh4-nofpu"); break;
3302             case EF_SH4A_NOFPU: strcat (buf, ", sh4a-nofpu"); break;
3303             case EF_SH2A_NOFPU: strcat (buf, ", sh2a-nofpu"); break;
3304             case EF_SH3_NOMMU: strcat (buf, ", sh3-nommu"); break;
3305             case EF_SH4_NOMMU_NOFPU: strcat (buf, ", sh4-nommu-nofpu"); break;
3306             case EF_SH2A_SH4_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh4-nommu-nofpu"); break;
3307             case EF_SH2A_SH3_NOFPU: strcat (buf, ", sh2a-nofpu-or-sh3-nommu"); break;
3308             case EF_SH2A_SH4: strcat (buf, ", sh2a-or-sh4"); break;
3309             case EF_SH2A_SH3E: strcat (buf, ", sh2a-or-sh3e"); break;
3310             default: strcat (buf, _(", unknown ISA")); break;
3311             }
3312
3313           if (e_flags & EF_SH_PIC)
3314             strcat (buf, ", pic");
3315
3316           if (e_flags & EF_SH_FDPIC)
3317             strcat (buf, ", fdpic");
3318           break;
3319
3320         case EM_OR1K:
3321           if (e_flags & EF_OR1K_NODELAY)
3322             strcat (buf, ", no delay");
3323           break;
3324
3325         case EM_SPARCV9:
3326           if (e_flags & EF_SPARC_32PLUS)
3327             strcat (buf, ", v8+");
3328
3329           if (e_flags & EF_SPARC_SUN_US1)
3330             strcat (buf, ", ultrasparcI");
3331
3332           if (e_flags & EF_SPARC_SUN_US3)
3333             strcat (buf, ", ultrasparcIII");
3334
3335           if (e_flags & EF_SPARC_HAL_R1)
3336             strcat (buf, ", halr1");
3337
3338           if (e_flags & EF_SPARC_LEDATA)
3339             strcat (buf, ", ledata");
3340
3341           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_TSO)
3342             strcat (buf, ", tso");
3343
3344           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_PSO)
3345             strcat (buf, ", pso");
3346
3347           if ((e_flags & EF_SPARCV9_MM) == EF_SPARCV9_RMO)
3348             strcat (buf, ", rmo");
3349           break;
3350
3351         case EM_PARISC:
3352           switch (e_flags & EF_PARISC_ARCH)
3353             {
3354             case EFA_PARISC_1_0:
3355               strcpy (buf, ", PA-RISC 1.0");
3356               break;
3357             case EFA_PARISC_1_1:
3358               strcpy (buf, ", PA-RISC 1.1");
3359               break;
3360             case EFA_PARISC_2_0:
3361               strcpy (buf, ", PA-RISC 2.0");
3362               break;
3363             default:
3364               break;
3365             }
3366           if (e_flags & EF_PARISC_TRAPNIL)
3367             strcat (buf, ", trapnil");
3368           if (e_flags & EF_PARISC_EXT)
3369             strcat (buf, ", ext");
3370           if (e_flags & EF_PARISC_LSB)
3371             strcat (buf, ", lsb");
3372           if (e_flags & EF_PARISC_WIDE)
3373             strcat (buf, ", wide");
3374           if (e_flags & EF_PARISC_NO_KABP)
3375             strcat (buf, ", no kabp");
3376           if (e_flags & EF_PARISC_LAZYSWAP)
3377             strcat (buf, ", lazyswap");
3378           break;
3379
3380         case EM_PJ:
3381         case EM_PJ_OLD:
3382           if ((e_flags & EF_PICOJAVA_NEWCALLS) == EF_PICOJAVA_NEWCALLS)
3383             strcat (buf, ", new calling convention");
3384
3385           if ((e_flags & EF_PICOJAVA_GNUCALLS) == EF_PICOJAVA_GNUCALLS)
3386             strcat (buf, ", gnu calling convention");
3387           break;
3388
3389         case EM_IA_64:
3390           if ((e_flags & EF_IA_64_ABI64))
3391             strcat (buf, ", 64-bit");
3392           else
3393             strcat (buf, ", 32-bit");
3394           if ((e_flags & EF_IA_64_REDUCEDFP))
3395             strcat (buf, ", reduced fp model");
3396           if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
3397             strcat (buf, ", no function descriptors, constant gp");
3398           else if ((e_flags & EF_IA_64_CONS_GP))
3399             strcat (buf, ", constant gp");
3400           if ((e_flags & EF_IA_64_ABSOLUTE))
3401             strcat (buf, ", absolute");
3402           if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
3403             {
3404               if ((e_flags & EF_IA_64_VMS_LINKAGES))
3405                 strcat (buf, ", vms_linkages");
3406               switch ((e_flags & EF_IA_64_VMS_COMCOD))
3407                 {
3408                 case EF_IA_64_VMS_COMCOD_SUCCESS:
3409                   break;
3410                 case EF_IA_64_VMS_COMCOD_WARNING:
3411                   strcat (buf, ", warning");
3412                   break;
3413                 case EF_IA_64_VMS_COMCOD_ERROR:
3414                   strcat (buf, ", error");
3415                   break;
3416                 case EF_IA_64_VMS_COMCOD_ABORT:
3417                   strcat (buf, ", abort");
3418                   break;
3419                 default:
3420                   warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
3421                         e_flags & EF_IA_64_VMS_COMCOD);
3422                   strcat (buf, ", <unknown>");
3423                 }
3424             }
3425           break;
3426
3427         case EM_VAX:
3428           if ((e_flags & EF_VAX_NONPIC))
3429             strcat (buf, ", non-PIC");
3430           if ((e_flags & EF_VAX_DFLOAT))
3431             strcat (buf, ", D-Float");
3432           if ((e_flags & EF_VAX_GFLOAT))
3433             strcat (buf, ", G-Float");
3434           break;
3435
3436         case EM_VISIUM:
3437           if (e_flags & EF_VISIUM_ARCH_MCM)
3438             strcat (buf, ", mcm");
3439           else if (e_flags & EF_VISIUM_ARCH_MCM24)
3440             strcat (buf, ", mcm24");
3441           if (e_flags & EF_VISIUM_ARCH_GR6)
3442             strcat (buf, ", gr6");
3443           break;
3444
3445         case EM_RL78:
3446           switch (e_flags & E_FLAG_RL78_CPU_MASK)
3447             {
3448             case E_FLAG_RL78_ANY_CPU: break;
3449             case E_FLAG_RL78_G10: strcat (buf, ", G10"); break;
3450             case E_FLAG_RL78_G13: strcat (buf, ", G13"); break;
3451             case E_FLAG_RL78_G14: strcat (buf, ", G14"); break;
3452             }
3453           if (e_flags & E_FLAG_RL78_64BIT_DOUBLES)
3454             strcat (buf, ", 64-bit doubles");
3455           break;
3456
3457         case EM_RX:
3458           if (e_flags & E_FLAG_RX_64BIT_DOUBLES)
3459             strcat (buf, ", 64-bit doubles");
3460           if (e_flags & E_FLAG_RX_DSP)
3461             strcat (buf, ", dsp");
3462           if (e_flags & E_FLAG_RX_PID)
3463             strcat (buf, ", pid");
3464           if (e_flags & E_FLAG_RX_ABI)
3465             strcat (buf, ", RX ABI");
3466           if (e_flags & E_FLAG_RX_SINSNS_SET)
3467             strcat (buf, e_flags & E_FLAG_RX_SINSNS_YES
3468                     ? ", uses String instructions" : ", bans String instructions");
3469           if (e_flags & E_FLAG_RX_V2)
3470             strcat (buf, ", V2");
3471           break;
3472
3473         case EM_S390:
3474           if (e_flags & EF_S390_HIGH_GPRS)
3475             strcat (buf, ", highgprs");
3476           break;
3477
3478         case EM_TI_C6000:
3479           if ((e_flags & EF_C6000_REL))
3480             strcat (buf, ", relocatable module");
3481           break;
3482
3483         case EM_MSP430:
3484           strcat (buf, _(": architecture variant: "));
3485           switch (e_flags & EF_MSP430_MACH)
3486             {
3487             case E_MSP430_MACH_MSP430x11: strcat (buf, "MSP430x11"); break;
3488             case E_MSP430_MACH_MSP430x11x1 : strcat (buf, "MSP430x11x1 "); break;
3489             case E_MSP430_MACH_MSP430x12: strcat (buf, "MSP430x12"); break;
3490             case E_MSP430_MACH_MSP430x13: strcat (buf, "MSP430x13"); break;
3491             case E_MSP430_MACH_MSP430x14: strcat (buf, "MSP430x14"); break;
3492             case E_MSP430_MACH_MSP430x15: strcat (buf, "MSP430x15"); break;
3493             case E_MSP430_MACH_MSP430x16: strcat (buf, "MSP430x16"); break;
3494             case E_MSP430_MACH_MSP430x31: strcat (buf, "MSP430x31"); break;
3495             case E_MSP430_MACH_MSP430x32: strcat (buf, "MSP430x32"); break;
3496             case E_MSP430_MACH_MSP430x33: strcat (buf, "MSP430x33"); break;
3497             case E_MSP430_MACH_MSP430x41: strcat (buf, "MSP430x41"); break;
3498             case E_MSP430_MACH_MSP430x42: strcat (buf, "MSP430x42"); break;
3499             case E_MSP430_MACH_MSP430x43: strcat (buf, "MSP430x43"); break;
3500             case E_MSP430_MACH_MSP430x44: strcat (buf, "MSP430x44"); break;
3501             case E_MSP430_MACH_MSP430X  : strcat (buf, "MSP430X"); break;
3502             default:
3503               strcat (buf, _(": unknown")); break;
3504             }
3505
3506           if (e_flags & ~ EF_MSP430_MACH)
3507             strcat (buf, _(": unknown extra flag bits also present"));
3508         }
3509     }
3510
3511   return buf;
3512 }
3513
3514 static const char *
3515 get_osabi_name (unsigned int osabi)
3516 {
3517   static char buff[32];
3518
3519   switch (osabi)
3520     {
3521     case ELFOSABI_NONE:         return "UNIX - System V";
3522     case ELFOSABI_HPUX:         return "UNIX - HP-UX";
3523     case ELFOSABI_NETBSD:       return "UNIX - NetBSD";
3524     case ELFOSABI_GNU:          return "UNIX - GNU";
3525     case ELFOSABI_SOLARIS:      return "UNIX - Solaris";
3526     case ELFOSABI_AIX:          return "UNIX - AIX";
3527     case ELFOSABI_IRIX:         return "UNIX - IRIX";
3528     case ELFOSABI_FREEBSD:      return "UNIX - FreeBSD";
3529     case ELFOSABI_TRU64:        return "UNIX - TRU64";
3530     case ELFOSABI_MODESTO:      return "Novell - Modesto";
3531     case ELFOSABI_OPENBSD:      return "UNIX - OpenBSD";
3532     case ELFOSABI_OPENVMS:      return "VMS - OpenVMS";
3533     case ELFOSABI_NSK:          return "HP - Non-Stop Kernel";
3534     case ELFOSABI_AROS:         return "AROS";
3535     case ELFOSABI_FENIXOS:      return "FenixOS";
3536     default:
3537       if (osabi >= 64)
3538         switch (elf_header.e_machine)
3539           {
3540           case EM_ARM:
3541             switch (osabi)
3542               {
3543               case ELFOSABI_ARM:        return "ARM";
3544               default:
3545                 break;
3546               }
3547             break;
3548
3549           case EM_MSP430:
3550           case EM_MSP430_OLD:
3551           case EM_VISIUM:
3552             switch (osabi)
3553               {
3554               case ELFOSABI_STANDALONE: return _("Standalone App");
3555               default:
3556                 break;
3557               }
3558             break;
3559
3560           case EM_TI_C6000:
3561             switch (osabi)
3562               {
3563               case ELFOSABI_C6000_ELFABI:       return _("Bare-metal C6000");
3564               case ELFOSABI_C6000_LINUX:        return "Linux C6000";
3565               default:
3566                 break;
3567               }
3568             break;
3569
3570           default:
3571             break;
3572           }
3573       snprintf (buff, sizeof (buff), _("<unknown: %x>"), osabi);
3574       return buff;
3575     }
3576 }
3577
3578 static const char *
3579 get_aarch64_segment_type (unsigned long type)
3580 {
3581   switch (type)
3582     {
3583     case PT_AARCH64_ARCHEXT:
3584       return "AARCH64_ARCHEXT";
3585     default:
3586       break;
3587     }
3588
3589   return NULL;
3590 }
3591
3592 static const char *
3593 get_arm_segment_type (unsigned long type)
3594 {
3595   switch (type)
3596     {
3597     case PT_ARM_EXIDX:
3598       return "EXIDX";
3599     default:
3600       break;
3601     }
3602
3603   return NULL;
3604 }
3605
3606 static const char *
3607 get_mips_segment_type (unsigned long type)
3608 {
3609   switch (type)
3610     {
3611     case PT_MIPS_REGINFO:
3612       return "REGINFO";
3613     case PT_MIPS_RTPROC:
3614       return "RTPROC";
3615     case PT_MIPS_OPTIONS:
3616       return "OPTIONS";
3617     case PT_MIPS_ABIFLAGS:
3618       return "ABIFLAGS";
3619     default:
3620       break;
3621     }
3622
3623   return NULL;
3624 }
3625
3626 static const char *
3627 get_parisc_segment_type (unsigned long type)
3628 {
3629   switch (type)
3630     {
3631     case PT_HP_TLS:             return "HP_TLS";
3632     case PT_HP_CORE_NONE:       return "HP_CORE_NONE";
3633     case PT_HP_CORE_VERSION:    return "HP_CORE_VERSION";
3634     case PT_HP_CORE_KERNEL:     return "HP_CORE_KERNEL";
3635     case PT_HP_CORE_COMM:       return "HP_CORE_COMM";
3636     case PT_HP_CORE_PROC:       return "HP_CORE_PROC";
3637     case PT_HP_CORE_LOADABLE:   return "HP_CORE_LOADABLE";
3638     case PT_HP_CORE_STACK:      return "HP_CORE_STACK";
3639     case PT_HP_CORE_SHM:        return "HP_CORE_SHM";
3640     case PT_HP_CORE_MMF:        return "HP_CORE_MMF";
3641     case PT_HP_PARALLEL:        return "HP_PARALLEL";
3642     case PT_HP_FASTBIND:        return "HP_FASTBIND";
3643     case PT_HP_OPT_ANNOT:       return "HP_OPT_ANNOT";
3644     case PT_HP_HSL_ANNOT:       return "HP_HSL_ANNOT";
3645     case PT_HP_STACK:           return "HP_STACK";
3646     case PT_HP_CORE_UTSNAME:    return "HP_CORE_UTSNAME";
3647     case PT_PARISC_ARCHEXT:     return "PARISC_ARCHEXT";
3648     case PT_PARISC_UNWIND:      return "PARISC_UNWIND";
3649     case PT_PARISC_WEAKORDER:   return "PARISC_WEAKORDER";
3650     default:
3651       break;
3652     }
3653
3654   return NULL;
3655 }
3656
3657 static const char *
3658 get_ia64_segment_type (unsigned long type)
3659 {
3660   switch (type)
3661     {
3662     case PT_IA_64_ARCHEXT:      return "IA_64_ARCHEXT";
3663     case PT_IA_64_UNWIND:       return "IA_64_UNWIND";
3664     case PT_HP_TLS:             return "HP_TLS";
3665     case PT_IA_64_HP_OPT_ANOT:  return "HP_OPT_ANNOT";
3666     case PT_IA_64_HP_HSL_ANOT:  return "HP_HSL_ANNOT";
3667     case PT_IA_64_HP_STACK:     return "HP_STACK";
3668     default:
3669       break;
3670     }
3671
3672   return NULL;
3673 }
3674
3675 static const char *
3676 get_tic6x_segment_type (unsigned long type)
3677 {
3678   switch (type)
3679     {
3680     case PT_C6000_PHATTR:       return "C6000_PHATTR";
3681     default:
3682       break;
3683     }
3684
3685   return NULL;
3686 }
3687
3688 static const char *
3689 get_solaris_segment_type (unsigned long type)
3690 {
3691   switch (type)
3692     {
3693     case 0x6464e550: return "PT_SUNW_UNWIND";
3694     case 0x6474e550: return "PT_SUNW_EH_FRAME";
3695     case 0x6ffffff7: return "PT_LOSUNW";
3696     case 0x6ffffffa: return "PT_SUNWBSS";
3697     case 0x6ffffffb: return "PT_SUNWSTACK";
3698     case 0x6ffffffc: return "PT_SUNWDTRACE";
3699     case 0x6ffffffd: return "PT_SUNWCAP";
3700     case 0x6fffffff: return "PT_HISUNW";
3701     default: return NULL;
3702     }
3703 }
3704
3705 static const char *
3706 get_segment_type (unsigned long p_type)
3707 {
3708   static char buff[32];
3709
3710   switch (p_type)
3711     {
3712     case PT_NULL:       return "NULL";
3713     case PT_LOAD:       return "LOAD";
3714     case PT_DYNAMIC:    return "DYNAMIC";
3715     case PT_INTERP:     return "INTERP";
3716     case PT_NOTE:       return "NOTE";
3717     case PT_SHLIB:      return "SHLIB";
3718     case PT_PHDR:       return "PHDR";
3719     case PT_TLS:        return "TLS";
3720
3721     case PT_GNU_EH_FRAME:
3722                         return "GNU_EH_FRAME";
3723     case PT_GNU_STACK:  return "GNU_STACK";
3724     case PT_GNU_RELRO:  return "GNU_RELRO";
3725
3726     default:
3727       if ((p_type >= PT_LOPROC) && (p_type <= PT_HIPROC))
3728         {
3729           const char * result;
3730
3731           switch (elf_header.e_machine)
3732             {
3733             case EM_AARCH64:
3734               result = get_aarch64_segment_type (p_type);
3735               break;
3736             case EM_ARM:
3737               result = get_arm_segment_type (p_type);
3738               break;
3739             case EM_MIPS:
3740             case EM_MIPS_RS3_LE:
3741               result = get_mips_segment_type (p_type);
3742               break;
3743             case EM_PARISC:
3744               result = get_parisc_segment_type (p_type);
3745               break;
3746             case EM_IA_64:
3747               result = get_ia64_segment_type (p_type);
3748               break;
3749             case EM_TI_C6000:
3750               result = get_tic6x_segment_type (p_type);
3751               break;
3752             default:
3753               result = NULL;
3754               break;
3755             }
3756
3757           if (result != NULL)
3758             return result;
3759
3760           sprintf (buff, "LOPROC+%lx", p_type - PT_LOPROC);
3761         }
3762       else if ((p_type >= PT_LOOS) && (p_type <= PT_HIOS))
3763         {
3764           const char * result;
3765
3766           switch (elf_header.e_machine)
3767             {
3768             case EM_PARISC:
3769               result = get_parisc_segment_type (p_type);
3770               break;
3771             case EM_IA_64:
3772               result = get_ia64_segment_type (p_type);
3773               break;
3774             default:
3775               if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
3776                 result = get_solaris_segment_type (p_type);
3777               else
3778                 result = NULL;
3779               break;
3780             }
3781
3782           if (result != NULL)
3783             return result;
3784
3785           sprintf (buff, "LOOS+%lx", p_type - PT_LOOS);
3786         }
3787       else
3788         snprintf (buff, sizeof (buff), _("<unknown>: %lx"), p_type);
3789
3790       return buff;
3791     }
3792 }
3793
3794 static const char *
3795 get_mips_section_type_name (unsigned int sh_type)
3796 {
3797   switch (sh_type)
3798     {
3799     case SHT_MIPS_LIBLIST:       return "MIPS_LIBLIST";
3800     case SHT_MIPS_MSYM:          return "MIPS_MSYM";
3801     case SHT_MIPS_CONFLICT:      return "MIPS_CONFLICT";
3802     case SHT_MIPS_GPTAB:         return "MIPS_GPTAB";
3803     case SHT_MIPS_UCODE:         return "MIPS_UCODE";
3804     case SHT_MIPS_DEBUG:         return "MIPS_DEBUG";
3805     case SHT_MIPS_REGINFO:       return "MIPS_REGINFO";
3806     case SHT_MIPS_PACKAGE:       return "MIPS_PACKAGE";
3807     case SHT_MIPS_PACKSYM:       return "MIPS_PACKSYM";
3808     case SHT_MIPS_RELD:          return "MIPS_RELD";
3809     case SHT_MIPS_IFACE:         return "MIPS_IFACE";
3810     case SHT_MIPS_CONTENT:       return "MIPS_CONTENT";
3811     case SHT_MIPS_OPTIONS:       return "MIPS_OPTIONS";
3812     case SHT_MIPS_SHDR:          return "MIPS_SHDR";
3813     case SHT_MIPS_FDESC:         return "MIPS_FDESC";
3814     case SHT_MIPS_EXTSYM:        return "MIPS_EXTSYM";
3815     case SHT_MIPS_DENSE:         return "MIPS_DENSE";
3816     case SHT_MIPS_PDESC:         return "MIPS_PDESC";
3817     case SHT_MIPS_LOCSYM:        return "MIPS_LOCSYM";
3818     case SHT_MIPS_AUXSYM:        return "MIPS_AUXSYM";
3819     case SHT_MIPS_OPTSYM:        return "MIPS_OPTSYM";
3820     case SHT_MIPS_LOCSTR:        return "MIPS_LOCSTR";
3821     case SHT_MIPS_LINE:          return "MIPS_LINE";
3822     case SHT_MIPS_RFDESC:        return "MIPS_RFDESC";
3823     case SHT_MIPS_DELTASYM:      return "MIPS_DELTASYM";
3824     case SHT_MIPS_DELTAINST:     return "MIPS_DELTAINST";
3825     case SHT_MIPS_DELTACLASS:    return "MIPS_DELTACLASS";
3826     case SHT_MIPS_DWARF:         return "MIPS_DWARF";
3827     case SHT_MIPS_DELTADECL:     return "MIPS_DELTADECL";
3828     case SHT_MIPS_SYMBOL_LIB:    return "MIPS_SYMBOL_LIB";
3829     case SHT_MIPS_EVENTS:        return "MIPS_EVENTS";
3830     case SHT_MIPS_TRANSLATE:     return "MIPS_TRANSLATE";
3831     case SHT_MIPS_PIXIE:         return "MIPS_PIXIE";
3832     case SHT_MIPS_XLATE:         return "MIPS_XLATE";
3833     case SHT_MIPS_XLATE_DEBUG:   return "MIPS_XLATE_DEBUG";
3834     case SHT_MIPS_WHIRL:         return "MIPS_WHIRL";
3835     case SHT_MIPS_EH_REGION:     return "MIPS_EH_REGION";
3836     case SHT_MIPS_XLATE_OLD:     return "MIPS_XLATE_OLD";
3837     case SHT_MIPS_PDR_EXCEPTION: return "MIPS_PDR_EXCEPTION";
3838     case SHT_MIPS_ABIFLAGS:      return "MIPS_ABIFLAGS";
3839     default:
3840       break;
3841     }
3842   return NULL;
3843 }
3844
3845 static const char *
3846 get_parisc_section_type_name (unsigned int sh_type)
3847 {
3848   switch (sh_type)
3849     {
3850     case SHT_PARISC_EXT:        return "PARISC_EXT";
3851     case SHT_PARISC_UNWIND:     return "PARISC_UNWIND";
3852     case SHT_PARISC_DOC:        return "PARISC_DOC";
3853     case SHT_PARISC_ANNOT:      return "PARISC_ANNOT";
3854     case SHT_PARISC_SYMEXTN:    return "PARISC_SYMEXTN";
3855     case SHT_PARISC_STUBS:      return "PARISC_STUBS";
3856     case SHT_PARISC_DLKM:       return "PARISC_DLKM";
3857     default:
3858       break;
3859     }
3860   return NULL;
3861 }
3862
3863 static const char *
3864 get_ia64_section_type_name (unsigned int sh_type)
3865 {
3866   /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
3867   if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
3868     return get_osabi_name ((sh_type & 0x00FF0000) >> 16);
3869
3870   switch (sh_type)
3871     {
3872     case SHT_IA_64_EXT:                return "IA_64_EXT";
3873     case SHT_IA_64_UNWIND:             return "IA_64_UNWIND";
3874     case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
3875     case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
3876     case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
3877     case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
3878     case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
3879     case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
3880     case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
3881     case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
3882     default:
3883       break;
3884     }
3885   return NULL;
3886 }
3887
3888 static const char *
3889 get_x86_64_section_type_name (unsigned int sh_type)
3890 {
3891   switch (sh_type)
3892     {
3893     case SHT_X86_64_UNWIND:     return "X86_64_UNWIND";
3894     default:
3895       break;
3896     }
3897   return NULL;
3898 }
3899
3900 static const char *
3901 get_aarch64_section_type_name (unsigned int sh_type)
3902 {
3903   switch (sh_type)
3904     {
3905     case SHT_AARCH64_ATTRIBUTES:
3906       return "AARCH64_ATTRIBUTES";
3907     default:
3908       break;
3909     }
3910   return NULL;
3911 }
3912
3913 static const char *
3914 get_arm_section_type_name (unsigned int sh_type)
3915 {
3916   switch (sh_type)
3917     {
3918     case SHT_ARM_EXIDX:           return "ARM_EXIDX";
3919     case SHT_ARM_PREEMPTMAP:      return "ARM_PREEMPTMAP";
3920     case SHT_ARM_ATTRIBUTES:      return "ARM_ATTRIBUTES";
3921     case SHT_ARM_DEBUGOVERLAY:    return "ARM_DEBUGOVERLAY";
3922     case SHT_ARM_OVERLAYSECTION:  return "ARM_OVERLAYSECTION";
3923     default:
3924       break;
3925     }
3926   return NULL;
3927 }
3928
3929 static const char *
3930 get_tic6x_section_type_name (unsigned int sh_type)
3931 {
3932   switch (sh_type)
3933     {
3934     case SHT_C6000_UNWIND:
3935       return "C6000_UNWIND";
3936     case SHT_C6000_PREEMPTMAP:
3937       return "C6000_PREEMPTMAP";
3938     case SHT_C6000_ATTRIBUTES:
3939       return "C6000_ATTRIBUTES";
3940     case SHT_TI_ICODE:
3941       return "TI_ICODE";
3942     case SHT_TI_XREF:
3943       return "TI_XREF";
3944     case SHT_TI_HANDLER:
3945       return "TI_HANDLER";
3946     case SHT_TI_INITINFO:
3947       return "TI_INITINFO";
3948     case SHT_TI_PHATTRS:
3949       return "TI_PHATTRS";
3950     default:
3951       break;
3952     }
3953   return NULL;
3954 }
3955
3956 static const char *
3957 get_msp430x_section_type_name (unsigned int sh_type)
3958 {
3959   switch (sh_type)
3960     {
3961     case SHT_MSP430_SEC_FLAGS:   return "MSP430_SEC_FLAGS";
3962     case SHT_MSP430_SYM_ALIASES: return "MSP430_SYM_ALIASES";
3963     case SHT_MSP430_ATTRIBUTES:  return "MSP430_ATTRIBUTES";
3964     default: return NULL;
3965     }
3966 }
3967
3968 static const char *
3969 get_v850_section_type_name (unsigned int sh_type)
3970 {
3971   switch (sh_type)
3972     {
3973     case SHT_V850_SCOMMON: return "V850 Small Common";
3974     case SHT_V850_TCOMMON: return "V850 Tiny Common";
3975     case SHT_V850_ZCOMMON: return "V850 Zero Common";
3976     case SHT_RENESAS_IOP:  return "RENESAS IOP";
3977     case SHT_RENESAS_INFO: return "RENESAS INFO";
3978     default: return NULL;
3979     }
3980 }
3981
3982 static const char *
3983 get_section_type_name (unsigned int sh_type)
3984 {
3985   static char buff[32];
3986   const char * result;
3987
3988   switch (sh_type)
3989     {
3990     case SHT_NULL:              return "NULL";
3991     case SHT_PROGBITS:          return "PROGBITS";
3992     case SHT_SYMTAB:            return "SYMTAB";
3993     case SHT_STRTAB:            return "STRTAB";
3994     case SHT_RELA:              return "RELA";
3995     case SHT_HASH:              return "HASH";
3996     case SHT_DYNAMIC:           return "DYNAMIC";
3997     case SHT_NOTE:              return "NOTE";
3998     case SHT_NOBITS:            return "NOBITS";
3999     case SHT_REL:               return "REL";
4000     case SHT_SHLIB:             return "SHLIB";
4001     case SHT_DYNSYM:            return "DYNSYM";
4002     case SHT_INIT_ARRAY:        return "INIT_ARRAY";
4003     case SHT_FINI_ARRAY:        return "FINI_ARRAY";
4004     case SHT_PREINIT_ARRAY:     return "PREINIT_ARRAY";
4005     case SHT_GNU_HASH:          return "GNU_HASH";
4006     case SHT_GROUP:             return "GROUP";
4007     case SHT_SYMTAB_SHNDX:      return "SYMTAB SECTION INDICIES";
4008     case SHT_GNU_verdef:        return "VERDEF";
4009     case SHT_GNU_verneed:       return "VERNEED";
4010     case SHT_GNU_versym:        return "VERSYM";
4011     case 0x6ffffff0:            return "VERSYM";
4012     case 0x6ffffffc:            return "VERDEF";
4013     case 0x7ffffffd:            return "AUXILIARY";
4014     case 0x7fffffff:            return "FILTER";
4015     case SHT_GNU_LIBLIST:       return "GNU_LIBLIST";
4016
4017     default:
4018       if ((sh_type >= SHT_LOPROC) && (sh_type <= SHT_HIPROC))
4019         {
4020           switch (elf_header.e_machine)
4021             {
4022             case EM_MIPS:
4023             case EM_MIPS_RS3_LE:
4024               result = get_mips_section_type_name (sh_type);
4025               break;
4026             case EM_PARISC:
4027               result = get_parisc_section_type_name (sh_type);
4028               break;
4029             case EM_IA_64:
4030               result = get_ia64_section_type_name (sh_type);
4031               break;
4032             case EM_X86_64:
4033             case EM_L1OM:
4034             case EM_K1OM:
4035               result = get_x86_64_section_type_name (sh_type);
4036               break;
4037             case EM_AARCH64:
4038               result = get_aarch64_section_type_name (sh_type);
4039               break;
4040             case EM_ARM:
4041               result = get_arm_section_type_name (sh_type);
4042               break;
4043             case EM_TI_C6000:
4044               result = get_tic6x_section_type_name (sh_type);
4045               break;
4046             case EM_MSP430:
4047               result = get_msp430x_section_type_name (sh_type);
4048               break;
4049             case EM_V800:
4050             case EM_V850:
4051             case EM_CYGNUS_V850:
4052               result = get_v850_section_type_name (sh_type);
4053               break;
4054             default:
4055               result = NULL;
4056               break;
4057             }
4058
4059           if (result != NULL)
4060             return result;
4061
4062           sprintf (buff, "LOPROC+%#x", sh_type - SHT_LOPROC);
4063         }
4064       else if ((sh_type >= SHT_LOOS) && (sh_type <= SHT_HIOS))
4065         {
4066           switch (elf_header.e_machine)
4067             {
4068             case EM_IA_64:
4069               result = get_ia64_section_type_name (sh_type);
4070               break;
4071             default:
4072               if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
4073                 result = get_solaris_section_type (sh_type);
4074               else
4075                 result = NULL;
4076               break;
4077             }
4078
4079           if (result != NULL)
4080             return result;
4081
4082           sprintf (buff, "LOOS+%#x", sh_type - SHT_LOOS);
4083         }
4084       else if ((sh_type >= SHT_LOUSER) && (sh_type <= SHT_HIUSER))
4085         {
4086           switch (elf_header.e_machine)
4087             {
4088             case EM_V800:
4089             case EM_V850:
4090             case EM_CYGNUS_V850:
4091               result = get_v850_section_type_name (sh_type);
4092               break;
4093             default:
4094               result = NULL;
4095               break;
4096             }
4097
4098           if (result != NULL)
4099             return result;
4100
4101           sprintf (buff, "LOUSER+%#x", sh_type - SHT_LOUSER);
4102         }
4103       else
4104         /* This message is probably going to be displayed in a 15
4105            character wide field, so put the hex value first.  */
4106         snprintf (buff, sizeof (buff), _("%08x: <unknown>"), sh_type);
4107
4108       return buff;
4109     }
4110 }
4111
4112 #define OPTION_DEBUG_DUMP       512
4113 #define OPTION_DYN_SYMS         513
4114 #define OPTION_DWARF_DEPTH      514
4115 #define OPTION_DWARF_START      515
4116 #define OPTION_DWARF_CHECK      516
4117
4118 static struct option options[] =
4119 {
4120   {"all",              no_argument, 0, 'a'},
4121   {"file-header",      no_argument, 0, 'h'},
4122   {"program-headers",  no_argument, 0, 'l'},
4123   {"headers",          no_argument, 0, 'e'},
4124   {"histogram",        no_argument, 0, 'I'},
4125   {"segments",         no_argument, 0, 'l'},
4126   {"sections",         no_argument, 0, 'S'},
4127   {"section-headers",  no_argument, 0, 'S'},
4128   {"section-groups",   no_argument, 0, 'g'},
4129   {"section-details",  no_argument, 0, 't'},
4130   {"full-section-name",no_argument, 0, 'N'},
4131   {"symbols",          no_argument, 0, 's'},
4132   {"syms",             no_argument, 0, 's'},
4133   {"dyn-syms",         no_argument, 0, OPTION_DYN_SYMS},
4134   {"relocs",           no_argument, 0, 'r'},
4135   {"notes",            no_argument, 0, 'n'},
4136   {"dynamic",          no_argument, 0, 'd'},
4137   {"arch-specific",    no_argument, 0, 'A'},
4138   {"version-info",     no_argument, 0, 'V'},
4139   {"use-dynamic",      no_argument, 0, 'D'},
4140   {"unwind",           no_argument, 0, 'u'},
4141   {"archive-index",    no_argument, 0, 'c'},
4142   {"hex-dump",         required_argument, 0, 'x'},
4143   {"relocated-dump",   required_argument, 0, 'R'},
4144   {"string-dump",      required_argument, 0, 'p'},
4145   {"decompress",       no_argument, 0, 'z'},
4146 #ifdef SUPPORT_DISASSEMBLY
4147   {"instruction-dump", required_argument, 0, 'i'},
4148 #endif
4149   {"debug-dump",       optional_argument, 0, OPTION_DEBUG_DUMP},
4150
4151   {"dwarf-depth",      required_argument, 0, OPTION_DWARF_DEPTH},
4152   {"dwarf-start",      required_argument, 0, OPTION_DWARF_START},
4153   {"dwarf-check",      no_argument, 0, OPTION_DWARF_CHECK},
4154
4155   {"version",          no_argument, 0, 'v'},
4156   {"wide",             no_argument, 0, 'W'},
4157   {"help",             no_argument, 0, 'H'},
4158   {0,                  no_argument, 0, 0}
4159 };
4160
4161 static void
4162 usage (FILE * stream)
4163 {
4164   fprintf (stream, _("Usage: readelf <option(s)> elf-file(s)\n"));
4165   fprintf (stream, _(" Display information about the contents of ELF format files\n"));
4166   fprintf (stream, _(" Options are:\n\
4167   -a --all               Equivalent to: -h -l -S -s -r -d -V -A -I\n\
4168   -h --file-header       Display the ELF file header\n\
4169   -l --program-headers   Display the program headers\n\
4170      --segments          An alias for --program-headers\n\
4171   -S --section-headers   Display the sections' header\n\
4172      --sections          An alias for --section-headers\n\
4173   -g --section-groups    Display the section groups\n\
4174   -t --section-details   Display the section details\n\
4175   -e --headers           Equivalent to: -h -l -S\n\
4176   -s --syms              Display the symbol table\n\
4177      --symbols           An alias for --syms\n\
4178   --dyn-syms             Display the dynamic symbol table\n\
4179   -n --notes             Display the core notes (if present)\n\
4180   -r --relocs            Display the relocations (if present)\n\
4181   -u --unwind            Display the unwind info (if present)\n\
4182   -d --dynamic           Display the dynamic section (if present)\n\
4183   -V --version-info      Display the version sections (if present)\n\
4184   -A --arch-specific     Display architecture specific information (if any)\n\
4185   -c --archive-index     Display the symbol/file index in an archive\n\
4186   -D --use-dynamic       Use the dynamic section info when displaying symbols\n\
4187   -x --hex-dump=<number|name>\n\
4188                          Dump the contents of section <number|name> as bytes\n\
4189   -p --string-dump=<number|name>\n\
4190                          Dump the contents of section <number|name> as strings\n\
4191   -R --relocated-dump=<number|name>\n\
4192                          Dump the contents of section <number|name> as relocated bytes\n\
4193   -z --decompress        Decompress section before dumping it\n\
4194   -w[lLiaprmfFsoRt] or\n\
4195   --debug-dump[=rawline,=decodedline,=info,=abbrev,=pubnames,=aranges,=macro,=frames,\n\
4196                =frames-interp,=str,=loc,=Ranges,=pubtypes,\n\
4197                =gdb_index,=trace_info,=trace_abbrev,=trace_aranges,\n\
4198                =addr,=cu_index]\n\
4199                          Display the contents of DWARF2 debug sections\n"));
4200   fprintf (stream, _("\
4201   --dwarf-depth=N        Do not display DIEs at depth N or greater\n\
4202   --dwarf-start=N        Display DIEs starting with N, at the same depth\n\
4203                          or deeper\n"));
4204 #ifdef SUPPORT_DISASSEMBLY
4205   fprintf (stream, _("\
4206   -i --instruction-dump=<number|name>\n\
4207                          Disassemble the contents of section <number|name>\n"));
4208 #endif
4209   fprintf (stream, _("\
4210   -I --histogram         Display histogram of bucket list lengths\n\
4211   -W --wide              Allow output width to exceed 80 characters\n\
4212   @<file>                Read options from <file>\n\
4213   -H --help              Display this information\n\
4214   -v --version           Display the version number of readelf\n"));
4215
4216   if (REPORT_BUGS_TO[0] && stream == stdout)
4217     fprintf (stdout, _("Report bugs to %s\n"), REPORT_BUGS_TO);
4218
4219   exit (stream == stdout ? 0 : 1);
4220 }
4221
4222 /* Record the fact that the user wants the contents of section number
4223    SECTION to be displayed using the method(s) encoded as flags bits
4224    in TYPE.  Note, TYPE can be zero if we are creating the array for
4225    the first time.  */
4226
4227 static void
4228 request_dump_bynumber (unsigned int section, dump_type type)
4229 {
4230   if (section >= num_dump_sects)
4231     {
4232       dump_type * new_dump_sects;
4233
4234       new_dump_sects = (dump_type *) calloc (section + 1,
4235                                              sizeof (* dump_sects));
4236
4237       if (new_dump_sects == NULL)
4238         error (_("Out of memory allocating dump request table.\n"));
4239       else
4240         {
4241           /* Copy current flag settings.  */
4242           memcpy (new_dump_sects, dump_sects, num_dump_sects * sizeof (* dump_sects));
4243
4244           free (dump_sects);
4245
4246           dump_sects = new_dump_sects;
4247           num_dump_sects = section + 1;
4248         }
4249     }
4250
4251   if (dump_sects)
4252     dump_sects[section] |= type;
4253
4254   return;
4255 }
4256
4257 /* Request a dump by section name.  */
4258
4259 static void
4260 request_dump_byname (const char * section, dump_type type)
4261 {
4262   struct dump_list_entry * new_request;
4263
4264   new_request = (struct dump_list_entry *)
4265       malloc (sizeof (struct dump_list_entry));
4266   if (!new_request)
4267     error (_("Out of memory allocating dump request table.\n"));
4268
4269   new_request->name = strdup (section);
4270   if (!new_request->name)
4271     error (_("Out of memory allocating dump request table.\n"));
4272
4273   new_request->type = type;
4274
4275   new_request->next = dump_sects_byname;
4276   dump_sects_byname = new_request;
4277 }
4278
4279 static inline void
4280 request_dump (dump_type type)
4281 {
4282   int section;
4283   char * cp;
4284
4285   do_dump++;
4286   section = strtoul (optarg, & cp, 0);
4287
4288   if (! *cp && section >= 0)
4289     request_dump_bynumber (section, type);
4290   else
4291     request_dump_byname (optarg, type);
4292 }
4293
4294
4295 static void
4296 parse_args (int argc, char ** argv)
4297 {
4298   int c;
4299
4300   if (argc < 2)
4301     usage (stderr);
4302
4303   while ((c = getopt_long
4304           (argc, argv, "ADHINR:SVWacdeghi:lnp:rstuvw::x:z", options, NULL)) != EOF)
4305     {
4306       switch (c)
4307         {
4308         case 0:
4309           /* Long options.  */
4310           break;
4311         case 'H':
4312           usage (stdout);
4313           break;
4314
4315         case 'a':
4316           do_syms++;
4317           do_reloc++;
4318           do_unwind++;
4319           do_dynamic++;
4320           do_header++;
4321           do_sections++;
4322           do_section_groups++;
4323           do_segments++;
4324           do_version++;
4325           do_histogram++;
4326           do_arch++;
4327           do_notes++;
4328           break;
4329         case 'g':
4330           do_section_groups++;
4331           break;
4332         case 't':
4333         case 'N':
4334           do_sections++;
4335           do_section_details++;
4336           break;
4337         case 'e':
4338           do_header++;
4339           do_sections++;
4340           do_segments++;
4341           break;
4342         case 'A':
4343           do_arch++;
4344           break;
4345         case 'D':
4346           do_using_dynamic++;
4347           break;
4348         case 'r':
4349           do_reloc++;
4350           break;
4351         case 'u':
4352           do_unwind++;
4353           break;
4354         case 'h':
4355           do_header++;
4356           break;
4357         case 'l':
4358           do_segments++;
4359           break;
4360         case 's':
4361           do_syms++;
4362           break;
4363         case 'S':
4364           do_sections++;
4365           break;
4366         case 'd':
4367           do_dynamic++;
4368           break;
4369         case 'I':
4370           do_histogram++;
4371           break;
4372         case 'n':
4373           do_notes++;
4374           break;
4375         case 'c':
4376           do_archive_index++;
4377           break;
4378         case 'x':
4379           request_dump (HEX_DUMP);
4380           break;
4381         case 'p':
4382           request_dump (STRING_DUMP);
4383           break;
4384         case 'R':
4385           request_dump (RELOC_DUMP);
4386           break;
4387         case 'z':
4388           decompress_dumps++;
4389           break;
4390         case 'w':
4391           do_dump++;
4392           if (optarg == 0)
4393             {
4394               do_debugging = 1;
4395               dwarf_select_sections_all ();
4396             }
4397           else
4398             {
4399               do_debugging = 0;
4400               dwarf_select_sections_by_letters (optarg);
4401             }
4402           break;
4403         case OPTION_DEBUG_DUMP:
4404           do_dump++;
4405           if (optarg == 0)
4406             do_debugging = 1;
4407           else
4408             {
4409               do_debugging = 0;
4410               dwarf_select_sections_by_names (optarg);
4411             }
4412           break;
4413         case OPTION_DWARF_DEPTH:
4414           {
4415             char *cp;
4416
4417             dwarf_cutoff_level = strtoul (optarg, & cp, 0);
4418           }
4419           break;
4420         case OPTION_DWARF_START:
4421           {
4422             char *cp;
4423
4424             dwarf_start_die = strtoul (optarg, & cp, 0);
4425           }
4426           break;
4427         case OPTION_DWARF_CHECK:
4428           dwarf_check = 1;
4429           break;
4430         case OPTION_DYN_SYMS:
4431           do_dyn_syms++;
4432           break;
4433 #ifdef SUPPORT_DISASSEMBLY
4434         case 'i':
4435           request_dump (DISASS_DUMP);
4436           break;
4437 #endif
4438         case 'v':
4439           print_version (program_name);
4440           break;
4441         case 'V':
4442           do_version++;
4443           break;
4444         case 'W':
4445           do_wide++;
4446           break;
4447         default:
4448           /* xgettext:c-format */
4449           error (_("Invalid option '-%c'\n"), c);
4450           /* Drop through.  */
4451         case '?':
4452           usage (stderr);
4453         }
4454     }
4455
4456   if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
4457       && !do_segments && !do_header && !do_dump && !do_version
4458       && !do_histogram && !do_debugging && !do_arch && !do_notes
4459       && !do_section_groups && !do_archive_index
4460       && !do_dyn_syms)
4461     usage (stderr);
4462 }
4463
4464 static const char *
4465 get_elf_class (unsigned int elf_class)
4466 {
4467   static char buff[32];
4468
4469   switch (elf_class)
4470     {
4471     case ELFCLASSNONE: return _("none");
4472     case ELFCLASS32:   return "ELF32";
4473     case ELFCLASS64:   return "ELF64";
4474     default:
4475       snprintf (buff, sizeof (buff), _("<unknown: %x>"), elf_class);
4476       return buff;
4477     }
4478 }
4479
4480 static const char *
4481 get_data_encoding (unsigned int encoding)
4482 {
4483   static char buff[32];
4484
4485   switch (encoding)
4486     {
4487     case ELFDATANONE: return _("none");
4488     case ELFDATA2LSB: return _("2's complement, little endian");
4489     case ELFDATA2MSB: return _("2's complement, big endian");
4490     default:
4491       snprintf (buff, sizeof (buff), _("<unknown: %x>"), encoding);
4492       return buff;
4493     }
4494 }
4495
4496 /* Decode the data held in 'elf_header'.  */
4497
4498 static int
4499 process_file_header (void)
4500 {
4501   if (   elf_header.e_ident[EI_MAG0] != ELFMAG0
4502       || elf_header.e_ident[EI_MAG1] != ELFMAG1
4503       || elf_header.e_ident[EI_MAG2] != ELFMAG2
4504       || elf_header.e_ident[EI_MAG3] != ELFMAG3)
4505     {
4506       error
4507         (_("Not an ELF file - it has the wrong magic bytes at the start\n"));
4508       return 0;
4509     }
4510
4511   init_dwarf_regnames (elf_header.e_machine);
4512
4513   if (do_header)
4514     {
4515       int i;
4516
4517       printf (_("ELF Header:\n"));
4518       printf (_("  Magic:   "));
4519       for (i = 0; i < EI_NIDENT; i++)
4520         printf ("%2.2x ", elf_header.e_ident[i]);
4521       printf ("\n");
4522       printf (_("  Class:                             %s\n"),
4523               get_elf_class (elf_header.e_ident[EI_CLASS]));
4524       printf (_("  Data:                              %s\n"),
4525               get_data_encoding (elf_header.e_ident[EI_DATA]));
4526       printf (_("  Version:                           %d %s\n"),
4527               elf_header.e_ident[EI_VERSION],
4528               (elf_header.e_ident[EI_VERSION] == EV_CURRENT
4529                ? "(current)"
4530                : (elf_header.e_ident[EI_VERSION] != EV_NONE
4531                   ? _("<unknown: %lx>")
4532                   : "")));
4533       printf (_("  OS/ABI:                            %s\n"),
4534               get_osabi_name (elf_header.e_ident[EI_OSABI]));
4535       printf (_("  ABI Version:                       %d\n"),
4536               elf_header.e_ident[EI_ABIVERSION]);
4537       printf (_("  Type:                              %s\n"),
4538               get_file_type (elf_header.e_type));
4539       printf (_("  Machine:                           %s\n"),
4540               get_machine_name (elf_header.e_machine));
4541       printf (_("  Version:                           0x%lx\n"),
4542               (unsigned long) elf_header.e_version);
4543
4544       printf (_("  Entry point address:               "));
4545       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4546       printf (_("\n  Start of program headers:          "));
4547       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4548       printf (_(" (bytes into file)\n  Start of section headers:          "));
4549       print_vma ((bfd_vma) elf_header.e_shoff, DEC);
4550       printf (_(" (bytes into file)\n"));
4551
4552       printf (_("  Flags:                             0x%lx%s\n"),
4553               (unsigned long) elf_header.e_flags,
4554               get_machine_flags (elf_header.e_flags, elf_header.e_machine));
4555       printf (_("  Size of this header:               %ld (bytes)\n"),
4556               (long) elf_header.e_ehsize);
4557       printf (_("  Size of program headers:           %ld (bytes)\n"),
4558               (long) elf_header.e_phentsize);
4559       printf (_("  Number of program headers:         %ld"),
4560               (long) elf_header.e_phnum);
4561       if (section_headers != NULL
4562           && elf_header.e_phnum == PN_XNUM
4563           && section_headers[0].sh_info != 0)
4564         printf (" (%ld)", (long) section_headers[0].sh_info);
4565       putc ('\n', stdout);
4566       printf (_("  Size of section headers:           %ld (bytes)\n"),
4567               (long) elf_header.e_shentsize);
4568       printf (_("  Number of section headers:         %ld"),
4569               (long) elf_header.e_shnum);
4570       if (section_headers != NULL && elf_header.e_shnum == SHN_UNDEF)
4571         printf (" (%ld)", (long) section_headers[0].sh_size);
4572       putc ('\n', stdout);
4573       printf (_("  Section header string table index: %ld"),
4574               (long) elf_header.e_shstrndx);
4575       if (section_headers != NULL
4576           && elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4577         printf (" (%u)", section_headers[0].sh_link);
4578       else if (elf_header.e_shstrndx != SHN_UNDEF
4579                && elf_header.e_shstrndx >= elf_header.e_shnum)
4580         printf (_(" <corrupt: out of range>"));
4581       putc ('\n', stdout);
4582     }
4583
4584   if (section_headers != NULL)
4585     {
4586       if (elf_header.e_phnum == PN_XNUM
4587           && section_headers[0].sh_info != 0)
4588         elf_header.e_phnum = section_headers[0].sh_info;
4589       if (elf_header.e_shnum == SHN_UNDEF)
4590         elf_header.e_shnum = section_headers[0].sh_size;
4591       if (elf_header.e_shstrndx == (SHN_XINDEX & 0xffff))
4592         elf_header.e_shstrndx = section_headers[0].sh_link;
4593       else if (elf_header.e_shstrndx >= elf_header.e_shnum)
4594         elf_header.e_shstrndx = SHN_UNDEF;
4595       free (section_headers);
4596       section_headers = NULL;
4597     }
4598
4599   return 1;
4600 }
4601
4602 static bfd_boolean
4603 get_32bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4604 {
4605   Elf32_External_Phdr * phdrs;
4606   Elf32_External_Phdr * external;
4607   Elf_Internal_Phdr *   internal;
4608   unsigned int i;
4609   unsigned int size = elf_header.e_phentsize;
4610   unsigned int num  = elf_header.e_phnum;
4611
4612   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4613   if (size == 0 || num == 0)
4614     return FALSE;
4615   if (size < sizeof * phdrs)
4616     {
4617       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4618       return FALSE;
4619     }
4620   if (size > sizeof * phdrs)
4621     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4622
4623   phdrs = (Elf32_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4624                                             size, num, _("program headers"));
4625   if (phdrs == NULL)
4626     return FALSE;
4627
4628   for (i = 0, internal = pheaders, external = phdrs;
4629        i < elf_header.e_phnum;
4630        i++, internal++, external++)
4631     {
4632       internal->p_type   = BYTE_GET (external->p_type);
4633       internal->p_offset = BYTE_GET (external->p_offset);
4634       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4635       internal->p_paddr  = BYTE_GET (external->p_paddr);
4636       internal->p_filesz = BYTE_GET (external->p_filesz);
4637       internal->p_memsz  = BYTE_GET (external->p_memsz);
4638       internal->p_flags  = BYTE_GET (external->p_flags);
4639       internal->p_align  = BYTE_GET (external->p_align);
4640     }
4641
4642   free (phdrs);
4643   return TRUE;
4644 }
4645
4646 static bfd_boolean
4647 get_64bit_program_headers (FILE * file, Elf_Internal_Phdr * pheaders)
4648 {
4649   Elf64_External_Phdr * phdrs;
4650   Elf64_External_Phdr * external;
4651   Elf_Internal_Phdr *   internal;
4652   unsigned int i;
4653   unsigned int size = elf_header.e_phentsize;
4654   unsigned int num  = elf_header.e_phnum;
4655
4656   /* PR binutils/17531: Cope with unexpected section header sizes.  */
4657   if (size == 0 || num == 0)
4658     return FALSE;
4659   if (size < sizeof * phdrs)
4660     {
4661       error (_("The e_phentsize field in the ELF header is less than the size of an ELF program header\n"));
4662       return FALSE;
4663     }
4664   if (size > sizeof * phdrs)
4665     warn (_("The e_phentsize field in the ELF header is larger than the size of an ELF program header\n"));
4666
4667   phdrs = (Elf64_External_Phdr *) get_data (NULL, file, elf_header.e_phoff,
4668                                             size, num, _("program headers"));
4669   if (!phdrs)
4670     return FALSE;
4671
4672   for (i = 0, internal = pheaders, external = phdrs;
4673        i < elf_header.e_phnum;
4674        i++, internal++, external++)
4675     {
4676       internal->p_type   = BYTE_GET (external->p_type);
4677       internal->p_flags  = BYTE_GET (external->p_flags);
4678       internal->p_offset = BYTE_GET (external->p_offset);
4679       internal->p_vaddr  = BYTE_GET (external->p_vaddr);
4680       internal->p_paddr  = BYTE_GET (external->p_paddr);
4681       internal->p_filesz = BYTE_GET (external->p_filesz);
4682       internal->p_memsz  = BYTE_GET (external->p_memsz);
4683       internal->p_align  = BYTE_GET (external->p_align);
4684     }
4685
4686   free (phdrs);
4687   return TRUE;
4688 }
4689
4690 /* Returns 1 if the program headers were read into `program_headers'.  */
4691
4692 static int
4693 get_program_headers (FILE * file)
4694 {
4695   Elf_Internal_Phdr * phdrs;
4696
4697   /* Check cache of prior read.  */
4698   if (program_headers != NULL)
4699     return 1;
4700
4701   phdrs = (Elf_Internal_Phdr *) cmalloc (elf_header.e_phnum,
4702                                          sizeof (Elf_Internal_Phdr));
4703
4704   if (phdrs == NULL)
4705     {
4706       error (_("Out of memory reading %u program headers\n"),
4707              elf_header.e_phnum);
4708       return 0;
4709     }
4710
4711   if (is_32bit_elf
4712       ? get_32bit_program_headers (file, phdrs)
4713       : get_64bit_program_headers (file, phdrs))
4714     {
4715       program_headers = phdrs;
4716       return 1;
4717     }
4718
4719   free (phdrs);
4720   return 0;
4721 }
4722
4723 /* Returns 1 if the program headers were loaded.  */
4724
4725 static int
4726 process_program_headers (FILE * file)
4727 {
4728   Elf_Internal_Phdr * segment;
4729   unsigned int i;
4730
4731   if (elf_header.e_phnum == 0)
4732     {
4733       /* PR binutils/12467.  */
4734       if (elf_header.e_phoff != 0)
4735         warn (_("possibly corrupt ELF header - it has a non-zero program"
4736                 " header offset, but no program headers\n"));
4737       else if (do_segments)
4738         printf (_("\nThere are no program headers in this file.\n"));
4739       return 0;
4740     }
4741
4742   if (do_segments && !do_header)
4743     {
4744       printf (_("\nElf file type is %s\n"), get_file_type (elf_header.e_type));
4745       printf (_("Entry point "));
4746       print_vma ((bfd_vma) elf_header.e_entry, PREFIX_HEX);
4747       printf (_("\nThere are %d program headers, starting at offset "),
4748               elf_header.e_phnum);
4749       print_vma ((bfd_vma) elf_header.e_phoff, DEC);
4750       printf ("\n");
4751     }
4752
4753   if (! get_program_headers (file))
4754       return 0;
4755
4756   if (do_segments)
4757     {
4758       if (elf_header.e_phnum > 1)
4759         printf (_("\nProgram Headers:\n"));
4760       else
4761         printf (_("\nProgram Headers:\n"));
4762
4763       if (is_32bit_elf)
4764         printf
4765           (_("  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align\n"));
4766       else if (do_wide)
4767         printf
4768           (_("  Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align\n"));
4769       else
4770         {
4771           printf
4772             (_("  Type           Offset             VirtAddr           PhysAddr\n"));
4773           printf
4774             (_("                 FileSiz            MemSiz              Flags  Align\n"));
4775         }
4776     }
4777
4778   dynamic_addr = 0;
4779   dynamic_size = 0;
4780
4781   for (i = 0, segment = program_headers;
4782        i < elf_header.e_phnum;
4783        i++, segment++)
4784     {
4785       if (do_segments)
4786         {
4787           printf ("  %-14.14s ", get_segment_type (segment->p_type));
4788
4789           if (is_32bit_elf)
4790             {
4791               printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4792               printf ("0x%8.8lx ", (unsigned long) segment->p_vaddr);
4793               printf ("0x%8.8lx ", (unsigned long) segment->p_paddr);
4794               printf ("0x%5.5lx ", (unsigned long) segment->p_filesz);
4795               printf ("0x%5.5lx ", (unsigned long) segment->p_memsz);
4796               printf ("%c%c%c ",
4797                       (segment->p_flags & PF_R ? 'R' : ' '),
4798                       (segment->p_flags & PF_W ? 'W' : ' '),
4799                       (segment->p_flags & PF_X ? 'E' : ' '));
4800               printf ("%#lx", (unsigned long) segment->p_align);
4801             }
4802           else if (do_wide)
4803             {
4804               if ((unsigned long) segment->p_offset == segment->p_offset)
4805                 printf ("0x%6.6lx ", (unsigned long) segment->p_offset);
4806               else
4807                 {
4808                   print_vma (segment->p_offset, FULL_HEX);
4809                   putchar (' ');
4810                 }
4811
4812               print_vma (segment->p_vaddr, FULL_HEX);
4813               putchar (' ');
4814               print_vma (segment->p_paddr, FULL_HEX);
4815               putchar (' ');
4816
4817               if ((unsigned long) segment->p_filesz == segment->p_filesz)
4818                 printf ("0x%6.6lx ", (unsigned long) segment->p_filesz);
4819               else
4820                 {
4821                   print_vma (segment->p_filesz, FULL_HEX);
4822                   putchar (' ');
4823                 }
4824
4825               if ((unsigned long) segment->p_memsz == segment->p_memsz)
4826                 printf ("0x%6.6lx", (unsigned long) segment->p_memsz);
4827               else
4828                 {
4829                   print_vma (segment->p_memsz, FULL_HEX);
4830                 }
4831
4832               printf (" %c%c%c ",
4833                       (segment->p_flags & PF_R ? 'R' : ' '),
4834                       (segment->p_flags & PF_W ? 'W' : ' '),
4835                       (segment->p_flags & PF_X ? 'E' : ' '));
4836
4837               if ((unsigned long) segment->p_align == segment->p_align)
4838                 printf ("%#lx", (unsigned long) segment->p_align);
4839               else
4840                 {
4841                   print_vma (segment->p_align, PREFIX_HEX);
4842                 }
4843             }
4844           else
4845             {
4846               print_vma (segment->p_offset, FULL_HEX);
4847               putchar (' ');
4848               print_vma (segment->p_vaddr, FULL_HEX);
4849               putchar (' ');
4850               print_vma (segment->p_paddr, FULL_HEX);
4851               printf ("\n                 ");
4852               print_vma (segment->p_filesz, FULL_HEX);
4853               putchar (' ');
4854               print_vma (segment->p_memsz, FULL_HEX);
4855               printf ("  %c%c%c    ",
4856                       (segment->p_flags & PF_R ? 'R' : ' '),
4857                       (segment->p_flags & PF_W ? 'W' : ' '),
4858                       (segment->p_flags & PF_X ? 'E' : ' '));
4859               print_vma (segment->p_align, HEX);
4860             }
4861         }
4862
4863       if (do_segments)
4864         putc ('\n', stdout);
4865
4866       switch (segment->p_type)
4867         {
4868         case PT_DYNAMIC:
4869           if (dynamic_addr)
4870             error (_("more than one dynamic segment\n"));
4871
4872           /* By default, assume that the .dynamic section is the first
4873              section in the DYNAMIC segment.  */
4874           dynamic_addr = segment->p_offset;
4875           dynamic_size = segment->p_filesz;
4876           /* PR binutils/17512: Avoid corrupt dynamic section info in the segment.  */
4877           if (dynamic_addr + dynamic_size >= current_file_size)
4878             {
4879               error (_("the dynamic segment offset + size exceeds the size of the file\n"));
4880               dynamic_addr = dynamic_size = 0;
4881             }
4882
4883           /* Try to locate the .dynamic section. If there is
4884              a section header table, we can easily locate it.  */
4885           if (section_headers != NULL)
4886             {
4887               Elf_Internal_Shdr * sec;
4888
4889               sec = find_section (".dynamic");
4890               if (sec == NULL || sec->sh_size == 0)
4891                 {
4892                   /* A corresponding .dynamic section is expected, but on
4893                      IA-64/OpenVMS it is OK for it to be missing.  */
4894                   if (!is_ia64_vms ())
4895                     error (_("no .dynamic section in the dynamic segment\n"));
4896                   break;
4897                 }
4898
4899               if (sec->sh_type == SHT_NOBITS)
4900                 {
4901                   dynamic_size = 0;
4902                   break;
4903                 }
4904
4905               dynamic_addr = sec->sh_offset;
4906               dynamic_size = sec->sh_size;
4907
4908               if (dynamic_addr < segment->p_offset
4909                   || dynamic_addr > segment->p_offset + segment->p_filesz)
4910                 warn (_("the .dynamic section is not contained"
4911                         " within the dynamic segment\n"));
4912               else if (dynamic_addr > segment->p_offset)
4913                 warn (_("the .dynamic section is not the first section"
4914                         " in the dynamic segment.\n"));
4915             }
4916           break;
4917
4918         case PT_INTERP:
4919           if (fseek (file, archive_file_offset + (long) segment->p_offset,
4920                      SEEK_SET))
4921             error (_("Unable to find program interpreter name\n"));
4922           else
4923             {
4924               char fmt [32];
4925               int ret = snprintf (fmt, sizeof (fmt), "%%%ds", PATH_MAX - 1);
4926
4927               if (ret >= (int) sizeof (fmt) || ret < 0)
4928                 error (_("Internal error: failed to create format string to display program interpreter\n"));
4929
4930               program_interpreter[0] = 0;
4931               if (fscanf (file, fmt, program_interpreter) <= 0)
4932                 error (_("Unable to read program interpreter name\n"));
4933
4934               if (do_segments)
4935                 printf (_("      [Requesting program interpreter: %s]\n"),
4936                     program_interpreter);
4937             }
4938           break;
4939         }
4940     }
4941
4942   if (do_segments && section_headers != NULL && string_table != NULL)
4943     {
4944       printf (_("\n Section to Segment mapping:\n"));
4945       printf (_("  Segment Sections...\n"));
4946
4947       for (i = 0; i < elf_header.e_phnum; i++)
4948         {
4949           unsigned int j;
4950           Elf_Internal_Shdr * section;
4951
4952           segment = program_headers + i;
4953           section = section_headers + 1;
4954
4955           printf ("   %2.2d     ", i);
4956
4957           for (j = 1; j < elf_header.e_shnum; j++, section++)
4958             {
4959               if (!ELF_TBSS_SPECIAL (section, segment)
4960                   && ELF_SECTION_IN_SEGMENT_STRICT (section, segment))
4961                 printf ("%s ", printable_section_name (section));
4962             }
4963
4964           putc ('\n',stdout);
4965         }
4966     }
4967
4968   return 1;
4969 }
4970
4971
4972 /* Find the file offset corresponding to VMA by using the program headers.  */
4973
4974 static long
4975 offset_from_vma (FILE * file, bfd_vma vma, bfd_size_type size)
4976 {
4977   Elf_Internal_Phdr * seg;
4978
4979   if (! get_program_headers (file))
4980     {
4981       warn (_("Cannot interpret virtual addresses without program headers.\n"));
4982       return (long) vma;
4983     }
4984
4985   for (seg = program_headers;
4986        seg < program_headers + elf_header.e_phnum;
4987        ++seg)
4988     {
4989       if (seg->p_type != PT_LOAD)
4990         continue;
4991
4992       if (vma >= (seg->p_vaddr & -seg->p_align)
4993           && vma + size <= seg->p_vaddr + seg->p_filesz)
4994         return vma - seg->p_vaddr + seg->p_offset;
4995     }
4996
4997   warn (_("Virtual address 0x%lx not located in any PT_LOAD segment.\n"),
4998         (unsigned long) vma);
4999   return (long) vma;
5000 }
5001
5002
5003 /* Allocate memory and load the sections headers into the global pointer
5004    SECTION_HEADERS.  If PROBE is true, this is just a probe and we do not
5005    generate any error messages if the load fails.  */
5006
5007 static bfd_boolean
5008 get_32bit_section_headers (FILE * file, bfd_boolean probe)
5009 {
5010   Elf32_External_Shdr * shdrs;
5011   Elf_Internal_Shdr *   internal;
5012   unsigned int i;
5013   unsigned int size = elf_header.e_shentsize;
5014   unsigned int num = probe ? 1 : elf_header.e_shnum;
5015
5016   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5017   if (size == 0 || num == 0)
5018     return FALSE;
5019   if (size < sizeof * shdrs)
5020     {
5021       if (! probe)
5022         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5023       return FALSE;
5024     }
5025   if (!probe && size > sizeof * shdrs)
5026     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5027
5028   shdrs = (Elf32_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
5029                                             size, num,
5030                                             probe ? NULL : _("section headers"));
5031   if (shdrs == NULL)
5032     return FALSE;
5033
5034   if (section_headers != NULL)
5035     free (section_headers);
5036   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5037                                                    sizeof (Elf_Internal_Shdr));
5038   if (section_headers == NULL)
5039     {
5040       if (!probe)
5041         error (_("Out of memory reading %u section headers\n"), num);
5042       return FALSE;
5043     }
5044
5045   for (i = 0, internal = section_headers;
5046        i < num;
5047        i++, internal++)
5048     {
5049       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5050       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5051       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5052       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5053       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5054       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5055       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5056       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5057       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5058       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5059       if (!probe && internal->sh_link > num)
5060         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5061       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5062         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5063     }
5064
5065   free (shdrs);
5066   return TRUE;
5067 }
5068
5069 static bfd_boolean
5070 get_64bit_section_headers (FILE * file, bfd_boolean probe)
5071 {
5072   Elf64_External_Shdr * shdrs;
5073   Elf_Internal_Shdr *   internal;
5074   unsigned int i;
5075   unsigned int size = elf_header.e_shentsize;
5076   unsigned int num = probe ? 1 : elf_header.e_shnum;
5077
5078   /* PR binutils/17531: Cope with unexpected section header sizes.  */
5079   if (size == 0 || num == 0)
5080     return FALSE;
5081   if (size < sizeof * shdrs)
5082     {
5083       if (! probe)
5084         error (_("The e_shentsize field in the ELF header is less than the size of an ELF section header\n"));
5085       return FALSE;
5086     }
5087   if (! probe && size > sizeof * shdrs)
5088     warn (_("The e_shentsize field in the ELF header is larger than the size of an ELF section header\n"));
5089
5090   shdrs = (Elf64_External_Shdr *) get_data (NULL, file, elf_header.e_shoff,
5091                                             size, num,
5092                                             probe ? NULL : _("section headers"));
5093   if (shdrs == NULL)
5094     return FALSE;
5095
5096   if (section_headers != NULL)
5097     free (section_headers);
5098   section_headers = (Elf_Internal_Shdr *) cmalloc (num,
5099                                                    sizeof (Elf_Internal_Shdr));
5100   if (section_headers == NULL)
5101     {
5102       if (! probe)
5103         error (_("Out of memory reading %u section headers\n"), num);
5104       return FALSE;
5105     }
5106
5107   for (i = 0, internal = section_headers;
5108        i < num;
5109        i++, internal++)
5110     {
5111       internal->sh_name      = BYTE_GET (shdrs[i].sh_name);
5112       internal->sh_type      = BYTE_GET (shdrs[i].sh_type);
5113       internal->sh_flags     = BYTE_GET (shdrs[i].sh_flags);
5114       internal->sh_addr      = BYTE_GET (shdrs[i].sh_addr);
5115       internal->sh_size      = BYTE_GET (shdrs[i].sh_size);
5116       internal->sh_entsize   = BYTE_GET (shdrs[i].sh_entsize);
5117       internal->sh_link      = BYTE_GET (shdrs[i].sh_link);
5118       internal->sh_info      = BYTE_GET (shdrs[i].sh_info);
5119       internal->sh_offset    = BYTE_GET (shdrs[i].sh_offset);
5120       internal->sh_addralign = BYTE_GET (shdrs[i].sh_addralign);
5121       if (!probe && internal->sh_link > num)
5122         warn (_("Section %u has an out of range sh_link value of %u\n"), i, internal->sh_link);
5123       if (!probe && internal->sh_flags & SHF_INFO_LINK && internal->sh_info > num)
5124         warn (_("Section %u has an out of range sh_info value of %u\n"), i, internal->sh_info);
5125     }
5126
5127   free (shdrs);
5128   return TRUE;
5129 }
5130
5131 static Elf_Internal_Sym *
5132 get_32bit_elf_symbols (FILE * file,
5133                        Elf_Internal_Shdr * section,
5134                        unsigned long * num_syms_return)
5135 {
5136   unsigned long number = 0;
5137   Elf32_External_Sym * esyms = NULL;
5138   Elf_External_Sym_Shndx * shndx = NULL;
5139   Elf_Internal_Sym * isyms = NULL;
5140   Elf_Internal_Sym * psym;
5141   unsigned int j;
5142
5143   if (section->sh_size == 0)
5144     {
5145       if (num_syms_return != NULL)
5146         * num_syms_return = 0;
5147       return NULL;
5148     }
5149
5150   /* Run some sanity checks first.  */
5151   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5152     {
5153       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5154              printable_section_name (section), (unsigned long) section->sh_entsize);
5155       goto exit_point;
5156     }
5157
5158   if (section->sh_size > current_file_size)
5159     {
5160       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5161              printable_section_name (section), (unsigned long) section->sh_size);
5162       goto exit_point;
5163     }
5164
5165   number = section->sh_size / section->sh_entsize;
5166
5167   if (number * sizeof (Elf32_External_Sym) > section->sh_size + 1)
5168     {
5169       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5170              (unsigned long) section->sh_size,
5171              printable_section_name (section),
5172              (unsigned long) section->sh_entsize);
5173       goto exit_point;
5174     }
5175
5176   esyms = (Elf32_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5177                                            section->sh_size, _("symbols"));
5178   if (esyms == NULL)
5179     goto exit_point;
5180
5181   {
5182     elf_section_list * entry;
5183
5184     shndx = NULL;
5185     for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5186       if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5187         {
5188           shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5189                                                        entry->hdr->sh_offset,
5190                                                        1, entry->hdr->sh_size,
5191                                                        _("symbol table section indicies"));
5192           if (shndx == NULL)
5193             goto exit_point;
5194           /* PR17531: file: heap-buffer-overflow */
5195           else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5196             {
5197               error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5198                      printable_section_name (entry->hdr),
5199                      (unsigned long) entry->hdr->sh_size,
5200                      (unsigned long) section->sh_size);
5201               goto exit_point;
5202             }
5203         }
5204   }
5205
5206   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5207
5208   if (isyms == NULL)
5209     {
5210       error (_("Out of memory reading %lu symbols\n"),
5211              (unsigned long) number);
5212       goto exit_point;
5213     }
5214
5215   for (j = 0, psym = isyms; j < number; j++, psym++)
5216     {
5217       psym->st_name  = BYTE_GET (esyms[j].st_name);
5218       psym->st_value = BYTE_GET (esyms[j].st_value);
5219       psym->st_size  = BYTE_GET (esyms[j].st_size);
5220       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5221       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5222         psym->st_shndx
5223           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5224       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5225         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5226       psym->st_info  = BYTE_GET (esyms[j].st_info);
5227       psym->st_other = BYTE_GET (esyms[j].st_other);
5228     }
5229
5230  exit_point:
5231   if (shndx != NULL)
5232     free (shndx);
5233   if (esyms != NULL)
5234     free (esyms);
5235
5236   if (num_syms_return != NULL)
5237     * num_syms_return = isyms == NULL ? 0 : number;
5238
5239   return isyms;
5240 }
5241
5242 static Elf_Internal_Sym *
5243 get_64bit_elf_symbols (FILE * file,
5244                        Elf_Internal_Shdr * section,
5245                        unsigned long * num_syms_return)
5246 {
5247   unsigned long number = 0;
5248   Elf64_External_Sym * esyms = NULL;
5249   Elf_External_Sym_Shndx * shndx = NULL;
5250   Elf_Internal_Sym * isyms = NULL;
5251   Elf_Internal_Sym * psym;
5252   unsigned int j;
5253
5254   if (section->sh_size == 0)
5255     {
5256       if (num_syms_return != NULL)
5257         * num_syms_return = 0;
5258       return NULL;
5259     }
5260
5261   /* Run some sanity checks first.  */
5262   if (section->sh_entsize == 0 || section->sh_entsize > section->sh_size)
5263     {
5264       error (_("Section %s has an invalid sh_entsize of 0x%lx\n"),
5265              printable_section_name (section),
5266              (unsigned long) section->sh_entsize);
5267       goto exit_point;
5268     }
5269
5270   if (section->sh_size > current_file_size)
5271     {
5272       error (_("Section %s has an invalid sh_size of 0x%lx\n"),
5273              printable_section_name (section),
5274              (unsigned long) section->sh_size);
5275       goto exit_point;
5276     }
5277
5278   number = section->sh_size / section->sh_entsize;
5279
5280   if (number * sizeof (Elf64_External_Sym) > section->sh_size + 1)
5281     {
5282       error (_("Size (0x%lx) of section %s is not a multiple of its sh_entsize (0x%lx)\n"),
5283              (unsigned long) section->sh_size,
5284              printable_section_name (section),
5285              (unsigned long) section->sh_entsize);
5286       goto exit_point;
5287     }
5288
5289   esyms = (Elf64_External_Sym *) get_data (NULL, file, section->sh_offset, 1,
5290                                            section->sh_size, _("symbols"));
5291   if (!esyms)
5292     goto exit_point;
5293
5294   {
5295     elf_section_list * entry;
5296
5297     shndx = NULL;
5298     for (entry = symtab_shndx_list; entry != NULL; entry = entry->next)
5299       if (entry->hdr->sh_link == (unsigned long) (section - section_headers))
5300         {
5301           shndx = (Elf_External_Sym_Shndx *) get_data (NULL, file,
5302                                                        entry->hdr->sh_offset,
5303                                                        1, entry->hdr->sh_size,
5304                                                        _("symbol table section indicies"));
5305           if (shndx == NULL)
5306             goto exit_point;
5307           /* PR17531: file: heap-buffer-overflow */
5308           else if (entry->hdr->sh_size / sizeof (Elf_External_Sym_Shndx) < number)
5309             {
5310               error (_("Index section %s has an sh_size of 0x%lx - expected 0x%lx\n"),
5311                      printable_section_name (entry->hdr),
5312                      (unsigned long) entry->hdr->sh_size,
5313                      (unsigned long) section->sh_size);
5314               goto exit_point;
5315             }
5316         }
5317   }
5318
5319   isyms = (Elf_Internal_Sym *) cmalloc (number, sizeof (Elf_Internal_Sym));
5320
5321   if (isyms == NULL)
5322     {
5323       error (_("Out of memory reading %lu symbols\n"),
5324              (unsigned long) number);
5325       goto exit_point;
5326     }
5327
5328   for (j = 0, psym = isyms; j < number; j++, psym++)
5329     {
5330       psym->st_name  = BYTE_GET (esyms[j].st_name);
5331       psym->st_info  = BYTE_GET (esyms[j].st_info);
5332       psym->st_other = BYTE_GET (esyms[j].st_other);
5333       psym->st_shndx = BYTE_GET (esyms[j].st_shndx);
5334
5335       if (psym->st_shndx == (SHN_XINDEX & 0xffff) && shndx != NULL)
5336         psym->st_shndx
5337           = byte_get ((unsigned char *) &shndx[j], sizeof (shndx[j]));
5338       else if (psym->st_shndx >= (SHN_LORESERVE & 0xffff))
5339         psym->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
5340
5341       psym->st_value = BYTE_GET (esyms[j].st_value);
5342       psym->st_size  = BYTE_GET (esyms[j].st_size);
5343     }
5344
5345  exit_point:
5346   if (shndx != NULL)
5347     free (shndx);
5348   if (esyms != NULL)
5349     free (esyms);
5350
5351   if (num_syms_return != NULL)
5352     * num_syms_return = isyms == NULL ? 0 : number;
5353
5354   return isyms;
5355 }
5356
5357 static const char *
5358 get_elf_section_flags (bfd_vma sh_flags)
5359 {
5360   static char buff[1024];
5361   char * p = buff;
5362   int field_size = is_32bit_elf ? 8 : 16;
5363   int sindex;
5364   int size = sizeof (buff) - (field_size + 4 + 1);
5365   bfd_vma os_flags = 0;
5366   bfd_vma proc_flags = 0;
5367   bfd_vma unknown_flags = 0;
5368   static const struct
5369     {
5370       const char * str;
5371       int len;
5372     }
5373   flags [] =
5374     {
5375       /*  0 */ { STRING_COMMA_LEN ("WRITE") },
5376       /*  1 */ { STRING_COMMA_LEN ("ALLOC") },
5377       /*  2 */ { STRING_COMMA_LEN ("EXEC") },
5378       /*  3 */ { STRING_COMMA_LEN ("MERGE") },
5379       /*  4 */ { STRING_COMMA_LEN ("STRINGS") },
5380       /*  5 */ { STRING_COMMA_LEN ("INFO LINK") },
5381       /*  6 */ { STRING_COMMA_LEN ("LINK ORDER") },
5382       /*  7 */ { STRING_COMMA_LEN ("OS NONCONF") },
5383       /*  8 */ { STRING_COMMA_LEN ("GROUP") },
5384       /*  9 */ { STRING_COMMA_LEN ("TLS") },
5385       /* IA-64 specific.  */
5386       /* 10 */ { STRING_COMMA_LEN ("SHORT") },
5387       /* 11 */ { STRING_COMMA_LEN ("NORECOV") },
5388       /* IA-64 OpenVMS specific.  */
5389       /* 12 */ { STRING_COMMA_LEN ("VMS_GLOBAL") },
5390       /* 13 */ { STRING_COMMA_LEN ("VMS_OVERLAID") },
5391       /* 14 */ { STRING_COMMA_LEN ("VMS_SHARED") },
5392       /* 15 */ { STRING_COMMA_LEN ("VMS_VECTOR") },
5393       /* 16 */ { STRING_COMMA_LEN ("VMS_ALLOC_64BIT") },
5394       /* 17 */ { STRING_COMMA_LEN ("VMS_PROTECTED") },
5395       /* Generic.  */
5396       /* 18 */ { STRING_COMMA_LEN ("EXCLUDE") },
5397       /* SPARC specific.  */
5398       /* 19 */ { STRING_COMMA_LEN ("ORDERED") },
5399       /* 20 */ { STRING_COMMA_LEN ("COMPRESSED") },
5400       /* ARM specific.  */
5401       /* 21 */ { STRING_COMMA_LEN ("ENTRYSECT") },
5402       /* 22 */ { STRING_COMMA_LEN ("ARM_PURECODE") },
5403       /* 23 */ { STRING_COMMA_LEN ("COMDEF") }
5404     };
5405
5406   if (do_section_details)
5407     {
5408       sprintf (buff, "[%*.*lx]: ",
5409                field_size, field_size, (unsigned long) sh_flags);
5410       p += field_size + 4;
5411     }
5412
5413   while (sh_flags)
5414     {
5415       bfd_vma flag;
5416
5417       flag = sh_flags & - sh_flags;
5418       sh_flags &= ~ flag;
5419
5420       if (do_section_details)
5421         {
5422           switch (flag)
5423             {
5424             case SHF_WRITE:             sindex = 0; break;
5425             case SHF_ALLOC:             sindex = 1; break;
5426             case SHF_EXECINSTR:         sindex = 2; break;
5427             case SHF_MERGE:             sindex = 3; break;
5428             case SHF_STRINGS:           sindex = 4; break;
5429             case SHF_INFO_LINK:         sindex = 5; break;
5430             case SHF_LINK_ORDER:        sindex = 6; break;
5431             case SHF_OS_NONCONFORMING:  sindex = 7; break;
5432             case SHF_GROUP:             sindex = 8; break;
5433             case SHF_TLS:               sindex = 9; break;
5434             case SHF_EXCLUDE:           sindex = 18; break;
5435             case SHF_COMPRESSED:        sindex = 20; break;
5436
5437             default:
5438               sindex = -1;
5439               switch (elf_header.e_machine)
5440                 {
5441                 case EM_IA_64:
5442                   if (flag == SHF_IA_64_SHORT)
5443                     sindex = 10;
5444                   else if (flag == SHF_IA_64_NORECOV)
5445                     sindex = 11;
5446 #ifdef BFD64
5447                   else if (elf_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
5448                     switch (flag)
5449                       {
5450                       case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
5451                       case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
5452                       case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
5453                       case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
5454                       case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
5455                       case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
5456                       default:                        break;
5457                       }
5458 #endif
5459                   break;
5460
5461                 case EM_386:
5462                 case EM_IAMCU:
5463                 case EM_X86_64:
5464                 case EM_L1OM:
5465                 case EM_K1OM:
5466                 case EM_OLD_SPARCV9:
5467                 case EM_SPARC32PLUS:
5468                 case EM_SPARCV9:
5469                 case EM_SPARC:
5470                   if (flag == SHF_ORDERED)
5471                     sindex = 19;
5472                   break;
5473
5474                 case EM_ARM:
5475                   switch (flag)
5476                     {
5477                     case SHF_ENTRYSECT: sindex = 21; break;
5478                     case SHF_ARM_PURECODE: sindex = 22; break;
5479                     case SHF_COMDEF: sindex = 23; break;
5480                     default: break;
5481                     }
5482                   break;
5483
5484                 default:
5485                   break;
5486                 }
5487             }
5488
5489           if (sindex != -1)
5490             {
5491               if (p != buff + field_size + 4)
5492                 {
5493                   if (size < (10 + 2))
5494                     {
5495                       warn (_("Internal error: not enough buffer room for section flag info"));
5496                       return _("<unknown>");
5497                     }
5498                   size -= 2;
5499                   *p++ = ',';
5500                   *p++ = ' ';
5501                 }
5502
5503               size -= flags [sindex].len;
5504               p = stpcpy (p, flags [sindex].str);
5505             }
5506           else if (flag & SHF_MASKOS)
5507             os_flags |= flag;
5508           else if (flag & SHF_MASKPROC)
5509             proc_flags |= flag;
5510           else
5511             unknown_flags |= flag;
5512         }
5513       else
5514         {
5515           switch (flag)
5516             {
5517             case SHF_WRITE:             *p = 'W'; break;
5518             case SHF_ALLOC:             *p = 'A'; break;
5519             case SHF_EXECINSTR:         *p = 'X'; break;
5520             case SHF_MERGE:             *p = 'M'; break;
5521             case SHF_STRINGS:           *p = 'S'; break;
5522             case SHF_INFO_LINK:         *p = 'I'; break;
5523             case SHF_LINK_ORDER:        *p = 'L'; break;
5524             case SHF_OS_NONCONFORMING:  *p = 'O'; break;
5525             case SHF_GROUP:             *p = 'G'; break;
5526             case SHF_TLS:               *p = 'T'; break;
5527             case SHF_EXCLUDE:           *p = 'E'; break;
5528             case SHF_COMPRESSED:        *p = 'C'; break;
5529
5530             default:
5531               if ((elf_header.e_machine == EM_X86_64
5532                    || elf_header.e_machine == EM_L1OM
5533                    || elf_header.e_machine == EM_K1OM)
5534                   && flag == SHF_X86_64_LARGE)
5535                 *p = 'l';
5536               else if (elf_header.e_machine == EM_ARM
5537                        && flag == SHF_ARM_PURECODE)
5538                   *p = 'y';
5539               else if (flag & SHF_MASKOS)
5540                 {
5541                   *p = 'o';
5542                   sh_flags &= ~ SHF_MASKOS;
5543                 }
5544               else if (flag & SHF_MASKPROC)
5545                 {
5546                   *p = 'p';
5547                   sh_flags &= ~ SHF_MASKPROC;
5548                 }
5549               else
5550                 *p = 'x';
5551               break;
5552             }
5553           p++;
5554         }
5555     }
5556
5557   if (do_section_details)
5558     {
5559       if (os_flags)
5560         {
5561           size -= 5 + field_size;
5562           if (p != buff + field_size + 4)
5563             {
5564               if (size < (2 + 1))
5565                 {
5566                   warn (_("Internal error: not enough buffer room for section flag info"));
5567                   return _("<unknown>");
5568                 }
5569               size -= 2;
5570               *p++ = ',';
5571               *p++ = ' ';
5572             }
5573           sprintf (p, "OS (%*.*lx)", field_size, field_size,
5574                    (unsigned long) os_flags);
5575           p += 5 + field_size;
5576         }
5577       if (proc_flags)
5578         {
5579           size -= 7 + field_size;
5580           if (p != buff + field_size + 4)
5581             {
5582               if (size < (2 + 1))
5583                 {
5584                   warn (_("Internal error: not enough buffer room for section flag info"));
5585                   return _("<unknown>");
5586                 }
5587               size -= 2;
5588               *p++ = ',';
5589               *p++ = ' ';
5590             }
5591           sprintf (p, "PROC (%*.*lx)", field_size, field_size,
5592                    (unsigned long) proc_flags);
5593           p += 7 + field_size;
5594         }
5595       if (unknown_flags)
5596         {
5597           size -= 10 + field_size;
5598           if (p != buff + field_size + 4)
5599             {
5600               if (size < (2 + 1))
5601                 {
5602                   warn (_("Internal error: not enough buffer room for section flag info"));
5603                   return _("<unknown>");
5604                 }
5605               size -= 2;
5606               *p++ = ',';
5607               *p++ = ' ';
5608             }
5609           sprintf (p, _("UNKNOWN (%*.*lx)"), field_size, field_size,
5610                    (unsigned long) unknown_flags);
5611           p += 10 + field_size;
5612         }
5613     }
5614
5615   *p = '\0';
5616   return buff;
5617 }
5618
5619 static unsigned int
5620 get_compression_header (Elf_Internal_Chdr *chdr, unsigned char *buf)
5621 {
5622   if (is_32bit_elf)
5623     {
5624       Elf32_External_Chdr *echdr = (Elf32_External_Chdr *) buf;
5625
5626       chdr->ch_type = BYTE_GET (echdr->ch_type);
5627       chdr->ch_size = BYTE_GET (echdr->ch_size);
5628       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5629       return sizeof (*echdr);
5630     }
5631   else
5632     {
5633       Elf64_External_Chdr *echdr = (Elf64_External_Chdr *) buf;
5634
5635       chdr->ch_type = BYTE_GET (echdr->ch_type);
5636       chdr->ch_size = BYTE_GET (echdr->ch_size);
5637       chdr->ch_addralign = BYTE_GET (echdr->ch_addralign);
5638       return sizeof (*echdr);
5639     }
5640 }
5641
5642 static int
5643 process_section_headers (FILE * file)
5644 {
5645   Elf_Internal_Shdr * section;
5646   unsigned int i;
5647
5648   section_headers = NULL;
5649
5650   if (elf_header.e_shnum == 0)
5651     {
5652       /* PR binutils/12467.  */
5653       if (elf_header.e_shoff != 0)
5654         warn (_("possibly corrupt ELF file header - it has a non-zero"
5655                 " section header offset, but no section headers\n"));
5656       else if (do_sections)
5657         printf (_("\nThere are no sections in this file.\n"));
5658
5659       return 1;
5660     }
5661
5662   if (do_sections && !do_header)
5663     printf (_("There are %d section headers, starting at offset 0x%lx:\n"),
5664             elf_header.e_shnum, (unsigned long) elf_header.e_shoff);
5665
5666   if (is_32bit_elf)
5667     {
5668       if (! get_32bit_section_headers (file, FALSE))
5669         return 0;
5670     }
5671   else if (! get_64bit_section_headers (file, FALSE))
5672     return 0;
5673
5674   /* Read in the string table, so that we have names to display.  */
5675   if (elf_header.e_shstrndx != SHN_UNDEF
5676        && elf_header.e_shstrndx < elf_header.e_shnum)
5677     {
5678       section = section_headers + elf_header.e_shstrndx;
5679
5680       if (section->sh_size != 0)
5681         {
5682           string_table = (char *) get_data (NULL, file, section->sh_offset,
5683                                             1, section->sh_size,
5684                                             _("string table"));
5685
5686           string_table_length = string_table != NULL ? section->sh_size : 0;
5687         }
5688     }
5689
5690   /* Scan the sections for the dynamic symbol table
5691      and dynamic string table and debug sections.  */
5692   dynamic_symbols = NULL;
5693   dynamic_strings = NULL;
5694   dynamic_syminfo = NULL;
5695   symtab_shndx_list = NULL;
5696
5697   eh_addr_size = is_32bit_elf ? 4 : 8;
5698   switch (elf_header.e_machine)
5699     {
5700     case EM_MIPS:
5701     case EM_MIPS_RS3_LE:
5702       /* The 64-bit MIPS EABI uses a combination of 32-bit ELF and 64-bit
5703          FDE addresses.  However, the ABI also has a semi-official ILP32
5704          variant for which the normal FDE address size rules apply.
5705
5706          GCC 4.0 marks EABI64 objects with a dummy .gcc_compiled_longXX
5707          section, where XX is the size of longs in bits.  Unfortunately,
5708          earlier compilers provided no way of distinguishing ILP32 objects
5709          from LP64 objects, so if there's any doubt, we should assume that
5710          the official LP64 form is being used.  */
5711       if ((elf_header.e_flags & EF_MIPS_ABI) == E_MIPS_ABI_EABI64
5712           && find_section (".gcc_compiled_long32") == NULL)
5713         eh_addr_size = 8;
5714       break;
5715
5716     case EM_H8_300:
5717     case EM_H8_300H:
5718       switch (elf_header.e_flags & EF_H8_MACH)
5719         {
5720         case E_H8_MACH_H8300:
5721         case E_H8_MACH_H8300HN:
5722         case E_H8_MACH_H8300SN:
5723         case E_H8_MACH_H8300SXN:
5724           eh_addr_size = 2;
5725           break;
5726         case E_H8_MACH_H8300H:
5727         case E_H8_MACH_H8300S:
5728         case E_H8_MACH_H8300SX:
5729           eh_addr_size = 4;
5730           break;
5731         }
5732       break;
5733
5734     case EM_M32C_OLD:
5735     case EM_M32C:
5736       switch (elf_header.e_flags & EF_M32C_CPU_MASK)
5737         {
5738         case EF_M32C_CPU_M16C:
5739           eh_addr_size = 2;
5740           break;
5741         }
5742       break;
5743     }
5744
5745 #define CHECK_ENTSIZE_VALUES(section, i, size32, size64)                \
5746   do                                                                    \
5747     {                                                                   \
5748       bfd_size_type expected_entsize = is_32bit_elf ? size32 : size64;  \
5749       if (section->sh_entsize != expected_entsize)                      \
5750         {                                                               \
5751           char buf[40];                                                 \
5752           sprintf_vma (buf, section->sh_entsize);                       \
5753           /* Note: coded this way so that there is a single string for  \
5754              translation.  */ \
5755           error (_("Section %d has invalid sh_entsize of %s\n"), i, buf); \
5756           error (_("(Using the expected size of %u for the rest of this dump)\n"), \
5757                    (unsigned) expected_entsize);                        \
5758           section->sh_entsize = expected_entsize;                       \
5759         }                                                               \
5760     }                                                                   \
5761   while (0)
5762
5763 #define CHECK_ENTSIZE(section, i, type)                                 \
5764   CHECK_ENTSIZE_VALUES (section, i, sizeof (Elf32_External_##type),         \
5765                         sizeof (Elf64_External_##type))
5766
5767   for (i = 0, section = section_headers;
5768        i < elf_header.e_shnum;
5769        i++, section++)
5770     {
5771       char * name = SECTION_NAME (section);
5772
5773       if (section->sh_type == SHT_DYNSYM)
5774         {
5775           if (dynamic_symbols != NULL)
5776             {
5777               error (_("File contains multiple dynamic symbol tables\n"));
5778               continue;
5779             }
5780
5781           CHECK_ENTSIZE (section, i, Sym);
5782           dynamic_symbols = GET_ELF_SYMBOLS (file, section, & num_dynamic_syms);
5783         }
5784       else if (section->sh_type == SHT_STRTAB
5785                && streq (name, ".dynstr"))
5786         {
5787           if (dynamic_strings != NULL)
5788             {
5789               error (_("File contains multiple dynamic string tables\n"));
5790               continue;
5791             }
5792
5793           dynamic_strings = (char *) get_data (NULL, file, section->sh_offset,
5794                                                1, section->sh_size,
5795                                                _("dynamic strings"));
5796           dynamic_strings_length = dynamic_strings == NULL ? 0 : section->sh_size;
5797         }
5798       else if (section->sh_type == SHT_SYMTAB_SHNDX)
5799         {
5800           elf_section_list * entry = xmalloc (sizeof * entry);
5801           entry->hdr = section;
5802           entry->next = symtab_shndx_list;
5803           symtab_shndx_list = entry;
5804         }
5805       else if (section->sh_type == SHT_SYMTAB)
5806         CHECK_ENTSIZE (section, i, Sym);
5807       else if (section->sh_type == SHT_GROUP)
5808         CHECK_ENTSIZE_VALUES (section, i, GRP_ENTRY_SIZE, GRP_ENTRY_SIZE);
5809       else if (section->sh_type == SHT_REL)
5810         CHECK_ENTSIZE (section, i, Rel);
5811       else if (section->sh_type == SHT_RELA)
5812         CHECK_ENTSIZE (section, i, Rela);
5813       else if ((do_debugging || do_debug_info || do_debug_abbrevs
5814                 || do_debug_lines || do_debug_pubnames || do_debug_pubtypes
5815                 || do_debug_aranges || do_debug_frames || do_debug_macinfo
5816                 || do_debug_str || do_debug_loc || do_debug_ranges
5817                 || do_debug_addr || do_debug_cu_index)
5818                && (const_strneq (name, ".debug_")
5819                    || const_strneq (name, ".zdebug_")))
5820         {
5821           if (name[1] == 'z')
5822             name += sizeof (".zdebug_") - 1;
5823           else
5824             name += sizeof (".debug_") - 1;
5825
5826           if (do_debugging
5827               || (do_debug_info     && const_strneq (name, "info"))
5828               || (do_debug_info     && const_strneq (name, "types"))
5829               || (do_debug_abbrevs  && const_strneq (name, "abbrev"))
5830               || (do_debug_lines    && strcmp (name, "line") == 0)
5831               || (do_debug_lines    && const_strneq (name, "line."))
5832               || (do_debug_pubnames && const_strneq (name, "pubnames"))
5833               || (do_debug_pubtypes && const_strneq (name, "pubtypes"))
5834               || (do_debug_pubnames && const_strneq (name, "gnu_pubnames"))
5835               || (do_debug_pubtypes && const_strneq (name, "gnu_pubtypes"))
5836               || (do_debug_aranges  && const_strneq (name, "aranges"))
5837               || (do_debug_ranges   && const_strneq (name, "ranges"))
5838               || (do_debug_frames   && const_strneq (name, "frame"))
5839               || (do_debug_macinfo  && const_strneq (name, "macinfo"))
5840               || (do_debug_macinfo  && const_strneq (name, "macro"))
5841               || (do_debug_str      && const_strneq (name, "str"))
5842               || (do_debug_loc      && const_strneq (name, "loc"))
5843               || (do_debug_addr     && const_strneq (name, "addr"))
5844               || (do_debug_cu_index && const_strneq (name, "cu_index"))
5845               || (do_debug_cu_index && const_strneq (name, "tu_index"))
5846               )
5847             request_dump_bynumber (i, DEBUG_DUMP);
5848         }
5849       /* Linkonce section to be combined with .debug_info at link time.  */
5850       else if ((do_debugging || do_debug_info)
5851                && const_strneq (name, ".gnu.linkonce.wi."))
5852         request_dump_bynumber (i, DEBUG_DUMP);
5853       else if (do_debug_frames && streq (name, ".eh_frame"))
5854         request_dump_bynumber (i, DEBUG_DUMP);
5855       else if (do_gdb_index && streq (name, ".gdb_index"))
5856         request_dump_bynumber (i, DEBUG_DUMP);
5857       /* Trace sections for Itanium VMS.  */
5858       else if ((do_debugging || do_trace_info || do_trace_abbrevs
5859                 || do_trace_aranges)
5860                && const_strneq (name, ".trace_"))
5861         {
5862           name += sizeof (".trace_") - 1;
5863
5864           if (do_debugging
5865               || (do_trace_info     && streq (name, "info"))
5866               || (do_trace_abbrevs  && streq (name, "abbrev"))
5867               || (do_trace_aranges  && streq (name, "aranges"))
5868               )
5869             request_dump_bynumber (i, DEBUG_DUMP);
5870         }
5871     }
5872
5873   if (! do_sections)
5874     return 1;
5875
5876   if (elf_header.e_shnum > 1)
5877     printf (_("\nSection Headers:\n"));
5878   else
5879     printf (_("\nSection Header:\n"));
5880
5881   if (is_32bit_elf)
5882     {
5883       if (do_section_details)
5884         {
5885           printf (_("  [Nr] Name\n"));
5886           printf (_("       Type            Addr     Off    Size   ES   Lk Inf Al\n"));
5887         }
5888       else
5889         printf
5890           (_("  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al\n"));
5891     }
5892   else if (do_wide)
5893     {
5894       if (do_section_details)
5895         {
5896           printf (_("  [Nr] Name\n"));
5897           printf (_("       Type            Address          Off    Size   ES   Lk Inf Al\n"));
5898         }
5899       else
5900         printf
5901           (_("  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al\n"));
5902     }
5903   else
5904     {
5905       if (do_section_details)
5906         {
5907           printf (_("  [Nr] Name\n"));
5908           printf (_("       Type              Address          Offset            Link\n"));
5909           printf (_("       Size              EntSize          Info              Align\n"));
5910         }
5911       else
5912         {
5913           printf (_("  [Nr] Name              Type             Address           Offset\n"));
5914           printf (_("       Size              EntSize          Flags  Link  Info  Align\n"));
5915         }
5916     }
5917
5918   if (do_section_details)
5919     printf (_("       Flags\n"));
5920
5921   for (i = 0, section = section_headers;
5922        i < elf_header.e_shnum;
5923        i++, section++)
5924     {
5925       /* Run some sanity checks on the section header.  */
5926
5927       /* Check the sh_link field.  */
5928       switch (section->sh_type)
5929         {
5930         case SHT_SYMTAB_SHNDX:
5931         case SHT_GROUP:
5932         case SHT_HASH:
5933         case SHT_GNU_HASH:
5934         case SHT_GNU_versym:
5935         case SHT_REL:
5936         case SHT_RELA:
5937           if (section->sh_link < 1
5938               || section->sh_link > elf_header.e_shnum
5939               || (section_headers[section->sh_link].sh_type != SHT_SYMTAB
5940                   && section_headers[section->sh_link].sh_type != SHT_DYNSYM))
5941             warn (_("[%2u]: Link field (%u) should index a symtab section.\n"),
5942                   i, section->sh_link);
5943           break;
5944
5945         case SHT_DYNAMIC:
5946         case SHT_SYMTAB:
5947         case SHT_DYNSYM:
5948         case SHT_GNU_verneed:
5949         case SHT_GNU_verdef:
5950         case SHT_GNU_LIBLIST:
5951           if (section->sh_link < 1
5952               || section->sh_link > elf_header.e_shnum
5953               || section_headers[section->sh_link].sh_type != SHT_STRTAB)
5954             warn (_("[%2u]: Link field (%u) should index a string section.\n"),
5955                   i, section->sh_link);
5956           break;
5957
5958         case SHT_INIT_ARRAY:
5959         case SHT_FINI_ARRAY:
5960         case SHT_PREINIT_ARRAY:
5961           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
5962             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
5963                   i, section->sh_link);
5964           break;
5965
5966         default:
5967           /* FIXME: Add support for target specific section types.  */
5968 #if 0     /* Currently we do not check other section types as there are too
5969              many special cases.  Stab sections for example have a type
5970              of SHT_PROGBITS but an sh_link field that links to the .stabstr
5971              section.  */
5972           if (section->sh_type < SHT_LOOS && section->sh_link != 0)
5973             warn (_("[%2u]: Unexpected value (%u) in link field.\n"),
5974                   i, section->sh_link);
5975 #endif
5976           break;
5977         }
5978
5979       /* Check the sh_info field.  */
5980       switch (section->sh_type)
5981         {
5982         case SHT_REL:
5983         case SHT_RELA:
5984           if (section->sh_info < 1
5985               || section->sh_info > elf_header.e_shnum
5986               || (section_headers[section->sh_info].sh_type != SHT_PROGBITS
5987                   && section_headers[section->sh_info].sh_type != SHT_NOBITS
5988                   && section_headers[section->sh_info].sh_type != SHT_NOTE
5989                   && section_headers[section->sh_info].sh_type != SHT_INIT_ARRAY
5990                   /* FIXME: Are other section types valid ?  */
5991                   && section_headers[section->sh_info].sh_type < SHT_LOOS))
5992             {
5993               if (section->sh_info == 0
5994                   && (streq (SECTION_NAME (section), ".rel.dyn")
5995                       || streq (SECTION_NAME (section), ".rela.dyn")))
5996                 /* The .rel.dyn and .rela.dyn sections have an sh_info field
5997                    of zero.  No idea why.  I would have expected the index
5998                    of the .plt section.  */
5999                    ;
6000               else
6001                 warn (_("[%2u]: Info field (%u) should index a relocatable section.\n"),
6002                       i, section->sh_info);
6003             }
6004           break;
6005
6006         case SHT_DYNAMIC:
6007         case SHT_HASH:
6008         case SHT_SYMTAB_SHNDX:
6009         case SHT_INIT_ARRAY:
6010         case SHT_FINI_ARRAY:
6011         case SHT_PREINIT_ARRAY:
6012           if (section->sh_info != 0)
6013             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6014                   i, section->sh_info);
6015           break;
6016
6017         case SHT_GROUP:
6018         case SHT_SYMTAB:
6019         case SHT_DYNSYM:
6020           /* A symbol index - we assume that it is valid.  */
6021           break;
6022
6023         default:
6024           /* FIXME: Add support for target specific section types.  */
6025           if (section->sh_type == SHT_NOBITS)
6026             /* NOBITS section headers with non-zero sh_info fields can be
6027                created when a binary is stripped of everything but its debug
6028                information.  The stripped sections have their headers preserved but their types set to SHT_NOBITS.  so do not check this type of section.  */
6029             ;
6030           else if (section->sh_flags & SHF_INFO_LINK)
6031             {
6032               if (section->sh_info < 1 || section->sh_info > elf_header.e_shnum)
6033                 warn (_("[%2u]: Expected link to another section in info field"), i);
6034             }
6035           else if (section->sh_type < SHT_LOOS && section->sh_info != 0)
6036             warn (_("[%2u]: Unexpected value (%u) in info field.\n"),
6037                   i, section->sh_info);
6038           break;
6039         }
6040
6041       printf ("  [%2u] ", i);
6042       if (do_section_details)
6043         printf ("%s\n      ", printable_section_name (section));
6044       else
6045         print_symbol (-17, SECTION_NAME (section));
6046
6047       printf (do_wide ? " %-15s " : " %-15.15s ",
6048               get_section_type_name (section->sh_type));
6049
6050       if (is_32bit_elf)
6051         {
6052           const char * link_too_big = NULL;
6053
6054           print_vma (section->sh_addr, LONG_HEX);
6055
6056           printf ( " %6.6lx %6.6lx %2.2lx",
6057                    (unsigned long) section->sh_offset,
6058                    (unsigned long) section->sh_size,
6059                    (unsigned long) section->sh_entsize);
6060
6061           if (do_section_details)
6062             fputs ("  ", stdout);
6063           else
6064             printf (" %3s ", get_elf_section_flags (section->sh_flags));
6065
6066           if (section->sh_link >= elf_header.e_shnum)
6067             {
6068               link_too_big = "";
6069               /* The sh_link value is out of range.  Normally this indicates
6070                  an error but it can have special values in Solaris binaries.  */
6071               switch (elf_header.e_machine)
6072                 {
6073                 case EM_386:
6074                 case EM_IAMCU:
6075                 case EM_X86_64:
6076                 case EM_L1OM:
6077                 case EM_K1OM:
6078                 case EM_OLD_SPARCV9:
6079                 case EM_SPARC32PLUS:
6080                 case EM_SPARCV9:
6081                 case EM_SPARC:
6082                   if (section->sh_link == (SHN_BEFORE & 0xffff))
6083                     link_too_big = "BEFORE";
6084                   else if (section->sh_link == (SHN_AFTER & 0xffff))
6085                     link_too_big = "AFTER";
6086                   break;
6087                 default:
6088                   break;
6089                 }
6090             }
6091
6092           if (do_section_details)
6093             {
6094               if (link_too_big != NULL && * link_too_big)
6095                 printf ("<%s> ", link_too_big);
6096               else
6097                 printf ("%2u ", section->sh_link);
6098               printf ("%3u %2lu\n", section->sh_info,
6099                       (unsigned long) section->sh_addralign);
6100             }
6101           else
6102             printf ("%2u %3u %2lu\n",
6103                     section->sh_link,
6104                     section->sh_info,
6105                     (unsigned long) section->sh_addralign);
6106
6107           if (link_too_big && ! * link_too_big)
6108             warn (_("section %u: sh_link value of %u is larger than the number of sections\n"),
6109                   i, section->sh_link);
6110         }
6111       else if (do_wide)
6112         {
6113           print_vma (section->sh_addr, LONG_HEX);
6114
6115           if ((long) section->sh_offset == section->sh_offset)
6116             printf (" %6.6lx", (unsigned long) section->sh_offset);
6117           else
6118             {
6119               putchar (' ');
6120               print_vma (section->sh_offset, LONG_HEX);
6121             }
6122
6123           if ((unsigned long) section->sh_size == section->sh_size)
6124             printf (" %6.6lx", (unsigned long) section->sh_size);
6125           else
6126             {
6127               putchar (' ');
6128               print_vma (section->sh_size, LONG_HEX);
6129             }
6130
6131           if ((unsigned long) section->sh_entsize == section->sh_entsize)
6132             printf (" %2.2lx", (unsigned long) section->sh_entsize);
6133           else
6134             {
6135               putchar (' ');
6136               print_vma (section->sh_entsize, LONG_HEX);
6137             }
6138
6139           if (do_section_details)
6140             fputs ("  ", stdout);
6141           else
6142             printf (" %3s ", get_elf_section_flags (section->sh_flags));
6143
6144           printf ("%2u %3u ", section->sh_link, section->sh_info);
6145
6146           if ((unsigned long) section->sh_addralign == section->sh_addralign)
6147             printf ("%2lu\n", (unsigned long) section->sh_addralign);
6148           else
6149             {
6150               print_vma (section->sh_addralign, DEC);
6151               putchar ('\n');
6152             }
6153         }
6154       else if (do_section_details)
6155         {
6156           printf ("       %-15.15s  ",
6157                   get_section_type_name (section->sh_type));
6158           print_vma (section->sh_addr, LONG_HEX);
6159           if ((long) section->sh_offset == section->sh_offset)
6160             printf ("  %16.16lx", (unsigned long) section->sh_offset);
6161           else
6162             {
6163               printf ("  ");
6164               print_vma (section->sh_offset, LONG_HEX);
6165             }
6166           printf ("  %u\n       ", section->sh_link);
6167           print_vma (section->sh_size, LONG_HEX);
6168           putchar (' ');
6169           print_vma (section->sh_entsize, LONG_HEX);
6170
6171           printf ("  %-16u  %lu\n",
6172                   section->sh_info,
6173                   (unsigned long) section->sh_addralign);
6174         }
6175       else
6176         {
6177           putchar (' ');
6178           print_vma (section->sh_addr, LONG_HEX);
6179           if ((long) section->sh_offset == section->sh_offset)
6180             printf ("  %8.8lx", (unsigned long) section->sh_offset);
6181           else
6182             {
6183               printf ("  ");
6184               print_vma (section->sh_offset, LONG_HEX);
6185             }
6186           printf ("\n       ");
6187           print_vma (section->sh_size, LONG_HEX);
6188           printf ("  ");
6189           print_vma (section->sh_entsize, LONG_HEX);
6190
6191           printf (" %3s ", get_elf_section_flags (section->sh_flags));
6192
6193           printf ("     %2u   %3u     %lu\n",
6194                   section->sh_link,
6195                   section->sh_info,
6196                   (unsigned long) section->sh_addralign);
6197         }
6198
6199       if (do_section_details)
6200         {
6201           printf ("       %s\n", get_elf_section_flags (section->sh_flags));
6202           if ((section->sh_flags & SHF_COMPRESSED) != 0)
6203             {
6204               /* Minimum section size is 12 bytes for 32-bit compression
6205                  header + 12 bytes for compressed data header.  */
6206               unsigned char buf[24];
6207
6208               assert (sizeof (buf) >= sizeof (Elf64_External_Chdr));
6209               if (get_data (&buf, (FILE *) file, section->sh_offset, 1,
6210                             sizeof (buf), _("compression header")))
6211                 {
6212                   Elf_Internal_Chdr chdr;
6213
6214                   (void) get_compression_header (&chdr, buf);
6215
6216                   if (chdr.ch_type == ELFCOMPRESS_ZLIB)
6217                     printf ("       ZLIB, ");
6218                   else
6219                     printf (_("       [<unknown>: 0x%x], "),
6220                             chdr.ch_type);
6221                   print_vma (chdr.ch_size, LONG_HEX);
6222                   printf (", %lu\n", (unsigned long) chdr.ch_addralign);
6223                 }
6224             }
6225         }
6226     }
6227
6228   if (!do_section_details)
6229     {
6230       /* The ordering of the letters shown here matches the ordering of the
6231          corresponding SHF_xxx values, and hence the order in which these
6232          letters will be displayed to the user.  */
6233       printf (_("Key to Flags:\n\
6234   W (write), A (alloc), X (execute), M (merge), S (strings), I (info),\n\
6235   L (link order), O (extra OS processing required), G (group), T (TLS),\n\
6236   C (compressed), x (unknown), o (OS specific), E (exclude),\n  "));
6237       if (elf_header.e_machine == EM_X86_64
6238           || elf_header.e_machine == EM_L1OM
6239           || elf_header.e_machine == EM_K1OM)
6240         printf (_("l (large), "));
6241       else if (elf_header.e_machine == EM_ARM)
6242         printf (_("y (purecode), "));
6243       printf ("p (processor specific)\n");
6244     }
6245
6246   return 1;
6247 }
6248
6249 static const char *
6250 get_group_flags (unsigned int flags)
6251 {
6252   static char buff[32];
6253   switch (flags)
6254     {
6255     case 0:
6256       return "";
6257
6258     case GRP_COMDAT:
6259       return "COMDAT ";
6260
6261    default:
6262       snprintf (buff, sizeof (buff), _("[<unknown>: 0x%x] "), flags);
6263       break;
6264     }
6265   return buff;
6266 }
6267
6268 static int
6269 process_section_groups (FILE * file)
6270 {
6271   Elf_Internal_Shdr * section;
6272   unsigned int i;
6273   struct group * group;
6274   Elf_Internal_Shdr * symtab_sec;
6275   Elf_Internal_Shdr * strtab_sec;
6276   Elf_Internal_Sym * symtab;
6277   unsigned long num_syms;
6278   char * strtab;
6279   size_t strtab_size;
6280
6281   /* Don't process section groups unless needed.  */
6282   if (!do_unwind && !do_section_groups)
6283     return 1;
6284
6285   if (elf_header.e_shnum == 0)
6286     {
6287       if (do_section_groups)
6288         printf (_("\nThere are no sections to group in this file.\n"));
6289
6290       return 1;
6291     }
6292
6293   if (section_headers == NULL)
6294     {
6295       error (_("Section headers are not available!\n"));
6296       /* PR 13622: This can happen with a corrupt ELF header.  */
6297       return 0;
6298     }
6299
6300   section_headers_groups = (struct group **) calloc (elf_header.e_shnum,
6301                                                      sizeof (struct group *));
6302
6303   if (section_headers_groups == NULL)
6304     {
6305       error (_("Out of memory reading %u section group headers\n"),
6306              elf_header.e_shnum);
6307       return 0;
6308     }
6309
6310   /* Scan the sections for the group section.  */
6311   group_count = 0;
6312   for (i = 0, section = section_headers;
6313        i < elf_header.e_shnum;
6314        i++, section++)
6315     if (section->sh_type == SHT_GROUP)
6316       group_count++;
6317
6318   if (group_count == 0)
6319     {
6320       if (do_section_groups)
6321         printf (_("\nThere are no section groups in this file.\n"));
6322
6323       return 1;
6324     }
6325
6326   section_groups = (struct group *) calloc (group_count, sizeof (struct group));
6327
6328   if (section_groups == NULL)
6329     {
6330       error (_("Out of memory reading %lu groups\n"),
6331              (unsigned long) group_count);
6332       return 0;
6333     }
6334
6335   symtab_sec = NULL;
6336   strtab_sec = NULL;
6337   symtab = NULL;
6338   num_syms = 0;
6339   strtab = NULL;
6340   strtab_size = 0;
6341   for (i = 0, section = section_headers, group = section_groups;
6342        i < elf_header.e_shnum;
6343        i++, section++)
6344     {
6345       if (section->sh_type == SHT_GROUP)
6346         {
6347           const char * name = printable_section_name (section);
6348           const char * group_name;
6349           unsigned char * start;
6350           unsigned char * indices;
6351           unsigned int entry, j, size;
6352           Elf_Internal_Shdr * sec;
6353           Elf_Internal_Sym * sym;
6354
6355           /* Get the symbol table.  */
6356           if (section->sh_link >= elf_header.e_shnum
6357               || ((sec = section_headers + section->sh_link)->sh_type
6358                   != SHT_SYMTAB))
6359             {
6360               error (_("Bad sh_link in group section `%s'\n"), name);
6361               continue;
6362             }
6363
6364           if (symtab_sec != sec)
6365             {
6366               symtab_sec = sec;
6367               if (symtab)
6368                 free (symtab);
6369               symtab = GET_ELF_SYMBOLS (file, symtab_sec, & num_syms);
6370             }
6371
6372           if (symtab == NULL)
6373             {
6374               error (_("Corrupt header in group section `%s'\n"), name);
6375               continue;
6376             }
6377
6378           if (section->sh_info >= num_syms)
6379             {
6380               error (_("Bad sh_info in group section `%s'\n"), name);
6381               continue;
6382             }
6383
6384           sym = symtab + section->sh_info;
6385
6386           if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
6387             {
6388               if (sym->st_shndx == 0
6389                   || sym->st_shndx >= elf_header.e_shnum)
6390                 {
6391                   error (_("Bad sh_info in group section `%s'\n"), name);
6392                   continue;
6393                 }
6394
6395               group_name = SECTION_NAME (section_headers + sym->st_shndx);
6396               strtab_sec = NULL;
6397               if (strtab)
6398                 free (strtab);
6399               strtab = NULL;
6400               strtab_size = 0;
6401             }
6402           else
6403             {
6404               /* Get the string table.  */
6405               if (symtab_sec->sh_link >= elf_header.e_shnum)
6406                 {
6407                   strtab_sec = NULL;
6408                   if (strtab)
6409                     free (strtab);
6410                   strtab = NULL;
6411                   strtab_size = 0;
6412                 }
6413               else if (strtab_sec
6414                        != (sec = section_headers + symtab_sec->sh_link))
6415                 {
6416                   strtab_sec = sec;
6417                   if (strtab)
6418                     free (strtab);
6419
6420                   strtab = (char *) get_data (NULL, file, strtab_sec->sh_offset,
6421                                               1, strtab_sec->sh_size,
6422                                               _("string table"));
6423                   strtab_size = strtab != NULL ? strtab_sec->sh_size : 0;
6424                 }
6425               group_name = sym->st_name < strtab_size
6426                 ? strtab + sym->st_name : _("<corrupt>");
6427             }
6428
6429           /* PR 17531: file: loop.  */
6430           if (section->sh_entsize > section->sh_size)
6431             {
6432               error (_("Section %s has sh_entsize (0x%lx) which is larger than its size (0x%lx)\n"),
6433                      printable_section_name (section),
6434                      (unsigned long) section->sh_entsize,
6435                      (unsigned long) section->sh_size);
6436               break;
6437             }
6438
6439           start = (unsigned char *) get_data (NULL, file, section->sh_offset,
6440                                               1, section->sh_size,
6441                                               _("section data"));
6442           if (start == NULL)
6443             continue;
6444
6445           indices = start;
6446           size = (section->sh_size / section->sh_entsize) - 1;
6447           entry = byte_get (indices, 4);
6448           indices += 4;
6449
6450           if (do_section_groups)
6451             {
6452               printf (_("\n%sgroup section [%5u] `%s' [%s] contains %u sections:\n"),
6453                       get_group_flags (entry), i, name, group_name, size);
6454
6455               printf (_("   [Index]    Name\n"));
6456             }
6457
6458           group->group_index = i;
6459
6460           for (j = 0; j < size; j++)
6461             {
6462               struct group_list * g;
6463
6464               entry = byte_get (indices, 4);
6465               indices += 4;
6466
6467               if (entry >= elf_header.e_shnum)
6468                 {
6469                   static unsigned num_group_errors = 0;
6470
6471                   if (num_group_errors ++ < 10)
6472                     {
6473                       error (_("section [%5u] in group section [%5u] > maximum section [%5u]\n"),
6474                              entry, i, elf_header.e_shnum - 1);
6475                       if (num_group_errors == 10)
6476                         warn (_("Futher error messages about overlarge group section indicies suppressed\n"));
6477                     }
6478                   continue;
6479                 }
6480
6481               if (section_headers_groups [entry] != NULL)
6482                 {
6483                   if (entry)
6484                     {
6485                       static unsigned num_errs = 0;
6486
6487                       if (num_errs ++ < 10)
6488                         {
6489                           error (_("section [%5u] in group section [%5u] already in group section [%5u]\n"),
6490                                  entry, i,
6491                                  section_headers_groups [entry]->group_index);
6492                           if (num_errs == 10)
6493                             warn (_("Further error messages about already contained group sections suppressed\n"));
6494                         }
6495                       continue;
6496                     }
6497                   else
6498                     {
6499                       /* Intel C/C++ compiler may put section 0 in a
6500                          section group. We just warn it the first time
6501                          and ignore it afterwards.  */
6502                       static int warned = 0;
6503                       if (!warned)
6504                         {
6505                           error (_("section 0 in group section [%5u]\n"),
6506                                  section_headers_groups [entry]->group_index);
6507                           warned++;
6508                         }
6509                     }
6510                 }
6511
6512               section_headers_groups [entry] = group;
6513
6514               if (do_section_groups)
6515                 {
6516                   sec = section_headers + entry;
6517                   printf ("   [%5u]   %s\n", entry, printable_section_name (sec));
6518                 }
6519
6520               g = (struct group_list *) xmalloc (sizeof (struct group_list));
6521               g->section_index = entry;
6522               g->next = group->root;
6523               group->root = g;
6524             }
6525
6526           if (start)
6527             free (start);
6528
6529           group++;
6530         }
6531     }
6532
6533   if (symtab)
6534     free (symtab);
6535   if (strtab)
6536     free (strtab);
6537   return 1;
6538 }
6539
6540 /* Data used to display dynamic fixups.  */
6541
6542 struct ia64_vms_dynfixup
6543 {
6544   bfd_vma needed_ident;         /* Library ident number.  */
6545   bfd_vma needed;               /* Index in the dstrtab of the library name.  */
6546   bfd_vma fixup_needed;         /* Index of the library.  */
6547   bfd_vma fixup_rela_cnt;       /* Number of fixups.  */
6548   bfd_vma fixup_rela_off;       /* Fixups offset in the dynamic segment.  */
6549 };
6550
6551 /* Data used to display dynamic relocations.  */
6552
6553 struct ia64_vms_dynimgrela
6554 {
6555   bfd_vma img_rela_cnt;         /* Number of relocations.  */
6556   bfd_vma img_rela_off;         /* Reloc offset in the dynamic segment.  */
6557 };
6558
6559 /* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
6560    library).  */
6561
6562 static void
6563 dump_ia64_vms_dynamic_fixups (FILE *file, struct ia64_vms_dynfixup *fixup,
6564                               const char *strtab, unsigned int strtab_sz)
6565 {
6566   Elf64_External_VMS_IMAGE_FIXUP *imfs;
6567   long i;
6568   const char *lib_name;
6569
6570   imfs = get_data (NULL, file, dynamic_addr + fixup->fixup_rela_off,
6571                    1, fixup->fixup_rela_cnt * sizeof (*imfs),
6572                    _("dynamic section image fixups"));
6573   if (!imfs)
6574     return;
6575
6576   if (fixup->needed < strtab_sz)
6577     lib_name = strtab + fixup->needed;
6578   else
6579     {
6580       warn ("corrupt library name index of 0x%lx found in dynamic entry",
6581             (unsigned long) fixup->needed);
6582       lib_name = "???";
6583     }
6584   printf (_("\nImage fixups for needed library #%d: %s - ident: %lx\n"),
6585           (int) fixup->fixup_needed, lib_name, (long) fixup->needed_ident);
6586   printf
6587     (_("Seg Offset           Type                             SymVec DataType\n"));
6588
6589   for (i = 0; i < (long) fixup->fixup_rela_cnt; i++)
6590     {
6591       unsigned int type;
6592       const char *rtype;
6593
6594       printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
6595       printf_vma ((bfd_vma) BYTE_GET (imfs [i].fixup_offset));
6596       type = BYTE_GET (imfs [i].type);
6597       rtype = elf_ia64_reloc_type (type);
6598       if (rtype == NULL)
6599         printf (" 0x%08x                       ", type);
6600       else
6601         printf (" %-32s ", rtype);
6602       printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
6603       printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
6604     }
6605
6606   free (imfs);
6607 }
6608
6609 /* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
6610
6611 static void
6612 dump_ia64_vms_dynamic_relocs (FILE *file, struct ia64_vms_dynimgrela *imgrela)
6613 {
6614   Elf64_External_VMS_IMAGE_RELA *imrs;
6615   long i;
6616
6617   imrs = get_data (NULL, file, dynamic_addr + imgrela->img_rela_off,
6618                    1, imgrela->img_rela_cnt * sizeof (*imrs),
6619                    _("dynamic section image relocations"));
6620   if (!imrs)
6621     return;
6622
6623   printf (_("\nImage relocs\n"));
6624   printf
6625     (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
6626
6627   for (i = 0; i < (long) imgrela->img_rela_cnt; i++)
6628     {
6629       unsigned int type;
6630       const char *rtype;
6631
6632       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
6633       printf ("%08" BFD_VMA_FMT "x ",
6634               (bfd_vma) BYTE_GET (imrs [i].rela_offset));
6635       type = BYTE_GET (imrs [i].type);
6636       rtype = elf_ia64_reloc_type (type);
6637       if (rtype == NULL)
6638         printf ("0x%08x                      ", type);
6639       else
6640         printf ("%-31s ", rtype);
6641       print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
6642       printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
6643       printf ("%08" BFD_VMA_FMT "x\n",
6644               (bfd_vma) BYTE_GET (imrs [i].sym_offset));
6645     }
6646
6647   free (imrs);
6648 }
6649
6650 /* Display IA-64 OpenVMS dynamic relocations and fixups.  */
6651
6652 static int
6653 process_ia64_vms_dynamic_relocs (FILE *file)
6654 {
6655   struct ia64_vms_dynfixup fixup;
6656   struct ia64_vms_dynimgrela imgrela;
6657   Elf_Internal_Dyn *entry;
6658   int res = 0;
6659   bfd_vma strtab_off = 0;
6660   bfd_vma strtab_sz = 0;
6661   char *strtab = NULL;
6662
6663   memset (&fixup, 0, sizeof (fixup));
6664   memset (&imgrela, 0, sizeof (imgrela));
6665
6666   /* Note: the order of the entries is specified by the OpenVMS specs.  */
6667   for (entry = dynamic_section;
6668        entry < dynamic_section + dynamic_nent;
6669        entry++)
6670     {
6671       switch (entry->d_tag)
6672         {
6673         case DT_IA_64_VMS_STRTAB_OFFSET:
6674           strtab_off = entry->d_un.d_val;
6675           break;
6676         case DT_STRSZ:
6677           strtab_sz = entry->d_un.d_val;
6678           if (strtab == NULL)
6679             strtab = get_data (NULL, file, dynamic_addr + strtab_off,
6680                                1, strtab_sz, _("dynamic string section"));
6681           break;
6682
6683         case DT_IA_64_VMS_NEEDED_IDENT:
6684           fixup.needed_ident = entry->d_un.d_val;
6685           break;
6686         case DT_NEEDED:
6687           fixup.needed = entry->d_un.d_val;
6688           break;
6689         case DT_IA_64_VMS_FIXUP_NEEDED:
6690           fixup.fixup_needed = entry->d_un.d_val;
6691           break;
6692         case DT_IA_64_VMS_FIXUP_RELA_CNT:
6693           fixup.fixup_rela_cnt = entry->d_un.d_val;
6694           break;
6695         case DT_IA_64_VMS_FIXUP_RELA_OFF:
6696           fixup.fixup_rela_off = entry->d_un.d_val;
6697           res++;
6698           dump_ia64_vms_dynamic_fixups (file, &fixup, strtab, strtab_sz);
6699           break;
6700
6701         case DT_IA_64_VMS_IMG_RELA_CNT:
6702           imgrela.img_rela_cnt = entry->d_un.d_val;
6703           break;
6704         case DT_IA_64_VMS_IMG_RELA_OFF:
6705           imgrela.img_rela_off = entry->d_un.d_val;
6706           res++;
6707           dump_ia64_vms_dynamic_relocs (file, &imgrela);
6708           break;
6709
6710         default:
6711           break;
6712         }
6713     }
6714
6715   if (strtab != NULL)
6716     free (strtab);
6717
6718   return res;
6719 }
6720
6721 static struct
6722 {
6723   const char * name;
6724   int reloc;
6725   int size;
6726   int rela;
6727 } dynamic_relocations [] =
6728 {
6729     { "REL", DT_REL, DT_RELSZ, FALSE },
6730     { "RELA", DT_RELA, DT_RELASZ, TRUE },
6731     { "PLT", DT_JMPREL, DT_PLTRELSZ, UNKNOWN }
6732 };
6733
6734 /* Process the reloc section.  */
6735
6736 static int
6737 process_relocs (FILE * file)
6738 {
6739   unsigned long rel_size;
6740   unsigned long rel_offset;
6741
6742
6743   if (!do_reloc)
6744     return 1;
6745
6746   if (do_using_dynamic)
6747     {
6748       int is_rela;
6749       const char * name;
6750       int has_dynamic_reloc;
6751       unsigned int i;
6752
6753       has_dynamic_reloc = 0;
6754
6755       for (i = 0; i < ARRAY_SIZE (dynamic_relocations); i++)
6756         {
6757           is_rela = dynamic_relocations [i].rela;
6758           name = dynamic_relocations [i].name;
6759           rel_size = dynamic_info [dynamic_relocations [i].size];
6760           rel_offset = dynamic_info [dynamic_relocations [i].reloc];
6761
6762           has_dynamic_reloc |= rel_size;
6763
6764           if (is_rela == UNKNOWN)
6765             {
6766               if (dynamic_relocations [i].reloc == DT_JMPREL)
6767                 switch (dynamic_info[DT_PLTREL])
6768                   {
6769                   case DT_REL:
6770                     is_rela = FALSE;
6771                     break;
6772                   case DT_RELA:
6773                     is_rela = TRUE;
6774                     break;
6775                   }
6776             }
6777
6778           if (rel_size)
6779             {
6780               printf
6781                 (_("\n'%s' relocation section at offset 0x%lx contains %ld bytes:\n"),
6782                  name, rel_offset, rel_size);
6783
6784               dump_relocations (file,
6785                                 offset_from_vma (file, rel_offset, rel_size),
6786                                 rel_size,
6787                                 dynamic_symbols, num_dynamic_syms,
6788                                 dynamic_strings, dynamic_strings_length,
6789                                 is_rela, 1);
6790             }
6791         }
6792
6793       if (is_ia64_vms ())
6794         has_dynamic_reloc |= process_ia64_vms_dynamic_relocs (file);
6795
6796       if (! has_dynamic_reloc)
6797         printf (_("\nThere are no dynamic relocations in this file.\n"));
6798     }
6799   else
6800     {
6801       Elf_Internal_Shdr * section;
6802       unsigned long i;
6803       int found = 0;
6804
6805       for (i = 0, section = section_headers;
6806            i < elf_header.e_shnum;
6807            i++, section++)
6808         {
6809           if (   section->sh_type != SHT_RELA
6810               && section->sh_type != SHT_REL)
6811             continue;
6812
6813           rel_offset = section->sh_offset;
6814           rel_size   = section->sh_size;
6815
6816           if (rel_size)
6817             {
6818               Elf_Internal_Shdr * strsec;
6819               int is_rela;
6820
6821               printf (_("\nRelocation section "));
6822
6823               if (string_table == NULL)
6824                 printf ("%d", section->sh_name);
6825               else
6826                 printf ("'%s'", printable_section_name (section));
6827
6828               printf (_(" at offset 0x%lx contains %lu entries:\n"),
6829                  rel_offset, (unsigned long) (rel_size / section->sh_entsize));
6830
6831               is_rela = section->sh_type == SHT_RELA;
6832
6833               if (section->sh_link != 0
6834                   && section->sh_link < elf_header.e_shnum)
6835                 {
6836                   Elf_Internal_Shdr * symsec;
6837                   Elf_Internal_Sym *  symtab;
6838                   unsigned long nsyms;
6839                   unsigned long strtablen = 0;
6840                   char * strtab = NULL;
6841
6842                   symsec = section_headers + section->sh_link;
6843                   if (symsec->sh_type != SHT_SYMTAB
6844                       && symsec->sh_type != SHT_DYNSYM)
6845                     continue;
6846
6847                   symtab = GET_ELF_SYMBOLS (file, symsec, & nsyms);
6848
6849                   if (symtab == NULL)
6850                     continue;
6851
6852                   if (symsec->sh_link != 0
6853                       && symsec->sh_link < elf_header.e_shnum)
6854                     {
6855                       strsec = section_headers + symsec->sh_link;
6856
6857                       strtab = (char *) get_data (NULL, file, strsec->sh_offset,
6858                                                   1, strsec->sh_size,
6859                                                   _("string table"));
6860                       strtablen = strtab == NULL ? 0 : strsec->sh_size;
6861                     }
6862
6863                   dump_relocations (file, rel_offset, rel_size,
6864                                     symtab, nsyms, strtab, strtablen,
6865                                     is_rela,
6866                                     symsec->sh_type == SHT_DYNSYM);
6867                   if (strtab)
6868                     free (strtab);
6869                   free (symtab);
6870                 }
6871               else
6872                 dump_relocations (file, rel_offset, rel_size,
6873                                   NULL, 0, NULL, 0, is_rela, 0);
6874
6875               found = 1;
6876             }
6877         }
6878
6879       if (! found)
6880         printf (_("\nThere are no relocations in this file.\n"));
6881     }
6882
6883   return 1;
6884 }
6885
6886 /* An absolute address consists of a section and an offset.  If the
6887    section is NULL, the offset itself is the address, otherwise, the
6888    address equals to LOAD_ADDRESS(section) + offset.  */
6889
6890 struct absaddr
6891 {
6892   unsigned short section;
6893   bfd_vma offset;
6894 };
6895
6896 #define ABSADDR(a) \
6897   ((a).section \
6898    ? section_headers [(a).section].sh_addr + (a).offset \
6899    : (a).offset)
6900
6901 /* Find the nearest symbol at or below ADDR.  Returns the symbol
6902    name, if found, and the offset from the symbol to ADDR.  */
6903
6904 static void
6905 find_symbol_for_address (Elf_Internal_Sym * symtab,
6906                          unsigned long      nsyms,
6907                          const char *       strtab,
6908                          unsigned long      strtab_size,
6909                          struct absaddr     addr,
6910                          const char **      symname,
6911                          bfd_vma *          offset)
6912 {
6913   bfd_vma dist = 0x100000;
6914   Elf_Internal_Sym * sym;
6915   Elf_Internal_Sym * beg;
6916   Elf_Internal_Sym * end;
6917   Elf_Internal_Sym * best = NULL;
6918
6919   REMOVE_ARCH_BITS (addr.offset);
6920   beg = symtab;
6921   end = symtab + nsyms;
6922
6923   while (beg < end)
6924     {
6925       bfd_vma value;
6926
6927       sym = beg + (end - beg) / 2;
6928
6929       value = sym->st_value;
6930       REMOVE_ARCH_BITS (value);
6931
6932       if (sym->st_name != 0
6933           && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
6934           && addr.offset >= value
6935           && addr.offset - value < dist)
6936         {
6937           best = sym;
6938           dist = addr.offset - value;
6939           if (!dist)
6940             break;
6941         }
6942
6943       if (addr.offset < value)
6944         end = sym;
6945       else
6946         beg = sym + 1;
6947     }
6948
6949   if (best)
6950     {
6951       *symname = (best->st_name >= strtab_size
6952                   ? _("<corrupt>") : strtab + best->st_name);
6953       *offset = dist;
6954       return;
6955     }
6956
6957   *symname = NULL;
6958   *offset = addr.offset;
6959 }
6960
6961 static int
6962 symcmp (const void *p, const void *q)
6963 {
6964   Elf_Internal_Sym *sp = (Elf_Internal_Sym *) p;
6965   Elf_Internal_Sym *sq = (Elf_Internal_Sym *) q;
6966
6967   return sp->st_value > sq->st_value ? 1 : (sp->st_value < sq->st_value ? -1 : 0);
6968 }
6969
6970 /* Process the unwind section.  */
6971
6972 #include "unwind-ia64.h"
6973
6974 struct ia64_unw_table_entry
6975 {
6976   struct absaddr start;
6977   struct absaddr end;
6978   struct absaddr info;
6979 };
6980
6981 struct ia64_unw_aux_info
6982 {
6983   struct ia64_unw_table_entry *table;   /* Unwind table.  */
6984   unsigned long table_len;              /* Length of unwind table.  */
6985   unsigned char * info;                 /* Unwind info.  */
6986   unsigned long info_size;              /* Size of unwind info.  */
6987   bfd_vma info_addr;                    /* Starting address of unwind info.  */
6988   bfd_vma seg_base;                     /* Starting address of segment.  */
6989   Elf_Internal_Sym * symtab;            /* The symbol table.  */
6990   unsigned long nsyms;                  /* Number of symbols.  */
6991   Elf_Internal_Sym * funtab;            /* Sorted table of STT_FUNC symbols.  */
6992   unsigned long nfuns;                  /* Number of entries in funtab.  */
6993   char * strtab;                        /* The string table.  */
6994   unsigned long strtab_size;            /* Size of string table.  */
6995 };
6996
6997 static void
6998 dump_ia64_unwind (struct ia64_unw_aux_info * aux)
6999 {
7000   struct ia64_unw_table_entry * tp;
7001   unsigned long j, nfuns;
7002   int in_body;
7003
7004   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7005   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7006     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7007       aux->funtab[nfuns++] = aux->symtab[j];
7008   aux->nfuns = nfuns;
7009   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7010
7011   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7012     {
7013       bfd_vma stamp;
7014       bfd_vma offset;
7015       const unsigned char * dp;
7016       const unsigned char * head;
7017       const unsigned char * end;
7018       const char * procname;
7019
7020       find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7021                                aux->strtab_size, tp->start, &procname, &offset);
7022
7023       fputs ("\n<", stdout);
7024
7025       if (procname)
7026         {
7027           fputs (procname, stdout);
7028
7029           if (offset)
7030             printf ("+%lx", (unsigned long) offset);
7031         }
7032
7033       fputs (">: [", stdout);
7034       print_vma (tp->start.offset, PREFIX_HEX);
7035       fputc ('-', stdout);
7036       print_vma (tp->end.offset, PREFIX_HEX);
7037       printf ("], info at +0x%lx\n",
7038               (unsigned long) (tp->info.offset - aux->seg_base));
7039
7040       /* PR 17531: file: 86232b32.  */
7041       if (aux->info == NULL)
7042         continue;
7043
7044       /* PR 17531: file: 0997b4d1.  */
7045       if ((ABSADDR (tp->info) - aux->info_addr) >= aux->info_size)
7046         {
7047           warn (_("Invalid offset %lx in table entry %ld\n"),
7048                 (long) tp->info.offset, (long) (tp - aux->table));
7049           continue;
7050         }
7051
7052       head = aux->info + (ABSADDR (tp->info) - aux->info_addr);
7053       stamp = byte_get ((unsigned char *) head, sizeof (stamp));
7054
7055       printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
7056               (unsigned) UNW_VER (stamp),
7057               (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
7058               UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
7059               UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
7060               (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
7061
7062       if (UNW_VER (stamp) != 1)
7063         {
7064           printf (_("\tUnknown version.\n"));
7065           continue;
7066         }
7067
7068       in_body = 0;
7069       end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
7070       /* PR 17531: file: 16ceda89.  */
7071       if (end > aux->info + aux->info_size)
7072         end = aux->info + aux->info_size;
7073       for (dp = head + 8; dp < end;)
7074         dp = unw_decode (dp, in_body, & in_body, end);
7075     }
7076
7077   free (aux->funtab);
7078 }
7079
7080 static bfd_boolean
7081 slurp_ia64_unwind_table (FILE * file,
7082                          struct ia64_unw_aux_info * aux,
7083                          Elf_Internal_Shdr * sec)
7084 {
7085   unsigned long size, nrelas, i;
7086   Elf_Internal_Phdr * seg;
7087   struct ia64_unw_table_entry * tep;
7088   Elf_Internal_Shdr * relsec;
7089   Elf_Internal_Rela * rela;
7090   Elf_Internal_Rela * rp;
7091   unsigned char * table;
7092   unsigned char * tp;
7093   Elf_Internal_Sym * sym;
7094   const char * relname;
7095
7096   aux->table_len = 0;
7097
7098   /* First, find the starting address of the segment that includes
7099      this section: */
7100
7101   if (elf_header.e_phnum)
7102     {
7103       if (! get_program_headers (file))
7104           return FALSE;
7105
7106       for (seg = program_headers;
7107            seg < program_headers + elf_header.e_phnum;
7108            ++seg)
7109         {
7110           if (seg->p_type != PT_LOAD)
7111             continue;
7112
7113           if (sec->sh_addr >= seg->p_vaddr
7114               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7115             {
7116               aux->seg_base = seg->p_vaddr;
7117               break;
7118             }
7119         }
7120     }
7121
7122   /* Second, build the unwind table from the contents of the unwind section:  */
7123   size = sec->sh_size;
7124   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7125                                       _("unwind table"));
7126   if (!table)
7127     return FALSE;
7128
7129   aux->table_len = size / (3 * eh_addr_size);
7130   aux->table = (struct ia64_unw_table_entry *)
7131     xcmalloc (aux->table_len, sizeof (aux->table[0]));
7132   tep = aux->table;
7133
7134   for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
7135     {
7136       tep->start.section = SHN_UNDEF;
7137       tep->end.section   = SHN_UNDEF;
7138       tep->info.section  = SHN_UNDEF;
7139       tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7140       tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7141       tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
7142       tep->start.offset += aux->seg_base;
7143       tep->end.offset   += aux->seg_base;
7144       tep->info.offset  += aux->seg_base;
7145     }
7146   free (table);
7147
7148   /* Third, apply any relocations to the unwind table:  */
7149   for (relsec = section_headers;
7150        relsec < section_headers + elf_header.e_shnum;
7151        ++relsec)
7152     {
7153       if (relsec->sh_type != SHT_RELA
7154           || relsec->sh_info >= elf_header.e_shnum
7155           || section_headers + relsec->sh_info != sec)
7156         continue;
7157
7158       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7159                               & rela, & nrelas))
7160         {
7161           free (aux->table);
7162           aux->table = NULL;
7163           aux->table_len = 0;
7164           return FALSE;
7165         }
7166
7167       for (rp = rela; rp < rela + nrelas; ++rp)
7168         {
7169           relname = elf_ia64_reloc_type (get_reloc_type (rp->r_info));
7170           sym = aux->symtab + get_reloc_symindex (rp->r_info);
7171
7172           /* PR 17531: file: 9fa67536.  */
7173           if (relname == NULL)
7174             {
7175               warn (_("Skipping unknown relocation type: %u\n"), get_reloc_type (rp->r_info));
7176               continue;
7177             }
7178
7179           if (! const_strneq (relname, "R_IA64_SEGREL"))
7180             {
7181               warn (_("Skipping unexpected relocation type: %s\n"), relname);
7182               continue;
7183             }
7184
7185           i = rp->r_offset / (3 * eh_addr_size);
7186
7187           /* PR 17531: file: 5bc8d9bf.  */
7188           if (i >= aux->table_len)
7189             {
7190               warn (_("Skipping reloc with overlarge offset: %lx\n"), i);
7191               continue;
7192             }
7193
7194           switch (rp->r_offset / eh_addr_size % 3)
7195             {
7196             case 0:
7197               aux->table[i].start.section = sym->st_shndx;
7198               aux->table[i].start.offset  = rp->r_addend + sym->st_value;
7199               break;
7200             case 1:
7201               aux->table[i].end.section   = sym->st_shndx;
7202               aux->table[i].end.offset    = rp->r_addend + sym->st_value;
7203               break;
7204             case 2:
7205               aux->table[i].info.section  = sym->st_shndx;
7206               aux->table[i].info.offset   = rp->r_addend + sym->st_value;
7207               break;
7208             default:
7209               break;
7210             }
7211         }
7212
7213       free (rela);
7214     }
7215
7216   return TRUE;
7217 }
7218
7219 static void
7220 ia64_process_unwind (FILE * file)
7221 {
7222   Elf_Internal_Shdr * sec;
7223   Elf_Internal_Shdr * unwsec = NULL;
7224   Elf_Internal_Shdr * strsec;
7225   unsigned long i, unwcount = 0, unwstart = 0;
7226   struct ia64_unw_aux_info aux;
7227
7228   memset (& aux, 0, sizeof (aux));
7229
7230   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7231     {
7232       if (sec->sh_type == SHT_SYMTAB
7233           && sec->sh_link < elf_header.e_shnum)
7234         {
7235           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7236
7237           strsec = section_headers + sec->sh_link;
7238           if (aux.strtab != NULL)
7239             {
7240               error (_("Multiple auxillary string tables encountered\n"));
7241               free (aux.strtab);
7242             }
7243           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7244                                           1, strsec->sh_size,
7245                                           _("string table"));
7246           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7247         }
7248       else if (sec->sh_type == SHT_IA_64_UNWIND)
7249         unwcount++;
7250     }
7251
7252   if (!unwcount)
7253     printf (_("\nThere are no unwind sections in this file.\n"));
7254
7255   while (unwcount-- > 0)
7256     {
7257       char * suffix;
7258       size_t len, len2;
7259
7260       for (i = unwstart, sec = section_headers + unwstart, unwsec = NULL;
7261            i < elf_header.e_shnum; ++i, ++sec)
7262         if (sec->sh_type == SHT_IA_64_UNWIND)
7263           {
7264             unwsec = sec;
7265             break;
7266           }
7267       /* We have already counted the number of SHT_IA64_UNWIND
7268          sections so the loop above should never fail.  */
7269       assert (unwsec != NULL);
7270
7271       unwstart = i + 1;
7272       len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
7273
7274       if ((unwsec->sh_flags & SHF_GROUP) != 0)
7275         {
7276           /* We need to find which section group it is in.  */
7277           struct group_list * g;
7278
7279           if (section_headers_groups == NULL
7280               || section_headers_groups [i] == NULL)
7281             i = elf_header.e_shnum;
7282           else
7283             {
7284               g = section_headers_groups [i]->root;
7285
7286               for (; g != NULL; g = g->next)
7287                 {
7288                   sec = section_headers + g->section_index;
7289
7290                   if (streq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info))
7291                     break;
7292                 }
7293
7294               if (g == NULL)
7295                 i = elf_header.e_shnum;
7296             }
7297         }
7298       else if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind_once, len))
7299         {
7300           /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
7301           len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
7302           suffix = SECTION_NAME (unwsec) + len;
7303           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7304                ++i, ++sec)
7305             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info_once, len2)
7306                 && streq (SECTION_NAME (sec) + len2, suffix))
7307               break;
7308         }
7309       else
7310         {
7311           /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
7312              .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
7313           len = sizeof (ELF_STRING_ia64_unwind) - 1;
7314           len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
7315           suffix = "";
7316           if (strneq (SECTION_NAME (unwsec), ELF_STRING_ia64_unwind, len))
7317             suffix = SECTION_NAME (unwsec) + len;
7318           for (i = 0, sec = section_headers; i < elf_header.e_shnum;
7319                ++i, ++sec)
7320             if (strneq (SECTION_NAME (sec), ELF_STRING_ia64_unwind_info, len2)
7321                 && streq (SECTION_NAME (sec) + len2, suffix))
7322               break;
7323         }
7324
7325       if (i == elf_header.e_shnum)
7326         {
7327           printf (_("\nCould not find unwind info section for "));
7328
7329           if (string_table == NULL)
7330             printf ("%d", unwsec->sh_name);
7331           else
7332             printf ("'%s'", printable_section_name (unwsec));
7333         }
7334       else
7335         {
7336           aux.info_addr = sec->sh_addr;
7337           aux.info = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1,
7338                                                  sec->sh_size,
7339                                                  _("unwind info"));
7340           aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
7341
7342           printf (_("\nUnwind section "));
7343
7344           if (string_table == NULL)
7345             printf ("%d", unwsec->sh_name);
7346           else
7347             printf ("'%s'", printable_section_name (unwsec));
7348
7349           printf (_(" at offset 0x%lx contains %lu entries:\n"),
7350                   (unsigned long) unwsec->sh_offset,
7351                   (unsigned long) (unwsec->sh_size / (3 * eh_addr_size)));
7352
7353           if (slurp_ia64_unwind_table (file, & aux, unwsec)
7354               && aux.table_len > 0)
7355             dump_ia64_unwind (& aux);
7356
7357           if (aux.table)
7358             free ((char *) aux.table);
7359           if (aux.info)
7360             free ((char *) aux.info);
7361           aux.table = NULL;
7362           aux.info = NULL;
7363         }
7364     }
7365
7366   if (aux.symtab)
7367     free (aux.symtab);
7368   if (aux.strtab)
7369     free ((char *) aux.strtab);
7370 }
7371
7372 struct hppa_unw_table_entry
7373   {
7374     struct absaddr start;
7375     struct absaddr end;
7376     unsigned int Cannot_unwind:1;               /* 0 */
7377     unsigned int Millicode:1;                   /* 1 */
7378     unsigned int Millicode_save_sr0:1;          /* 2 */
7379     unsigned int Region_description:2;          /* 3..4 */
7380     unsigned int reserved1:1;                   /* 5 */
7381     unsigned int Entry_SR:1;                    /* 6 */
7382     unsigned int Entry_FR:4;     /* number saved */     /* 7..10 */
7383     unsigned int Entry_GR:5;     /* number saved */     /* 11..15 */
7384     unsigned int Args_stored:1;                 /* 16 */
7385     unsigned int Variable_Frame:1;              /* 17 */
7386     unsigned int Separate_Package_Body:1;       /* 18 */
7387     unsigned int Frame_Extension_Millicode:1;   /* 19 */
7388     unsigned int Stack_Overflow_Check:1;        /* 20 */
7389     unsigned int Two_Instruction_SP_Increment:1;/* 21 */
7390     unsigned int Ada_Region:1;                  /* 22 */
7391     unsigned int cxx_info:1;                    /* 23 */
7392     unsigned int cxx_try_catch:1;               /* 24 */
7393     unsigned int sched_entry_seq:1;             /* 25 */
7394     unsigned int reserved2:1;                   /* 26 */
7395     unsigned int Save_SP:1;                     /* 27 */
7396     unsigned int Save_RP:1;                     /* 28 */
7397     unsigned int Save_MRP_in_frame:1;           /* 29 */
7398     unsigned int extn_ptr_defined:1;            /* 30 */
7399     unsigned int Cleanup_defined:1;             /* 31 */
7400
7401     unsigned int MPE_XL_interrupt_marker:1;     /* 0 */
7402     unsigned int HP_UX_interrupt_marker:1;      /* 1 */
7403     unsigned int Large_frame:1;                 /* 2 */
7404     unsigned int Pseudo_SP_Set:1;               /* 3 */
7405     unsigned int reserved4:1;                   /* 4 */
7406     unsigned int Total_frame_size:27;           /* 5..31 */
7407   };
7408
7409 struct hppa_unw_aux_info
7410 {
7411   struct hppa_unw_table_entry * table;  /* Unwind table.  */
7412   unsigned long table_len;              /* Length of unwind table.  */
7413   bfd_vma seg_base;                     /* Starting address of segment.  */
7414   Elf_Internal_Sym * symtab;            /* The symbol table.  */
7415   unsigned long nsyms;                  /* Number of symbols.  */
7416   Elf_Internal_Sym * funtab;            /* Sorted table of STT_FUNC symbols.  */
7417   unsigned long nfuns;                  /* Number of entries in funtab.  */
7418   char * strtab;                        /* The string table.  */
7419   unsigned long strtab_size;            /* Size of string table.  */
7420 };
7421
7422 static void
7423 dump_hppa_unwind (struct hppa_unw_aux_info * aux)
7424 {
7425   struct hppa_unw_table_entry * tp;
7426   unsigned long j, nfuns;
7427
7428   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
7429   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
7430     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
7431       aux->funtab[nfuns++] = aux->symtab[j];
7432   aux->nfuns = nfuns;
7433   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
7434
7435   for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
7436     {
7437       bfd_vma offset;
7438       const char * procname;
7439
7440       find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7441                                aux->strtab_size, tp->start, &procname,
7442                                &offset);
7443
7444       fputs ("\n<", stdout);
7445
7446       if (procname)
7447         {
7448           fputs (procname, stdout);
7449
7450           if (offset)
7451             printf ("+%lx", (unsigned long) offset);
7452         }
7453
7454       fputs (">: [", stdout);
7455       print_vma (tp->start.offset, PREFIX_HEX);
7456       fputc ('-', stdout);
7457       print_vma (tp->end.offset, PREFIX_HEX);
7458       printf ("]\n\t");
7459
7460 #define PF(_m) if (tp->_m) printf (#_m " ");
7461 #define PV(_m) if (tp->_m) printf (#_m "=%d ", tp->_m);
7462       PF(Cannot_unwind);
7463       PF(Millicode);
7464       PF(Millicode_save_sr0);
7465       /* PV(Region_description);  */
7466       PF(Entry_SR);
7467       PV(Entry_FR);
7468       PV(Entry_GR);
7469       PF(Args_stored);
7470       PF(Variable_Frame);
7471       PF(Separate_Package_Body);
7472       PF(Frame_Extension_Millicode);
7473       PF(Stack_Overflow_Check);
7474       PF(Two_Instruction_SP_Increment);
7475       PF(Ada_Region);
7476       PF(cxx_info);
7477       PF(cxx_try_catch);
7478       PF(sched_entry_seq);
7479       PF(Save_SP);
7480       PF(Save_RP);
7481       PF(Save_MRP_in_frame);
7482       PF(extn_ptr_defined);
7483       PF(Cleanup_defined);
7484       PF(MPE_XL_interrupt_marker);
7485       PF(HP_UX_interrupt_marker);
7486       PF(Large_frame);
7487       PF(Pseudo_SP_Set);
7488       PV(Total_frame_size);
7489 #undef PF
7490 #undef PV
7491     }
7492
7493   printf ("\n");
7494
7495   free (aux->funtab);
7496 }
7497
7498 static int
7499 slurp_hppa_unwind_table (FILE * file,
7500                          struct hppa_unw_aux_info * aux,
7501                          Elf_Internal_Shdr * sec)
7502 {
7503   unsigned long size, unw_ent_size, nentries, nrelas, i;
7504   Elf_Internal_Phdr * seg;
7505   struct hppa_unw_table_entry * tep;
7506   Elf_Internal_Shdr * relsec;
7507   Elf_Internal_Rela * rela;
7508   Elf_Internal_Rela * rp;
7509   unsigned char * table;
7510   unsigned char * tp;
7511   Elf_Internal_Sym * sym;
7512   const char * relname;
7513
7514   /* First, find the starting address of the segment that includes
7515      this section.  */
7516
7517   if (elf_header.e_phnum)
7518     {
7519       if (! get_program_headers (file))
7520         return 0;
7521
7522       for (seg = program_headers;
7523            seg < program_headers + elf_header.e_phnum;
7524            ++seg)
7525         {
7526           if (seg->p_type != PT_LOAD)
7527             continue;
7528
7529           if (sec->sh_addr >= seg->p_vaddr
7530               && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
7531             {
7532               aux->seg_base = seg->p_vaddr;
7533               break;
7534             }
7535         }
7536     }
7537
7538   /* Second, build the unwind table from the contents of the unwind
7539      section.  */
7540   size = sec->sh_size;
7541   table = (unsigned char *) get_data (NULL, file, sec->sh_offset, 1, size,
7542                                       _("unwind table"));
7543   if (!table)
7544     return 0;
7545
7546   unw_ent_size = 16;
7547   nentries = size / unw_ent_size;
7548   size = unw_ent_size * nentries;
7549
7550   tep = aux->table = (struct hppa_unw_table_entry *)
7551       xcmalloc (nentries, sizeof (aux->table[0]));
7552
7553   for (tp = table; tp < table + size; tp += unw_ent_size, ++tep)
7554     {
7555       unsigned int tmp1, tmp2;
7556
7557       tep->start.section = SHN_UNDEF;
7558       tep->end.section   = SHN_UNDEF;
7559
7560       tep->start.offset = byte_get ((unsigned char *) tp + 0, 4);
7561       tep->end.offset = byte_get ((unsigned char *) tp + 4, 4);
7562       tmp1 = byte_get ((unsigned char *) tp + 8, 4);
7563       tmp2 = byte_get ((unsigned char *) tp + 12, 4);
7564
7565       tep->start.offset += aux->seg_base;
7566       tep->end.offset   += aux->seg_base;
7567
7568       tep->Cannot_unwind = (tmp1 >> 31) & 0x1;
7569       tep->Millicode = (tmp1 >> 30) & 0x1;
7570       tep->Millicode_save_sr0 = (tmp1 >> 29) & 0x1;
7571       tep->Region_description = (tmp1 >> 27) & 0x3;
7572       tep->reserved1 = (tmp1 >> 26) & 0x1;
7573       tep->Entry_SR = (tmp1 >> 25) & 0x1;
7574       tep->Entry_FR = (tmp1 >> 21) & 0xf;
7575       tep->Entry_GR = (tmp1 >> 16) & 0x1f;
7576       tep->Args_stored = (tmp1 >> 15) & 0x1;
7577       tep->Variable_Frame = (tmp1 >> 14) & 0x1;
7578       tep->Separate_Package_Body = (tmp1 >> 13) & 0x1;
7579       tep->Frame_Extension_Millicode = (tmp1 >> 12) & 0x1;
7580       tep->Stack_Overflow_Check = (tmp1 >> 11) & 0x1;
7581       tep->Two_Instruction_SP_Increment = (tmp1 >> 10) & 0x1;
7582       tep->Ada_Region = (tmp1 >> 9) & 0x1;
7583       tep->cxx_info = (tmp1 >> 8) & 0x1;
7584       tep->cxx_try_catch = (tmp1 >> 7) & 0x1;
7585       tep->sched_entry_seq = (tmp1 >> 6) & 0x1;
7586       tep->reserved2 = (tmp1 >> 5) & 0x1;
7587       tep->Save_SP = (tmp1 >> 4) & 0x1;
7588       tep->Save_RP = (tmp1 >> 3) & 0x1;
7589       tep->Save_MRP_in_frame = (tmp1 >> 2) & 0x1;
7590       tep->extn_ptr_defined = (tmp1 >> 1) & 0x1;
7591       tep->Cleanup_defined = tmp1 & 0x1;
7592
7593       tep->MPE_XL_interrupt_marker = (tmp2 >> 31) & 0x1;
7594       tep->HP_UX_interrupt_marker = (tmp2 >> 30) & 0x1;
7595       tep->Large_frame = (tmp2 >> 29) & 0x1;
7596       tep->Pseudo_SP_Set = (tmp2 >> 28) & 0x1;
7597       tep->reserved4 = (tmp2 >> 27) & 0x1;
7598       tep->Total_frame_size = tmp2 & 0x7ffffff;
7599     }
7600   free (table);
7601
7602   /* Third, apply any relocations to the unwind table.  */
7603   for (relsec = section_headers;
7604        relsec < section_headers + elf_header.e_shnum;
7605        ++relsec)
7606     {
7607       if (relsec->sh_type != SHT_RELA
7608           || relsec->sh_info >= elf_header.e_shnum
7609           || section_headers + relsec->sh_info != sec)
7610         continue;
7611
7612       if (!slurp_rela_relocs (file, relsec->sh_offset, relsec->sh_size,
7613                               & rela, & nrelas))
7614         return 0;
7615
7616       for (rp = rela; rp < rela + nrelas; ++rp)
7617         {
7618           relname = elf_hppa_reloc_type (get_reloc_type (rp->r_info));
7619           sym = aux->symtab + get_reloc_symindex (rp->r_info);
7620
7621           /* R_PARISC_SEGREL32 or R_PARISC_SEGREL64.  */
7622           if (! const_strneq (relname, "R_PARISC_SEGREL"))
7623             {
7624               warn (_("Skipping unexpected relocation type %s\n"), relname);
7625               continue;
7626             }
7627
7628           i = rp->r_offset / unw_ent_size;
7629
7630           switch ((rp->r_offset % unw_ent_size) / eh_addr_size)
7631             {
7632             case 0:
7633               aux->table[i].start.section = sym->st_shndx;
7634               aux->table[i].start.offset  = sym->st_value + rp->r_addend;
7635               break;
7636             case 1:
7637               aux->table[i].end.section   = sym->st_shndx;
7638               aux->table[i].end.offset    = sym->st_value + rp->r_addend;
7639               break;
7640             default:
7641               break;
7642             }
7643         }
7644
7645       free (rela);
7646     }
7647
7648   aux->table_len = nentries;
7649
7650   return 1;
7651 }
7652
7653 static void
7654 hppa_process_unwind (FILE * file)
7655 {
7656   struct hppa_unw_aux_info aux;
7657   Elf_Internal_Shdr * unwsec = NULL;
7658   Elf_Internal_Shdr * strsec;
7659   Elf_Internal_Shdr * sec;
7660   unsigned long i;
7661
7662   if (string_table == NULL)
7663     return;
7664
7665   memset (& aux, 0, sizeof (aux));
7666
7667   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7668     {
7669       if (sec->sh_type == SHT_SYMTAB
7670           && sec->sh_link < elf_header.e_shnum)
7671         {
7672           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
7673
7674           strsec = section_headers + sec->sh_link;
7675           if (aux.strtab != NULL)
7676             {
7677               error (_("Multiple auxillary string tables encountered\n"));
7678               free (aux.strtab);
7679             }
7680           aux.strtab = (char *) get_data (NULL, file, strsec->sh_offset,
7681                                           1, strsec->sh_size,
7682                                           _("string table"));
7683           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
7684         }
7685       else if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7686         unwsec = sec;
7687     }
7688
7689   if (!unwsec)
7690     printf (_("\nThere are no unwind sections in this file.\n"));
7691
7692   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
7693     {
7694       if (streq (SECTION_NAME (sec), ".PARISC.unwind"))
7695         {
7696           printf (_("\nUnwind section '%s' at offset 0x%lx contains %lu entries:\n"),
7697                   printable_section_name (sec),
7698                   (unsigned long) sec->sh_offset,
7699                   (unsigned long) (sec->sh_size / (2 * eh_addr_size + 8)));
7700
7701           slurp_hppa_unwind_table (file, &aux, sec);
7702           if (aux.table_len > 0)
7703             dump_hppa_unwind (&aux);
7704
7705           if (aux.table)
7706             free ((char *) aux.table);
7707           aux.table = NULL;
7708         }
7709     }
7710
7711   if (aux.symtab)
7712     free (aux.symtab);
7713   if (aux.strtab)
7714     free ((char *) aux.strtab);
7715 }
7716
7717 struct arm_section
7718 {
7719   unsigned char *      data;            /* The unwind data.  */
7720   Elf_Internal_Shdr *  sec;             /* The cached unwind section header.  */
7721   Elf_Internal_Rela *  rela;            /* The cached relocations for this section.  */
7722   unsigned long        nrelas;          /* The number of relocations.  */
7723   unsigned int         rel_type;        /* REL or RELA ?  */
7724   Elf_Internal_Rela *  next_rela;       /* Cyclic pointer to the next reloc to process.  */
7725 };
7726
7727 struct arm_unw_aux_info
7728 {
7729   FILE *              file;             /* The file containing the unwind sections.  */
7730   Elf_Internal_Sym *  symtab;           /* The file's symbol table.  */
7731   unsigned long       nsyms;            /* Number of symbols.  */
7732   Elf_Internal_Sym *  funtab;           /* Sorted table of STT_FUNC symbols.  */
7733   unsigned long       nfuns;            /* Number of these symbols.  */
7734   char *              strtab;           /* The file's string table.  */
7735   unsigned long       strtab_size;      /* Size of string table.  */
7736 };
7737
7738 static const char *
7739 arm_print_vma_and_name (struct arm_unw_aux_info *aux,
7740                         bfd_vma fn, struct absaddr addr)
7741 {
7742   const char *procname;
7743   bfd_vma sym_offset;
7744
7745   if (addr.section == SHN_UNDEF)
7746     addr.offset = fn;
7747
7748   find_symbol_for_address (aux->funtab, aux->nfuns, aux->strtab,
7749                            aux->strtab_size, addr, &procname,
7750                            &sym_offset);
7751
7752   print_vma (fn, PREFIX_HEX);
7753
7754   if (procname)
7755     {
7756       fputs (" <", stdout);
7757       fputs (procname, stdout);
7758
7759       if (sym_offset)
7760         printf ("+0x%lx", (unsigned long) sym_offset);
7761       fputc ('>', stdout);
7762     }
7763
7764   return procname;
7765 }
7766
7767 static void
7768 arm_free_section (struct arm_section *arm_sec)
7769 {
7770   if (arm_sec->data != NULL)
7771     free (arm_sec->data);
7772
7773   if (arm_sec->rela != NULL)
7774     free (arm_sec->rela);
7775 }
7776
7777 /* 1) If SEC does not match the one cached in ARM_SEC, then free the current
7778       cached section and install SEC instead.
7779    2) Locate the 32-bit word at WORD_OFFSET in unwind section SEC
7780       and return its valued in * WORDP, relocating if necessary.
7781    3) Update the NEXT_RELA field in ARM_SEC and store the section index and
7782       relocation's offset in ADDR.
7783    4) If SYM_NAME is non-NULL and a relocation was applied, record the offset
7784       into the string table of the symbol associated with the reloc.  If no
7785       reloc was applied store -1 there.
7786    5) Return TRUE upon success, FALSE otherwise.  */
7787
7788 static bfd_boolean
7789 get_unwind_section_word (struct arm_unw_aux_info *  aux,
7790                          struct arm_section *       arm_sec,
7791                          Elf_Internal_Shdr *        sec,
7792                          bfd_vma                    word_offset,
7793                          unsigned int *             wordp,
7794                          struct absaddr *           addr,
7795                          bfd_vma *                  sym_name)
7796 {
7797   Elf_Internal_Rela *rp;
7798   Elf_Internal_Sym *sym;
7799   const char * relname;
7800   unsigned int word;
7801   bfd_boolean wrapped;
7802
7803   if (sec == NULL || arm_sec == NULL)
7804     return FALSE;
7805
7806   addr->section = SHN_UNDEF;
7807   addr->offset = 0;
7808
7809   if (sym_name != NULL)
7810     *sym_name = (bfd_vma) -1;
7811
7812   /* If necessary, update the section cache.  */
7813   if (sec != arm_sec->sec)
7814     {
7815       Elf_Internal_Shdr *relsec;
7816
7817       arm_free_section (arm_sec);
7818
7819       arm_sec->sec = sec;
7820       arm_sec->data = get_data (NULL, aux->file, sec->sh_offset, 1,
7821                                 sec->sh_size, _("unwind data"));
7822       arm_sec->rela = NULL;
7823       arm_sec->nrelas = 0;
7824
7825       for (relsec = section_headers;
7826            relsec < section_headers + elf_header.e_shnum;
7827            ++relsec)
7828         {
7829           if (relsec->sh_info >= elf_header.e_shnum
7830               || section_headers + relsec->sh_info != sec
7831               /* PR 15745: Check the section type as well.  */
7832               || (relsec->sh_type != SHT_REL
7833                   && relsec->sh_type != SHT_RELA))
7834             continue;
7835
7836           arm_sec->rel_type = relsec->sh_type;
7837           if (relsec->sh_type == SHT_REL)
7838             {
7839               if (!slurp_rel_relocs (aux->file, relsec->sh_offset,
7840                                      relsec->sh_size,
7841                                      & arm_sec->rela, & arm_sec->nrelas))
7842                 return FALSE;
7843             }
7844           else /* relsec->sh_type == SHT_RELA */
7845             {
7846               if (!slurp_rela_relocs (aux->file, relsec->sh_offset,
7847                                       relsec->sh_size,
7848                                       & arm_sec->rela, & arm_sec->nrelas))
7849                 return FALSE;
7850             }
7851           break;
7852         }
7853
7854       arm_sec->next_rela = arm_sec->rela;
7855     }
7856
7857   /* If there is no unwind data we can do nothing.  */
7858   if (arm_sec->data == NULL)
7859     return FALSE;
7860
7861   /* If the offset is invalid then fail.  */
7862   if (word_offset > (sec->sh_size - 4)
7863       /* PR 18879 */
7864       || (sec->sh_size < 5 && word_offset >= sec->sh_size)
7865       || ((bfd_signed_vma) word_offset) < 0)
7866     return FALSE;
7867
7868   /* Get the word at the required offset.  */
7869   word = byte_get (arm_sec->data + word_offset, 4);
7870
7871   /* PR 17531: file: id:000001,src:001266+003044,op:splice,rep:128.  */
7872   if (arm_sec->rela == NULL)
7873     {
7874       * wordp = word;
7875       return TRUE;
7876     }
7877
7878   /* Look through the relocs to find the one that applies to the provided offset.  */
7879   wrapped = FALSE;
7880   for (rp = arm_sec->next_rela; rp != arm_sec->rela + arm_sec->nrelas; rp++)
7881     {
7882       bfd_vma prelval, offset;
7883
7884       if (rp->r_offset > word_offset && !wrapped)
7885         {
7886           rp = arm_sec->rela;
7887           wrapped = TRUE;
7888         }
7889       if (rp->r_offset > word_offset)
7890         break;
7891
7892       if (rp->r_offset & 3)
7893         {
7894           warn (_("Skipping unexpected relocation at offset 0x%lx\n"),
7895                 (unsigned long) rp->r_offset);
7896           continue;
7897         }
7898
7899       if (rp->r_offset < word_offset)
7900         continue;
7901
7902       /* PR 17531: file: 027-161405-0.004  */
7903       if (aux->symtab == NULL)
7904         continue;
7905
7906       if (arm_sec->rel_type == SHT_REL)
7907         {
7908           offset = word & 0x7fffffff;
7909           if (offset & 0x40000000)
7910             offset |= ~ (bfd_vma) 0x7fffffff;
7911         }
7912       else if (arm_sec->rel_type == SHT_RELA)
7913         offset = rp->r_addend;
7914       else
7915         {
7916           error (_("Unknown section relocation type %d encountered\n"),
7917                  arm_sec->rel_type);
7918           break;
7919         }
7920
7921       /* PR 17531 file: 027-1241568-0.004.  */
7922       if (ELF32_R_SYM (rp->r_info) >= aux->nsyms)
7923         {
7924           error (_("Bad symbol index in unwind relocation (%lu > %lu)\n"),
7925                  (unsigned long) ELF32_R_SYM (rp->r_info), aux->nsyms);
7926           break;
7927         }
7928
7929       sym = aux->symtab + ELF32_R_SYM (rp->r_info);
7930       offset += sym->st_value;
7931       prelval = offset - (arm_sec->sec->sh_addr + rp->r_offset);
7932
7933       /* Check that we are processing the expected reloc type.  */
7934       if (elf_header.e_machine == EM_ARM)
7935         {
7936           relname = elf_arm_reloc_type (ELF32_R_TYPE (rp->r_info));
7937           if (relname == NULL)
7938             {
7939               warn (_("Skipping unknown ARM relocation type: %d\n"),
7940                     (int) ELF32_R_TYPE (rp->r_info));
7941               continue;
7942             }
7943
7944           if (streq (relname, "R_ARM_NONE"))
7945               continue;
7946
7947           if (! streq (relname, "R_ARM_PREL31"))
7948             {
7949               warn (_("Skipping unexpected ARM relocation type %s\n"), relname);
7950               continue;
7951             }
7952         }
7953       else if (elf_header.e_machine == EM_TI_C6000)
7954         {
7955           relname = elf_tic6x_reloc_type (ELF32_R_TYPE (rp->r_info));
7956           if (relname == NULL)
7957             {
7958               warn (_("Skipping unknown C6000 relocation type: %d\n"),
7959                     (int) ELF32_R_TYPE (rp->r_info));
7960               continue;
7961             }
7962
7963           if (streq (relname, "R_C6000_NONE"))
7964             continue;
7965
7966           if (! streq (relname, "R_C6000_PREL31"))
7967             {
7968               warn (_("Skipping unexpected C6000 relocation type %s\n"), relname);
7969               continue;
7970             }
7971
7972           prelval >>= 1;
7973         }
7974       else
7975         {
7976           /* This function currently only supports ARM and TI unwinders.  */
7977           warn (_("Only TI and ARM unwinders are currently supported\n"));
7978           break;
7979         }
7980
7981       word = (word & ~ (bfd_vma) 0x7fffffff) | (prelval & 0x7fffffff);
7982       addr->section = sym->st_shndx;
7983       addr->offset = offset;
7984
7985       if (sym_name)
7986         * sym_name = sym->st_name;
7987       break;
7988     }
7989
7990   *wordp = word;
7991   arm_sec->next_rela = rp;
7992
7993   return TRUE;
7994 }
7995
7996 static const char *tic6x_unwind_regnames[16] =
7997 {
7998   "A15", "B15", "B14", "B13", "B12", "B11", "B10", "B3",
7999   "A14", "A13", "A12", "A11", "A10",
8000   "[invalid reg 13]", "[invalid reg 14]", "[invalid reg 15]"
8001 };
8002
8003 static void
8004 decode_tic6x_unwind_regmask (unsigned int mask)
8005 {
8006   int i;
8007
8008   for (i = 12; mask; mask >>= 1, i--)
8009     {
8010       if (mask & 1)
8011         {
8012           fputs (tic6x_unwind_regnames[i], stdout);
8013           if (mask > 1)
8014             fputs (", ", stdout);
8015         }
8016     }
8017 }
8018
8019 #define ADVANCE                                                 \
8020   if (remaining == 0 && more_words)                             \
8021     {                                                           \
8022       data_offset += 4;                                         \
8023       if (! get_unwind_section_word (aux, data_arm_sec, data_sec,       \
8024                                      data_offset, & word, & addr, NULL))        \
8025         return;                                                 \
8026       remaining = 4;                                            \
8027       more_words--;                                             \
8028     }                                                           \
8029
8030 #define GET_OP(OP)                      \
8031   ADVANCE;                              \
8032   if (remaining)                        \
8033     {                                   \
8034       remaining--;                      \
8035       (OP) = word >> 24;                \
8036       word <<= 8;                       \
8037     }                                   \
8038   else                                  \
8039     {                                   \
8040       printf (_("[Truncated opcode]\n"));       \
8041       return;                           \
8042     }                                   \
8043   printf ("0x%02x ", OP)
8044
8045 static void
8046 decode_arm_unwind_bytecode (struct arm_unw_aux_info *  aux,
8047                             unsigned int               word,
8048                             unsigned int               remaining,
8049                             unsigned int               more_words,
8050                             bfd_vma                    data_offset,
8051                             Elf_Internal_Shdr *        data_sec,
8052                             struct arm_section *       data_arm_sec)
8053 {
8054   struct absaddr addr;
8055
8056   /* Decode the unwinding instructions.  */
8057   while (1)
8058     {
8059       unsigned int op, op2;
8060
8061       ADVANCE;
8062       if (remaining == 0)
8063         break;
8064       remaining--;
8065       op = word >> 24;
8066       word <<= 8;
8067
8068       printf ("  0x%02x ", op);
8069
8070       if ((op & 0xc0) == 0x00)
8071         {
8072           int offset = ((op & 0x3f) << 2) + 4;
8073
8074           printf ("     vsp = vsp + %d", offset);
8075         }
8076       else if ((op & 0xc0) == 0x40)
8077         {
8078           int offset = ((op & 0x3f) << 2) + 4;
8079
8080           printf ("     vsp = vsp - %d", offset);
8081         }
8082       else if ((op & 0xf0) == 0x80)
8083         {
8084           GET_OP (op2);
8085           if (op == 0x80 && op2 == 0)
8086             printf (_("Refuse to unwind"));
8087           else
8088             {
8089               unsigned int mask = ((op & 0x0f) << 8) | op2;
8090               int first = 1;
8091               int i;
8092
8093               printf ("pop {");
8094               for (i = 0; i < 12; i++)
8095                 if (mask & (1 << i))
8096                   {
8097                     if (first)
8098                       first = 0;
8099                     else
8100                       printf (", ");
8101                     printf ("r%d", 4 + i);
8102                   }
8103               printf ("}");
8104             }
8105         }
8106       else if ((op & 0xf0) == 0x90)
8107         {
8108           if (op == 0x9d || op == 0x9f)
8109             printf (_("     [Reserved]"));
8110           else
8111             printf ("     vsp = r%d", op & 0x0f);
8112         }
8113       else if ((op & 0xf0) == 0xa0)
8114         {
8115           int end = 4 + (op & 0x07);
8116           int first = 1;
8117           int i;
8118
8119           printf ("     pop {");
8120           for (i = 4; i <= end; i++)
8121             {
8122               if (first)
8123                 first = 0;
8124               else
8125                 printf (", ");
8126               printf ("r%d", i);
8127             }
8128           if (op & 0x08)
8129             {
8130               if (!first)
8131                 printf (", ");
8132               printf ("r14");
8133             }
8134           printf ("}");
8135         }
8136       else if (op == 0xb0)
8137         printf (_("     finish"));
8138       else if (op == 0xb1)
8139         {
8140           GET_OP (op2);
8141           if (op2 == 0 || (op2 & 0xf0) != 0)
8142             printf (_("[Spare]"));
8143           else
8144             {
8145               unsigned int mask = op2 & 0x0f;
8146               int first = 1;
8147               int i;
8148
8149               printf ("pop {");
8150               for (i = 0; i < 12; i++)
8151                 if (mask & (1 << i))
8152                   {
8153                     if (first)
8154                       first = 0;
8155                     else
8156                       printf (", ");
8157                     printf ("r%d", i);
8158                   }
8159               printf ("}");
8160             }
8161         }
8162       else if (op == 0xb2)
8163         {
8164           unsigned char buf[9];
8165           unsigned int i, len;
8166           unsigned long offset;
8167
8168           for (i = 0; i < sizeof (buf); i++)
8169             {
8170               GET_OP (buf[i]);
8171               if ((buf[i] & 0x80) == 0)
8172                 break;
8173             }
8174           if (i == sizeof (buf))
8175             printf (_("corrupt change to vsp"));
8176           else
8177             {
8178               offset = read_uleb128 (buf, &len, buf + i + 1);
8179               assert (len == i + 1);
8180               offset = offset * 4 + 0x204;
8181               printf ("vsp = vsp + %ld", offset);
8182             }
8183         }
8184       else if (op == 0xb3 || op == 0xc8 || op == 0xc9)
8185         {
8186           unsigned int first, last;
8187
8188           GET_OP (op2);
8189           first = op2 >> 4;
8190           last = op2 & 0x0f;
8191           if (op == 0xc8)
8192             first = first + 16;
8193           printf ("pop {D%d", first);
8194           if (last)
8195             printf ("-D%d", first + last);
8196           printf ("}");
8197         }
8198       else if ((op & 0xf8) == 0xb8 || (op & 0xf8) == 0xd0)
8199         {
8200           unsigned int count = op & 0x07;
8201
8202           printf ("pop {D8");
8203           if (count)
8204             printf ("-D%d", 8 + count);
8205           printf ("}");
8206         }
8207       else if (op >= 0xc0 && op <= 0xc5)
8208         {
8209           unsigned int count = op & 0x07;
8210
8211           printf ("     pop {wR10");
8212           if (count)
8213             printf ("-wR%d", 10 + count);
8214           printf ("}");
8215         }
8216       else if (op == 0xc6)
8217         {
8218           unsigned int first, last;
8219
8220           GET_OP (op2);
8221           first = op2 >> 4;
8222           last = op2 & 0x0f;
8223           printf ("pop {wR%d", first);
8224           if (last)
8225             printf ("-wR%d", first + last);
8226           printf ("}");
8227         }
8228       else if (op == 0xc7)
8229         {
8230           GET_OP (op2);
8231           if (op2 == 0 || (op2 & 0xf0) != 0)
8232             printf (_("[Spare]"));
8233           else
8234             {
8235               unsigned int mask = op2 & 0x0f;
8236               int first = 1;
8237               int i;
8238
8239               printf ("pop {");
8240               for (i = 0; i < 4; i++)
8241                 if (mask & (1 << i))
8242                   {
8243                     if (first)
8244                       first = 0;
8245                     else
8246                       printf (", ");
8247                     printf ("wCGR%d", i);
8248                   }
8249               printf ("}");
8250             }
8251         }
8252       else
8253         printf (_("     [unsupported opcode]"));
8254       printf ("\n");
8255     }
8256 }
8257
8258 static void
8259 decode_tic6x_unwind_bytecode (struct arm_unw_aux_info *  aux,
8260                               unsigned int               word,
8261                               unsigned int               remaining,
8262                               unsigned int               more_words,
8263                               bfd_vma                    data_offset,
8264                               Elf_Internal_Shdr *        data_sec,
8265                               struct arm_section *       data_arm_sec)
8266 {
8267   struct absaddr addr;
8268
8269   /* Decode the unwinding instructions.  */
8270   while (1)
8271     {
8272       unsigned int op, op2;
8273
8274       ADVANCE;
8275       if (remaining == 0)
8276         break;
8277       remaining--;
8278       op = word >> 24;
8279       word <<= 8;
8280
8281       printf ("  0x%02x ", op);
8282
8283       if ((op & 0xc0) == 0x00)
8284         {
8285           int offset = ((op & 0x3f) << 3) + 8;
8286           printf ("     sp = sp + %d", offset);
8287         }
8288       else if ((op & 0xc0) == 0x80)
8289         {
8290           GET_OP (op2);
8291           if (op == 0x80 && op2 == 0)
8292             printf (_("Refuse to unwind"));
8293           else
8294             {
8295               unsigned int mask = ((op & 0x1f) << 8) | op2;
8296               if (op & 0x20)
8297                 printf ("pop compact {");
8298               else
8299                 printf ("pop {");
8300
8301               decode_tic6x_unwind_regmask (mask);
8302               printf("}");
8303             }
8304         }
8305       else if ((op & 0xf0) == 0xc0)
8306         {
8307           unsigned int reg;
8308           unsigned int nregs;
8309           unsigned int i;
8310           const char *name;
8311           struct
8312           {
8313               unsigned int offset;
8314               unsigned int reg;
8315           } regpos[16];
8316
8317           /* Scan entire instruction first so that GET_OP output is not
8318              interleaved with disassembly.  */
8319           nregs = 0;
8320           for (i = 0; nregs < (op & 0xf); i++)
8321             {
8322               GET_OP (op2);
8323               reg = op2 >> 4;
8324               if (reg != 0xf)
8325                 {
8326                   regpos[nregs].offset = i * 2;
8327                   regpos[nregs].reg = reg;
8328                   nregs++;
8329                 }
8330
8331               reg = op2 & 0xf;
8332               if (reg != 0xf)
8333                 {
8334                   regpos[nregs].offset = i * 2 + 1;
8335                   regpos[nregs].reg = reg;
8336                   nregs++;
8337                 }
8338             }
8339
8340           printf (_("pop frame {"));
8341           reg = nregs - 1;
8342           for (i = i * 2; i > 0; i--)
8343             {
8344               if (regpos[reg].offset == i - 1)
8345                 {
8346                   name = tic6x_unwind_regnames[regpos[reg].reg];
8347                   if (reg > 0)
8348                     reg--;
8349                 }
8350               else
8351                 name = _("[pad]");
8352
8353               fputs (name, stdout);
8354               if (i > 1)
8355                 printf (", ");
8356             }
8357
8358           printf ("}");
8359         }
8360       else if (op == 0xd0)
8361         printf ("     MOV FP, SP");
8362       else if (op == 0xd1)
8363         printf ("     __c6xabi_pop_rts");
8364       else if (op == 0xd2)
8365         {
8366           unsigned char buf[9];
8367           unsigned int i, len;
8368           unsigned long offset;
8369
8370           for (i = 0; i < sizeof (buf); i++)
8371             {
8372               GET_OP (buf[i]);
8373               if ((buf[i] & 0x80) == 0)
8374                 break;
8375             }
8376           /* PR 17531: file: id:000001,src:001906+004739,op:splice,rep:2.  */
8377           if (i == sizeof (buf))
8378             {
8379               printf ("<corrupt sp adjust>\n");
8380               warn (_("Corrupt stack pointer adjustment detected\n"));
8381               return;
8382             }
8383
8384           offset = read_uleb128 (buf, &len, buf + i + 1);
8385           assert (len == i + 1);
8386           offset = offset * 8 + 0x408;
8387           printf (_("sp = sp + %ld"), offset);
8388         }
8389       else if ((op & 0xf0) == 0xe0)
8390         {
8391           if ((op & 0x0f) == 7)
8392             printf ("     RETURN");
8393           else
8394             printf ("     MV %s, B3", tic6x_unwind_regnames[op & 0x0f]);
8395         }
8396       else
8397         {
8398           printf (_("     [unsupported opcode]"));
8399         }
8400       putchar ('\n');
8401     }
8402 }
8403
8404 static bfd_vma
8405 arm_expand_prel31 (bfd_vma word, bfd_vma where)
8406 {
8407   bfd_vma offset;
8408
8409   offset = word & 0x7fffffff;
8410   if (offset & 0x40000000)
8411     offset |= ~ (bfd_vma) 0x7fffffff;
8412
8413   if (elf_header.e_machine == EM_TI_C6000)
8414     offset <<= 1;
8415
8416   return offset + where;
8417 }
8418
8419 static void
8420 decode_arm_unwind (struct arm_unw_aux_info *  aux,
8421                    unsigned int               word,
8422                    unsigned int               remaining,
8423                    bfd_vma                    data_offset,
8424                    Elf_Internal_Shdr *        data_sec,
8425                    struct arm_section *       data_arm_sec)
8426 {
8427   int per_index;
8428   unsigned int more_words = 0;
8429   struct absaddr addr;
8430   bfd_vma sym_name = (bfd_vma) -1;
8431
8432   if (remaining == 0)
8433     {
8434       /* Fetch the first word.
8435          Note - when decoding an object file the address extracted
8436          here will always be 0.  So we also pass in the sym_name
8437          parameter so that we can find the symbol associated with
8438          the personality routine.  */
8439       if (! get_unwind_section_word (aux, data_arm_sec, data_sec, data_offset,
8440                                      & word, & addr, & sym_name))
8441         return;
8442
8443       remaining = 4;
8444     }
8445
8446   if ((word & 0x80000000) == 0)
8447     {
8448       /* Expand prel31 for personality routine.  */
8449       bfd_vma fn;
8450       const char *procname;
8451
8452       fn = arm_expand_prel31 (word, data_sec->sh_addr + data_offset);
8453       printf (_("  Personality routine: "));
8454       if (fn == 0
8455           && addr.section == SHN_UNDEF && addr.offset == 0
8456           && sym_name != (bfd_vma) -1 && sym_name < aux->strtab_size)
8457         {
8458           procname = aux->strtab + sym_name;
8459           print_vma (fn, PREFIX_HEX);
8460           if (procname)
8461             {
8462               fputs (" <", stdout);
8463               fputs (procname, stdout);
8464               fputc ('>', stdout);
8465             }
8466         }
8467       else
8468         procname = arm_print_vma_and_name (aux, fn, addr);
8469       fputc ('\n', stdout);
8470
8471       /* The GCC personality routines use the standard compact
8472          encoding, starting with one byte giving the number of
8473          words.  */
8474       if (procname != NULL
8475           && (const_strneq (procname, "__gcc_personality_v0")
8476               || const_strneq (procname, "__gxx_personality_v0")
8477               || const_strneq (procname, "__gcj_personality_v0")
8478               || const_strneq (procname, "__gnu_objc_personality_v0")))
8479         {
8480           remaining = 0;
8481           more_words = 1;
8482           ADVANCE;
8483           if (!remaining)
8484             {
8485               printf (_("  [Truncated data]\n"));
8486               return;
8487             }
8488           more_words = word >> 24;
8489           word <<= 8;
8490           remaining--;
8491           per_index = -1;
8492         }
8493       else
8494         return;
8495     }
8496   else
8497     {
8498       /* ARM EHABI Section 6.3:
8499
8500          An exception-handling table entry for the compact model looks like:
8501
8502            31 30-28 27-24 23-0
8503            -- ----- ----- ----
8504             1   0   index Data for personalityRoutine[index]    */
8505
8506       if (elf_header.e_machine == EM_ARM
8507           && (word & 0x70000000))
8508         warn (_("Corrupt ARM compact model table entry: %x \n"), word);
8509
8510       per_index = (word >> 24) & 0x7f;
8511       printf (_("  Compact model index: %d\n"), per_index);
8512       if (per_index == 0)
8513         {
8514           more_words = 0;
8515           word <<= 8;
8516           remaining--;
8517         }
8518       else if (per_index < 3)
8519         {
8520           more_words = (word >> 16) & 0xff;
8521           word <<= 16;
8522           remaining -= 2;
8523         }
8524     }
8525
8526   switch (elf_header.e_machine)
8527     {
8528     case EM_ARM:
8529       if (per_index < 3)
8530         {
8531           decode_arm_unwind_bytecode (aux, word, remaining, more_words,
8532                                       data_offset, data_sec, data_arm_sec);
8533         }
8534       else
8535         {
8536           warn (_("Unknown ARM compact model index encountered\n"));
8537           printf (_("  [reserved]\n"));
8538         }
8539       break;
8540
8541     case EM_TI_C6000:
8542       if (per_index < 3)
8543         {
8544           decode_tic6x_unwind_bytecode (aux, word, remaining, more_words,
8545                                         data_offset, data_sec, data_arm_sec);
8546         }
8547       else if (per_index < 5)
8548         {
8549           if (((word >> 17) & 0x7f) == 0x7f)
8550             printf (_("  Restore stack from frame pointer\n"));
8551           else
8552             printf (_("  Stack increment %d\n"), (word >> 14) & 0x1fc);
8553           printf (_("  Registers restored: "));
8554           if (per_index == 4)
8555             printf (" (compact) ");
8556           decode_tic6x_unwind_regmask ((word >> 4) & 0x1fff);
8557           putchar ('\n');
8558           printf (_("  Return register: %s\n"),
8559                   tic6x_unwind_regnames[word & 0xf]);
8560         }
8561       else
8562         printf (_("  [reserved (%d)]\n"), per_index);
8563       break;
8564
8565     default:
8566       error (_("Unsupported architecture type %d encountered when decoding unwind table\n"),
8567              elf_header.e_machine);
8568     }
8569
8570   /* Decode the descriptors.  Not implemented.  */
8571 }
8572
8573 static void
8574 dump_arm_unwind (struct arm_unw_aux_info *aux, Elf_Internal_Shdr *exidx_sec)
8575 {
8576   struct arm_section exidx_arm_sec, extab_arm_sec;
8577   unsigned int i, exidx_len;
8578   unsigned long j, nfuns;
8579
8580   memset (&exidx_arm_sec, 0, sizeof (exidx_arm_sec));
8581   memset (&extab_arm_sec, 0, sizeof (extab_arm_sec));
8582   exidx_len = exidx_sec->sh_size / 8;
8583
8584   aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
8585   for (nfuns = 0, j = 0; j < aux->nsyms; j++)
8586     if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
8587       aux->funtab[nfuns++] = aux->symtab[j];
8588   aux->nfuns = nfuns;
8589   qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
8590
8591   for (i = 0; i < exidx_len; i++)
8592     {
8593       unsigned int exidx_fn, exidx_entry;
8594       struct absaddr fn_addr, entry_addr;
8595       bfd_vma fn;
8596
8597       fputc ('\n', stdout);
8598
8599       if (! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8600                                      8 * i, & exidx_fn, & fn_addr, NULL)
8601           || ! get_unwind_section_word (aux, & exidx_arm_sec, exidx_sec,
8602                                         8 * i + 4, & exidx_entry, & entry_addr, NULL))
8603         {
8604           free (aux->funtab);
8605           arm_free_section (& exidx_arm_sec);
8606           arm_free_section (& extab_arm_sec);
8607           return;
8608         }
8609
8610       /* ARM EHABI, Section 5:
8611          An index table entry consists of 2 words.
8612          The first word contains a prel31 offset to the start of a function, with bit 31 clear.  */
8613       if (exidx_fn & 0x80000000)
8614         warn (_("corrupt index table entry: %x\n"), exidx_fn);
8615
8616       fn = arm_expand_prel31 (exidx_fn, exidx_sec->sh_addr + 8 * i);
8617
8618       arm_print_vma_and_name (aux, fn, fn_addr);
8619       fputs (": ", stdout);
8620
8621       if (exidx_entry == 1)
8622         {
8623           print_vma (exidx_entry, PREFIX_HEX);
8624           fputs (" [cantunwind]\n", stdout);
8625         }
8626       else if (exidx_entry & 0x80000000)
8627         {
8628           print_vma (exidx_entry, PREFIX_HEX);
8629           fputc ('\n', stdout);
8630           decode_arm_unwind (aux, exidx_entry, 4, 0, NULL, NULL);
8631         }
8632       else
8633         {
8634           bfd_vma table, table_offset = 0;
8635           Elf_Internal_Shdr *table_sec;
8636
8637           fputs ("@", stdout);
8638           table = arm_expand_prel31 (exidx_entry, exidx_sec->sh_addr + 8 * i + 4);
8639           print_vma (table, PREFIX_HEX);
8640           printf ("\n");
8641
8642           /* Locate the matching .ARM.extab.  */
8643           if (entry_addr.section != SHN_UNDEF
8644               && entry_addr.section < elf_header.e_shnum)
8645             {
8646               table_sec = section_headers + entry_addr.section;
8647               table_offset = entry_addr.offset;
8648               /* PR 18879 */
8649               if (table_offset > table_sec->sh_size
8650                   || ((bfd_signed_vma) table_offset) < 0)
8651                 {
8652                   warn (_("Unwind entry contains corrupt offset (0x%lx) into section %s\n"),
8653                         (unsigned long) table_offset,
8654                         printable_section_name (table_sec));
8655                   continue;
8656                 }
8657             }
8658           else
8659             {
8660               table_sec = find_section_by_address (table);
8661               if (table_sec != NULL)
8662                 table_offset = table - table_sec->sh_addr;
8663             }
8664           if (table_sec == NULL)
8665             {
8666               warn (_("Could not locate .ARM.extab section containing 0x%lx.\n"),
8667                     (unsigned long) table);
8668               continue;
8669             }
8670           decode_arm_unwind (aux, 0, 0, table_offset, table_sec,
8671                              &extab_arm_sec);
8672         }
8673     }
8674
8675   printf ("\n");
8676
8677   free (aux->funtab);
8678   arm_free_section (&exidx_arm_sec);
8679   arm_free_section (&extab_arm_sec);
8680 }
8681
8682 /* Used for both ARM and C6X unwinding tables.  */
8683
8684 static void
8685 arm_process_unwind (FILE *file)
8686 {
8687   struct arm_unw_aux_info aux;
8688   Elf_Internal_Shdr *unwsec = NULL;
8689   Elf_Internal_Shdr *strsec;
8690   Elf_Internal_Shdr *sec;
8691   unsigned long i;
8692   unsigned int sec_type;
8693
8694   switch (elf_header.e_machine)
8695     {
8696     case EM_ARM:
8697       sec_type = SHT_ARM_EXIDX;
8698       break;
8699
8700     case EM_TI_C6000:
8701       sec_type = SHT_C6000_UNWIND;
8702       break;
8703
8704     default:
8705       error (_("Unsupported architecture type %d encountered when processing unwind table\n"),
8706              elf_header.e_machine);
8707       return;
8708     }
8709
8710   if (string_table == NULL)
8711     return;
8712
8713   memset (& aux, 0, sizeof (aux));
8714   aux.file = file;
8715
8716   for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8717     {
8718       if (sec->sh_type == SHT_SYMTAB && sec->sh_link < elf_header.e_shnum)
8719         {
8720           aux.symtab = GET_ELF_SYMBOLS (file, sec, & aux.nsyms);
8721
8722           strsec = section_headers + sec->sh_link;
8723
8724           /* PR binutils/17531 file: 011-12666-0.004.  */
8725           if (aux.strtab != NULL)
8726             {
8727               error (_("Multiple string tables found in file.\n"));
8728               free (aux.strtab);
8729             }
8730           aux.strtab = get_data (NULL, file, strsec->sh_offset,
8731                                  1, strsec->sh_size, _("string table"));
8732           aux.strtab_size = aux.strtab != NULL ? strsec->sh_size : 0;
8733         }
8734       else if (sec->sh_type == sec_type)
8735         unwsec = sec;
8736     }
8737
8738   if (unwsec == NULL)
8739     printf (_("\nThere are no unwind sections in this file.\n"));
8740   else
8741     for (i = 0, sec = section_headers; i < elf_header.e_shnum; ++i, ++sec)
8742       {
8743         if (sec->sh_type == sec_type)
8744           {
8745             printf (_("\nUnwind table index '%s' at offset 0x%lx contains %lu entries:\n"),
8746                     printable_section_name (sec),
8747                     (unsigned long) sec->sh_offset,
8748                     (unsigned long) (sec->sh_size / (2 * eh_addr_size)));
8749
8750             dump_arm_unwind (&aux, sec);
8751           }
8752       }
8753
8754   if (aux.symtab)
8755     free (aux.symtab);
8756   if (aux.strtab)
8757     free ((char *) aux.strtab);
8758 }
8759
8760 static void
8761 process_unwind (FILE * file)
8762 {
8763   struct unwind_handler
8764   {
8765     int machtype;
8766     void (* handler)(FILE *);
8767   } handlers[] =
8768   {
8769     { EM_ARM, arm_process_unwind },
8770     { EM_IA_64, ia64_process_unwind },
8771     { EM_PARISC, hppa_process_unwind },
8772     { EM_TI_C6000, arm_process_unwind },
8773     { 0, 0 }
8774   };
8775   int i;
8776
8777   if (!do_unwind)
8778     return;
8779
8780   for (i = 0; handlers[i].handler != NULL; i++)
8781     if (elf_header.e_machine == handlers[i].machtype)
8782       {
8783         handlers[i].handler (file);
8784         return;
8785       }
8786
8787   printf (_("\nThe decoding of unwind sections for machine type %s is not currently supported.\n"),
8788           get_machine_name (elf_header.e_machine));
8789 }
8790
8791 static void
8792 dynamic_section_mips_val (Elf_Internal_Dyn * entry)
8793 {
8794   switch (entry->d_tag)
8795     {
8796     case DT_MIPS_FLAGS:
8797       if (entry->d_un.d_val == 0)
8798         printf (_("NONE"));
8799       else
8800         {
8801           static const char * opts[] =
8802           {
8803             "QUICKSTART", "NOTPOT", "NO_LIBRARY_REPLACEMENT",
8804             "NO_MOVE", "SGI_ONLY", "GUARANTEE_INIT", "DELTA_C_PLUS_PLUS",
8805             "GUARANTEE_START_INIT", "PIXIE", "DEFAULT_DELAY_LOAD",
8806             "REQUICKSTART", "REQUICKSTARTED", "CORD", "NO_UNRES_UNDEF",
8807             "RLD_ORDER_SAFE"
8808           };
8809           unsigned int cnt;
8810           int first = 1;
8811
8812           for (cnt = 0; cnt < ARRAY_SIZE (opts); ++cnt)
8813             if (entry->d_un.d_val & (1 << cnt))
8814               {
8815                 printf ("%s%s", first ? "" : " ", opts[cnt]);
8816                 first = 0;
8817               }
8818         }
8819       break;
8820
8821     case DT_MIPS_IVERSION:
8822       if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
8823         printf (_("Interface Version: %s"), GET_DYNAMIC_NAME (entry->d_un.d_val));
8824       else
8825         {
8826           char buf[40];
8827           sprintf_vma (buf, entry->d_un.d_ptr);
8828           /* Note: coded this way so that there is a single string for translation.  */
8829           printf (_("<corrupt: %s>"), buf);
8830         }
8831       break;
8832
8833     case DT_MIPS_TIME_STAMP:
8834       {
8835         char timebuf[128];
8836         struct tm * tmp;
8837         time_t atime = entry->d_un.d_val;
8838
8839         tmp = gmtime (&atime);
8840         /* PR 17531: file: 6accc532.  */
8841         if (tmp == NULL)
8842           snprintf (timebuf, sizeof (timebuf), _("<corrupt>"));
8843         else
8844           snprintf (timebuf, sizeof (timebuf), "%04u-%02u-%02uT%02u:%02u:%02u",
8845                     tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
8846                     tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
8847         printf (_("Time Stamp: %s"), timebuf);
8848       }
8849       break;
8850
8851     case DT_MIPS_RLD_VERSION:
8852     case DT_MIPS_LOCAL_GOTNO:
8853     case DT_MIPS_CONFLICTNO:
8854     case DT_MIPS_LIBLISTNO:
8855     case DT_MIPS_SYMTABNO:
8856     case DT_MIPS_UNREFEXTNO:
8857     case DT_MIPS_HIPAGENO:
8858     case DT_MIPS_DELTA_CLASS_NO:
8859     case DT_MIPS_DELTA_INSTANCE_NO:
8860     case DT_MIPS_DELTA_RELOC_NO:
8861     case DT_MIPS_DELTA_SYM_NO:
8862     case DT_MIPS_DELTA_CLASSSYM_NO:
8863     case DT_MIPS_COMPACT_SIZE:
8864       print_vma (entry->d_un.d_val, DEC);
8865       break;
8866
8867     default:
8868       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8869     }
8870     putchar ('\n');
8871 }
8872
8873 static void
8874 dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
8875 {
8876   switch (entry->d_tag)
8877     {
8878     case DT_HP_DLD_FLAGS:
8879       {
8880         static struct
8881         {
8882           long int bit;
8883           const char * str;
8884         }
8885         flags[] =
8886         {
8887           { DT_HP_DEBUG_PRIVATE, "HP_DEBUG_PRIVATE" },
8888           { DT_HP_DEBUG_CALLBACK, "HP_DEBUG_CALLBACK" },
8889           { DT_HP_DEBUG_CALLBACK_BOR, "HP_DEBUG_CALLBACK_BOR" },
8890           { DT_HP_NO_ENVVAR, "HP_NO_ENVVAR" },
8891           { DT_HP_BIND_NOW, "HP_BIND_NOW" },
8892           { DT_HP_BIND_NONFATAL, "HP_BIND_NONFATAL" },
8893           { DT_HP_BIND_VERBOSE, "HP_BIND_VERBOSE" },
8894           { DT_HP_BIND_RESTRICTED, "HP_BIND_RESTRICTED" },
8895           { DT_HP_BIND_SYMBOLIC, "HP_BIND_SYMBOLIC" },
8896           { DT_HP_RPATH_FIRST, "HP_RPATH_FIRST" },
8897           { DT_HP_BIND_DEPTH_FIRST, "HP_BIND_DEPTH_FIRST" },
8898           { DT_HP_GST, "HP_GST" },
8899           { DT_HP_SHLIB_FIXED, "HP_SHLIB_FIXED" },
8900           { DT_HP_MERGE_SHLIB_SEG, "HP_MERGE_SHLIB_SEG" },
8901           { DT_HP_NODELETE, "HP_NODELETE" },
8902           { DT_HP_GROUP, "HP_GROUP" },
8903           { DT_HP_PROTECT_LINKAGE_TABLE, "HP_PROTECT_LINKAGE_TABLE" }
8904         };
8905         int first = 1;
8906         size_t cnt;
8907         bfd_vma val = entry->d_un.d_val;
8908
8909         for (cnt = 0; cnt < ARRAY_SIZE (flags); ++cnt)
8910           if (val & flags[cnt].bit)
8911             {
8912               if (! first)
8913                 putchar (' ');
8914               fputs (flags[cnt].str, stdout);
8915               first = 0;
8916               val ^= flags[cnt].bit;
8917             }
8918
8919         if (val != 0 || first)
8920           {
8921             if (! first)
8922               putchar (' ');
8923             print_vma (val, HEX);
8924           }
8925       }
8926       break;
8927
8928     default:
8929       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8930       break;
8931     }
8932   putchar ('\n');
8933 }
8934
8935 #ifdef BFD64
8936
8937 /* VMS vs Unix time offset and factor.  */
8938
8939 #define VMS_EPOCH_OFFSET 35067168000000000LL
8940 #define VMS_GRANULARITY_FACTOR 10000000
8941
8942 /* Display a VMS time in a human readable format.  */
8943
8944 static void
8945 print_vms_time (bfd_int64_t vmstime)
8946 {
8947   struct tm *tm;
8948   time_t unxtime;
8949
8950   unxtime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
8951   tm = gmtime (&unxtime);
8952   printf ("%04u-%02u-%02uT%02u:%02u:%02u",
8953           tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
8954           tm->tm_hour, tm->tm_min, tm->tm_sec);
8955 }
8956 #endif /* BFD64 */
8957
8958 static void
8959 dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
8960 {
8961   switch (entry->d_tag)
8962     {
8963     case DT_IA_64_PLT_RESERVE:
8964       /* First 3 slots reserved.  */
8965       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8966       printf (" -- ");
8967       print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
8968       break;
8969
8970     case DT_IA_64_VMS_LINKTIME:
8971 #ifdef BFD64
8972       print_vms_time (entry->d_un.d_val);
8973 #endif
8974       break;
8975
8976     case DT_IA_64_VMS_LNKFLAGS:
8977       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
8978       if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
8979         printf (" CALL_DEBUG");
8980       if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
8981         printf (" NOP0BUFS");
8982       if (entry->d_un.d_val & VMS_LF_P0IMAGE)
8983         printf (" P0IMAGE");
8984       if (entry->d_un.d_val & VMS_LF_MKTHREADS)
8985         printf (" MKTHREADS");
8986       if (entry->d_un.d_val & VMS_LF_UPCALLS)
8987         printf (" UPCALLS");
8988       if (entry->d_un.d_val & VMS_LF_IMGSTA)
8989         printf (" IMGSTA");
8990       if (entry->d_un.d_val & VMS_LF_INITIALIZE)
8991         printf (" INITIALIZE");
8992       if (entry->d_un.d_val & VMS_LF_MAIN)
8993         printf (" MAIN");
8994       if (entry->d_un.d_val & VMS_LF_EXE_INIT)
8995         printf (" EXE_INIT");
8996       if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
8997         printf (" TBK_IN_IMG");
8998       if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
8999         printf (" DBG_IN_IMG");
9000       if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
9001         printf (" TBK_IN_DSF");
9002       if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
9003         printf (" DBG_IN_DSF");
9004       if (entry->d_un.d_val & VMS_LF_SIGNATURES)
9005         printf (" SIGNATURES");
9006       if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
9007         printf (" REL_SEG_OFF");
9008       break;
9009
9010     default:
9011       print_vma (entry->d_un.d_ptr, PREFIX_HEX);
9012       break;
9013     }
9014   putchar ('\n');
9015 }
9016
9017 static int
9018 get_32bit_dynamic_section (FILE * file)
9019 {
9020   Elf32_External_Dyn * edyn;
9021   Elf32_External_Dyn * ext;
9022   Elf_Internal_Dyn * entry;
9023
9024   edyn = (Elf32_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
9025                                           dynamic_size, _("dynamic section"));
9026   if (!edyn)
9027     return 0;
9028
9029   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9030      might not have the luxury of section headers.  Look for the DT_NULL
9031      terminator to determine the number of entries.  */
9032   for (ext = edyn, dynamic_nent = 0;
9033        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9034        ext++)
9035     {
9036       dynamic_nent++;
9037       if (BYTE_GET (ext->d_tag) == DT_NULL)
9038         break;
9039     }
9040
9041   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9042                                                   sizeof (* entry));
9043   if (dynamic_section == NULL)
9044     {
9045       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9046              (unsigned long) dynamic_nent);
9047       free (edyn);
9048       return 0;
9049     }
9050
9051   for (ext = edyn, entry = dynamic_section;
9052        entry < dynamic_section + dynamic_nent;
9053        ext++, entry++)
9054     {
9055       entry->d_tag      = BYTE_GET (ext->d_tag);
9056       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9057     }
9058
9059   free (edyn);
9060
9061   return 1;
9062 }
9063
9064 static int
9065 get_64bit_dynamic_section (FILE * file)
9066 {
9067   Elf64_External_Dyn * edyn;
9068   Elf64_External_Dyn * ext;
9069   Elf_Internal_Dyn * entry;
9070
9071   /* Read in the data.  */
9072   edyn = (Elf64_External_Dyn *) get_data (NULL, file, dynamic_addr, 1,
9073                                           dynamic_size, _("dynamic section"));
9074   if (!edyn)
9075     return 0;
9076
9077   /* SGI's ELF has more than one section in the DYNAMIC segment, and we
9078      might not have the luxury of section headers.  Look for the DT_NULL
9079      terminator to determine the number of entries.  */
9080   for (ext = edyn, dynamic_nent = 0;
9081        /* PR 17533 file: 033-67080-0.004 - do not read past end of buffer.  */
9082        (char *) (ext + 1) <= (char *) edyn + dynamic_size;
9083        ext++)
9084     {
9085       dynamic_nent++;
9086       if (BYTE_GET (ext->d_tag) == DT_NULL)
9087         break;
9088     }
9089
9090   dynamic_section = (Elf_Internal_Dyn *) cmalloc (dynamic_nent,
9091                                                   sizeof (* entry));
9092   if (dynamic_section == NULL)
9093     {
9094       error (_("Out of memory allocating space for %lu dynamic entries\n"),
9095              (unsigned long) dynamic_nent);
9096       free (edyn);
9097       return 0;
9098     }
9099
9100   /* Convert from external to internal formats.  */
9101   for (ext = edyn, entry = dynamic_section;
9102        entry < dynamic_section + dynamic_nent;
9103        ext++, entry++)
9104     {
9105       entry->d_tag      = BYTE_GET (ext->d_tag);
9106       entry->d_un.d_val = BYTE_GET (ext->d_un.d_val);
9107     }
9108
9109   free (edyn);
9110
9111   return 1;
9112 }
9113
9114 static void
9115 print_dynamic_flags (bfd_vma flags)
9116 {
9117   int first = 1;
9118
9119   while (flags)
9120     {
9121       bfd_vma flag;
9122
9123       flag = flags & - flags;
9124       flags &= ~ flag;
9125
9126       if (first)
9127         first = 0;
9128       else
9129         putc (' ', stdout);
9130
9131       switch (flag)
9132         {
9133         case DF_ORIGIN:         fputs ("ORIGIN", stdout); break;
9134         case DF_SYMBOLIC:       fputs ("SYMBOLIC", stdout); break;
9135         case DF_TEXTREL:        fputs ("TEXTREL", stdout); break;
9136         case DF_BIND_NOW:       fputs ("BIND_NOW", stdout); break;
9137         case DF_STATIC_TLS:     fputs ("STATIC_TLS", stdout); break;
9138         default:                fputs (_("unknown"), stdout); break;
9139         }
9140     }
9141   puts ("");
9142 }
9143
9144 /* Parse and display the contents of the dynamic section.  */
9145
9146 static int
9147 process_dynamic_section (FILE * file)
9148 {
9149   Elf_Internal_Dyn * entry;
9150
9151   if (dynamic_size == 0)
9152     {
9153       if (do_dynamic)
9154         printf (_("\nThere is no dynamic section in this file.\n"));
9155
9156       return 1;
9157     }
9158
9159   if (is_32bit_elf)
9160     {
9161       if (! get_32bit_dynamic_section (file))
9162         return 0;
9163     }
9164   else if (! get_64bit_dynamic_section (file))
9165     return 0;
9166
9167   /* Find the appropriate symbol table.  */
9168   if (dynamic_symbols == NULL)
9169     {
9170       for (entry = dynamic_section;
9171            entry < dynamic_section + dynamic_nent;
9172            ++entry)
9173         {
9174           Elf_Internal_Shdr section;
9175
9176           if (entry->d_tag != DT_SYMTAB)
9177             continue;
9178
9179           dynamic_info[DT_SYMTAB] = entry->d_un.d_val;
9180
9181           /* Since we do not know how big the symbol table is,
9182              we default to reading in the entire file (!) and
9183              processing that.  This is overkill, I know, but it
9184              should work.  */
9185           section.sh_offset = offset_from_vma (file, entry->d_un.d_val, 0);
9186
9187           if (archive_file_offset != 0)
9188             section.sh_size = archive_file_size - section.sh_offset;
9189           else
9190             {
9191               if (fseek (file, 0, SEEK_END))
9192                 error (_("Unable to seek to end of file!\n"));
9193
9194               section.sh_size = ftell (file) - section.sh_offset;
9195             }
9196
9197           if (is_32bit_elf)
9198             section.sh_entsize = sizeof (Elf32_External_Sym);
9199           else
9200             section.sh_entsize = sizeof (Elf64_External_Sym);
9201           section.sh_name = string_table_length;
9202
9203           dynamic_symbols = GET_ELF_SYMBOLS (file, &section, & num_dynamic_syms);
9204           if (num_dynamic_syms < 1)
9205             {
9206               error (_("Unable to determine the number of symbols to load\n"));
9207               continue;
9208             }
9209         }
9210     }
9211
9212   /* Similarly find a string table.  */
9213   if (dynamic_strings == NULL)
9214     {
9215       for (entry = dynamic_section;
9216            entry < dynamic_section + dynamic_nent;
9217            ++entry)
9218         {
9219           unsigned long offset;
9220           long str_tab_len;
9221
9222           if (entry->d_tag != DT_STRTAB)
9223             continue;
9224
9225           dynamic_info[DT_STRTAB] = entry->d_un.d_val;
9226
9227           /* Since we do not know how big the string table is,
9228              we default to reading in the entire file (!) and
9229              processing that.  This is overkill, I know, but it
9230              should work.  */
9231
9232           offset = offset_from_vma (file, entry->d_un.d_val, 0);
9233
9234           if (archive_file_offset != 0)
9235             str_tab_len = archive_file_size - offset;
9236           else
9237             {
9238               if (fseek (file, 0, SEEK_END))
9239                 error (_("Unable to seek to end of file\n"));
9240               str_tab_len = ftell (file) - offset;
9241             }
9242
9243           if (str_tab_len < 1)
9244             {
9245               error
9246                 (_("Unable to determine the length of the dynamic string table\n"));
9247               continue;
9248             }
9249
9250           dynamic_strings = (char *) get_data (NULL, file, offset, 1,
9251                                                str_tab_len,
9252                                                _("dynamic string table"));
9253           dynamic_strings_length = dynamic_strings == NULL ? 0 : str_tab_len;
9254           break;
9255         }
9256     }
9257
9258   /* And find the syminfo section if available.  */
9259   if (dynamic_syminfo == NULL)
9260     {
9261       unsigned long syminsz = 0;
9262
9263       for (entry = dynamic_section;
9264            entry < dynamic_section + dynamic_nent;
9265            ++entry)
9266         {
9267           if (entry->d_tag == DT_SYMINENT)
9268             {
9269               /* Note: these braces are necessary to avoid a syntax
9270                  error from the SunOS4 C compiler.  */
9271               /* PR binutils/17531: A corrupt file can trigger this test.
9272                  So do not use an assert, instead generate an error message.  */
9273               if (sizeof (Elf_External_Syminfo) != entry->d_un.d_val)
9274                 error (_("Bad value (%d) for SYMINENT entry\n"),
9275                        (int) entry->d_un.d_val);
9276             }
9277           else if (entry->d_tag == DT_SYMINSZ)
9278             syminsz = entry->d_un.d_val;
9279           else if (entry->d_tag == DT_SYMINFO)
9280             dynamic_syminfo_offset = offset_from_vma (file, entry->d_un.d_val,
9281                                                       syminsz);
9282         }
9283
9284       if (dynamic_syminfo_offset != 0 && syminsz != 0)
9285         {
9286           Elf_External_Syminfo * extsyminfo;
9287           Elf_External_Syminfo * extsym;
9288           Elf_Internal_Syminfo * syminfo;
9289
9290           /* There is a syminfo section.  Read the data.  */
9291           extsyminfo = (Elf_External_Syminfo *)
9292               get_data (NULL, file, dynamic_syminfo_offset, 1, syminsz,
9293                         _("symbol information"));
9294           if (!extsyminfo)
9295             return 0;
9296
9297           dynamic_syminfo = (Elf_Internal_Syminfo *) malloc (syminsz);
9298           if (dynamic_syminfo == NULL)
9299             {
9300               error (_("Out of memory allocating %lu byte for dynamic symbol info\n"),
9301                      (unsigned long) syminsz);
9302               return 0;
9303             }
9304
9305           dynamic_syminfo_nent = syminsz / sizeof (Elf_External_Syminfo);
9306           for (syminfo = dynamic_syminfo, extsym = extsyminfo;
9307                syminfo < dynamic_syminfo + dynamic_syminfo_nent;
9308                ++syminfo, ++extsym)
9309             {
9310               syminfo->si_boundto = BYTE_GET (extsym->si_boundto);
9311               syminfo->si_flags = BYTE_GET (extsym->si_flags);
9312             }
9313
9314           free (extsyminfo);
9315         }
9316     }
9317
9318   if (do_dynamic && dynamic_addr)
9319     printf (_("\nDynamic section at offset 0x%lx contains %lu entries:\n"),
9320             dynamic_addr, (unsigned long) dynamic_nent);
9321   if (do_dynamic)
9322     printf (_("  Tag        Type                         Name/Value\n"));
9323
9324   for (entry = dynamic_section;
9325        entry < dynamic_section + dynamic_nent;
9326        entry++)
9327     {
9328       if (do_dynamic)
9329         {
9330           const char * dtype;
9331
9332           putchar (' ');
9333           print_vma (entry->d_tag, FULL_HEX);
9334           dtype = get_dynamic_type (entry->d_tag);
9335           printf (" (%s)%*s", dtype,
9336                   ((is_32bit_elf ? 27 : 19)
9337                    - (int) strlen (dtype)),
9338                   " ");
9339         }
9340
9341       switch (entry->d_tag)
9342         {
9343         case DT_FLAGS:
9344           if (do_dynamic)
9345             print_dynamic_flags (entry->d_un.d_val);
9346           break;
9347
9348         case DT_AUXILIARY:
9349         case DT_FILTER:
9350         case DT_CONFIG:
9351         case DT_DEPAUDIT:
9352         case DT_AUDIT:
9353           if (do_dynamic)
9354             {
9355               switch (entry->d_tag)
9356                 {
9357                 case DT_AUXILIARY:
9358                   printf (_("Auxiliary library"));
9359                   break;
9360
9361                 case DT_FILTER:
9362                   printf (_("Filter library"));
9363                   break;
9364
9365                 case DT_CONFIG:
9366                   printf (_("Configuration file"));
9367                   break;
9368
9369                 case DT_DEPAUDIT:
9370                   printf (_("Dependency audit library"));
9371                   break;
9372
9373                 case DT_AUDIT:
9374                   printf (_("Audit library"));
9375                   break;
9376                 }
9377
9378               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9379                 printf (": [%s]\n", GET_DYNAMIC_NAME (entry->d_un.d_val));
9380               else
9381                 {
9382                   printf (": ");
9383                   print_vma (entry->d_un.d_val, PREFIX_HEX);
9384                   putchar ('\n');
9385                 }
9386             }
9387           break;
9388
9389         case DT_FEATURE:
9390           if (do_dynamic)
9391             {
9392               printf (_("Flags:"));
9393
9394               if (entry->d_un.d_val == 0)
9395                 printf (_(" None\n"));
9396               else
9397                 {
9398                   unsigned long int val = entry->d_un.d_val;
9399
9400                   if (val & DTF_1_PARINIT)
9401                     {
9402                       printf (" PARINIT");
9403                       val ^= DTF_1_PARINIT;
9404                     }
9405                   if (val & DTF_1_CONFEXP)
9406                     {
9407                       printf (" CONFEXP");
9408                       val ^= DTF_1_CONFEXP;
9409                     }
9410                   if (val != 0)
9411                     printf (" %lx", val);
9412                   puts ("");
9413                 }
9414             }
9415           break;
9416
9417         case DT_POSFLAG_1:
9418           if (do_dynamic)
9419             {
9420               printf (_("Flags:"));
9421
9422               if (entry->d_un.d_val == 0)
9423                 printf (_(" None\n"));
9424               else
9425                 {
9426                   unsigned long int val = entry->d_un.d_val;
9427
9428                   if (val & DF_P1_LAZYLOAD)
9429                     {
9430                       printf (" LAZYLOAD");
9431                       val ^= DF_P1_LAZYLOAD;
9432                     }
9433                   if (val & DF_P1_GROUPPERM)
9434                     {
9435                       printf (" GROUPPERM");
9436                       val ^= DF_P1_GROUPPERM;
9437                     }
9438                   if (val != 0)
9439                     printf (" %lx", val);
9440                   puts ("");
9441                 }
9442             }
9443           break;
9444
9445         case DT_FLAGS_1:
9446           if (do_dynamic)
9447             {
9448               printf (_("Flags:"));
9449               if (entry->d_un.d_val == 0)
9450                 printf (_(" None\n"));
9451               else
9452                 {
9453                   unsigned long int val = entry->d_un.d_val;
9454
9455                   if (val & DF_1_NOW)
9456                     {
9457                       printf (" NOW");
9458                       val ^= DF_1_NOW;
9459                     }
9460                   if (val & DF_1_GLOBAL)
9461                     {
9462                       printf (" GLOBAL");
9463                       val ^= DF_1_GLOBAL;
9464                     }
9465                   if (val & DF_1_GROUP)
9466                     {
9467                       printf (" GROUP");
9468                       val ^= DF_1_GROUP;
9469                     }
9470                   if (val & DF_1_NODELETE)
9471                     {
9472                       printf (" NODELETE");
9473                       val ^= DF_1_NODELETE;
9474                     }
9475                   if (val & DF_1_LOADFLTR)
9476                     {
9477                       printf (" LOADFLTR");
9478                       val ^= DF_1_LOADFLTR;
9479                     }
9480                   if (val & DF_1_INITFIRST)
9481                     {
9482                       printf (" INITFIRST");
9483                       val ^= DF_1_INITFIRST;
9484                     }
9485                   if (val & DF_1_NOOPEN)
9486                     {
9487                       printf (" NOOPEN");
9488                       val ^= DF_1_NOOPEN;
9489                     }
9490                   if (val & DF_1_ORIGIN)
9491                     {
9492                       printf (" ORIGIN");
9493                       val ^= DF_1_ORIGIN;
9494                     }
9495                   if (val & DF_1_DIRECT)
9496                     {
9497                       printf (" DIRECT");
9498                       val ^= DF_1_DIRECT;
9499                     }
9500                   if (val & DF_1_TRANS)
9501                     {
9502                       printf (" TRANS");
9503                       val ^= DF_1_TRANS;
9504                     }
9505                   if (val & DF_1_INTERPOSE)
9506                     {
9507                       printf (" INTERPOSE");
9508                       val ^= DF_1_INTERPOSE;
9509                     }
9510                   if (val & DF_1_NODEFLIB)
9511                     {
9512                       printf (" NODEFLIB");
9513                       val ^= DF_1_NODEFLIB;
9514                     }
9515                   if (val & DF_1_NODUMP)
9516                     {
9517                       printf (" NODUMP");
9518                       val ^= DF_1_NODUMP;
9519                     }
9520                   if (val & DF_1_CONFALT)
9521                     {
9522                       printf (" CONFALT");
9523                       val ^= DF_1_CONFALT;
9524                     }
9525                   if (val & DF_1_ENDFILTEE)
9526                     {
9527                       printf (" ENDFILTEE");
9528                       val ^= DF_1_ENDFILTEE;
9529                     }
9530                   if (val & DF_1_DISPRELDNE)
9531                     {
9532                       printf (" DISPRELDNE");
9533                       val ^= DF_1_DISPRELDNE;
9534                     }
9535                   if (val & DF_1_DISPRELPND)
9536                     {
9537                       printf (" DISPRELPND");
9538                       val ^= DF_1_DISPRELPND;
9539                     }
9540                   if (val & DF_1_NODIRECT)
9541                     {
9542                       printf (" NODIRECT");
9543                       val ^= DF_1_NODIRECT;
9544                     }
9545                   if (val & DF_1_IGNMULDEF)
9546                     {
9547                       printf (" IGNMULDEF");
9548                       val ^= DF_1_IGNMULDEF;
9549                     }
9550                   if (val & DF_1_NOKSYMS)
9551                     {
9552                       printf (" NOKSYMS");
9553                       val ^= DF_1_NOKSYMS;
9554                     }
9555                   if (val & DF_1_NOHDR)
9556                     {
9557                       printf (" NOHDR");
9558                       val ^= DF_1_NOHDR;
9559                     }
9560                   if (val & DF_1_EDITED)
9561                     {
9562                       printf (" EDITED");
9563                       val ^= DF_1_EDITED;
9564                     }
9565                   if (val & DF_1_NORELOC)
9566                     {
9567                       printf (" NORELOC");
9568                       val ^= DF_1_NORELOC;
9569                     }
9570                   if (val & DF_1_SYMINTPOSE)
9571                     {
9572                       printf (" SYMINTPOSE");
9573                       val ^= DF_1_SYMINTPOSE;
9574                     }
9575                   if (val & DF_1_GLOBAUDIT)
9576                     {
9577                       printf (" GLOBAUDIT");
9578                       val ^= DF_1_GLOBAUDIT;
9579                     }
9580                   if (val & DF_1_SINGLETON)
9581                     {
9582                       printf (" SINGLETON");
9583                       val ^= DF_1_SINGLETON;
9584                     }
9585                   if (val & DF_1_STUB)
9586                     {
9587                       printf (" STUB");
9588                       val ^= DF_1_STUB;
9589                     }
9590                   if (val & DF_1_PIE)
9591                     {
9592                       printf (" PIE");
9593                       val ^= DF_1_PIE;
9594                     }
9595                   if (val != 0)
9596                     printf (" %lx", val);
9597                   puts ("");
9598                 }
9599             }
9600           break;
9601
9602         case DT_PLTREL:
9603           dynamic_info[entry->d_tag] = entry->d_un.d_val;
9604           if (do_dynamic)
9605             puts (get_dynamic_type (entry->d_un.d_val));
9606           break;
9607
9608         case DT_NULL    :
9609         case DT_NEEDED  :
9610         case DT_PLTGOT  :
9611         case DT_HASH    :
9612         case DT_STRTAB  :
9613         case DT_SYMTAB  :
9614         case DT_RELA    :
9615         case DT_INIT    :
9616         case DT_FINI    :
9617         case DT_SONAME  :
9618         case DT_RPATH   :
9619         case DT_SYMBOLIC:
9620         case DT_REL     :
9621         case DT_DEBUG   :
9622         case DT_TEXTREL :
9623         case DT_JMPREL  :
9624         case DT_RUNPATH :
9625           dynamic_info[entry->d_tag] = entry->d_un.d_val;
9626
9627           if (do_dynamic)
9628             {
9629               char * name;
9630
9631               if (VALID_DYNAMIC_NAME (entry->d_un.d_val))
9632                 name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9633               else
9634                 name = NULL;
9635
9636               if (name)
9637                 {
9638                   switch (entry->d_tag)
9639                     {
9640                     case DT_NEEDED:
9641                       printf (_("Shared library: [%s]"), name);
9642
9643                       if (streq (name, program_interpreter))
9644                         printf (_(" program interpreter"));
9645                       break;
9646
9647                     case DT_SONAME:
9648                       printf (_("Library soname: [%s]"), name);
9649                       break;
9650
9651                     case DT_RPATH:
9652                       printf (_("Library rpath: [%s]"), name);
9653                       break;
9654
9655                     case DT_RUNPATH:
9656                       printf (_("Library runpath: [%s]"), name);
9657                       break;
9658
9659                     default:
9660                       print_vma (entry->d_un.d_val, PREFIX_HEX);
9661                       break;
9662                     }
9663                 }
9664               else
9665                 print_vma (entry->d_un.d_val, PREFIX_HEX);
9666
9667               putchar ('\n');
9668             }
9669           break;
9670
9671         case DT_PLTRELSZ:
9672         case DT_RELASZ  :
9673         case DT_STRSZ   :
9674         case DT_RELSZ   :
9675         case DT_RELAENT :
9676         case DT_SYMENT  :
9677         case DT_RELENT  :
9678           dynamic_info[entry->d_tag] = entry->d_un.d_val;
9679         case DT_PLTPADSZ:
9680         case DT_MOVEENT :
9681         case DT_MOVESZ  :
9682         case DT_INIT_ARRAYSZ:
9683         case DT_FINI_ARRAYSZ:
9684         case DT_GNU_CONFLICTSZ:
9685         case DT_GNU_LIBLISTSZ:
9686           if (do_dynamic)
9687             {
9688               print_vma (entry->d_un.d_val, UNSIGNED);
9689               printf (_(" (bytes)\n"));
9690             }
9691           break;
9692
9693         case DT_VERDEFNUM:
9694         case DT_VERNEEDNUM:
9695         case DT_RELACOUNT:
9696         case DT_RELCOUNT:
9697           if (do_dynamic)
9698             {
9699               print_vma (entry->d_un.d_val, UNSIGNED);
9700               putchar ('\n');
9701             }
9702           break;
9703
9704         case DT_SYMINSZ:
9705         case DT_SYMINENT:
9706         case DT_SYMINFO:
9707         case DT_USED:
9708         case DT_INIT_ARRAY:
9709         case DT_FINI_ARRAY:
9710           if (do_dynamic)
9711             {
9712               if (entry->d_tag == DT_USED
9713                   && VALID_DYNAMIC_NAME (entry->d_un.d_val))
9714                 {
9715                   char * name = GET_DYNAMIC_NAME (entry->d_un.d_val);
9716
9717                   if (*name)
9718                     {
9719                       printf (_("Not needed object: [%s]\n"), name);
9720                       break;
9721                     }
9722                 }
9723
9724               print_vma (entry->d_un.d_val, PREFIX_HEX);
9725               putchar ('\n');
9726             }
9727           break;
9728
9729         case DT_BIND_NOW:
9730           /* The value of this entry is ignored.  */
9731           if (do_dynamic)
9732             putchar ('\n');
9733           break;
9734
9735         case DT_GNU_PRELINKED:
9736           if (do_dynamic)
9737             {
9738               struct tm * tmp;
9739               time_t atime = entry->d_un.d_val;
9740
9741               tmp = gmtime (&atime);
9742               /* PR 17533 file: 041-1244816-0.004.  */
9743               if (tmp == NULL)
9744                 printf (_("<corrupt time val: %lx"),
9745                         (unsigned long) atime);
9746               else
9747                 printf ("%04u-%02u-%02uT%02u:%02u:%02u\n",
9748                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
9749                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
9750
9751             }
9752           break;
9753
9754         case DT_GNU_HASH:
9755           dynamic_info_DT_GNU_HASH = entry->d_un.d_val;
9756           if (do_dynamic)
9757             {
9758               print_vma (entry->d_un.d_val, PREFIX_HEX);
9759               putchar ('\n');
9760             }
9761           break;
9762
9763         default:
9764           if ((entry->d_tag >= DT_VERSYM) && (entry->d_tag <= DT_VERNEEDNUM))
9765             version_info[DT_VERSIONTAGIDX (entry->d_tag)] =
9766               entry->d_un.d_val;
9767
9768           if (do_dynamic)
9769             {
9770               switch (elf_header.e_machine)
9771                 {
9772                 case EM_MIPS:
9773                 case EM_MIPS_RS3_LE:
9774                   dynamic_section_mips_val (entry);
9775                   break;
9776                 case EM_PARISC:
9777                   dynamic_section_parisc_val (entry);
9778                   break;
9779                 case EM_IA_64:
9780                   dynamic_section_ia64_val (entry);
9781                   break;
9782                 default:
9783                   print_vma (entry->d_un.d_val, PREFIX_HEX);
9784                   putchar ('\n');
9785                 }
9786             }
9787           break;
9788         }
9789     }
9790
9791   return 1;
9792 }
9793
9794 static char *
9795 get_ver_flags (unsigned int flags)
9796 {
9797   static char buff[32];
9798
9799   buff[0] = 0;
9800
9801   if (flags == 0)
9802     return _("none");
9803
9804   if (flags & VER_FLG_BASE)
9805     strcat (buff, "BASE ");
9806
9807   if (flags & VER_FLG_WEAK)
9808     {
9809       if (flags & VER_FLG_BASE)
9810         strcat (buff, "| ");
9811
9812       strcat (buff, "WEAK ");
9813     }
9814
9815   if (flags & VER_FLG_INFO)
9816     {
9817       if (flags & (VER_FLG_BASE|VER_FLG_WEAK))
9818         strcat (buff, "| ");
9819
9820       strcat (buff, "INFO ");
9821     }
9822
9823   if (flags & ~(VER_FLG_BASE | VER_FLG_WEAK | VER_FLG_INFO))
9824     strcat (buff, _("| <unknown>"));
9825
9826   return buff;
9827 }
9828
9829 /* Display the contents of the version sections.  */
9830
9831 static int
9832 process_version_sections (FILE * file)
9833 {
9834   Elf_Internal_Shdr * section;
9835   unsigned i;
9836   int found = 0;
9837
9838   if (! do_version)
9839     return 1;
9840
9841   for (i = 0, section = section_headers;
9842        i < elf_header.e_shnum;
9843        i++, section++)
9844     {
9845       switch (section->sh_type)
9846         {
9847         case SHT_GNU_verdef:
9848           {
9849             Elf_External_Verdef * edefs;
9850             unsigned int idx;
9851             unsigned int cnt;
9852             char * endbuf;
9853
9854             found = 1;
9855
9856             printf (_("\nVersion definition section '%s' contains %u entries:\n"),
9857                     printable_section_name (section),
9858                     section->sh_info);
9859
9860             printf (_("  Addr: 0x"));
9861             printf_vma (section->sh_addr);
9862             printf (_("  Offset: %#08lx  Link: %u (%s)"),
9863                     (unsigned long) section->sh_offset, section->sh_link,
9864                     printable_section_name_from_index (section->sh_link));
9865
9866             edefs = (Elf_External_Verdef *)
9867                 get_data (NULL, file, section->sh_offset, 1,section->sh_size,
9868                           _("version definition section"));
9869             if (!edefs)
9870               break;
9871             endbuf = (char *) edefs + section->sh_size;
9872
9873             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9874               {
9875                 char * vstart;
9876                 Elf_External_Verdef * edef;
9877                 Elf_Internal_Verdef ent;
9878                 Elf_External_Verdaux * eaux;
9879                 Elf_Internal_Verdaux aux;
9880                 int j;
9881                 int isum;
9882
9883                 /* Check for very large indicies.  */
9884                 if (idx > (size_t) (endbuf - (char *) edefs))
9885                   break;
9886
9887                 vstart = ((char *) edefs) + idx;
9888                 if (vstart + sizeof (*edef) > endbuf)
9889                   break;
9890
9891                 edef = (Elf_External_Verdef *) vstart;
9892
9893                 ent.vd_version = BYTE_GET (edef->vd_version);
9894                 ent.vd_flags   = BYTE_GET (edef->vd_flags);
9895                 ent.vd_ndx     = BYTE_GET (edef->vd_ndx);
9896                 ent.vd_cnt     = BYTE_GET (edef->vd_cnt);
9897                 ent.vd_hash    = BYTE_GET (edef->vd_hash);
9898                 ent.vd_aux     = BYTE_GET (edef->vd_aux);
9899                 ent.vd_next    = BYTE_GET (edef->vd_next);
9900
9901                 printf (_("  %#06x: Rev: %d  Flags: %s"),
9902                         idx, ent.vd_version, get_ver_flags (ent.vd_flags));
9903
9904                 printf (_("  Index: %d  Cnt: %d  "),
9905                         ent.vd_ndx, ent.vd_cnt);
9906
9907                 /* Check for overflow.  */
9908                 if (ent.vd_aux > (size_t) (endbuf - vstart))
9909                   break;
9910
9911                 vstart += ent.vd_aux;
9912
9913                 eaux = (Elf_External_Verdaux *) vstart;
9914
9915                 aux.vda_name = BYTE_GET (eaux->vda_name);
9916                 aux.vda_next = BYTE_GET (eaux->vda_next);
9917
9918                 if (VALID_DYNAMIC_NAME (aux.vda_name))
9919                   printf (_("Name: %s\n"), GET_DYNAMIC_NAME (aux.vda_name));
9920                 else
9921                   printf (_("Name index: %ld\n"), aux.vda_name);
9922
9923                 isum = idx + ent.vd_aux;
9924
9925                 for (j = 1; j < ent.vd_cnt; j++)
9926                   {
9927                     /* Check for overflow.  */
9928                     if (aux.vda_next > (size_t) (endbuf - vstart))
9929                       break;
9930
9931                     isum   += aux.vda_next;
9932                     vstart += aux.vda_next;
9933
9934                     eaux = (Elf_External_Verdaux *) vstart;
9935                     if (vstart + sizeof (*eaux) > endbuf)
9936                       break;
9937
9938                     aux.vda_name = BYTE_GET (eaux->vda_name);
9939                     aux.vda_next = BYTE_GET (eaux->vda_next);
9940
9941                     if (VALID_DYNAMIC_NAME (aux.vda_name))
9942                       printf (_("  %#06x: Parent %d: %s\n"),
9943                               isum, j, GET_DYNAMIC_NAME (aux.vda_name));
9944                     else
9945                       printf (_("  %#06x: Parent %d, name index: %ld\n"),
9946                               isum, j, aux.vda_name);
9947                   }
9948
9949                 if (j < ent.vd_cnt)
9950                   printf (_("  Version def aux past end of section\n"));
9951
9952                 /* PR 17531: file: id:000001,src:000172+005151,op:splice,rep:2.  */
9953                 if (idx + ent.vd_next <= idx)
9954                   break;
9955
9956                 idx += ent.vd_next;
9957               }
9958
9959             if (cnt < section->sh_info)
9960               printf (_("  Version definition past end of section\n"));
9961
9962             free (edefs);
9963           }
9964           break;
9965
9966         case SHT_GNU_verneed:
9967           {
9968             Elf_External_Verneed * eneed;
9969             unsigned int idx;
9970             unsigned int cnt;
9971             char * endbuf;
9972
9973             found = 1;
9974
9975             printf (_("\nVersion needs section '%s' contains %u entries:\n"),
9976                     printable_section_name (section), section->sh_info);
9977
9978             printf (_(" Addr: 0x"));
9979             printf_vma (section->sh_addr);
9980             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
9981                     (unsigned long) section->sh_offset, section->sh_link,
9982                     printable_section_name_from_index (section->sh_link));
9983
9984             eneed = (Elf_External_Verneed *) get_data (NULL, file,
9985                                                        section->sh_offset, 1,
9986                                                        section->sh_size,
9987                                                        _("Version Needs section"));
9988             if (!eneed)
9989               break;
9990             endbuf = (char *) eneed + section->sh_size;
9991
9992             for (idx = cnt = 0; cnt < section->sh_info; ++cnt)
9993               {
9994                 Elf_External_Verneed * entry;
9995                 Elf_Internal_Verneed ent;
9996                 int j;
9997                 int isum;
9998                 char * vstart;
9999
10000                 if (idx > (size_t) (endbuf - (char *) eneed))
10001                   break;
10002
10003                 vstart = ((char *) eneed) + idx;
10004                 if (vstart + sizeof (*entry) > endbuf)
10005                   break;
10006
10007                 entry = (Elf_External_Verneed *) vstart;
10008
10009                 ent.vn_version = BYTE_GET (entry->vn_version);
10010                 ent.vn_cnt     = BYTE_GET (entry->vn_cnt);
10011                 ent.vn_file    = BYTE_GET (entry->vn_file);
10012                 ent.vn_aux     = BYTE_GET (entry->vn_aux);
10013                 ent.vn_next    = BYTE_GET (entry->vn_next);
10014
10015                 printf (_("  %#06x: Version: %d"), idx, ent.vn_version);
10016
10017                 if (VALID_DYNAMIC_NAME (ent.vn_file))
10018                   printf (_("  File: %s"), GET_DYNAMIC_NAME (ent.vn_file));
10019                 else
10020                   printf (_("  File: %lx"), ent.vn_file);
10021
10022                 printf (_("  Cnt: %d\n"), ent.vn_cnt);
10023
10024                 /* Check for overflow.  */
10025                 if (ent.vn_aux > (size_t) (endbuf - vstart))
10026                   break;
10027                 vstart += ent.vn_aux;
10028
10029                 for (j = 0, isum = idx + ent.vn_aux; j < ent.vn_cnt; ++j)
10030                   {
10031                     Elf_External_Vernaux * eaux;
10032                     Elf_Internal_Vernaux aux;
10033
10034                     if (vstart + sizeof (*eaux) > endbuf)
10035                       break;
10036                     eaux = (Elf_External_Vernaux *) vstart;
10037
10038                     aux.vna_hash  = BYTE_GET (eaux->vna_hash);
10039                     aux.vna_flags = BYTE_GET (eaux->vna_flags);
10040                     aux.vna_other = BYTE_GET (eaux->vna_other);
10041                     aux.vna_name  = BYTE_GET (eaux->vna_name);
10042                     aux.vna_next  = BYTE_GET (eaux->vna_next);
10043
10044                     if (VALID_DYNAMIC_NAME (aux.vna_name))
10045                       printf (_("  %#06x:   Name: %s"),
10046                               isum, GET_DYNAMIC_NAME (aux.vna_name));
10047                     else
10048                       printf (_("  %#06x:   Name index: %lx"),
10049                               isum, aux.vna_name);
10050
10051                     printf (_("  Flags: %s  Version: %d\n"),
10052                             get_ver_flags (aux.vna_flags), aux.vna_other);
10053
10054                     /* Check for overflow.  */
10055                     if (aux.vna_next > (size_t) (endbuf - vstart)
10056                         || (aux.vna_next == 0 && j < ent.vn_cnt - 1))
10057                       {
10058                         warn (_("Invalid vna_next field of %lx\n"),
10059                               aux.vna_next);
10060                         j = ent.vn_cnt;
10061                         break;
10062                       }
10063                     isum   += aux.vna_next;
10064                     vstart += aux.vna_next;
10065                   }
10066
10067                 if (j < ent.vn_cnt)
10068                   warn (_("Missing Version Needs auxillary information\n"));
10069
10070                 if (ent.vn_next == 0 && cnt < section->sh_info - 1)
10071                   {
10072                     warn (_("Corrupt Version Needs structure - offset to next structure is zero with entries still left to be processed\n"));
10073                     cnt = section->sh_info;
10074                     break;
10075                   }
10076                 idx += ent.vn_next;
10077               }
10078
10079             if (cnt < section->sh_info)
10080               warn (_("Missing Version Needs information\n"));
10081
10082             free (eneed);
10083           }
10084           break;
10085
10086         case SHT_GNU_versym:
10087           {
10088             Elf_Internal_Shdr * link_section;
10089             size_t total;
10090             unsigned int cnt;
10091             unsigned char * edata;
10092             unsigned short * data;
10093             char * strtab;
10094             Elf_Internal_Sym * symbols;
10095             Elf_Internal_Shdr * string_sec;
10096             unsigned long num_syms;
10097             long off;
10098
10099             if (section->sh_link >= elf_header.e_shnum)
10100               break;
10101
10102             link_section = section_headers + section->sh_link;
10103             total = section->sh_size / sizeof (Elf_External_Versym);
10104
10105             if (link_section->sh_link >= elf_header.e_shnum)
10106               break;
10107
10108             found = 1;
10109
10110             symbols = GET_ELF_SYMBOLS (file, link_section, & num_syms);
10111             if (symbols == NULL)
10112               break;
10113
10114             string_sec = section_headers + link_section->sh_link;
10115
10116             strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
10117                                         string_sec->sh_size,
10118                                         _("version string table"));
10119             if (!strtab)
10120               {
10121                 free (symbols);
10122                 break;
10123               }
10124
10125             printf (_("\nVersion symbols section '%s' contains %lu entries:\n"),
10126                     printable_section_name (section), (unsigned long) total);
10127
10128             printf (_(" Addr: "));
10129             printf_vma (section->sh_addr);
10130             printf (_("  Offset: %#08lx  Link: %u (%s)\n"),
10131                     (unsigned long) section->sh_offset, section->sh_link,
10132                     printable_section_name (link_section));
10133
10134             off = offset_from_vma (file,
10135                                    version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10136                                    total * sizeof (short));
10137             edata = (unsigned char *) get_data (NULL, file, off, total,
10138                                                 sizeof (short),
10139                                                 _("version symbol data"));
10140             if (!edata)
10141               {
10142                 free (strtab);
10143                 free (symbols);
10144                 break;
10145               }
10146
10147             data = (short unsigned int *) cmalloc (total, sizeof (short));
10148
10149             for (cnt = total; cnt --;)
10150               data[cnt] = byte_get (edata + cnt * sizeof (short),
10151                                     sizeof (short));
10152
10153             free (edata);
10154
10155             for (cnt = 0; cnt < total; cnt += 4)
10156               {
10157                 int j, nn;
10158                 char *name;
10159                 char *invalid = _("*invalid*");
10160
10161                 printf ("  %03x:", cnt);
10162
10163                 for (j = 0; (j < 4) && (cnt + j) < total; ++j)
10164                   switch (data[cnt + j])
10165                     {
10166                     case 0:
10167                       fputs (_("   0 (*local*)    "), stdout);
10168                       break;
10169
10170                     case 1:
10171                       fputs (_("   1 (*global*)   "), stdout);
10172                       break;
10173
10174                     default:
10175                       nn = printf ("%4x%c", data[cnt + j] & VERSYM_VERSION,
10176                                    data[cnt + j] & VERSYM_HIDDEN ? 'h' : ' ');
10177
10178                       /* If this index value is greater than the size of the symbols
10179                          array, break to avoid an out-of-bounds read.  */
10180                       if ((unsigned long)(cnt + j) >= num_syms)
10181                         {
10182                           warn (_("invalid index into symbol array\n"));
10183                           break;
10184                         }
10185
10186                       name = NULL;
10187                       if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10188                         {
10189                           Elf_Internal_Verneed ivn;
10190                           unsigned long offset;
10191
10192                           offset = offset_from_vma
10193                             (file, version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10194                              sizeof (Elf_External_Verneed));
10195
10196                           do
10197                             {
10198                               Elf_Internal_Vernaux ivna;
10199                               Elf_External_Verneed evn;
10200                               Elf_External_Vernaux evna;
10201                               unsigned long a_off;
10202
10203                               if (get_data (&evn, file, offset, sizeof (evn), 1,
10204                                             _("version need")) == NULL)
10205                                 break;
10206
10207                               ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10208                               ivn.vn_next = BYTE_GET (evn.vn_next);
10209
10210                               a_off = offset + ivn.vn_aux;
10211
10212                               do
10213                                 {
10214                                   if (get_data (&evna, file, a_off, sizeof (evna),
10215                                                 1, _("version need aux (2)")) == NULL)
10216                                     {
10217                                       ivna.vna_next  = 0;
10218                                       ivna.vna_other = 0;
10219                                     }
10220                                   else
10221                                     {
10222                                       ivna.vna_next  = BYTE_GET (evna.vna_next);
10223                                       ivna.vna_other = BYTE_GET (evna.vna_other);
10224                                     }
10225
10226                                   a_off += ivna.vna_next;
10227                                 }
10228                               while (ivna.vna_other != data[cnt + j]
10229                                      && ivna.vna_next != 0);
10230
10231                               if (ivna.vna_other == data[cnt + j])
10232                                 {
10233                                   ivna.vna_name = BYTE_GET (evna.vna_name);
10234
10235                                   if (ivna.vna_name >= string_sec->sh_size)
10236                                     name = invalid;
10237                                   else
10238                                     name = strtab + ivna.vna_name;
10239                                   break;
10240                                 }
10241
10242                               offset += ivn.vn_next;
10243                             }
10244                           while (ivn.vn_next);
10245                         }
10246
10247                       if (data[cnt + j] != 0x8001
10248                           && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10249                         {
10250                           Elf_Internal_Verdef ivd;
10251                           Elf_External_Verdef evd;
10252                           unsigned long offset;
10253
10254                           offset = offset_from_vma
10255                             (file, version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10256                              sizeof evd);
10257
10258                           do
10259                             {
10260                               if (get_data (&evd, file, offset, sizeof (evd), 1,
10261                                             _("version def")) == NULL)
10262                                 {
10263                                   ivd.vd_next = 0;
10264                                   /* PR 17531: file: 046-1082287-0.004.  */
10265                                   ivd.vd_ndx  = (data[cnt + j] & VERSYM_VERSION) + 1;
10266                                   break;
10267                                 }
10268                               else
10269                                 {
10270                                   ivd.vd_next = BYTE_GET (evd.vd_next);
10271                                   ivd.vd_ndx  = BYTE_GET (evd.vd_ndx);
10272                                 }
10273
10274                               offset += ivd.vd_next;
10275                             }
10276                           while (ivd.vd_ndx != (data[cnt + j] & VERSYM_VERSION)
10277                                  && ivd.vd_next != 0);
10278
10279                           if (ivd.vd_ndx == (data[cnt + j] & VERSYM_VERSION))
10280                             {
10281                               Elf_External_Verdaux evda;
10282                               Elf_Internal_Verdaux ivda;
10283
10284                               ivd.vd_aux = BYTE_GET (evd.vd_aux);
10285
10286                               if (get_data (&evda, file,
10287                                             offset - ivd.vd_next + ivd.vd_aux,
10288                                             sizeof (evda), 1,
10289                                             _("version def aux")) == NULL)
10290                                 break;
10291
10292                               ivda.vda_name = BYTE_GET (evda.vda_name);
10293
10294                               if (ivda.vda_name >= string_sec->sh_size)
10295                                 name = invalid;
10296                               else if (name != NULL && name != invalid)
10297                                 name = _("*both*");
10298                               else
10299                                 name = strtab + ivda.vda_name;
10300                             }
10301                         }
10302                       if (name != NULL)
10303                         nn += printf ("(%s%-*s",
10304                                       name,
10305                                       12 - (int) strlen (name),
10306                                       ")");
10307
10308                       if (nn < 18)
10309                         printf ("%*c", 18 - nn, ' ');
10310                     }
10311
10312                 putchar ('\n');
10313               }
10314
10315             free (data);
10316             free (strtab);
10317             free (symbols);
10318           }
10319           break;
10320
10321         default:
10322           break;
10323         }
10324     }
10325
10326   if (! found)
10327     printf (_("\nNo version information found in this file.\n"));
10328
10329   return 1;
10330 }
10331
10332 static const char *
10333 get_symbol_binding (unsigned int binding)
10334 {
10335   static char buff[32];
10336
10337   switch (binding)
10338     {
10339     case STB_LOCAL:     return "LOCAL";
10340     case STB_GLOBAL:    return "GLOBAL";
10341     case STB_WEAK:      return "WEAK";
10342     default:
10343       if (binding >= STB_LOPROC && binding <= STB_HIPROC)
10344         snprintf (buff, sizeof (buff), _("<processor specific>: %d"),
10345                   binding);
10346       else if (binding >= STB_LOOS && binding <= STB_HIOS)
10347         {
10348           if (binding == STB_GNU_UNIQUE
10349               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10350                   /* GNU is still using the default value 0.  */
10351                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10352             return "UNIQUE";
10353           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), binding);
10354         }
10355       else
10356         snprintf (buff, sizeof (buff), _("<unknown>: %d"), binding);
10357       return buff;
10358     }
10359 }
10360
10361 static const char *
10362 get_symbol_type (unsigned int type)
10363 {
10364   static char buff[32];
10365
10366   switch (type)
10367     {
10368     case STT_NOTYPE:    return "NOTYPE";
10369     case STT_OBJECT:    return "OBJECT";
10370     case STT_FUNC:      return "FUNC";
10371     case STT_SECTION:   return "SECTION";
10372     case STT_FILE:      return "FILE";
10373     case STT_COMMON:    return "COMMON";
10374     case STT_TLS:       return "TLS";
10375     case STT_RELC:      return "RELC";
10376     case STT_SRELC:     return "SRELC";
10377     default:
10378       if (type >= STT_LOPROC && type <= STT_HIPROC)
10379         {
10380           if (elf_header.e_machine == EM_ARM && type == STT_ARM_TFUNC)
10381             return "THUMB_FUNC";
10382
10383           if (elf_header.e_machine == EM_SPARCV9 && type == STT_REGISTER)
10384             return "REGISTER";
10385
10386           if (elf_header.e_machine == EM_PARISC && type == STT_PARISC_MILLI)
10387             return "PARISC_MILLI";
10388
10389           snprintf (buff, sizeof (buff), _("<processor specific>: %d"), type);
10390         }
10391       else if (type >= STT_LOOS && type <= STT_HIOS)
10392         {
10393           if (elf_header.e_machine == EM_PARISC)
10394             {
10395               if (type == STT_HP_OPAQUE)
10396                 return "HP_OPAQUE";
10397               if (type == STT_HP_STUB)
10398                 return "HP_STUB";
10399             }
10400
10401           if (type == STT_GNU_IFUNC
10402               && (elf_header.e_ident[EI_OSABI] == ELFOSABI_GNU
10403                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_FREEBSD
10404                   /* GNU is still using the default value 0.  */
10405                   || elf_header.e_ident[EI_OSABI] == ELFOSABI_NONE))
10406             return "IFUNC";
10407
10408           snprintf (buff, sizeof (buff), _("<OS specific>: %d"), type);
10409         }
10410       else
10411         snprintf (buff, sizeof (buff), _("<unknown>: %d"), type);
10412       return buff;
10413     }
10414 }
10415
10416 static const char *
10417 get_symbol_visibility (unsigned int visibility)
10418 {
10419   switch (visibility)
10420     {
10421     case STV_DEFAULT:   return "DEFAULT";
10422     case STV_INTERNAL:  return "INTERNAL";
10423     case STV_HIDDEN:    return "HIDDEN";
10424     case STV_PROTECTED: return "PROTECTED";
10425     default:
10426       error (_("Unrecognized visibility value: %u"), visibility);
10427       return _("<unknown>");
10428     }
10429 }
10430
10431 static const char *
10432 get_solaris_symbol_visibility (unsigned int visibility)
10433 {
10434   switch (visibility)
10435     {
10436     case 4: return "EXPORTED";
10437     case 5: return "SINGLETON";
10438     case 6: return "ELIMINATE";
10439     default: return get_symbol_visibility (visibility);
10440     }
10441 }
10442
10443 static const char *
10444 get_mips_symbol_other (unsigned int other)
10445 {
10446   switch (other)
10447     {
10448     case STO_OPTIONAL:
10449       return "OPTIONAL";
10450     case STO_MIPS_PLT:
10451       return "MIPS PLT";
10452     case STO_MIPS_PIC:
10453       return "MIPS PIC";
10454     case STO_MICROMIPS:
10455       return "MICROMIPS";
10456     case STO_MICROMIPS | STO_MIPS_PIC:
10457       return "MICROMIPS, MIPS PIC";
10458     case STO_MIPS16:
10459       return "MIPS16";
10460     default:
10461       return NULL;
10462     }
10463 }
10464
10465 static const char *
10466 get_ia64_symbol_other (unsigned int other)
10467 {
10468   if (is_ia64_vms ())
10469     {
10470       static char res[32];
10471
10472       res[0] = 0;
10473
10474       /* Function types is for images and .STB files only.  */
10475       switch (elf_header.e_type)
10476         {
10477         case ET_DYN:
10478         case ET_EXEC:
10479           switch (VMS_ST_FUNC_TYPE (other))
10480             {
10481             case VMS_SFT_CODE_ADDR:
10482               strcat (res, " CA");
10483               break;
10484             case VMS_SFT_SYMV_IDX:
10485               strcat (res, " VEC");
10486               break;
10487             case VMS_SFT_FD:
10488               strcat (res, " FD");
10489               break;
10490             case VMS_SFT_RESERVE:
10491               strcat (res, " RSV");
10492               break;
10493             default:
10494               warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
10495                     VMS_ST_FUNC_TYPE (other));
10496               strcat (res, " <unknown>");
10497               break;
10498             }
10499           break;
10500         default:
10501           break;
10502         }
10503       switch (VMS_ST_LINKAGE (other))
10504         {
10505         case VMS_STL_IGNORE:
10506           strcat (res, " IGN");
10507           break;
10508         case VMS_STL_RESERVE:
10509           strcat (res, " RSV");
10510           break;
10511         case VMS_STL_STD:
10512           strcat (res, " STD");
10513           break;
10514         case VMS_STL_LNK:
10515           strcat (res, " LNK");
10516           break;
10517         default:
10518           warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
10519                 VMS_ST_LINKAGE (other));
10520           strcat (res, " <unknown>");
10521           break;
10522         }
10523
10524       if (res[0] != 0)
10525         return res + 1;
10526       else
10527         return res;
10528     }
10529   return NULL;
10530 }
10531
10532 static const char *
10533 get_ppc64_symbol_other (unsigned int other)
10534 {
10535   if (PPC64_LOCAL_ENTRY_OFFSET (other) != 0)
10536     {
10537       static char buf[32];
10538       snprintf (buf, sizeof buf, _("<localentry>: %d"),
10539                 PPC64_LOCAL_ENTRY_OFFSET (other));
10540       return buf;
10541     }
10542   return NULL;
10543 }
10544
10545 static const char *
10546 get_symbol_other (unsigned int other)
10547 {
10548   const char * result = NULL;
10549   static char buff [32];
10550
10551   if (other == 0)
10552     return "";
10553
10554   switch (elf_header.e_machine)
10555     {
10556     case EM_MIPS:
10557       result = get_mips_symbol_other (other);
10558       break;
10559     case EM_IA_64:
10560       result = get_ia64_symbol_other (other);
10561       break;
10562     case EM_PPC64:
10563       result = get_ppc64_symbol_other (other);
10564       break;
10565     default:
10566       result = NULL;
10567       break;
10568     }
10569
10570   if (result)
10571     return result;
10572
10573   snprintf (buff, sizeof buff, _("<other>: %x"), other);
10574   return buff;
10575 }
10576
10577 static const char *
10578 get_symbol_index_type (unsigned int type)
10579 {
10580   static char buff[32];
10581
10582   switch (type)
10583     {
10584     case SHN_UNDEF:     return "UND";
10585     case SHN_ABS:       return "ABS";
10586     case SHN_COMMON:    return "COM";
10587     default:
10588       if (type == SHN_IA_64_ANSI_COMMON
10589           && elf_header.e_machine == EM_IA_64
10590           && elf_header.e_ident[EI_OSABI] == ELFOSABI_HPUX)
10591         return "ANSI_COM";
10592       else if ((elf_header.e_machine == EM_X86_64
10593                 || elf_header.e_machine == EM_L1OM
10594                 || elf_header.e_machine == EM_K1OM)
10595                && type == SHN_X86_64_LCOMMON)
10596         return "LARGE_COM";
10597       else if ((type == SHN_MIPS_SCOMMON
10598                 && elf_header.e_machine == EM_MIPS)
10599                || (type == SHN_TIC6X_SCOMMON
10600                    && elf_header.e_machine == EM_TI_C6000))
10601         return "SCOM";
10602       else if (type == SHN_MIPS_SUNDEFINED
10603                && elf_header.e_machine == EM_MIPS)
10604         return "SUND";
10605       else if (type >= SHN_LOPROC && type <= SHN_HIPROC)
10606         sprintf (buff, "PRC[0x%04x]", type & 0xffff);
10607       else if (type >= SHN_LOOS && type <= SHN_HIOS)
10608         sprintf (buff, "OS [0x%04x]", type & 0xffff);
10609       else if (type >= SHN_LORESERVE)
10610         sprintf (buff, "RSV[0x%04x]", type & 0xffff);
10611       else if (type >= elf_header.e_shnum)
10612         sprintf (buff, _("bad section index[%3d]"), type);
10613       else
10614         sprintf (buff, "%3d", type);
10615       break;
10616     }
10617
10618   return buff;
10619 }
10620
10621 static bfd_vma *
10622 get_dynamic_data (FILE * file, bfd_size_type number, unsigned int ent_size)
10623 {
10624   unsigned char * e_data;
10625   bfd_vma * i_data;
10626
10627   /* If the size_t type is smaller than the bfd_size_type, eg because
10628      you are building a 32-bit tool on a 64-bit host, then make sure
10629      that when (number) is cast to (size_t) no information is lost.  */
10630   if (sizeof (size_t) < sizeof (bfd_size_type)
10631       && (bfd_size_type) ((size_t) number) != number)
10632     {
10633       error (_("Size truncation prevents reading %" BFD_VMA_FMT "u"
10634                " elements of size %u\n"),
10635              number, ent_size);
10636       return NULL;
10637     }
10638
10639   /* Be kind to memory chekers (eg valgrind, address sanitizer) by not
10640      attempting to allocate memory when the read is bound to fail.  */
10641   if (ent_size * number > current_file_size)
10642     {
10643       error (_("Invalid number of dynamic entries: %" BFD_VMA_FMT "u\n"),
10644              number);
10645       return NULL;
10646     }
10647
10648   e_data = (unsigned char *) cmalloc ((size_t) number, ent_size);
10649   if (e_data == NULL)
10650     {
10651       error (_("Out of memory reading %" BFD_VMA_FMT "u dynamic entries\n"),
10652              number);
10653       return NULL;
10654     }
10655
10656   if (fread (e_data, ent_size, (size_t) number, file) != number)
10657     {
10658       error (_("Unable to read in %" BFD_VMA_FMT "u bytes of dynamic data\n"),
10659              number * ent_size);
10660       free (e_data);
10661       return NULL;
10662     }
10663
10664   i_data = (bfd_vma *) cmalloc ((size_t) number, sizeof (*i_data));
10665   if (i_data == NULL)
10666     {
10667       error (_("Out of memory allocating space for %" BFD_VMA_FMT "u"
10668                " dynamic entries\n"),
10669              number);
10670       free (e_data);
10671       return NULL;
10672     }
10673
10674   while (number--)
10675     i_data[number] = byte_get (e_data + number * ent_size, ent_size);
10676
10677   free (e_data);
10678
10679   return i_data;
10680 }
10681
10682 static void
10683 print_dynamic_symbol (bfd_vma si, unsigned long hn)
10684 {
10685   Elf_Internal_Sym * psym;
10686   int n;
10687
10688   n = print_vma (si, DEC_5);
10689   if (n < 5)
10690     fputs (&"     "[n], stdout);
10691   printf (" %3lu: ", hn);
10692
10693   if (dynamic_symbols == NULL || si >= num_dynamic_syms)
10694     {
10695       printf (_("<No info available for dynamic symbol number %lu>\n"),
10696               (unsigned long) si);
10697       return;
10698     }
10699
10700   psym = dynamic_symbols + si;
10701   print_vma (psym->st_value, LONG_HEX);
10702   putchar (' ');
10703   print_vma (psym->st_size, DEC_5);
10704
10705   printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
10706   printf (" %-6s",  get_symbol_binding (ELF_ST_BIND (psym->st_info)));
10707
10708   if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
10709     printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
10710   else
10711     {
10712       unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
10713
10714       printf (" %-7s",  get_symbol_visibility (vis));
10715       /* Check to see if any other bits in the st_other field are set.
10716          Note - displaying this information disrupts the layout of the
10717          table being generated, but for the moment this case is very
10718          rare.  */
10719       if (psym->st_other ^ vis)
10720         printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
10721     }
10722
10723   printf (" %3.3s ", get_symbol_index_type (psym->st_shndx));
10724   if (VALID_DYNAMIC_NAME (psym->st_name))
10725     print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
10726   else
10727     printf (_(" <corrupt: %14ld>"), psym->st_name);
10728   putchar ('\n');
10729 }
10730
10731 static const char *
10732 get_symbol_version_string (FILE *file, int is_dynsym,
10733                            const char *strtab,
10734                            unsigned long int strtab_size,
10735                            unsigned int si, Elf_Internal_Sym *psym,
10736                            enum versioned_symbol_info *sym_info,
10737                            unsigned short *vna_other)
10738 {
10739   unsigned char data[2];
10740   unsigned short vers_data;
10741   unsigned long offset;
10742
10743   if (!is_dynsym
10744       || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0)
10745     return NULL;
10746
10747   offset = offset_from_vma (file, version_info[DT_VERSIONTAGIDX (DT_VERSYM)],
10748                             sizeof data + si * sizeof (vers_data));
10749
10750   if (get_data (&data, file, offset + si * sizeof (vers_data),
10751                 sizeof (data), 1, _("version data")) == NULL)
10752     return NULL;
10753
10754   vers_data = byte_get (data, 2);
10755
10756   if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data <= 1)
10757     return NULL;
10758
10759   /* Usually we'd only see verdef for defined symbols, and verneed for
10760      undefined symbols.  However, symbols defined by the linker in
10761      .dynbss for variables copied from a shared library in order to
10762      avoid text relocations are defined yet have verneed.  We could
10763      use a heuristic to detect the special case, for example, check
10764      for verneed first on symbols defined in SHT_NOBITS sections, but
10765      it is simpler and more reliable to just look for both verdef and
10766      verneed.  .dynbss might not be mapped to a SHT_NOBITS section.  */
10767
10768   if (psym->st_shndx != SHN_UNDEF
10769       && vers_data != 0x8001
10770       && version_info[DT_VERSIONTAGIDX (DT_VERDEF)])
10771     {
10772       Elf_Internal_Verdef ivd;
10773       Elf_Internal_Verdaux ivda;
10774       Elf_External_Verdaux evda;
10775       unsigned long off;
10776
10777       off = offset_from_vma (file,
10778                              version_info[DT_VERSIONTAGIDX (DT_VERDEF)],
10779                              sizeof (Elf_External_Verdef));
10780
10781       do
10782         {
10783           Elf_External_Verdef evd;
10784
10785           if (get_data (&evd, file, off, sizeof (evd), 1,
10786                         _("version def")) == NULL)
10787             {
10788               ivd.vd_ndx = 0;
10789               ivd.vd_aux = 0;
10790               ivd.vd_next = 0;
10791             }
10792           else
10793             {
10794               ivd.vd_ndx = BYTE_GET (evd.vd_ndx);
10795               ivd.vd_aux = BYTE_GET (evd.vd_aux);
10796               ivd.vd_next = BYTE_GET (evd.vd_next);
10797             }
10798
10799           off += ivd.vd_next;
10800         }
10801       while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0);
10802
10803       if (ivd.vd_ndx == (vers_data & VERSYM_VERSION))
10804         {
10805           off -= ivd.vd_next;
10806           off += ivd.vd_aux;
10807
10808           if (get_data (&evda, file, off, sizeof (evda), 1,
10809                         _("version def aux")) != NULL)
10810             {
10811               ivda.vda_name = BYTE_GET (evda.vda_name);
10812
10813               if (psym->st_name != ivda.vda_name)
10814                 {
10815                   *sym_info = ((vers_data & VERSYM_HIDDEN) != 0
10816                                ? symbol_hidden : symbol_public);
10817                   return (ivda.vda_name < strtab_size
10818                           ? strtab + ivda.vda_name : _("<corrupt>"));
10819                 }
10820             }
10821         }
10822     }
10823
10824   if (version_info[DT_VERSIONTAGIDX (DT_VERNEED)])
10825     {
10826       Elf_External_Verneed evn;
10827       Elf_Internal_Verneed ivn;
10828       Elf_Internal_Vernaux ivna;
10829
10830       offset = offset_from_vma (file,
10831                                 version_info[DT_VERSIONTAGIDX (DT_VERNEED)],
10832                                 sizeof evn);
10833       do
10834         {
10835           unsigned long vna_off;
10836
10837           if (get_data (&evn, file, offset, sizeof (evn), 1,
10838                         _("version need")) == NULL)
10839             {
10840               ivna.vna_next = 0;
10841               ivna.vna_other = 0;
10842               ivna.vna_name = 0;
10843               break;
10844             }
10845
10846           ivn.vn_aux  = BYTE_GET (evn.vn_aux);
10847           ivn.vn_next = BYTE_GET (evn.vn_next);
10848
10849           vna_off = offset + ivn.vn_aux;
10850
10851           do
10852             {
10853               Elf_External_Vernaux evna;
10854
10855               if (get_data (&evna, file, vna_off, sizeof (evna), 1,
10856                             _("version need aux (3)")) == NULL)
10857                 {
10858                   ivna.vna_next = 0;
10859                   ivna.vna_other = 0;
10860                   ivna.vna_name = 0;
10861                 }
10862               else
10863                 {
10864                   ivna.vna_other = BYTE_GET (evna.vna_other);
10865                   ivna.vna_next  = BYTE_GET (evna.vna_next);
10866                   ivna.vna_name  = BYTE_GET (evna.vna_name);
10867                 }
10868
10869               vna_off += ivna.vna_next;
10870             }
10871           while (ivna.vna_other != vers_data && ivna.vna_next != 0);
10872
10873           if (ivna.vna_other == vers_data)
10874             break;
10875
10876           offset += ivn.vn_next;
10877         }
10878       while (ivn.vn_next != 0);
10879
10880       if (ivna.vna_other == vers_data)
10881         {
10882           *sym_info = symbol_undefined;
10883           *vna_other = ivna.vna_other;
10884           return (ivna.vna_name < strtab_size
10885                   ? strtab + ivna.vna_name : _("<corrupt>"));
10886         }
10887     }
10888   return NULL;
10889 }
10890
10891 /* Dump the symbol table.  */
10892 static int
10893 process_symbol_table (FILE * file)
10894 {
10895   Elf_Internal_Shdr * section;
10896   bfd_size_type nbuckets = 0;
10897   bfd_size_type nchains = 0;
10898   bfd_vma * buckets = NULL;
10899   bfd_vma * chains = NULL;
10900   bfd_vma ngnubuckets = 0;
10901   bfd_vma * gnubuckets = NULL;
10902   bfd_vma * gnuchains = NULL;
10903   bfd_vma gnusymidx = 0;
10904   bfd_size_type ngnuchains = 0;
10905
10906   if (!do_syms && !do_dyn_syms && !do_histogram)
10907     return 1;
10908
10909   if (dynamic_info[DT_HASH]
10910       && (do_histogram
10911           || (do_using_dynamic
10912               && !do_dyn_syms
10913               && dynamic_strings != NULL)))
10914     {
10915       unsigned char nb[8];
10916       unsigned char nc[8];
10917       unsigned int hash_ent_size = 4;
10918
10919       if ((elf_header.e_machine == EM_ALPHA
10920            || elf_header.e_machine == EM_S390
10921            || elf_header.e_machine == EM_S390_OLD)
10922           && elf_header.e_ident[EI_CLASS] == ELFCLASS64)
10923         hash_ent_size = 8;
10924
10925       if (fseek (file,
10926                  (archive_file_offset
10927                   + offset_from_vma (file, dynamic_info[DT_HASH],
10928                                      sizeof nb + sizeof nc)),
10929                  SEEK_SET))
10930         {
10931           error (_("Unable to seek to start of dynamic information\n"));
10932           goto no_hash;
10933         }
10934
10935       if (fread (nb, hash_ent_size, 1, file) != 1)
10936         {
10937           error (_("Failed to read in number of buckets\n"));
10938           goto no_hash;
10939         }
10940
10941       if (fread (nc, hash_ent_size, 1, file) != 1)
10942         {
10943           error (_("Failed to read in number of chains\n"));
10944           goto no_hash;
10945         }
10946
10947       nbuckets = byte_get (nb, hash_ent_size);
10948       nchains  = byte_get (nc, hash_ent_size);
10949
10950       buckets = get_dynamic_data (file, nbuckets, hash_ent_size);
10951       chains  = get_dynamic_data (file, nchains, hash_ent_size);
10952
10953     no_hash:
10954       if (buckets == NULL || chains == NULL)
10955         {
10956           if (do_using_dynamic)
10957             return 0;
10958           free (buckets);
10959           free (chains);
10960           buckets = NULL;
10961           chains = NULL;
10962           nbuckets = 0;
10963           nchains = 0;
10964         }
10965     }
10966
10967   if (dynamic_info_DT_GNU_HASH
10968       && (do_histogram
10969           || (do_using_dynamic
10970               && !do_dyn_syms
10971               && dynamic_strings != NULL)))
10972     {
10973       unsigned char nb[16];
10974       bfd_vma i, maxchain = 0xffffffff, bitmaskwords;
10975       bfd_vma buckets_vma;
10976
10977       if (fseek (file,
10978                  (archive_file_offset
10979                   + offset_from_vma (file, dynamic_info_DT_GNU_HASH,
10980                                      sizeof nb)),
10981                  SEEK_SET))
10982         {
10983           error (_("Unable to seek to start of dynamic information\n"));
10984           goto no_gnu_hash;
10985         }
10986
10987       if (fread (nb, 16, 1, file) != 1)
10988         {
10989           error (_("Failed to read in number of buckets\n"));
10990           goto no_gnu_hash;
10991         }
10992
10993       ngnubuckets = byte_get (nb, 4);
10994       gnusymidx = byte_get (nb + 4, 4);
10995       bitmaskwords = byte_get (nb + 8, 4);
10996       buckets_vma = dynamic_info_DT_GNU_HASH + 16;
10997       if (is_32bit_elf)
10998         buckets_vma += bitmaskwords * 4;
10999       else
11000         buckets_vma += bitmaskwords * 8;
11001
11002       if (fseek (file,
11003                  (archive_file_offset
11004                   + offset_from_vma (file, buckets_vma, 4)),
11005                  SEEK_SET))
11006         {
11007           error (_("Unable to seek to start of dynamic information\n"));
11008           goto no_gnu_hash;
11009         }
11010
11011       gnubuckets = get_dynamic_data (file, ngnubuckets, 4);
11012
11013       if (gnubuckets == NULL)
11014         goto no_gnu_hash;
11015
11016       for (i = 0; i < ngnubuckets; i++)
11017         if (gnubuckets[i] != 0)
11018           {
11019             if (gnubuckets[i] < gnusymidx)
11020               return 0;
11021
11022             if (maxchain == 0xffffffff || gnubuckets[i] > maxchain)
11023               maxchain = gnubuckets[i];
11024           }
11025
11026       if (maxchain == 0xffffffff)
11027         goto no_gnu_hash;
11028
11029       maxchain -= gnusymidx;
11030
11031       if (fseek (file,
11032                  (archive_file_offset
11033                   + offset_from_vma (file, buckets_vma
11034                                            + 4 * (ngnubuckets + maxchain), 4)),
11035                  SEEK_SET))
11036         {
11037           error (_("Unable to seek to start of dynamic information\n"));
11038           goto no_gnu_hash;
11039         }
11040
11041       do
11042         {
11043           if (fread (nb, 4, 1, file) != 1)
11044             {
11045               error (_("Failed to determine last chain length\n"));
11046               goto no_gnu_hash;
11047             }
11048
11049           if (maxchain + 1 == 0)
11050             goto no_gnu_hash;
11051
11052           ++maxchain;
11053         }
11054       while ((byte_get (nb, 4) & 1) == 0);
11055
11056       if (fseek (file,
11057                  (archive_file_offset
11058                   + offset_from_vma (file, buckets_vma + 4 * ngnubuckets, 4)),
11059                  SEEK_SET))
11060         {
11061           error (_("Unable to seek to start of dynamic information\n"));
11062           goto no_gnu_hash;
11063         }
11064
11065       gnuchains = get_dynamic_data (file, maxchain, 4);
11066       ngnuchains = maxchain;
11067
11068     no_gnu_hash:
11069       if (gnuchains == NULL)
11070         {
11071           free (gnubuckets);
11072           gnubuckets = NULL;
11073           ngnubuckets = 0;
11074           if (do_using_dynamic)
11075             return 0;
11076         }
11077     }
11078
11079   if ((dynamic_info[DT_HASH] || dynamic_info_DT_GNU_HASH)
11080       && do_syms
11081       && do_using_dynamic
11082       && dynamic_strings != NULL
11083       && dynamic_symbols != NULL)
11084     {
11085       unsigned long hn;
11086
11087       if (dynamic_info[DT_HASH])
11088         {
11089           bfd_vma si;
11090
11091           printf (_("\nSymbol table for image:\n"));
11092           if (is_32bit_elf)
11093             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11094           else
11095             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11096
11097           for (hn = 0; hn < nbuckets; hn++)
11098             {
11099               if (! buckets[hn])
11100                 continue;
11101
11102               for (si = buckets[hn]; si < nchains && si > 0; si = chains[si])
11103                 print_dynamic_symbol (si, hn);
11104             }
11105         }
11106
11107       if (dynamic_info_DT_GNU_HASH)
11108         {
11109           printf (_("\nSymbol table of `.gnu.hash' for image:\n"));
11110           if (is_32bit_elf)
11111             printf (_("  Num Buc:    Value  Size   Type   Bind Vis      Ndx Name\n"));
11112           else
11113             printf (_("  Num Buc:    Value          Size   Type   Bind Vis      Ndx Name\n"));
11114
11115           for (hn = 0; hn < ngnubuckets; ++hn)
11116             if (gnubuckets[hn] != 0)
11117               {
11118                 bfd_vma si = gnubuckets[hn];
11119                 bfd_vma off = si - gnusymidx;
11120
11121                 do
11122                   {
11123                     print_dynamic_symbol (si, hn);
11124                     si++;
11125                   }
11126                 while (off < ngnuchains && (gnuchains[off++] & 1) == 0);
11127               }
11128         }
11129     }
11130   else if ((do_dyn_syms || (do_syms && !do_using_dynamic))
11131            && section_headers != NULL)
11132     {
11133       unsigned int i;
11134
11135       for (i = 0, section = section_headers;
11136            i < elf_header.e_shnum;
11137            i++, section++)
11138         {
11139           unsigned int si;
11140           char * strtab = NULL;
11141           unsigned long int strtab_size = 0;
11142           Elf_Internal_Sym * symtab;
11143           Elf_Internal_Sym * psym;
11144           unsigned long num_syms;
11145
11146           if ((section->sh_type != SHT_SYMTAB
11147                && section->sh_type != SHT_DYNSYM)
11148               || (!do_syms
11149                   && section->sh_type == SHT_SYMTAB))
11150             continue;
11151
11152           if (section->sh_entsize == 0)
11153             {
11154               printf (_("\nSymbol table '%s' has a sh_entsize of zero!\n"),
11155                       printable_section_name (section));
11156               continue;
11157             }
11158
11159           printf (_("\nSymbol table '%s' contains %lu entries:\n"),
11160                   printable_section_name (section),
11161                   (unsigned long) (section->sh_size / section->sh_entsize));
11162
11163           if (is_32bit_elf)
11164             printf (_("   Num:    Value  Size Type    Bind   Vis      Ndx Name\n"));
11165           else
11166             printf (_("   Num:    Value          Size Type    Bind   Vis      Ndx Name\n"));
11167
11168           symtab = GET_ELF_SYMBOLS (file, section, & num_syms);
11169           if (symtab == NULL)
11170             continue;
11171
11172           if (section->sh_link == elf_header.e_shstrndx)
11173             {
11174               strtab = string_table;
11175               strtab_size = string_table_length;
11176             }
11177           else if (section->sh_link < elf_header.e_shnum)
11178             {
11179               Elf_Internal_Shdr * string_sec;
11180
11181               string_sec = section_headers + section->sh_link;
11182
11183               strtab = (char *) get_data (NULL, file, string_sec->sh_offset,
11184                                           1, string_sec->sh_size,
11185                                           _("string table"));
11186               strtab_size = strtab != NULL ? string_sec->sh_size : 0;
11187             }
11188
11189           for (si = 0, psym = symtab; si < num_syms; si++, psym++)
11190             {
11191               const char *version_string;
11192               enum versioned_symbol_info sym_info;
11193               unsigned short vna_other;
11194
11195               printf ("%6d: ", si);
11196               print_vma (psym->st_value, LONG_HEX);
11197               putchar (' ');
11198               print_vma (psym->st_size, DEC_5);
11199               printf (" %-7s", get_symbol_type (ELF_ST_TYPE (psym->st_info)));
11200               printf (" %-6s", get_symbol_binding (ELF_ST_BIND (psym->st_info)));
11201               if (elf_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
11202                 printf (" %-7s",  get_solaris_symbol_visibility (psym->st_other));
11203               else
11204                 {
11205                   unsigned int vis = ELF_ST_VISIBILITY (psym->st_other);
11206
11207                   printf (" %-7s", get_symbol_visibility (vis));
11208                   /* Check to see if any other bits in the st_other field are set.
11209                      Note - displaying this information disrupts the layout of the
11210                      table being generated, but for the moment this case is very rare.  */
11211                   if (psym->st_other ^ vis)
11212                     printf (" [%s] ", get_symbol_other (psym->st_other ^ vis));
11213                 }
11214               printf (" %4s ", get_symbol_index_type (psym->st_shndx));
11215               print_symbol (25, psym->st_name < strtab_size
11216                             ? strtab + psym->st_name : _("<corrupt>"));
11217
11218               version_string
11219                 = get_symbol_version_string (file,
11220                                              section->sh_type == SHT_DYNSYM,
11221                                              strtab, strtab_size, si,
11222                                              psym, &sym_info, &vna_other);
11223               if (version_string)
11224                 {
11225                   if (sym_info == symbol_undefined)
11226                     printf ("@%s (%d)", version_string, vna_other);
11227                   else
11228                     printf (sym_info == symbol_hidden ? "@%s" : "@@%s",
11229                             version_string);
11230                 }
11231
11232               putchar ('\n');
11233
11234               if (ELF_ST_BIND (psym->st_info) == STB_LOCAL
11235                   && si >= section->sh_info
11236                   /* Irix 5 and 6 MIPS binaries are known to ignore this requirement.  */
11237                   && elf_header.e_machine != EM_MIPS
11238                   /* Solaris binaries have been found to violate this requirement as
11239                      well.  Not sure if this is a bug or an ABI requirement.  */
11240                   && elf_header.e_ident[EI_OSABI] != ELFOSABI_SOLARIS)
11241                 warn (_("local symbol %u found at index >= %s's sh_info value of %u\n"),
11242                       si, printable_section_name (section), section->sh_info);
11243             }
11244
11245           free (symtab);
11246           if (strtab != string_table)
11247             free (strtab);
11248         }
11249     }
11250   else if (do_syms)
11251     printf
11252       (_("\nDynamic symbol information is not available for displaying symbols.\n"));
11253
11254   if (do_histogram && buckets != NULL)
11255     {
11256       unsigned long * lengths;
11257       unsigned long * counts;
11258       unsigned long hn;
11259       bfd_vma si;
11260       unsigned long maxlength = 0;
11261       unsigned long nzero_counts = 0;
11262       unsigned long nsyms = 0;
11263       unsigned long chained;
11264
11265       printf (_("\nHistogram for bucket list length (total of %lu buckets):\n"),
11266               (unsigned long) nbuckets);
11267
11268       lengths = (unsigned long *) calloc (nbuckets, sizeof (*lengths));
11269       if (lengths == NULL)
11270         {
11271           error (_("Out of memory allocating space for histogram buckets\n"));
11272           return 0;
11273         }
11274
11275       printf (_(" Length  Number     %% of total  Coverage\n"));
11276       for (hn = 0; hn < nbuckets; ++hn)
11277         {
11278           for (si = buckets[hn], chained = 0;
11279                si > 0 && si < nchains && si < nbuckets && chained <= nchains;
11280                si = chains[si], ++chained)
11281             {
11282               ++nsyms;
11283               if (maxlength < ++lengths[hn])
11284                 ++maxlength;
11285             }
11286
11287             /* PR binutils/17531: A corrupt binary could contain broken
11288                histogram data.  Do not go into an infinite loop trying
11289                to process it.  */
11290             if (chained > nchains)
11291               {
11292                 error (_("histogram chain is corrupt\n"));
11293                 break;
11294               }
11295         }
11296
11297       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11298       if (counts == NULL)
11299         {
11300           free (lengths);
11301           error (_("Out of memory allocating space for histogram counts\n"));
11302           return 0;
11303         }
11304
11305       for (hn = 0; hn < nbuckets; ++hn)
11306         ++counts[lengths[hn]];
11307
11308       if (nbuckets > 0)
11309         {
11310           unsigned long i;
11311           printf ("      0  %-10lu (%5.1f%%)\n",
11312                   counts[0], (counts[0] * 100.0) / nbuckets);
11313           for (i = 1; i <= maxlength; ++i)
11314             {
11315               nzero_counts += counts[i] * i;
11316               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
11317                       i, counts[i], (counts[i] * 100.0) / nbuckets,
11318                       (nzero_counts * 100.0) / nsyms);
11319             }
11320         }
11321
11322       free (counts);
11323       free (lengths);
11324     }
11325
11326   if (buckets != NULL)
11327     {
11328       free (buckets);
11329       free (chains);
11330     }
11331
11332   if (do_histogram && gnubuckets != NULL)
11333     {
11334       unsigned long * lengths;
11335       unsigned long * counts;
11336       unsigned long hn;
11337       unsigned long maxlength = 0;
11338       unsigned long nzero_counts = 0;
11339       unsigned long nsyms = 0;
11340
11341       printf (_("\nHistogram for `.gnu.hash' bucket list length (total of %lu buckets):\n"),
11342               (unsigned long) ngnubuckets);
11343
11344       lengths = (unsigned long *) calloc (ngnubuckets, sizeof (*lengths));
11345       if (lengths == NULL)
11346         {
11347           error (_("Out of memory allocating space for gnu histogram buckets\n"));
11348           return 0;
11349         }
11350
11351       printf (_(" Length  Number     %% of total  Coverage\n"));
11352
11353       for (hn = 0; hn < ngnubuckets; ++hn)
11354         if (gnubuckets[hn] != 0)
11355           {
11356             bfd_vma off, length = 1;
11357
11358             for (off = gnubuckets[hn] - gnusymidx;
11359                  /* PR 17531 file: 010-77222-0.004.  */
11360                  off < ngnuchains && (gnuchains[off] & 1) == 0;
11361                  ++off)
11362               ++length;
11363             lengths[hn] = length;
11364             if (length > maxlength)
11365               maxlength = length;
11366             nsyms += length;
11367           }
11368
11369       counts = (unsigned long *) calloc (maxlength + 1, sizeof (*counts));
11370       if (counts == NULL)
11371         {
11372           free (lengths);
11373           error (_("Out of memory allocating space for gnu histogram counts\n"));
11374           return 0;
11375         }
11376
11377       for (hn = 0; hn < ngnubuckets; ++hn)
11378         ++counts[lengths[hn]];
11379
11380       if (ngnubuckets > 0)
11381         {
11382           unsigned long j;
11383           printf ("      0  %-10lu (%5.1f%%)\n",
11384                   counts[0], (counts[0] * 100.0) / ngnubuckets);
11385           for (j = 1; j <= maxlength; ++j)
11386             {
11387               nzero_counts += counts[j] * j;
11388               printf ("%7lu  %-10lu (%5.1f%%)    %5.1f%%\n",
11389                       j, counts[j], (counts[j] * 100.0) / ngnubuckets,
11390                       (nzero_counts * 100.0) / nsyms);
11391             }
11392         }
11393
11394       free (counts);
11395       free (lengths);
11396       free (gnubuckets);
11397       free (gnuchains);
11398     }
11399
11400   return 1;
11401 }
11402
11403 static int
11404 process_syminfo (FILE * file ATTRIBUTE_UNUSED)
11405 {
11406   unsigned int i;
11407
11408   if (dynamic_syminfo == NULL
11409       || !do_dynamic)
11410     /* No syminfo, this is ok.  */
11411     return 1;
11412
11413   /* There better should be a dynamic symbol section.  */
11414   if (dynamic_symbols == NULL || dynamic_strings == NULL)
11415     return 0;
11416
11417   if (dynamic_addr)
11418     printf (_("\nDynamic info segment at offset 0x%lx contains %d entries:\n"),
11419             dynamic_syminfo_offset, dynamic_syminfo_nent);
11420
11421   printf (_(" Num: Name                           BoundTo     Flags\n"));
11422   for (i = 0; i < dynamic_syminfo_nent; ++i)
11423     {
11424       unsigned short int flags = dynamic_syminfo[i].si_flags;
11425
11426       printf ("%4d: ", i);
11427       if (i >= num_dynamic_syms)
11428         printf (_("<corrupt index>"));
11429       else if (VALID_DYNAMIC_NAME (dynamic_symbols[i].st_name))
11430         print_symbol (30, GET_DYNAMIC_NAME (dynamic_symbols[i].st_name));
11431       else
11432         printf (_("<corrupt: %19ld>"), dynamic_symbols[i].st_name);
11433       putchar (' ');
11434
11435       switch (dynamic_syminfo[i].si_boundto)
11436         {
11437         case SYMINFO_BT_SELF:
11438           fputs ("SELF       ", stdout);
11439           break;
11440         case SYMINFO_BT_PARENT:
11441           fputs ("PARENT     ", stdout);
11442           break;
11443         default:
11444           if (dynamic_syminfo[i].si_boundto > 0
11445               && dynamic_syminfo[i].si_boundto < dynamic_nent
11446               && VALID_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val))
11447             {
11448               print_symbol (10, GET_DYNAMIC_NAME (dynamic_section[dynamic_syminfo[i].si_boundto].d_un.d_val));
11449               putchar (' ' );
11450             }
11451           else
11452             printf ("%-10d ", dynamic_syminfo[i].si_boundto);
11453           break;
11454         }
11455
11456       if (flags & SYMINFO_FLG_DIRECT)
11457         printf (" DIRECT");
11458       if (flags & SYMINFO_FLG_PASSTHRU)
11459         printf (" PASSTHRU");
11460       if (flags & SYMINFO_FLG_COPY)
11461         printf (" COPY");
11462       if (flags & SYMINFO_FLG_LAZYLOAD)
11463         printf (" LAZYLOAD");
11464
11465       puts ("");
11466     }
11467
11468   return 1;
11469 }
11470
11471 /* Check to see if the given reloc needs to be handled in a target specific
11472    manner.  If so then process the reloc and return TRUE otherwise return
11473    FALSE.  */
11474
11475 static bfd_boolean
11476 target_specific_reloc_handling (Elf_Internal_Rela * reloc,
11477                                 unsigned char *     start,
11478                                 Elf_Internal_Sym *  symtab)
11479 {
11480   unsigned int reloc_type = get_reloc_type (reloc->r_info);
11481
11482   switch (elf_header.e_machine)
11483     {
11484     case EM_MSP430:
11485     case EM_MSP430_OLD:
11486       {
11487         static Elf_Internal_Sym * saved_sym = NULL;
11488
11489         switch (reloc_type)
11490           {
11491           case 10: /* R_MSP430_SYM_DIFF */
11492             if (uses_msp430x_relocs ())
11493               break;
11494           case 21: /* R_MSP430X_SYM_DIFF */
11495             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11496             return TRUE;
11497
11498           case 1: /* R_MSP430_32 or R_MSP430_ABS32 */
11499           case 3: /* R_MSP430_16 or R_MSP430_ABS8 */
11500             goto handle_sym_diff;
11501
11502           case 5: /* R_MSP430_16_BYTE */
11503           case 9: /* R_MSP430_8 */
11504             if (uses_msp430x_relocs ())
11505               break;
11506             goto handle_sym_diff;
11507
11508           case 2: /* R_MSP430_ABS16 */
11509           case 15: /* R_MSP430X_ABS16 */
11510             if (! uses_msp430x_relocs ())
11511               break;
11512             goto handle_sym_diff;
11513
11514           handle_sym_diff:
11515             if (saved_sym != NULL)
11516               {
11517                 bfd_vma value;
11518
11519                 value = reloc->r_addend
11520                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11521                      - saved_sym->st_value);
11522
11523                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11524
11525                 saved_sym = NULL;
11526                 return TRUE;
11527               }
11528             break;
11529
11530           default:
11531             if (saved_sym != NULL)
11532               error (_("Unhandled MSP430 reloc type found after SYM_DIFF reloc\n"));
11533             break;
11534           }
11535         break;
11536       }
11537
11538     case EM_MN10300:
11539     case EM_CYGNUS_MN10300:
11540       {
11541         static Elf_Internal_Sym * saved_sym = NULL;
11542
11543         switch (reloc_type)
11544           {
11545           case 34: /* R_MN10300_ALIGN */
11546             return TRUE;
11547           case 33: /* R_MN10300_SYM_DIFF */
11548             saved_sym = symtab + get_reloc_symindex (reloc->r_info);
11549             return TRUE;
11550           case 1: /* R_MN10300_32 */
11551           case 2: /* R_MN10300_16 */
11552             if (saved_sym != NULL)
11553               {
11554                 bfd_vma value;
11555
11556                 value = reloc->r_addend
11557                   + (symtab[get_reloc_symindex (reloc->r_info)].st_value
11558                      - saved_sym->st_value);
11559
11560                 byte_put (start + reloc->r_offset, value, reloc_type == 1 ? 4 : 2);
11561
11562                 saved_sym = NULL;
11563                 return TRUE;
11564               }
11565             break;
11566           default:
11567             if (saved_sym != NULL)
11568               error (_("Unhandled MN10300 reloc type found after SYM_DIFF reloc\n"));
11569             break;
11570           }
11571         break;
11572       }
11573
11574     case EM_RL78:
11575       {
11576         static bfd_vma saved_sym1 = 0;
11577         static bfd_vma saved_sym2 = 0;
11578         static bfd_vma value;
11579
11580         switch (reloc_type)
11581           {
11582           case 0x80: /* R_RL78_SYM.  */
11583             saved_sym1 = saved_sym2;
11584             saved_sym2 = symtab[get_reloc_symindex (reloc->r_info)].st_value;
11585             saved_sym2 += reloc->r_addend;
11586             return TRUE;
11587
11588           case 0x83: /* R_RL78_OPsub.  */
11589             value = saved_sym1 - saved_sym2;
11590             saved_sym2 = saved_sym1 = 0;
11591             return TRUE;
11592             break;
11593
11594           case 0x41: /* R_RL78_ABS32.  */
11595             byte_put (start + reloc->r_offset, value, 4);
11596             value = 0;
11597             return TRUE;
11598
11599           case 0x43: /* R_RL78_ABS16.  */
11600             byte_put (start + reloc->r_offset, value, 2);
11601             value = 0;
11602             return TRUE;
11603
11604           default:
11605             break;
11606           }
11607         break;
11608       }
11609     }
11610
11611   return FALSE;
11612 }
11613
11614 /* Returns TRUE iff RELOC_TYPE is a 32-bit absolute RELA relocation used in
11615    DWARF debug sections.  This is a target specific test.  Note - we do not
11616    go through the whole including-target-headers-multiple-times route, (as
11617    we have already done with <elf/h8.h>) because this would become very
11618    messy and even then this function would have to contain target specific
11619    information (the names of the relocs instead of their numeric values).
11620    FIXME: This is not the correct way to solve this problem.  The proper way
11621    is to have target specific reloc sizing and typing functions created by
11622    the reloc-macros.h header, in the same way that it already creates the
11623    reloc naming functions.  */
11624
11625 static bfd_boolean
11626 is_32bit_abs_reloc (unsigned int reloc_type)
11627 {
11628   /* Please keep this table alpha-sorted for ease of visual lookup.  */
11629   switch (elf_header.e_machine)
11630     {
11631     case EM_386:
11632     case EM_IAMCU:
11633       return reloc_type == 1; /* R_386_32.  */
11634     case EM_68K:
11635       return reloc_type == 1; /* R_68K_32.  */
11636     case EM_860:
11637       return reloc_type == 1; /* R_860_32.  */
11638     case EM_960:
11639       return reloc_type == 2; /* R_960_32.  */
11640     case EM_AARCH64:
11641       return reloc_type == 258; /* R_AARCH64_ABS32 */
11642     case EM_ADAPTEVA_EPIPHANY:
11643       return reloc_type == 3;
11644     case EM_ALPHA:
11645       return reloc_type == 1; /* R_ALPHA_REFLONG.  */
11646     case EM_ARC:
11647       return reloc_type == 1; /* R_ARC_32.  */
11648     case EM_ARC_COMPACT:
11649     case EM_ARC_COMPACT2:
11650       return reloc_type == 4; /* R_ARC_32.  */
11651     case EM_ARM:
11652       return reloc_type == 2; /* R_ARM_ABS32 */
11653     case EM_AVR_OLD:
11654     case EM_AVR:
11655       return reloc_type == 1;
11656     case EM_BLACKFIN:
11657       return reloc_type == 0x12; /* R_byte4_data.  */
11658     case EM_CRIS:
11659       return reloc_type == 3; /* R_CRIS_32.  */
11660     case EM_CR16:
11661       return reloc_type == 3; /* R_CR16_NUM32.  */
11662     case EM_CRX:
11663       return reloc_type == 15; /* R_CRX_NUM32.  */
11664     case EM_CYGNUS_FRV:
11665       return reloc_type == 1;
11666     case EM_CYGNUS_D10V:
11667     case EM_D10V:
11668       return reloc_type == 6; /* R_D10V_32.  */
11669     case EM_CYGNUS_D30V:
11670     case EM_D30V:
11671       return reloc_type == 12; /* R_D30V_32_NORMAL.  */
11672     case EM_DLX:
11673       return reloc_type == 3; /* R_DLX_RELOC_32.  */
11674     case EM_CYGNUS_FR30:
11675     case EM_FR30:
11676       return reloc_type == 3; /* R_FR30_32.  */
11677     case EM_FT32:
11678       return reloc_type == 1; /* R_FT32_32.  */
11679     case EM_H8S:
11680     case EM_H8_300:
11681     case EM_H8_300H:
11682       return reloc_type == 1; /* R_H8_DIR32.  */
11683     case EM_IA_64:
11684       return reloc_type == 0x65 /* R_IA64_SECREL32LSB.  */
11685         || reloc_type == 0x25;  /* R_IA64_DIR32LSB.  */
11686     case EM_IP2K_OLD:
11687     case EM_IP2K:
11688       return reloc_type == 2; /* R_IP2K_32.  */
11689     case EM_IQ2000:
11690       return reloc_type == 2; /* R_IQ2000_32.  */
11691     case EM_LATTICEMICO32:
11692       return reloc_type == 3; /* R_LM32_32.  */
11693     case EM_M32C_OLD:
11694     case EM_M32C:
11695       return reloc_type == 3; /* R_M32C_32.  */
11696     case EM_M32R:
11697       return reloc_type == 34; /* R_M32R_32_RELA.  */
11698     case EM_68HC11:
11699     case EM_68HC12:
11700       return reloc_type == 6; /* R_M68HC11_32.  */
11701     case EM_MCORE:
11702       return reloc_type == 1; /* R_MCORE_ADDR32.  */
11703     case EM_CYGNUS_MEP:
11704       return reloc_type == 4; /* R_MEP_32.  */
11705     case EM_METAG:
11706       return reloc_type == 2; /* R_METAG_ADDR32.  */
11707     case EM_MICROBLAZE:
11708       return reloc_type == 1; /* R_MICROBLAZE_32.  */
11709     case EM_MIPS:
11710       return reloc_type == 2; /* R_MIPS_32.  */
11711     case EM_MMIX:
11712       return reloc_type == 4; /* R_MMIX_32.  */
11713     case EM_CYGNUS_MN10200:
11714     case EM_MN10200:
11715       return reloc_type == 1; /* R_MN10200_32.  */
11716     case EM_CYGNUS_MN10300:
11717     case EM_MN10300:
11718       return reloc_type == 1; /* R_MN10300_32.  */
11719     case EM_MOXIE:
11720       return reloc_type == 1; /* R_MOXIE_32.  */
11721     case EM_MSP430_OLD:
11722     case EM_MSP430:
11723       return reloc_type == 1; /* R_MSP430_32 or R_MSP320_ABS32.  */
11724     case EM_MT:
11725       return reloc_type == 2; /* R_MT_32.  */
11726     case EM_NDS32:
11727       return reloc_type == 20; /* R_NDS32_RELA.  */
11728     case EM_ALTERA_NIOS2:
11729       return reloc_type == 12; /* R_NIOS2_BFD_RELOC_32.  */
11730     case EM_NIOS32:
11731       return reloc_type == 1; /* R_NIOS_32.  */
11732     case EM_OR1K:
11733       return reloc_type == 1; /* R_OR1K_32.  */
11734     case EM_PARISC:
11735       return (reloc_type == 1 /* R_PARISC_DIR32.  */
11736               || reloc_type == 41); /* R_PARISC_SECREL32.  */
11737     case EM_PJ:
11738     case EM_PJ_OLD:
11739       return reloc_type == 1; /* R_PJ_DATA_DIR32.  */
11740     case EM_PPC64:
11741       return reloc_type == 1; /* R_PPC64_ADDR32.  */
11742     case EM_PPC:
11743       return reloc_type == 1; /* R_PPC_ADDR32.  */
11744     case EM_RL78:
11745       return reloc_type == 1; /* R_RL78_DIR32.  */
11746     case EM_RX:
11747       return reloc_type == 1; /* R_RX_DIR32.  */
11748     case EM_S370:
11749       return reloc_type == 1; /* R_I370_ADDR31.  */
11750     case EM_S390_OLD:
11751     case EM_S390:
11752       return reloc_type == 4; /* R_S390_32.  */
11753     case EM_SCORE:
11754       return reloc_type == 8; /* R_SCORE_ABS32.  */
11755     case EM_SH:
11756       return reloc_type == 1; /* R_SH_DIR32.  */
11757     case EM_SPARC32PLUS:
11758     case EM_SPARCV9:
11759     case EM_SPARC:
11760       return reloc_type == 3 /* R_SPARC_32.  */
11761         || reloc_type == 23; /* R_SPARC_UA32.  */
11762     case EM_SPU:
11763       return reloc_type == 6; /* R_SPU_ADDR32 */
11764     case EM_TI_C6000:
11765       return reloc_type == 1; /* R_C6000_ABS32.  */
11766     case EM_TILEGX:
11767       return reloc_type == 2; /* R_TILEGX_32.  */
11768     case EM_TILEPRO:
11769       return reloc_type == 1; /* R_TILEPRO_32.  */
11770     case EM_CYGNUS_V850:
11771     case EM_V850:
11772       return reloc_type == 6; /* R_V850_ABS32.  */
11773     case EM_V800:
11774       return reloc_type == 0x33; /* R_V810_WORD.  */
11775     case EM_VAX:
11776       return reloc_type == 1; /* R_VAX_32.  */
11777     case EM_VISIUM:
11778       return reloc_type == 3;  /* R_VISIUM_32. */
11779     case EM_X86_64:
11780     case EM_L1OM:
11781     case EM_K1OM:
11782       return reloc_type == 10; /* R_X86_64_32.  */
11783     case EM_XC16X:
11784     case EM_C166:
11785       return reloc_type == 3; /* R_XC16C_ABS_32.  */
11786     case EM_XGATE:
11787       return reloc_type == 4; /* R_XGATE_32.  */
11788     case EM_XSTORMY16:
11789       return reloc_type == 1; /* R_XSTROMY16_32.  */
11790     case EM_XTENSA_OLD:
11791     case EM_XTENSA:
11792       return reloc_type == 1; /* R_XTENSA_32.  */
11793     default:
11794       {
11795         static unsigned int prev_warn = 0;
11796
11797         /* Avoid repeating the same warning multiple times.  */
11798         if (prev_warn != elf_header.e_machine)
11799           error (_("Missing knowledge of 32-bit reloc types used in DWARF sections of machine number %d\n"),
11800                  elf_header.e_machine);
11801         prev_warn = elf_header.e_machine;
11802         return FALSE;
11803       }
11804     }
11805 }
11806
11807 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11808    a 32-bit pc-relative RELA relocation used in DWARF debug sections.  */
11809
11810 static bfd_boolean
11811 is_32bit_pcrel_reloc (unsigned int reloc_type)
11812 {
11813   switch (elf_header.e_machine)
11814   /* Please keep this table alpha-sorted for ease of visual lookup.  */
11815     {
11816     case EM_386:
11817     case EM_IAMCU:
11818       return reloc_type == 2;  /* R_386_PC32.  */
11819     case EM_68K:
11820       return reloc_type == 4;  /* R_68K_PC32.  */
11821     case EM_AARCH64:
11822       return reloc_type == 261; /* R_AARCH64_PREL32 */
11823     case EM_ADAPTEVA_EPIPHANY:
11824       return reloc_type == 6;
11825     case EM_ALPHA:
11826       return reloc_type == 10; /* R_ALPHA_SREL32.  */
11827     case EM_ARC_COMPACT:
11828     case EM_ARC_COMPACT2:
11829       return reloc_type == 49; /* R_ARC_32_PCREL.  */
11830     case EM_ARM:
11831       return reloc_type == 3;  /* R_ARM_REL32 */
11832     case EM_AVR_OLD:
11833     case EM_AVR:
11834       return reloc_type == 36; /* R_AVR_32_PCREL.  */
11835     case EM_MICROBLAZE:
11836       return reloc_type == 2;  /* R_MICROBLAZE_32_PCREL.  */
11837     case EM_OR1K:
11838       return reloc_type == 9; /* R_OR1K_32_PCREL.  */
11839     case EM_PARISC:
11840       return reloc_type == 9;  /* R_PARISC_PCREL32.  */
11841     case EM_PPC:
11842       return reloc_type == 26; /* R_PPC_REL32.  */
11843     case EM_PPC64:
11844       return reloc_type == 26; /* R_PPC64_REL32.  */
11845     case EM_S390_OLD:
11846     case EM_S390:
11847       return reloc_type == 5;  /* R_390_PC32.  */
11848     case EM_SH:
11849       return reloc_type == 2;  /* R_SH_REL32.  */
11850     case EM_SPARC32PLUS:
11851     case EM_SPARCV9:
11852     case EM_SPARC:
11853       return reloc_type == 6;  /* R_SPARC_DISP32.  */
11854     case EM_SPU:
11855       return reloc_type == 13; /* R_SPU_REL32.  */
11856     case EM_TILEGX:
11857       return reloc_type == 6; /* R_TILEGX_32_PCREL.  */
11858     case EM_TILEPRO:
11859       return reloc_type == 4; /* R_TILEPRO_32_PCREL.  */
11860     case EM_VISIUM:
11861       return reloc_type == 6;  /* R_VISIUM_32_PCREL */
11862     case EM_X86_64:
11863     case EM_L1OM:
11864     case EM_K1OM:
11865       return reloc_type == 2;  /* R_X86_64_PC32.  */
11866     case EM_XTENSA_OLD:
11867     case EM_XTENSA:
11868       return reloc_type == 14; /* R_XTENSA_32_PCREL.  */
11869     default:
11870       /* Do not abort or issue an error message here.  Not all targets use
11871          pc-relative 32-bit relocs in their DWARF debug information and we
11872          have already tested for target coverage in is_32bit_abs_reloc.  A
11873          more helpful warning message will be generated by apply_relocations
11874          anyway, so just return.  */
11875       return FALSE;
11876     }
11877 }
11878
11879 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11880    a 64-bit absolute RELA relocation used in DWARF debug sections.  */
11881
11882 static bfd_boolean
11883 is_64bit_abs_reloc (unsigned int reloc_type)
11884 {
11885   switch (elf_header.e_machine)
11886     {
11887     case EM_AARCH64:
11888       return reloc_type == 257; /* R_AARCH64_ABS64.  */
11889     case EM_ALPHA:
11890       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
11891     case EM_IA_64:
11892       return reloc_type == 0x27; /* R_IA64_DIR64LSB.  */
11893     case EM_PARISC:
11894       return reloc_type == 80; /* R_PARISC_DIR64.  */
11895     case EM_PPC64:
11896       return reloc_type == 38; /* R_PPC64_ADDR64.  */
11897     case EM_SPARC32PLUS:
11898     case EM_SPARCV9:
11899     case EM_SPARC:
11900       return reloc_type == 54; /* R_SPARC_UA64.  */
11901     case EM_X86_64:
11902     case EM_L1OM:
11903     case EM_K1OM:
11904       return reloc_type == 1; /* R_X86_64_64.  */
11905     case EM_S390_OLD:
11906     case EM_S390:
11907       return reloc_type == 22;  /* R_S390_64.  */
11908     case EM_TILEGX:
11909       return reloc_type == 1; /* R_TILEGX_64.  */
11910     case EM_MIPS:
11911       return reloc_type == 18;  /* R_MIPS_64.  */
11912     default:
11913       return FALSE;
11914     }
11915 }
11916
11917 /* Like is_32bit_pcrel_reloc except that it returns TRUE iff RELOC_TYPE is
11918    a 64-bit pc-relative RELA relocation used in DWARF debug sections.  */
11919
11920 static bfd_boolean
11921 is_64bit_pcrel_reloc (unsigned int reloc_type)
11922 {
11923   switch (elf_header.e_machine)
11924     {
11925     case EM_AARCH64:
11926       return reloc_type == 260; /* R_AARCH64_PREL64.  */
11927     case EM_ALPHA:
11928       return reloc_type == 11; /* R_ALPHA_SREL64.  */
11929     case EM_IA_64:
11930       return reloc_type == 0x4f; /* R_IA64_PCREL64LSB.  */
11931     case EM_PARISC:
11932       return reloc_type == 72; /* R_PARISC_PCREL64.  */
11933     case EM_PPC64:
11934       return reloc_type == 44; /* R_PPC64_REL64.  */
11935     case EM_SPARC32PLUS:
11936     case EM_SPARCV9:
11937     case EM_SPARC:
11938       return reloc_type == 46; /* R_SPARC_DISP64.  */
11939     case EM_X86_64:
11940     case EM_L1OM:
11941     case EM_K1OM:
11942       return reloc_type == 24; /* R_X86_64_PC64.  */
11943     case EM_S390_OLD:
11944     case EM_S390:
11945       return reloc_type == 23;  /* R_S390_PC64.  */
11946     case EM_TILEGX:
11947       return reloc_type == 5;  /* R_TILEGX_64_PCREL.  */
11948     default:
11949       return FALSE;
11950     }
11951 }
11952
11953 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11954    a 24-bit absolute RELA relocation used in DWARF debug sections.  */
11955
11956 static bfd_boolean
11957 is_24bit_abs_reloc (unsigned int reloc_type)
11958 {
11959   switch (elf_header.e_machine)
11960     {
11961     case EM_CYGNUS_MN10200:
11962     case EM_MN10200:
11963       return reloc_type == 4; /* R_MN10200_24.  */
11964     case EM_FT32:
11965       return reloc_type == 5; /* R_FT32_20.  */
11966     default:
11967       return FALSE;
11968     }
11969 }
11970
11971 /* Like is_32bit_abs_reloc except that it returns TRUE iff RELOC_TYPE is
11972    a 16-bit absolute RELA relocation used in DWARF debug sections.  */
11973
11974 static bfd_boolean
11975 is_16bit_abs_reloc (unsigned int reloc_type)
11976 {
11977   /* Please keep this table alpha-sorted for ease of visual lookup.  */
11978   switch (elf_header.e_machine)
11979     {
11980     case EM_ARC:
11981     case EM_ARC_COMPACT:
11982     case EM_ARC_COMPACT2:
11983       return reloc_type == 2; /* R_ARC_16.  */
11984     case EM_ADAPTEVA_EPIPHANY:
11985       return reloc_type == 5;
11986     case EM_AVR_OLD:
11987     case EM_AVR:
11988       return reloc_type == 4; /* R_AVR_16.  */
11989     case EM_CYGNUS_D10V:
11990     case EM_D10V:
11991       return reloc_type == 3; /* R_D10V_16.  */
11992     case EM_H8S:
11993     case EM_H8_300:
11994     case EM_H8_300H:
11995       return reloc_type == R_H8_DIR16;
11996     case EM_IP2K_OLD:
11997     case EM_IP2K:
11998       return reloc_type == 1; /* R_IP2K_16.  */
11999     case EM_M32C_OLD:
12000     case EM_M32C:
12001       return reloc_type == 1; /* R_M32C_16 */
12002     case EM_CYGNUS_MN10200:
12003     case EM_MN10200:
12004       return reloc_type == 2; /* R_MN10200_16.  */
12005     case EM_CYGNUS_MN10300:
12006     case EM_MN10300:
12007       return reloc_type == 2; /* R_MN10300_16.  */
12008     case EM_MSP430:
12009       if (uses_msp430x_relocs ())
12010         return reloc_type == 2; /* R_MSP430_ABS16.  */
12011     case EM_MSP430_OLD:
12012       return reloc_type == 5; /* R_MSP430_16_BYTE.  */
12013     case EM_NDS32:
12014       return reloc_type == 19; /* R_NDS32_RELA.  */
12015     case EM_ALTERA_NIOS2:
12016       return reloc_type == 13; /* R_NIOS2_BFD_RELOC_16.  */
12017     case EM_NIOS32:
12018       return reloc_type == 9; /* R_NIOS_16.  */
12019     case EM_OR1K:
12020       return reloc_type == 2; /* R_OR1K_16.  */
12021     case EM_TI_C6000:
12022       return reloc_type == 2; /* R_C6000_ABS16.  */
12023     case EM_VISIUM:
12024       return reloc_type == 2; /* R_VISIUM_16. */
12025     case EM_XC16X:
12026     case EM_C166:
12027       return reloc_type == 2; /* R_XC16C_ABS_16.  */
12028     case EM_XGATE:
12029       return reloc_type == 3; /* R_XGATE_16.  */
12030     default:
12031       return FALSE;
12032     }
12033 }
12034
12035 /* Returns TRUE iff RELOC_TYPE is a NONE relocation used for discarded
12036    relocation entries (possibly formerly used for SHT_GROUP sections).  */
12037
12038 static bfd_boolean
12039 is_none_reloc (unsigned int reloc_type)
12040 {
12041   switch (elf_header.e_machine)
12042     {
12043     case EM_386:     /* R_386_NONE.  */
12044     case EM_68K:     /* R_68K_NONE.  */
12045     case EM_ADAPTEVA_EPIPHANY:
12046     case EM_ALPHA:   /* R_ALPHA_NONE.  */
12047     case EM_ALTERA_NIOS2: /* R_NIOS2_NONE.  */
12048     case EM_ARC:     /* R_ARC_NONE.  */
12049     case EM_ARC_COMPACT2: /* R_ARC_NONE.  */
12050     case EM_ARC_COMPACT: /* R_ARC_NONE.  */
12051     case EM_ARM:     /* R_ARM_NONE.  */
12052     case EM_C166:    /* R_XC16X_NONE.  */
12053     case EM_CRIS:    /* R_CRIS_NONE.  */
12054     case EM_FT32:    /* R_FT32_NONE.  */
12055     case EM_IA_64:   /* R_IA64_NONE.  */
12056     case EM_K1OM:    /* R_X86_64_NONE.  */
12057     case EM_L1OM:    /* R_X86_64_NONE.  */
12058     case EM_M32R:    /* R_M32R_NONE.  */
12059     case EM_MIPS:    /* R_MIPS_NONE.  */
12060     case EM_MN10300: /* R_MN10300_NONE.  */
12061     case EM_MOXIE:   /* R_MOXIE_NONE.  */
12062     case EM_NIOS32:  /* R_NIOS_NONE.  */
12063     case EM_OR1K:    /* R_OR1K_NONE. */
12064     case EM_PARISC:  /* R_PARISC_NONE.  */
12065     case EM_PPC64:   /* R_PPC64_NONE.  */
12066     case EM_PPC:     /* R_PPC_NONE.  */
12067     case EM_S390:    /* R_390_NONE.  */
12068     case EM_S390_OLD:
12069     case EM_SH:      /* R_SH_NONE.  */
12070     case EM_SPARC32PLUS:
12071     case EM_SPARC:   /* R_SPARC_NONE.  */
12072     case EM_SPARCV9:
12073     case EM_TILEGX:  /* R_TILEGX_NONE.  */
12074     case EM_TILEPRO: /* R_TILEPRO_NONE.  */
12075     case EM_TI_C6000:/* R_C6000_NONE.  */
12076     case EM_X86_64:  /* R_X86_64_NONE.  */
12077     case EM_XC16X:
12078       return reloc_type == 0;
12079
12080     case EM_AARCH64:
12081       return reloc_type == 0 || reloc_type == 256;
12082     case EM_AVR_OLD:
12083     case EM_AVR:
12084       return (reloc_type == 0 /* R_AVR_NONE.  */
12085               || reloc_type == 30 /* R_AVR_DIFF8.  */
12086               || reloc_type == 31 /* R_AVR_DIFF16.  */
12087               || reloc_type == 32 /* R_AVR_DIFF32.  */);
12088     case EM_METAG:
12089       return reloc_type == 3; /* R_METAG_NONE.  */
12090     case EM_NDS32:
12091       return (reloc_type == 0       /* R_XTENSA_NONE.  */
12092               || reloc_type == 204  /* R_NDS32_DIFF8.  */
12093               || reloc_type == 205  /* R_NDS32_DIFF16.  */
12094               || reloc_type == 206  /* R_NDS32_DIFF32.  */
12095               || reloc_type == 207  /* R_NDS32_ULEB128.  */);
12096     case EM_XTENSA_OLD:
12097     case EM_XTENSA:
12098       return (reloc_type == 0      /* R_XTENSA_NONE.  */
12099               || reloc_type == 17  /* R_XTENSA_DIFF8.  */
12100               || reloc_type == 18  /* R_XTENSA_DIFF16.  */
12101               || reloc_type == 19  /* R_XTENSA_DIFF32.  */);
12102     }
12103   return FALSE;
12104 }
12105
12106 /* Returns TRUE if there is a relocation against
12107    section NAME at OFFSET bytes.  */
12108
12109 bfd_boolean
12110 reloc_at (struct dwarf_section * dsec, dwarf_vma offset)
12111 {
12112   Elf_Internal_Rela * relocs;
12113   Elf_Internal_Rela * rp;
12114
12115   if (dsec == NULL || dsec->reloc_info == NULL)
12116     return FALSE;
12117
12118   relocs = (Elf_Internal_Rela *) dsec->reloc_info;
12119
12120   for (rp = relocs; rp < relocs + dsec->num_relocs; ++rp)
12121     if (rp->r_offset == offset)
12122       return TRUE;
12123
12124    return FALSE;
12125 }
12126
12127 /* Apply relocations to a section.
12128    Note: So far support has been added only for those relocations
12129    which can be found in debug sections.
12130    If RELOCS_RETURN is non-NULL then returns in it a pointer to the
12131    loaded relocs.  It is then the caller's responsibility to free them.
12132    FIXME: Add support for more relocations ?  */
12133
12134 static void
12135 apply_relocations (void *                     file,
12136                    const Elf_Internal_Shdr *  section,
12137                    unsigned char *            start,
12138                    bfd_size_type              size,
12139                    void **                     relocs_return,
12140                    unsigned long *            num_relocs_return)
12141 {
12142   Elf_Internal_Shdr * relsec;
12143   unsigned char * end = start + size;
12144
12145   if (relocs_return != NULL)
12146     {
12147       * (Elf_Internal_Rela **) relocs_return = NULL;
12148       * num_relocs_return = 0;
12149     }
12150
12151   if (elf_header.e_type != ET_REL)
12152     return;
12153
12154   /* Find the reloc section associated with the section.  */
12155   for (relsec = section_headers;
12156        relsec < section_headers + elf_header.e_shnum;
12157        ++relsec)
12158     {
12159       bfd_boolean is_rela;
12160       unsigned long num_relocs;
12161       Elf_Internal_Rela * relocs;
12162       Elf_Internal_Rela * rp;
12163       Elf_Internal_Shdr * symsec;
12164       Elf_Internal_Sym * symtab;
12165       unsigned long num_syms;
12166       Elf_Internal_Sym * sym;
12167
12168       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12169           || relsec->sh_info >= elf_header.e_shnum
12170           || section_headers + relsec->sh_info != section
12171           || relsec->sh_size == 0
12172           || relsec->sh_link >= elf_header.e_shnum)
12173         continue;
12174
12175       is_rela = relsec->sh_type == SHT_RELA;
12176
12177       if (is_rela)
12178         {
12179           if (!slurp_rela_relocs ((FILE *) file, relsec->sh_offset,
12180                                   relsec->sh_size, & relocs, & num_relocs))
12181             return;
12182         }
12183       else
12184         {
12185           if (!slurp_rel_relocs ((FILE *) file, relsec->sh_offset,
12186                                  relsec->sh_size, & relocs, & num_relocs))
12187             return;
12188         }
12189
12190       /* SH uses RELA but uses in place value instead of the addend field.  */
12191       if (elf_header.e_machine == EM_SH)
12192         is_rela = FALSE;
12193
12194       symsec = section_headers + relsec->sh_link;
12195       symtab = GET_ELF_SYMBOLS ((FILE *) file, symsec, & num_syms);
12196
12197       for (rp = relocs; rp < relocs + num_relocs; ++rp)
12198         {
12199           bfd_vma         addend;
12200           unsigned int    reloc_type;
12201           unsigned int    reloc_size;
12202           unsigned char * rloc;
12203           unsigned long   sym_index;
12204
12205           reloc_type = get_reloc_type (rp->r_info);
12206
12207           if (target_specific_reloc_handling (rp, start, symtab))
12208             continue;
12209           else if (is_none_reloc (reloc_type))
12210             continue;
12211           else if (is_32bit_abs_reloc (reloc_type)
12212                    || is_32bit_pcrel_reloc (reloc_type))
12213             reloc_size = 4;
12214           else if (is_64bit_abs_reloc (reloc_type)
12215                    || is_64bit_pcrel_reloc (reloc_type))
12216             reloc_size = 8;
12217           else if (is_24bit_abs_reloc (reloc_type))
12218             reloc_size = 3;
12219           else if (is_16bit_abs_reloc (reloc_type))
12220             reloc_size = 2;
12221           else
12222             {
12223               static unsigned int prev_reloc = 0;
12224               if (reloc_type != prev_reloc)
12225                 warn (_("unable to apply unsupported reloc type %d to section %s\n"),
12226                       reloc_type, printable_section_name (section));
12227               prev_reloc = reloc_type;
12228               continue;
12229             }
12230
12231           rloc = start + rp->r_offset;
12232           if ((rloc + reloc_size) > end || (rloc < start))
12233             {
12234               warn (_("skipping invalid relocation offset 0x%lx in section %s\n"),
12235                     (unsigned long) rp->r_offset,
12236                     printable_section_name (section));
12237               continue;
12238             }
12239
12240           sym_index = (unsigned long) get_reloc_symindex (rp->r_info);
12241           if (sym_index >= num_syms)
12242             {
12243               warn (_("skipping invalid relocation symbol index 0x%lx in section %s\n"),
12244                     sym_index, printable_section_name (section));
12245               continue;
12246             }
12247           sym = symtab + sym_index;
12248
12249           /* If the reloc has a symbol associated with it,
12250              make sure that it is of an appropriate type.
12251
12252              Relocations against symbols without type can happen.
12253              Gcc -feliminate-dwarf2-dups may generate symbols
12254              without type for debug info.
12255
12256              Icc generates relocations against function symbols
12257              instead of local labels.
12258
12259              Relocations against object symbols can happen, eg when
12260              referencing a global array.  For an example of this see
12261              the _clz.o binary in libgcc.a.  */
12262           if (sym != symtab
12263               && ELF_ST_TYPE (sym->st_info) != STT_COMMON
12264               && ELF_ST_TYPE (sym->st_info) > STT_SECTION)
12265             {
12266               warn (_("skipping unexpected symbol type %s in %ld'th relocation in section %s\n"),
12267                     get_symbol_type (ELF_ST_TYPE (sym->st_info)),
12268                     (long int)(rp - relocs),
12269                     printable_section_name (relsec));
12270               continue;
12271             }
12272
12273           addend = 0;
12274           if (is_rela)
12275             addend += rp->r_addend;
12276           /* R_XTENSA_32, R_PJ_DATA_DIR32 and R_D30V_32_NORMAL are
12277              partial_inplace.  */
12278           if (!is_rela
12279               || (elf_header.e_machine == EM_XTENSA
12280                   && reloc_type == 1)
12281               || ((elf_header.e_machine == EM_PJ
12282                    || elf_header.e_machine == EM_PJ_OLD)
12283                   && reloc_type == 1)
12284               || ((elf_header.e_machine == EM_D30V
12285                    || elf_header.e_machine == EM_CYGNUS_D30V)
12286                   && reloc_type == 12))
12287             addend += byte_get (rloc, reloc_size);
12288
12289           if (is_32bit_pcrel_reloc (reloc_type)
12290               || is_64bit_pcrel_reloc (reloc_type))
12291             {
12292               /* On HPPA, all pc-relative relocations are biased by 8.  */
12293               if (elf_header.e_machine == EM_PARISC)
12294                 addend -= 8;
12295               byte_put (rloc, (addend + sym->st_value) - rp->r_offset,
12296                         reloc_size);
12297             }
12298           else
12299             byte_put (rloc, addend + sym->st_value, reloc_size);
12300         }
12301
12302       free (symtab);
12303
12304       if (relocs_return)
12305         {
12306           * (Elf_Internal_Rela **) relocs_return = relocs;
12307           * num_relocs_return = num_relocs;
12308         }
12309       else
12310         free (relocs);
12311
12312       break;
12313     }
12314 }
12315
12316 #ifdef SUPPORT_DISASSEMBLY
12317 static int
12318 disassemble_section (Elf_Internal_Shdr * section, FILE * file)
12319 {
12320   printf (_("\nAssembly dump of section %s\n"), printable_section_name (section));
12321
12322   /* FIXME: XXX -- to be done --- XXX */
12323
12324   return 1;
12325 }
12326 #endif
12327
12328 /* Reads in the contents of SECTION from FILE, returning a pointer
12329    to a malloc'ed buffer or NULL if something went wrong.  */
12330
12331 static char *
12332 get_section_contents (Elf_Internal_Shdr * section, FILE * file)
12333 {
12334   bfd_size_type num_bytes;
12335
12336   num_bytes = section->sh_size;
12337
12338   if (num_bytes == 0 || section->sh_type == SHT_NOBITS)
12339     {
12340       printf (_("\nSection '%s' has no data to dump.\n"),
12341               printable_section_name (section));
12342       return NULL;
12343     }
12344
12345   return  (char *) get_data (NULL, file, section->sh_offset, 1, num_bytes,
12346                              _("section contents"));
12347 }
12348
12349 /* Uncompresses a section that was compressed using zlib, in place.  */
12350
12351 static bfd_boolean
12352 uncompress_section_contents (unsigned char **buffer,
12353                              dwarf_size_type uncompressed_size,
12354                              dwarf_size_type *size)
12355 {
12356   dwarf_size_type compressed_size = *size;
12357   unsigned char * compressed_buffer = *buffer;
12358   unsigned char * uncompressed_buffer;
12359   z_stream strm;
12360   int rc;
12361
12362   /* It is possible the section consists of several compressed
12363      buffers concatenated together, so we uncompress in a loop.  */
12364   /* PR 18313: The state field in the z_stream structure is supposed
12365      to be invisible to the user (ie us), but some compilers will
12366      still complain about it being used without initialisation.  So
12367      we first zero the entire z_stream structure and then set the fields
12368      that we need.  */
12369   memset (& strm, 0, sizeof strm);
12370   strm.avail_in = compressed_size;
12371   strm.next_in = (Bytef *) compressed_buffer;
12372   strm.avail_out = uncompressed_size;
12373   uncompressed_buffer = (unsigned char *) xmalloc (uncompressed_size);
12374
12375   rc = inflateInit (& strm);
12376   while (strm.avail_in > 0)
12377     {
12378       if (rc != Z_OK)
12379         goto fail;
12380       strm.next_out = ((Bytef *) uncompressed_buffer
12381                        + (uncompressed_size - strm.avail_out));
12382       rc = inflate (&strm, Z_FINISH);
12383       if (rc != Z_STREAM_END)
12384         goto fail;
12385       rc = inflateReset (& strm);
12386     }
12387   rc = inflateEnd (& strm);
12388   if (rc != Z_OK
12389       || strm.avail_out != 0)
12390     goto fail;
12391
12392   *buffer = uncompressed_buffer;
12393   *size = uncompressed_size;
12394   return TRUE;
12395
12396  fail:
12397   free (uncompressed_buffer);
12398   /* Indicate decompression failure.  */
12399   *buffer = NULL;
12400   return FALSE;
12401 }
12402
12403 static void
12404 dump_section_as_strings (Elf_Internal_Shdr * section, FILE * file)
12405 {
12406   Elf_Internal_Shdr *  relsec;
12407   bfd_size_type        num_bytes;
12408   unsigned char *      data;
12409   unsigned char *      end;
12410   unsigned char *      real_start;
12411   unsigned char *      start;
12412   bfd_boolean          some_strings_shown;
12413
12414   real_start = start = (unsigned char *) get_section_contents (section,
12415                                                                file);
12416   if (start == NULL)
12417     return;
12418   num_bytes = section->sh_size;
12419
12420   printf (_("\nString dump of section '%s':\n"), printable_section_name (section));
12421
12422   if (decompress_dumps)
12423     {
12424       dwarf_size_type new_size = num_bytes;
12425       dwarf_size_type uncompressed_size = 0;
12426
12427       if ((section->sh_flags & SHF_COMPRESSED) != 0)
12428         {
12429           Elf_Internal_Chdr chdr;
12430           unsigned int compression_header_size
12431             = get_compression_header (& chdr, (unsigned char *) start);
12432
12433           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12434             {
12435               warn (_("section '%s' has unsupported compress type: %d\n"),
12436                     printable_section_name (section), chdr.ch_type);
12437               return;
12438             }
12439           else if (chdr.ch_addralign != section->sh_addralign)
12440             {
12441               warn (_("compressed section '%s' is corrupted\n"),
12442                     printable_section_name (section));
12443               return;
12444             }
12445           uncompressed_size = chdr.ch_size;
12446           start += compression_header_size;
12447           new_size -= compression_header_size;
12448         }
12449       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12450         {
12451           /* Read the zlib header.  In this case, it should be "ZLIB"
12452              followed by the uncompressed section size, 8 bytes in
12453              big-endian order.  */
12454           uncompressed_size = start[4]; uncompressed_size <<= 8;
12455           uncompressed_size += start[5]; uncompressed_size <<= 8;
12456           uncompressed_size += start[6]; uncompressed_size <<= 8;
12457           uncompressed_size += start[7]; uncompressed_size <<= 8;
12458           uncompressed_size += start[8]; uncompressed_size <<= 8;
12459           uncompressed_size += start[9]; uncompressed_size <<= 8;
12460           uncompressed_size += start[10]; uncompressed_size <<= 8;
12461           uncompressed_size += start[11];
12462           start += 12;
12463           new_size -= 12;
12464         }
12465
12466       if (uncompressed_size
12467           && uncompress_section_contents (& start,
12468                                           uncompressed_size, & new_size))
12469         num_bytes = new_size;
12470     }
12471
12472   /* If the section being dumped has relocations against it the user might
12473      be expecting these relocations to have been applied.  Check for this
12474      case and issue a warning message in order to avoid confusion.
12475      FIXME: Maybe we ought to have an option that dumps a section with
12476      relocs applied ?  */
12477   for (relsec = section_headers;
12478        relsec < section_headers + elf_header.e_shnum;
12479        ++relsec)
12480     {
12481       if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12482           || relsec->sh_info >= elf_header.e_shnum
12483           || section_headers + relsec->sh_info != section
12484           || relsec->sh_size == 0
12485           || relsec->sh_link >= elf_header.e_shnum)
12486         continue;
12487
12488       printf (_("  Note: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12489       break;
12490     }
12491
12492   data = start;
12493   end  = start + num_bytes;
12494   some_strings_shown = FALSE;
12495
12496   while (data < end)
12497     {
12498       while (!ISPRINT (* data))
12499         if (++ data >= end)
12500           break;
12501
12502       if (data < end)
12503         {
12504           size_t maxlen = end - data;
12505
12506 #ifndef __MSVCRT__
12507           /* PR 11128: Use two separate invocations in order to work
12508              around bugs in the Solaris 8 implementation of printf.  */
12509           printf ("  [%6tx]  ", data - start);
12510 #else
12511           printf ("  [%6Ix]  ", (size_t) (data - start));
12512 #endif
12513           if (maxlen > 0)
12514             {
12515               print_symbol ((int) maxlen, (const char *) data);
12516               putchar ('\n');
12517               data += strnlen ((const char *) data, maxlen);
12518             }
12519           else
12520             {
12521               printf (_("<corrupt>\n"));
12522               data = end;
12523             }
12524           some_strings_shown = TRUE;
12525         }
12526     }
12527
12528   if (! some_strings_shown)
12529     printf (_("  No strings found in this section."));
12530
12531   free (real_start);
12532
12533   putchar ('\n');
12534 }
12535
12536 static void
12537 dump_section_as_bytes (Elf_Internal_Shdr * section,
12538                        FILE * file,
12539                        bfd_boolean relocate)
12540 {
12541   Elf_Internal_Shdr * relsec;
12542   bfd_size_type       bytes;
12543   bfd_size_type       section_size;
12544   bfd_vma             addr;
12545   unsigned char *     data;
12546   unsigned char *     real_start;
12547   unsigned char *     start;
12548
12549   real_start = start = (unsigned char *) get_section_contents (section, file);
12550   if (start == NULL)
12551     return;
12552   section_size = section->sh_size;
12553
12554   printf (_("\nHex dump of section '%s':\n"), printable_section_name (section));
12555
12556   if (decompress_dumps)
12557     {
12558       dwarf_size_type new_size = section_size;
12559       dwarf_size_type uncompressed_size = 0;
12560
12561       if ((section->sh_flags & SHF_COMPRESSED) != 0)
12562         {
12563           Elf_Internal_Chdr chdr;
12564           unsigned int compression_header_size
12565             = get_compression_header (& chdr, start);
12566
12567           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12568             {
12569               warn (_("section '%s' has unsupported compress type: %d\n"),
12570                     printable_section_name (section), chdr.ch_type);
12571               return;
12572             }
12573           else if (chdr.ch_addralign != section->sh_addralign)
12574             {
12575               warn (_("compressed section '%s' is corrupted\n"),
12576                     printable_section_name (section));
12577               return;
12578             }
12579           uncompressed_size = chdr.ch_size;
12580           start += compression_header_size;
12581           new_size -= compression_header_size;
12582         }
12583       else if (new_size > 12 && streq ((char *) start, "ZLIB"))
12584         {
12585           /* Read the zlib header.  In this case, it should be "ZLIB"
12586              followed by the uncompressed section size, 8 bytes in
12587              big-endian order.  */
12588           uncompressed_size = start[4]; uncompressed_size <<= 8;
12589           uncompressed_size += start[5]; uncompressed_size <<= 8;
12590           uncompressed_size += start[6]; uncompressed_size <<= 8;
12591           uncompressed_size += start[7]; uncompressed_size <<= 8;
12592           uncompressed_size += start[8]; uncompressed_size <<= 8;
12593           uncompressed_size += start[9]; uncompressed_size <<= 8;
12594           uncompressed_size += start[10]; uncompressed_size <<= 8;
12595           uncompressed_size += start[11];
12596           start += 12;
12597           new_size -= 12;
12598         }
12599
12600       if (uncompressed_size
12601           && uncompress_section_contents (& start, uncompressed_size,
12602                                           & new_size))
12603         section_size = new_size;
12604     }
12605
12606   if (relocate)
12607     {
12608       apply_relocations (file, section, start, section_size, NULL, NULL);
12609     }
12610   else
12611     {
12612       /* If the section being dumped has relocations against it the user might
12613          be expecting these relocations to have been applied.  Check for this
12614          case and issue a warning message in order to avoid confusion.
12615          FIXME: Maybe we ought to have an option that dumps a section with
12616          relocs applied ?  */
12617       for (relsec = section_headers;
12618            relsec < section_headers + elf_header.e_shnum;
12619            ++relsec)
12620         {
12621           if ((relsec->sh_type != SHT_RELA && relsec->sh_type != SHT_REL)
12622               || relsec->sh_info >= elf_header.e_shnum
12623               || section_headers + relsec->sh_info != section
12624               || relsec->sh_size == 0
12625               || relsec->sh_link >= elf_header.e_shnum)
12626             continue;
12627
12628           printf (_(" NOTE: This section has relocations against it, but these have NOT been applied to this dump.\n"));
12629           break;
12630         }
12631     }
12632
12633   addr = section->sh_addr;
12634   bytes = section_size;
12635   data = start;
12636
12637   while (bytes)
12638     {
12639       int j;
12640       int k;
12641       int lbytes;
12642
12643       lbytes = (bytes > 16 ? 16 : bytes);
12644
12645       printf ("  0x%8.8lx ", (unsigned long) addr);
12646
12647       for (j = 0; j < 16; j++)
12648         {
12649           if (j < lbytes)
12650             printf ("%2.2x", data[j]);
12651           else
12652             printf ("  ");
12653
12654           if ((j & 3) == 3)
12655             printf (" ");
12656         }
12657
12658       for (j = 0; j < lbytes; j++)
12659         {
12660           k = data[j];
12661           if (k >= ' ' && k < 0x7f)
12662             printf ("%c", k);
12663           else
12664             printf (".");
12665         }
12666
12667       putchar ('\n');
12668
12669       data  += lbytes;
12670       addr  += lbytes;
12671       bytes -= lbytes;
12672     }
12673
12674   free (real_start);
12675
12676   putchar ('\n');
12677 }
12678
12679 static int
12680 load_specific_debug_section (enum dwarf_section_display_enum debug,
12681                              const Elf_Internal_Shdr * sec, void * file)
12682 {
12683   struct dwarf_section * section = &debug_displays [debug].section;
12684   char buf [64];
12685
12686   /* If it is already loaded, do nothing.  */
12687   if (section->start != NULL)
12688     return 1;
12689
12690   snprintf (buf, sizeof (buf), _("%s section data"), section->name);
12691   section->address = sec->sh_addr;
12692   section->user_data = NULL;
12693   section->start = (unsigned char *) get_data (NULL, (FILE *) file,
12694                                                sec->sh_offset, 1,
12695                                                sec->sh_size, buf);
12696   if (section->start == NULL)
12697     section->size = 0;
12698   else
12699     {
12700       unsigned char *start = section->start;
12701       dwarf_size_type size = sec->sh_size;
12702       dwarf_size_type uncompressed_size = 0;
12703
12704       if ((sec->sh_flags & SHF_COMPRESSED) != 0)
12705         {
12706           Elf_Internal_Chdr chdr;
12707           unsigned int compression_header_size;
12708
12709           if (size < (is_32bit_elf
12710                       ? sizeof (Elf32_External_Chdr)
12711                       : sizeof (Elf64_External_Chdr)))
12712             {
12713               warn (_("compressed section %s is too small to contain a compression header"),
12714                     section->name);
12715               return 0;
12716             }
12717
12718           compression_header_size = get_compression_header (&chdr, start);
12719
12720           if (chdr.ch_type != ELFCOMPRESS_ZLIB)
12721             {
12722               warn (_("section '%s' has unsupported compress type: %d\n"),
12723                     section->name, chdr.ch_type);
12724               return 0;
12725             }
12726           else if (chdr.ch_addralign != sec->sh_addralign)
12727             {
12728               warn (_("compressed section '%s' is corrupted\n"),
12729                     section->name);
12730               return 0;
12731             }
12732           uncompressed_size = chdr.ch_size;
12733           start += compression_header_size;
12734           size -= compression_header_size;
12735         }
12736       else if (size > 12 && streq ((char *) start, "ZLIB"))
12737         {
12738           /* Read the zlib header.  In this case, it should be "ZLIB"
12739              followed by the uncompressed section size, 8 bytes in
12740              big-endian order.  */
12741           uncompressed_size = start[4]; uncompressed_size <<= 8;
12742           uncompressed_size += start[5]; uncompressed_size <<= 8;
12743           uncompressed_size += start[6]; uncompressed_size <<= 8;
12744           uncompressed_size += start[7]; uncompressed_size <<= 8;
12745           uncompressed_size += start[8]; uncompressed_size <<= 8;
12746           uncompressed_size += start[9]; uncompressed_size <<= 8;
12747           uncompressed_size += start[10]; uncompressed_size <<= 8;
12748           uncompressed_size += start[11];
12749           start += 12;
12750           size -= 12;
12751         }
12752
12753       if (uncompressed_size
12754           && uncompress_section_contents (&start, uncompressed_size,
12755                                           &size))
12756         {
12757           /* Free the compressed buffer, update the section buffer
12758              and the section size if uncompress is successful.  */
12759           free (section->start);
12760           section->start = start;
12761         }
12762       section->size = size;
12763     }
12764
12765   if (section->start == NULL)
12766     return 0;
12767
12768   if (debug_displays [debug].relocate)
12769     apply_relocations ((FILE *) file, sec, section->start, section->size,
12770                        & section->reloc_info, & section->num_relocs);
12771   else
12772     {
12773       section->reloc_info = NULL;
12774       section->num_relocs = 0;
12775     }
12776
12777   return 1;
12778 }
12779
12780 /* If this is not NULL, load_debug_section will only look for sections
12781    within the list of sections given here.  */
12782 unsigned int *section_subset = NULL;
12783
12784 int
12785 load_debug_section (enum dwarf_section_display_enum debug, void * file)
12786 {
12787   struct dwarf_section * section = &debug_displays [debug].section;
12788   Elf_Internal_Shdr * sec;
12789
12790   /* Locate the debug section.  */
12791   sec = find_section_in_set (section->uncompressed_name, section_subset);
12792   if (sec != NULL)
12793     section->name = section->uncompressed_name;
12794   else
12795     {
12796       sec = find_section_in_set (section->compressed_name, section_subset);
12797       if (sec != NULL)
12798         section->name = section->compressed_name;
12799     }
12800   if (sec == NULL)
12801     return 0;
12802
12803   /* If we're loading from a subset of sections, and we've loaded
12804      a section matching this name before, it's likely that it's a
12805      different one.  */
12806   if (section_subset != NULL)
12807     free_debug_section (debug);
12808
12809   return load_specific_debug_section (debug, sec, (FILE *) file);
12810 }
12811
12812 void
12813 free_debug_section (enum dwarf_section_display_enum debug)
12814 {
12815   struct dwarf_section * section = &debug_displays [debug].section;
12816
12817   if (section->start == NULL)
12818     return;
12819
12820   free ((char *) section->start);
12821   section->start = NULL;
12822   section->address = 0;
12823   section->size = 0;
12824 }
12825
12826 static int
12827 display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
12828 {
12829   char * name = SECTION_NAME (section);
12830   const char * print_name = printable_section_name (section);
12831   bfd_size_type length;
12832   int result = 1;
12833   int i;
12834
12835   length = section->sh_size;
12836   if (length == 0)
12837     {
12838       printf (_("\nSection '%s' has no debugging data.\n"), print_name);
12839       return 0;
12840     }
12841   if (section->sh_type == SHT_NOBITS)
12842     {
12843       /* There is no point in dumping the contents of a debugging section
12844          which has the NOBITS type - the bits in the file will be random.
12845          This can happen when a file containing a .eh_frame section is
12846          stripped with the --only-keep-debug command line option.  */
12847       printf (_("section '%s' has the NOBITS type - its contents are unreliable.\n"),
12848               print_name);
12849       return 0;
12850     }
12851
12852   if (const_strneq (name, ".gnu.linkonce.wi."))
12853     name = ".debug_info";
12854
12855   /* See if we know how to display the contents of this section.  */
12856   for (i = 0; i < max; i++)
12857     if (streq (debug_displays[i].section.uncompressed_name, name)
12858         || (i == line && const_strneq (name, ".debug_line."))
12859         || streq (debug_displays[i].section.compressed_name, name))
12860       {
12861         struct dwarf_section * sec = &debug_displays [i].section;
12862         int secondary = (section != find_section (name));
12863
12864         if (secondary)
12865           free_debug_section ((enum dwarf_section_display_enum) i);
12866
12867         if (i == line && const_strneq (name, ".debug_line."))
12868           sec->name = name;
12869         else if (streq (sec->uncompressed_name, name))
12870           sec->name = sec->uncompressed_name;
12871         else
12872           sec->name = sec->compressed_name;
12873         if (load_specific_debug_section ((enum dwarf_section_display_enum) i,
12874                                          section, file))
12875           {
12876             /* If this debug section is part of a CU/TU set in a .dwp file,
12877                restrict load_debug_section to the sections in that set.  */
12878             section_subset = find_cu_tu_set (file, shndx);
12879
12880             result &= debug_displays[i].display (sec, file);
12881
12882             section_subset = NULL;
12883
12884             if (secondary || (i != info && i != abbrev))
12885               free_debug_section ((enum dwarf_section_display_enum) i);
12886           }
12887
12888         break;
12889       }
12890
12891   if (i == max)
12892     {
12893       printf (_("Unrecognized debug section: %s\n"), print_name);
12894       result = 0;
12895     }
12896
12897   return result;
12898 }
12899
12900 /* Set DUMP_SECTS for all sections where dumps were requested
12901    based on section name.  */
12902
12903 static void
12904 initialise_dumps_byname (void)
12905 {
12906   struct dump_list_entry * cur;
12907
12908   for (cur = dump_sects_byname; cur; cur = cur->next)
12909     {
12910       unsigned int i;
12911       int any;
12912
12913       for (i = 0, any = 0; i < elf_header.e_shnum; i++)
12914         if (streq (SECTION_NAME (section_headers + i), cur->name))
12915           {
12916             request_dump_bynumber (i, cur->type);
12917             any = 1;
12918           }
12919
12920       if (!any)
12921         warn (_("Section '%s' was not dumped because it does not exist!\n"),
12922               cur->name);
12923     }
12924 }
12925
12926 static void
12927 process_section_contents (FILE * file)
12928 {
12929   Elf_Internal_Shdr * section;
12930   unsigned int i;
12931
12932   if (! do_dump)
12933     return;
12934
12935   initialise_dumps_byname ();
12936
12937   for (i = 0, section = section_headers;
12938        i < elf_header.e_shnum && i < num_dump_sects;
12939        i++, section++)
12940     {
12941 #ifdef SUPPORT_DISASSEMBLY
12942       if (dump_sects[i] & DISASS_DUMP)
12943         disassemble_section (section, file);
12944 #endif
12945       if (dump_sects[i] & HEX_DUMP)
12946         dump_section_as_bytes (section, file, FALSE);
12947
12948       if (dump_sects[i] & RELOC_DUMP)
12949         dump_section_as_bytes (section, file, TRUE);
12950
12951       if (dump_sects[i] & STRING_DUMP)
12952         dump_section_as_strings (section, file);
12953
12954       if (dump_sects[i] & DEBUG_DUMP)
12955         display_debug_section (i, section, file);
12956     }
12957
12958   /* Check to see if the user requested a
12959      dump of a section that does not exist.  */
12960   while (i++ < num_dump_sects)
12961     if (dump_sects[i])
12962       warn (_("Section %d was not dumped because it does not exist!\n"), i);
12963 }
12964
12965 static void
12966 process_mips_fpe_exception (int mask)
12967 {
12968   if (mask)
12969     {
12970       int first = 1;
12971       if (mask & OEX_FPU_INEX)
12972         fputs ("INEX", stdout), first = 0;
12973       if (mask & OEX_FPU_UFLO)
12974         printf ("%sUFLO", first ? "" : "|"), first = 0;
12975       if (mask & OEX_FPU_OFLO)
12976         printf ("%sOFLO", first ? "" : "|"), first = 0;
12977       if (mask & OEX_FPU_DIV0)
12978         printf ("%sDIV0", first ? "" : "|"), first = 0;
12979       if (mask & OEX_FPU_INVAL)
12980         printf ("%sINVAL", first ? "" : "|");
12981     }
12982   else
12983     fputs ("0", stdout);
12984 }
12985
12986 /* Display's the value of TAG at location P.  If TAG is
12987    greater than 0 it is assumed to be an unknown tag, and
12988    a message is printed to this effect.  Otherwise it is
12989    assumed that a message has already been printed.
12990
12991    If the bottom bit of TAG is set it assumed to have a
12992    string value, otherwise it is assumed to have an integer
12993    value.
12994
12995    Returns an updated P pointing to the first unread byte
12996    beyond the end of TAG's value.
12997
12998    Reads at or beyond END will not be made.  */
12999
13000 static unsigned char *
13001 display_tag_value (int tag,
13002                    unsigned char * p,
13003                    const unsigned char * const end)
13004 {
13005   unsigned long val;
13006
13007   if (tag > 0)
13008     printf ("  Tag_unknown_%d: ", tag);
13009
13010   if (p >= end)
13011     {
13012       warn (_("<corrupt tag>\n"));
13013     }
13014   else if (tag & 1)
13015     {
13016       /* PR 17531 file: 027-19978-0.004.  */
13017       size_t maxlen = (end - p) - 1;
13018
13019       putchar ('"');
13020       if (maxlen > 0)
13021         {
13022           print_symbol ((int) maxlen, (const char *) p);
13023           p += strnlen ((char *) p, maxlen) + 1;
13024         }
13025       else
13026         {
13027           printf (_("<corrupt string tag>"));
13028           p = (unsigned char *) end;
13029         }
13030       printf ("\"\n");
13031     }
13032   else
13033     {
13034       unsigned int len;
13035
13036       val = read_uleb128 (p, &len, end);
13037       p += len;
13038       printf ("%ld (0x%lx)\n", val, val);
13039     }
13040
13041   assert (p <= end);
13042   return p;
13043 }
13044
13045 /* ARM EABI attributes section.  */
13046 typedef struct
13047 {
13048   unsigned int tag;
13049   const char * name;
13050   /* 0 = special, 1 = string, 2 = uleb123, > 0x80 == table lookup.  */
13051   unsigned int type;
13052   const char ** table;
13053 } arm_attr_public_tag;
13054
13055 static const char * arm_attr_tag_CPU_arch[] =
13056   {"Pre-v4", "v4", "v4T", "v5T", "v5TE", "v5TEJ", "v6", "v6KZ", "v6T2",
13057    "v6K", "v7", "v6-M", "v6S-M", "v7E-M", "v8", "", "v8-M.baseline",
13058    "v8-M.mainline"};
13059 static const char * arm_attr_tag_ARM_ISA_use[] = {"No", "Yes"};
13060 static const char * arm_attr_tag_THUMB_ISA_use[] =
13061   {"No", "Thumb-1", "Thumb-2", "Yes"};
13062 static const char * arm_attr_tag_FP_arch[] =
13063   {"No", "VFPv1", "VFPv2", "VFPv3", "VFPv3-D16", "VFPv4", "VFPv4-D16",
13064    "FP for ARMv8", "FPv5/FP-D16 for ARMv8"};
13065 static const char * arm_attr_tag_WMMX_arch[] = {"No", "WMMXv1", "WMMXv2"};
13066 static const char * arm_attr_tag_Advanced_SIMD_arch[] =
13067   {"No", "NEONv1", "NEONv1 with Fused-MAC", "NEON for ARMv8",
13068    "NEON for ARMv8.1"};
13069 static const char * arm_attr_tag_PCS_config[] =
13070   {"None", "Bare platform", "Linux application", "Linux DSO", "PalmOS 2004",
13071    "PalmOS (reserved)", "SymbianOS 2004", "SymbianOS (reserved)"};
13072 static const char * arm_attr_tag_ABI_PCS_R9_use[] =
13073   {"V6", "SB", "TLS", "Unused"};
13074 static const char * arm_attr_tag_ABI_PCS_RW_data[] =
13075   {"Absolute", "PC-relative", "SB-relative", "None"};
13076 static const char * arm_attr_tag_ABI_PCS_RO_data[] =
13077   {"Absolute", "PC-relative", "None"};
13078 static const char * arm_attr_tag_ABI_PCS_GOT_use[] =
13079   {"None", "direct", "GOT-indirect"};
13080 static const char * arm_attr_tag_ABI_PCS_wchar_t[] =
13081   {"None", "??? 1", "2", "??? 3", "4"};
13082 static const char * arm_attr_tag_ABI_FP_rounding[] = {"Unused", "Needed"};
13083 static const char * arm_attr_tag_ABI_FP_denormal[] =
13084   {"Unused", "Needed", "Sign only"};
13085 static const char * arm_attr_tag_ABI_FP_exceptions[] = {"Unused", "Needed"};
13086 static const char * arm_attr_tag_ABI_FP_user_exceptions[] = {"Unused", "Needed"};
13087 static const char * arm_attr_tag_ABI_FP_number_model[] =
13088   {"Unused", "Finite", "RTABI", "IEEE 754"};
13089 static const char * arm_attr_tag_ABI_enum_size[] =
13090   {"Unused", "small", "int", "forced to int"};
13091 static const char * arm_attr_tag_ABI_HardFP_use[] =
13092   {"As Tag_FP_arch", "SP only", "Reserved", "Deprecated"};
13093 static const char * arm_attr_tag_ABI_VFP_args[] =
13094   {"AAPCS", "VFP registers", "custom", "compatible"};
13095 static const char * arm_attr_tag_ABI_WMMX_args[] =
13096   {"AAPCS", "WMMX registers", "custom"};
13097 static const char * arm_attr_tag_ABI_optimization_goals[] =
13098   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13099     "Aggressive Size", "Prefer Debug", "Aggressive Debug"};
13100 static const char * arm_attr_tag_ABI_FP_optimization_goals[] =
13101   {"None", "Prefer Speed", "Aggressive Speed", "Prefer Size",
13102     "Aggressive Size", "Prefer Accuracy", "Aggressive Accuracy"};
13103 static const char * arm_attr_tag_CPU_unaligned_access[] = {"None", "v6"};
13104 static const char * arm_attr_tag_FP_HP_extension[] =
13105   {"Not Allowed", "Allowed"};
13106 static const char * arm_attr_tag_ABI_FP_16bit_format[] =
13107   {"None", "IEEE 754", "Alternative Format"};
13108 static const char * arm_attr_tag_DSP_extension[] =
13109   {"Follow architecture", "Allowed"};
13110 static const char * arm_attr_tag_MPextension_use[] =
13111   {"Not Allowed", "Allowed"};
13112 static const char * arm_attr_tag_DIV_use[] =
13113   {"Allowed in Thumb-ISA, v7-R or v7-M", "Not allowed",
13114     "Allowed in v7-A with integer division extension"};
13115 static const char * arm_attr_tag_T2EE_use[] = {"Not Allowed", "Allowed"};
13116 static const char * arm_attr_tag_Virtualization_use[] =
13117   {"Not Allowed", "TrustZone", "Virtualization Extensions",
13118     "TrustZone and Virtualization Extensions"};
13119 static const char * arm_attr_tag_MPextension_use_legacy[] =
13120   {"Not Allowed", "Allowed"};
13121
13122 #define LOOKUP(id, name) \
13123   {id, #name, 0x80 | ARRAY_SIZE(arm_attr_tag_##name), arm_attr_tag_##name}
13124 static arm_attr_public_tag arm_attr_public_tags[] =
13125 {
13126   {4, "CPU_raw_name", 1, NULL},
13127   {5, "CPU_name", 1, NULL},
13128   LOOKUP(6, CPU_arch),
13129   {7, "CPU_arch_profile", 0, NULL},
13130   LOOKUP(8, ARM_ISA_use),
13131   LOOKUP(9, THUMB_ISA_use),
13132   LOOKUP(10, FP_arch),
13133   LOOKUP(11, WMMX_arch),
13134   LOOKUP(12, Advanced_SIMD_arch),
13135   LOOKUP(13, PCS_config),
13136   LOOKUP(14, ABI_PCS_R9_use),
13137   LOOKUP(15, ABI_PCS_RW_data),
13138   LOOKUP(16, ABI_PCS_RO_data),
13139   LOOKUP(17, ABI_PCS_GOT_use),
13140   LOOKUP(18, ABI_PCS_wchar_t),
13141   LOOKUP(19, ABI_FP_rounding),
13142   LOOKUP(20, ABI_FP_denormal),
13143   LOOKUP(21, ABI_FP_exceptions),
13144   LOOKUP(22, ABI_FP_user_exceptions),
13145   LOOKUP(23, ABI_FP_number_model),
13146   {24, "ABI_align_needed", 0, NULL},
13147   {25, "ABI_align_preserved", 0, NULL},
13148   LOOKUP(26, ABI_enum_size),
13149   LOOKUP(27, ABI_HardFP_use),
13150   LOOKUP(28, ABI_VFP_args),
13151   LOOKUP(29, ABI_WMMX_args),
13152   LOOKUP(30, ABI_optimization_goals),
13153   LOOKUP(31, ABI_FP_optimization_goals),
13154   {32, "compatibility", 0, NULL},
13155   LOOKUP(34, CPU_unaligned_access),
13156   LOOKUP(36, FP_HP_extension),
13157   LOOKUP(38, ABI_FP_16bit_format),
13158   LOOKUP(42, MPextension_use),
13159   LOOKUP(44, DIV_use),
13160   LOOKUP(46, DSP_extension),
13161   {64, "nodefaults", 0, NULL},
13162   {65, "also_compatible_with", 0, NULL},
13163   LOOKUP(66, T2EE_use),
13164   {67, "conformance", 1, NULL},
13165   LOOKUP(68, Virtualization_use),
13166   LOOKUP(70, MPextension_use_legacy)
13167 };
13168 #undef LOOKUP
13169
13170 static unsigned char *
13171 display_arm_attribute (unsigned char * p,
13172                        const unsigned char * const end)
13173 {
13174   unsigned int tag;
13175   unsigned int len;
13176   unsigned int val;
13177   arm_attr_public_tag * attr;
13178   unsigned i;
13179   unsigned int type;
13180
13181   tag = read_uleb128 (p, &len, end);
13182   p += len;
13183   attr = NULL;
13184   for (i = 0; i < ARRAY_SIZE (arm_attr_public_tags); i++)
13185     {
13186       if (arm_attr_public_tags[i].tag == tag)
13187         {
13188           attr = &arm_attr_public_tags[i];
13189           break;
13190         }
13191     }
13192
13193   if (attr)
13194     {
13195       printf ("  Tag_%s: ", attr->name);
13196       switch (attr->type)
13197         {
13198         case 0:
13199           switch (tag)
13200             {
13201             case 7: /* Tag_CPU_arch_profile.  */
13202               val = read_uleb128 (p, &len, end);
13203               p += len;
13204               switch (val)
13205                 {
13206                 case 0: printf (_("None\n")); break;
13207                 case 'A': printf (_("Application\n")); break;
13208                 case 'R': printf (_("Realtime\n")); break;
13209                 case 'M': printf (_("Microcontroller\n")); break;
13210                 case 'S': printf (_("Application or Realtime\n")); break;
13211                 default: printf ("??? (%d)\n", val); break;
13212                 }
13213               break;
13214
13215             case 24: /* Tag_align_needed.  */
13216               val = read_uleb128 (p, &len, end);
13217               p += len;
13218               switch (val)
13219                 {
13220                 case 0: printf (_("None\n")); break;
13221                 case 1: printf (_("8-byte\n")); break;
13222                 case 2: printf (_("4-byte\n")); break;
13223                 case 3: printf ("??? 3\n"); break;
13224                 default:
13225                   if (val <= 12)
13226                     printf (_("8-byte and up to %d-byte extended\n"),
13227                             1 << val);
13228                   else
13229                     printf ("??? (%d)\n", val);
13230                   break;
13231                 }
13232               break;
13233
13234             case 25: /* Tag_align_preserved.  */
13235               val = read_uleb128 (p, &len, end);
13236               p += len;
13237               switch (val)
13238                 {
13239                 case 0: printf (_("None\n")); break;
13240                 case 1: printf (_("8-byte, except leaf SP\n")); break;
13241                 case 2: printf (_("8-byte\n")); break;
13242                 case 3: printf ("??? 3\n"); break;
13243                 default:
13244                   if (val <= 12)
13245                     printf (_("8-byte and up to %d-byte extended\n"),
13246                             1 << val);
13247                   else
13248                     printf ("??? (%d)\n", val);
13249                   break;
13250                 }
13251               break;
13252
13253             case 32: /* Tag_compatibility.  */
13254               {
13255                 val = read_uleb128 (p, &len, end);
13256                 p += len;
13257                 printf (_("flag = %d, vendor = "), val);
13258                 if (p < end - 1)
13259                   {
13260                     size_t maxlen = (end - p) - 1;
13261
13262                     print_symbol ((int) maxlen, (const char *) p);
13263                     p += strnlen ((char *) p, maxlen) + 1;
13264                   }
13265                 else
13266                   {
13267                     printf (_("<corrupt>"));
13268                     p = (unsigned char *) end;
13269                   }
13270                 putchar ('\n');
13271               }
13272               break;
13273
13274             case 64: /* Tag_nodefaults.  */
13275               /* PR 17531: file: 001-505008-0.01.  */
13276               if (p < end)
13277                 p++;
13278               printf (_("True\n"));
13279               break;
13280
13281             case 65: /* Tag_also_compatible_with.  */
13282               val = read_uleb128 (p, &len, end);
13283               p += len;
13284               if (val == 6 /* Tag_CPU_arch.  */)
13285                 {
13286                   val = read_uleb128 (p, &len, end);
13287                   p += len;
13288                   if ((unsigned int) val >= ARRAY_SIZE (arm_attr_tag_CPU_arch))
13289                     printf ("??? (%d)\n", val);
13290                   else
13291                     printf ("%s\n", arm_attr_tag_CPU_arch[val]);
13292                 }
13293               else
13294                 printf ("???\n");
13295               while (p < end && *(p++) != '\0' /* NUL terminator.  */)
13296                 ;
13297               break;
13298
13299             default:
13300               printf (_("<unknown: %d>\n"), tag);
13301               break;
13302             }
13303           return p;
13304
13305         case 1:
13306           return display_tag_value (-1, p, end);
13307         case 2:
13308           return display_tag_value (0, p, end);
13309
13310         default:
13311           assert (attr->type & 0x80);
13312           val = read_uleb128 (p, &len, end);
13313           p += len;
13314           type = attr->type & 0x7f;
13315           if (val >= type)
13316             printf ("??? (%d)\n", val);
13317           else
13318             printf ("%s\n", attr->table[val]);
13319           return p;
13320         }
13321     }
13322
13323   return display_tag_value (tag, p, end);
13324 }
13325
13326 static unsigned char *
13327 display_gnu_attribute (unsigned char * p,
13328                        unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const),
13329                        const unsigned char * const end)
13330 {
13331   int tag;
13332   unsigned int len;
13333   int val;
13334
13335   tag = read_uleb128 (p, &len, end);
13336   p += len;
13337
13338   /* Tag_compatibility is the only generic GNU attribute defined at
13339      present.  */
13340   if (tag == 32)
13341     {
13342       val = read_uleb128 (p, &len, end);
13343       p += len;
13344
13345       printf (_("flag = %d, vendor = "), val);
13346       if (p == end)
13347         {
13348           printf (_("<corrupt>\n"));
13349           warn (_("corrupt vendor attribute\n"));
13350         }
13351       else
13352         {
13353           if (p < end - 1)
13354             {
13355               size_t maxlen = (end - p) - 1;
13356
13357               print_symbol ((int) maxlen, (const char *) p);
13358               p += strnlen ((char *) p, maxlen) + 1;
13359             }
13360           else
13361             {
13362               printf (_("<corrupt>"));
13363               p = (unsigned char *) end;
13364             }
13365           putchar ('\n');
13366         }
13367       return p;
13368     }
13369
13370   if ((tag & 2) == 0 && display_proc_gnu_attribute)
13371     return display_proc_gnu_attribute (p, tag, end);
13372
13373   return display_tag_value (tag, p, end);
13374 }
13375
13376 static unsigned char *
13377 display_power_gnu_attribute (unsigned char * p,
13378                              int tag,
13379                              const unsigned char * const end)
13380 {
13381   unsigned int len;
13382   int val;
13383
13384   if (tag == Tag_GNU_Power_ABI_FP)
13385     {
13386       val = read_uleb128 (p, &len, end);
13387       p += len;
13388       printf ("  Tag_GNU_Power_ABI_FP: ");
13389
13390       switch (val)
13391         {
13392         case 0:
13393           printf (_("Hard or soft float\n"));
13394           break;
13395         case 1:
13396           printf (_("Hard float\n"));
13397           break;
13398         case 2:
13399           printf (_("Soft float\n"));
13400           break;
13401         case 3:
13402           printf (_("Single-precision hard float\n"));
13403           break;
13404         default:
13405           printf ("??? (%d)\n", val);
13406           break;
13407         }
13408       return p;
13409    }
13410
13411   if (tag == Tag_GNU_Power_ABI_Vector)
13412     {
13413       val = read_uleb128 (p, &len, end);
13414       p += len;
13415       printf ("  Tag_GNU_Power_ABI_Vector: ");
13416       switch (val)
13417         {
13418         case 0:
13419           printf (_("Any\n"));
13420           break;
13421         case 1:
13422           printf (_("Generic\n"));
13423           break;
13424         case 2:
13425           printf ("AltiVec\n");
13426           break;
13427         case 3:
13428           printf ("SPE\n");
13429           break;
13430         default:
13431           printf ("??? (%d)\n", val);
13432           break;
13433         }
13434       return p;
13435    }
13436
13437   if (tag == Tag_GNU_Power_ABI_Struct_Return)
13438     {
13439       if (p == end)
13440         {
13441           warn (_("corrupt Tag_GNU_Power_ABI_Struct_Return\n"));
13442           return p;
13443         }
13444
13445       val = read_uleb128 (p, &len, end);
13446       p += len;
13447       printf ("  Tag_GNU_Power_ABI_Struct_Return: ");
13448       switch (val)
13449        {
13450        case 0:
13451          printf (_("Any\n"));
13452          break;
13453        case 1:
13454          printf ("r3/r4\n");
13455          break;
13456        case 2:
13457          printf (_("Memory\n"));
13458          break;
13459        default:
13460          printf ("??? (%d)\n", val);
13461          break;
13462        }
13463       return p;
13464     }
13465
13466   return display_tag_value (tag & 1, p, end);
13467 }
13468
13469 static unsigned char *
13470 display_s390_gnu_attribute (unsigned char * p,
13471                             int tag,
13472                             const unsigned char * const end)
13473 {
13474   unsigned int len;
13475   int val;
13476
13477   if (tag == Tag_GNU_S390_ABI_Vector)
13478     {
13479       val = read_uleb128 (p, &len, end);
13480       p += len;
13481       printf ("  Tag_GNU_S390_ABI_Vector: ");
13482
13483       switch (val)
13484         {
13485         case 0:
13486           printf (_("any\n"));
13487           break;
13488         case 1:
13489           printf (_("software\n"));
13490           break;
13491         case 2:
13492           printf (_("hardware\n"));
13493           break;
13494         default:
13495           printf ("??? (%d)\n", val);
13496           break;
13497         }
13498       return p;
13499    }
13500
13501   return display_tag_value (tag & 1, p, end);
13502 }
13503
13504 static void
13505 display_sparc_hwcaps (int mask)
13506 {
13507   if (mask)
13508     {
13509       int first = 1;
13510
13511       if (mask & ELF_SPARC_HWCAP_MUL32)
13512         fputs ("mul32", stdout), first = 0;
13513       if (mask & ELF_SPARC_HWCAP_DIV32)
13514         printf ("%sdiv32", first ? "" : "|"), first = 0;
13515       if (mask & ELF_SPARC_HWCAP_FSMULD)
13516         printf ("%sfsmuld", first ? "" : "|"), first = 0;
13517       if (mask & ELF_SPARC_HWCAP_V8PLUS)
13518         printf ("%sv8plus", first ? "" : "|"), first = 0;
13519       if (mask & ELF_SPARC_HWCAP_POPC)
13520         printf ("%spopc", first ? "" : "|"), first = 0;
13521       if (mask & ELF_SPARC_HWCAP_VIS)
13522         printf ("%svis", first ? "" : "|"), first = 0;
13523       if (mask & ELF_SPARC_HWCAP_VIS2)
13524         printf ("%svis2", first ? "" : "|"), first = 0;
13525       if (mask & ELF_SPARC_HWCAP_ASI_BLK_INIT)
13526         printf ("%sASIBlkInit", first ? "" : "|"), first = 0;
13527       if (mask & ELF_SPARC_HWCAP_FMAF)
13528         printf ("%sfmaf", first ? "" : "|"), first = 0;
13529       if (mask & ELF_SPARC_HWCAP_VIS3)
13530         printf ("%svis3", first ? "" : "|"), first = 0;
13531       if (mask & ELF_SPARC_HWCAP_HPC)
13532         printf ("%shpc", first ? "" : "|"), first = 0;
13533       if (mask & ELF_SPARC_HWCAP_RANDOM)
13534         printf ("%srandom", first ? "" : "|"), first = 0;
13535       if (mask & ELF_SPARC_HWCAP_TRANS)
13536         printf ("%strans", first ? "" : "|"), first = 0;
13537       if (mask & ELF_SPARC_HWCAP_FJFMAU)
13538         printf ("%sfjfmau", first ? "" : "|"), first = 0;
13539       if (mask & ELF_SPARC_HWCAP_IMA)
13540         printf ("%sima", first ? "" : "|"), first = 0;
13541       if (mask & ELF_SPARC_HWCAP_ASI_CACHE_SPARING)
13542         printf ("%scspare", first ? "" : "|"), first = 0;
13543     }
13544   else
13545     fputc ('0', stdout);
13546   fputc ('\n', stdout);
13547 }
13548
13549 static void
13550 display_sparc_hwcaps2 (int mask)
13551 {
13552   if (mask)
13553     {
13554       int first = 1;
13555
13556       if (mask & ELF_SPARC_HWCAP2_FJATHPLUS)
13557         fputs ("fjathplus", stdout), first = 0;
13558       if (mask & ELF_SPARC_HWCAP2_VIS3B)
13559         printf ("%svis3b", first ? "" : "|"), first = 0;
13560       if (mask & ELF_SPARC_HWCAP2_ADP)
13561         printf ("%sadp", first ? "" : "|"), first = 0;
13562       if (mask & ELF_SPARC_HWCAP2_SPARC5)
13563         printf ("%ssparc5", first ? "" : "|"), first = 0;
13564       if (mask & ELF_SPARC_HWCAP2_MWAIT)
13565         printf ("%smwait", first ? "" : "|"), first = 0;
13566       if (mask & ELF_SPARC_HWCAP2_XMPMUL)
13567         printf ("%sxmpmul", first ? "" : "|"), first = 0;
13568       if (mask & ELF_SPARC_HWCAP2_XMONT)
13569         printf ("%sxmont2", first ? "" : "|"), first = 0;
13570       if (mask & ELF_SPARC_HWCAP2_NSEC)
13571         printf ("%snsec", first ? "" : "|"), first = 0;
13572       if (mask & ELF_SPARC_HWCAP2_FJATHHPC)
13573         printf ("%sfjathhpc", first ? "" : "|"), first = 0;
13574       if (mask & ELF_SPARC_HWCAP2_FJDES)
13575         printf ("%sfjdes", first ? "" : "|"), first = 0;
13576       if (mask & ELF_SPARC_HWCAP2_FJAES)
13577         printf ("%sfjaes", first ? "" : "|"), first = 0;
13578     }
13579   else
13580     fputc ('0', stdout);
13581   fputc ('\n', stdout);
13582 }
13583
13584 static unsigned char *
13585 display_sparc_gnu_attribute (unsigned char * p,
13586                              int tag,
13587                              const unsigned char * const end)
13588 {
13589   unsigned int len;
13590   int val;
13591
13592   if (tag == Tag_GNU_Sparc_HWCAPS)
13593     {
13594       val = read_uleb128 (p, &len, end);
13595       p += len;
13596       printf ("  Tag_GNU_Sparc_HWCAPS: ");
13597       display_sparc_hwcaps (val);
13598       return p;
13599     }
13600   if (tag == Tag_GNU_Sparc_HWCAPS2)
13601     {
13602       val = read_uleb128 (p, &len, end);
13603       p += len;
13604       printf ("  Tag_GNU_Sparc_HWCAPS2: ");
13605       display_sparc_hwcaps2 (val);
13606       return p;
13607     }
13608
13609   return display_tag_value (tag, p, end);
13610 }
13611
13612 static void
13613 print_mips_fp_abi_value (int val)
13614 {
13615   switch (val)
13616     {
13617     case Val_GNU_MIPS_ABI_FP_ANY:
13618       printf (_("Hard or soft float\n"));
13619       break;
13620     case Val_GNU_MIPS_ABI_FP_DOUBLE:
13621       printf (_("Hard float (double precision)\n"));
13622       break;
13623     case Val_GNU_MIPS_ABI_FP_SINGLE:
13624       printf (_("Hard float (single precision)\n"));
13625       break;
13626     case Val_GNU_MIPS_ABI_FP_SOFT:
13627       printf (_("Soft float\n"));
13628       break;
13629     case Val_GNU_MIPS_ABI_FP_OLD_64:
13630       printf (_("Hard float (MIPS32r2 64-bit FPU 12 callee-saved)\n"));
13631       break;
13632     case Val_GNU_MIPS_ABI_FP_XX:
13633       printf (_("Hard float (32-bit CPU, Any FPU)\n"));
13634       break;
13635     case Val_GNU_MIPS_ABI_FP_64:
13636       printf (_("Hard float (32-bit CPU, 64-bit FPU)\n"));
13637       break;
13638     case Val_GNU_MIPS_ABI_FP_64A:
13639       printf (_("Hard float compat (32-bit CPU, 64-bit FPU)\n"));
13640       break;
13641     case Val_GNU_MIPS_ABI_FP_NAN2008:
13642       printf (_("NaN 2008 compatibility\n"));
13643       break;
13644     default:
13645       printf ("??? (%d)\n", val);
13646       break;
13647     }
13648 }
13649
13650 static unsigned char *
13651 display_mips_gnu_attribute (unsigned char * p,
13652                             int tag,
13653                             const unsigned char * const end)
13654 {
13655   if (tag == Tag_GNU_MIPS_ABI_FP)
13656     {
13657       unsigned int len;
13658       int val;
13659
13660       val = read_uleb128 (p, &len, end);
13661       p += len;
13662       printf ("  Tag_GNU_MIPS_ABI_FP: ");
13663
13664       print_mips_fp_abi_value (val);
13665
13666       return p;
13667    }
13668
13669   if (tag == Tag_GNU_MIPS_ABI_MSA)
13670     {
13671       unsigned int len;
13672       int val;
13673
13674       val = read_uleb128 (p, &len, end);
13675       p += len;
13676       printf ("  Tag_GNU_MIPS_ABI_MSA: ");
13677
13678       switch (val)
13679         {
13680         case Val_GNU_MIPS_ABI_MSA_ANY:
13681           printf (_("Any MSA or not\n"));
13682           break;
13683         case Val_GNU_MIPS_ABI_MSA_128:
13684           printf (_("128-bit MSA\n"));
13685           break;
13686         default:
13687           printf ("??? (%d)\n", val);
13688           break;
13689         }
13690       return p;
13691     }
13692
13693   return display_tag_value (tag & 1, p, end);
13694 }
13695
13696 static unsigned char *
13697 display_tic6x_attribute (unsigned char * p,
13698                          const unsigned char * const end)
13699 {
13700   int tag;
13701   unsigned int len;
13702   int val;
13703
13704   tag = read_uleb128 (p, &len, end);
13705   p += len;
13706
13707   switch (tag)
13708     {
13709     case Tag_ISA:
13710       val = read_uleb128 (p, &len, end);
13711       p += len;
13712       printf ("  Tag_ISA: ");
13713
13714       switch (val)
13715         {
13716         case C6XABI_Tag_ISA_none:
13717           printf (_("None\n"));
13718           break;
13719         case C6XABI_Tag_ISA_C62X:
13720           printf ("C62x\n");
13721           break;
13722         case C6XABI_Tag_ISA_C67X:
13723           printf ("C67x\n");
13724           break;
13725         case C6XABI_Tag_ISA_C67XP:
13726           printf ("C67x+\n");
13727           break;
13728         case C6XABI_Tag_ISA_C64X:
13729           printf ("C64x\n");
13730           break;
13731         case C6XABI_Tag_ISA_C64XP:
13732           printf ("C64x+\n");
13733           break;
13734         case C6XABI_Tag_ISA_C674X:
13735           printf ("C674x\n");
13736           break;
13737         default:
13738           printf ("??? (%d)\n", val);
13739           break;
13740         }
13741       return p;
13742
13743     case Tag_ABI_wchar_t:
13744       val = read_uleb128 (p, &len, end);
13745       p += len;
13746       printf ("  Tag_ABI_wchar_t: ");
13747       switch (val)
13748         {
13749         case 0:
13750           printf (_("Not used\n"));
13751           break;
13752         case 1:
13753           printf (_("2 bytes\n"));
13754           break;
13755         case 2:
13756           printf (_("4 bytes\n"));
13757           break;
13758         default:
13759           printf ("??? (%d)\n", val);
13760           break;
13761         }
13762       return p;
13763
13764     case Tag_ABI_stack_align_needed:
13765       val = read_uleb128 (p, &len, end);
13766       p += len;
13767       printf ("  Tag_ABI_stack_align_needed: ");
13768       switch (val)
13769         {
13770         case 0:
13771           printf (_("8-byte\n"));
13772           break;
13773         case 1:
13774           printf (_("16-byte\n"));
13775           break;
13776         default:
13777           printf ("??? (%d)\n", val);
13778           break;
13779         }
13780       return p;
13781
13782     case Tag_ABI_stack_align_preserved:
13783       val = read_uleb128 (p, &len, end);
13784       p += len;
13785       printf ("  Tag_ABI_stack_align_preserved: ");
13786       switch (val)
13787         {
13788         case 0:
13789           printf (_("8-byte\n"));
13790           break;
13791         case 1:
13792           printf (_("16-byte\n"));
13793           break;
13794         default:
13795           printf ("??? (%d)\n", val);
13796           break;
13797         }
13798       return p;
13799
13800     case Tag_ABI_DSBT:
13801       val = read_uleb128 (p, &len, end);
13802       p += len;
13803       printf ("  Tag_ABI_DSBT: ");
13804       switch (val)
13805         {
13806         case 0:
13807           printf (_("DSBT addressing not used\n"));
13808           break;
13809         case 1:
13810           printf (_("DSBT addressing used\n"));
13811           break;
13812         default:
13813           printf ("??? (%d)\n", val);
13814           break;
13815         }
13816       return p;
13817
13818     case Tag_ABI_PID:
13819       val = read_uleb128 (p, &len, end);
13820       p += len;
13821       printf ("  Tag_ABI_PID: ");
13822       switch (val)
13823         {
13824         case 0:
13825           printf (_("Data addressing position-dependent\n"));
13826           break;
13827         case 1:
13828           printf (_("Data addressing position-independent, GOT near DP\n"));
13829           break;
13830         case 2:
13831           printf (_("Data addressing position-independent, GOT far from DP\n"));
13832           break;
13833         default:
13834           printf ("??? (%d)\n", val);
13835           break;
13836         }
13837       return p;
13838
13839     case Tag_ABI_PIC:
13840       val = read_uleb128 (p, &len, end);
13841       p += len;
13842       printf ("  Tag_ABI_PIC: ");
13843       switch (val)
13844         {
13845         case 0:
13846           printf (_("Code addressing position-dependent\n"));
13847           break;
13848         case 1:
13849           printf (_("Code addressing position-independent\n"));
13850           break;
13851         default:
13852           printf ("??? (%d)\n", val);
13853           break;
13854         }
13855       return p;
13856
13857     case Tag_ABI_array_object_alignment:
13858       val = read_uleb128 (p, &len, end);
13859       p += len;
13860       printf ("  Tag_ABI_array_object_alignment: ");
13861       switch (val)
13862         {
13863         case 0:
13864           printf (_("8-byte\n"));
13865           break;
13866         case 1:
13867           printf (_("4-byte\n"));
13868           break;
13869         case 2:
13870           printf (_("16-byte\n"));
13871           break;
13872         default:
13873           printf ("??? (%d)\n", val);
13874           break;
13875         }
13876       return p;
13877
13878     case Tag_ABI_array_object_align_expected:
13879       val = read_uleb128 (p, &len, end);
13880       p += len;
13881       printf ("  Tag_ABI_array_object_align_expected: ");
13882       switch (val)
13883         {
13884         case 0:
13885           printf (_("8-byte\n"));
13886           break;
13887         case 1:
13888           printf (_("4-byte\n"));
13889           break;
13890         case 2:
13891           printf (_("16-byte\n"));
13892           break;
13893         default:
13894           printf ("??? (%d)\n", val);
13895           break;
13896         }
13897       return p;
13898
13899     case Tag_ABI_compatibility:
13900       {
13901         val = read_uleb128 (p, &len, end);
13902         p += len;
13903         printf ("  Tag_ABI_compatibility: ");
13904         printf (_("flag = %d, vendor = "), val);
13905         if (p < end - 1)
13906           {
13907             size_t maxlen = (end - p) - 1;
13908
13909             print_symbol ((int) maxlen, (const char *) p);
13910             p += strnlen ((char *) p, maxlen) + 1;
13911           }
13912         else
13913           {
13914             printf (_("<corrupt>"));
13915             p = (unsigned char *) end;
13916           }
13917         putchar ('\n');
13918         return p;
13919       }
13920
13921     case Tag_ABI_conformance:
13922       {
13923         printf ("  Tag_ABI_conformance: \"");
13924         if (p < end - 1)
13925           {
13926             size_t maxlen = (end - p) - 1;
13927
13928             print_symbol ((int) maxlen, (const char *) p);
13929             p += strnlen ((char *) p, maxlen) + 1;
13930           }
13931         else
13932           {
13933             printf (_("<corrupt>"));
13934             p = (unsigned char *) end;
13935           }
13936         printf ("\"\n");
13937         return p;
13938       }
13939     }
13940
13941   return display_tag_value (tag, p, end);
13942 }
13943
13944 static void
13945 display_raw_attribute (unsigned char * p, unsigned char * end)
13946 {
13947   unsigned long addr = 0;
13948   size_t bytes = end - p;
13949
13950   assert (end > p);
13951   while (bytes)
13952     {
13953       int j;
13954       int k;
13955       int lbytes = (bytes > 16 ? 16 : bytes);
13956
13957       printf ("  0x%8.8lx ", addr);
13958
13959       for (j = 0; j < 16; j++)
13960         {
13961           if (j < lbytes)
13962             printf ("%2.2x", p[j]);
13963           else
13964             printf ("  ");
13965
13966           if ((j & 3) == 3)
13967             printf (" ");
13968         }
13969
13970       for (j = 0; j < lbytes; j++)
13971         {
13972           k = p[j];
13973           if (k >= ' ' && k < 0x7f)
13974             printf ("%c", k);
13975           else
13976             printf (".");
13977         }
13978
13979       putchar ('\n');
13980
13981       p  += lbytes;
13982       bytes -= lbytes;
13983       addr += lbytes;
13984     }
13985
13986   putchar ('\n');
13987 }
13988
13989 static unsigned char *
13990 display_msp430x_attribute (unsigned char * p,
13991                            const unsigned char * const end)
13992 {
13993   unsigned int len;
13994   int val;
13995   int tag;
13996
13997   tag = read_uleb128 (p, & len, end);
13998   p += len;
13999
14000   switch (tag)
14001     {
14002     case OFBA_MSPABI_Tag_ISA:
14003       val = read_uleb128 (p, &len, end);
14004       p += len;
14005       printf ("  Tag_ISA: ");
14006       switch (val)
14007         {
14008         case 0: printf (_("None\n")); break;
14009         case 1: printf (_("MSP430\n")); break;
14010         case 2: printf (_("MSP430X\n")); break;
14011         default: printf ("??? (%d)\n", val); break;
14012         }
14013       break;
14014
14015     case OFBA_MSPABI_Tag_Code_Model:
14016       val = read_uleb128 (p, &len, end);
14017       p += len;
14018       printf ("  Tag_Code_Model: ");
14019       switch (val)
14020         {
14021         case 0: printf (_("None\n")); break;
14022         case 1: printf (_("Small\n")); break;
14023         case 2: printf (_("Large\n")); break;
14024         default: printf ("??? (%d)\n", val); break;
14025         }
14026       break;
14027
14028     case OFBA_MSPABI_Tag_Data_Model:
14029       val = read_uleb128 (p, &len, end);
14030       p += len;
14031       printf ("  Tag_Data_Model: ");
14032       switch (val)
14033         {
14034         case 0: printf (_("None\n")); break;
14035         case 1: printf (_("Small\n")); break;
14036         case 2: printf (_("Large\n")); break;
14037         case 3: printf (_("Restricted Large\n")); break;
14038         default: printf ("??? (%d)\n", val); break;
14039         }
14040       break;
14041
14042     default:
14043       printf (_("  <unknown tag %d>: "), tag);
14044
14045       if (tag & 1)
14046         {
14047           putchar ('"');
14048           if (p < end - 1)
14049             {
14050               size_t maxlen = (end - p) - 1;
14051
14052               print_symbol ((int) maxlen, (const char *) p);
14053               p += strnlen ((char *) p, maxlen) + 1;
14054             }
14055           else
14056             {
14057               printf (_("<corrupt>"));
14058               p = (unsigned char *) end;
14059             }
14060           printf ("\"\n");
14061         }
14062       else
14063         {
14064           val = read_uleb128 (p, &len, end);
14065           p += len;
14066           printf ("%d (0x%x)\n", val, val);
14067         }
14068       break;
14069    }
14070
14071   assert (p <= end);
14072   return p;
14073 }
14074
14075 static int
14076 process_attributes (FILE * file,
14077                     const char * public_name,
14078                     unsigned int proc_type,
14079                     unsigned char * (* display_pub_attribute) (unsigned char *, const unsigned char * const),
14080                     unsigned char * (* display_proc_gnu_attribute) (unsigned char *, int, const unsigned char * const))
14081 {
14082   Elf_Internal_Shdr * sect;
14083   unsigned i;
14084
14085   /* Find the section header so that we get the size.  */
14086   for (i = 0, sect = section_headers;
14087        i < elf_header.e_shnum;
14088        i++, sect++)
14089     {
14090       unsigned char * contents;
14091       unsigned char * p;
14092
14093       if (sect->sh_type != proc_type && sect->sh_type != SHT_GNU_ATTRIBUTES)
14094         continue;
14095
14096       contents = (unsigned char *) get_data (NULL, file, sect->sh_offset, 1,
14097                                              sect->sh_size, _("attributes"));
14098       if (contents == NULL)
14099         continue;
14100
14101       p = contents;
14102       if (*p == 'A')
14103         {
14104           bfd_vma section_len;
14105
14106           section_len = sect->sh_size - 1;
14107           p++;
14108
14109           while (section_len > 0)
14110             {
14111               bfd_vma attr_len;
14112               unsigned int namelen;
14113               bfd_boolean public_section;
14114               bfd_boolean gnu_section;
14115
14116               if (section_len <= 4)
14117                 {
14118                   error (_("Tag section ends prematurely\n"));
14119                   break;
14120                 }
14121               attr_len = byte_get (p, 4);
14122               p += 4;
14123
14124               if (attr_len > section_len)
14125                 {
14126                   error (_("Bad attribute length (%u > %u)\n"),
14127                           (unsigned) attr_len, (unsigned) section_len);
14128                   attr_len = section_len;
14129                 }
14130               /* PR 17531: file: 001-101425-0.004  */
14131               else if (attr_len < 5)
14132                 {
14133                   error (_("Attribute length of %u is too small\n"), (unsigned) attr_len);
14134                   break;
14135                 }
14136
14137               section_len -= attr_len;
14138               attr_len -= 4;
14139
14140               namelen = strnlen ((char *) p, attr_len) + 1;
14141               if (namelen == 0 || namelen >= attr_len)
14142                 {
14143                   error (_("Corrupt attribute section name\n"));
14144                   break;
14145                 }
14146
14147               printf (_("Attribute Section: "));
14148               print_symbol (INT_MAX, (const char *) p);
14149               putchar ('\n');
14150
14151               if (public_name && streq ((char *) p, public_name))
14152                 public_section = TRUE;
14153               else
14154                 public_section = FALSE;
14155
14156               if (streq ((char *) p, "gnu"))
14157                 gnu_section = TRUE;
14158               else
14159                 gnu_section = FALSE;
14160
14161               p += namelen;
14162               attr_len -= namelen;
14163
14164               while (attr_len > 0 && p < contents + sect->sh_size)
14165                 {
14166                   int tag;
14167                   int val;
14168                   bfd_vma size;
14169                   unsigned char * end;
14170
14171                   /* PR binutils/17531: Safe handling of corrupt files.  */
14172                   if (attr_len < 6)
14173                     {
14174                       error (_("Unused bytes at end of section\n"));
14175                       section_len = 0;
14176                       break;
14177                     }
14178
14179                   tag = *(p++);
14180                   size = byte_get (p, 4);
14181                   if (size > attr_len)
14182                     {
14183                       error (_("Bad subsection length (%u > %u)\n"),
14184                               (unsigned) size, (unsigned) attr_len);
14185                       size = attr_len;
14186                     }
14187                   /* PR binutils/17531: Safe handling of corrupt files.  */
14188                   if (size < 6)
14189                     {
14190                       error (_("Bad subsection length (%u < 6)\n"),
14191                               (unsigned) size);
14192                       section_len = 0;
14193                       break;
14194                     }
14195
14196                   attr_len -= size;
14197                   end = p + size - 1;
14198                   assert (end <= contents + sect->sh_size);
14199                   p += 4;
14200
14201                   switch (tag)
14202                     {
14203                     case 1:
14204                       printf (_("File Attributes\n"));
14205                       break;
14206                     case 2:
14207                       printf (_("Section Attributes:"));
14208                       goto do_numlist;
14209                     case 3:
14210                       printf (_("Symbol Attributes:"));
14211                     do_numlist:
14212                       for (;;)
14213                         {
14214                           unsigned int j;
14215
14216                           val = read_uleb128 (p, &j, end);
14217                           p += j;
14218                           if (val == 0)
14219                             break;
14220                           printf (" %d", val);
14221                         }
14222                       printf ("\n");
14223                       break;
14224                     default:
14225                       printf (_("Unknown tag: %d\n"), tag);
14226                       public_section = FALSE;
14227                       break;
14228                     }
14229
14230                   if (public_section && display_pub_attribute != NULL)
14231                     {
14232                       while (p < end)
14233                         p = display_pub_attribute (p, end);
14234                       assert (p <= end);
14235                     }
14236                   else if (gnu_section && display_proc_gnu_attribute != NULL)
14237                     {
14238                       while (p < end)
14239                         p = display_gnu_attribute (p,
14240                                                    display_proc_gnu_attribute,
14241                                                    end);
14242                       assert (p <= end);
14243                     }
14244                   else if (p < end)
14245                     {
14246                       printf (_("  Unknown attribute:\n"));
14247                       display_raw_attribute (p, end);
14248                       p = end;
14249                     }
14250                   else
14251                     attr_len = 0;
14252                 }
14253             }
14254         }
14255       else
14256         printf (_("Unknown format '%c' (%d)\n"), *p, *p);
14257
14258       free (contents);
14259     }
14260   return 1;
14261 }
14262
14263 static int
14264 process_arm_specific (FILE * file)
14265 {
14266   return process_attributes (file, "aeabi", SHT_ARM_ATTRIBUTES,
14267                              display_arm_attribute, NULL);
14268 }
14269
14270 static int
14271 process_power_specific (FILE * file)
14272 {
14273   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14274                              display_power_gnu_attribute);
14275 }
14276
14277 static int
14278 process_s390_specific (FILE * file)
14279 {
14280   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14281                              display_s390_gnu_attribute);
14282 }
14283
14284 static int
14285 process_sparc_specific (FILE * file)
14286 {
14287   return process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14288                              display_sparc_gnu_attribute);
14289 }
14290
14291 static int
14292 process_tic6x_specific (FILE * file)
14293 {
14294   return process_attributes (file, "c6xabi", SHT_C6000_ATTRIBUTES,
14295                              display_tic6x_attribute, NULL);
14296 }
14297
14298 static int
14299 process_msp430x_specific (FILE * file)
14300 {
14301   return process_attributes (file, "mspabi", SHT_MSP430_ATTRIBUTES,
14302                              display_msp430x_attribute, NULL);
14303 }
14304
14305 /* DATA points to the contents of a MIPS GOT that starts at VMA PLTGOT.
14306    Print the Address, Access and Initial fields of an entry at VMA ADDR
14307    and return the VMA of the next entry, or -1 if there was a problem.
14308    Does not read from DATA_END or beyond.  */
14309
14310 static bfd_vma
14311 print_mips_got_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr,
14312                       unsigned char * data_end)
14313 {
14314   printf ("  ");
14315   print_vma (addr, LONG_HEX);
14316   printf (" ");
14317   if (addr < pltgot + 0xfff0)
14318     printf ("%6d(gp)", (int) (addr - pltgot - 0x7ff0));
14319   else
14320     printf ("%10s", "");
14321   printf (" ");
14322   if (data == NULL)
14323     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14324   else
14325     {
14326       bfd_vma entry;
14327       unsigned char * from = data + addr - pltgot;
14328
14329       if (from + (is_32bit_elf ? 4 : 8) > data_end)
14330         {
14331           warn (_("MIPS GOT entry extends beyond the end of available data\n"));
14332           printf ("%*s", is_32bit_elf ? 8 : 16, _("<corrupt>"));
14333           return (bfd_vma) -1;
14334         }
14335       else
14336         {
14337           entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14338           print_vma (entry, LONG_HEX);
14339         }
14340     }
14341   return addr + (is_32bit_elf ? 4 : 8);
14342 }
14343
14344 /* DATA points to the contents of a MIPS PLT GOT that starts at VMA
14345    PLTGOT.  Print the Address and Initial fields of an entry at VMA
14346    ADDR and return the VMA of the next entry.  */
14347
14348 static bfd_vma
14349 print_mips_pltgot_entry (unsigned char * data, bfd_vma pltgot, bfd_vma addr)
14350 {
14351   printf ("  ");
14352   print_vma (addr, LONG_HEX);
14353   printf (" ");
14354   if (data == NULL)
14355     printf ("%*s", is_32bit_elf ? 8 : 16, _("<unknown>"));
14356   else
14357     {
14358       bfd_vma entry;
14359
14360       entry = byte_get (data + addr - pltgot, is_32bit_elf ? 4 : 8);
14361       print_vma (entry, LONG_HEX);
14362     }
14363   return addr + (is_32bit_elf ? 4 : 8);
14364 }
14365
14366 static void
14367 print_mips_ases (unsigned int mask)
14368 {
14369   if (mask & AFL_ASE_DSP)
14370     fputs ("\n\tDSP ASE", stdout);
14371   if (mask & AFL_ASE_DSPR2)
14372     fputs ("\n\tDSP R2 ASE", stdout);
14373   if (mask & AFL_ASE_DSPR3)
14374     fputs ("\n\tDSP R3 ASE", stdout);
14375   if (mask & AFL_ASE_EVA)
14376     fputs ("\n\tEnhanced VA Scheme", stdout);
14377   if (mask & AFL_ASE_MCU)
14378     fputs ("\n\tMCU (MicroController) ASE", stdout);
14379   if (mask & AFL_ASE_MDMX)
14380     fputs ("\n\tMDMX ASE", stdout);
14381   if (mask & AFL_ASE_MIPS3D)
14382     fputs ("\n\tMIPS-3D ASE", stdout);
14383   if (mask & AFL_ASE_MT)
14384     fputs ("\n\tMT ASE", stdout);
14385   if (mask & AFL_ASE_SMARTMIPS)
14386     fputs ("\n\tSmartMIPS ASE", stdout);
14387   if (mask & AFL_ASE_VIRT)
14388     fputs ("\n\tVZ ASE", stdout);
14389   if (mask & AFL_ASE_MSA)
14390     fputs ("\n\tMSA ASE", stdout);
14391   if (mask & AFL_ASE_MIPS16)
14392     fputs ("\n\tMIPS16 ASE", stdout);
14393   if (mask & AFL_ASE_MICROMIPS)
14394     fputs ("\n\tMICROMIPS ASE", stdout);
14395   if (mask & AFL_ASE_XPA)
14396     fputs ("\n\tXPA ASE", stdout);
14397   if (mask == 0)
14398     fprintf (stdout, "\n\t%s", _("None"));
14399   else if ((mask & ~AFL_ASE_MASK) != 0)
14400     fprintf (stdout, "\n\t%s (%x)", _("Unknown"), mask & ~AFL_ASE_MASK);
14401 }
14402
14403 static void
14404 print_mips_isa_ext (unsigned int isa_ext)
14405 {
14406   switch (isa_ext)
14407     {
14408     case 0:
14409       fputs (_("None"), stdout);
14410       break;
14411     case AFL_EXT_XLR:
14412       fputs ("RMI XLR", stdout);
14413       break;
14414     case AFL_EXT_OCTEON3:
14415       fputs ("Cavium Networks Octeon3", stdout);
14416       break;
14417     case AFL_EXT_OCTEON2:
14418       fputs ("Cavium Networks Octeon2", stdout);
14419       break;
14420     case AFL_EXT_OCTEONP:
14421       fputs ("Cavium Networks OcteonP", stdout);
14422       break;
14423     case AFL_EXT_LOONGSON_3A:
14424       fputs ("Loongson 3A", stdout);
14425       break;
14426     case AFL_EXT_OCTEON:
14427       fputs ("Cavium Networks Octeon", stdout);
14428       break;
14429     case AFL_EXT_5900:
14430       fputs ("Toshiba R5900", stdout);
14431       break;
14432     case AFL_EXT_4650:
14433       fputs ("MIPS R4650", stdout);
14434       break;
14435     case AFL_EXT_4010:
14436       fputs ("LSI R4010", stdout);
14437       break;
14438     case AFL_EXT_4100:
14439       fputs ("NEC VR4100", stdout);
14440       break;
14441     case AFL_EXT_3900:
14442       fputs ("Toshiba R3900", stdout);
14443       break;
14444     case AFL_EXT_10000:
14445       fputs ("MIPS R10000", stdout);
14446       break;
14447     case AFL_EXT_SB1:
14448       fputs ("Broadcom SB-1", stdout);
14449       break;
14450     case AFL_EXT_4111:
14451       fputs ("NEC VR4111/VR4181", stdout);
14452       break;
14453     case AFL_EXT_4120:
14454       fputs ("NEC VR4120", stdout);
14455       break;
14456     case AFL_EXT_5400:
14457       fputs ("NEC VR5400", stdout);
14458       break;
14459     case AFL_EXT_5500:
14460       fputs ("NEC VR5500", stdout);
14461       break;
14462     case AFL_EXT_LOONGSON_2E:
14463       fputs ("ST Microelectronics Loongson 2E", stdout);
14464       break;
14465     case AFL_EXT_LOONGSON_2F:
14466       fputs ("ST Microelectronics Loongson 2F", stdout);
14467       break;
14468     default:
14469       fprintf (stdout, "%s (%d)", _("Unknown"), isa_ext);
14470     }
14471 }
14472
14473 static int
14474 get_mips_reg_size (int reg_size)
14475 {
14476   return (reg_size == AFL_REG_NONE) ? 0
14477          : (reg_size == AFL_REG_32) ? 32
14478          : (reg_size == AFL_REG_64) ? 64
14479          : (reg_size == AFL_REG_128) ? 128
14480          : -1;
14481 }
14482
14483 static int
14484 process_mips_specific (FILE * file)
14485 {
14486   Elf_Internal_Dyn * entry;
14487   Elf_Internal_Shdr *sect = NULL;
14488   size_t liblist_offset = 0;
14489   size_t liblistno = 0;
14490   size_t conflictsno = 0;
14491   size_t options_offset = 0;
14492   size_t conflicts_offset = 0;
14493   size_t pltrelsz = 0;
14494   size_t pltrel = 0;
14495   bfd_vma pltgot = 0;
14496   bfd_vma mips_pltgot = 0;
14497   bfd_vma jmprel = 0;
14498   bfd_vma local_gotno = 0;
14499   bfd_vma gotsym = 0;
14500   bfd_vma symtabno = 0;
14501
14502   process_attributes (file, NULL, SHT_GNU_ATTRIBUTES, NULL,
14503                       display_mips_gnu_attribute);
14504
14505   sect = find_section (".MIPS.abiflags");
14506
14507   if (sect != NULL)
14508     {
14509       Elf_External_ABIFlags_v0 *abiflags_ext;
14510       Elf_Internal_ABIFlags_v0 abiflags_in;
14511
14512       if (sizeof (Elf_External_ABIFlags_v0) != sect->sh_size)
14513         fputs ("\nCorrupt ABI Flags section.\n", stdout);
14514       else
14515         {
14516           abiflags_ext = get_data (NULL, file, sect->sh_offset, 1,
14517                                    sect->sh_size, _("MIPS ABI Flags section"));
14518           if (abiflags_ext)
14519             {
14520               abiflags_in.version = BYTE_GET (abiflags_ext->version);
14521               abiflags_in.isa_level = BYTE_GET (abiflags_ext->isa_level);
14522               abiflags_in.isa_rev = BYTE_GET (abiflags_ext->isa_rev);
14523               abiflags_in.gpr_size = BYTE_GET (abiflags_ext->gpr_size);
14524               abiflags_in.cpr1_size = BYTE_GET (abiflags_ext->cpr1_size);
14525               abiflags_in.cpr2_size = BYTE_GET (abiflags_ext->cpr2_size);
14526               abiflags_in.fp_abi = BYTE_GET (abiflags_ext->fp_abi);
14527               abiflags_in.isa_ext = BYTE_GET (abiflags_ext->isa_ext);
14528               abiflags_in.ases = BYTE_GET (abiflags_ext->ases);
14529               abiflags_in.flags1 = BYTE_GET (abiflags_ext->flags1);
14530               abiflags_in.flags2 = BYTE_GET (abiflags_ext->flags2);
14531
14532               printf ("\nMIPS ABI Flags Version: %d\n", abiflags_in.version);
14533               printf ("\nISA: MIPS%d", abiflags_in.isa_level);
14534               if (abiflags_in.isa_rev > 1)
14535                 printf ("r%d", abiflags_in.isa_rev);
14536               printf ("\nGPR size: %d",
14537                       get_mips_reg_size (abiflags_in.gpr_size));
14538               printf ("\nCPR1 size: %d",
14539                       get_mips_reg_size (abiflags_in.cpr1_size));
14540               printf ("\nCPR2 size: %d",
14541                       get_mips_reg_size (abiflags_in.cpr2_size));
14542               fputs ("\nFP ABI: ", stdout);
14543               print_mips_fp_abi_value (abiflags_in.fp_abi);
14544               fputs ("ISA Extension: ", stdout);
14545               print_mips_isa_ext (abiflags_in.isa_ext);
14546               fputs ("\nASEs:", stdout);
14547               print_mips_ases (abiflags_in.ases);
14548               printf ("\nFLAGS 1: %8.8lx", abiflags_in.flags1);
14549               printf ("\nFLAGS 2: %8.8lx", abiflags_in.flags2);
14550               fputc ('\n', stdout);
14551               free (abiflags_ext);
14552             }
14553         }
14554     }
14555
14556   /* We have a lot of special sections.  Thanks SGI!  */
14557   if (dynamic_section == NULL)
14558     /* No information available.  */
14559     return 0;
14560
14561   for (entry = dynamic_section;
14562        /* PR 17531 file: 012-50589-0.004.  */
14563        entry < dynamic_section + dynamic_nent && entry->d_tag != DT_NULL;
14564        ++entry)
14565     switch (entry->d_tag)
14566       {
14567       case DT_MIPS_LIBLIST:
14568         liblist_offset
14569           = offset_from_vma (file, entry->d_un.d_val,
14570                              liblistno * sizeof (Elf32_External_Lib));
14571         break;
14572       case DT_MIPS_LIBLISTNO:
14573         liblistno = entry->d_un.d_val;
14574         break;
14575       case DT_MIPS_OPTIONS:
14576         options_offset = offset_from_vma (file, entry->d_un.d_val, 0);
14577         break;
14578       case DT_MIPS_CONFLICT:
14579         conflicts_offset
14580           = offset_from_vma (file, entry->d_un.d_val,
14581                              conflictsno * sizeof (Elf32_External_Conflict));
14582         break;
14583       case DT_MIPS_CONFLICTNO:
14584         conflictsno = entry->d_un.d_val;
14585         break;
14586       case DT_PLTGOT:
14587         pltgot = entry->d_un.d_ptr;
14588         break;
14589       case DT_MIPS_LOCAL_GOTNO:
14590         local_gotno = entry->d_un.d_val;
14591         break;
14592       case DT_MIPS_GOTSYM:
14593         gotsym = entry->d_un.d_val;
14594         break;
14595       case DT_MIPS_SYMTABNO:
14596         symtabno = entry->d_un.d_val;
14597         break;
14598       case DT_MIPS_PLTGOT:
14599         mips_pltgot = entry->d_un.d_ptr;
14600         break;
14601       case DT_PLTREL:
14602         pltrel = entry->d_un.d_val;
14603         break;
14604       case DT_PLTRELSZ:
14605         pltrelsz = entry->d_un.d_val;
14606         break;
14607       case DT_JMPREL:
14608         jmprel = entry->d_un.d_ptr;
14609         break;
14610       default:
14611         break;
14612       }
14613
14614   if (liblist_offset != 0 && liblistno != 0 && do_dynamic)
14615     {
14616       Elf32_External_Lib * elib;
14617       size_t cnt;
14618
14619       elib = (Elf32_External_Lib *) get_data (NULL, file, liblist_offset,
14620                                               liblistno,
14621                                               sizeof (Elf32_External_Lib),
14622                                               _("liblist section data"));
14623       if (elib)
14624         {
14625           printf (_("\nSection '.liblist' contains %lu entries:\n"),
14626                   (unsigned long) liblistno);
14627           fputs (_("     Library              Time Stamp          Checksum   Version Flags\n"),
14628                  stdout);
14629
14630           for (cnt = 0; cnt < liblistno; ++cnt)
14631             {
14632               Elf32_Lib liblist;
14633               time_t atime;
14634               char timebuf[128];
14635               struct tm * tmp;
14636
14637               liblist.l_name = BYTE_GET (elib[cnt].l_name);
14638               atime = BYTE_GET (elib[cnt].l_time_stamp);
14639               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
14640               liblist.l_version = BYTE_GET (elib[cnt].l_version);
14641               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
14642
14643               tmp = gmtime (&atime);
14644               snprintf (timebuf, sizeof (timebuf),
14645                         "%04u-%02u-%02uT%02u:%02u:%02u",
14646                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
14647                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
14648
14649               printf ("%3lu: ", (unsigned long) cnt);
14650               if (VALID_DYNAMIC_NAME (liblist.l_name))
14651                 print_symbol (20, GET_DYNAMIC_NAME (liblist.l_name));
14652               else
14653                 printf (_("<corrupt: %9ld>"), liblist.l_name);
14654               printf (" %s %#10lx %-7ld", timebuf, liblist.l_checksum,
14655                       liblist.l_version);
14656
14657               if (liblist.l_flags == 0)
14658                 puts (_(" NONE"));
14659               else
14660                 {
14661                   static const struct
14662                   {
14663                     const char * name;
14664                     int bit;
14665                   }
14666                   l_flags_vals[] =
14667                   {
14668                     { " EXACT_MATCH", LL_EXACT_MATCH },
14669                     { " IGNORE_INT_VER", LL_IGNORE_INT_VER },
14670                     { " REQUIRE_MINOR", LL_REQUIRE_MINOR },
14671                     { " EXPORTS", LL_EXPORTS },
14672                     { " DELAY_LOAD", LL_DELAY_LOAD },
14673                     { " DELTA", LL_DELTA }
14674                   };
14675                   int flags = liblist.l_flags;
14676                   size_t fcnt;
14677
14678                   for (fcnt = 0; fcnt < ARRAY_SIZE (l_flags_vals); ++fcnt)
14679                     if ((flags & l_flags_vals[fcnt].bit) != 0)
14680                       {
14681                         fputs (l_flags_vals[fcnt].name, stdout);
14682                         flags ^= l_flags_vals[fcnt].bit;
14683                       }
14684                   if (flags != 0)
14685                     printf (" %#x", (unsigned int) flags);
14686
14687                   puts ("");
14688                 }
14689             }
14690
14691           free (elib);
14692         }
14693     }
14694
14695   if (options_offset != 0)
14696     {
14697       Elf_External_Options * eopt;
14698       Elf_Internal_Options * iopt;
14699       Elf_Internal_Options * option;
14700       size_t offset;
14701       int cnt;
14702       sect = section_headers;
14703
14704       /* Find the section header so that we get the size.  */
14705       sect = find_section_by_type (SHT_MIPS_OPTIONS);
14706       /* PR 17533 file: 012-277276-0.004.  */
14707       if (sect == NULL)
14708         {
14709           error (_("No MIPS_OPTIONS header found\n"));
14710           return 0;
14711         }
14712
14713       eopt = (Elf_External_Options *) get_data (NULL, file, options_offset, 1,
14714                                                 sect->sh_size, _("options"));
14715       if (eopt)
14716         {
14717           iopt = (Elf_Internal_Options *)
14718               cmalloc ((sect->sh_size / sizeof (eopt)), sizeof (* iopt));
14719           if (iopt == NULL)
14720             {
14721               error (_("Out of memory allocatinf space for MIPS options\n"));
14722               return 0;
14723             }
14724
14725           offset = cnt = 0;
14726           option = iopt;
14727
14728           while (offset <= sect->sh_size - sizeof (* eopt))
14729             {
14730               Elf_External_Options * eoption;
14731
14732               eoption = (Elf_External_Options *) ((char *) eopt + offset);
14733
14734               option->kind = BYTE_GET (eoption->kind);
14735               option->size = BYTE_GET (eoption->size);
14736               option->section = BYTE_GET (eoption->section);
14737               option->info = BYTE_GET (eoption->info);
14738
14739               /* PR 17531: file: ffa0fa3b.  */
14740               if (option->size < sizeof (* eopt)
14741                   || offset + option->size > sect->sh_size)
14742                 {
14743                   error (_("Invalid size (%u) for MIPS option\n"), option->size);
14744                   return 0;
14745                 }
14746               offset += option->size;
14747
14748               ++option;
14749               ++cnt;
14750             }
14751
14752           printf (_("\nSection '%s' contains %d entries:\n"),
14753                   printable_section_name (sect), cnt);
14754
14755           option = iopt;
14756           offset = 0;
14757
14758           while (cnt-- > 0)
14759             {
14760               size_t len;
14761
14762               switch (option->kind)
14763                 {
14764                 case ODK_NULL:
14765                   /* This shouldn't happen.  */
14766                   printf (" NULL       %d %lx", option->section, option->info);
14767                   break;
14768                 case ODK_REGINFO:
14769                   printf (" REGINFO    ");
14770                   if (elf_header.e_machine == EM_MIPS)
14771                     {
14772                       /* 32bit form.  */
14773                       Elf32_External_RegInfo * ereg;
14774                       Elf32_RegInfo reginfo;
14775
14776                       ereg = (Elf32_External_RegInfo *) (option + 1);
14777                       reginfo.ri_gprmask = BYTE_GET (ereg->ri_gprmask);
14778                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14779                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14780                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14781                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14782                       reginfo.ri_gp_value = BYTE_GET (ereg->ri_gp_value);
14783
14784                       printf ("GPR %08lx  GP 0x%lx\n",
14785                               reginfo.ri_gprmask,
14786                               (unsigned long) reginfo.ri_gp_value);
14787                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
14788                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14789                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14790                     }
14791                   else
14792                     {
14793                       /* 64 bit form.  */
14794                       Elf64_External_RegInfo * ereg;
14795                       Elf64_Internal_RegInfo reginfo;
14796
14797                       ereg = (Elf64_External_RegInfo *) (option + 1);
14798                       reginfo.ri_gprmask    = BYTE_GET (ereg->ri_gprmask);
14799                       reginfo.ri_cprmask[0] = BYTE_GET (ereg->ri_cprmask[0]);
14800                       reginfo.ri_cprmask[1] = BYTE_GET (ereg->ri_cprmask[1]);
14801                       reginfo.ri_cprmask[2] = BYTE_GET (ereg->ri_cprmask[2]);
14802                       reginfo.ri_cprmask[3] = BYTE_GET (ereg->ri_cprmask[3]);
14803                       reginfo.ri_gp_value   = BYTE_GET (ereg->ri_gp_value);
14804
14805                       printf ("GPR %08lx  GP 0x",
14806                               reginfo.ri_gprmask);
14807                       printf_vma (reginfo.ri_gp_value);
14808                       printf ("\n");
14809
14810                       printf ("            CPR0 %08lx  CPR1 %08lx  CPR2 %08lx  CPR3 %08lx\n",
14811                               reginfo.ri_cprmask[0], reginfo.ri_cprmask[1],
14812                               reginfo.ri_cprmask[2], reginfo.ri_cprmask[3]);
14813                     }
14814                   ++option;
14815                   continue;
14816                 case ODK_EXCEPTIONS:
14817                   fputs (" EXCEPTIONS fpe_min(", stdout);
14818                   process_mips_fpe_exception (option->info & OEX_FPU_MIN);
14819                   fputs (") fpe_max(", stdout);
14820                   process_mips_fpe_exception ((option->info & OEX_FPU_MAX) >> 8);
14821                   fputs (")", stdout);
14822
14823                   if (option->info & OEX_PAGE0)
14824                     fputs (" PAGE0", stdout);
14825                   if (option->info & OEX_SMM)
14826                     fputs (" SMM", stdout);
14827                   if (option->info & OEX_FPDBUG)
14828                     fputs (" FPDBUG", stdout);
14829                   if (option->info & OEX_DISMISS)
14830                     fputs (" DISMISS", stdout);
14831                   break;
14832                 case ODK_PAD:
14833                   fputs (" PAD       ", stdout);
14834                   if (option->info & OPAD_PREFIX)
14835                     fputs (" PREFIX", stdout);
14836                   if (option->info & OPAD_POSTFIX)
14837                     fputs (" POSTFIX", stdout);
14838                   if (option->info & OPAD_SYMBOL)
14839                     fputs (" SYMBOL", stdout);
14840                   break;
14841                 case ODK_HWPATCH:
14842                   fputs (" HWPATCH   ", stdout);
14843                   if (option->info & OHW_R4KEOP)
14844                     fputs (" R4KEOP", stdout);
14845                   if (option->info & OHW_R8KPFETCH)
14846                     fputs (" R8KPFETCH", stdout);
14847                   if (option->info & OHW_R5KEOP)
14848                     fputs (" R5KEOP", stdout);
14849                   if (option->info & OHW_R5KCVTL)
14850                     fputs (" R5KCVTL", stdout);
14851                   break;
14852                 case ODK_FILL:
14853                   fputs (" FILL       ", stdout);
14854                   /* XXX Print content of info word?  */
14855                   break;
14856                 case ODK_TAGS:
14857                   fputs (" TAGS       ", stdout);
14858                   /* XXX Print content of info word?  */
14859                   break;
14860                 case ODK_HWAND:
14861                   fputs (" HWAND     ", stdout);
14862                   if (option->info & OHWA0_R4KEOP_CHECKED)
14863                     fputs (" R4KEOP_CHECKED", stdout);
14864                   if (option->info & OHWA0_R4KEOP_CLEAN)
14865                     fputs (" R4KEOP_CLEAN", stdout);
14866                   break;
14867                 case ODK_HWOR:
14868                   fputs (" HWOR      ", stdout);
14869                   if (option->info & OHWA0_R4KEOP_CHECKED)
14870                     fputs (" R4KEOP_CHECKED", stdout);
14871                   if (option->info & OHWA0_R4KEOP_CLEAN)
14872                     fputs (" R4KEOP_CLEAN", stdout);
14873                   break;
14874                 case ODK_GP_GROUP:
14875                   printf (" GP_GROUP  %#06lx  self-contained %#06lx",
14876                           option->info & OGP_GROUP,
14877                           (option->info & OGP_SELF) >> 16);
14878                   break;
14879                 case ODK_IDENT:
14880                   printf (" IDENT     %#06lx  self-contained %#06lx",
14881                           option->info & OGP_GROUP,
14882                           (option->info & OGP_SELF) >> 16);
14883                   break;
14884                 default:
14885                   /* This shouldn't happen.  */
14886                   printf (" %3d ???     %d %lx",
14887                           option->kind, option->section, option->info);
14888                   break;
14889                 }
14890
14891               len = sizeof (* eopt);
14892               while (len < option->size)
14893                 {
14894                   unsigned char datum = * ((unsigned char *) eopt + offset + len);
14895
14896                   if (ISPRINT (datum))
14897                     printf ("%c", datum);
14898                   else
14899                     printf ("\\%03o", datum);
14900                   len ++;
14901                 }
14902               fputs ("\n", stdout);
14903
14904               offset += option->size;
14905               ++option;
14906             }
14907
14908           free (eopt);
14909         }
14910     }
14911
14912   if (conflicts_offset != 0 && conflictsno != 0)
14913     {
14914       Elf32_Conflict * iconf;
14915       size_t cnt;
14916
14917       if (dynamic_symbols == NULL)
14918         {
14919           error (_("conflict list found without a dynamic symbol table\n"));
14920           return 0;
14921         }
14922
14923       iconf = (Elf32_Conflict *) cmalloc (conflictsno, sizeof (* iconf));
14924       if (iconf == NULL)
14925         {
14926           error (_("Out of memory allocating space for dynamic conflicts\n"));
14927           return 0;
14928         }
14929
14930       if (is_32bit_elf)
14931         {
14932           Elf32_External_Conflict * econf32;
14933
14934           econf32 = (Elf32_External_Conflict *)
14935               get_data (NULL, file, conflicts_offset, conflictsno,
14936                         sizeof (* econf32), _("conflict"));
14937           if (!econf32)
14938             return 0;
14939
14940           for (cnt = 0; cnt < conflictsno; ++cnt)
14941             iconf[cnt] = BYTE_GET (econf32[cnt]);
14942
14943           free (econf32);
14944         }
14945       else
14946         {
14947           Elf64_External_Conflict * econf64;
14948
14949           econf64 = (Elf64_External_Conflict *)
14950               get_data (NULL, file, conflicts_offset, conflictsno,
14951                         sizeof (* econf64), _("conflict"));
14952           if (!econf64)
14953             return 0;
14954
14955           for (cnt = 0; cnt < conflictsno; ++cnt)
14956             iconf[cnt] = BYTE_GET (econf64[cnt]);
14957
14958           free (econf64);
14959         }
14960
14961       printf (_("\nSection '.conflict' contains %lu entries:\n"),
14962               (unsigned long) conflictsno);
14963       puts (_("  Num:    Index       Value  Name"));
14964
14965       for (cnt = 0; cnt < conflictsno; ++cnt)
14966         {
14967           printf ("%5lu: %8lu  ", (unsigned long) cnt, iconf[cnt]);
14968
14969           if (iconf[cnt] >= num_dynamic_syms)
14970             printf (_("<corrupt symbol index>"));
14971           else
14972             {
14973               Elf_Internal_Sym * psym;
14974
14975               psym = & dynamic_symbols[iconf[cnt]];
14976               print_vma (psym->st_value, FULL_HEX);
14977               putchar (' ');
14978               if (VALID_DYNAMIC_NAME (psym->st_name))
14979                 print_symbol (25, GET_DYNAMIC_NAME (psym->st_name));
14980               else
14981                 printf (_("<corrupt: %14ld>"), psym->st_name);
14982             }
14983           putchar ('\n');
14984         }
14985
14986       free (iconf);
14987     }
14988
14989   if (pltgot != 0 && local_gotno != 0)
14990     {
14991       bfd_vma ent, local_end, global_end;
14992       size_t i, offset;
14993       unsigned char * data;
14994       unsigned char * data_end;
14995       int addr_size;
14996
14997       ent = pltgot;
14998       addr_size = (is_32bit_elf ? 4 : 8);
14999       local_end = pltgot + local_gotno * addr_size;
15000
15001       /* PR binutils/17533 file: 012-111227-0.004  */
15002       if (symtabno < gotsym)
15003         {
15004           error (_("The GOT symbol offset (%lu) is greater than the symbol table size (%lu)\n"),
15005                  (unsigned long) gotsym, (unsigned long) symtabno);
15006           return 0;
15007         }
15008
15009       global_end = local_end + (symtabno - gotsym) * addr_size;
15010       /* PR 17531: file: 54c91a34.  */
15011       if (global_end < local_end)
15012         {
15013           error (_("Too many GOT symbols: %lu\n"), (unsigned long) symtabno);
15014           return 0;
15015         }
15016
15017       offset = offset_from_vma (file, pltgot, global_end - pltgot);
15018       data = (unsigned char *) get_data (NULL, file, offset,
15019                                          global_end - pltgot, 1,
15020                                          _("Global Offset Table data"));
15021       if (data == NULL)
15022         return 0;
15023       data_end = data + (global_end - pltgot);
15024
15025       printf (_("\nPrimary GOT:\n"));
15026       printf (_(" Canonical gp value: "));
15027       print_vma (pltgot + 0x7ff0, LONG_HEX);
15028       printf ("\n\n");
15029
15030       printf (_(" Reserved entries:\n"));
15031       printf (_("  %*s %10s %*s Purpose\n"),
15032               addr_size * 2, _("Address"), _("Access"),
15033               addr_size * 2, _("Initial"));
15034       ent = print_mips_got_entry (data, pltgot, ent, data_end);
15035       printf (_(" Lazy resolver\n"));
15036       if (ent == (bfd_vma) -1)
15037         goto got_print_fail;
15038       if (data
15039           && (byte_get (data + ent - pltgot, addr_size)
15040               >> (addr_size * 8 - 1)) != 0)
15041         {
15042           ent = print_mips_got_entry (data, pltgot, ent, data_end);
15043           printf (_(" Module pointer (GNU extension)\n"));
15044           if (ent == (bfd_vma) -1)
15045             goto got_print_fail;
15046         }
15047       printf ("\n");
15048
15049       if (ent < local_end)
15050         {
15051           printf (_(" Local entries:\n"));
15052           printf ("  %*s %10s %*s\n",
15053                   addr_size * 2, _("Address"), _("Access"),
15054                   addr_size * 2, _("Initial"));
15055           while (ent < local_end)
15056             {
15057               ent = print_mips_got_entry (data, pltgot, ent, data_end);
15058               printf ("\n");
15059               if (ent == (bfd_vma) -1)
15060                 goto got_print_fail;
15061             }
15062           printf ("\n");
15063         }
15064
15065       if (gotsym < symtabno)
15066         {
15067           int sym_width;
15068
15069           printf (_(" Global entries:\n"));
15070           printf ("  %*s %10s %*s %*s %-7s %3s %s\n",
15071                   addr_size * 2, _("Address"),
15072                   _("Access"),
15073                   addr_size * 2, _("Initial"),
15074                   addr_size * 2, _("Sym.Val."),
15075                   _("Type"),
15076                   /* Note for translators: "Ndx" = abbreviated form of "Index".  */
15077                   _("Ndx"), _("Name"));
15078
15079           sym_width = (is_32bit_elf ? 80 : 160) - 28 - addr_size * 6 - 1;
15080
15081           for (i = gotsym; i < symtabno; i++)
15082             {
15083               ent = print_mips_got_entry (data, pltgot, ent, data_end);
15084               printf (" ");
15085
15086               if (dynamic_symbols == NULL)
15087                 printf (_("<no dynamic symbols>"));
15088               else if (i < num_dynamic_syms)
15089                 {
15090                   Elf_Internal_Sym * psym = dynamic_symbols + i;
15091
15092                   print_vma (psym->st_value, LONG_HEX);
15093                   printf (" %-7s %3s ",
15094                           get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15095                           get_symbol_index_type (psym->st_shndx));
15096
15097                   if (VALID_DYNAMIC_NAME (psym->st_name))
15098                     print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15099                   else
15100                     printf (_("<corrupt: %14ld>"), psym->st_name);
15101                 }
15102               else
15103                 printf (_("<symbol index %lu exceeds number of dynamic symbols>"),
15104                         (unsigned long) i);
15105
15106               printf ("\n");
15107               if (ent == (bfd_vma) -1)
15108                 break;
15109             }
15110           printf ("\n");
15111         }
15112
15113     got_print_fail:
15114       if (data)
15115         free (data);
15116     }
15117
15118   if (mips_pltgot != 0 && jmprel != 0 && pltrel != 0 && pltrelsz != 0)
15119     {
15120       bfd_vma ent, end;
15121       size_t offset, rel_offset;
15122       unsigned long count, i;
15123       unsigned char * data;
15124       int addr_size, sym_width;
15125       Elf_Internal_Rela * rels;
15126
15127       rel_offset = offset_from_vma (file, jmprel, pltrelsz);
15128       if (pltrel == DT_RELA)
15129         {
15130           if (!slurp_rela_relocs (file, rel_offset, pltrelsz, &rels, &count))
15131             return 0;
15132         }
15133       else
15134         {
15135           if (!slurp_rel_relocs (file, rel_offset, pltrelsz, &rels, &count))
15136             return 0;
15137         }
15138
15139       ent = mips_pltgot;
15140       addr_size = (is_32bit_elf ? 4 : 8);
15141       end = mips_pltgot + (2 + count) * addr_size;
15142
15143       offset = offset_from_vma (file, mips_pltgot, end - mips_pltgot);
15144       data = (unsigned char *) get_data (NULL, file, offset, end - mips_pltgot,
15145                                          1, _("Procedure Linkage Table data"));
15146       if (data == NULL)
15147         return 0;
15148
15149       printf ("\nPLT GOT:\n\n");
15150       printf (_(" Reserved entries:\n"));
15151       printf (_("  %*s %*s Purpose\n"),
15152               addr_size * 2, _("Address"), addr_size * 2, _("Initial"));
15153       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15154       printf (_(" PLT lazy resolver\n"));
15155       ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15156       printf (_(" Module pointer\n"));
15157       printf ("\n");
15158
15159       printf (_(" Entries:\n"));
15160       printf ("  %*s %*s %*s %-7s %3s %s\n",
15161               addr_size * 2, _("Address"),
15162               addr_size * 2, _("Initial"),
15163               addr_size * 2, _("Sym.Val."), _("Type"), _("Ndx"), _("Name"));
15164       sym_width = (is_32bit_elf ? 80 : 160) - 17 - addr_size * 6 - 1;
15165       for (i = 0; i < count; i++)
15166         {
15167           unsigned long idx = get_reloc_symindex (rels[i].r_info);
15168
15169           ent = print_mips_pltgot_entry (data, mips_pltgot, ent);
15170           printf (" ");
15171
15172           if (idx >= num_dynamic_syms)
15173             printf (_("<corrupt symbol index: %lu>"), idx);
15174           else
15175             {
15176               Elf_Internal_Sym * psym = dynamic_symbols + idx;
15177
15178               print_vma (psym->st_value, LONG_HEX);
15179               printf (" %-7s %3s ",
15180                       get_symbol_type (ELF_ST_TYPE (psym->st_info)),
15181                       get_symbol_index_type (psym->st_shndx));
15182               if (VALID_DYNAMIC_NAME (psym->st_name))
15183                 print_symbol (sym_width, GET_DYNAMIC_NAME (psym->st_name));
15184               else
15185                 printf (_("<corrupt: %14ld>"), psym->st_name);
15186             }
15187           printf ("\n");
15188         }
15189       printf ("\n");
15190
15191       if (data)
15192         free (data);
15193       free (rels);
15194     }
15195
15196   return 1;
15197 }
15198
15199 static int
15200 process_nds32_specific (FILE * file)
15201 {
15202   Elf_Internal_Shdr *sect = NULL;
15203
15204   sect = find_section (".nds32_e_flags");
15205   if (sect != NULL)
15206     {
15207       unsigned int *flag;
15208
15209       printf ("\nNDS32 elf flags section:\n");
15210       flag = get_data (NULL, file, sect->sh_offset, 1,
15211                        sect->sh_size, _("NDS32 elf flags section"));
15212
15213       switch ((*flag) & 0x3)
15214         {
15215         case 0:
15216           printf ("(VEC_SIZE):\tNo entry.\n");
15217           break;
15218         case 1:
15219           printf ("(VEC_SIZE):\t4 bytes\n");
15220           break;
15221         case 2:
15222           printf ("(VEC_SIZE):\t16 bytes\n");
15223           break;
15224         case 3:
15225           printf ("(VEC_SIZE):\treserved\n");
15226           break;
15227         }
15228     }
15229
15230   return TRUE;
15231 }
15232
15233 static int
15234 process_gnu_liblist (FILE * file)
15235 {
15236   Elf_Internal_Shdr * section;
15237   Elf_Internal_Shdr * string_sec;
15238   Elf32_External_Lib * elib;
15239   char * strtab;
15240   size_t strtab_size;
15241   size_t cnt;
15242   unsigned i;
15243
15244   if (! do_arch)
15245     return 0;
15246
15247   for (i = 0, section = section_headers;
15248        i < elf_header.e_shnum;
15249        i++, section++)
15250     {
15251       switch (section->sh_type)
15252         {
15253         case SHT_GNU_LIBLIST:
15254           if (section->sh_link >= elf_header.e_shnum)
15255             break;
15256
15257           elib = (Elf32_External_Lib *)
15258               get_data (NULL, file, section->sh_offset, 1, section->sh_size,
15259                         _("liblist section data"));
15260
15261           if (elib == NULL)
15262             break;
15263           string_sec = section_headers + section->sh_link;
15264
15265           strtab = (char *) get_data (NULL, file, string_sec->sh_offset, 1,
15266                                       string_sec->sh_size,
15267                                       _("liblist string table"));
15268           if (strtab == NULL
15269               || section->sh_entsize != sizeof (Elf32_External_Lib))
15270             {
15271               free (elib);
15272               free (strtab);
15273               break;
15274             }
15275           strtab_size = string_sec->sh_size;
15276
15277           printf (_("\nLibrary list section '%s' contains %lu entries:\n"),
15278                   printable_section_name (section),
15279                   (unsigned long) (section->sh_size / sizeof (Elf32_External_Lib)));
15280
15281           puts (_("     Library              Time Stamp          Checksum   Version Flags"));
15282
15283           for (cnt = 0; cnt < section->sh_size / sizeof (Elf32_External_Lib);
15284                ++cnt)
15285             {
15286               Elf32_Lib liblist;
15287               time_t atime;
15288               char timebuf[128];
15289               struct tm * tmp;
15290
15291               liblist.l_name = BYTE_GET (elib[cnt].l_name);
15292               atime = BYTE_GET (elib[cnt].l_time_stamp);
15293               liblist.l_checksum = BYTE_GET (elib[cnt].l_checksum);
15294               liblist.l_version = BYTE_GET (elib[cnt].l_version);
15295               liblist.l_flags = BYTE_GET (elib[cnt].l_flags);
15296
15297               tmp = gmtime (&atime);
15298               snprintf (timebuf, sizeof (timebuf),
15299                         "%04u-%02u-%02uT%02u:%02u:%02u",
15300                         tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday,
15301                         tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
15302
15303               printf ("%3lu: ", (unsigned long) cnt);
15304               if (do_wide)
15305                 printf ("%-20s", liblist.l_name < strtab_size
15306                         ? strtab + liblist.l_name : _("<corrupt>"));
15307               else
15308                 printf ("%-20.20s", liblist.l_name < strtab_size
15309                         ? strtab + liblist.l_name : _("<corrupt>"));
15310               printf (" %s %#010lx %-7ld %-7ld\n", timebuf, liblist.l_checksum,
15311                       liblist.l_version, liblist.l_flags);
15312             }
15313
15314           free (elib);
15315           free (strtab);
15316         }
15317     }
15318
15319   return 1;
15320 }
15321
15322 static const char *
15323 get_note_type (unsigned e_type)
15324 {
15325   static char buff[64];
15326
15327   if (elf_header.e_type == ET_CORE)
15328     switch (e_type)
15329       {
15330       case NT_AUXV:
15331         return _("NT_AUXV (auxiliary vector)");
15332       case NT_PRSTATUS:
15333         return _("NT_PRSTATUS (prstatus structure)");
15334       case NT_FPREGSET:
15335         return _("NT_FPREGSET (floating point registers)");
15336       case NT_PRPSINFO:
15337         return _("NT_PRPSINFO (prpsinfo structure)");
15338       case NT_TASKSTRUCT:
15339         return _("NT_TASKSTRUCT (task structure)");
15340       case NT_PRXFPREG:
15341         return _("NT_PRXFPREG (user_xfpregs structure)");
15342       case NT_PPC_VMX:
15343         return _("NT_PPC_VMX (ppc Altivec registers)");
15344       case NT_PPC_VSX:
15345         return _("NT_PPC_VSX (ppc VSX registers)");
15346       case NT_386_TLS:
15347         return _("NT_386_TLS (x86 TLS information)");
15348       case NT_386_IOPERM:
15349         return _("NT_386_IOPERM (x86 I/O permissions)");
15350       case NT_X86_XSTATE:
15351         return _("NT_X86_XSTATE (x86 XSAVE extended state)");
15352       case NT_S390_HIGH_GPRS:
15353         return _("NT_S390_HIGH_GPRS (s390 upper register halves)");
15354       case NT_S390_TIMER:
15355         return _("NT_S390_TIMER (s390 timer register)");
15356       case NT_S390_TODCMP:
15357         return _("NT_S390_TODCMP (s390 TOD comparator register)");
15358       case NT_S390_TODPREG:
15359         return _("NT_S390_TODPREG (s390 TOD programmable register)");
15360       case NT_S390_CTRS:
15361         return _("NT_S390_CTRS (s390 control registers)");
15362       case NT_S390_PREFIX:
15363         return _("NT_S390_PREFIX (s390 prefix register)");
15364       case NT_S390_LAST_BREAK:
15365         return _("NT_S390_LAST_BREAK (s390 last breaking event address)");
15366       case NT_S390_SYSTEM_CALL:
15367         return _("NT_S390_SYSTEM_CALL (s390 system call restart data)");
15368       case NT_S390_TDB:
15369         return _("NT_S390_TDB (s390 transaction diagnostic block)");
15370       case NT_S390_VXRS_LOW:
15371         return _("NT_S390_VXRS_LOW (s390 vector registers 0-15 upper half)");
15372       case NT_S390_VXRS_HIGH:
15373         return _("NT_S390_VXRS_HIGH (s390 vector registers 16-31)");
15374       case NT_ARM_VFP:
15375         return _("NT_ARM_VFP (arm VFP registers)");
15376       case NT_ARM_TLS:
15377         return _("NT_ARM_TLS (AArch TLS registers)");
15378       case NT_ARM_HW_BREAK:
15379         return _("NT_ARM_HW_BREAK (AArch hardware breakpoint registers)");
15380       case NT_ARM_HW_WATCH:
15381         return _("NT_ARM_HW_WATCH (AArch hardware watchpoint registers)");
15382       case NT_PSTATUS:
15383         return _("NT_PSTATUS (pstatus structure)");
15384       case NT_FPREGS:
15385         return _("NT_FPREGS (floating point registers)");
15386       case NT_PSINFO:
15387         return _("NT_PSINFO (psinfo structure)");
15388       case NT_LWPSTATUS:
15389         return _("NT_LWPSTATUS (lwpstatus_t structure)");
15390       case NT_LWPSINFO:
15391         return _("NT_LWPSINFO (lwpsinfo_t structure)");
15392       case NT_WIN32PSTATUS:
15393         return _("NT_WIN32PSTATUS (win32_pstatus structure)");
15394       case NT_SIGINFO:
15395         return _("NT_SIGINFO (siginfo_t data)");
15396       case NT_FILE:
15397         return _("NT_FILE (mapped files)");
15398       default:
15399         break;
15400       }
15401   else
15402     switch (e_type)
15403       {
15404       case NT_VERSION:
15405         return _("NT_VERSION (version)");
15406       case NT_ARCH:
15407         return _("NT_ARCH (architecture)");
15408       default:
15409         break;
15410       }
15411
15412   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15413   return buff;
15414 }
15415
15416 static int
15417 print_core_note (Elf_Internal_Note *pnote)
15418 {
15419   unsigned int addr_size = is_32bit_elf ? 4 : 8;
15420   bfd_vma count, page_size;
15421   unsigned char *descdata, *filenames, *descend;
15422
15423   if (pnote->type != NT_FILE)
15424     return 1;
15425
15426 #ifndef BFD64
15427   if (!is_32bit_elf)
15428     {
15429       printf (_("    Cannot decode 64-bit note in 32-bit build\n"));
15430       /* Still "successful".  */
15431       return 1;
15432     }
15433 #endif
15434
15435   if (pnote->descsz < 2 * addr_size)
15436     {
15437       printf (_("    Malformed note - too short for header\n"));
15438       return 0;
15439     }
15440
15441   descdata = (unsigned char *) pnote->descdata;
15442   descend = descdata + pnote->descsz;
15443
15444   if (descdata[pnote->descsz - 1] != '\0')
15445     {
15446       printf (_("    Malformed note - does not end with \\0\n"));
15447       return 0;
15448     }
15449
15450   count = byte_get (descdata, addr_size);
15451   descdata += addr_size;
15452
15453   page_size = byte_get (descdata, addr_size);
15454   descdata += addr_size;
15455
15456   if (pnote->descsz < 2 * addr_size + count * 3 * addr_size)
15457     {
15458       printf (_("    Malformed note - too short for supplied file count\n"));
15459       return 0;
15460     }
15461
15462   printf (_("    Page size: "));
15463   print_vma (page_size, DEC);
15464   printf ("\n");
15465
15466   printf (_("    %*s%*s%*s\n"),
15467           (int) (2 + 2 * addr_size), _("Start"),
15468           (int) (4 + 2 * addr_size), _("End"),
15469           (int) (4 + 2 * addr_size), _("Page Offset"));
15470   filenames = descdata + count * 3 * addr_size;
15471   while (count-- > 0)
15472     {
15473       bfd_vma start, end, file_ofs;
15474
15475       if (filenames == descend)
15476         {
15477           printf (_("    Malformed note - filenames end too early\n"));
15478           return 0;
15479         }
15480
15481       start = byte_get (descdata, addr_size);
15482       descdata += addr_size;
15483       end = byte_get (descdata, addr_size);
15484       descdata += addr_size;
15485       file_ofs = byte_get (descdata, addr_size);
15486       descdata += addr_size;
15487
15488       printf ("    ");
15489       print_vma (start, FULL_HEX);
15490       printf ("  ");
15491       print_vma (end, FULL_HEX);
15492       printf ("  ");
15493       print_vma (file_ofs, FULL_HEX);
15494       printf ("\n        %s\n", filenames);
15495
15496       filenames += 1 + strlen ((char *) filenames);
15497     }
15498
15499   return 1;
15500 }
15501
15502 static const char *
15503 get_gnu_elf_note_type (unsigned e_type)
15504 {
15505   static char buff[64];
15506
15507   switch (e_type)
15508     {
15509     case NT_GNU_ABI_TAG:
15510       return _("NT_GNU_ABI_TAG (ABI version tag)");
15511     case NT_GNU_HWCAP:
15512       return _("NT_GNU_HWCAP (DSO-supplied software HWCAP info)");
15513     case NT_GNU_BUILD_ID:
15514       return _("NT_GNU_BUILD_ID (unique build ID bitstring)");
15515     case NT_GNU_GOLD_VERSION:
15516       return _("NT_GNU_GOLD_VERSION (gold version)");
15517     default:
15518       break;
15519     }
15520
15521   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15522   return buff;
15523 }
15524
15525 static int
15526 print_gnu_note (Elf_Internal_Note *pnote)
15527 {
15528   switch (pnote->type)
15529     {
15530     case NT_GNU_BUILD_ID:
15531       {
15532         unsigned long i;
15533
15534         printf (_("    Build ID: "));
15535         for (i = 0; i < pnote->descsz; ++i)
15536           printf ("%02x", pnote->descdata[i] & 0xff);
15537         printf ("\n");
15538       }
15539       break;
15540
15541     case NT_GNU_ABI_TAG:
15542       {
15543         unsigned long os, major, minor, subminor;
15544         const char *osname;
15545
15546         /* PR 17531: file: 030-599401-0.004.  */
15547         if (pnote->descsz < 16)
15548           {
15549             printf (_("    <corrupt GNU_ABI_TAG>\n"));
15550             break;
15551           }
15552
15553         os = byte_get ((unsigned char *) pnote->descdata, 4);
15554         major = byte_get ((unsigned char *) pnote->descdata + 4, 4);
15555         minor = byte_get ((unsigned char *) pnote->descdata + 8, 4);
15556         subminor = byte_get ((unsigned char *) pnote->descdata + 12, 4);
15557
15558         switch (os)
15559           {
15560           case GNU_ABI_TAG_LINUX:
15561             osname = "Linux";
15562             break;
15563           case GNU_ABI_TAG_HURD:
15564             osname = "Hurd";
15565             break;
15566           case GNU_ABI_TAG_SOLARIS:
15567             osname = "Solaris";
15568             break;
15569           case GNU_ABI_TAG_FREEBSD:
15570             osname = "FreeBSD";
15571             break;
15572           case GNU_ABI_TAG_NETBSD:
15573             osname = "NetBSD";
15574             break;
15575           case GNU_ABI_TAG_SYLLABLE:
15576             osname = "Syllable";
15577             break;
15578           case GNU_ABI_TAG_NACL:
15579             osname = "NaCl";
15580             break;
15581           default:
15582             osname = "Unknown";
15583             break;
15584           }
15585
15586         printf (_("    OS: %s, ABI: %ld.%ld.%ld\n"), osname,
15587                 major, minor, subminor);
15588       }
15589       break;
15590
15591     case NT_GNU_GOLD_VERSION:
15592       {
15593         unsigned long i;
15594
15595         printf (_("    Version: "));
15596         for (i = 0; i < pnote->descsz && pnote->descdata[i] != '\0'; ++i)
15597           printf ("%c", pnote->descdata[i]);
15598         printf ("\n");
15599       }
15600       break;
15601     }
15602
15603   return 1;
15604 }
15605
15606 static const char *
15607 get_v850_elf_note_type (enum v850_notes n_type)
15608 {
15609   static char buff[64];
15610
15611   switch (n_type)
15612     {
15613     case V850_NOTE_ALIGNMENT:  return _("Alignment of 8-byte objects");
15614     case V850_NOTE_DATA_SIZE:  return _("Sizeof double and long double");
15615     case V850_NOTE_FPU_INFO:   return _("Type of FPU support needed");
15616     case V850_NOTE_SIMD_INFO:  return _("Use of SIMD instructions");
15617     case V850_NOTE_CACHE_INFO: return _("Use of cache");
15618     case V850_NOTE_MMU_INFO:   return _("Use of MMU");
15619     default:
15620       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), n_type);
15621       return buff;
15622     }
15623 }
15624
15625 static int
15626 print_v850_note (Elf_Internal_Note * pnote)
15627 {
15628   unsigned int val;
15629
15630   if (pnote->descsz != 4)
15631     return 0;
15632   val = byte_get ((unsigned char *) pnote->descdata, pnote->descsz);
15633
15634   if (val == 0)
15635     {
15636       printf (_("not set\n"));
15637       return 1;
15638     }
15639
15640   switch (pnote->type)
15641     {
15642     case V850_NOTE_ALIGNMENT:
15643       switch (val)
15644         {
15645         case EF_RH850_DATA_ALIGN4: printf (_("4-byte\n")); return 1;
15646         case EF_RH850_DATA_ALIGN8: printf (_("8-byte\n")); return 1;
15647         }
15648       break;
15649
15650     case V850_NOTE_DATA_SIZE:
15651       switch (val)
15652         {
15653         case EF_RH850_DOUBLE32: printf (_("4-bytes\n")); return 1;
15654         case EF_RH850_DOUBLE64: printf (_("8-bytes\n")); return 1;
15655         }
15656       break;
15657
15658     case V850_NOTE_FPU_INFO:
15659       switch (val)
15660         {
15661         case EF_RH850_FPU20: printf (_("FPU-2.0\n")); return 1;
15662         case EF_RH850_FPU30: printf (_("FPU-3.0\n")); return 1;
15663         }
15664       break;
15665
15666     case V850_NOTE_MMU_INFO:
15667     case V850_NOTE_CACHE_INFO:
15668     case V850_NOTE_SIMD_INFO:
15669       if (val == EF_RH850_SIMD)
15670         {
15671           printf (_("yes\n"));
15672           return 1;
15673         }
15674       break;
15675
15676     default:
15677       /* An 'unknown note type' message will already have been displayed.  */
15678       break;
15679     }
15680
15681   printf (_("unknown value: %x\n"), val);
15682   return 0;
15683 }
15684
15685 static int 
15686 process_netbsd_elf_note (Elf_Internal_Note * pnote)
15687 {
15688   unsigned int version;
15689
15690   switch (pnote->type)
15691     {
15692     case NT_NETBSD_IDENT:
15693       version = byte_get ((unsigned char *) pnote->descdata, sizeof (version));
15694       if ((version / 10000) % 100)
15695         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u%s%c)\n", pnote->descsz,
15696                 version, version / 100000000, (version / 1000000) % 100,
15697                 (version / 10000) % 100 > 26 ? "Z" : "",
15698                 'A' + (version / 10000) % 26); 
15699       else
15700         printf ("  NetBSD\t\t0x%08lx\tIDENT %u (%u.%u.%u)\n", pnote->descsz,
15701                 version, version / 100000000, (version / 1000000) % 100,
15702                 (version / 100) % 100); 
15703       return 1;
15704
15705     case NT_NETBSD_MARCH:
15706       printf ("  NetBSD\t0x%08lx\tMARCH <%s>\n", pnote->descsz,
15707               pnote->descdata);
15708       return 1;
15709
15710     default:
15711       break;
15712     }
15713
15714   printf ("  NetBSD\t0x%08lx\tUnknown note type: (0x%08lx)\n", pnote->descsz,
15715           pnote->type);
15716   return 1;
15717 }
15718
15719 static const char *
15720 get_freebsd_elfcore_note_type (unsigned e_type)
15721 {
15722   switch (e_type)
15723     {
15724     case NT_FREEBSD_THRMISC:
15725       return _("NT_THRMISC (thrmisc structure)");
15726     case NT_FREEBSD_PROCSTAT_PROC:
15727       return _("NT_PROCSTAT_PROC (proc data)");
15728     case NT_FREEBSD_PROCSTAT_FILES:
15729       return _("NT_PROCSTAT_FILES (files data)");
15730     case NT_FREEBSD_PROCSTAT_VMMAP:
15731       return _("NT_PROCSTAT_VMMAP (vmmap data)");
15732     case NT_FREEBSD_PROCSTAT_GROUPS:
15733       return _("NT_PROCSTAT_GROUPS (groups data)");
15734     case NT_FREEBSD_PROCSTAT_UMASK:
15735       return _("NT_PROCSTAT_UMASK (umask data)");
15736     case NT_FREEBSD_PROCSTAT_RLIMIT:
15737       return _("NT_PROCSTAT_RLIMIT (rlimit data)");
15738     case NT_FREEBSD_PROCSTAT_OSREL:
15739       return _("NT_PROCSTAT_OSREL (osreldate data)");
15740     case NT_FREEBSD_PROCSTAT_PSSTRINGS:
15741       return _("NT_PROCSTAT_PSSTRINGS (ps_strings data)");
15742     case NT_FREEBSD_PROCSTAT_AUXV:
15743       return _("NT_PROCSTAT_AUXV (auxv data)");
15744     }
15745   return get_note_type (e_type);
15746 }
15747
15748 static const char *
15749 get_netbsd_elfcore_note_type (unsigned e_type)
15750 {
15751   static char buff[64];
15752
15753   if (e_type == NT_NETBSDCORE_PROCINFO)
15754     {
15755       /* NetBSD core "procinfo" structure.  */
15756       return _("NetBSD procinfo structure");
15757     }
15758
15759   /* As of Jan 2002 there are no other machine-independent notes
15760      defined for NetBSD core files.  If the note type is less
15761      than the start of the machine-dependent note types, we don't
15762      understand it.  */
15763
15764   if (e_type < NT_NETBSDCORE_FIRSTMACH)
15765     {
15766       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15767       return buff;
15768     }
15769
15770   switch (elf_header.e_machine)
15771     {
15772     /* On the Alpha, SPARC (32-bit and 64-bit), PT_GETREGS == mach+0
15773        and PT_GETFPREGS == mach+2.  */
15774
15775     case EM_OLD_ALPHA:
15776     case EM_ALPHA:
15777     case EM_SPARC:
15778     case EM_SPARC32PLUS:
15779     case EM_SPARCV9:
15780       switch (e_type)
15781         {
15782         case NT_NETBSDCORE_FIRSTMACH + 0:
15783           return _("PT_GETREGS (reg structure)");
15784         case NT_NETBSDCORE_FIRSTMACH + 2:
15785           return _("PT_GETFPREGS (fpreg structure)");
15786         default:
15787           break;
15788         }
15789       break;
15790
15791     /* On all other arch's, PT_GETREGS == mach+1 and
15792        PT_GETFPREGS == mach+3.  */
15793     default:
15794       switch (e_type)
15795         {
15796         case NT_NETBSDCORE_FIRSTMACH + 1:
15797           return _("PT_GETREGS (reg structure)");
15798         case NT_NETBSDCORE_FIRSTMACH + 3:
15799           return _("PT_GETFPREGS (fpreg structure)");
15800         default:
15801           break;
15802         }
15803     }
15804
15805   snprintf (buff, sizeof (buff), "PT_FIRSTMACH+%d",
15806             e_type - NT_NETBSDCORE_FIRSTMACH);
15807   return buff;
15808 }
15809
15810 static const char *
15811 get_stapsdt_note_type (unsigned e_type)
15812 {
15813   static char buff[64];
15814
15815   switch (e_type)
15816     {
15817     case NT_STAPSDT:
15818       return _("NT_STAPSDT (SystemTap probe descriptors)");
15819
15820     default:
15821       break;
15822     }
15823
15824   snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15825   return buff;
15826 }
15827
15828 static int
15829 print_stapsdt_note (Elf_Internal_Note *pnote)
15830 {
15831   int addr_size = is_32bit_elf ? 4 : 8;
15832   char *data = pnote->descdata;
15833   char *data_end = pnote->descdata + pnote->descsz;
15834   bfd_vma pc, base_addr, semaphore;
15835   char *provider, *probe, *arg_fmt;
15836
15837   pc = byte_get ((unsigned char *) data, addr_size);
15838   data += addr_size;
15839   base_addr = byte_get ((unsigned char *) data, addr_size);
15840   data += addr_size;
15841   semaphore = byte_get ((unsigned char *) data, addr_size);
15842   data += addr_size;
15843
15844   provider = data;
15845   data += strlen (data) + 1;
15846   probe = data;
15847   data += strlen (data) + 1;
15848   arg_fmt = data;
15849   data += strlen (data) + 1;
15850
15851   printf (_("    Provider: %s\n"), provider);
15852   printf (_("    Name: %s\n"), probe);
15853   printf (_("    Location: "));
15854   print_vma (pc, FULL_HEX);
15855   printf (_(", Base: "));
15856   print_vma (base_addr, FULL_HEX);
15857   printf (_(", Semaphore: "));
15858   print_vma (semaphore, FULL_HEX);
15859   printf ("\n");
15860   printf (_("    Arguments: %s\n"), arg_fmt);
15861
15862   return data == data_end;
15863 }
15864
15865 static const char *
15866 get_ia64_vms_note_type (unsigned e_type)
15867 {
15868   static char buff[64];
15869
15870   switch (e_type)
15871     {
15872     case NT_VMS_MHD:
15873       return _("NT_VMS_MHD (module header)");
15874     case NT_VMS_LNM:
15875       return _("NT_VMS_LNM (language name)");
15876     case NT_VMS_SRC:
15877       return _("NT_VMS_SRC (source files)");
15878     case NT_VMS_TITLE:
15879       return "NT_VMS_TITLE";
15880     case NT_VMS_EIDC:
15881       return _("NT_VMS_EIDC (consistency check)");
15882     case NT_VMS_FPMODE:
15883       return _("NT_VMS_FPMODE (FP mode)");
15884     case NT_VMS_LINKTIME:
15885       return "NT_VMS_LINKTIME";
15886     case NT_VMS_IMGNAM:
15887       return _("NT_VMS_IMGNAM (image name)");
15888     case NT_VMS_IMGID:
15889       return _("NT_VMS_IMGID (image id)");
15890     case NT_VMS_LINKID:
15891       return _("NT_VMS_LINKID (link id)");
15892     case NT_VMS_IMGBID:
15893       return _("NT_VMS_IMGBID (build id)");
15894     case NT_VMS_GSTNAM:
15895       return _("NT_VMS_GSTNAM (sym table name)");
15896     case NT_VMS_ORIG_DYN:
15897       return "NT_VMS_ORIG_DYN";
15898     case NT_VMS_PATCHTIME:
15899       return "NT_VMS_PATCHTIME";
15900     default:
15901       snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
15902       return buff;
15903     }
15904 }
15905
15906 static int
15907 print_ia64_vms_note (Elf_Internal_Note * pnote)
15908 {
15909   switch (pnote->type)
15910     {
15911     case NT_VMS_MHD:
15912       if (pnote->descsz > 36)
15913         {
15914           size_t l = strlen (pnote->descdata + 34);
15915           printf (_("    Creation date  : %.17s\n"), pnote->descdata);
15916           printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
15917           printf (_("    Module name    : %s\n"), pnote->descdata + 34);
15918           printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
15919         }
15920       else
15921         printf (_("    Invalid size\n"));
15922       break;
15923     case NT_VMS_LNM:
15924       printf (_("   Language: %s\n"), pnote->descdata);
15925       break;
15926 #ifdef BFD64
15927     case NT_VMS_FPMODE:
15928       printf (_("   Floating Point mode: "));
15929       printf ("0x%016" BFD_VMA_FMT "x\n",
15930               (bfd_vma) byte_get ((unsigned char *)pnote->descdata, 8));
15931       break;
15932     case NT_VMS_LINKTIME:
15933       printf (_("   Link time: "));
15934       print_vms_time
15935         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15936       printf ("\n");
15937       break;
15938     case NT_VMS_PATCHTIME:
15939       printf (_("   Patch time: "));
15940       print_vms_time
15941         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata, 8));
15942       printf ("\n");
15943       break;
15944     case NT_VMS_ORIG_DYN:
15945       printf (_("   Major id: %u,  minor id: %u\n"),
15946               (unsigned) byte_get ((unsigned char *)pnote->descdata, 4),
15947               (unsigned) byte_get ((unsigned char *)pnote->descdata + 4, 4));
15948       printf (_("   Last modified  : "));
15949       print_vms_time
15950         ((bfd_int64_t) byte_get ((unsigned char *)pnote->descdata + 8, 8));
15951       printf (_("\n   Link flags  : "));
15952       printf ("0x%016" BFD_VMA_FMT "x\n",
15953               (bfd_vma) byte_get ((unsigned char *)pnote->descdata + 16, 8));
15954       printf (_("   Header flags: 0x%08x\n"),
15955               (unsigned) byte_get ((unsigned char *)pnote->descdata + 24, 4));
15956       printf (_("   Image id    : %s\n"), pnote->descdata + 32);
15957       break;
15958 #endif
15959     case NT_VMS_IMGNAM:
15960       printf (_("    Image name: %s\n"), pnote->descdata);
15961       break;
15962     case NT_VMS_GSTNAM:
15963       printf (_("    Global symbol table name: %s\n"), pnote->descdata);
15964       break;
15965     case NT_VMS_IMGID:
15966       printf (_("    Image id: %s\n"), pnote->descdata);
15967       break;
15968     case NT_VMS_LINKID:
15969       printf (_("    Linker id: %s\n"), pnote->descdata);
15970       break;
15971     default:
15972       break;
15973     }
15974   return 1;
15975 }
15976
15977 /* Note that by the ELF standard, the name field is already null byte
15978    terminated, and namesz includes the terminating null byte.
15979    I.E. the value of namesz for the name "FSF" is 4.
15980
15981    If the value of namesz is zero, there is no name present.  */
15982 static int
15983 process_note (Elf_Internal_Note * pnote)
15984 {
15985   const char * name = pnote->namesz ? pnote->namedata : "(NONE)";
15986   const char * nt;
15987
15988   if (pnote->namesz == 0)
15989     /* If there is no note name, then use the default set of
15990        note type strings.  */
15991     nt = get_note_type (pnote->type);
15992
15993   else if (const_strneq (pnote->namedata, "GNU"))
15994     /* GNU-specific object file notes.  */
15995     nt = get_gnu_elf_note_type (pnote->type);
15996
15997   else if (const_strneq (pnote->namedata, "FreeBSD"))
15998     /* FreeBSD-specific core file notes.  */
15999     nt = get_freebsd_elfcore_note_type (pnote->type);
16000
16001   else if (const_strneq (pnote->namedata, "NetBSD-CORE"))
16002     /* NetBSD-specific core file notes.  */
16003     nt = get_netbsd_elfcore_note_type (pnote->type);
16004
16005   else if (const_strneq (pnote->namedata, "NetBSD"))
16006     /* NetBSD-specific core file notes.  */
16007     return process_netbsd_elf_note (pnote);
16008
16009   else if (strneq (pnote->namedata, "SPU/", 4))
16010     {
16011       /* SPU-specific core file notes.  */
16012       nt = pnote->namedata + 4;
16013       name = "SPU";
16014     }
16015
16016   else if (const_strneq (pnote->namedata, "IPF/VMS"))
16017     /* VMS/ia64-specific file notes.  */
16018     nt = get_ia64_vms_note_type (pnote->type);
16019
16020   else if (const_strneq (pnote->namedata, "stapsdt"))
16021     nt = get_stapsdt_note_type (pnote->type);
16022
16023   else
16024     /* Don't recognize this note name; just use the default set of
16025        note type strings.  */
16026     nt = get_note_type (pnote->type);
16027
16028   printf ("  %-20s 0x%08lx\t%s\n", name, pnote->descsz, nt);
16029
16030   if (const_strneq (pnote->namedata, "IPF/VMS"))
16031     return print_ia64_vms_note (pnote);
16032   else if (const_strneq (pnote->namedata, "GNU"))
16033     return print_gnu_note (pnote);
16034   else if (const_strneq (pnote->namedata, "stapsdt"))
16035     return print_stapsdt_note (pnote);
16036   else if (const_strneq (pnote->namedata, "CORE"))
16037     return print_core_note (pnote);
16038   else
16039     return 1;
16040 }
16041
16042
16043 static int
16044 process_corefile_note_segment (FILE * file, bfd_vma offset, bfd_vma length)
16045 {
16046   Elf_External_Note * pnotes;
16047   Elf_External_Note * external;
16048   char * end;
16049   int res = 1;
16050
16051   if (length <= 0)
16052     return 0;
16053
16054   pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
16055                                            _("notes"));
16056   if (pnotes == NULL)
16057     return 0;
16058
16059   external = pnotes;
16060
16061   printf (_("\nDisplaying notes found at file offset 0x%08lx with length 0x%08lx:\n"),
16062           (unsigned long) offset, (unsigned long) length);
16063   printf (_("  %-20s %10s\tDescription\n"), _("Owner"), _("Data size"));
16064
16065   end = (char *) pnotes + length;
16066   while ((char *) external < end)
16067     {
16068       Elf_Internal_Note inote;
16069       size_t min_notesz;
16070       char *next;
16071       char * temp = NULL;
16072       size_t data_remaining = end - (char *) external;
16073
16074       if (!is_ia64_vms ())
16075         {
16076           /* PR binutils/15191
16077              Make sure that there is enough data to read.  */
16078           min_notesz = offsetof (Elf_External_Note, name);
16079           if (data_remaining < min_notesz)
16080             {
16081               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16082                     (int) data_remaining);
16083               break;
16084             }
16085           inote.type     = BYTE_GET (external->type);
16086           inote.namesz   = BYTE_GET (external->namesz);
16087           inote.namedata = external->name;
16088           inote.descsz   = BYTE_GET (external->descsz);
16089           inote.descdata = inote.namedata + align_power (inote.namesz, 2);
16090           /* PR 17531: file: 3443835e.  */
16091           if (inote.descdata < (char *) pnotes || inote.descdata > end)
16092             {
16093               warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
16094               inote.descdata = inote.namedata;
16095               inote.namesz   = 0;
16096             }
16097
16098           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
16099           next = inote.descdata + align_power (inote.descsz, 2);
16100         }
16101       else
16102         {
16103           Elf64_External_VMS_Note *vms_external;
16104
16105           /* PR binutils/15191
16106              Make sure that there is enough data to read.  */
16107           min_notesz = offsetof (Elf64_External_VMS_Note, name);
16108           if (data_remaining < min_notesz)
16109             {
16110               warn (_("Corrupt note: only %d bytes remain, not enough for a full note\n"),
16111                     (int) data_remaining);
16112               break;
16113             }
16114
16115           vms_external = (Elf64_External_VMS_Note *) external;
16116           inote.type     = BYTE_GET (vms_external->type);
16117           inote.namesz   = BYTE_GET (vms_external->namesz);
16118           inote.namedata = vms_external->name;
16119           inote.descsz   = BYTE_GET (vms_external->descsz);
16120           inote.descdata = inote.namedata + align_power (inote.namesz, 3);
16121           inote.descpos  = offset + (inote.descdata - (char *) pnotes);
16122           next = inote.descdata + align_power (inote.descsz, 3);
16123         }
16124
16125       if (inote.descdata < (char *) external + min_notesz
16126           || next < (char *) external + min_notesz
16127           /* PR binutils/17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4.  */
16128           || inote.namedata + inote.namesz < inote.namedata
16129           || inote.descdata + inote.descsz < inote.descdata
16130           || data_remaining < (size_t)(next - (char *) external))
16131         {
16132           warn (_("note with invalid namesz and/or descsz found at offset 0x%lx\n"),
16133                 (unsigned long) ((char *) external - (char *) pnotes));
16134           warn (_(" type: 0x%lx, namesize: 0x%08lx, descsize: 0x%08lx\n"),
16135                 inote.type, inote.namesz, inote.descsz);
16136           break;
16137         }
16138
16139       external = (Elf_External_Note *) next;
16140
16141       /* Verify that name is null terminated.  It appears that at least
16142          one version of Linux (RedHat 6.0) generates corefiles that don't
16143          comply with the ELF spec by failing to include the null byte in
16144          namesz.  */
16145       if (inote.namedata[inote.namesz - 1] != '\0')
16146         {
16147           temp = (char *) malloc (inote.namesz + 1);
16148           if (temp == NULL)
16149             {
16150               error (_("Out of memory allocating space for inote name\n"));
16151               res = 0;
16152               break;
16153             }
16154
16155           strncpy (temp, inote.namedata, inote.namesz);
16156           temp[inote.namesz] = 0;
16157
16158           /* warn (_("'%s' NOTE name not properly null terminated\n"), temp);  */
16159           inote.namedata = temp;
16160         }
16161
16162       res &= process_note (& inote);
16163
16164       if (temp != NULL)
16165         {
16166           free (temp);
16167           temp = NULL;
16168         }
16169     }
16170
16171   free (pnotes);
16172
16173   return res;
16174 }
16175
16176 static int
16177 process_corefile_note_segments (FILE * file)
16178 {
16179   Elf_Internal_Phdr * segment;
16180   unsigned int i;
16181   int res = 1;
16182
16183   if (! get_program_headers (file))
16184       return 0;
16185
16186   for (i = 0, segment = program_headers;
16187        i < elf_header.e_phnum;
16188        i++, segment++)
16189     {
16190       if (segment->p_type == PT_NOTE)
16191         res &= process_corefile_note_segment (file,
16192                                               (bfd_vma) segment->p_offset,
16193                                               (bfd_vma) segment->p_filesz);
16194     }
16195
16196   return res;
16197 }
16198
16199 static int
16200 process_v850_notes (FILE * file, bfd_vma offset, bfd_vma length)
16201 {
16202   Elf_External_Note * pnotes;
16203   Elf_External_Note * external;
16204   char * end;
16205   int res = 1;
16206
16207   if (length <= 0)
16208     return 0;
16209
16210   pnotes = (Elf_External_Note *) get_data (NULL, file, offset, 1, length,
16211                                            _("v850 notes"));
16212   if (pnotes == NULL)
16213     return 0;
16214
16215   external = pnotes;
16216   end = (char*) pnotes + length;
16217
16218   printf (_("\nDisplaying contents of Renesas V850 notes section at offset 0x%lx with length 0x%lx:\n"),
16219           (unsigned long) offset, (unsigned long) length);
16220
16221   while ((char *) external + sizeof (Elf_External_Note) < end)
16222     {
16223       Elf_External_Note * next;
16224       Elf_Internal_Note inote;
16225
16226       inote.type     = BYTE_GET (external->type);
16227       inote.namesz   = BYTE_GET (external->namesz);
16228       inote.namedata = external->name;
16229       inote.descsz   = BYTE_GET (external->descsz);
16230       inote.descdata = inote.namedata + align_power (inote.namesz, 2);
16231       inote.descpos  = offset + (inote.descdata - (char *) pnotes);
16232
16233       if (inote.descdata < (char *) pnotes || inote.descdata >= end)
16234         {
16235           warn (_("Corrupt note: name size is too big: %lx\n"), inote.namesz);
16236           inote.descdata = inote.namedata;
16237           inote.namesz   = 0;
16238         }
16239
16240       next = (Elf_External_Note *) (inote.descdata + align_power (inote.descsz, 2));
16241
16242       if (   ((char *) next > end)
16243           || ((char *) next <  (char *) pnotes))
16244         {
16245           warn (_("corrupt descsz found in note at offset 0x%lx\n"),
16246                 (unsigned long) ((char *) external - (char *) pnotes));
16247           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16248                 inote.type, inote.namesz, inote.descsz);
16249           break;
16250         }
16251
16252       external = next;
16253
16254       /* Prevent out-of-bounds indexing.  */
16255       if (   inote.namedata + inote.namesz > end
16256           || inote.namedata + inote.namesz < inote.namedata)
16257         {
16258           warn (_("corrupt namesz found in note at offset 0x%lx\n"),
16259                 (unsigned long) ((char *) external - (char *) pnotes));
16260           warn (_(" type: 0x%lx, namesize: 0x%lx, descsize: 0x%lx\n"),
16261                 inote.type, inote.namesz, inote.descsz);
16262           break;
16263         }
16264
16265       printf ("  %s: ", get_v850_elf_note_type (inote.type));
16266
16267       if (! print_v850_note (& inote))
16268         {
16269           res = 0;
16270           printf ("<corrupt sizes: namesz: %lx, descsz: %lx>\n",
16271                   inote.namesz, inote.descsz);
16272         }
16273     }
16274
16275   free (pnotes);
16276
16277   return res;
16278 }
16279
16280 static int
16281 process_note_sections (FILE * file)
16282 {
16283   Elf_Internal_Shdr * section;
16284   unsigned long i;
16285   int n = 0;
16286   int res = 1;
16287
16288   for (i = 0, section = section_headers;
16289        i < elf_header.e_shnum && section != NULL;
16290        i++, section++)
16291     {
16292       if (section->sh_type == SHT_NOTE)
16293         {
16294           res &= process_corefile_note_segment (file,
16295                                                 (bfd_vma) section->sh_offset,
16296                                                 (bfd_vma) section->sh_size);
16297           n++;
16298         }
16299
16300       if ((   elf_header.e_machine == EM_V800
16301            || elf_header.e_machine == EM_V850
16302            || elf_header.e_machine == EM_CYGNUS_V850)
16303           && section->sh_type == SHT_RENESAS_INFO)
16304         {
16305           res &= process_v850_notes (file,
16306                                      (bfd_vma) section->sh_offset,
16307                                      (bfd_vma) section->sh_size);
16308           n++;
16309         }
16310     }
16311
16312   if (n == 0)
16313     /* Try processing NOTE segments instead.  */
16314     return process_corefile_note_segments (file);
16315
16316   return res;
16317 }
16318
16319 static int
16320 process_notes (FILE * file)
16321 {
16322   /* If we have not been asked to display the notes then do nothing.  */
16323   if (! do_notes)
16324     return 1;
16325
16326   if (elf_header.e_type != ET_CORE)
16327     return process_note_sections (file);
16328
16329   /* No program headers means no NOTE segment.  */
16330   if (elf_header.e_phnum > 0)
16331     return process_corefile_note_segments (file);
16332
16333   printf (_("No note segments present in the core file.\n"));
16334   return 1;
16335 }
16336
16337 static int
16338 process_arch_specific (FILE * file)
16339 {
16340   if (! do_arch)
16341     return 1;
16342
16343   switch (elf_header.e_machine)
16344     {
16345     case EM_ARM:
16346       return process_arm_specific (file);
16347     case EM_MIPS:
16348     case EM_MIPS_RS3_LE:
16349       return process_mips_specific (file);
16350       break;
16351     case EM_NDS32:
16352       return process_nds32_specific (file);
16353       break;
16354     case EM_PPC:
16355       return process_power_specific (file);
16356       break;
16357     case EM_S390:
16358     case EM_S390_OLD:
16359       return process_s390_specific (file);
16360       break;
16361     case EM_SPARC:
16362     case EM_SPARC32PLUS:
16363     case EM_SPARCV9:
16364       return process_sparc_specific (file);
16365       break;
16366     case EM_TI_C6000:
16367       return process_tic6x_specific (file);
16368       break;
16369     case EM_MSP430:
16370       return process_msp430x_specific (file);
16371     default:
16372       break;
16373     }
16374   return 1;
16375 }
16376
16377 static int
16378 get_file_header (FILE * file)
16379 {
16380   /* Read in the identity array.  */
16381   if (fread (elf_header.e_ident, EI_NIDENT, 1, file) != 1)
16382     return 0;
16383
16384   /* Determine how to read the rest of the header.  */
16385   switch (elf_header.e_ident[EI_DATA])
16386     {
16387     default: /* fall through */
16388     case ELFDATANONE: /* fall through */
16389     case ELFDATA2LSB:
16390       byte_get = byte_get_little_endian;
16391       byte_put = byte_put_little_endian;
16392       break;
16393     case ELFDATA2MSB:
16394       byte_get = byte_get_big_endian;
16395       byte_put = byte_put_big_endian;
16396       break;
16397     }
16398
16399   /* For now we only support 32 bit and 64 bit ELF files.  */
16400   is_32bit_elf = (elf_header.e_ident[EI_CLASS] != ELFCLASS64);
16401
16402   /* Read in the rest of the header.  */
16403   if (is_32bit_elf)
16404     {
16405       Elf32_External_Ehdr ehdr32;
16406
16407       if (fread (ehdr32.e_type, sizeof (ehdr32) - EI_NIDENT, 1, file) != 1)
16408         return 0;
16409
16410       elf_header.e_type      = BYTE_GET (ehdr32.e_type);
16411       elf_header.e_machine   = BYTE_GET (ehdr32.e_machine);
16412       elf_header.e_version   = BYTE_GET (ehdr32.e_version);
16413       elf_header.e_entry     = BYTE_GET (ehdr32.e_entry);
16414       elf_header.e_phoff     = BYTE_GET (ehdr32.e_phoff);
16415       elf_header.e_shoff     = BYTE_GET (ehdr32.e_shoff);
16416       elf_header.e_flags     = BYTE_GET (ehdr32.e_flags);
16417       elf_header.e_ehsize    = BYTE_GET (ehdr32.e_ehsize);
16418       elf_header.e_phentsize = BYTE_GET (ehdr32.e_phentsize);
16419       elf_header.e_phnum     = BYTE_GET (ehdr32.e_phnum);
16420       elf_header.e_shentsize = BYTE_GET (ehdr32.e_shentsize);
16421       elf_header.e_shnum     = BYTE_GET (ehdr32.e_shnum);
16422       elf_header.e_shstrndx  = BYTE_GET (ehdr32.e_shstrndx);
16423     }
16424   else
16425     {
16426       Elf64_External_Ehdr ehdr64;
16427
16428       /* If we have been compiled with sizeof (bfd_vma) == 4, then
16429          we will not be able to cope with the 64bit data found in
16430          64 ELF files.  Detect this now and abort before we start
16431          overwriting things.  */
16432       if (sizeof (bfd_vma) < 8)
16433         {
16434           error (_("This instance of readelf has been built without support for a\n\
16435 64 bit data type and so it cannot read 64 bit ELF files.\n"));
16436           return 0;
16437         }
16438
16439       if (fread (ehdr64.e_type, sizeof (ehdr64) - EI_NIDENT, 1, file) != 1)
16440         return 0;
16441
16442       elf_header.e_type      = BYTE_GET (ehdr64.e_type);
16443       elf_header.e_machine   = BYTE_GET (ehdr64.e_machine);
16444       elf_header.e_version   = BYTE_GET (ehdr64.e_version);
16445       elf_header.e_entry     = BYTE_GET (ehdr64.e_entry);
16446       elf_header.e_phoff     = BYTE_GET (ehdr64.e_phoff);
16447       elf_header.e_shoff     = BYTE_GET (ehdr64.e_shoff);
16448       elf_header.e_flags     = BYTE_GET (ehdr64.e_flags);
16449       elf_header.e_ehsize    = BYTE_GET (ehdr64.e_ehsize);
16450       elf_header.e_phentsize = BYTE_GET (ehdr64.e_phentsize);
16451       elf_header.e_phnum     = BYTE_GET (ehdr64.e_phnum);
16452       elf_header.e_shentsize = BYTE_GET (ehdr64.e_shentsize);
16453       elf_header.e_shnum     = BYTE_GET (ehdr64.e_shnum);
16454       elf_header.e_shstrndx  = BYTE_GET (ehdr64.e_shstrndx);
16455     }
16456
16457   if (elf_header.e_shoff)
16458     {
16459       /* There may be some extensions in the first section header.  Don't
16460          bomb if we can't read it.  */
16461       if (is_32bit_elf)
16462         get_32bit_section_headers (file, TRUE);
16463       else
16464         get_64bit_section_headers (file, TRUE);
16465     }
16466
16467   return 1;
16468 }
16469
16470 /* Process one ELF object file according to the command line options.
16471    This file may actually be stored in an archive.  The file is
16472    positioned at the start of the ELF object.  */
16473
16474 static int
16475 process_object (char * file_name, FILE * file)
16476 {
16477   unsigned int i;
16478
16479   if (! get_file_header (file))
16480     {
16481       error (_("%s: Failed to read file header\n"), file_name);
16482       return 1;
16483     }
16484
16485   /* Initialise per file variables.  */
16486   for (i = ARRAY_SIZE (version_info); i--;)
16487     version_info[i] = 0;
16488
16489   for (i = ARRAY_SIZE (dynamic_info); i--;)
16490     dynamic_info[i] = 0;
16491   dynamic_info_DT_GNU_HASH = 0;
16492
16493   /* Process the file.  */
16494   if (show_name)
16495     printf (_("\nFile: %s\n"), file_name);
16496
16497   /* Initialise the dump_sects array from the cmdline_dump_sects array.
16498      Note we do this even if cmdline_dump_sects is empty because we
16499      must make sure that the dump_sets array is zeroed out before each
16500      object file is processed.  */
16501   if (num_dump_sects > num_cmdline_dump_sects)
16502     memset (dump_sects, 0, num_dump_sects * sizeof (* dump_sects));
16503
16504   if (num_cmdline_dump_sects > 0)
16505     {
16506       if (num_dump_sects == 0)
16507         /* A sneaky way of allocating the dump_sects array.  */
16508         request_dump_bynumber (num_cmdline_dump_sects, 0);
16509
16510       assert (num_dump_sects >= num_cmdline_dump_sects);
16511       memcpy (dump_sects, cmdline_dump_sects,
16512               num_cmdline_dump_sects * sizeof (* dump_sects));
16513     }
16514
16515   if (! process_file_header ())
16516     return 1;
16517
16518   if (! process_section_headers (file))
16519     {
16520       /* Without loaded section headers we cannot process lots of
16521          things.  */
16522       do_unwind = do_version = do_dump = do_arch = 0;
16523
16524       if (! do_using_dynamic)
16525         do_syms = do_dyn_syms = do_reloc = 0;
16526     }
16527
16528   if (! process_section_groups (file))
16529     {
16530       /* Without loaded section groups we cannot process unwind.  */
16531       do_unwind = 0;
16532     }
16533
16534   if (process_program_headers (file))
16535     process_dynamic_section (file);
16536
16537   process_relocs (file);
16538
16539   process_unwind (file);
16540
16541   process_symbol_table (file);
16542
16543   process_syminfo (file);
16544
16545   process_version_sections (file);
16546
16547   process_section_contents (file);
16548
16549   process_notes (file);
16550
16551   process_gnu_liblist (file);
16552
16553   process_arch_specific (file);
16554
16555   if (program_headers)
16556     {
16557       free (program_headers);
16558       program_headers = NULL;
16559     }
16560
16561   if (section_headers)
16562     {
16563       free (section_headers);
16564       section_headers = NULL;
16565     }
16566
16567   if (string_table)
16568     {
16569       free (string_table);
16570       string_table = NULL;
16571       string_table_length = 0;
16572     }
16573
16574   if (dynamic_strings)
16575     {
16576       free (dynamic_strings);
16577       dynamic_strings = NULL;
16578       dynamic_strings_length = 0;
16579     }
16580
16581   if (dynamic_symbols)
16582     {
16583       free (dynamic_symbols);
16584       dynamic_symbols = NULL;
16585       num_dynamic_syms = 0;
16586     }
16587
16588   if (dynamic_syminfo)
16589     {
16590       free (dynamic_syminfo);
16591       dynamic_syminfo = NULL;
16592     }
16593
16594   if (dynamic_section)
16595     {
16596       free (dynamic_section);
16597       dynamic_section = NULL;
16598     }
16599
16600   if (section_headers_groups)
16601     {
16602       free (section_headers_groups);
16603       section_headers_groups = NULL;
16604     }
16605
16606   if (section_groups)
16607     {
16608       struct group_list * g;
16609       struct group_list * next;
16610
16611       for (i = 0; i < group_count; i++)
16612         {
16613           for (g = section_groups [i].root; g != NULL; g = next)
16614             {
16615               next = g->next;
16616               free (g);
16617             }
16618         }
16619
16620       free (section_groups);
16621       section_groups = NULL;
16622     }
16623
16624   free_debug_memory ();
16625
16626   return 0;
16627 }
16628
16629 /* Process an ELF archive.
16630    On entry the file is positioned just after the ARMAG string.  */
16631
16632 static int
16633 process_archive (char * file_name, FILE * file, bfd_boolean is_thin_archive)
16634 {
16635   struct archive_info arch;
16636   struct archive_info nested_arch;
16637   size_t got;
16638   int ret;
16639
16640   show_name = 1;
16641
16642   /* The ARCH structure is used to hold information about this archive.  */
16643   arch.file_name = NULL;
16644   arch.file = NULL;
16645   arch.index_array = NULL;
16646   arch.sym_table = NULL;
16647   arch.longnames = NULL;
16648
16649   /* The NESTED_ARCH structure is used as a single-item cache of information
16650      about a nested archive (when members of a thin archive reside within
16651      another regular archive file).  */
16652   nested_arch.file_name = NULL;
16653   nested_arch.file = NULL;
16654   nested_arch.index_array = NULL;
16655   nested_arch.sym_table = NULL;
16656   nested_arch.longnames = NULL;
16657
16658   if (setup_archive (&arch, file_name, file, is_thin_archive, do_archive_index) != 0)
16659     {
16660       ret = 1;
16661       goto out;
16662     }
16663
16664   if (do_archive_index)
16665     {
16666       if (arch.sym_table == NULL)
16667         error (_("%s: unable to dump the index as none was found\n"), file_name);
16668       else
16669         {
16670           unsigned long i, l;
16671           unsigned long current_pos;
16672
16673           printf (_("Index of archive %s: (%lu entries, 0x%lx bytes in the symbol table)\n"),
16674                   file_name, (unsigned long) arch.index_num, arch.sym_size);
16675           current_pos = ftell (file);
16676
16677           for (i = l = 0; i < arch.index_num; i++)
16678             {
16679               if ((i == 0) || ((i > 0) && (arch.index_array[i] != arch.index_array[i - 1])))
16680                 {
16681                   char * member_name;
16682
16683                   member_name = get_archive_member_name_at (&arch, arch.index_array[i], &nested_arch);
16684
16685                   if (member_name != NULL)
16686                     {
16687                       char * qualified_name = make_qualified_name (&arch, &nested_arch, member_name);
16688
16689                       if (qualified_name != NULL)
16690                         {
16691                           printf (_("Contents of binary %s at offset "), qualified_name);
16692                           (void) print_vma (arch.index_array[i], PREFIX_HEX);
16693                           putchar ('\n');
16694                           free (qualified_name);
16695                         }
16696                     }
16697                 }
16698
16699               if (l >= arch.sym_size)
16700                 {
16701                   error (_("%s: end of the symbol table reached before the end of the index\n"),
16702                          file_name);
16703                   break;
16704                 }
16705               /* PR 17531: file: 0b6630b2.  */
16706               printf ("\t%.*s\n", (int) (arch.sym_size - l), arch.sym_table + l);
16707               l += strnlen (arch.sym_table + l, arch.sym_size - l) + 1;
16708             }
16709
16710           if (arch.uses_64bit_indicies)
16711             l = (l + 7) & ~ 7;
16712           else
16713             l += l & 1;
16714
16715           if (l < arch.sym_size)
16716             error (_("%s: %ld bytes remain in the symbol table, but without corresponding entries in the index table\n"),
16717                    file_name, arch.sym_size - l);
16718
16719           if (fseek (file, current_pos, SEEK_SET) != 0)
16720             {
16721               error (_("%s: failed to seek back to start of object files in the archive\n"), file_name);
16722               ret = 1;
16723               goto out;
16724             }
16725         }
16726
16727       if (!do_dynamic && !do_syms && !do_reloc && !do_unwind && !do_sections
16728           && !do_segments && !do_header && !do_dump && !do_version
16729           && !do_histogram && !do_debugging && !do_arch && !do_notes
16730           && !do_section_groups && !do_dyn_syms)
16731         {
16732           ret = 0; /* Archive index only.  */
16733           goto out;
16734         }
16735     }
16736
16737   ret = 0;
16738
16739   while (1)
16740     {
16741       char * name;
16742       size_t namelen;
16743       char * qualified_name;
16744
16745       /* Read the next archive header.  */
16746       if (fseek (file, arch.next_arhdr_offset, SEEK_SET) != 0)
16747         {
16748           error (_("%s: failed to seek to next archive header\n"), file_name);
16749           return 1;
16750         }
16751       got = fread (&arch.arhdr, 1, sizeof arch.arhdr, file);
16752       if (got != sizeof arch.arhdr)
16753         {
16754           if (got == 0)
16755             break;
16756           error (_("%s: failed to read archive header\n"), file_name);
16757           ret = 1;
16758           break;
16759         }
16760       if (memcmp (arch.arhdr.ar_fmag, ARFMAG, 2) != 0)
16761         {
16762           error (_("%s: did not find a valid archive header\n"), arch.file_name);
16763           ret = 1;
16764           break;
16765         }
16766
16767       arch.next_arhdr_offset += sizeof arch.arhdr;
16768
16769       archive_file_size = strtoul (arch.arhdr.ar_size, NULL, 10);
16770       if (archive_file_size & 01)
16771         ++archive_file_size;
16772
16773       name = get_archive_member_name (&arch, &nested_arch);
16774       if (name == NULL)
16775         {
16776           error (_("%s: bad archive file name\n"), file_name);
16777           ret = 1;
16778           break;
16779         }
16780       namelen = strlen (name);
16781
16782       qualified_name = make_qualified_name (&arch, &nested_arch, name);
16783       if (qualified_name == NULL)
16784         {
16785           error (_("%s: bad archive file name\n"), file_name);
16786           ret = 1;
16787           break;
16788         }
16789
16790       if (is_thin_archive && arch.nested_member_origin == 0)
16791         {
16792           /* This is a proxy for an external member of a thin archive.  */
16793           FILE * member_file;
16794           char * member_file_name = adjust_relative_path (file_name, name, namelen);
16795           if (member_file_name == NULL)
16796             {
16797               ret = 1;
16798               break;
16799             }
16800
16801           member_file = fopen (member_file_name, "rb");
16802           if (member_file == NULL)
16803             {
16804               error (_("Input file '%s' is not readable.\n"), member_file_name);
16805               free (member_file_name);
16806               ret = 1;
16807               break;
16808             }
16809
16810           archive_file_offset = arch.nested_member_origin;
16811
16812           ret |= process_object (qualified_name, member_file);
16813
16814           fclose (member_file);
16815           free (member_file_name);
16816         }
16817       else if (is_thin_archive)
16818         {
16819           /* PR 15140: Allow for corrupt thin archives.  */
16820           if (nested_arch.file == NULL)
16821             {
16822               error (_("%s: contains corrupt thin archive: %s\n"),
16823                      file_name, name);
16824               ret = 1;
16825               break;
16826             }
16827
16828           /* This is a proxy for a member of a nested archive.  */
16829           archive_file_offset = arch.nested_member_origin + sizeof arch.arhdr;
16830
16831           /* The nested archive file will have been opened and setup by
16832              get_archive_member_name.  */
16833           if (fseek (nested_arch.file, archive_file_offset, SEEK_SET) != 0)
16834             {
16835               error (_("%s: failed to seek to archive member.\n"), nested_arch.file_name);
16836               ret = 1;
16837               break;
16838             }
16839
16840           ret |= process_object (qualified_name, nested_arch.file);
16841         }
16842       else
16843         {
16844           archive_file_offset = arch.next_arhdr_offset;
16845           arch.next_arhdr_offset += archive_file_size;
16846
16847           ret |= process_object (qualified_name, file);
16848         }
16849
16850       if (dump_sects != NULL)
16851         {
16852           free (dump_sects);
16853           dump_sects = NULL;
16854           num_dump_sects = 0;
16855         }
16856
16857       free (qualified_name);
16858     }
16859
16860  out:
16861   if (nested_arch.file != NULL)
16862     fclose (nested_arch.file);
16863   release_archive (&nested_arch);
16864   release_archive (&arch);
16865
16866   return ret;
16867 }
16868
16869 static int
16870 process_file (char * file_name)
16871 {
16872   FILE * file;
16873   struct stat statbuf;
16874   char armag[SARMAG];
16875   int ret;
16876
16877   if (stat (file_name, &statbuf) < 0)
16878     {
16879       if (errno == ENOENT)
16880         error (_("'%s': No such file\n"), file_name);
16881       else
16882         error (_("Could not locate '%s'.  System error message: %s\n"),
16883                file_name, strerror (errno));
16884       return 1;
16885     }
16886
16887   if (! S_ISREG (statbuf.st_mode))
16888     {
16889       error (_("'%s' is not an ordinary file\n"), file_name);
16890       return 1;
16891     }
16892
16893   file = fopen (file_name, "rb");
16894   if (file == NULL)
16895     {
16896       error (_("Input file '%s' is not readable.\n"), file_name);
16897       return 1;
16898     }
16899
16900   if (fread (armag, SARMAG, 1, file) != 1)
16901     {
16902       error (_("%s: Failed to read file's magic number\n"), file_name);
16903       fclose (file);
16904       return 1;
16905     }
16906
16907   current_file_size = (bfd_size_type) statbuf.st_size;
16908
16909   if (memcmp (armag, ARMAG, SARMAG) == 0)
16910     ret = process_archive (file_name, file, FALSE);
16911   else if (memcmp (armag, ARMAGT, SARMAG) == 0)
16912     ret = process_archive (file_name, file, TRUE);
16913   else
16914     {
16915       if (do_archive_index)
16916         error (_("File %s is not an archive so its index cannot be displayed.\n"),
16917                file_name);
16918
16919       rewind (file);
16920       archive_file_size = archive_file_offset = 0;
16921       ret = process_object (file_name, file);
16922     }
16923
16924   fclose (file);
16925
16926   current_file_size = 0;
16927   return ret;
16928 }
16929
16930 #ifdef SUPPORT_DISASSEMBLY
16931 /* Needed by the i386 disassembler.  For extra credit, someone could
16932    fix this so that we insert symbolic addresses here, esp for GOT/PLT
16933    symbols.  */
16934
16935 void
16936 print_address (unsigned int addr, FILE * outfile)
16937 {
16938   fprintf (outfile,"0x%8.8x", addr);
16939 }
16940
16941 /* Needed by the i386 disassembler.  */
16942 void
16943 db_task_printsym (unsigned int addr)
16944 {
16945   print_address (addr, stderr);
16946 }
16947 #endif
16948
16949 int
16950 main (int argc, char ** argv)
16951 {
16952   int err;
16953
16954 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
16955   setlocale (LC_MESSAGES, "");
16956 #endif
16957 #if defined (HAVE_SETLOCALE)
16958   setlocale (LC_CTYPE, "");
16959 #endif
16960   bindtextdomain (PACKAGE, LOCALEDIR);
16961   textdomain (PACKAGE);
16962
16963   expandargv (&argc, &argv);
16964
16965   parse_args (argc, argv);
16966
16967   if (num_dump_sects > 0)
16968     {
16969       /* Make a copy of the dump_sects array.  */
16970       cmdline_dump_sects = (dump_type *)
16971           malloc (num_dump_sects * sizeof (* dump_sects));
16972       if (cmdline_dump_sects == NULL)
16973         error (_("Out of memory allocating dump request table.\n"));
16974       else
16975         {
16976           memcpy (cmdline_dump_sects, dump_sects,
16977                   num_dump_sects * sizeof (* dump_sects));
16978           num_cmdline_dump_sects = num_dump_sects;
16979         }
16980     }
16981
16982   if (optind < (argc - 1))
16983     show_name = 1;
16984   else if (optind >= argc)
16985     {
16986       warn (_("Nothing to do.\n"));
16987       usage (stderr);
16988     }
16989
16990   err = 0;
16991   while (optind < argc)
16992     err |= process_file (argv[optind++]);
16993
16994   if (dump_sects != NULL)
16995     free (dump_sects);
16996   if (cmdline_dump_sects != NULL)
16997     free (cmdline_dump_sects);
16998
16999   return err;
17000 }